Commit 394e41750dd0bc0c7848a0cb2768bcea49f0afc6

Thomas de Grivel 2024-05-14T22:14:12

js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
7484
7485
7486
7487
7488
7489
7490
7491
7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506
7507
7508
7509
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
7541
7542
7543
7544
7545
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
7556
7557
7558
7559
7560
7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
7597
7598
7599
7600
7601
7602
7603
7604
7605
7606
7607
7608
7609
7610
7611
7612
7613
7614
7615
7616
7617
7618
7619
7620
7621
7622
7623
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633
7634
7635
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645
7646
7647
7648
7649
7650
7651
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666
7667
7668
7669
7670
7671
7672
7673
7674
7675
7676
7677
7678
7679
7680
7681
7682
7683
7684
7685
7686
7687
7688
7689
7690
7691
7692
7693
7694
7695
7696
7697
7698
7699
7700
7701
7702
7703
7704
7705
7706
7707
7708
7709
7710
7711
7712
7713
7714
7715
7716
7717
7718
7719
7720
7721
7722
7723
7724
7725
7726
7727
7728
7729
7730
7731
7732
7733
7734
7735
7736
7737
7738
7739
7740
7741
7742
7743
7744
7745
7746
7747
7748
7749
7750
7751
7752
7753
7754
7755
7756
7757
7758
7759
7760
7761
7762
7763
7764
7765
7766
7767
7768
7769
7770
7771
7772
7773
7774
7775
7776
7777
7778
7779
7780
7781
7782
7783
7784
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
7797
7798
7799
7800
7801
7802
7803
7804
7805
7806
7807
7808
7809
7810
7811
7812
7813
7814
7815
7816
7817
7818
7819
7820
7821
7822
7823
7824
7825
7826
7827
7828
7829
7830
7831
7832
7833
7834
7835
7836
7837
7838
7839
7840
7841
7842
7843
7844
7845
7846
7847
7848
7849
7850
7851
7852
7853
7854
7855
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
7866
7867
7868
7869
7870
7871
7872
7873
7874
7875
7876
7877
7878
7879
7880
7881
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
7909
7910
7911
7912
7913
7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931
7932
7933
7934
7935
7936
7937
7938
7939
7940
7941
7942
7943
7944
7945
7946
7947
7948
7949
7950
7951
7952
7953
7954
7955
7956
7957
7958
7959
7960
7961
7962
7963
7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
8016
8017
8018
8019
8020
8021
8022
8023
8024
8025
8026
8027
8028
8029
8030
8031
8032
8033
8034
8035
8036
8037
8038
8039
8040
8041
8042
8043
8044
8045
8046
8047
8048
8049
8050
8051
8052
8053
8054
8055
8056
8057
8058
8059
8060
8061
8062
8063
8064
8065
8066
8067
8068
8069
8070
8071
8072
8073
8074
8075
8076
8077
8078
8079
8080
8081
8082
8083
8084
8085
8086
8087
8088
8089
8090
8091
8092
8093
8094
8095
8096
8097
8098
8099
8100
8101
8102
8103
8104
8105
8106
8107
8108
8109
8110
8111
8112
8113
8114
8115
8116
8117
8118
8119
8120
8121
8122
8123
8124
8125
8126
8127
8128
8129
8130
8131
8132
8133
8134
8135
8136
8137
8138
8139
8140
8141
8142
8143
8144
8145
8146
8147
8148
8149
8150
8151
8152
8153
8154
8155
8156
8157
8158
8159
8160
8161
8162
8163
8164
8165
8166
8167
8168
8169
8170
8171
8172
8173
8174
8175
8176
8177
8178
8179
8180
8181
8182
8183
8184
8185
8186
8187
8188
8189
8190
8191
8192
8193
8194
8195
8196
8197
8198
8199
8200
8201
8202
8203
8204
8205
8206
8207
8208
8209
8210
8211
8212
8213
8214
8215
8216
8217
8218
8219
8220
8221
8222
8223
8224
8225
8226
8227
8228
8229
8230
8231
8232
8233
8234
8235
8236
8237
8238
8239
8240
8241
8242
8243
8244
8245
8246
8247
8248
8249
8250
8251
8252
8253
8254
8255
8256
8257
8258
8259
8260
8261
8262
8263
8264
8265
8266
8267
8268
8269
8270
8271
8272
8273
8274
8275
8276
8277
8278
8279
8280
8281
8282
8283
8284
8285
8286
8287
8288
8289
8290
8291
8292
8293
8294
8295
8296
8297
8298
8299
8300
8301
8302
8303
8304
8305
8306
8307
8308
8309
8310
8311
8312
8313
8314
8315
8316
8317
8318
8319
8320
8321
8322
8323
8324
8325
8326
8327
8328
8329
8330
8331
8332
8333
8334
8335
8336
8337
8338
8339
8340
8341
8342
8343
8344
8345
8346
8347
8348
8349
8350
8351
8352
8353
8354
8355
8356
8357
8358
8359
8360
8361
8362
8363
8364
8365
8366
8367
8368
8369
8370
8371
8372
8373
8374
8375
8376
8377
8378
8379
8380
8381
8382
8383
8384
8385
8386
8387
8388
8389
8390
8391
8392
8393
8394
8395
8396
8397
8398
8399
8400
8401
8402
8403
8404
8405
8406
8407
8408
8409
8410
8411
8412
8413
8414
8415
8416
8417
8418
8419
8420
8421
8422
8423
8424
8425
8426
8427
8428
8429
8430
8431
8432
8433
8434
8435
8436
8437
8438
8439
8440
8441
8442
8443
8444
8445
8446
8447
8448
8449
8450
8451
8452
8453
8454
8455
8456
8457
8458
8459
8460
8461
8462
8463
8464
8465
8466
8467
8468
8469
8470
8471
8472
8473
8474
8475
8476
8477
8478
8479
8480
8481
8482
8483
8484
8485
8486
8487
8488
8489
8490
8491
8492
8493
8494
8495
8496
8497
8498
8499
8500
8501
8502
8503
8504
8505
8506
8507
8508
8509
8510
8511
8512
8513
8514
8515
8516
8517
8518
8519
8520
8521
8522
8523
8524
8525
8526
8527
8528
8529
8530
8531
8532
8533
8534
8535
8536
8537
8538
8539
8540
8541
8542
8543
8544
8545
8546
8547
8548
8549
8550
8551
8552
8553
8554
8555
8556
8557
8558
8559
8560
8561
8562
8563
8564
8565
8566
8567
8568
8569
8570
8571
8572
8573
8574
8575
8576
8577
8578
8579
8580
8581
8582
8583
8584
8585
8586
8587
8588
8589
8590
8591
8592
8593
8594
8595
8596
8597
8598
8599
8600
8601
8602
8603
8604
8605
8606
8607
8608
8609
8610
8611
8612
8613
8614
8615
8616
8617
8618
8619
8620
8621
8622
8623
8624
8625
8626
8627
8628
8629
8630
8631
8632
8633
8634
8635
8636
8637
8638
8639
8640
8641
8642
8643
8644
8645
8646
8647
8648
8649
8650
8651
8652
8653
8654
8655
8656
8657
8658
8659
8660
8661
8662
8663
8664
8665
8666
8667
8668
8669
8670
8671
8672
8673
8674
8675
8676
8677
8678
8679
8680
8681
8682
8683
8684
8685
8686
8687
8688
8689
8690
8691
8692
8693
8694
8695
8696
8697
8698
8699
8700
8701
8702
8703
8704
8705
8706
8707
8708
8709
8710
8711
8712
8713
8714
8715
8716
8717
8718
8719
8720
8721
8722
8723
8724
8725
8726
8727
8728
8729
8730
8731
8732
8733
8734
8735
8736
8737
8738
8739
8740
8741
8742
8743
8744
8745
8746
8747
8748
8749
8750
8751
8752
8753
8754
8755
8756
8757
8758
8759
8760
8761
8762
8763
8764
8765
8766
8767
8768
8769
8770
8771
8772
8773
8774
8775
8776
8777
8778
8779
8780
8781
8782
8783
8784
8785
8786
8787
8788
8789
8790
8791
8792
8793
8794
8795
8796
8797
8798
8799
8800
8801
8802
8803
8804
8805
8806
8807
8808
8809
8810
8811
8812
8813
8814
8815
8816
8817
8818
8819
8820
8821
8822
8823
8824
8825
8826
8827
8828
8829
8830
8831
8832
8833
8834
8835
8836
8837
8838
8839
8840
8841
8842
8843
8844
8845
8846
8847
8848
8849
8850
8851
8852
8853
8854
8855
8856
8857
8858
8859
8860
8861
8862
8863
8864
8865
8866
8867
8868
8869
8870
8871
8872
8873
8874
8875
8876
8877
8878
8879
8880
8881
8882
8883
8884
8885
8886
8887
8888
8889
8890
8891
8892
8893
8894
8895
8896
8897
8898
8899
8900
8901
8902
8903
8904
8905
8906
8907
8908
8909
8910
8911
8912
8913
8914
8915
8916
8917
8918
8919
8920
8921
8922
8923
8924
8925
8926
8927
8928
8929
8930
8931
8932
8933
8934
8935
8936
8937
8938
8939
8940
8941
8942
8943
8944
8945
8946
8947
8948
8949
8950
8951
8952
8953
8954
8955
8956
8957
8958
8959
8960
8961
8962
8963
8964
8965
8966
8967
8968
8969
8970
8971
8972
8973
8974
8975
8976
8977
8978
8979
8980
8981
8982
8983
8984
8985
8986
8987
8988
8989
8990
8991
8992
8993
8994
8995
8996
8997
8998
8999
9000
9001
9002
9003
9004
9005
9006
9007
9008
9009
9010
9011
9012
9013
9014
9015
9016
9017
9018
9019
9020
9021
9022
9023
9024
9025
9026
9027
9028
9029
9030
9031
9032
9033
9034
9035
9036
9037
9038
9039
9040
9041
9042
9043
9044
9045
9046
9047
9048
9049
9050
9051
9052
9053
9054
9055
9056
9057
9058
9059
9060
9061
9062
9063
9064
9065
9066
9067
9068
9069
9070
9071
9072
9073
9074
9075
9076
9077
9078
9079
9080
9081
9082
9083
9084
9085
9086
9087
9088
9089
9090
9091
9092
9093
9094
9095
9096
9097
9098
9099
9100
9101
9102
9103
9104
9105
9106
9107
9108
9109
9110
9111
9112
9113
9114
9115
9116
9117
9118
9119
9120
9121
9122
9123
9124
9125
9126
9127
9128
9129
9130
9131
9132
9133
9134
9135
9136
9137
9138
9139
9140
9141
9142
9143
9144
9145
9146
9147
9148
9149
9150
9151
9152
9153
9154
9155
9156
9157
9158
9159
9160
9161
9162
9163
9164
9165
9166
9167
9168
9169
9170
9171
9172
9173
9174
9175
9176
9177
9178
9179
9180
9181
9182
9183
9184
9185
9186
9187
9188
9189
9190
9191
9192
9193
9194
9195
9196
9197
9198
9199
9200
9201
9202
9203
9204
9205
9206
9207
9208
9209
9210
9211
9212
9213
9214
9215
9216
9217
9218
9219
9220
9221
9222
9223
9224
9225
9226
9227
9228
9229
9230
9231
9232
9233
9234
9235
9236
9237
9238
9239
9240
9241
9242
9243
9244
9245
9246
9247
9248
9249
9250
9251
9252
9253
9254
9255
9256
9257
9258
9259
9260
9261
9262
9263
9264
9265
9266
9267
9268
9269
9270
9271
9272
9273
9274
9275
9276
9277
9278
9279
9280
9281
9282
9283
9284
9285
9286
9287
9288
9289
9290
9291
9292
9293
9294
9295
9296
9297
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9316
9317
9318
9319
9320
9321
9322
9323
9324
9325
9326
9327
9328
9329
9330
9331
9332
9333
9334
9335
9336
9337
9338
9339
9340
9341
9342
9343
9344
9345
9346
9347
9348
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358
9359
9360
9361
9362
9363
9364
9365
9366
9367
9368
9369
9370
9371
9372
9373
9374
9375
9376
9377
9378
9379
9380
9381
9382
9383
9384
9385
9386
9387
9388
9389
9390
9391
9392
9393
9394
9395
9396
9397
9398
9399
9400
9401
9402
9403
9404
9405
9406
9407
9408
9409
9410
9411
9412
9413
9414
9415
9416
9417
9418
9419
9420
9421
9422
9423
9424
9425
9426
9427
9428
9429
9430
9431
9432
9433
9434
9435
9436
9437
9438
9439
9440
9441
9442
9443
9444
9445
9446
9447
9448
9449
9450
9451
9452
9453
9454
9455
9456
9457
9458
9459
9460
9461
9462
9463
9464
9465
9466
9467
9468
9469
9470
9471
9472
9473
9474
9475
9476
9477
9478
9479
9480
9481
9482
9483
9484
9485
9486
9487
9488
9489
9490
9491
9492
9493
9494
9495
9496
9497
9498
9499
9500
9501
9502
9503
9504
9505
9506
9507
9508
9509
9510
9511
9512
9513
9514
9515
9516
9517
9518
9519
9520
9521
9522
9523
9524
9525
9526
9527
9528
9529
9530
9531
9532
9533
9534
9535
9536
9537
9538
9539
9540
9541
9542
9543
9544
9545
9546
9547
9548
9549
9550
9551
9552
9553
9554
9555
9556
9557
9558
9559
9560
9561
9562
9563
9564
9565
9566
9567
9568
9569
9570
9571
9572
9573
9574
9575
9576
9577
9578
9579
9580
9581
9582
9583
9584
9585
9586
9587
9588
9589
9590
9591
9592
9593
9594
9595
9596
9597
9598
9599
9600
9601
9602
9603
9604
9605
9606
9607
9608
9609
9610
9611
9612
9613
9614
9615
9616
9617
9618
9619
9620
9621
9622
9623
9624
9625
9626
9627
9628
9629
9630
9631
9632
9633
9634
9635
9636
9637
9638
9639
9640
9641
9642
9643
9644
9645
9646
9647
9648
9649
9650
9651
9652
9653
9654
9655
9656
9657
9658
9659
9660
9661
9662
9663
9664
9665
9666
9667
9668
9669
9670
9671
9672
9673
9674
9675
9676
9677
9678
9679
9680
9681
9682
9683
9684
9685
9686
9687
9688
9689
9690
9691
9692
9693
9694
9695
9696
9697
9698
9699
9700
9701
9702
9703
9704
9705
9706
9707
9708
9709
9710
9711
9712
9713
9714
9715
9716
9717
9718
9719
9720
9721
9722
9723
9724
9725
9726
9727
9728
9729
9730
9731
9732
9733
9734
9735
9736
9737
9738
9739
9740
9741
9742
9743
9744
9745
9746
9747
9748
9749
9750
9751
9752
9753
9754
9755
9756
9757
9758
9759
9760
9761
9762
9763
9764
9765
9766
9767
9768
9769
9770
9771
9772
9773
9774
9775
9776
9777
9778
9779
9780
9781
9782
9783
9784
9785
9786
9787
9788
9789
9790
9791
9792
9793
9794
9795
9796
9797
9798
9799
9800
9801
9802
9803
9804
9805
9806
9807
9808
9809
9810
9811
9812
9813
9814
9815
9816
9817
9818
9819
9820
9821
9822
9823
9824
9825
9826
9827
9828
9829
9830
9831
9832
9833
9834
9835
9836
9837
9838
9839
9840
9841
9842
9843
9844
9845
9846
9847
9848
9849
9850
9851
9852
9853
9854
9855
9856
9857
9858
9859
9860
9861
9862
9863
9864
9865
9866
9867
9868
9869
9870
9871
9872
9873
9874
9875
9876
9877
9878
9879
9880
9881
9882
9883
9884
9885
9886
9887
9888
9889
9890
9891
9892
9893
9894
9895
9896
9897
9898
9899
9900
9901
9902
9903
9904
9905
9906
9907
9908
9909
9910
9911
9912
9913
9914
9915
9916
9917
9918
9919
9920
9921
9922
9923
9924
9925
9926
9927
9928
9929
9930
9931
9932
9933
9934
9935
9936
9937
9938
9939
9940
9941
9942
9943
9944
9945
9946
9947
9948
9949
9950
9951
9952
9953
9954
9955
9956
9957
9958
9959
9960
9961
9962
9963
9964
9965
9966
9967
9968
9969
9970
9971
9972
9973
9974
9975
9976
9977
9978
9979
9980
9981
9982
9983
9984
9985
9986
9987
9988
9989
9990
9991
9992
9993
9994
9995
9996
9997
9998
9999
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009
10010
10011
10012
10013
10014
10015
10016
10017
10018
10019
10020
10021
10022
10023
10024
10025
10026
10027
10028
10029
10030
10031
10032
10033
10034
10035
10036
10037
10038
10039
10040
10041
10042
10043
10044
10045
10046
10047
10048
10049
10050
10051
10052
10053
10054
10055
10056
10057
10058
10059
10060
10061
10062
10063
10064
10065
10066
10067
10068
10069
10070
10071
10072
10073
10074
10075
10076
10077
10078
10079
10080
10081
10082
10083
10084
10085
10086
10087
10088
10089
10090
10091
10092
10093
10094
10095
10096
10097
10098
10099
10100
10101
10102
10103
10104
10105
10106
10107
10108
10109
10110
10111
10112
10113
10114
10115
10116
10117
10118
10119
10120
10121
10122
10123
10124
10125
10126
10127
10128
10129
10130
10131
10132
10133
10134
10135
10136
10137
10138
10139
10140
10141
10142
10143
10144
10145
10146
10147
10148
10149
10150
10151
10152
10153
10154
10155
10156
10157
10158
10159
10160
10161
10162
10163
10164
10165
10166
10167
10168
10169
10170
10171
10172
10173
10174
10175
10176
10177
10178
10179
10180
10181
10182
10183
10184
10185
10186
10187
10188
10189
10190
10191
10192
10193
10194
10195
10196
10197
10198
10199
10200
10201
10202
10203
10204
10205
10206
10207
10208
10209
10210
10211
10212
10213
10214
10215
10216
10217
10218
10219
10220
10221
10222
10223
10224
10225
10226
10227
10228
10229
10230
10231
10232
10233
10234
10235
10236
10237
10238
10239
10240
10241
10242
10243
10244
10245
10246
10247
10248
10249
10250
10251
10252
10253
10254
10255
10256
10257
10258
10259
10260
10261
10262
10263
10264
10265
10266
10267
10268
10269
10270
10271
10272
10273
10274
10275
10276
10277
10278
10279
10280
10281
10282
10283
10284
10285
10286
10287
10288
10289
10290
10291
10292
10293
10294
10295
10296
10297
10298
10299
10300
10301
10302
10303
10304
10305
10306
10307
10308
10309
10310
10311
10312
10313
10314
10315
10316
10317
10318
10319
10320
10321
10322
10323
10324
10325
10326
10327
10328
10329
10330
10331
10332
10333
10334
10335
10336
10337
10338
10339
10340
10341
10342
10343
10344
10345
10346
10347
10348
10349
10350
10351
10352
10353
10354
10355
10356
10357
10358
10359
10360
10361
10362
10363
10364
10365
10366
10367
10368
10369
10370
10371
10372
10373
10374
10375
10376
10377
10378
10379
10380
10381
10382
10383
10384
10385
10386
10387
10388
10389
10390
10391
10392
10393
10394
10395
10396
10397
10398
10399
10400
10401
10402
10403
10404
10405
10406
10407
10408
10409
10410
10411
10412
10413
10414
10415
10416
10417
10418
10419
10420
10421
10422
10423
10424
10425
10426
10427
10428
10429
10430
10431
10432
10433
10434
10435
10436
10437
10438
10439
10440
10441
10442
10443
10444
10445
10446
10447
10448
10449
10450
10451
10452
10453
10454
10455
10456
10457
10458
10459
10460
10461
10462
10463
10464
10465
10466
10467
10468
10469
10470
10471
10472
10473
10474
10475
10476
10477
10478
10479
10480
10481
10482
10483
10484
10485
10486
10487
10488
10489
10490
10491
10492
10493
10494
10495
10496
10497
10498
10499
10500
10501
10502
10503
10504
10505
10506
10507
10508
10509
10510
10511
10512
10513
10514
10515
10516
10517
10518
10519
10520
10521
10522
10523
10524
10525
10526
10527
10528
10529
10530
10531
10532
10533
10534
10535
10536
10537
10538
10539
10540
10541
10542
10543
10544
10545
10546
10547
10548
10549
10550
10551
10552
10553
10554
10555
10556
10557
10558
10559
10560
10561
10562
10563
10564
10565
10566
10567
10568
10569
10570
10571
10572
10573
10574
10575
10576
10577
10578
10579
10580
10581
10582
10583
10584
10585
10586
10587
10588
10589
10590
10591
10592
10593
10594
10595
10596
10597
10598
10599
10600
10601
10602
10603
10604
10605
10606
10607
10608
10609
10610
10611
10612
10613
10614
10615
10616
10617
10618
10619
10620
10621
10622
10623
10624
10625
10626
10627
10628
10629
10630
10631
10632
10633
10634
10635
10636
10637
10638
10639
10640
10641
10642
10643
10644
10645
10646
10647
10648
10649
10650
10651
10652
10653
10654
10655
10656
10657
10658
10659
10660
10661
10662
10663
10664
10665
10666
10667
10668
10669
10670
10671
10672
10673
10674
10675
10676
10677
10678
10679
10680
10681
10682
10683
10684
10685
10686
10687
10688
10689
10690
10691
10692
10693
10694
10695
10696
10697
10698
10699
10700
10701
10702
10703
10704
10705
10706
10707
10708
10709
10710
10711
10712
10713
10714
10715
10716
10717
10718
10719
10720
10721
10722
10723
10724
10725
10726
10727
10728
10729
10730
10731
10732
10733
10734
10735
10736
10737
10738
10739
10740
10741
10742
10743
10744
10745
10746
10747
10748
10749
10750
10751
10752
10753
10754
10755
10756
10757
10758
10759
10760
10761
10762
10763
10764
10765
10766
10767
10768
10769
10770
10771
10772
10773
10774
10775
10776
10777
10778
10779
10780
10781
10782
10783
10784
10785
10786
10787
10788
10789
10790
10791
10792
10793
10794
10795
10796
10797
10798
10799
10800
10801
10802
10803
10804
10805
10806
10807
10808
10809
10810
10811
10812
10813
10814
10815
10816
10817
10818
10819
10820
10821
10822
10823
10824
10825
10826
10827
10828
10829
10830
10831
10832
10833
10834
10835
10836
10837
10838
10839
10840
10841
10842
10843
10844
10845
10846
10847
10848
10849
10850
10851
10852
10853
10854
10855
10856
10857
10858
10859
10860
10861
10862
10863
10864
10865
10866
10867
10868
10869
10870
10871
10872
10873
10874
10875
10876
10877
10878
10879
10880
10881
10882
10883
10884
10885
10886
10887
10888
10889
10890
10891
10892
10893
10894
10895
10896
10897
10898
10899
10900
10901
10902
10903
10904
10905
10906
10907
10908
10909
10910
10911
10912
10913
10914
10915
10916
10917
10918
10919
10920
10921
10922
10923
10924
10925
10926
10927
10928
10929
10930
10931
10932
10933
10934
10935
10936
10937
10938
10939
10940
10941
10942
10943
10944
10945
10946
10947
10948
10949
10950
10951
10952
10953
10954
10955
10956
10957
10958
10959
10960
10961
10962
10963
10964
10965
10966
10967
10968
10969
10970
10971
10972
10973
10974
10975
10976
10977
10978
10979
10980
10981
10982
10983
10984
10985
10986
10987
10988
10989
10990
10991
10992
10993
10994
10995
10996
10997
10998
10999
11000
11001
11002
11003
11004
11005
11006
11007
11008
11009
11010
11011
11012
11013
11014
11015
11016
11017
11018
11019
11020
11021
11022
11023
11024
11025
11026
11027
11028
11029
11030
11031
11032
11033
11034
11035
11036
11037
11038
11039
11040
11041
11042
11043
11044
11045
11046
11047
11048
11049
11050
11051
11052
11053
11054
11055
11056
11057
11058
11059
11060
11061
11062
11063
11064
11065
11066
11067
11068
11069
11070
11071
11072
11073
11074
11075
11076
11077
11078
11079
11080
11081
11082
11083
11084
11085
11086
11087
11088
11089
11090
11091
11092
11093
11094
11095
11096
11097
11098
11099
11100
11101
11102
11103
11104
11105
11106
11107
11108
11109
11110
11111
11112
11113
11114
11115
11116
11117
11118
11119
11120
11121
11122
11123
11124
11125
11126
11127
11128
11129
11130
11131
11132
11133
11134
11135
11136
11137
11138
11139
11140
11141
11142
11143
11144
11145
11146
11147
11148
11149
11150
11151
11152
11153
11154
11155
11156
11157
11158
11159
11160
11161
11162
11163
11164
11165
11166
11167
11168
11169
11170
11171
11172
11173
11174
11175
11176
11177
11178
11179
11180
11181
11182
11183
11184
11185
11186
11187
11188
11189
11190
11191
11192
11193
11194
11195
11196
11197
11198
11199
11200
11201
11202
11203
11204
11205
11206
11207
11208
11209
11210
11211
11212
11213
11214
11215
11216
11217
11218
11219
11220
11221
11222
11223
11224
11225
11226
11227
11228
11229
11230
11231
11232
11233
11234
11235
11236
11237
11238
11239
11240
11241
11242
11243
11244
11245
11246
11247
11248
11249
11250
11251
11252
11253
11254
11255
11256
11257
11258
11259
11260
11261
11262
11263
11264
11265
11266
11267
11268
11269
11270
11271
11272
11273
11274
11275
11276
11277
11278
11279
11280
11281
11282
11283
11284
11285
11286
11287
11288
11289
11290
11291
11292
11293
11294
11295
11296
11297
11298
11299
11300
11301
11302
11303
11304
11305
11306
11307
11308
11309
11310
11311
11312
11313
11314
11315
11316
11317
11318
11319
11320
11321
11322
11323
11324
11325
11326
11327
11328
11329
11330
11331
11332
11333
11334
11335
11336
11337
11338
11339
11340
11341
11342
11343
11344
11345
11346
11347
11348
11349
11350
11351
11352
11353
11354
11355
11356
11357
11358
11359
11360
11361
11362
11363
11364
11365
11366
11367
11368
11369
11370
11371
11372
11373
11374
11375
11376
11377
11378
11379
11380
11381
11382
11383
11384
11385
11386
11387
11388
11389
11390
11391
11392
11393
11394
11395
11396
11397
11398
11399
11400
11401
11402
11403
11404
11405
11406
11407
11408
11409
11410
11411
11412
11413
11414
11415
11416
11417
11418
11419
11420
11421
11422
11423
11424
11425
11426
11427
11428
11429
11430
11431
11432
11433
11434
11435
11436
11437
11438
11439
11440
11441
11442
11443
11444
11445
11446
11447
11448
11449
11450
11451
11452
11453
11454
11455
11456
11457
11458
11459
11460
11461
11462
11463
11464
11465
11466
11467
11468
11469
11470
11471
11472
11473
11474
11475
11476
11477
11478
11479
11480
11481
11482
11483
11484
11485
11486
11487
11488
11489
11490
11491
11492
11493
11494
11495
11496
11497
11498
11499
11500
11501
11502
11503
11504
11505
11506
11507
11508
11509
11510
11511
11512
11513
11514
11515
11516
11517
11518
11519
11520
11521
11522
11523
11524
11525
11526
11527
11528
11529
11530
11531
11532
11533
11534
11535
11536
11537
11538
11539
11540
11541
11542
11543
11544
11545
11546
11547
11548
11549
11550
11551
11552
11553
11554
11555
11556
11557
11558
11559
11560
11561
11562
11563
11564
11565
11566
11567
11568
11569
11570
11571
11572
11573
11574
11575
11576
11577
11578
11579
11580
11581
11582
11583
11584
11585
11586
11587
11588
11589
11590
11591
11592
11593
11594
11595
11596
11597
11598
11599
11600
11601
11602
11603
11604
11605
11606
11607
11608
11609
11610
11611
11612
11613
11614
11615
11616
11617
11618
11619
11620
11621
11622
11623
11624
11625
11626
11627
11628
11629
11630
11631
11632
11633
11634
11635
11636
11637
11638
11639
11640
11641
11642
11643
11644
11645
11646
11647
11648
11649
11650
11651
11652
11653
11654
11655
11656
11657
11658
11659
11660
11661
11662
11663
11664
11665
11666
11667
11668
11669
11670
11671
11672
11673
11674
11675
11676
11677
11678
11679
11680
11681
11682
11683
11684
11685
11686
11687
11688
11689
11690
11691
11692
11693
11694
11695
11696
11697
11698
11699
11700
11701
11702
11703
11704
11705
11706
11707
11708
11709
11710
11711
11712
11713
11714
11715
11716
11717
11718
11719
11720
11721
11722
11723
11724
11725
11726
11727
11728
11729
11730
11731
11732
11733
11734
11735
11736
11737
11738
11739
11740
11741
11742
11743
11744
11745
11746
11747
11748
11749
11750
11751
11752
11753
11754
11755
11756
11757
11758
11759
11760
11761
11762
11763
11764
11765
11766
11767
11768
11769
11770
11771
11772
11773
11774
11775
11776
11777
11778
11779
11780
11781
11782
11783
11784
11785
11786
11787
11788
11789
11790
11791
11792
11793
11794
11795
11796
11797
11798
11799
11800
11801
11802
11803
11804
11805
11806
11807
11808
11809
11810
11811
11812
11813
11814
11815
11816
11817
11818
11819
11820
11821
11822
11823
11824
11825
11826
11827
11828
11829
11830
11831
11832
11833
11834
11835
11836
11837
11838
11839
11840
11841
11842
11843
11844
11845
11846
11847
11848
11849
11850
11851
11852
11853
11854
11855
11856
11857
11858
11859
11860
11861
11862
11863
11864
11865
11866
11867
11868
11869
11870
11871
11872
11873
11874
11875
11876
11877
11878
11879
11880
11881
11882
11883
11884
11885
11886
11887
11888
11889
11890
11891
11892
11893
11894
11895
11896
11897
11898
11899
11900
11901
11902
11903
11904
11905
11906
11907
11908
11909
11910
11911
11912
11913
11914
11915
11916
11917
11918
11919
11920
11921
11922
11923
11924
11925
11926
11927
11928
11929
11930
11931
11932
11933
11934
11935
11936
11937
11938
11939
11940
11941
11942
11943
11944
11945
11946
11947
11948
11949
11950
11951
11952
11953
11954
11955
11956
11957
11958
11959
11960
11961
11962
11963
11964
11965
11966
11967
11968
11969
11970
11971
11972
11973
11974
11975
11976
11977
11978
11979
11980
11981
11982
11983
11984
11985
11986
11987
11988
11989
11990
11991
11992
11993
11994
11995
11996
11997
11998
11999
12000
12001
12002
12003
12004
12005
12006
12007
12008
12009
12010
12011
12012
12013
12014
12015
12016
12017
12018
12019
12020
12021
12022
12023
12024
12025
12026
12027
12028
12029
12030
12031
12032
12033
12034
12035
12036
12037
12038
12039
12040
12041
12042
12043
12044
12045
12046
12047
12048
12049
12050
12051
12052
12053
12054
12055
12056
12057
12058
12059
12060
12061
12062
12063
12064
12065
12066
12067
12068
12069
12070
12071
12072
12073
12074
12075
12076
12077
12078
12079
12080
12081
12082
12083
12084
12085
12086
12087
12088
12089
12090
12091
12092
12093
12094
12095
12096
12097
12098
12099
12100
12101
12102
12103
12104
12105
12106
12107
12108
12109
12110
12111
12112
12113
12114
12115
12116
12117
12118
12119
12120
12121
12122
12123
12124
12125
12126
12127
12128
12129
12130
12131
12132
12133
12134
12135
12136
12137
12138
12139
12140
12141
12142
12143
12144
12145
12146
12147
12148
12149
12150
12151
12152
12153
12154
12155
12156
12157
12158
12159
12160
12161
12162
12163
12164
12165
12166
12167
12168
12169
12170
12171
12172
12173
12174
12175
12176
12177
12178
12179
12180
12181
12182
12183
12184
12185
12186
12187
12188
12189
12190
12191
12192
12193
12194
12195
12196
12197
12198
12199
12200
12201
12202
12203
12204
12205
12206
12207
12208
12209
12210
12211
12212
12213
12214
12215
12216
12217
12218
12219
12220
12221
12222
12223
12224
12225
12226
12227
12228
12229
12230
12231
12232
12233
12234
12235
12236
12237
12238
12239
12240
12241
12242
12243
12244
12245
12246
12247
12248
12249
12250
12251
12252
12253
12254
12255
12256
12257
12258
12259
12260
12261
12262
12263
12264
12265
12266
12267
12268
12269
12270
12271
12272
12273
12274
12275
12276
12277
12278
12279
12280
12281
12282
12283
12284
12285
12286
12287
12288
12289
12290
12291
12292
12293
12294
12295
12296
12297
12298
12299
12300
12301
12302
12303
12304
12305
12306
12307
12308
12309
12310
12311
12312
12313
12314
12315
12316
12317
12318
12319
12320
12321
12322
12323
12324
12325
12326
12327
12328
12329
12330
12331
12332
12333
12334
12335
12336
12337
12338
12339
12340
12341
12342
12343
12344
12345
12346
12347
12348
12349
12350
12351
12352
12353
12354
12355
12356
12357
12358
12359
12360
12361
12362
12363
12364
12365
12366
12367
12368
12369
12370
12371
12372
12373
12374
12375
12376
12377
12378
12379
12380
12381
12382
12383
12384
12385
12386
12387
12388
12389
12390
12391
12392
12393
12394
12395
12396
12397
12398
12399
12400
12401
12402
12403
12404
12405
12406
12407
12408
12409
12410
12411
12412
12413
12414
12415
12416
12417
12418
12419
12420
12421
12422
12423
12424
12425
12426
12427
12428
12429
12430
12431
12432
12433
12434
12435
12436
12437
12438
12439
12440
12441
12442
12443
12444
12445
12446
12447
12448
12449
12450
12451
12452
12453
12454
12455
12456
12457
12458
12459
12460
12461
12462
12463
12464
12465
12466
12467
12468
12469
12470
12471
12472
12473
12474
12475
12476
12477
12478
12479
12480
12481
12482
12483
12484
12485
12486
12487
12488
12489
12490
12491
12492
12493
12494
12495
12496
12497
12498
12499
12500
12501
12502
12503
12504
12505
12506
12507
12508
12509
12510
12511
12512
12513
12514
12515
12516
12517
12518
12519
12520
12521
12522
12523
12524
12525
12526
12527
12528
12529
12530
12531
12532
12533
12534
12535
12536
12537
12538
12539
12540
12541
12542
12543
12544
12545
12546
12547
12548
12549
12550
12551
12552
12553
12554
12555
12556
12557
12558
12559
12560
12561
12562
12563
12564
12565
12566
12567
12568
12569
12570
12571
12572
12573
12574
12575
12576
12577
12578
12579
12580
12581
12582
12583
12584
12585
12586
12587
12588
12589
12590
12591
12592
12593
12594
12595
12596
12597
12598
12599
12600
12601
12602
12603
12604
12605
12606
12607
12608
12609
12610
12611
12612
12613
12614
12615
12616
12617
12618
12619
12620
12621
12622
12623
12624
12625
12626
12627
12628
12629
12630
12631
12632
12633
12634
12635
12636
12637
12638
12639
12640
12641
12642
12643
12644
12645
12646
12647
12648
12649
12650
12651
12652
12653
12654
12655
12656
12657
12658
12659
12660
12661
12662
12663
12664
12665
12666
12667
12668
12669
12670
12671
12672
12673
12674
12675
12676
12677
12678
12679
12680
12681
12682
12683
12684
12685
12686
12687
12688
12689
12690
12691
12692
12693
12694
12695
12696
12697
12698
12699
12700
12701
12702
12703
12704
12705
12706
12707
12708
12709
12710
12711
12712
12713
12714
12715
12716
12717
12718
12719
12720
12721
12722
12723
12724
12725
12726
12727
12728
12729
12730
12731
12732
12733
12734
12735
12736
12737
12738
12739
12740
12741
12742
12743
12744
12745
12746
12747
12748
12749
12750
12751
12752
12753
12754
12755
12756
12757
12758
12759
12760
12761
12762
12763
12764
12765
12766
12767
12768
12769
12770
12771
12772
12773
12774
12775
12776
12777
12778
12779
12780
12781
12782
12783
12784
12785
12786
12787
12788
12789
12790
12791
12792
12793
12794
12795
12796
12797
12798
12799
12800
12801
12802
12803
12804
12805
12806
12807
12808
12809
12810
12811
12812
12813
12814
12815
12816
12817
12818
12819
12820
12821
12822
12823
12824
12825
12826
12827
12828
12829
12830
12831
12832
12833
12834
12835
12836
12837
12838
12839
12840
12841
12842
12843
12844
12845
12846
12847
12848
12849
12850
12851
12852
12853
12854
12855
12856
12857
12858
12859
12860
12861
12862
12863
12864
12865
12866
12867
12868
12869
12870
12871
12872
12873
12874
12875
12876
12877
12878
12879
12880
12881
12882
12883
12884
12885
12886
12887
12888
12889
12890
12891
12892
12893
12894
12895
12896
12897
12898
12899
12900
12901
12902
12903
12904
12905
12906
12907
12908
12909
12910
12911
12912
12913
12914
12915
12916
12917
12918
12919
12920
12921
12922
12923
12924
12925
12926
12927
12928
12929
12930
12931
12932
12933
12934
12935
12936
12937
12938
12939
12940
12941
12942
12943
12944
12945
12946
12947
12948
12949
12950
12951
12952
12953
12954
12955
12956
12957
12958
12959
12960
12961
12962
12963
12964
12965
12966
12967
12968
12969
12970
12971
12972
12973
12974
12975
12976
12977
12978
12979
12980
12981
12982
12983
12984
12985
12986
12987
12988
12989
12990
12991
12992
12993
12994
12995
12996
12997
12998
12999
13000
13001
13002
13003
13004
13005
13006
13007
13008
13009
13010
13011
13012
13013
13014
13015
13016
13017
13018
13019
13020
13021
13022
13023
13024
13025
13026
13027
13028
13029
13030
13031
13032
13033
13034
13035
13036
13037
13038
13039
13040
13041
13042
13043
13044
13045
13046
13047
13048
13049
13050
13051
13052
13053
13054
13055
13056
13057
13058
13059
13060
13061
13062
13063
13064
13065
13066
13067
13068
13069
13070
13071
13072
13073
13074
13075
13076
13077
13078
13079
13080
13081
13082
13083
13084
13085
13086
13087
13088
13089
13090
13091
13092
13093
13094
13095
13096
13097
13098
13099
13100
13101
13102
13103
13104
13105
13106
13107
13108
13109
13110
13111
13112
13113
13114
13115
13116
13117
13118
13119
13120
13121
13122
13123
13124
13125
13126
13127
13128
13129
13130
13131
13132
13133
13134
13135
13136
13137
13138
13139
13140
13141
13142
13143
13144
13145
13146
13147
13148
13149
13150
13151
13152
13153
13154
13155
13156
13157
13158
13159
13160
13161
13162
13163
13164
13165
13166
13167
13168
13169
13170
13171
13172
13173
13174
13175
13176
13177
13178
13179
13180
13181
13182
13183
13184
13185
13186
13187
13188
13189
13190
13191
13192
13193
13194
13195
13196
13197
13198
13199
13200
13201
13202
13203
13204
13205
13206
13207
13208
13209
13210
13211
13212
13213
13214
13215
13216
13217
13218
13219
13220
13221
13222
13223
13224
13225
13226
13227
13228
13229
13230
13231
13232
13233
13234
13235
13236
13237
13238
13239
13240
13241
13242
13243
13244
13245
13246
13247
13248
13249
13250
13251
13252
13253
13254
13255
13256
13257
13258
13259
13260
13261
13262
13263
13264
13265
13266
13267
13268
13269
13270
13271
13272
13273
13274
13275
13276
13277
13278
13279
13280
13281
13282
13283
13284
13285
13286
13287
13288
13289
13290
13291
13292
13293
13294
13295
13296
13297
13298
13299
13300
13301
13302
13303
13304
13305
13306
13307
13308
13309
13310
13311
13312
13313
13314
13315
13316
13317
13318
13319
13320
13321
13322
13323
13324
13325
13326
13327
13328
13329
13330
13331
13332
13333
13334
13335
13336
13337
13338
13339
13340
13341
13342
13343
13344
13345
13346
13347
13348
13349
13350
13351
13352
13353
13354
13355
13356
13357
13358
13359
13360
13361
13362
13363
13364
13365
13366
13367
13368
13369
13370
13371
13372
13373
13374
13375
13376
13377
13378
13379
13380
13381
13382
13383
13384
13385
13386
13387
13388
13389
13390
13391
13392
13393
13394
13395
13396
13397
13398
13399
13400
13401
13402
13403
13404
13405
13406
13407
13408
13409
13410
13411
13412
13413
13414
13415
13416
13417
13418
13419
13420
13421
13422
13423
13424
13425
13426
13427
13428
13429
13430
13431
13432
13433
13434
13435
13436
13437
13438
13439
13440
13441
13442
13443
13444
13445
13446
13447
13448
13449
13450
13451
13452
13453
13454
13455
13456
13457
13458
13459
13460
13461
13462
13463
13464
13465
13466
13467
13468
13469
13470
13471
13472
13473
13474
13475
13476
13477
13478
13479
13480
13481
13482
13483
13484
13485
13486
13487
13488
13489
13490
13491
13492
13493
13494
13495
13496
13497
13498
13499
13500
13501
13502
13503
13504
13505
13506
13507
13508
13509
13510
13511
13512
13513
13514
13515
13516
13517
13518
13519
13520
13521
13522
13523
13524
13525
13526
13527
13528
13529
13530
13531
13532
13533
13534
13535
13536
13537
13538
13539
13540
13541
13542
13543
13544
13545
13546
13547
13548
13549
13550
13551
13552
13553
13554
13555
13556
13557
13558
13559
13560
13561
13562
13563
13564
13565
13566
13567
13568
13569
13570
13571
13572
13573
13574
13575
13576
13577
13578
13579
13580
13581
13582
13583
13584
13585
13586
13587
13588
13589
13590
13591
13592
13593
13594
13595
13596
13597
13598
13599
13600
13601
13602
13603
13604
13605
13606
13607
13608
13609
13610
13611
13612
13613
13614
13615
13616
13617
13618
13619
13620
13621
13622
13623
13624
13625
13626
13627
13628
13629
13630
13631
13632
13633
13634
13635
13636
13637
13638
13639
13640
13641
13642
13643
13644
13645
13646
13647
13648
13649
13650
13651
13652
13653
13654
13655
13656
13657
13658
13659
13660
13661
13662
13663
13664
13665
13666
13667
13668
13669
13670
13671
13672
13673
13674
13675
13676
13677
13678
13679
13680
13681
13682
13683
13684
13685
13686
13687
13688
13689
13690
13691
13692
13693
13694
13695
13696
13697
13698
13699
13700
13701
13702
13703
13704
13705
13706
13707
13708
13709
13710
13711
13712
13713
13714
13715
13716
13717
13718
13719
13720
13721
13722
13723
13724
13725
13726
13727
13728
13729
13730
13731
13732
13733
13734
13735
13736
13737
13738
13739
13740
13741
13742
13743
13744
13745
13746
13747
13748
13749
13750
13751
13752
13753
13754
13755
13756
13757
13758
13759
13760
13761
13762
13763
13764
13765
13766
13767
13768
13769
13770
13771
13772
13773
13774
13775
13776
13777
13778
13779
13780
13781
13782
13783
13784
13785
13786
13787
13788
13789
13790
13791
13792
13793
13794
13795
13796
13797
13798
13799
13800
13801
13802
13803
13804
13805
13806
13807
13808
13809
13810
13811
13812
13813
13814
13815
13816
13817
13818
13819
13820
13821
13822
13823
13824
13825
13826
13827
13828
13829
13830
13831
13832
13833
13834
13835
13836
13837
13838
13839
13840
13841
13842
13843
13844
13845
13846
13847
13848
13849
13850
13851
13852
13853
13854
13855
13856
13857
13858
13859
13860
13861
13862
13863
13864
13865
13866
13867
13868
13869
13870
13871
13872
13873
13874
13875
13876
13877
13878
13879
13880
13881
13882
13883
13884
13885
13886
13887
13888
13889
13890
13891
13892
13893
13894
13895
13896
13897
13898
13899
13900
13901
13902
13903
13904
13905
13906
13907
13908
13909
13910
13911
13912
13913
13914
13915
13916
13917
13918
13919
13920
13921
13922
13923
13924
13925
13926
13927
13928
13929
13930
13931
13932
13933
13934
13935
13936
13937
13938
13939
13940
13941
13942
13943
13944
13945
13946
13947
13948
13949
13950
13951
13952
13953
13954
13955
13956
13957
13958
13959
13960
13961
13962
13963
13964
13965
13966
13967
13968
13969
13970
13971
13972
13973
13974
13975
13976
13977
13978
13979
13980
13981
13982
13983
13984
13985
13986
13987
13988
13989
13990
13991
13992
13993
13994
13995
13996
13997
13998
13999
14000
14001
14002
14003
14004
14005
14006
14007
14008
14009
14010
14011
14012
14013
14014
14015
14016
14017
14018
14019
14020
14021
14022
14023
14024
14025
14026
14027
14028
14029
14030
14031
14032
14033
14034
14035
14036
14037
14038
14039
14040
14041
14042
14043
14044
14045
14046
14047
14048
14049
14050
14051
14052
14053
14054
14055
14056
14057
14058
14059
14060
14061
14062
14063
14064
14065
14066
14067
14068
14069
14070
14071
14072
14073
14074
14075
14076
14077
14078
14079
14080
14081
14082
14083
14084
14085
14086
14087
14088
14089
14090
14091
14092
14093
14094
14095
14096
14097
14098
14099
14100
14101
14102
14103
14104
14105
14106
14107
14108
14109
14110
14111
14112
14113
14114
14115
14116
14117
14118
14119
14120
14121
14122
14123
14124
14125
14126
14127
14128
14129
14130
14131
14132
14133
14134
14135
14136
14137
14138
14139
14140
14141
14142
14143
14144
14145
14146
14147
14148
14149
14150
14151
14152
14153
14154
14155
14156
14157
14158
14159
14160
14161
14162
14163
14164
14165
14166
14167
14168
14169
14170
14171
14172
14173
14174
14175
14176
14177
14178
14179
14180
14181
14182
14183
14184
14185
14186
14187
14188
14189
14190
14191
14192
14193
14194
14195
14196
14197
14198
14199
14200
14201
14202
14203
14204
14205
14206
14207
14208
14209
14210
14211
14212
14213
14214
14215
14216
14217
14218
14219
14220
14221
14222
14223
14224
14225
14226
14227
14228
14229
14230
14231
14232
14233
14234
14235
14236
14237
14238
14239
14240
14241
14242
14243
14244
14245
14246
14247
14248
14249
14250
14251
14252
14253
14254
14255
14256
14257
14258
14259
14260
14261
14262
14263
14264
14265
14266
14267
14268
14269
14270
14271
14272
14273
14274
14275
14276
14277
14278
14279
14280
14281
14282
14283
14284
14285
14286
14287
14288
14289
14290
14291
14292
14293
14294
14295
14296
14297
14298
14299
14300
14301
14302
14303
14304
14305
14306
14307
14308
14309
14310
14311
14312
14313
14314
14315
14316
14317
14318
14319
14320
14321
14322
14323
14324
14325
14326
14327
14328
14329
14330
14331
14332
14333
14334
14335
14336
14337
14338
14339
14340
14341
14342
14343
14344
14345
14346
14347
14348
14349
14350
14351
14352
14353
14354
14355
14356
14357
14358
14359
14360
14361
14362
14363
14364
14365
14366
14367
14368
14369
14370
14371
14372
14373
14374
14375
14376
14377
14378
14379
14380
14381
14382
14383
14384
14385
14386
14387
14388
14389
14390
14391
14392
14393
14394
14395
14396
14397
14398
14399
14400
14401
14402
14403
14404
14405
14406
14407
14408
14409
14410
14411
14412
14413
14414
14415
14416
14417
14418
14419
14420
14421
14422
14423
14424
14425
14426
14427
14428
14429
14430
14431
14432
14433
14434
14435
14436
14437
14438
14439
14440
14441
14442
14443
14444
14445
14446
14447
14448
14449
14450
14451
14452
14453
14454
14455
14456
14457
14458
14459
14460
14461
14462
14463
14464
14465
14466
14467
14468
14469
14470
14471
14472
14473
14474
14475
14476
14477
14478
14479
14480
14481
14482
14483
14484
14485
14486
14487
14488
14489
14490
14491
14492
14493
14494
14495
14496
14497
14498
14499
14500
14501
14502
14503
14504
14505
14506
14507
14508
14509
14510
14511
14512
14513
14514
14515
14516
14517
14518
14519
14520
14521
14522
14523
14524
14525
14526
14527
14528
14529
14530
14531
14532
14533
14534
14535
14536
14537
14538
14539
14540
14541
14542
14543
14544
14545
14546
14547
14548
14549
14550
14551
14552
14553
14554
14555
14556
14557
14558
14559
14560
14561
14562
14563
14564
14565
14566
14567
14568
14569
14570
14571
14572
14573
14574
14575
14576
14577
14578
14579
14580
14581
14582
14583
14584
14585
14586
14587
14588
14589
14590
14591
14592
14593
14594
14595
14596
14597
14598
14599
14600
14601
14602
14603
14604
14605
14606
14607
14608
14609
14610
14611
14612
14613
14614
14615
14616
14617
14618
14619
14620
14621
14622
14623
14624
14625
14626
14627
14628
14629
14630
14631
14632
14633
14634
14635
14636
14637
14638
14639
14640
14641
14642
14643
14644
14645
14646
14647
14648
14649
14650
14651
14652
14653
14654
14655
14656
14657
14658
14659
14660
14661
14662
14663
14664
14665
14666
14667
14668
14669
14670
14671
14672
14673
14674
14675
14676
14677
14678
14679
14680
14681
14682
14683
14684
14685
14686
14687
14688
14689
14690
14691
14692
14693
14694
14695
14696
14697
14698
14699
14700
14701
14702
14703
14704
14705
14706
14707
14708
14709
14710
14711
14712
14713
14714
14715
14716
14717
14718
14719
14720
14721
14722
14723
14724
14725
14726
14727
14728
14729
14730
14731
14732
14733
14734
14735
14736
14737
14738
14739
14740
14741
14742
14743
14744
14745
14746
14747
14748
14749
14750
14751
14752
14753
14754
14755
14756
14757
14758
14759
14760
14761
14762
14763
14764
14765
14766
14767
14768
14769
14770
14771
14772
14773
14774
14775
14776
14777
14778
14779
14780
14781
14782
14783
14784
14785
14786
14787
14788
14789
14790
14791
14792
14793
14794
14795
14796
14797
14798
14799
14800
14801
14802
14803
14804
14805
14806
14807
14808
14809
14810
14811
14812
14813
14814
14815
14816
14817
14818
14819
14820
14821
14822
14823
14824
14825
14826
14827
14828
14829
14830
14831
14832
14833
14834
14835
14836
14837
14838
14839
14840
14841
14842
14843
14844
14845
14846
14847
14848
14849
14850
14851
14852
14853
14854
14855
14856
14857
14858
14859
14860
14861
14862
14863
14864
14865
14866
14867
14868
14869
14870
14871
14872
14873
14874
14875
14876
14877
14878
14879
14880
14881
14882
14883
14884
14885
14886
14887
14888
14889
14890
14891
14892
14893
14894
14895
14896
14897
14898
14899
14900
14901
14902
14903
14904
14905
14906
14907
14908
14909
14910
14911
14912
14913
14914
14915
14916
14917
14918
14919
14920
14921
14922
14923
14924
14925
14926
14927
14928
14929
14930
14931
14932
14933
14934
14935
14936
14937
14938
14939
14940
14941
14942
14943
14944
14945
14946
14947
14948
14949
14950
14951
14952
14953
14954
14955
14956
14957
14958
14959
14960
14961
14962
14963
14964
14965
14966
14967
14968
14969
14970
14971
14972
14973
14974
14975
14976
14977
14978
14979
14980
14981
14982
14983
14984
14985
14986
14987
14988
14989
14990
14991
14992
14993
14994
14995
14996
14997
14998
14999
15000
15001
15002
15003
15004
15005
15006
15007
15008
15009
15010
15011
15012
15013
15014
15015
15016
15017
15018
15019
15020
15021
15022
15023
15024
15025
15026
15027
15028
15029
15030
15031
15032
15033
15034
15035
15036
15037
15038
15039
15040
15041
15042
15043
15044
15045
15046
15047
15048
15049
15050
15051
15052
15053
15054
15055
15056
15057
15058
15059
15060
15061
15062
15063
15064
15065
15066
15067
15068
15069
15070
15071
15072
15073
15074
15075
15076
15077
15078
15079
15080
15081
15082
15083
15084
15085
15086
15087
15088
15089
15090
15091
15092
15093
15094
15095
15096
15097
15098
15099
15100
15101
15102
15103
15104
15105
15106
15107
15108
15109
15110
15111
15112
15113
15114
15115
15116
15117
15118
15119
15120
15121
15122
15123
15124
15125
15126
15127
15128
15129
15130
15131
15132
15133
15134
15135
15136
15137
15138
15139
15140
15141
15142
15143
15144
15145
15146
15147
15148
15149
15150
15151
15152
15153
15154
15155
15156
15157
15158
15159
15160
15161
15162
15163
15164
15165
15166
15167
15168
15169
15170
15171
15172
15173
15174
15175
15176
15177
15178
15179
15180
15181
15182
15183
15184
15185
15186
15187
15188
15189
15190
15191
15192
15193
15194
15195
15196
15197
15198
15199
15200
15201
15202
15203
15204
15205
15206
15207
15208
15209
15210
15211
15212
15213
15214
15215
15216
15217
15218
15219
15220
15221
15222
15223
15224
15225
15226
15227
15228
15229
15230
15231
15232
15233
15234
15235
15236
15237
15238
15239
15240
15241
15242
15243
15244
15245
15246
15247
15248
15249
15250
15251
15252
15253
15254
15255
15256
15257
15258
15259
15260
15261
15262
15263
15264
15265
15266
15267
15268
15269
15270
15271
15272
15273
15274
15275
15276
15277
15278
15279
15280
15281
15282
15283
15284
15285
15286
15287
15288
15289
15290
15291
15292
15293
15294
15295
15296
15297
15298
15299
15300
15301
15302
15303
15304
15305
15306
15307
15308
15309
15310
15311
15312
15313
15314
15315
15316
15317
15318
15319
15320
15321
15322
15323
15324
15325
15326
15327
15328
15329
15330
15331
15332
15333
15334
15335
15336
15337
15338
15339
15340
15341
15342
15343
15344
15345
15346
15347
15348
15349
15350
15351
15352
15353
15354
15355
15356
15357
15358
15359
15360
15361
15362
15363
15364
15365
15366
15367
15368
15369
15370
15371
15372
15373
15374
15375
15376
15377
15378
15379
15380
15381
15382
15383
15384
15385
15386
15387
15388
15389
15390
15391
15392
15393
15394
15395
15396
15397
15398
15399
15400
15401
15402
15403
15404
15405
15406
15407
15408
15409
15410
15411
15412
15413
15414
15415
15416
15417
15418
15419
15420
15421
15422
15423
15424
15425
15426
15427
15428
15429
15430
15431
15432
15433
15434
15435
15436
15437
15438
15439
15440
15441
15442
15443
15444
15445
15446
15447
15448
15449
15450
15451
15452
15453
15454
15455
15456
15457
15458
15459
15460
15461
15462
15463
15464
15465
15466
15467
15468
15469
15470
15471
15472
15473
15474
15475
15476
15477
15478
15479
15480
15481
15482
15483
15484
15485
15486
15487
15488
15489
15490
15491
15492
15493
15494
15495
15496
15497
15498
15499
15500
15501
15502
15503
15504
15505
15506
15507
15508
15509
15510
15511
15512
15513
15514
15515
15516
15517
15518
15519
15520
15521
15522
15523
15524
15525
15526
15527
15528
15529
15530
15531
15532
15533
15534
15535
15536
15537
15538
15539
15540
15541
15542
15543
15544
15545
15546
15547
15548
15549
15550
15551
15552
15553
15554
15555
15556
15557
15558
15559
15560
15561
15562
15563
15564
15565
15566
15567
15568
15569
15570
15571
15572
15573
15574
15575
15576
15577
15578
15579
15580
15581
15582
15583
15584
15585
15586
15587
15588
15589
15590
15591
15592
15593
15594
15595
15596
15597
15598
15599
15600
15601
15602
15603
15604
15605
15606
15607
15608
15609
15610
15611
15612
15613
15614
15615
15616
15617
15618
15619
15620
15621
15622
15623
15624
15625
15626
15627
15628
15629
15630
15631
15632
15633
15634
15635
15636
15637
15638
15639
15640
15641
15642
15643
15644
15645
15646
15647
15648
15649
15650
15651
15652
15653
15654
15655
15656
15657
15658
15659
15660
15661
15662
15663
15664
15665
15666
15667
15668
15669
15670
15671
15672
15673
15674
15675
15676
15677
15678
15679
15680
15681
15682
15683
15684
15685
15686
15687
15688
15689
15690
15691
15692
15693
15694
15695
15696
15697
15698
15699
15700
15701
15702
15703
15704
15705
15706
15707
15708
15709
15710
15711
15712
15713
15714
15715
15716
15717
15718
15719
15720
15721
15722
15723
15724
15725
15726
15727
15728
15729
15730
15731
15732
15733
15734
15735
15736
15737
15738
15739
15740
15741
15742
15743
15744
15745
15746
15747
15748
15749
15750
15751
15752
15753
15754
15755
15756
15757
15758
15759
15760
15761
15762
15763
15764
15765
15766
15767
15768
15769
15770
15771
15772
15773
15774
15775
15776
15777
15778
15779
15780
15781
15782
15783
15784
15785
15786
15787
15788
15789
15790
15791
15792
15793
15794
15795
15796
15797
15798
15799
15800
15801
15802
15803
15804
15805
15806
15807
15808
15809
15810
15811
15812
15813
15814
15815
15816
15817
15818
15819
15820
15821
15822
15823
15824
15825
15826
15827
15828
15829
15830
15831
15832
15833
15834
15835
15836
15837
15838
15839
15840
15841
15842
15843
15844
15845
15846
15847
15848
15849
15850
15851
15852
15853
15854
15855
15856
15857
15858
15859
15860
15861
15862
15863
15864
15865
15866
15867
15868
15869
15870
15871
15872
15873
15874
15875
15876
15877
15878
15879
15880
15881
15882
15883
15884
15885
15886
15887
15888
15889
15890
15891
15892
15893
15894
15895
15896
15897
15898
15899
15900
15901
15902
15903
15904
15905
15906
15907
15908
15909
15910
15911
15912
15913
15914
15915
15916
15917
15918
15919
15920
15921
15922
15923
15924
15925
15926
15927
15928
15929
15930
15931
15932
15933
15934
15935
15936
15937
15938
15939
15940
15941
15942
15943
15944
15945
15946
15947
15948
15949
15950
15951
15952
15953
15954
15955
15956
15957
15958
15959
15960
15961
15962
15963
15964
15965
15966
15967
15968
15969
15970
15971
15972
15973
15974
15975
15976
15977
15978
15979
15980
15981
15982
15983
15984
15985
15986
15987
15988
15989
15990
15991
15992
15993
15994
15995
15996
15997
15998
15999
16000
16001
16002
16003
16004
16005
16006
16007
16008
16009
16010
16011
16012
16013
16014
16015
16016
16017
16018
16019
16020
16021
16022
16023
16024
16025
16026
16027
16028
16029
16030
16031
16032
16033
16034
16035
16036
16037
16038
16039
16040
16041
16042
16043
16044
16045
16046
16047
16048
16049
16050
16051
16052
16053
16054
16055
16056
16057
16058
16059
16060
16061
16062
16063
16064
16065
16066
16067
16068
16069
16070
16071
16072
16073
16074
16075
16076
16077
16078
16079
16080
16081
16082
16083
16084
16085
16086
16087
16088
16089
16090
16091
16092
16093
16094
16095
16096
16097
16098
16099
16100
16101
16102
16103
16104
16105
16106
16107
16108
16109
16110
16111
16112
16113
16114
16115
16116
16117
16118
16119
16120
16121
16122
16123
16124
16125
16126
16127
16128
16129
16130
16131
16132
16133
16134
16135
16136
16137
16138
16139
16140
16141
16142
16143
16144
16145
16146
16147
16148
16149
16150
16151
16152
16153
16154
16155
16156
16157
16158
16159
16160
16161
16162
16163
16164
16165
16166
16167
16168
16169
16170
16171
16172
16173
16174
16175
16176
16177
16178
16179
16180
16181
16182
16183
16184
16185
16186
16187
16188
16189
16190
16191
16192
16193
16194
16195
16196
16197
16198
16199
16200
16201
16202
16203
16204
16205
16206
16207
16208
16209
16210
16211
16212
16213
16214
16215
16216
16217
16218
16219
16220
16221
16222
16223
16224
16225
16226
16227
16228
16229
16230
16231
16232
16233
16234
16235
16236
16237
16238
16239
16240
16241
16242
16243
16244
16245
16246
16247
16248
16249
16250
16251
16252
16253
16254
16255
16256
16257
16258
16259
16260
16261
16262
16263
16264
16265
16266
16267
16268
16269
16270
16271
16272
16273
16274
16275
16276
16277
16278
16279
16280
16281
16282
16283
16284
16285
16286
16287
16288
16289
16290
16291
16292
16293
16294
16295
16296
16297
16298
16299
16300
16301
16302
16303
16304
16305
16306
16307
16308
16309
16310
16311
16312
16313
16314
16315
16316
16317
16318
16319
16320
16321
16322
16323
16324
16325
16326
16327
16328
16329
16330
16331
16332
16333
16334
16335
16336
16337
16338
16339
16340
16341
16342
16343
16344
16345
16346
16347
16348
16349
16350
16351
16352
16353
16354
16355
16356
16357
16358
16359
16360
16361
16362
16363
16364
16365
16366
16367
16368
16369
16370
16371
16372
16373
16374
16375
16376
16377
16378
16379
16380
16381
16382
16383
16384
16385
16386
16387
16388
16389
16390
16391
16392
16393
16394
16395
16396
16397
16398
16399
16400
16401
16402
16403
16404
16405
16406
16407
16408
16409
16410
16411
16412
16413
16414
16415
16416
16417
16418
16419
16420
16421
16422
16423
16424
16425
16426
16427
16428
16429
16430
16431
16432
16433
16434
16435
16436
16437
16438
16439
16440
16441
16442
16443
16444
16445
16446
16447
16448
16449
16450
16451
16452
16453
16454
16455
16456
16457
16458
16459
16460
16461
16462
16463
16464
16465
16466
16467
16468
16469
16470
16471
16472
16473
16474
16475
16476
16477
16478
16479
16480
16481
16482
16483
16484
16485
16486
16487
16488
16489
16490
16491
16492
16493
16494
16495
16496
16497
16498
16499
16500
16501
16502
16503
16504
16505
16506
16507
16508
16509
16510
16511
16512
16513
16514
16515
16516
16517
16518
16519
16520
16521
16522
16523
16524
16525
16526
16527
16528
16529
16530
16531
16532
16533
16534
16535
16536
16537
16538
16539
16540
16541
16542
16543
16544
16545
16546
16547
16548
16549
16550
16551
16552
16553
16554
16555
16556
16557
16558
16559
16560
16561
16562
16563
16564
16565
16566
16567
16568
16569
16570
16571
16572
16573
16574
16575
16576
16577
16578
16579
16580
16581
16582
16583
16584
16585
16586
16587
16588
16589
16590
16591
16592
16593
16594
16595
16596
16597
16598
16599
16600
16601
16602
16603
16604
16605
16606
16607
16608
16609
16610
16611
16612
16613
16614
16615
16616
16617
16618
16619
16620
16621
16622
16623
16624
16625
16626
16627
16628
16629
16630
16631
16632
16633
16634
16635
16636
16637
16638
16639
16640
16641
16642
16643
16644
16645
16646
16647
16648
16649
16650
16651
16652
16653
16654
16655
16656
16657
16658
16659
16660
16661
16662
16663
16664
16665
16666
16667
16668
16669
16670
16671
16672
16673
16674
16675
16676
16677
16678
16679
16680
16681
16682
16683
16684
16685
16686
16687
16688
16689
16690
16691
16692
16693
16694
16695
16696
16697
16698
16699
16700
16701
16702
16703
16704
16705
16706
16707
16708
16709
16710
16711
16712
16713
16714
16715
16716
16717
16718
16719
16720
16721
16722
16723
16724
16725
16726
16727
16728
16729
16730
16731
16732
16733
16734
16735
16736
16737
16738
16739
16740
16741
16742
16743
16744
16745
16746
16747
16748
16749
16750
16751
16752
16753
16754
16755
16756
16757
16758
16759
16760
16761
16762
16763
16764
16765
16766
16767
16768
16769
16770
16771
16772
16773
16774
16775
16776
16777
16778
16779
16780
16781
16782
16783
16784
16785
16786
16787
16788
16789
16790
16791
16792
16793
16794
16795
16796
16797
16798
16799
16800
16801
16802
16803
16804
16805
16806
16807
16808
16809
16810
16811
16812
16813
16814
16815
16816
16817
16818
16819
16820
16821
16822
16823
16824
16825
16826
16827
16828
16829
16830
16831
16832
16833
16834
16835
16836
16837
16838
16839
16840
16841
16842
16843
16844
16845
16846
16847
16848
16849
16850
16851
16852
16853
16854
16855
16856
16857
16858
16859
16860
16861
16862
16863
16864
16865
16866
16867
16868
16869
16870
16871
16872
16873
16874
16875
16876
16877
16878
16879
16880
16881
16882
16883
16884
16885
16886
16887
16888
16889
16890
16891
16892
16893
16894
16895
16896
16897
16898
16899
16900
16901
16902
16903
16904
16905
16906
16907
16908
16909
16910
16911
16912
16913
16914
16915
16916
16917
16918
16919
16920
16921
16922
16923
16924
16925
16926
16927
16928
16929
16930
16931
16932
16933
16934
16935
16936
16937
16938
16939
16940
16941
16942
16943
16944
16945
16946
16947
16948
16949
16950
16951
16952
16953
16954
16955
16956
16957
16958
16959
16960
16961
16962
16963
16964
16965
16966
16967
16968
16969
16970
16971
16972
16973
16974
16975
16976
16977
16978
16979
16980
16981
16982
16983
16984
16985
16986
16987
16988
16989
16990
16991
16992
16993
16994
16995
16996
16997
16998
16999
17000
17001
17002
17003
17004
17005
17006
17007
17008
17009
17010
17011
17012
17013
17014
17015
17016
17017
17018
17019
17020
17021
17022
17023
17024
17025
17026
17027
17028
17029
17030
17031
17032
17033
17034
17035
17036
17037
17038
17039
17040
17041
17042
17043
17044
17045
17046
17047
17048
17049
17050
17051
17052
17053
17054
17055
17056
17057
17058
17059
17060
17061
17062
17063
17064
17065
17066
17067
17068
17069
17070
17071
17072
17073
17074
17075
17076
17077
17078
17079
17080
17081
17082
17083
17084
17085
17086
17087
17088
17089
17090
17091
17092
17093
17094
17095
17096
17097
17098
17099
17100
17101
17102
17103
17104
17105
17106
17107
17108
17109
17110
17111
17112
17113
17114
17115
17116
17117
17118
17119
17120
17121
17122
17123
17124
17125
17126
17127
17128
17129
17130
17131
17132
17133
17134
17135
17136
17137
17138
17139
17140
17141
17142
17143
17144
17145
17146
17147
17148
17149
17150
17151
17152
17153
17154
17155
17156
17157
17158
17159
17160
17161
17162
17163
17164
17165
17166
17167
17168
17169
17170
17171
17172
17173
17174
17175
17176
17177
17178
17179
17180
17181
17182
17183
17184
17185
17186
17187
17188
17189
17190
17191
17192
17193
17194
17195
17196
17197
17198
17199
17200
17201
17202
17203
17204
17205
17206
17207
17208
17209
17210
17211
17212
17213
17214
17215
17216
17217
17218
17219
17220
17221
17222
17223
17224
17225
17226
17227
17228
17229
17230
17231
17232
17233
17234
17235
17236
17237
17238
17239
17240
17241
17242
17243
17244
17245
17246
17247
17248
17249
17250
17251
17252
17253
17254
17255
17256
17257
17258
17259
17260
17261
17262
17263
17264
17265
17266
17267
17268
17269
17270
17271
17272
17273
17274
17275
17276
17277
17278
17279
17280
17281
17282
17283
17284
17285
17286
17287
17288
17289
17290
17291
17292
17293
17294
17295
17296
17297
17298
17299
17300
17301
17302
17303
17304
17305
17306
17307
17308
17309
17310
17311
17312
17313
17314
17315
17316
17317
17318
17319
17320
17321
17322
17323
17324
17325
17326
17327
17328
17329
17330
17331
17332
17333
17334
17335
17336
17337
17338
17339
17340
17341
17342
17343
17344
17345
17346
17347
17348
17349
17350
17351
17352
17353
17354
17355
17356
17357
17358
17359
17360
17361
17362
17363
17364
17365
17366
17367
17368
17369
17370
17371
17372
17373
17374
17375
17376
17377
17378
17379
17380
17381
17382
17383
17384
17385
17386
17387
17388
17389
17390
17391
17392
17393
17394
17395
17396
17397
17398
17399
17400
17401
17402
17403
17404
17405
17406
17407
17408
17409
17410
17411
17412
17413
17414
17415
17416
17417
17418
17419
17420
17421
17422
17423
17424
17425
17426
17427
17428
17429
17430
17431
17432
17433
17434
17435
17436
17437
17438
17439
17440
17441
17442
17443
17444
17445
17446
17447
17448
17449
17450
17451
17452
17453
17454
17455
17456
17457
17458
17459
17460
17461
17462
17463
17464
17465
17466
17467
17468
17469
17470
17471
17472
17473
17474
17475
17476
17477
17478
17479
17480
17481
17482
17483
17484
17485
17486
17487
17488
17489
17490
17491
17492
17493
17494
17495
17496
17497
17498
17499
17500
17501
17502
17503
17504
17505
17506
17507
17508
17509
17510
17511
17512
17513
17514
17515
17516
17517
17518
17519
17520
17521
17522
17523
17524
17525
17526
17527
17528
17529
17530
17531
17532
17533
17534
17535
17536
17537
17538
17539
17540
17541
17542
17543
17544
17545
17546
17547
17548
17549
17550
17551
17552
17553
17554
17555
17556
17557
17558
17559
17560
17561
17562
17563
17564
17565
17566
17567
17568
17569
17570
17571
17572
17573
17574
17575
17576
17577
17578
17579
17580
17581
17582
17583
17584
17585
17586
17587
17588
17589
17590
17591
17592
17593
17594
17595
17596
17597
17598
17599
17600
17601
17602
17603
17604
17605
17606
17607
17608
17609
17610
17611
17612
17613
17614
17615
17616
17617
17618
17619
17620
17621
17622
17623
17624
17625
17626
17627
17628
17629
17630
17631
17632
17633
17634
17635
17636
17637
17638
17639
17640
17641
17642
17643
17644
17645
17646
17647
17648
17649
17650
17651
17652
17653
17654
17655
17656
17657
17658
17659
17660
17661
17662
17663
17664
17665
17666
17667
17668
17669
17670
17671
17672
17673
17674
17675
17676
17677
17678
17679
17680
17681
17682
17683
17684
17685
17686
17687
17688
17689
17690
17691
17692
17693
17694
17695
17696
17697
17698
17699
17700
17701
17702
17703
17704
17705
17706
17707
17708
17709
17710
17711
17712
17713
17714
17715
17716
17717
17718
17719
17720
17721
17722
17723
17724
17725
17726
17727
17728
17729
17730
17731
17732
17733
17734
17735
17736
17737
17738
17739
17740
17741
17742
17743
17744
17745
17746
17747
17748
17749
17750
17751
17752
17753
17754
17755
17756
17757
17758
17759
17760
17761
17762
17763
17764
17765
17766
17767
17768
17769
17770
17771
17772
17773
17774
17775
17776
17777
17778
17779
17780
17781
17782
17783
17784
17785
17786
17787
17788
17789
17790
17791
17792
17793
17794
17795
17796
17797
17798
17799
17800
17801
17802
17803
17804
17805
17806
17807
17808
17809
17810
17811
17812
17813
17814
17815
17816
17817
17818
17819
17820
17821
17822
17823
17824
17825
17826
17827
17828
17829
17830
17831
17832
17833
17834
17835
17836
17837
17838
17839
17840
17841
17842
17843
17844
17845
17846
17847
17848
17849
17850
17851
17852
17853
17854
17855
17856
17857
17858
17859
17860
17861
17862
17863
17864
17865
17866
17867
17868
17869
17870
17871
17872
17873
17874
17875
17876
17877
17878
17879
17880
17881
17882
17883
17884
17885
17886
17887
17888
17889
17890
17891
17892
17893
17894
17895
17896
17897
17898
17899
17900
17901
17902
17903
17904
17905
17906
17907
17908
17909
17910
17911
17912
17913
17914
17915
17916
17917
17918
17919
17920
17921
17922
17923
17924
17925
17926
17927
17928
17929
17930
17931
17932
17933
17934
17935
17936
17937
17938
17939
17940
17941
17942
17943
17944
17945
17946
17947
17948
17949
17950
17951
17952
17953
17954
17955
17956
17957
17958
17959
17960
17961
17962
17963
17964
17965
17966
17967
17968
17969
17970
17971
17972
17973
17974
17975
17976
17977
17978
17979
17980
17981
17982
17983
17984
17985
17986
17987
17988
17989
17990
17991
17992
17993
17994
17995
17996
17997
17998
17999
18000
18001
18002
18003
18004
18005
18006
18007
18008
18009
18010
18011
18012
18013
18014
18015
18016
18017
18018
18019
18020
18021
18022
18023
18024
18025
18026
18027
18028
18029
18030
18031
18032
18033
18034
18035
18036
18037
18038
18039
18040
18041
18042
18043
18044
18045
18046
18047
18048
18049
18050
18051
18052
18053
18054
18055
18056
18057
18058
18059
18060
18061
18062
18063
18064
18065
18066
18067
18068
18069
18070
18071
18072
18073
18074
18075
18076
18077
18078
18079
18080
18081
18082
18083
18084
18085
18086
18087
18088
18089
18090
18091
18092
18093
18094
18095
18096
18097
18098
18099
18100
18101
18102
18103
18104
18105
18106
18107
18108
18109
18110
18111
18112
18113
18114
18115
18116
18117
18118
18119
18120
18121
18122
18123
18124
18125
18126
18127
18128
18129
18130
18131
18132
18133
18134
18135
18136
18137
18138
18139
18140
18141
18142
18143
18144
18145
18146
18147
18148
18149
18150
18151
18152
18153
18154
18155
18156
18157
18158
18159
18160
18161
18162
18163
18164
18165
18166
18167
18168
18169
18170
18171
18172
18173
18174
18175
18176
18177
18178
18179
18180
18181
18182
18183
18184
18185
18186
18187
18188
18189
18190
18191
18192
18193
18194
18195
18196
18197
18198
18199
18200
18201
18202
18203
18204
18205
18206
18207
18208
18209
18210
18211
18212
18213
18214
18215
18216
18217
18218
18219
18220
18221
18222
18223
18224
18225
18226
18227
18228
18229
18230
18231
18232
18233
18234
18235
18236
18237
18238
18239
18240
18241
18242
18243
18244
18245
18246
18247
18248
18249
18250
18251
18252
18253
18254
18255
18256
18257
18258
18259
18260
18261
18262
18263
18264
18265
18266
18267
18268
18269
18270
18271
18272
18273
18274
18275
18276
18277
18278
18279
18280
18281
18282
18283
18284
18285
18286
18287
18288
18289
18290
18291
18292
18293
18294
18295
18296
18297
18298
18299
18300
18301
18302
18303
18304
18305
18306
18307
18308
18309
18310
18311
18312
18313
18314
18315
18316
18317
18318
18319
18320
18321
18322
18323
18324
18325
18326
18327
18328
18329
18330
18331
18332
18333
18334
18335
18336
18337
18338
18339
18340
18341
18342
18343
18344
18345
18346
18347
18348
18349
18350
18351
18352
18353
18354
18355
18356
18357
18358
18359
18360
18361
18362
18363
18364
18365
18366
18367
18368
18369
18370
18371
18372
18373
18374
18375
18376
18377
18378
18379
18380
18381
18382
18383
18384
18385
18386
18387
18388
18389
18390
18391
18392
18393
18394
18395
18396
18397
18398
18399
18400
18401
18402
18403
18404
18405
18406
18407
18408
18409
18410
18411
18412
18413
18414
18415
18416
18417
18418
18419
18420
18421
18422
18423
18424
18425
18426
18427
18428
18429
18430
18431
18432
18433
18434
18435
18436
18437
18438
18439
18440
18441
18442
18443
18444
18445
18446
18447
18448
18449
18450
18451
18452
18453
18454
18455
18456
18457
18458
18459
18460
18461
18462
18463
18464
18465
18466
18467
18468
18469
18470
18471
18472
18473
18474
18475
18476
18477
18478
18479
18480
18481
18482
18483
18484
18485
18486
18487
18488
18489
18490
18491
18492
18493
18494
18495
18496
18497
18498
18499
18500
18501
18502
18503
18504
18505
18506
18507
18508
18509
18510
18511
18512
18513
18514
18515
18516
18517
18518
18519
18520
18521
18522
18523
18524
18525
18526
18527
18528
18529
18530
18531
18532
18533
18534
18535
18536
18537
18538
18539
18540
18541
18542
18543
18544
18545
18546
18547
18548
18549
18550
18551
18552
18553
18554
18555
18556
18557
18558
18559
18560
18561
18562
18563
18564
18565
18566
18567
18568
18569
18570
18571
18572
18573
18574
18575
18576
18577
18578
18579
18580
18581
18582
18583
18584
18585
18586
18587
18588
18589
18590
18591
18592
18593
18594
18595
18596
18597
18598
18599
18600
18601
18602
18603
18604
18605
18606
18607
18608
18609
18610
18611
18612
18613
18614
18615
18616
18617
18618
18619
18620
18621
18622
18623
18624
18625
18626
18627
18628
18629
18630
18631
18632
18633
18634
18635
18636
18637
18638
18639
18640
18641
18642
18643
18644
18645
18646
18647
18648
18649
18650
18651
18652
18653
18654
18655
18656
18657
18658
18659
18660
18661
18662
18663
18664
18665
18666
18667
18668
18669
18670
18671
18672
18673
18674
18675
18676
18677
18678
18679
18680
18681
18682
18683
18684
18685
18686
18687
18688
18689
18690
18691
18692
18693
18694
18695
18696
18697
18698
18699
18700
18701
18702
18703
18704
18705
18706
18707
18708
18709
18710
18711
18712
18713
18714
18715
18716
18717
18718
18719
18720
18721
18722
18723
18724
18725
18726
18727
18728
18729
18730
18731
18732
18733
18734
18735
18736
18737
18738
18739
18740
18741
18742
18743
18744
18745
18746
18747
18748
18749
18750
18751
18752
18753
18754
18755
18756
18757
18758
18759
18760
18761
18762
18763
18764
18765
18766
18767
18768
18769
18770
18771
18772
18773
18774
18775
18776
18777
18778
18779
18780
18781
18782
18783
18784
18785
18786
18787
18788
18789
18790
18791
18792
18793
18794
18795
18796
18797
18798
18799
18800
18801
18802
18803
18804
18805
18806
18807
18808
18809
18810
18811
18812
18813
18814
18815
18816
18817
18818
18819
18820
18821
18822
18823
18824
18825
18826
18827
18828
18829
18830
18831
18832
18833
18834
18835
18836
18837
18838
18839
18840
18841
18842
18843
18844
18845
18846
18847
18848
18849
18850
18851
18852
18853
18854
18855
18856
18857
18858
18859
18860
18861
18862
18863
18864
18865
18866
18867
18868
18869
18870
18871
18872
18873
18874
18875
18876
18877
18878
18879
18880
18881
18882
18883
18884
18885
18886
18887
18888
18889
18890
18891
18892
18893
18894
18895
18896
18897
18898
18899
18900
18901
18902
18903
18904
18905
18906
18907
18908
18909
18910
18911
18912
18913
18914
18915
18916
18917
18918
18919
18920
18921
18922
18923
18924
18925
18926
18927
18928
18929
18930
18931
18932
18933
18934
18935
18936
18937
18938
18939
18940
18941
18942
18943
18944
18945
18946
18947
18948
18949
18950
18951
18952
18953
18954
18955
18956
18957
18958
18959
18960
18961
18962
18963
18964
18965
18966
18967
18968
18969
18970
18971
18972
18973
18974
18975
18976
18977
18978
18979
18980
18981
18982
18983
18984
18985
18986
18987
18988
18989
18990
18991
18992
18993
18994
18995
18996
18997
18998
18999
19000
19001
19002
19003
19004
19005
19006
19007
19008
19009
19010
19011
19012
19013
19014
19015
19016
19017
19018
19019
19020
19021
19022
19023
19024
19025
19026
19027
19028
19029
19030
19031
19032
19033
19034
19035
19036
19037
19038
19039
19040
19041
19042
19043
19044
19045
19046
19047
19048
19049
19050
19051
19052
19053
19054
19055
19056
19057
19058
19059
19060
19061
19062
19063
19064
19065
19066
19067
19068
19069
19070
19071
19072
19073
19074
19075
19076
19077
19078
19079
19080
19081
19082
19083
19084
19085
19086
19087
19088
19089
19090
19091
19092
19093
19094
19095
19096
19097
19098
19099
19100
19101
19102
19103
19104
19105
19106
19107
19108
19109
19110
19111
19112
19113
19114
19115
19116
19117
19118
19119
19120
19121
19122
19123
19124
19125
19126
19127
19128
19129
19130
19131
19132
19133
19134
19135
19136
19137
19138
19139
19140
19141
19142
19143
19144
19145
19146
19147
19148
19149
19150
19151
19152
19153
19154
19155
19156
19157
19158
19159
19160
19161
19162
19163
19164
19165
19166
19167
19168
19169
19170
19171
19172
19173
19174
19175
19176
19177
19178
19179
19180
19181
19182
19183
19184
19185
19186
19187
19188
19189
19190
19191
19192
19193
19194
19195
19196
19197
19198
19199
19200
19201
19202
19203
19204
19205
19206
19207
19208
19209
19210
19211
19212
19213
19214
19215
19216
19217
19218
19219
19220
19221
19222
19223
19224
19225
19226
19227
19228
19229
19230
19231
19232
19233
19234
19235
19236
19237
19238
19239
19240
19241
19242
19243
19244
19245
19246
19247
19248
19249
19250
19251
19252
19253
19254
19255
19256
19257
19258
19259
19260
19261
19262
19263
19264
19265
19266
19267
19268
19269
19270
19271
19272
19273
19274
19275
19276
19277
19278
19279
19280
19281
19282
19283
19284
19285
19286
19287
19288
19289
19290
19291
19292
19293
19294
19295
19296
19297
19298
19299
19300
19301
19302
19303
19304
19305
19306
19307
19308
19309
19310
19311
19312
19313
19314
19315
19316
19317
19318
19319
19320
19321
19322
19323
19324
19325
19326
19327
19328
19329
19330
19331
19332
19333
19334
19335
19336
19337
19338
19339
19340
19341
19342
19343
19344
19345
19346
19347
19348
19349
19350
19351
19352
19353
19354
19355
19356
19357
19358
19359
19360
19361
19362
19363
19364
19365
19366
19367
19368
19369
19370
19371
19372
19373
19374
19375
19376
19377
19378
19379
19380
19381
19382
19383
19384
19385
19386
19387
19388
19389
19390
19391
19392
19393
19394
19395
19396
19397
19398
19399
19400
19401
19402
19403
19404
19405
19406
19407
19408
19409
19410
19411
19412
19413
19414
19415
19416
19417
19418
19419
19420
19421
19422
19423
19424
19425
19426
19427
19428
19429
19430
19431
19432
19433
19434
19435
19436
19437
19438
19439
19440
19441
19442
19443
19444
19445
19446
19447
19448
19449
19450
19451
19452
19453
19454
19455
19456
19457
19458
19459
19460
19461
19462
19463
19464
19465
19466
19467
19468
19469
19470
19471
19472
19473
19474
19475
19476
19477
19478
19479
19480
19481
19482
19483
19484
19485
19486
19487
19488
19489
19490
19491
19492
19493
19494
19495
19496
19497
19498
19499
19500
19501
19502
19503
19504
19505
19506
19507
19508
19509
19510
19511
19512
19513
19514
19515
19516
19517
19518
19519
19520
19521
19522
19523
19524
19525
19526
19527
19528
19529
19530
19531
19532
19533
19534
19535
19536
19537
19538
19539
19540
19541
19542
19543
19544
19545
19546
19547
19548
19549
19550
19551
19552
19553
19554
19555
19556
19557
19558
19559
19560
19561
19562
19563
19564
19565
19566
19567
19568
19569
19570
19571
19572
19573
19574
19575
19576
19577
19578
19579
19580
19581
19582
19583
19584
19585
19586
19587
19588
19589
19590
19591
19592
19593
19594
19595
19596
19597
19598
19599
19600
19601
19602
19603
19604
19605
19606
19607
19608
19609
19610
19611
19612
19613
19614
19615
19616
19617
19618
19619
19620
19621
19622
19623
19624
19625
19626
19627
19628
19629
19630
19631
19632
19633
19634
19635
19636
19637
19638
19639
19640
19641
19642
19643
19644
19645
19646
19647
19648
19649
19650
19651
19652
19653
19654
19655
19656
19657
19658
19659
19660
19661
19662
19663
19664
19665
19666
19667
19668
19669
19670
19671
19672
19673
19674
19675
19676
19677
19678
19679
19680
19681
19682
19683
19684
19685
19686
19687
19688
19689
19690
19691
19692
19693
19694
19695
19696
19697
19698
19699
19700
19701
19702
19703
19704
19705
19706
19707
19708
19709
19710
19711
19712
19713
19714
19715
19716
19717
19718
19719
19720
19721
19722
19723
19724
19725
19726
19727
19728
19729
19730
19731
19732
19733
19734
19735
19736
19737
19738
19739
19740
19741
19742
19743
19744
19745
19746
19747
19748
19749
19750
19751
19752
19753
19754
19755
19756
19757
19758
19759
19760
19761
19762
19763
19764
19765
19766
19767
19768
19769
19770
19771
19772
19773
19774
19775
19776
19777
19778
19779
19780
19781
19782
19783
19784
19785
19786
19787
19788
19789
19790
19791
19792
19793
19794
19795
19796
19797
19798
19799
19800
19801
19802
19803
19804
19805
19806
19807
19808
19809
19810
19811
19812
19813
19814
19815
19816
19817
19818
19819
19820
19821
19822
19823
19824
19825
19826
19827
19828
19829
19830
19831
19832
19833
19834
19835
19836
19837
19838
19839
19840
19841
19842
19843
19844
19845
19846
19847
19848
19849
19850
19851
19852
19853
19854
19855
19856
19857
19858
19859
19860
19861
19862
19863
19864
19865
19866
19867
19868
19869
19870
19871
19872
19873
19874
19875
19876
19877
19878
19879
19880
19881
19882
19883
19884
19885
19886
19887
19888
19889
19890
19891
19892
19893
19894
19895
19896
19897
19898
19899
19900
19901
19902
19903
19904
19905
19906
19907
19908
19909
19910
19911
19912
19913
19914
19915
19916
19917
19918
19919
19920
19921
19922
19923
19924
19925
19926
19927
19928
19929
19930
19931
19932
19933
19934
19935
19936
19937
19938
19939
19940
19941
19942
19943
19944
19945
19946
19947
19948
19949
19950
19951
19952
19953
19954
19955
19956
19957
19958
19959
19960
19961
19962
19963
19964
19965
19966
19967
19968
19969
19970
19971
19972
19973
19974
19975
19976
19977
19978
19979
19980
19981
19982
19983
19984
19985
19986
19987
19988
19989
19990
19991
19992
19993
19994
19995
19996
19997
19998
19999
20000
20001
20002
20003
20004
20005
20006
20007
20008
20009
20010
20011
20012
20013
20014
20015
20016
20017
20018
20019
20020
20021
20022
20023
20024
20025
20026
20027
20028
20029
20030
20031
20032
20033
20034
20035
20036
20037
20038
20039
20040
20041
20042
20043
20044
20045
20046
20047
20048
20049
20050
20051
20052
20053
20054
20055
20056
20057
20058
20059
20060
20061
20062
20063
20064
20065
20066
20067
20068
20069
20070
20071
20072
20073
20074
20075
20076
20077
20078
20079
20080
20081
20082
20083
20084
20085
20086
20087
20088
20089
20090
20091
20092
20093
20094
20095
20096
20097
20098
20099
20100
20101
20102
20103
20104
20105
20106
20107
20108
20109
20110
20111
20112
20113
20114
20115
20116
20117
20118
20119
20120
20121
20122
20123
20124
20125
20126
20127
20128
20129
20130
20131
20132
20133
20134
20135
20136
20137
20138
20139
20140
20141
20142
20143
20144
20145
20146
20147
20148
20149
20150
20151
20152
20153
20154
20155
20156
20157
20158
20159
20160
20161
20162
20163
20164
20165
20166
20167
20168
20169
20170
20171
20172
20173
20174
20175
20176
20177
20178
20179
20180
20181
20182
20183
20184
20185
20186
20187
20188
20189
20190
20191
20192
20193
20194
20195
20196
20197
20198
20199
20200
20201
20202
20203
20204
20205
20206
20207
20208
20209
20210
20211
20212
20213
20214
20215
20216
20217
20218
20219
20220
20221
20222
20223
20224
20225
20226
20227
20228
20229
20230
20231
20232
20233
20234
20235
20236
20237
20238
20239
20240
20241
20242
20243
20244
20245
20246
20247
20248
20249
20250
20251
20252
20253
20254
20255
20256
20257
20258
20259
20260
20261
20262
20263
20264
20265
20266
20267
20268
20269
20270
20271
20272
20273
20274
20275
20276
20277
20278
20279
20280
20281
20282
20283
20284
20285
20286
20287
20288
20289
20290
20291
20292
20293
20294
20295
20296
20297
20298
20299
20300
20301
20302
20303
20304
20305
20306
20307
20308
20309
20310
20311
20312
20313
20314
20315
20316
20317
20318
20319
20320
20321
20322
20323
20324
20325
20326
20327
20328
20329
20330
20331
20332
20333
20334
20335
20336
20337
20338
20339
20340
20341
20342
20343
20344
20345
20346
20347
20348
20349
20350
20351
20352
20353
20354
20355
20356
20357
20358
20359
20360
20361
20362
20363
20364
20365
20366
20367
20368
20369
20370
20371
20372
20373
20374
20375
20376
20377
20378
20379
20380
20381
20382
20383
20384
20385
20386
20387
20388
20389
20390
20391
20392
20393
20394
20395
20396
20397
20398
20399
20400
20401
20402
20403
20404
20405
20406
20407
20408
20409
20410
20411
20412
20413
20414
20415
20416
20417
20418
20419
20420
20421
20422
20423
20424
20425
20426
20427
20428
20429
20430
20431
20432
20433
20434
20435
20436
20437
20438
20439
20440
20441
20442
20443
20444
20445
20446
20447
20448
20449
20450
20451
20452
20453
20454
20455
20456
20457
20458
20459
20460
20461
20462
20463
20464
20465
20466
20467
20468
20469
20470
20471
20472
20473
20474
20475
20476
20477
20478
20479
20480
20481
20482
20483
20484
20485
20486
20487
20488
20489
20490
20491
20492
20493
20494
20495
20496
20497
20498
20499
20500
20501
20502
20503
20504
20505
20506
20507
20508
20509
20510
20511
20512
20513
20514
20515
20516
20517
20518
20519
20520
20521
20522
20523
20524
20525
20526
20527
20528
20529
20530
20531
20532
20533
20534
20535
20536
20537
20538
20539
20540
20541
20542
20543
20544
20545
20546
20547
20548
20549
20550
20551
20552
20553
20554
20555
20556
20557
20558
20559
20560
20561
20562
20563
20564
20565
20566
20567
20568
20569
20570
20571
20572
20573
20574
20575
20576
20577
20578
20579
20580
20581
20582
20583
20584
20585
20586
20587
20588
20589
20590
20591
20592
20593
20594
20595
20596
20597
20598
20599
20600
20601
20602
20603
20604
20605
20606
20607
20608
20609
20610
20611
20612
20613
20614
20615
20616
20617
20618
20619
20620
20621
20622
20623
20624
20625
20626
20627
20628
20629
20630
20631
20632
20633
20634
20635
20636
20637
20638
20639
20640
20641
20642
20643
20644
20645
20646
20647
20648
20649
20650
20651
20652
20653
20654
20655
20656
20657
20658
20659
20660
20661
20662
20663
20664
20665
20666
20667
20668
20669
20670
20671
20672
20673
20674
20675
20676
20677
20678
20679
20680
20681
20682
20683
20684
20685
20686
20687
20688
20689
20690
20691
20692
20693
20694
20695
20696
20697
20698
20699
20700
20701
20702
20703
20704
20705
20706
20707
20708
20709
20710
20711
20712
20713
20714
20715
20716
20717
20718
20719
20720
20721
20722
20723
20724
20725
20726
20727
20728
20729
20730
20731
20732
20733
20734
20735
20736
20737
20738
20739
20740
20741
20742
20743
20744
20745
20746
20747
20748
20749
20750
20751
20752
20753
20754
20755
20756
20757
20758
20759
20760
20761
20762
20763
20764
20765
20766
20767
20768
20769
20770
20771
20772
20773
20774
20775
20776
20777
20778
20779
20780
20781
20782
20783
20784
20785
20786
20787
20788
20789
20790
20791
20792
20793
20794
20795
20796
20797
20798
20799
20800
20801
20802
20803
20804
20805
20806
20807
20808
20809
20810
20811
20812
20813
20814
20815
20816
20817
20818
20819
20820
20821
20822
20823
20824
20825
20826
20827
20828
20829
20830
20831
20832
20833
20834
20835
20836
20837
20838
20839
20840
20841
20842
20843
20844
20845
20846
20847
20848
20849
20850
20851
20852
20853
20854
20855
20856
20857
20858
20859
20860
20861
20862
20863
20864
20865
20866
20867
20868
20869
20870
20871
20872
20873
20874
20875
20876
20877
20878
20879
20880
20881
20882
20883
20884
20885
20886
20887
20888
20889
20890
20891
20892
20893
20894
20895
20896
20897
20898
20899
20900
20901
20902
20903
20904
20905
20906
20907
20908
20909
20910
20911
20912
20913
20914
20915
20916
20917
20918
20919
20920
20921
20922
20923
20924
20925
20926
20927
20928
20929
20930
20931
20932
20933
20934
20935
20936
20937
20938
20939
20940
20941
20942
20943
20944
20945
20946
20947
20948
20949
20950
20951
20952
20953
20954
20955
20956
20957
20958
20959
20960
20961
20962
20963
20964
20965
20966
20967
20968
20969
20970
20971
20972
20973
20974
20975
20976
20977
20978
20979
20980
20981
20982
20983
20984
20985
20986
20987
20988
20989
20990
20991
20992
20993
20994
20995
20996
20997
20998
20999
21000
21001
21002
21003
21004
21005
21006
21007
21008
21009
21010
21011
21012
21013
21014
21015
21016
21017
21018
21019
21020
21021
21022
21023
21024
21025
21026
21027
21028
21029
21030
21031
21032
21033
21034
21035
21036
21037
21038
21039
21040
21041
21042
21043
21044
21045
21046
21047
21048
21049
21050
21051
21052
21053
21054
21055
21056
21057
21058
21059
21060
21061
21062
21063
21064
21065
21066
21067
21068
21069
21070
21071
21072
21073
21074
21075
21076
21077
21078
21079
21080
21081
21082
21083
21084
21085
21086
21087
21088
21089
21090
21091
21092
21093
21094
21095
21096
21097
21098
21099
21100
21101
21102
21103
21104
21105
21106
21107
21108
21109
21110
21111
21112
21113
21114
21115
21116
21117
21118
21119
21120
21121
21122
21123
21124
21125
21126
21127
21128
21129
21130
21131
21132
21133
21134
21135
21136
21137
21138
21139
21140
21141
21142
21143
21144
21145
21146
21147
21148
21149
21150
21151
21152
21153
21154
21155
21156
21157
21158
21159
21160
21161
21162
21163
21164
21165
21166
21167
21168
21169
21170
21171
21172
21173
21174
21175
21176
21177
21178
21179
21180
21181
21182
21183
21184
21185
21186
21187
21188
21189
21190
21191
21192
21193
21194
21195
21196
21197
21198
21199
21200
21201
21202
21203
21204
21205
21206
21207
21208
21209
21210
21211
21212
21213
21214
21215
21216
21217
21218
21219
21220
21221
21222
21223
21224
21225
21226
21227
21228
21229
21230
21231
21232
21233
21234
21235
21236
21237
21238
21239
21240
21241
21242
21243
21244
21245
21246
21247
21248
21249
21250
21251
21252
21253
21254
21255
21256
21257
21258
21259
21260
21261
21262
21263
21264
21265
21266
21267
21268
21269
21270
21271
21272
21273
21274
21275
21276
21277
21278
21279
21280
21281
21282
21283
21284
21285
21286
21287
21288
21289
21290
21291
21292
21293
21294
21295
21296
21297
21298
21299
21300
21301
21302
21303
21304
21305
21306
21307
21308
21309
21310
21311
21312
21313
21314
21315
21316
21317
21318
21319
21320
21321
21322
21323
21324
21325
21326
21327
21328
21329
21330
21331
21332
21333
21334
21335
21336
21337
21338
21339
21340
21341
21342
21343
21344
21345
21346
21347
21348
21349
21350
21351
21352
21353
21354
21355
21356
21357
21358
21359
21360
21361
21362
21363
21364
21365
21366
21367
21368
21369
21370
21371
21372
21373
21374
21375
21376
21377
21378
21379
21380
21381
21382
21383
21384
21385
21386
21387
21388
21389
21390
21391
21392
21393
21394
21395
21396
21397
21398
21399
21400
21401
21402
21403
21404
21405
21406
21407
21408
21409
21410
21411
21412
21413
21414
21415
21416
21417
21418
21419
21420
21421
21422
21423
21424
21425
21426
21427
21428
21429
21430
21431
21432
21433
21434
21435
21436
21437
21438
21439
21440
21441
21442
21443
21444
21445
21446
21447
21448
21449
21450
21451
21452
21453
21454
21455
21456
21457
21458
21459
21460
21461
21462
21463
21464
21465
21466
21467
21468
21469
21470
21471
21472
21473
21474
21475
21476
21477
21478
21479
21480
21481
21482
21483
21484
21485
21486
21487
21488
21489
21490
21491
21492
21493
21494
21495
21496
21497
21498
21499
21500
21501
21502
21503
21504
21505
21506
21507
21508
21509
21510
21511
21512
21513
21514
21515
21516
21517
21518
21519
21520
21521
21522
21523
21524
21525
21526
21527
21528
21529
21530
21531
21532
21533
21534
21535
21536
21537
21538
21539
21540
21541
21542
21543
21544
21545
21546
21547
21548
21549
21550
21551
21552
21553
21554
21555
21556
21557
21558
21559
21560
21561
21562
21563
21564
21565
21566
21567
21568
21569
21570
21571
21572
21573
21574
21575
21576
21577
21578
21579
21580
21581
21582
21583
21584
21585
21586
21587
21588
21589
21590
21591
21592
21593
21594
21595
21596
21597
21598
21599
21600
21601
21602
21603
21604
21605
21606
21607
21608
21609
21610
21611
21612
21613
21614
21615
21616
21617
21618
21619
21620
21621
21622
21623
21624
21625
21626
21627
21628
21629
21630
21631
21632
21633
21634
21635
21636
21637
21638
21639
21640
21641
21642
21643
21644
21645
21646
21647
21648
21649
21650
21651
21652
21653
21654
21655
21656
21657
21658
21659
21660
21661
21662
21663
21664
21665
21666
21667
21668
21669
21670
21671
21672
21673
21674
21675
21676
21677
21678
21679
21680
21681
21682
21683
21684
21685
21686
21687
21688
21689
21690
21691
21692
21693
21694
21695
21696
21697
21698
21699
21700
21701
21702
21703
21704
21705
21706
21707
21708
21709
21710
21711
21712
21713
21714
21715
21716
21717
21718
21719
21720
21721
21722
21723
21724
21725
21726
21727
21728
21729
21730
21731
21732
21733
21734
21735
21736
21737
21738
21739
21740
21741
21742
21743
21744
21745
21746
21747
21748
21749
21750
21751
21752
21753
21754
21755
21756
21757
21758
21759
21760
21761
21762
21763
21764
21765
21766
21767
21768
21769
21770
21771
21772
21773
21774
21775
21776
21777
21778
21779
21780
21781
21782
21783
21784
21785
21786
21787
21788
21789
21790
21791
21792
21793
21794
21795
21796
21797
21798
21799
21800
21801
21802
21803
21804
21805
21806
21807
21808
21809
21810
21811
21812
21813
21814
21815
21816
21817
21818
21819
21820
21821
21822
21823
21824
21825
21826
21827
21828
21829
21830
21831
21832
21833
21834
21835
21836
21837
21838
21839
21840
21841
21842
21843
21844
21845
21846
21847
21848
21849
21850
21851
21852
21853
21854
21855
21856
21857
21858
21859
21860
21861
21862
21863
21864
21865
21866
21867
21868
21869
21870
21871
21872
21873
21874
21875
21876
21877
21878
21879
21880
21881
21882
21883
21884
21885
21886
21887
21888
21889
21890
21891
21892
21893
21894
21895
21896
21897
21898
21899
21900
21901
21902
21903
21904
21905
21906
21907
21908
21909
21910
21911
21912
21913
21914
21915
21916
21917
21918
21919
21920
21921
21922
21923
21924
21925
21926
21927
21928
21929
21930
21931
21932
21933
21934
21935
21936
21937
21938
21939
21940
21941
21942
21943
21944
21945
21946
21947
21948
21949
21950
21951
21952
21953
21954
21955
21956
21957
21958
21959
21960
21961
21962
21963
21964
21965
21966
21967
21968
21969
21970
21971
21972
21973
21974
21975
21976
21977
21978
21979
21980
21981
21982
21983
21984
21985
21986
21987
21988
21989
21990
21991
21992
21993
21994
21995
21996
21997
21998
21999
22000
22001
22002
22003
22004
22005
22006
22007
22008
22009
22010
22011
22012
22013
22014
22015
22016
22017
22018
22019
22020
22021
22022
22023
22024
22025
22026
22027
22028
22029
22030
22031
22032
22033
22034
22035
22036
22037
22038
22039
22040
22041
22042
22043
22044
22045
22046
22047
22048
22049
22050
22051
22052
22053
22054
22055
22056
22057
22058
22059
22060
22061
22062
22063
22064
22065
22066
22067
22068
22069
22070
22071
22072
22073
22074
22075
22076
22077
22078
22079
22080
22081
22082
22083
22084
22085
22086
22087
22088
22089
22090
22091
22092
22093
22094
22095
22096
22097
22098
22099
22100
22101
22102
22103
22104
22105
22106
22107
22108
22109
22110
22111
22112
22113
22114
22115
22116
22117
22118
22119
22120
22121
22122
22123
22124
22125
22126
22127
22128
22129
22130
22131
22132
22133
22134
22135
22136
22137
22138
22139
22140
22141
22142
22143
22144
22145
22146
22147
22148
22149
22150
22151
22152
22153
22154
22155
22156
22157
22158
22159
22160
22161
22162
22163
22164
22165
22166
22167
22168
22169
22170
22171
22172
22173
22174
22175
22176
22177
22178
22179
22180
22181
22182
22183
22184
22185
22186
22187
22188
22189
22190
22191
22192
22193
22194
22195
22196
22197
22198
22199
22200
22201
22202
22203
22204
22205
22206
22207
22208
22209
22210
22211
22212
22213
22214
22215
22216
22217
22218
22219
22220
22221
22222
22223
22224
22225
22226
22227
22228
22229
22230
22231
22232
22233
22234
22235
22236
22237
22238
22239
22240
22241
22242
22243
22244
22245
22246
22247
22248
22249
22250
22251
22252
22253
22254
22255
22256
22257
22258
22259
22260
22261
22262
22263
22264
22265
22266
22267
22268
22269
22270
22271
22272
22273
22274
22275
22276
22277
22278
22279
22280
22281
22282
22283
22284
22285
22286
22287
22288
22289
22290
22291
22292
22293
22294
22295
22296
22297
22298
22299
22300
22301
22302
22303
22304
22305
22306
22307
22308
22309
22310
22311
22312
22313
22314
22315
22316
22317
22318
22319
22320
22321
22322
22323
22324
22325
22326
22327
22328
22329
22330
22331
22332
22333
22334
22335
22336
22337
22338
22339
22340
22341
22342
22343
22344
22345
22346
22347
22348
22349
22350
22351
22352
22353
22354
22355
22356
22357
22358
22359
22360
22361
22362
22363
22364
22365
22366
22367
22368
22369
22370
22371
22372
22373
22374
22375
22376
22377
22378
22379
22380
22381
22382
22383
22384
22385
22386
22387
22388
22389
22390
22391
22392
22393
22394
22395
22396
22397
22398
22399
22400
22401
22402
22403
22404
22405
22406
22407
22408
22409
22410
22411
22412
22413
22414
22415
22416
22417
22418
22419
22420
22421
22422
22423
22424
22425
22426
22427
22428
22429
22430
22431
22432
22433
22434
22435
22436
22437
22438
22439
22440
22441
22442
22443
22444
22445
22446
22447
22448
22449
22450
22451
22452
22453
22454
22455
22456
22457
22458
22459
22460
22461
22462
22463
22464
22465
22466
22467
22468
22469
22470
22471
22472
22473
22474
22475
22476
22477
22478
22479
22480
22481
22482
22483
22484
22485
22486
22487
22488
22489
22490
22491
22492
22493
22494
22495
22496
22497
22498
22499
22500
22501
22502
22503
22504
22505
22506
22507
22508
22509
22510
22511
22512
22513
22514
22515
22516
22517
22518
22519
22520
22521
22522
22523
22524
22525
22526
22527
22528
22529
22530
22531
22532
22533
22534
22535
22536
22537
22538
22539
22540
22541
22542
22543
22544
22545
22546
22547
22548
22549
22550
22551
22552
22553
22554
22555
22556
22557
22558
22559
22560
22561
22562
22563
22564
22565
22566
22567
22568
22569
22570
22571
22572
22573
22574
22575
22576
22577
22578
22579
22580
22581
22582
22583
22584
22585
22586
22587
22588
22589
22590
22591
22592
22593
22594
22595
22596
22597
22598
22599
22600
22601
22602
22603
22604
22605
22606
22607
22608
22609
22610
22611
22612
22613
22614
22615
22616
22617
22618
22619
22620
22621
22622
22623
22624
22625
22626
22627
22628
22629
22630
22631
22632
22633
22634
22635
22636
22637
22638
22639
22640
22641
22642
22643
22644
22645
22646
22647
22648
22649
22650
22651
22652
22653
22654
22655
22656
22657
22658
22659
22660
22661
22662
22663
22664
22665
22666
22667
22668
22669
22670
22671
22672
22673
22674
22675
22676
22677
22678
22679
22680
22681
22682
22683
22684
22685
22686
22687
22688
22689
22690
22691
22692
22693
22694
22695
22696
22697
22698
22699
22700
22701
22702
22703
22704
22705
22706
22707
22708
22709
22710
22711
22712
22713
22714
22715
22716
22717
22718
22719
22720
22721
22722
22723
22724
22725
22726
22727
22728
22729
22730
22731
22732
22733
22734
22735
22736
22737
22738
22739
22740
22741
22742
22743
22744
22745
22746
22747
22748
22749
22750
22751
22752
22753
22754
22755
22756
22757
22758
22759
22760
22761
22762
22763
22764
22765
22766
22767
22768
22769
22770
22771
22772
22773
22774
22775
22776
22777
22778
22779
22780
22781
22782
22783
22784
22785
22786
22787
22788
22789
22790
22791
22792
22793
22794
22795
22796
22797
22798
22799
22800
22801
22802
22803
22804
22805
22806
22807
22808
22809
22810
22811
22812
22813
22814
22815
22816
22817
22818
22819
22820
22821
22822
22823
22824
22825
22826
22827
22828
22829
22830
22831
22832
22833
22834
22835
22836
22837
22838
22839
22840
22841
22842
22843
22844
22845
22846
22847
22848
22849
22850
22851
22852
22853
22854
22855
22856
22857
22858
22859
22860
22861
22862
22863
22864
22865
22866
22867
22868
22869
22870
22871
22872
22873
22874
22875
22876
22877
22878
22879
22880
22881
22882
22883
22884
22885
22886
22887
22888
22889
22890
22891
22892
22893
22894
22895
22896
22897
22898
22899
22900
22901
22902
22903
22904
22905
22906
22907
22908
22909
22910
22911
22912
22913
22914
22915
22916
22917
22918
22919
22920
22921
22922
22923
22924
22925
22926
22927
22928
22929
22930
22931
22932
22933
22934
22935
22936
22937
22938
22939
22940
22941
22942
22943
22944
22945
22946
22947
22948
22949
22950
22951
22952
22953
22954
22955
22956
22957
22958
22959
22960
22961
22962
22963
22964
22965
22966
22967
22968
22969
22970
22971
22972
22973
22974
22975
22976
22977
22978
22979
22980
22981
22982
22983
22984
22985
22986
22987
22988
22989
22990
22991
22992
22993
22994
22995
22996
22997
22998
22999
23000
23001
23002
23003
23004
23005
23006
23007
23008
23009
23010
23011
23012
23013
23014
23015
23016
23017
23018
23019
23020
23021
23022
23023
23024
23025
23026
23027
23028
23029
23030
23031
23032
23033
23034
23035
23036
23037
23038
23039
23040
23041
23042
23043
23044
23045
23046
23047
23048
23049
23050
23051
23052
23053
23054
23055
23056
23057
23058
23059
23060
23061
23062
23063
23064
23065
23066
23067
23068
23069
23070
23071
23072
23073
23074
23075
23076
23077
23078
23079
23080
23081
23082
23083
23084
23085
23086
23087
23088
23089
23090
23091
23092
23093
23094
23095
23096
23097
23098
23099
23100
23101
23102
23103
23104
23105
23106
23107
23108
23109
23110
23111
23112
23113
23114
23115
23116
23117
23118
23119
23120
23121
23122
23123
23124
23125
23126
23127
23128
23129
23130
23131
23132
23133
23134
23135
23136
23137
23138
23139
23140
23141
23142
23143
23144
23145
23146
23147
23148
23149
23150
23151
23152
23153
23154
23155
23156
23157
23158
23159
23160
23161
23162
23163
23164
23165
23166
23167
23168
23169
23170
23171
23172
23173
23174
23175
23176
23177
23178
23179
23180
23181
23182
23183
23184
23185
23186
23187
23188
23189
23190
23191
23192
23193
23194
23195
23196
23197
23198
23199
23200
23201
23202
23203
23204
23205
23206
23207
23208
23209
23210
23211
23212
23213
23214
23215
23216
23217
23218
23219
23220
23221
23222
23223
23224
23225
23226
23227
23228
23229
23230
23231
23232
23233
23234
23235
23236
23237
23238
23239
23240
23241
23242
23243
23244
23245
23246
23247
23248
23249
23250
23251
23252
23253
23254
23255
23256
23257
23258
23259
23260
23261
23262
23263
23264
23265
23266
23267
23268
23269
23270
23271
23272
23273
23274
23275
23276
23277
23278
23279
23280
23281
23282
23283
23284
23285
23286
23287
23288
23289
23290
23291
23292
23293
23294
23295
23296
23297
23298
23299
23300
23301
23302
23303
23304
23305
23306
23307
23308
23309
23310
23311
23312
23313
23314
23315
23316
23317
23318
23319
23320
23321
23322
23323
23324
23325
23326
23327
23328
23329
23330
23331
23332
23333
23334
23335
23336
23337
23338
23339
23340
23341
23342
23343
23344
23345
23346
23347
23348
23349
23350
23351
23352
23353
23354
23355
23356
23357
23358
23359
23360
23361
23362
23363
23364
23365
23366
23367
23368
23369
23370
23371
23372
23373
23374
23375
23376
23377
23378
23379
23380
23381
23382
23383
23384
23385
23386
23387
23388
23389
23390
23391
23392
23393
23394
23395
23396
23397
23398
23399
23400
23401
23402
23403
23404
23405
23406
23407
23408
23409
23410
23411
23412
23413
23414
23415
23416
23417
23418
23419
23420
23421
23422
23423
23424
23425
23426
23427
23428
23429
23430
23431
23432
23433
23434
23435
23436
23437
23438
23439
23440
23441
23442
23443
23444
23445
23446
23447
23448
23449
23450
23451
23452
23453
23454
23455
23456
23457
23458
23459
23460
23461
23462
23463
23464
23465
23466
23467
23468
23469
23470
23471
23472
23473
23474
23475
23476
23477
23478
23479
23480
23481
23482
23483
23484
23485
23486
23487
23488
23489
23490
23491
23492
23493
23494
23495
23496
23497
23498
23499
23500
23501
23502
23503
23504
23505
23506
23507
23508
23509
23510
23511
23512
23513
23514
23515
23516
23517
23518
23519
23520
23521
23522
23523
23524
23525
23526
23527
23528
23529
23530
23531
23532
23533
23534
23535
23536
23537
23538
23539
23540
23541
23542
23543
23544
23545
23546
23547
23548
23549
23550
23551
23552
23553
23554
23555
23556
23557
23558
23559
23560
23561
23562
23563
23564
23565
23566
23567
23568
23569
23570
23571
23572
23573
23574
23575
23576
23577
23578
23579
23580
23581
23582
23583
23584
23585
23586
23587
23588
23589
23590
23591
23592
23593
23594
23595
23596
23597
23598
23599
23600
23601
23602
23603
23604
23605
23606
23607
23608
23609
23610
23611
23612
23613
23614
23615
23616
23617
23618
23619
23620
23621
23622
23623
23624
23625
23626
23627
23628
23629
23630
23631
23632
23633
23634
23635
23636
23637
23638
23639
23640
23641
23642
23643
23644
23645
23646
23647
23648
23649
23650
23651
23652
23653
23654
23655
23656
23657
23658
23659
23660
23661
23662
23663
23664
23665
23666
23667
23668
23669
23670
23671
23672
23673
23674
23675
23676
23677
23678
23679
23680
23681
23682
23683
23684
23685
23686
23687
23688
23689
23690
23691
23692
23693
23694
23695
23696
23697
23698
23699
23700
23701
23702
23703
23704
23705
23706
23707
23708
23709
23710
23711
23712
23713
23714
23715
23716
23717
23718
23719
23720
23721
23722
23723
23724
23725
23726
23727
23728
23729
23730
23731
23732
23733
23734
23735
23736
23737
23738
23739
23740
23741
23742
23743
23744
23745
23746
23747
23748
23749
23750
23751
23752
23753
23754
23755
23756
23757
23758
23759
23760
23761
23762
23763
23764
23765
23766
23767
23768
23769
23770
23771
23772
23773
23774
23775
23776
23777
23778
23779
23780
23781
23782
23783
23784
23785
23786
23787
23788
23789
23790
23791
23792
23793
23794
23795
23796
23797
23798
23799
23800
23801
23802
23803
23804
23805
23806
23807
23808
23809
23810
23811
23812
23813
23814
23815
23816
23817
23818
23819
23820
23821
23822
23823
23824
23825
23826
23827
23828
23829
23830
23831
23832
23833
23834
23835
23836
23837
23838
23839
23840
23841
23842
23843
23844
23845
23846
23847
23848
23849
23850
23851
23852
23853
23854
23855
23856
23857
23858
23859
23860
23861
23862
23863
23864
23865
23866
23867
23868
23869
23870
23871
23872
23873
23874
23875
23876
23877
23878
23879
23880
23881
23882
23883
23884
23885
23886
23887
23888
23889
23890
23891
23892
23893
23894
23895
23896
23897
23898
23899
23900
23901
23902
23903
23904
23905
23906
23907
23908
23909
23910
23911
23912
23913
23914
23915
23916
23917
23918
23919
23920
23921
23922
23923
23924
23925
23926
23927
23928
23929
23930
23931
23932
23933
23934
23935
23936
23937
23938
23939
23940
23941
23942
23943
23944
23945
23946
23947
23948
23949
23950
23951
23952
23953
23954
23955
23956
23957
23958
23959
23960
23961
23962
23963
23964
23965
23966
23967
23968
23969
23970
23971
23972
23973
23974
23975
23976
23977
23978
23979
23980
23981
23982
23983
23984
23985
23986
23987
23988
23989
23990
23991
23992
23993
23994
23995
23996
23997
23998
23999
24000
24001
24002
24003
24004
24005
24006
24007
24008
24009
24010
24011
24012
24013
24014
24015
24016
24017
24018
24019
24020
24021
24022
24023
24024
24025
24026
24027
24028
24029
24030
24031
24032
24033
24034
24035
24036
24037
24038
24039
24040
24041
24042
24043
24044
24045
24046
24047
24048
24049
24050
24051
24052
24053
24054
24055
24056
24057
24058
24059
24060
24061
24062
24063
24064
24065
24066
24067
24068
24069
24070
24071
24072
24073
24074
24075
24076
24077
24078
24079
24080
24081
24082
24083
24084
24085
24086
24087
24088
24089
24090
24091
24092
24093
24094
24095
24096
24097
24098
24099
24100
24101
24102
24103
24104
24105
24106
24107
24108
24109
24110
24111
24112
24113
24114
24115
24116
24117
24118
24119
24120
24121
24122
24123
24124
24125
24126
24127
24128
24129
24130
24131
24132
24133
24134
24135
24136
24137
24138
24139
24140
24141
24142
24143
24144
24145
24146
24147
24148
24149
24150
24151
24152
24153
24154
24155
24156
24157
24158
24159
24160
24161
24162
24163
24164
24165
24166
24167
24168
24169
24170
24171
24172
24173
24174
24175
24176
24177
24178
24179
24180
24181
24182
24183
24184
24185
24186
24187
24188
24189
24190
24191
24192
24193
24194
24195
24196
24197
24198
24199
24200
24201
24202
24203
24204
24205
24206
24207
24208
24209
24210
24211
24212
24213
24214
24215
24216
24217
24218
24219
24220
24221
24222
24223
24224
24225
24226
24227
24228
24229
24230
24231
24232
24233
24234
24235
24236
24237
24238
24239
24240
24241
24242
24243
24244
24245
24246
24247
24248
24249
24250
24251
24252
24253
24254
24255
24256
24257
24258
24259
24260
24261
24262
24263
24264
24265
24266
24267
24268
24269
24270
24271
24272
24273
24274
24275
24276
24277
24278
24279
24280
24281
24282
24283
24284
24285
24286
24287
24288
24289
24290
24291
24292
24293
24294
24295
24296
24297
24298
24299
24300
24301
24302
24303
24304
24305
24306
24307
24308
24309
24310
24311
24312
24313
24314
24315
24316
24317
24318
24319
24320
24321
24322
24323
24324
24325
24326
24327
24328
24329
24330
24331
24332
24333
24334
24335
24336
24337
24338
24339
24340
24341
24342
24343
24344
24345
24346
24347
24348
24349
24350
24351
24352
24353
24354
24355
24356
24357
24358
24359
24360
24361
24362
24363
24364
24365
24366
24367
24368
24369
24370
24371
24372
24373
24374
24375
24376
24377
24378
24379
24380
24381
24382
24383
24384
24385
24386
24387
24388
24389
24390
24391
24392
24393
24394
24395
24396
24397
24398
24399
24400
24401
24402
24403
24404
24405
24406
24407
24408
24409
24410
24411
24412
24413
24414
24415
24416
24417
24418
24419
24420
24421
24422
24423
24424
24425
24426
24427
24428
24429
24430
24431
24432
24433
24434
24435
24436
24437
24438
24439
24440
24441
24442
24443
24444
24445
24446
24447
24448
24449
24450
24451
24452
24453
24454
24455
24456
24457
24458
24459
24460
24461
24462
24463
24464
24465
24466
24467
24468
24469
24470
24471
24472
24473
24474
24475
24476
24477
24478
24479
24480
24481
24482
24483
24484
24485
24486
24487
24488
24489
24490
24491
24492
24493
24494
24495
24496
24497
24498
24499
24500
24501
24502
24503
24504
24505
24506
24507
24508
24509
24510
24511
24512
24513
24514
24515
24516
24517
24518
24519
24520
24521
24522
24523
24524
24525
24526
24527
24528
24529
24530
24531
24532
24533
24534
24535
24536
24537
24538
24539
24540
24541
24542
24543
24544
24545
24546
24547
24548
24549
24550
24551
24552
24553
24554
24555
24556
24557
24558
24559
24560
24561
24562
24563
24564
24565
24566
24567
24568
24569
24570
24571
24572
24573
24574
24575
24576
24577
24578
24579
24580
24581
24582
24583
24584
24585
24586
24587
24588
24589
24590
24591
24592
24593
24594
24595
24596
24597
24598
24599
24600
24601
24602
24603
24604
24605
24606
24607
24608
24609
24610
24611
24612
24613
24614
24615
24616
24617
24618
24619
24620
24621
24622
24623
24624
24625
24626
24627
24628
24629
24630
24631
24632
24633
24634
24635
24636
24637
24638
24639
24640
24641
24642
24643
24644
24645
24646
24647
24648
24649
24650
24651
24652
24653
24654
24655
24656
24657
24658
24659
24660
24661
24662
24663
24664
24665
24666
24667
24668
24669
24670
24671
24672
24673
24674
24675
24676
24677
24678
24679
24680
24681
24682
24683
24684
24685
24686
24687
24688
24689
24690
24691
24692
24693
24694
24695
24696
24697
24698
24699
24700
24701
24702
24703
24704
24705
24706
24707
24708
24709
24710
24711
24712
24713
24714
24715
24716
24717
24718
24719
24720
24721
24722
24723
24724
24725
24726
24727
24728
24729
24730
24731
24732
24733
24734
24735
24736
24737
24738
24739
24740
24741
24742
24743
24744
24745
24746
24747
24748
24749
24750
24751
24752
24753
24754
24755
24756
24757
24758
24759
24760
24761
24762
24763
24764
24765
24766
24767
24768
24769
24770
24771
24772
24773
24774
24775
24776
24777
24778
24779
24780
24781
24782
24783
24784
24785
24786
24787
24788
24789
24790
24791
24792
24793
24794
24795
24796
24797
24798
24799
24800
24801
24802
24803
24804
24805
24806
24807
24808
24809
24810
24811
24812
24813
24814
24815
24816
24817
24818
24819
24820
24821
24822
24823
24824
24825
24826
24827
24828
24829
24830
24831
24832
24833
24834
24835
24836
24837
24838
24839
24840
24841
24842
24843
24844
24845
24846
24847
24848
24849
24850
24851
24852
24853
24854
24855
24856
24857
24858
24859
24860
24861
24862
24863
24864
24865
24866
24867
24868
24869
24870
24871
24872
24873
24874
24875
24876
24877
24878
24879
24880
24881
24882
24883
24884
24885
24886
24887
24888
24889
24890
24891
24892
24893
24894
24895
24896
24897
24898
24899
24900
24901
24902
24903
24904
24905
24906
24907
24908
24909
24910
24911
24912
24913
24914
24915
24916
24917
24918
24919
24920
24921
24922
24923
24924
24925
24926
24927
24928
24929
24930
24931
24932
24933
24934
24935
24936
24937
24938
24939
24940
24941
24942
24943
24944
24945
24946
24947
24948
24949
24950
24951
24952
24953
24954
24955
24956
24957
24958
24959
24960
24961
24962
24963
24964
24965
24966
24967
24968
24969
24970
24971
24972
24973
24974
24975
24976
24977
24978
24979
24980
24981
24982
24983
24984
24985
24986
24987
24988
24989
24990
24991
24992
24993
24994
24995
24996
24997
24998
24999
25000
25001
25002
25003
25004
25005
25006
25007
25008
25009
25010
25011
25012
25013
25014
25015
25016
25017
25018
25019
25020
25021
25022
25023
25024
25025
25026
25027
25028
25029
25030
25031
25032
25033
25034
25035
25036
25037
25038
25039
25040
25041
25042
25043
25044
25045
25046
25047
25048
25049
25050
25051
25052
25053
25054
25055
25056
25057
25058
25059
25060
25061
25062
25063
25064
25065
25066
25067
25068
25069
25070
25071
25072
25073
25074
25075
25076
25077
25078
25079
25080
25081
25082
25083
25084
25085
25086
25087
25088
25089
25090
25091
25092
25093
25094
25095
25096
25097
25098
25099
25100
25101
25102
25103
25104
25105
25106
25107
25108
25109
25110
25111
25112
25113
25114
25115
25116
25117
25118
25119
25120
25121
25122
25123
25124
25125
25126
25127
25128
25129
25130
25131
25132
25133
25134
25135
25136
25137
25138
25139
25140
25141
25142
25143
25144
25145
25146
25147
25148
25149
25150
25151
25152
25153
25154
25155
25156
25157
25158
25159
25160
25161
25162
25163
25164
25165
25166
25167
25168
25169
25170
25171
25172
25173
25174
25175
25176
25177
25178
25179
25180
25181
25182
25183
25184
25185
25186
25187
25188
25189
25190
25191
25192
25193
25194
25195
25196
25197
25198
25199
25200
25201
25202
25203
25204
25205
25206
25207
25208
25209
25210
25211
25212
25213
25214
25215
25216
25217
25218
25219
25220
25221
25222
25223
25224
25225
25226
25227
25228
25229
25230
25231
25232
25233
25234
25235
25236
25237
25238
25239
25240
25241
25242
25243
25244
25245
25246
25247
25248
25249
25250
25251
25252
25253
25254
25255
25256
25257
25258
25259
25260
25261
25262
25263
25264
25265
25266
25267
25268
25269
25270
25271
25272
25273
25274
25275
25276
25277
25278
25279
25280
25281
25282
25283
25284
25285
25286
25287
25288
25289
25290
25291
25292
25293
25294
25295
25296
25297
25298
25299
25300
25301
25302
25303
25304
25305
25306
25307
25308
25309
25310
25311
25312
25313
25314
25315
25316
25317
25318
25319
25320
25321
25322
25323
25324
25325
25326
25327
25328
25329
25330
25331
25332
25333
25334
25335
25336
25337
25338
25339
25340
25341
25342
25343
25344
25345
25346
25347
25348
25349
25350
25351
25352
25353
25354
25355
25356
25357
25358
25359
25360
25361
25362
25363
25364
25365
25366
25367
25368
25369
25370
25371
25372
25373
25374
25375
25376
25377
25378
25379
25380
25381
25382
25383
25384
25385
25386
25387
25388
25389
25390
25391
25392
25393
25394
25395
25396
25397
25398
25399
25400
25401
25402
25403
25404
25405
25406
25407
25408
25409
25410
25411
25412
25413
25414
25415
25416
25417
25418
25419
25420
25421
25422
25423
25424
25425
25426
25427
25428
25429
25430
25431
25432
25433
25434
25435
25436
25437
25438
25439
25440
25441
25442
25443
25444
25445
25446
25447
25448
25449
25450
25451
25452
25453
25454
25455
25456
25457
25458
25459
25460
25461
25462
25463
25464
25465
25466
25467
25468
25469
25470
25471
25472
25473
25474
25475
25476
25477
25478
25479
25480
25481
25482
25483
25484
25485
25486
25487
25488
25489
25490
25491
25492
25493
25494
25495
25496
25497
25498
25499
25500
25501
25502
25503
25504
25505
25506
25507
25508
25509
25510
25511
25512
25513
25514
25515
25516
25517
25518
25519
25520
25521
25522
25523
25524
25525
25526
25527
25528
25529
25530
25531
25532
25533
25534
25535
25536
25537
25538
25539
25540
25541
25542
25543
25544
25545
25546
25547
25548
25549
25550
25551
25552
25553
25554
25555
25556
25557
25558
25559
25560
25561
25562
25563
25564
25565
25566
25567
25568
25569
25570
25571
25572
25573
25574
25575
25576
25577
25578
25579
25580
25581
25582
25583
25584
25585
25586
25587
25588
25589
25590
25591
25592
25593
25594
25595
25596
25597
25598
25599
25600
25601
25602
25603
25604
25605
25606
25607
25608
25609
25610
25611
25612
25613
25614
25615
25616
25617
25618
25619
25620
25621
25622
25623
25624
25625
25626
25627
25628
25629
25630
25631
25632
25633
25634
25635
25636
25637
25638
25639
25640
25641
25642
25643
25644
25645
25646
25647
25648
25649
25650
25651
25652
25653
25654
25655
25656
25657
25658
25659
25660
25661
25662
25663
25664
25665
25666
25667
25668
25669
25670
25671
25672
25673
25674
25675
25676
25677
25678
25679
25680
25681
25682
25683
25684
25685
25686
25687
25688
25689
25690
25691
25692
25693
25694
25695
25696
25697
25698
25699
25700
25701
25702
25703
25704
25705
25706
25707
25708
25709
25710
25711
25712
25713
25714
25715
25716
25717
25718
25719
25720
25721
25722
25723
25724
25725
25726
25727
25728
25729
25730
25731
25732
25733
25734
25735
25736
25737
25738
25739
25740
25741
25742
25743
25744
25745
25746
25747
25748
25749
25750
25751
25752
25753
25754
25755
25756
25757
25758
25759
25760
25761
25762
25763
25764
25765
25766
25767
25768
25769
25770
25771
25772
25773
25774
25775
25776
25777
25778
25779
25780
25781
25782
25783
25784
25785
25786
25787
25788
25789
25790
25791
25792
25793
25794
25795
25796
25797
25798
25799
25800
25801
25802
25803
25804
25805
25806
25807
25808
25809
25810
25811
25812
25813
25814
25815
25816
25817
25818
25819
25820
25821
25822
25823
25824
25825
25826
25827
25828
25829
25830
25831
25832
25833
25834
25835
25836
25837
25838
25839
25840
25841
25842
25843
25844
25845
25846
25847
25848
25849
25850
25851
25852
25853
25854
25855
25856
25857
25858
25859
25860
25861
25862
25863
25864
25865
25866
25867
25868
25869
25870
25871
25872
25873
25874
25875
25876
25877
25878
25879
25880
25881
25882
25883
25884
25885
25886
25887
25888
25889
25890
25891
25892
25893
25894
25895
25896
25897
25898
25899
25900
25901
25902
25903
25904
25905
25906
25907
25908
25909
25910
25911
25912
25913
25914
25915
25916
25917
25918
25919
25920
25921
25922
25923
25924
25925
25926
25927
25928
25929
25930
25931
25932
25933
25934
25935
25936
25937
25938
25939
25940
25941
25942
25943
25944
25945
25946
25947
25948
25949
25950
25951
25952
25953
25954
25955
25956
25957
25958
25959
25960
25961
25962
25963
25964
25965
25966
25967
25968
25969
25970
25971
25972
25973
25974
25975
25976
25977
25978
25979
25980
25981
25982
25983
25984
25985
25986
25987
25988
25989
25990
25991
25992
25993
25994
25995
25996
25997
25998
25999
26000
26001
26002
26003
26004
26005
26006
26007
26008
26009
26010
26011
26012
26013
26014
26015
26016
26017
26018
26019
26020
26021
26022
26023
26024
26025
26026
26027
26028
26029
26030
26031
26032
26033
26034
26035
26036
26037
26038
26039
26040
26041
26042
26043
26044
26045
26046
26047
26048
26049
26050
26051
26052
26053
26054
26055
26056
26057
26058
26059
26060
26061
26062
26063
26064
26065
26066
26067
26068
26069
26070
26071
26072
26073
26074
26075
26076
26077
26078
26079
26080
26081
26082
26083
26084
26085
26086
26087
26088
26089
26090
26091
26092
26093
26094
26095
26096
26097
26098
26099
26100
26101
26102
26103
26104
26105
26106
26107
26108
26109
26110
26111
26112
26113
26114
26115
26116
26117
26118
26119
26120
26121
26122
26123
26124
26125
26126
26127
26128
26129
26130
26131
26132
26133
26134
26135
26136
26137
26138
26139
26140
26141
26142
26143
26144
26145
26146
26147
26148
26149
26150
26151
26152
26153
26154
26155
26156
26157
26158
26159
26160
26161
26162
26163
26164
26165
26166
26167
26168
26169
26170
26171
26172
26173
26174
26175
26176
26177
26178
26179
26180
26181
26182
26183
26184
26185
26186
26187
26188
26189
26190
26191
26192
26193
26194
26195
26196
26197
26198
26199
26200
26201
26202
26203
26204
26205
26206
26207
26208
26209
26210
26211
26212
26213
26214
26215
26216
26217
26218
26219
26220
26221
26222
26223
26224
26225
26226
26227
26228
26229
26230
26231
26232
26233
26234
26235
26236
26237
26238
26239
26240
26241
26242
26243
26244
26245
26246
26247
26248
26249
26250
26251
26252
26253
26254
26255
26256
26257
26258
26259
26260
26261
26262
26263
26264
26265
26266
26267
26268
26269
26270
26271
26272
26273
26274
26275
26276
26277
26278
26279
26280
26281
26282
26283
26284
26285
26286
26287
26288
26289
26290
26291
26292
26293
26294
26295
26296
26297
26298
26299
26300
26301
26302
26303
26304
26305
26306
26307
26308
26309
26310
26311
26312
26313
26314
26315
26316
26317
26318
26319
26320
26321
26322
26323
26324
26325
26326
26327
26328
26329
26330
26331
26332
26333
26334
26335
26336
26337
26338
26339
26340
26341
26342
26343
26344
26345
26346
26347
26348
26349
26350
26351
26352
26353
26354
26355
26356
26357
26358
26359
26360
26361
26362
26363
26364
26365
26366
26367
26368
26369
26370
26371
26372
26373
26374
26375
26376
26377
26378
26379
26380
26381
26382
26383
26384
26385
26386
26387
26388
26389
26390
26391
26392
26393
26394
26395
26396
26397
26398
26399
26400
26401
26402
26403
26404
26405
26406
26407
26408
26409
26410
26411
26412
26413
26414
26415
26416
26417
26418
26419
26420
26421
26422
26423
26424
26425
26426
26427
26428
26429
26430
26431
26432
26433
26434
26435
26436
26437
26438
26439
26440
26441
26442
26443
26444
26445
26446
26447
26448
26449
26450
26451
26452
26453
26454
26455
26456
26457
26458
26459
26460
26461
26462
26463
26464
26465
26466
26467
26468
26469
26470
26471
26472
26473
26474
26475
26476
26477
26478
26479
26480
26481
26482
26483
26484
26485
26486
26487
26488
26489
26490
26491
26492
26493
26494
26495
26496
26497
26498
26499
26500
26501
26502
26503
26504
26505
26506
26507
26508
26509
26510
26511
26512
26513
26514
26515
26516
26517
26518
26519
26520
26521
26522
26523
26524
26525
26526
26527
26528
26529
26530
26531
26532
26533
26534
26535
26536
26537
26538
26539
26540
26541
26542
26543
26544
26545
26546
26547
26548
26549
26550
26551
26552
26553
26554
26555
26556
26557
26558
26559
26560
26561
26562
26563
26564
26565
26566
26567
26568
26569
26570
26571
26572
26573
26574
26575
26576
26577
26578
26579
26580
26581
26582
26583
26584
26585
26586
26587
26588
26589
26590
26591
26592
26593
26594
26595
26596
26597
26598
26599
26600
26601
26602
26603
26604
26605
26606
26607
26608
26609
26610
26611
26612
26613
26614
26615
26616
26617
26618
26619
26620
26621
26622
26623
26624
26625
26626
26627
26628
26629
26630
26631
26632
26633
26634
26635
26636
26637
26638
26639
26640
26641
26642
26643
26644
26645
26646
26647
26648
26649
26650
26651
26652
26653
26654
26655
26656
26657
26658
26659
26660
26661
26662
26663
26664
26665
26666
26667
26668
26669
26670
26671
26672
26673
26674
26675
26676
26677
26678
26679
26680
26681
26682
26683
26684
26685
26686
26687
26688
26689
26690
26691
26692
26693
26694
26695
26696
26697
26698
26699
26700
26701
26702
26703
26704
26705
26706
26707
26708
26709
26710
26711
26712
26713
26714
26715
26716
26717
26718
26719
26720
26721
26722
26723
26724
26725
26726
26727
26728
26729
26730
26731
26732
26733
26734
26735
26736
26737
26738
26739
26740
26741
26742
26743
26744
26745
26746
26747
26748
26749
26750
26751
26752
26753
26754
26755
26756
26757
26758
26759
26760
26761
26762
26763
26764
26765
26766
26767
26768
26769
26770
26771
26772
26773
26774
26775
26776
26777
26778
26779
26780
26781
26782
26783
26784
26785
26786
26787
26788
26789
26790
26791
26792
26793
26794
26795
26796
26797
26798
26799
26800
26801
26802
26803
26804
26805
26806
26807
26808
26809
26810
26811
26812
26813
26814
26815
26816
26817
26818
26819
26820
26821
26822
26823
26824
26825
26826
26827
26828
26829
26830
26831
26832
26833
26834
26835
26836
26837
26838
26839
26840
26841
26842
26843
26844
26845
26846
26847
26848
26849
26850
26851
26852
26853
26854
26855
26856
26857
26858
26859
26860
26861
26862
26863
26864
26865
26866
26867
26868
26869
26870
26871
26872
26873
26874
26875
26876
26877
26878
26879
26880
26881
26882
26883
26884
26885
26886
26887
26888
26889
26890
26891
26892
26893
26894
26895
26896
26897
26898
26899
26900
26901
26902
26903
26904
26905
26906
26907
26908
26909
26910
26911
26912
26913
26914
26915
26916
26917
26918
26919
26920
26921
26922
26923
26924
26925
26926
26927
26928
26929
26930
26931
26932
26933
26934
26935
26936
26937
26938
26939
26940
26941
26942
26943
26944
26945
26946
26947
26948
26949
26950
26951
26952
26953
26954
26955
26956
26957
26958
26959
26960
26961
26962
26963
26964
26965
26966
26967
26968
26969
26970
26971
26972
26973
26974
26975
26976
26977
26978
26979
26980
26981
26982
26983
26984
26985
26986
26987
26988
26989
26990
26991
26992
26993
26994
26995
26996
26997
26998
26999
27000
27001
27002
27003
27004
27005
27006
27007
27008
27009
27010
27011
27012
27013
27014
27015
27016
27017
27018
27019
27020
27021
27022
27023
27024
27025
27026
27027
27028
27029
27030
27031
27032
27033
27034
27035
27036
27037
27038
27039
27040
27041
27042
27043
27044
27045
27046
27047
27048
27049
27050
27051
27052
27053
27054
27055
27056
27057
27058
27059
27060
27061
27062
27063
27064
27065
27066
27067
27068
27069
27070
27071
27072
27073
27074
27075
27076
27077
27078
27079
27080
27081
27082
27083
27084
27085
27086
27087
27088
27089
27090
27091
27092
27093
27094
27095
27096
27097
27098
27099
27100
27101
27102
27103
27104
27105
27106
27107
27108
27109
27110
27111
27112
27113
27114
27115
27116
27117
27118
27119
27120
27121
27122
27123
27124
27125
27126
27127
27128
27129
27130
27131
27132
27133
27134
27135
27136
27137
27138
27139
27140
27141
27142
27143
27144
27145
27146
27147
27148
27149
27150
27151
27152
27153
27154
27155
27156
27157
27158
27159
27160
27161
27162
27163
27164
27165
27166
27167
27168
27169
27170
27171
27172
27173
27174
27175
27176
27177
27178
27179
27180
27181
27182
27183
27184
27185
27186
27187
27188
27189
27190
27191
27192
27193
27194
27195
27196
27197
27198
27199
27200
27201
27202
27203
27204
27205
27206
27207
27208
27209
27210
27211
27212
27213
27214
27215
27216
27217
27218
27219
27220
27221
27222
27223
27224
27225
27226
27227
27228
27229
27230
27231
27232
27233
27234
27235
27236
27237
27238
27239
27240
27241
27242
27243
27244
27245
27246
27247
27248
27249
27250
27251
27252
27253
27254
27255
27256
27257
27258
27259
27260
27261
27262
27263
27264
27265
27266
27267
27268
27269
27270
27271
27272
27273
27274
27275
27276
27277
27278
27279
27280
27281
27282
27283
27284
27285
27286
27287
27288
27289
27290
27291
27292
27293
27294
27295
27296
27297
27298
27299
27300
27301
27302
27303
27304
27305
27306
27307
27308
27309
27310
27311
27312
27313
27314
27315
27316
27317
27318
27319
27320
27321
27322
27323
27324
27325
27326
27327
27328
27329
27330
27331
27332
27333
27334
27335
27336
27337
27338
27339
27340
27341
27342
27343
27344
27345
27346
27347
27348
27349
27350
27351
27352
27353
27354
27355
27356
27357
27358
27359
27360
27361
27362
27363
27364
27365
27366
27367
27368
27369
27370
27371
27372
27373
27374
27375
27376
27377
27378
27379
27380
27381
27382
27383
27384
27385
27386
27387
27388
27389
27390
27391
27392
27393
27394
27395
27396
27397
27398
27399
27400
27401
27402
27403
27404
27405
27406
27407
27408
27409
27410
27411
27412
27413
27414
27415
27416
27417
27418
27419
27420
27421
27422
27423
27424
27425
27426
27427
27428
27429
27430
27431
27432
27433
27434
27435
27436
27437
27438
27439
27440
27441
27442
27443
27444
27445
27446
27447
27448
27449
27450
27451
27452
27453
27454
27455
27456
27457
27458
27459
27460
27461
27462
27463
27464
27465
27466
27467
27468
27469
27470
27471
27472
27473
27474
27475
27476
27477
27478
27479
27480
27481
27482
27483
27484
27485
27486
27487
27488
27489
27490
27491
27492
27493
27494
27495
27496
27497
27498
27499
27500
27501
27502
27503
27504
27505
27506
27507
27508
27509
27510
27511
27512
27513
27514
27515
27516
27517
27518
27519
27520
27521
27522
27523
27524
27525
27526
27527
27528
27529
27530
27531
27532
27533
27534
27535
27536
27537
27538
27539
27540
27541
27542
27543
27544
27545
27546
27547
27548
27549
27550
27551
27552
27553
27554
27555
27556
27557
27558
27559
27560
27561
27562
27563
27564
27565
27566
27567
27568
27569
27570
27571
27572
27573
27574
27575
27576
27577
27578
27579
27580
27581
27582
27583
27584
27585
27586
27587
27588
27589
27590
27591
27592
27593
27594
27595
27596
27597
27598
27599
27600
27601
27602
27603
27604
27605
27606
27607
27608
27609
27610
27611
27612
27613
27614
27615
27616
27617
27618
27619
27620
27621
27622
27623
27624
27625
27626
27627
27628
27629
27630
27631
27632
27633
27634
27635
27636
27637
27638
27639
27640
27641
27642
27643
27644
27645
27646
27647
27648
27649
27650
27651
27652
27653
27654
27655
27656
27657
27658
27659
27660
27661
27662
27663
27664
27665
27666
27667
27668
27669
27670
27671
27672
27673
27674
27675
27676
27677
27678
27679
27680
27681
27682
27683
27684
27685
27686
27687
27688
27689
27690
27691
27692
27693
27694
27695
27696
27697
27698
27699
27700
27701
27702
27703
27704
27705
27706
27707
27708
27709
27710
27711
27712
27713
27714
27715
27716
27717
27718
27719
27720
27721
27722
27723
27724
27725
27726
27727
27728
27729
27730
27731
27732
27733
27734
27735
27736
27737
27738
27739
27740
27741
27742
27743
27744
27745
27746
27747
27748
27749
27750
27751
27752
27753
27754
27755
27756
27757
27758
27759
27760
27761
27762
27763
27764
27765
27766
27767
27768
27769
27770
27771
27772
27773
27774
27775
27776
27777
27778
27779
27780
27781
27782
27783
27784
27785
27786
27787
27788
27789
27790
27791
27792
27793
27794
27795
27796
27797
27798
27799
27800
27801
27802
27803
27804
27805
27806
27807
27808
27809
27810
27811
27812
27813
27814
27815
27816
27817
27818
27819
27820
27821
27822
27823
27824
27825
27826
27827
27828
27829
27830
27831
27832
27833
27834
27835
27836
27837
27838
27839
27840
27841
27842
27843
27844
27845
27846
27847
27848
27849
27850
27851
27852
27853
27854
27855
27856
27857
27858
27859
27860
27861
27862
27863
27864
27865
27866
27867
27868
27869
27870
27871
27872
27873
27874
27875
27876
27877
27878
27879
27880
27881
27882
27883
27884
27885
27886
27887
27888
27889
27890
27891
27892
27893
27894
27895
27896
27897
27898
27899
27900
27901
27902
27903
27904
27905
27906
27907
27908
27909
27910
27911
27912
27913
27914
27915
27916
27917
27918
27919
27920
27921
27922
27923
27924
27925
27926
27927
27928
27929
27930
27931
27932
27933
27934
27935
27936
27937
27938
27939
27940
27941
27942
27943
27944
27945
27946
27947
27948
27949
27950
27951
27952
27953
27954
27955
27956
27957
27958
27959
27960
27961
27962
27963
27964
27965
27966
27967
27968
27969
27970
27971
27972
27973
27974
27975
27976
27977
27978
27979
27980
27981
27982
27983
27984
27985
27986
27987
27988
27989
27990
27991
27992
27993
27994
27995
27996
27997
27998
27999
28000
28001
28002
28003
28004
28005
28006
28007
28008
28009
28010
28011
28012
28013
28014
28015
28016
28017
28018
28019
28020
28021
28022
28023
28024
28025
28026
28027
28028
28029
28030
28031
28032
28033
28034
28035
28036
28037
28038
28039
28040
28041
28042
28043
28044
28045
28046
28047
28048
28049
28050
28051
28052
28053
28054
28055
28056
28057
28058
28059
28060
28061
28062
28063
28064
28065
28066
28067
28068
28069
28070
28071
28072
28073
28074
28075
28076
28077
28078
28079
28080
28081
28082
28083
28084
28085
28086
28087
28088
28089
28090
28091
28092
28093
28094
28095
28096
28097
28098
28099
28100
28101
28102
28103
28104
28105
28106
28107
28108
28109
28110
28111
28112
28113
28114
28115
28116
28117
28118
28119
28120
28121
28122
28123
28124
28125
28126
28127
28128
28129
28130
28131
28132
28133
28134
28135
28136
28137
28138
28139
28140
28141
28142
28143
28144
28145
28146
28147
28148
28149
28150
28151
28152
28153
28154
28155
28156
28157
28158
28159
28160
28161
28162
28163
28164
28165
28166
28167
28168
28169
28170
28171
28172
28173
28174
28175
28176
28177
28178
28179
28180
28181
28182
28183
28184
28185
28186
28187
28188
28189
28190
28191
28192
28193
28194
28195
28196
28197
28198
28199
28200
28201
28202
28203
28204
28205
28206
28207
28208
28209
28210
28211
28212
28213
28214
28215
28216
28217
28218
28219
28220
28221
28222
28223
28224
28225
28226
28227
28228
28229
28230
28231
28232
28233
28234
28235
28236
28237
28238
28239
28240
28241
28242
28243
28244
28245
28246
28247
28248
28249
28250
28251
28252
28253
28254
28255
28256
28257
28258
28259
28260
28261
28262
28263
28264
28265
28266
28267
28268
28269
28270
28271
28272
28273
28274
28275
28276
28277
28278
28279
28280
28281
28282
28283
28284
28285
28286
28287
28288
28289
28290
28291
28292
28293
28294
28295
28296
28297
28298
28299
28300
28301
28302
28303
28304
28305
28306
28307
28308
28309
28310
28311
28312
28313
28314
28315
28316
28317
28318
28319
28320
28321
28322
28323
28324
28325
28326
28327
28328
28329
28330
28331
28332
28333
28334
28335
28336
28337
28338
28339
28340
28341
28342
28343
28344
28345
28346
28347
28348
28349
28350
28351
28352
28353
28354
28355
28356
28357
28358
28359
28360
28361
28362
28363
28364
28365
28366
28367
28368
28369
28370
28371
28372
28373
28374
28375
28376
28377
28378
28379
28380
28381
28382
28383
28384
28385
28386
28387
28388
28389
28390
28391
28392
28393
28394
28395
28396
28397
28398
28399
28400
28401
28402
28403
28404
28405
28406
28407
28408
28409
28410
28411
28412
28413
28414
28415
28416
28417
28418
28419
28420
28421
28422
28423
28424
28425
28426
28427
28428
28429
28430
28431
28432
28433
28434
28435
28436
28437
28438
28439
28440
28441
28442
28443
28444
28445
28446
28447
28448
28449
28450
28451
28452
28453
28454
28455
28456
28457
28458
28459
28460
28461
28462
28463
28464
28465
28466
28467
28468
28469
28470
28471
28472
28473
28474
28475
28476
28477
28478
28479
28480
28481
28482
28483
28484
28485
28486
28487
28488
28489
28490
28491
28492
28493
28494
28495
28496
28497
28498
28499
28500
28501
28502
28503
28504
28505
28506
28507
28508
28509
28510
28511
28512
28513
28514
28515
28516
28517
28518
28519
28520
28521
28522
28523
28524
28525
28526
28527
28528
28529
28530
28531
28532
28533
28534
28535
28536
28537
28538
28539
28540
28541
28542
28543
28544
28545
28546
28547
28548
28549
28550
28551
28552
28553
28554
28555
28556
28557
28558
28559
28560
28561
28562
28563
28564
28565
28566
28567
28568
28569
28570
28571
28572
28573
28574
28575
28576
28577
28578
28579
28580
28581
28582
28583
28584
28585
28586
28587
28588
28589
28590
28591
28592
28593
28594
28595
28596
28597
28598
28599
28600
28601
28602
28603
28604
28605
28606
28607
28608
28609
28610
28611
28612
28613
28614
28615
28616
28617
28618
28619
28620
28621
28622
28623
28624
28625
28626
28627
28628
28629
28630
28631
28632
28633
28634
28635
28636
28637
28638
28639
28640
28641
28642
28643
28644
28645
28646
28647
28648
28649
28650
28651
28652
28653
28654
28655
28656
28657
28658
28659
28660
28661
28662
28663
28664
28665
28666
28667
28668
28669
28670
28671
28672
28673
28674
28675
28676
28677
28678
28679
28680
28681
28682
28683
28684
28685
28686
28687
28688
28689
28690
28691
28692
28693
28694
28695
28696
28697
28698
28699
28700
28701
28702
28703
28704
28705
28706
28707
28708
28709
28710
28711
28712
28713
28714
28715
28716
28717
28718
28719
28720
28721
28722
28723
28724
28725
28726
28727
28728
28729
28730
28731
28732
28733
28734
28735
28736
28737
28738
28739
28740
28741
28742
28743
28744
28745
28746
28747
28748
28749
28750
28751
28752
28753
28754
28755
28756
28757
28758
28759
28760
28761
28762
28763
28764
28765
28766
28767
28768
28769
28770
28771
28772
28773
28774
28775
28776
28777
28778
28779
28780
28781
28782
28783
28784
28785
28786
28787
28788
28789
28790
28791
28792
28793
28794
28795
28796
28797
28798
28799
28800
28801
28802
28803
28804
28805
28806
28807
28808
28809
28810
28811
28812
28813
28814
28815
28816
28817
28818
28819
28820
28821
28822
28823
28824
28825
28826
28827
28828
28829
28830
28831
28832
28833
28834
28835
28836
28837
28838
28839
28840
28841
28842
28843
28844
28845
28846
28847
28848
28849
28850
28851
28852
28853
28854
28855
28856
28857
28858
28859
28860
28861
28862
28863
28864
28865
28866
28867
28868
28869
28870
28871
28872
28873
28874
28875
28876
28877
28878
28879
28880
28881
28882
28883
28884
28885
28886
28887
28888
28889
28890
28891
28892
28893
28894
28895
28896
28897
28898
28899
28900
28901
28902
28903
28904
28905
28906
28907
28908
28909
28910
28911
28912
28913
28914
28915
28916
28917
28918
28919
28920
28921
28922
28923
28924
28925
28926
28927
28928
28929
28930
28931
28932
28933
28934
28935
28936
28937
28938
28939
28940
28941
28942
28943
28944
28945
28946
28947
28948
28949
28950
28951
28952
28953
28954
28955
28956
28957
28958
28959
28960
28961
28962
28963
28964
28965
28966
28967
28968
28969
28970
28971
28972
28973
28974
28975
28976
28977
28978
28979
28980
28981
28982
28983
28984
28985
28986
28987
28988
28989
28990
28991
28992
28993
28994
28995
28996
28997
28998
28999
29000
29001
29002
29003
29004
29005
29006
29007
29008
29009
29010
29011
29012
29013
29014
29015
29016
29017
29018
29019
29020
29021
29022
29023
29024
29025
29026
29027
29028
29029
29030
29031
29032
29033
29034
29035
29036
29037
29038
29039
29040
29041
29042
29043
29044
29045
29046
29047
29048
29049
29050
29051
29052
29053
29054
29055
29056
29057
29058
29059
29060
29061
29062
29063
29064
29065
29066
29067
29068
29069
29070
29071
29072
29073
29074
29075
29076
29077
29078
29079
29080
29081
29082
29083
29084
29085
29086
29087
29088
29089
29090
29091
29092
29093
29094
29095
29096
29097
29098
29099
29100
29101
29102
29103
29104
29105
29106
29107
29108
29109
29110
29111
29112
29113
29114
29115
29116
29117
29118
29119
29120
29121
29122
29123
29124
29125
29126
29127
29128
29129
29130
29131
29132
29133
29134
29135
29136
29137
29138
29139
29140
29141
29142
29143
29144
29145
29146
29147
29148
29149
29150
29151
29152
29153
29154
29155
29156
29157
29158
29159
29160
29161
29162
29163
29164
29165
29166
29167
29168
29169
29170
29171
29172
29173
29174
29175
29176
29177
29178
29179
29180
29181
29182
29183
29184
29185
29186
29187
29188
29189
29190
29191
29192
29193
29194
29195
29196
29197
29198
29199
29200
29201
29202
29203
29204
29205
29206
29207
29208
29209
29210
29211
29212
29213
29214
29215
29216
29217
29218
29219
29220
29221
29222
29223
29224
29225
29226
29227
29228
29229
29230
29231
29232
29233
29234
29235
29236
29237
29238
29239
29240
29241
29242
29243
29244
29245
29246
29247
29248
29249
29250
29251
29252
29253
29254
29255
29256
29257
29258
29259
29260
29261
29262
29263
29264
29265
29266
29267
29268
29269
29270
29271
29272
29273
29274
29275
29276
29277
29278
29279
29280
29281
29282
29283
29284
29285
29286
29287
29288
29289
29290
29291
29292
29293
29294
29295
29296
29297
29298
29299
29300
29301
29302
29303
29304
29305
29306
29307
29308
29309
29310
29311
29312
29313
29314
29315
29316
29317
29318
29319
29320
29321
29322
29323
29324
29325
29326
29327
29328
29329
29330
29331
29332
29333
29334
29335
29336
29337
29338
29339
29340
29341
29342
29343
29344
29345
29346
29347
29348
29349
29350
29351
29352
29353
29354
29355
29356
29357
29358
29359
29360
29361
29362
29363
29364
29365
29366
29367
29368
29369
29370
29371
29372
29373
29374
29375
29376
29377
29378
29379
29380
29381
29382
29383
29384
29385
29386
29387
29388
29389
29390
29391
29392
29393
29394
29395
29396
29397
29398
29399
29400
29401
29402
29403
29404
29405
29406
29407
29408
29409
29410
29411
29412
29413
29414
29415
29416
29417
29418
29419
29420
29421
29422
29423
29424
29425
29426
29427
29428
29429
29430
29431
29432
29433
29434
29435
29436
29437
29438
29439
29440
29441
29442
29443
29444
29445
29446
29447
29448
29449
29450
29451
29452
29453
29454
29455
29456
29457
29458
29459
29460
29461
29462
29463
29464
29465
29466
29467
29468
29469
29470
29471
29472
29473
29474
29475
29476
29477
29478
29479
29480
29481
29482
29483
29484
29485
29486
29487
29488
29489
29490
29491
29492
29493
29494
29495
29496
29497
29498
29499
29500
29501
29502
29503
29504
29505
29506
29507
29508
29509
29510
29511
29512
29513
29514
29515
29516
29517
29518
29519
29520
29521
29522
29523
29524
29525
29526
29527
29528
29529
29530
29531
29532
29533
29534
29535
29536
29537
29538
29539
29540
29541
29542
29543
29544
29545
29546
29547
29548
29549
29550
29551
29552
29553
29554
29555
29556
29557
29558
29559
29560
29561
29562
29563
29564
29565
29566
29567
29568
29569
29570
29571
29572
29573
29574
29575
29576
29577
29578
29579
29580
29581
29582
29583
29584
29585
29586
29587
29588
29589
29590
29591
29592
29593
29594
29595
29596
29597
29598
29599
29600
29601
29602
29603
29604
29605
29606
29607
29608
29609
29610
29611
29612
29613
29614
29615
29616
29617
29618
29619
29620
29621
29622
29623
29624
29625
29626
29627
29628
29629
29630
29631
29632
29633
29634
29635
29636
29637
29638
29639
29640
29641
29642
29643
29644
29645
29646
29647
29648
29649
29650
29651
29652
29653
29654
29655
29656
29657
29658
29659
29660
29661
29662
29663
29664
29665
29666
29667
29668
29669
29670
29671
29672
29673
29674
29675
29676
29677
29678
29679
29680
29681
29682
29683
29684
29685
29686
29687
29688
29689
29690
29691
29692
29693
29694
29695
29696
29697
29698
29699
29700
29701
29702
29703
29704
29705
29706
29707
29708
29709
29710
29711
29712
29713
29714
29715
29716
29717
29718
29719
29720
29721
29722
29723
29724
29725
29726
29727
29728
29729
29730
29731
29732
29733
29734
29735
29736
29737
29738
29739
29740
29741
29742
29743
29744
29745
29746
29747
29748
29749
29750
29751
29752
29753
29754
29755
29756
29757
29758
29759
29760
29761
29762
29763
29764
29765
29766
29767
29768
29769
29770
29771
29772
29773
29774
29775
29776
29777
29778
29779
29780
29781
29782
29783
29784
29785
29786
29787
29788
29789
29790
29791
29792
29793
29794
29795
29796
29797
29798
29799
29800
29801
29802
29803
29804
29805
29806
29807
29808
29809
29810
29811
29812
29813
29814
29815
29816
29817
29818
29819
29820
29821
29822
29823
29824
29825
29826
29827
29828
29829
29830
29831
29832
29833
29834
29835
29836
29837
29838
29839
29840
29841
29842
29843
29844
29845
29846
29847
29848
29849
29850
29851
29852
29853
29854
29855
29856
29857
29858
29859
29860
29861
29862
29863
29864
29865
29866
29867
29868
29869
29870
29871
29872
29873
29874
29875
29876
29877
29878
29879
29880
29881
29882
29883
29884
29885
29886
29887
29888
29889
29890
29891
29892
29893
29894
29895
29896
29897
29898
29899
29900
29901
29902
29903
29904
29905
29906
29907
29908
29909
29910
29911
29912
29913
29914
29915
29916
29917
29918
29919
29920
29921
29922
29923
29924
29925
29926
29927
29928
29929
29930
29931
29932
29933
29934
29935
29936
29937
29938
29939
29940
29941
29942
29943
29944
29945
29946
29947
29948
29949
29950
29951
29952
29953
29954
29955
29956
29957
29958
29959
29960
29961
29962
29963
29964
29965
29966
29967
29968
29969
29970
29971
29972
29973
29974
29975
29976
29977
29978
29979
29980
29981
29982
29983
29984
29985
29986
29987
29988
29989
29990
29991
29992
29993
29994
29995
29996
29997
29998
29999
30000
30001
30002
30003
30004
30005
30006
30007
30008
30009
30010
30011
30012
30013
30014
30015
30016
30017
30018
30019
30020
30021
30022
30023
30024
30025
30026
30027
30028
30029
30030
30031
30032
30033
30034
30035
30036
30037
30038
30039
30040
30041
30042
30043
30044
30045
30046
30047
30048
30049
30050
30051
30052
30053
30054
30055
30056
30057
30058
30059
30060
30061
30062
30063
30064
30065
30066
30067
30068
30069
30070
30071
30072
30073
30074
30075
30076
30077
30078
30079
30080
30081
30082
30083
30084
30085
30086
30087
30088
30089
30090
30091
30092
30093
30094
30095
30096
30097
30098
30099
30100
30101
30102
30103
30104
30105
30106
30107
30108
30109
30110
30111
30112
30113
30114
30115
30116
30117
30118
30119
30120
30121
30122
30123
30124
30125
30126
30127
30128
30129
30130
30131
30132
30133
30134
30135
30136
30137
30138
30139
30140
30141
30142
30143
30144
30145
30146
30147
30148
30149
30150
30151
30152
30153
30154
30155
30156
30157
30158
30159
30160
30161
30162
30163
30164
30165
30166
30167
30168
30169
30170
30171
30172
30173
30174
30175
30176
30177
30178
30179
30180
30181
30182
30183
30184
30185
30186
30187
30188
30189
30190
30191
30192
30193
30194
30195
30196
30197
30198
30199
30200
30201
30202
30203
30204
30205
30206
30207
30208
30209
30210
30211
30212
30213
30214
30215
30216
30217
30218
30219
30220
30221
30222
30223
30224
30225
30226
30227
30228
30229
30230
30231
30232
30233
30234
30235
30236
30237
30238
30239
30240
30241
30242
30243
30244
30245
30246
30247
30248
30249
30250
30251
30252
30253
30254
30255
30256
30257
30258
30259
30260
30261
30262
30263
30264
30265
30266
30267
30268
30269
30270
30271
30272
30273
30274
30275
30276
30277
30278
30279
30280
30281
30282
30283
30284
30285
30286
30287
30288
30289
30290
30291
30292
30293
30294
30295
30296
30297
30298
30299
30300
30301
30302
30303
30304
30305
30306
30307
30308
30309
30310
30311
30312
30313
30314
30315
30316
30317
30318
30319
30320
30321
30322
30323
30324
30325
30326
30327
30328
30329
30330
30331
30332
30333
30334
30335
30336
30337
30338
30339
30340
30341
30342
30343
30344
30345
30346
30347
30348
30349
30350
30351
30352
30353
30354
30355
30356
30357
30358
30359
30360
30361
30362
30363
30364
30365
30366
30367
30368
30369
30370
30371
30372
30373
30374
30375
30376
30377
30378
30379
30380
30381
30382
30383
30384
30385
30386
30387
30388
30389
30390
30391
30392
30393
30394
30395
30396
30397
30398
30399
30400
30401
30402
30403
30404
30405
30406
30407
30408
30409
30410
30411
30412
30413
30414
30415
30416
30417
30418
30419
30420
30421
30422
30423
30424
30425
30426
30427
30428
30429
30430
30431
30432
30433
30434
30435
30436
30437
30438
30439
30440
30441
30442
30443
30444
30445
30446
30447
30448
30449
30450
30451
30452
30453
30454
30455
30456
30457
30458
30459
30460
30461
30462
30463
30464
30465
30466
30467
30468
30469
30470
30471
30472
30473
30474
30475
30476
30477
30478
30479
30480
30481
30482
30483
30484
30485
30486
30487
30488
30489
30490
30491
30492
30493
30494
30495
30496
30497
30498
30499
30500
30501
30502
30503
30504
30505
30506
30507
30508
30509
30510
30511
30512
30513
30514
30515
30516
30517
30518
30519
30520
30521
30522
30523
30524
30525
30526
30527
30528
30529
30530
30531
30532
30533
30534
30535
30536
30537
30538
30539
30540
30541
30542
30543
30544
30545
30546
30547
30548
30549
30550
30551
30552
30553
30554
30555
30556
30557
30558
30559
30560
30561
30562
30563
30564
30565
30566
30567
30568
30569
30570
30571
30572
30573
30574
30575
30576
30577
30578
30579
30580
30581
30582
30583
30584
30585
30586
30587
30588
30589
30590
30591
30592
30593
30594
30595
30596
30597
30598
30599
30600
30601
30602
30603
30604
30605
30606
30607
30608
30609
30610
30611
30612
30613
30614
30615
30616
30617
30618
30619
30620
30621
30622
30623
30624
30625
30626
30627
30628
30629
30630
30631
30632
30633
30634
30635
30636
30637
30638
30639
30640
30641
30642
30643
30644
30645
30646
30647
30648
30649
30650
30651
30652
30653
30654
30655
30656
30657
30658
30659
30660
30661
30662
30663
30664
30665
30666
30667
30668
30669
30670
30671
30672
30673
30674
30675
30676
30677
30678
30679
30680
30681
30682
30683
30684
30685
30686
30687
30688
30689
30690
30691
30692
30693
30694
30695
30696
30697
30698
30699
30700
30701
30702
30703
30704
30705
30706
30707
30708
30709
30710
30711
30712
30713
30714
30715
30716
30717
30718
30719
30720
30721
30722
30723
30724
30725
30726
30727
30728
30729
30730
30731
30732
30733
30734
30735
30736
30737
30738
30739
30740
30741
30742
30743
30744
30745
30746
30747
30748
30749
30750
30751
30752
30753
30754
30755
30756
30757
30758
30759
30760
30761
30762
30763
30764
30765
30766
30767
30768
30769
30770
30771
30772
30773
30774
30775
30776
30777
30778
30779
30780
30781
30782
30783
30784
30785
30786
30787
30788
30789
30790
30791
30792
30793
30794
30795
30796
30797
30798
30799
30800
30801
30802
30803
30804
30805
30806
30807
30808
30809
30810
30811
30812
30813
30814
30815
30816
30817
30818
30819
30820
30821
30822
30823
30824
30825
30826
30827
30828
30829
30830
30831
30832
30833
30834
30835
30836
30837
30838
30839
30840
30841
30842
30843
30844
30845
30846
30847
30848
30849
30850
30851
30852
30853
30854
30855
30856
30857
30858
30859
30860
30861
30862
30863
30864
30865
30866
30867
30868
30869
30870
30871
30872
30873
30874
30875
30876
30877
30878
30879
30880
30881
30882
30883
30884
30885
30886
30887
30888
30889
30890
30891
30892
30893
30894
30895
30896
30897
30898
30899
30900
30901
30902
30903
30904
30905
30906
30907
30908
30909
30910
30911
30912
30913
30914
30915
30916
30917
30918
30919
30920
30921
30922
30923
30924
30925
30926
30927
30928
30929
30930
30931
30932
30933
30934
30935
30936
30937
30938
30939
30940
30941
30942
30943
30944
30945
30946
30947
30948
30949
30950
30951
30952
30953
30954
30955
30956
30957
30958
30959
30960
30961
30962
30963
30964
30965
30966
30967
30968
30969
30970
30971
30972
30973
30974
30975
30976
30977
30978
30979
30980
30981
30982
30983
30984
30985
30986
30987
30988
30989
30990
30991
30992
30993
30994
30995
30996
30997
30998
30999
31000
31001
31002
31003
31004
31005
31006
31007
31008
31009
31010
31011
31012
31013
31014
31015
31016
31017
31018
31019
31020
31021
31022
31023
31024
31025
31026
31027
31028
31029
31030
31031
31032
31033
31034
31035
31036
31037
31038
31039
31040
31041
31042
31043
31044
31045
31046
31047
31048
31049
31050
31051
31052
31053
31054
31055
31056
31057
31058
31059
31060
31061
31062
31063
31064
31065
31066
31067
31068
31069
31070
31071
31072
31073
31074
31075
31076
31077
31078
31079
31080
31081
31082
31083
31084
31085
31086
31087
31088
31089
31090
31091
31092
31093
31094
31095
31096
31097
31098
31099
31100
31101
31102
31103
31104
31105
31106
31107
31108
31109
31110
31111
31112
31113
31114
31115
31116
31117
31118
31119
31120
31121
31122
31123
31124
31125
31126
31127
31128
31129
31130
31131
31132
31133
31134
31135
31136
31137
31138
31139
31140
31141
31142
31143
31144
31145
31146
31147
31148
31149
31150
31151
31152
31153
31154
31155
31156
31157
31158
31159
31160
31161
31162
31163
31164
31165
31166
31167
31168
31169
31170
31171
31172
31173
31174
31175
31176
31177
31178
31179
31180
31181
31182
31183
31184
31185
31186
31187
31188
31189
31190
31191
31192
31193
31194
31195
31196
31197
31198
31199
31200
31201
31202
31203
31204
31205
31206
31207
31208
31209
31210
31211
31212
31213
31214
31215
31216
31217
31218
31219
31220
31221
31222
31223
31224
31225
31226
31227
31228
31229
31230
31231
31232
31233
31234
31235
31236
31237
31238
31239
31240
31241
31242
31243
31244
31245
31246
31247
31248
31249
31250
31251
31252
31253
31254
31255
31256
31257
31258
31259
31260
31261
31262
31263
31264
31265
31266
31267
31268
31269
31270
31271
31272
31273
31274
31275
31276
31277
31278
31279
31280
31281
31282
31283
31284
31285
31286
31287
31288
31289
31290
31291
31292
31293
31294
31295
31296
31297
31298
31299
31300
31301
31302
31303
31304
31305
31306
31307
31308
31309
31310
31311
31312
31313
31314
31315
31316
31317
31318
31319
31320
31321
31322
31323
31324
31325
31326
31327
31328
31329
31330
31331
31332
31333
31334
31335
31336
31337
31338
31339
31340
31341
31342
31343
31344
31345
31346
31347
31348
31349
31350
31351
31352
31353
31354
31355
31356
31357
31358
31359
31360
31361
31362
31363
31364
31365
31366
31367
31368
31369
31370
31371
31372
31373
31374
31375
31376
31377
31378
31379
31380
31381
31382
31383
31384
31385
31386
31387
31388
31389
31390
31391
31392
31393
31394
31395
31396
31397
31398
31399
31400
31401
31402
31403
31404
31405
31406
31407
31408
31409
31410
31411
31412
31413
31414
31415
31416
31417
31418
31419
31420
31421
31422
31423
31424
31425
31426
31427
31428
31429
31430
31431
31432
31433
31434
31435
31436
31437
31438
31439
31440
31441
31442
31443
31444
31445
31446
31447
31448
31449
31450
31451
31452
31453
31454
31455
31456
31457
31458
31459
31460
31461
31462
31463
31464
31465
31466
31467
31468
31469
31470
31471
31472
31473
31474
31475
31476
31477
31478
31479
31480
31481
31482
31483
31484
31485
31486
31487
31488
31489
31490
31491
31492
31493
31494
31495
31496
31497
31498
31499
31500
31501
31502
31503
31504
31505
31506
31507
31508
31509
31510
31511
31512
31513
31514
31515
31516
31517
31518
31519
31520
31521
31522
31523
31524
31525
31526
31527
31528
31529
31530
31531
31532
31533
31534
31535
31536
31537
31538
31539
31540
31541
31542
31543
31544
31545
31546
31547
31548
31549
31550
31551
31552
31553
31554
31555
31556
31557
31558
31559
31560
31561
31562
31563
31564
31565
31566
31567
31568
31569
31570
31571
31572
31573
31574
31575
31576
31577
31578
31579
31580
31581
31582
31583
31584
31585
31586
31587
31588
31589
31590
31591
31592
31593
31594
31595
31596
31597
31598
31599
31600
31601
31602
31603
31604
31605
31606
31607
31608
31609
31610
31611
31612
31613
31614
31615
31616
31617
31618
31619
31620
31621
31622
31623
31624
31625
31626
31627
31628
31629
31630
31631
31632
31633
31634
31635
31636
31637
31638
31639
31640
31641
31642
31643
31644
31645
31646
31647
31648
31649
31650
31651
31652
31653
31654
31655
31656
31657
31658
31659
31660
31661
31662
31663
31664
31665
31666
31667
31668
31669
31670
31671
31672
31673
31674
31675
31676
31677
31678
31679
31680
31681
31682
31683
31684
31685
31686
31687
31688
31689
31690
31691
31692
31693
31694
31695
31696
31697
31698
31699
31700
31701
31702
31703
31704
31705
31706
31707
31708
31709
31710
31711
31712
31713
31714
31715
31716
31717
31718
31719
31720
31721
31722
31723
31724
31725
31726
31727
31728
31729
31730
31731
31732
31733
31734
31735
31736
31737
31738
31739
31740
31741
31742
31743
31744
31745
31746
31747
31748
31749
31750
31751
31752
31753
31754
31755
31756
31757
31758
31759
31760
31761
31762
31763
31764
31765
31766
31767
31768
31769
31770
31771
31772
31773
31774
31775
31776
31777
31778
31779
31780
31781
31782
31783
31784
31785
31786
31787
31788
31789
31790
31791
31792
31793
31794
31795
31796
31797
31798
31799
31800
31801
31802
31803
31804
31805
31806
31807
31808
31809
31810
31811
31812
31813
31814
31815
31816
31817
31818
31819
31820
31821
31822
31823
31824
31825
31826
31827
31828
31829
31830
31831
31832
31833
31834
31835
31836
31837
31838
31839
31840
31841
31842
31843
31844
31845
31846
31847
31848
31849
31850
31851
31852
31853
31854
31855
31856
31857
31858
31859
31860
31861
31862
31863
31864
31865
31866
31867
31868
31869
31870
31871
31872
31873
31874
31875
31876
31877
31878
31879
31880
31881
31882
31883
31884
31885
31886
31887
31888
31889
31890
31891
31892
31893
31894
31895
31896
31897
31898
31899
31900
31901
31902
31903
31904
31905
31906
31907
31908
31909
31910
31911
31912
31913
31914
31915
31916
31917
31918
31919
31920
31921
31922
31923
31924
31925
31926
31927
31928
31929
31930
31931
31932
31933
31934
31935
31936
31937
31938
31939
31940
31941
31942
31943
31944
31945
31946
31947
31948
31949
31950
31951
31952
31953
31954
31955
31956
31957
31958
31959
31960
31961
31962
31963
31964
31965
31966
31967
31968
31969
31970
31971
31972
31973
31974
31975
31976
31977
31978
31979
31980
31981
31982
31983
31984
31985
31986
31987
31988
31989
31990
31991
31992
31993
31994
31995
31996
31997
31998
31999
32000
32001
32002
32003
32004
32005
32006
32007
32008
32009
32010
32011
32012
32013
32014
32015
32016
32017
32018
32019
32020
32021
32022
32023
32024
32025
32026
32027
32028
32029
32030
32031
32032
32033
32034
32035
32036
32037
32038
32039
32040
32041
32042
32043
32044
32045
32046
32047
32048
32049
32050
32051
32052
32053
32054
32055
32056
32057
32058
32059
32060
32061
32062
32063
32064
32065
32066
32067
32068
32069
32070
32071
32072
32073
32074
32075
32076
32077
32078
32079
32080
32081
32082
32083
32084
32085
32086
32087
32088
32089
32090
32091
32092
32093
32094
32095
32096
32097
32098
32099
32100
32101
32102
32103
32104
32105
32106
32107
32108
32109
32110
32111
32112
32113
32114
32115
32116
32117
32118
32119
32120
32121
32122
32123
32124
32125
32126
32127
32128
32129
32130
32131
32132
32133
32134
32135
32136
32137
32138
32139
32140
32141
32142
32143
32144
32145
32146
32147
32148
32149
32150
32151
32152
32153
32154
32155
32156
32157
32158
32159
32160
32161
32162
32163
32164
32165
32166
32167
32168
32169
32170
32171
32172
32173
32174
32175
32176
32177
32178
32179
32180
32181
32182
32183
32184
32185
32186
32187
32188
32189
32190
32191
32192
32193
32194
32195
32196
32197
32198
32199
32200
32201
32202
32203
32204
32205
32206
32207
32208
32209
32210
32211
32212
32213
32214
32215
32216
32217
32218
32219
32220
32221
32222
32223
32224
32225
32226
32227
32228
32229
32230
32231
32232
32233
32234
32235
32236
32237
32238
32239
32240
32241
32242
32243
32244
32245
32246
32247
32248
32249
32250
32251
32252
32253
32254
32255
32256
32257
32258
32259
32260
32261
32262
32263
32264
32265
32266
32267
32268
32269
32270
32271
32272
32273
32274
32275
32276
32277
32278
32279
32280
32281
32282
32283
32284
32285
32286
32287
32288
32289
32290
32291
32292
32293
32294
32295
32296
32297
32298
32299
32300
32301
32302
32303
32304
32305
32306
32307
32308
32309
32310
32311
32312
32313
32314
32315
32316
32317
32318
32319
32320
32321
32322
32323
32324
32325
32326
32327
32328
32329
32330
32331
32332
32333
32334
32335
32336
32337
32338
32339
32340
32341
32342
32343
32344
32345
32346
32347
32348
32349
32350
32351
32352
32353
32354
32355
32356
32357
32358
32359
32360
32361
32362
32363
32364
32365
32366
32367
32368
32369
32370
32371
32372
32373
32374
32375
32376
32377
32378
32379
32380
32381
32382
32383
32384
32385
32386
32387
32388
32389
32390
32391
32392
32393
32394
32395
32396
32397
32398
32399
32400
32401
32402
32403
32404
32405
32406
32407
32408
32409
32410
32411
32412
32413
32414
32415
32416
32417
32418
32419
32420
32421
32422
32423
32424
32425
32426
32427
32428
32429
32430
32431
32432
32433
32434
32435
32436
32437
32438
32439
32440
32441
32442
32443
32444
32445
32446
32447
32448
32449
32450
32451
32452
32453
32454
32455
32456
32457
32458
32459
32460
32461
32462
32463
32464
32465
32466
32467
32468
32469
32470
32471
32472
32473
32474
32475
32476
32477
32478
32479
32480
32481
32482
32483
32484
32485
32486
32487
32488
32489
32490
32491
32492
32493
32494
32495
32496
32497
32498
32499
32500
32501
32502
32503
32504
32505
32506
32507
32508
32509
32510
32511
32512
32513
32514
32515
32516
32517
32518
32519
32520
32521
32522
32523
32524
32525
32526
32527
32528
32529
32530
32531
32532
32533
32534
32535
32536
32537
32538
32539
32540
32541
32542
32543
32544
32545
32546
32547
32548
32549
32550
32551
32552
32553
32554
32555
32556
32557
32558
32559
32560
32561
32562
32563
32564
32565
32566
32567
32568
32569
32570
32571
32572
32573
32574
32575
32576
32577
32578
32579
32580
32581
32582
32583
32584
32585
32586
32587
32588
32589
32590
32591
32592
32593
32594
32595
32596
32597
32598
32599
32600
32601
32602
32603
32604
32605
32606
32607
32608
32609
32610
32611
32612
32613
32614
32615
32616
32617
32618
32619
32620
32621
32622
32623
32624
32625
32626
32627
32628
32629
32630
32631
32632
32633
32634
32635
32636
32637
32638
32639
32640
32641
32642
32643
32644
32645
32646
32647
32648
32649
32650
32651
32652
32653
32654
32655
32656
32657
32658
32659
32660
32661
32662
32663
32664
32665
32666
32667
32668
32669
32670
32671
32672
32673
32674
32675
32676
32677
32678
32679
32680
32681
32682
32683
32684
32685
32686
32687
32688
32689
32690
32691
32692
32693
32694
32695
32696
32697
32698
32699
32700
32701
32702
32703
32704
32705
32706
32707
32708
32709
32710
32711
32712
32713
32714
32715
32716
32717
32718
32719
32720
32721
32722
32723
32724
32725
32726
32727
32728
32729
32730
32731
32732
32733
32734
32735
32736
32737
32738
32739
32740
32741
32742
32743
32744
32745
32746
32747
32748
32749
32750
32751
32752
32753
32754
32755
32756
32757
32758
32759
32760
32761
32762
32763
32764
32765
32766
32767
32768
32769
32770
32771
32772
32773
32774
32775
32776
32777
32778
32779
32780
32781
32782
32783
32784
32785
32786
32787
32788
32789
32790
32791
32792
32793
32794
32795
32796
32797
32798
32799
32800
32801
32802
32803
32804
32805
32806
32807
32808
32809
32810
32811
32812
32813
32814
32815
32816
32817
32818
32819
32820
32821
32822
32823
32824
32825
32826
32827
32828
32829
32830
32831
32832
32833
32834
32835
32836
32837
32838
32839
32840
32841
32842
32843
32844
32845
32846
32847
32848
32849
32850
32851
32852
32853
32854
32855
32856
32857
32858
32859
32860
32861
32862
32863
32864
32865
32866
32867
32868
32869
32870
32871
32872
32873
32874
32875
32876
32877
32878
32879
32880
32881
32882
32883
32884
32885
32886
32887
32888
32889
32890
32891
32892
32893
32894
32895
32896
32897
32898
32899
32900
32901
32902
32903
32904
32905
32906
32907
32908
32909
32910
32911
32912
32913
32914
32915
32916
32917
32918
32919
32920
32921
32922
32923
32924
32925
32926
32927
32928
32929
32930
32931
32932
32933
32934
32935
32936
32937
32938
32939
32940
32941
32942
32943
32944
32945
32946
32947
32948
32949
32950
32951
32952
32953
32954
32955
32956
32957
32958
32959
32960
32961
32962
32963
32964
32965
32966
32967
32968
32969
32970
32971
32972
32973
32974
32975
32976
32977
32978
32979
32980
32981
32982
32983
32984
32985
32986
32987
32988
32989
32990
32991
32992
32993
32994
32995
32996
32997
32998
32999
33000
33001
33002
33003
33004
33005
33006
33007
33008
33009
33010
33011
33012
33013
33014
33015
33016
33017
33018
33019
33020
33021
33022
33023
33024
33025
33026
33027
33028
33029
33030
33031
33032
33033
33034
33035
33036
33037
33038
33039
33040
33041
33042
33043
33044
33045
33046
33047
33048
33049
33050
33051
33052
33053
33054
33055
33056
33057
33058
33059
33060
33061
33062
33063
33064
33065
33066
33067
33068
33069
33070
33071
33072
33073
33074
33075
33076
33077
33078
33079
33080
33081
33082
33083
33084
33085
33086
33087
33088
33089
33090
33091
33092
33093
33094
33095
33096
33097
33098
33099
33100
33101
33102
33103
33104
33105
33106
33107
33108
33109
33110
33111
33112
33113
33114
33115
33116
33117
33118
33119
33120
33121
33122
33123
33124
33125
33126
33127
33128
33129
33130
33131
33132
33133
33134
33135
33136
33137
33138
33139
33140
33141
33142
33143
33144
33145
33146
33147
33148
33149
33150
33151
33152
33153
33154
33155
33156
33157
33158
33159
33160
33161
33162
33163
33164
33165
33166
33167
33168
33169
33170
33171
33172
33173
33174
33175
33176
33177
33178
33179
33180
33181
33182
33183
33184
33185
33186
33187
33188
33189
33190
33191
33192
33193
33194
33195
33196
33197
33198
33199
33200
33201
33202
33203
33204
33205
33206
33207
33208
33209
33210
33211
33212
33213
33214
33215
33216
33217
33218
33219
33220
33221
33222
33223
33224
33225
33226
33227
33228
33229
33230
33231
33232
33233
33234
33235
33236
33237
33238
33239
33240
33241
33242
33243
33244
33245
33246
33247
33248
33249
33250
33251
33252
33253
33254
33255
33256
33257
33258
33259
33260
33261
33262
33263
33264
33265
33266
33267
33268
33269
33270
33271
33272
33273
33274
33275
33276
33277
33278
33279
33280
33281
33282
33283
33284
33285
33286
33287
33288
33289
33290
33291
33292
33293
33294
33295
33296
33297
33298
33299
33300
33301
33302
33303
33304
33305
33306
33307
33308
33309
33310
33311
33312
33313
33314
33315
33316
33317
33318
33319
33320
33321
33322
33323
33324
33325
33326
33327
33328
33329
33330
33331
33332
33333
33334
33335
33336
33337
33338
33339
33340
33341
33342
33343
33344
33345
33346
33347
33348
33349
33350
33351
33352
33353
33354
33355
33356
33357
33358
33359
33360
33361
33362
33363
33364
33365
33366
33367
33368
33369
33370
33371
33372
33373
33374
33375
33376
33377
33378
33379
33380
33381
33382
33383
33384
33385
33386
33387
33388
33389
33390
33391
33392
33393
33394
33395
33396
33397
33398
33399
33400
33401
33402
33403
33404
33405
33406
33407
33408
33409
33410
33411
33412
33413
33414
33415
33416
33417
33418
33419
33420
33421
33422
33423
33424
33425
33426
33427
33428
33429
33430
33431
33432
33433
33434
33435
33436
33437
33438
33439
33440
33441
33442
33443
33444
33445
33446
33447
33448
33449
33450
33451
33452
33453
33454
33455
33456
33457
33458
33459
33460
33461
33462
33463
33464
33465
33466
33467
33468
33469
33470
33471
33472
33473
33474
33475
33476
33477
33478
33479
33480
33481
33482
33483
33484
33485
33486
33487
33488
33489
33490
33491
33492
33493
33494
33495
33496
33497
33498
33499
33500
33501
33502
33503
33504
33505
33506
33507
33508
33509
33510
33511
33512
33513
33514
33515
33516
33517
33518
33519
33520
33521
33522
33523
33524
33525
33526
33527
33528
33529
33530
33531
33532
33533
33534
33535
33536
33537
33538
33539
33540
33541
33542
33543
33544
33545
33546
33547
33548
33549
33550
33551
33552
33553
33554
33555
33556
33557
33558
33559
33560
33561
33562
33563
33564
33565
33566
33567
33568
33569
33570
33571
33572
33573
33574
33575
33576
33577
33578
33579
33580
33581
33582
33583
33584
33585
33586
33587
33588
33589
33590
33591
33592
33593
33594
33595
33596
33597
33598
33599
33600
33601
33602
33603
33604
33605
33606
33607
33608
33609
33610
33611
33612
33613
33614
33615
33616
33617
33618
33619
33620
33621
33622
33623
33624
33625
33626
33627
33628
33629
33630
33631
33632
33633
33634
33635
33636
33637
33638
33639
33640
33641
33642
33643
33644
33645
33646
33647
33648
33649
33650
33651
33652
33653
33654
33655
33656
33657
33658
33659
33660
33661
33662
33663
33664
33665
33666
33667
33668
33669
33670
33671
33672
33673
33674
33675
33676
33677
33678
33679
33680
33681
33682
33683
33684
33685
33686
33687
33688
33689
33690
33691
33692
33693
33694
33695
33696
33697
33698
33699
33700
33701
33702
33703
33704
33705
33706
33707
33708
33709
33710
33711
33712
33713
33714
33715
33716
33717
33718
33719
33720
33721
33722
33723
33724
33725
33726
33727
33728
33729
33730
33731
33732
33733
33734
33735
33736
33737
33738
33739
33740
33741
33742
33743
33744
33745
33746
33747
33748
33749
33750
33751
33752
33753
33754
33755
33756
33757
33758
33759
33760
33761
33762
33763
33764
33765
33766
33767
33768
33769
33770
33771
33772
33773
33774
33775
33776
33777
33778
33779
33780
33781
33782
33783
33784
33785
33786
33787
33788
33789
33790
33791
33792
33793
33794
33795
33796
33797
33798
33799
33800
33801
33802
33803
33804
33805
33806
33807
33808
33809
33810
33811
33812
33813
33814
33815
33816
33817
33818
33819
33820
33821
33822
33823
33824
33825
33826
33827
33828
33829
33830
33831
33832
33833
33834
33835
33836
33837
33838
33839
33840
33841
33842
33843
33844
33845
33846
33847
33848
33849
33850
33851
33852
33853
33854
33855
33856
33857
33858
33859
33860
33861
33862
33863
33864
33865
33866
33867
33868
33869
33870
33871
33872
33873
33874
33875
33876
33877
33878
33879
33880
33881
33882
33883
33884
33885
33886
33887
33888
33889
33890
33891
33892
33893
33894
33895
33896
33897
33898
33899
33900
33901
33902
33903
33904
33905
33906
33907
33908
33909
33910
33911
33912
33913
33914
33915
33916
33917
33918
33919
33920
33921
33922
33923
33924
33925
33926
33927
33928
33929
33930
33931
33932
33933
33934
33935
33936
33937
33938
33939
33940
33941
33942
33943
33944
33945
33946
33947
33948
33949
33950
33951
33952
33953
33954
33955
33956
33957
33958
33959
33960
33961
33962
33963
33964
33965
33966
33967
33968
33969
33970
33971
33972
33973
33974
33975
33976
33977
33978
33979
33980
33981
33982
33983
33984
33985
33986
33987
33988
33989
33990
33991
33992
33993
33994
33995
33996
33997
33998
33999
34000
34001
34002
34003
34004
34005
34006
34007
34008
34009
34010
34011
34012
34013
34014
34015
34016
34017
34018
34019
34020
34021
34022
34023
34024
34025
34026
34027
34028
34029
34030
34031
34032
34033
34034
34035
34036
34037
34038
34039
34040
34041
34042
34043
34044
34045
34046
34047
34048
34049
34050
34051
34052
34053
34054
34055
34056
34057
34058
34059
34060
34061
34062
34063
34064
34065
34066
34067
34068
34069
34070
34071
34072
34073
34074
34075
34076
34077
34078
34079
34080
34081
34082
34083
34084
34085
34086
34087
34088
34089
34090
34091
34092
34093
34094
34095
34096
34097
34098
34099
34100
34101
34102
34103
34104
34105
34106
34107
34108
34109
34110
34111
34112
34113
34114
34115
34116
34117
34118
34119
34120
34121
34122
34123
34124
34125
34126
34127
34128
34129
34130
34131
34132
34133
34134
34135
34136
34137
34138
34139
34140
34141
34142
34143
34144
34145
34146
34147
34148
34149
34150
34151
34152
34153
34154
34155
34156
34157
34158
34159
34160
34161
34162
34163
34164
34165
34166
34167
34168
34169
34170
34171
34172
34173
34174
34175
34176
34177
34178
34179
34180
34181
34182
34183
34184
34185
34186
34187
34188
34189
34190
34191
34192
34193
34194
34195
34196
34197
34198
34199
34200
34201
34202
34203
34204
34205
34206
34207
34208
34209
34210
34211
34212
34213
34214
34215
34216
34217
34218
34219
34220
34221
34222
34223
34224
34225
34226
34227
34228
34229
34230
34231
34232
34233
34234
34235
34236
34237
34238
34239
34240
34241
34242
34243
34244
34245
34246
34247
34248
34249
34250
34251
34252
34253
34254
34255
34256
34257
34258
34259
34260
34261
34262
34263
34264
34265
34266
34267
34268
34269
34270
34271
34272
34273
34274
34275
34276
34277
34278
34279
34280
34281
34282
34283
34284
34285
34286
34287
34288
34289
34290
34291
34292
34293
34294
34295
34296
34297
34298
34299
34300
34301
34302
34303
34304
34305
34306
34307
34308
34309
34310
34311
34312
34313
34314
34315
34316
34317
34318
34319
34320
34321
34322
34323
34324
34325
34326
34327
34328
34329
34330
34331
34332
34333
34334
34335
34336
34337
34338
34339
34340
34341
34342
34343
34344
34345
34346
34347
34348
34349
34350
34351
34352
34353
34354
34355
34356
34357
34358
34359
34360
34361
34362
34363
34364
34365
34366
34367
34368
34369
34370
34371
34372
34373
34374
34375
34376
34377
34378
34379
34380
34381
34382
34383
34384
34385
34386
34387
34388
34389
34390
34391
34392
34393
34394
34395
34396
34397
34398
34399
34400
34401
34402
34403
34404
34405
34406
34407
34408
34409
34410
34411
34412
34413
34414
34415
34416
34417
34418
34419
34420
34421
34422
34423
34424
34425
34426
34427
34428
34429
34430
34431
34432
34433
34434
34435
34436
34437
34438
34439
34440
34441
34442
34443
34444
34445
34446
34447
34448
34449
34450
34451
34452
34453
34454
34455
34456
34457
34458
34459
34460
34461
34462
34463
34464
34465
34466
34467
34468
34469
34470
34471
34472
34473
34474
34475
34476
34477
34478
34479
34480
34481
34482
34483
34484
34485
34486
34487
34488
34489
34490
34491
34492
34493
34494
34495
34496
34497
34498
34499
34500
34501
34502
34503
34504
34505
34506
34507
34508
34509
34510
34511
34512
34513
34514
34515
34516
34517
34518
34519
34520
34521
34522
34523
34524
34525
34526
34527
34528
34529
34530
34531
34532
34533
34534
34535
34536
34537
34538
34539
34540
34541
34542
34543
34544
34545
34546
34547
34548
34549
34550
34551
34552
34553
34554
34555
34556
34557
34558
34559
34560
34561
34562
34563
34564
34565
34566
34567
34568
34569
34570
34571
34572
34573
34574
34575
34576
34577
34578
34579
34580
34581
34582
34583
34584
34585
34586
34587
34588
34589
34590
34591
34592
34593
34594
34595
34596
34597
34598
34599
34600
34601
34602
34603
34604
34605
34606
34607
34608
34609
34610
34611
34612
34613
34614
34615
34616
34617
34618
34619
34620
34621
34622
34623
34624
34625
34626
34627
34628
34629
34630
34631
34632
34633
34634
34635
34636
34637
34638
34639
34640
34641
34642
34643
34644
34645
34646
34647
34648
34649
34650
34651
34652
34653
34654
34655
34656
34657
34658
34659
34660
34661
34662
34663
34664
34665
34666
34667
34668
34669
34670
34671
34672
34673
34674
34675
34676
34677
34678
34679
34680
34681
34682
34683
34684
34685
34686
34687
34688
34689
34690
34691
34692
34693
34694
34695
34696
34697
34698
34699
34700
34701
34702
34703
34704
34705
34706
34707
34708
34709
34710
34711
34712
34713
34714
34715
34716
34717
34718
34719
34720
34721
34722
34723
34724
34725
34726
34727
34728
34729
34730
34731
34732
34733
34734
34735
34736
34737
34738
34739
34740
34741
34742
34743
34744
34745
34746
34747
34748
34749
34750
34751
34752
34753
34754
34755
34756
34757
34758
34759
34760
34761
34762
34763
34764
34765
34766
34767
34768
34769
34770
34771
34772
34773
34774
34775
34776
34777
34778
34779
34780
34781
34782
34783
34784
34785
34786
34787
34788
34789
34790
34791
34792
34793
34794
34795
34796
34797
34798
34799
34800
34801
34802
34803
34804
34805
34806
34807
34808
34809
34810
34811
34812
34813
34814
34815
34816
34817
34818
34819
34820
34821
34822
34823
34824
34825
34826
34827
34828
34829
34830
34831
34832
34833
34834
34835
34836
34837
34838
34839
34840
34841
34842
34843
34844
34845
34846
34847
34848
34849
34850
34851
34852
34853
34854
34855
34856
34857
34858
34859
34860
34861
34862
34863
34864
34865
34866
34867
34868
34869
34870
34871
34872
34873
34874
34875
34876
34877
34878
34879
34880
34881
34882
34883
34884
34885
34886
34887
34888
34889
34890
34891
34892
34893
34894
34895
34896
34897
34898
34899
34900
34901
34902
34903
34904
34905
34906
34907
34908
34909
34910
34911
34912
34913
34914
34915
34916
34917
34918
34919
34920
34921
34922
34923
34924
34925
34926
34927
34928
34929
34930
34931
34932
34933
34934
34935
34936
34937
34938
34939
34940
34941
34942
34943
34944
34945
34946
34947
34948
34949
34950
34951
34952
34953
34954
34955
34956
34957
34958
34959
34960
34961
34962
34963
34964
34965
34966
34967
34968
34969
34970
34971
34972
34973
34974
34975
34976
34977
34978
34979
34980
34981
34982
34983
34984
34985
34986
34987
34988
34989
34990
34991
34992
34993
34994
34995
34996
34997
34998
34999
35000
35001
35002
35003
35004
35005
35006
35007
35008
35009
35010
35011
35012
35013
35014
35015
35016
35017
35018
35019
35020
35021
35022
35023
35024
35025
35026
35027
35028
35029
35030
35031
35032
35033
35034
35035
35036
35037
35038
35039
35040
35041
35042
35043
35044
35045
35046
35047
35048
35049
35050
35051
35052
35053
35054
35055
35056
35057
35058
35059
35060
35061
35062
35063
35064
35065
35066
35067
35068
35069
35070
35071
35072
35073
35074
35075
35076
35077
35078
35079
35080
35081
35082
35083
35084
35085
35086
35087
35088
35089
35090
35091
35092
35093
35094
35095
35096
35097
35098
35099
35100
35101
35102
35103
35104
35105
35106
35107
35108
35109
35110
35111
35112
35113
35114
35115
35116
35117
35118
35119
35120
35121
35122
35123
35124
35125
35126
35127
35128
35129
35130
35131
35132
35133
35134
35135
35136
35137
35138
35139
35140
35141
35142
35143
35144
35145
35146
35147
35148
35149
35150
35151
35152
35153
35154
35155
35156
35157
35158
35159
35160
35161
35162
35163
35164
35165
35166
35167
35168
35169
35170
35171
35172
35173
35174
35175
35176
35177
35178
35179
35180
35181
35182
35183
35184
35185
35186
35187
35188
35189
35190
35191
35192
35193
35194
35195
35196
35197
35198
35199
35200
35201
35202
35203
35204
35205
35206
35207
35208
35209
35210
35211
35212
35213
35214
35215
35216
35217
35218
35219
35220
35221
35222
35223
35224
35225
35226
35227
35228
35229
35230
35231
35232
35233
35234
35235
35236
35237
35238
35239
35240
35241
35242
35243
35244
35245
35246
35247
35248
35249
35250
35251
35252
35253
35254
35255
35256
35257
35258
35259
35260
35261
35262
35263
35264
35265
35266
35267
35268
35269
35270
35271
35272
35273
35274
35275
35276
35277
35278
35279
35280
35281
35282
35283
35284
35285
35286
35287
35288
35289
35290
35291
35292
35293
35294
35295
35296
35297
35298
35299
35300
35301
35302
35303
35304
35305
35306
35307
35308
35309
35310
35311
35312
35313
35314
35315
35316
35317
35318
35319
35320
35321
35322
35323
35324
35325
35326
35327
35328
35329
35330
35331
35332
35333
35334
35335
35336
35337
35338
35339
35340
35341
35342
35343
35344
35345
35346
35347
35348
35349
35350
35351
35352
35353
35354
35355
35356
35357
35358
35359
35360
35361
35362
35363
35364
35365
35366
35367
35368
35369
35370
35371
35372
35373
35374
35375
35376
35377
35378
35379
35380
35381
35382
35383
35384
35385
35386
35387
35388
35389
35390
35391
35392
35393
35394
35395
35396
35397
35398
35399
35400
35401
35402
35403
35404
35405
35406
35407
35408
35409
35410
35411
35412
35413
35414
35415
35416
35417
35418
35419
35420
35421
35422
35423
35424
35425
35426
35427
35428
35429
35430
35431
35432
35433
35434
35435
35436
35437
35438
35439
35440
35441
35442
35443
35444
35445
35446
35447
35448
35449
35450
35451
35452
35453
35454
35455
35456
35457
35458
35459
35460
35461
35462
35463
35464
35465
35466
35467
35468
35469
35470
35471
35472
35473
35474
35475
35476
35477
35478
35479
35480
35481
35482
35483
35484
35485
35486
35487
35488
35489
35490
35491
35492
35493
35494
35495
35496
35497
35498
35499
35500
35501
35502
35503
35504
35505
35506
35507
35508
35509
35510
35511
35512
35513
35514
35515
35516
35517
35518
35519
35520
35521
35522
35523
35524
35525
35526
35527
35528
35529
35530
35531
35532
35533
35534
35535
35536
35537
35538
35539
35540
35541
35542
35543
35544
35545
35546
35547
35548
35549
35550
35551
35552
35553
35554
35555
35556
35557
35558
35559
35560
35561
35562
35563
35564
35565
35566
35567
35568
35569
35570
35571
35572
35573
35574
35575
35576
35577
35578
35579
35580
35581
35582
35583
35584
35585
35586
35587
35588
35589
35590
35591
35592
35593
35594
35595
35596
35597
35598
35599
35600
35601
35602
35603
35604
35605
35606
35607
35608
35609
35610
35611
35612
35613
35614
35615
35616
35617
35618
35619
35620
35621
35622
35623
35624
35625
35626
35627
35628
35629
35630
35631
35632
35633
35634
35635
35636
35637
35638
35639
35640
35641
35642
35643
35644
35645
35646
35647
35648
35649
35650
35651
35652
35653
35654
35655
35656
35657
35658
35659
35660
35661
35662
35663
35664
35665
35666
35667
35668
35669
35670
35671
35672
35673
35674
35675
35676
35677
35678
35679
35680
35681
35682
35683
35684
35685
35686
35687
35688
35689
35690
35691
35692
35693
35694
35695
35696
35697
35698
35699
35700
35701
35702
35703
35704
35705
35706
35707
35708
35709
35710
35711
35712
35713
35714
35715
35716
35717
35718
35719
35720
35721
35722
35723
35724
35725
35726
35727
35728
35729
35730
35731
35732
35733
35734
35735
35736
35737
35738
35739
35740
35741
35742
35743
35744
35745
35746
35747
35748
35749
35750
35751
35752
35753
35754
35755
35756
35757
35758
35759
35760
35761
35762
35763
35764
35765
35766
35767
35768
35769
35770
35771
35772
35773
35774
35775
35776
35777
35778
35779
35780
35781
35782
35783
35784
35785
35786
35787
35788
35789
35790
35791
35792
35793
35794
35795
35796
35797
35798
35799
35800
35801
35802
35803
35804
35805
35806
35807
35808
35809
35810
35811
35812
35813
35814
35815
35816
35817
35818
35819
35820
35821
35822
35823
35824
35825
35826
35827
35828
35829
35830
35831
35832
35833
35834
35835
35836
35837
35838
35839
35840
35841
35842
35843
35844
35845
35846
35847
35848
35849
35850
35851
35852
35853
35854
35855
35856
35857
35858
35859
35860
35861
35862
35863
35864
35865
35866
35867
35868
35869
35870
35871
35872
35873
35874
35875
35876
35877
35878
35879
35880
35881
35882
35883
35884
35885
35886
35887
35888
35889
35890
35891
35892
35893
35894
35895
35896
35897
35898
35899
35900
35901
35902
35903
35904
35905
35906
35907
35908
35909
35910
35911
35912
35913
35914
35915
35916
35917
35918
35919
35920
35921
35922
35923
35924
35925
35926
35927
35928
35929
35930
35931
35932
35933
35934
35935
35936
35937
35938
35939
35940
35941
35942
35943
35944
35945
35946
35947
35948
35949
35950
35951
35952
35953
35954
35955
35956
35957
35958
35959
35960
35961
35962
35963
35964
35965
35966
35967
35968
35969
35970
35971
35972
35973
35974
35975
35976
35977
35978
35979
35980
35981
35982
35983
35984
35985
35986
35987
35988
35989
35990
35991
35992
35993
35994
35995
35996
35997
35998
35999
36000
36001
36002
36003
36004
36005
36006
36007
36008
36009
36010
36011
36012
36013
36014
36015
36016
36017
36018
36019
36020
36021
36022
36023
36024
36025
36026
36027
36028
36029
36030
36031
36032
36033
36034
36035
36036
36037
36038
36039
36040
36041
36042
36043
36044
36045
36046
36047
36048
36049
36050
36051
36052
36053
36054
36055
36056
36057
36058
36059
36060
36061
36062
36063
36064
36065
36066
36067
36068
36069
36070
36071
36072
36073
36074
36075
36076
36077
36078
36079
36080
36081
36082
36083
36084
36085
36086
36087
36088
36089
36090
36091
36092
36093
36094
36095
36096
36097
36098
36099
36100
36101
36102
36103
36104
36105
36106
36107
36108
36109
36110
36111
36112
36113
36114
36115
36116
36117
36118
36119
36120
36121
36122
36123
36124
36125
36126
36127
36128
36129
36130
36131
36132
36133
36134
36135
36136
36137
36138
36139
36140
36141
36142
36143
36144
36145
36146
36147
36148
36149
36150
36151
36152
36153
36154
36155
36156
36157
36158
36159
36160
36161
36162
36163
36164
36165
36166
36167
36168
36169
36170
36171
36172
36173
36174
36175
36176
36177
36178
36179
36180
36181
36182
36183
36184
36185
36186
36187
36188
36189
36190
36191
36192
36193
36194
36195
36196
36197
36198
36199
36200
36201
36202
36203
36204
36205
36206
36207
36208
36209
36210
36211
36212
36213
36214
36215
36216
36217
36218
36219
36220
36221
36222
36223
36224
36225
36226
36227
36228
36229
36230
36231
36232
36233
36234
36235
36236
36237
36238
36239
36240
36241
36242
36243
36244
36245
36246
36247
36248
36249
36250
36251
36252
36253
36254
36255
36256
36257
36258
36259
36260
36261
36262
36263
36264
36265
36266
36267
36268
36269
36270
36271
36272
36273
36274
36275
36276
36277
36278
36279
36280
36281
36282
36283
36284
36285
36286
36287
36288
36289
36290
36291
36292
36293
36294
36295
36296
36297
36298
36299
36300
36301
36302
36303
36304
36305
36306
36307
36308
36309
36310
36311
36312
36313
36314
36315
36316
36317
36318
36319
36320
36321
36322
36323
36324
36325
36326
36327
36328
36329
36330
36331
36332
36333
36334
36335
36336
36337
36338
36339
36340
36341
36342
36343
36344
36345
36346
36347
36348
36349
36350
36351
36352
36353
36354
36355
36356
36357
36358
36359
36360
36361
36362
36363
36364
36365
36366
36367
36368
36369
36370
36371
36372
36373
36374
36375
36376
36377
36378
36379
36380
36381
36382
36383
36384
36385
36386
36387
36388
36389
36390
36391
36392
36393
36394
36395
36396
36397
36398
36399
36400
36401
36402
36403
36404
36405
36406
36407
36408
36409
36410
36411
36412
36413
36414
36415
36416
36417
36418
36419
36420
36421
36422
36423
36424
36425
36426
36427
36428
36429
36430
36431
36432
36433
36434
36435
diff --git a/assets/package-lock.json b/assets/package-lock.json
index e91a175..93fce42 100644
--- a/assets/package-lock.json
+++ b/assets/package-lock.json
@@ -9,12 +9,22 @@
         "@popperjs/core": "^2.11.8",
         "bootstrap": "^5.3.2",
         "jquery": "^3.7.1",
-        "phoenix_html": "file:../deps/phoenix_html"
+        "phoenix": "file:../deps/phoenix",
+        "phoenix_html": "file:../deps/phoenix_html",
+        "phoenix_live_view": "file:../deps/phoenix_live_view"
       }
     },
+    "../deps/phoenix": {
+      "version": "1.6.16",
+      "license": "MIT"
+    },
     "../deps/phoenix_html": {
       "version": "3.3.3"
     },
+    "../deps/phoenix_live_view": {
+      "version": "0.17.14",
+      "license": "MIT"
+    },
     "node_modules/@popperjs/core": {
       "version": "2.11.8",
       "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
@@ -47,9 +57,17 @@
       "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
       "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
     },
+    "node_modules/phoenix": {
+      "resolved": "../deps/phoenix",
+      "link": true
+    },
     "node_modules/phoenix_html": {
       "resolved": "../deps/phoenix_html",
       "link": true
+    },
+    "node_modules/phoenix_live_view": {
+      "resolved": "../deps/phoenix_live_view",
+      "link": true
     }
   }
 }
diff --git a/assets/package.json b/assets/package.json
index 7b4c34f..a7fbb27 100644
--- a/assets/package.json
+++ b/assets/package.json
@@ -6,6 +6,8 @@
     "@popperjs/core": "^2.11.8",
     "bootstrap": "^5.3.2",
     "jquery": "^3.7.1",
-    "phoenix_html": "file:../deps/phoenix_html"
+    "phoenix": "file:../deps/phoenix",
+    "phoenix_html": "file:../deps/phoenix_html",
+    "phoenix_live_view": "file:../deps/phoenix_live_view"
   }
 }
diff --git a/priv/static/_assets/app.js b/priv/static/_assets/app.js
index edca510..0553135 100644
--- a/priv/static/_assets/app.js
+++ b/priv/static/_assets/app.js
@@ -1,36353 +1,24 @@
-(() => {
-  var __create = Object.create;
-  var __defProp = Object.defineProperty;
-  var __defProps = Object.defineProperties;
-  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
-  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
-  var __getOwnPropNames = Object.getOwnPropertyNames;
-  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
-  var __getProtoOf = Object.getPrototypeOf;
-  var __hasOwnProp = Object.prototype.hasOwnProperty;
-  var __propIsEnum = Object.prototype.propertyIsEnumerable;
-  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
-  var __spreadValues = (a, b) => {
-    for (var prop in b || (b = {}))
-      if (__hasOwnProp.call(b, prop))
-        __defNormalProp(a, prop, b[prop]);
-    if (__getOwnPropSymbols)
-      for (var prop of __getOwnPropSymbols(b)) {
-        if (__propIsEnum.call(b, prop))
-          __defNormalProp(a, prop, b[prop]);
-      }
-    return a;
-  };
-  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
-  var __commonJS = (cb, mod) => function __require() {
-    return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
-  };
-  var __export = (target, all) => {
-    for (var name in all)
-      __defProp(target, name, { get: all[name], enumerable: true });
-  };
-  var __copyProps = (to, from, except, desc) => {
-    if (from && typeof from === "object" || typeof from === "function") {
-      for (let key of __getOwnPropNames(from))
-        if (!__hasOwnProp.call(to, key) && key !== except)
-          __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
-    }
-    return to;
-  };
-  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
-    // If the importer is in node compatibility mode or this is not an ESM
-    // file that has been converted to a CommonJS file using a Babel-
-    // compatible transform (i.e. "__esModule" has not been set), then set
-    // "default" to the CommonJS "module.exports" for node compatibility.
-    isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
-    mod
-  ));
+(()=>{var rc=Object.create;var ws=Object.defineProperty;var sc=Object.getOwnPropertyDescriptor;var oc=Object.getOwnPropertyNames;var ac=Object.getPrototypeOf,lc=Object.prototype.hasOwnProperty;var xs=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),uc=(t,e)=>{for(var i in e)ws(t,i,{get:e[i],enumerable:!0})},cc=(t,e,i,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of oc(e))!lc.call(t,o)&&o!==i&&ws(t,o,{get:()=>e[o],enumerable:!(s=sc(e,o))||s.enumerable});return t};var yn=(t,e,i)=>(i=t!=null?rc(ac(t)):{},cc(e||!t||!t.__esModule?ws(i,"default",{value:t,enumerable:!0}):i,t));var ar=xs((ha,or)=>{(function(t,e){"use strict";typeof or=="object"&&typeof or.exports=="object"?or.exports=t.document?e(t,!0):function(i){if(!i.document)throw new Error("jQuery requires a window with a document");return e(i)}:e(t)})(typeof window<"u"?window:ha,function(t,e){"use strict";var i=[],s=Object.getPrototypeOf,o=i.slice,c=i.flat?function(n){return i.flat.call(n)}:function(n){return i.concat.apply([],n)},d=i.push,g=i.indexOf,v={},C=v.toString,x=v.hasOwnProperty,I=x.toString,D=I.call(Object),S={},N=function(r){return typeof r=="function"&&typeof r.nodeType!="number"&&typeof r.item!="function"},A=function(r){return r!=null&&r===r.window},_=t.document,R={type:!0,src:!0,nonce:!0,noModule:!0};function F(n,r,a){a=a||_;var u,f,h=a.createElement("script");if(h.text=n,r)for(u in R)f=r[u]||r.getAttribute&&r.getAttribute(u),f&&h.setAttribute(u,f);a.head.appendChild(h).parentNode.removeChild(h)}function T(n){return n==null?n+"":typeof n=="object"||typeof n=="function"?v[C.call(n)]||"object":typeof n}var H="3.7.1",K=/HTML$/i,l=function(n,r){return new l.fn.init(n,r)};l.fn=l.prototype={jquery:H,constructor:l,length:0,toArray:function(){return o.call(this)},get:function(n){return n==null?o.call(this):n<0?this[n+this.length]:this[n]},pushStack:function(n){var r=l.merge(this.constructor(),n);return r.prevObject=this,r},each:function(n){return l.each(this,n)},map:function(n){return this.pushStack(l.map(this,function(r,a){return n.call(r,a,r)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(l.grep(this,function(n,r){return(r+1)%2}))},odd:function(){return this.pushStack(l.grep(this,function(n,r){return r%2}))},eq:function(n){var r=this.length,a=+n+(n<0?r:0);return this.pushStack(a>=0&&a<r?[this[a]]:[])},end:function(){return this.prevObject||this.constructor()},push:d,sort:i.sort,splice:i.splice},l.extend=l.fn.extend=function(){var n,r,a,u,f,h,p=arguments[0]||{},y=1,b=arguments.length,w=!1;for(typeof p=="boolean"&&(w=p,p=arguments[y]||{},y++),typeof p!="object"&&!N(p)&&(p={}),y===b&&(p=this,y--);y<b;y++)if((n=arguments[y])!=null)for(r in n)u=n[r],!(r==="__proto__"||p===u)&&(w&&u&&(l.isPlainObject(u)||(f=Array.isArray(u)))?(a=p[r],f&&!Array.isArray(a)?h=[]:!f&&!l.isPlainObject(a)?h={}:h=a,f=!1,p[r]=l.extend(w,h,u)):u!==void 0&&(p[r]=u));return p},l.extend({expando:"jQuery"+(H+Math.random()).replace(/\D/g,""),isReady:!0,error:function(n){throw new Error(n)},noop:function(){},isPlainObject:function(n){var r,a;return!n||C.call(n)!=="[object Object]"?!1:(r=s(n),r?(a=x.call(r,"constructor")&&r.constructor,typeof a=="function"&&I.call(a)===D):!0)},isEmptyObject:function(n){var r;for(r in n)return!1;return!0},globalEval:function(n,r,a){F(n,{nonce:r&&r.nonce},a)},each:function(n,r){var a,u=0;if(ee(n))for(a=n.length;u<a&&r.call(n[u],u,n[u])!==!1;u++);else for(u in n)if(r.call(n[u],u,n[u])===!1)break;return n},text:function(n){var r,a="",u=0,f=n.nodeType;if(!f)for(;r=n[u++];)a+=l.text(r);return f===1||f===11?n.textContent:f===9?n.documentElement.textContent:f===3||f===4?n.nodeValue:a},makeArray:function(n,r){var a=r||[];return n!=null&&(ee(Object(n))?l.merge(a,typeof n=="string"?[n]:n):d.call(a,n)),a},inArray:function(n,r,a){return r==null?-1:g.call(r,n,a)},isXMLDoc:function(n){var r=n&&n.namespaceURI,a=n&&(n.ownerDocument||n).documentElement;return!K.test(r||a&&a.nodeName||"HTML")},merge:function(n,r){for(var a=+r.length,u=0,f=n.length;u<a;u++)n[f++]=r[u];return n.length=f,n},grep:function(n,r,a){for(var u,f=[],h=0,p=n.length,y=!a;h<p;h++)u=!r(n[h],h),u!==y&&f.push(n[h]);return f},map:function(n,r,a){var u,f,h=0,p=[];if(ee(n))for(u=n.length;h<u;h++)f=r(n[h],h,a),f!=null&&p.push(f);else for(h in n)f=r(n[h],h,a),f!=null&&p.push(f);return c(p)},guid:1,support:S}),typeof Symbol=="function"&&(l.fn[Symbol.iterator]=i[Symbol.iterator]),l.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(n,r){v["[object "+r+"]"]=r.toLowerCase()});function ee(n){var r=!!n&&"length"in n&&n.length,a=T(n);return N(n)||A(n)?!1:a==="array"||r===0||typeof r=="number"&&r>0&&r-1 in n}function G(n,r){return n.nodeName&&n.nodeName.toLowerCase()===r.toLowerCase()}var re=i.pop,me=i.sort,_e=i.splice,se="[\\x20\\t\\r\\n\\f]",ye=new RegExp("^"+se+"+|((?:^|[^\\\\])(?:\\\\.)*)"+se+"+$","g");l.contains=function(n,r){var a=r&&r.parentNode;return n===a||!!(a&&a.nodeType===1&&(n.contains?n.contains(a):n.compareDocumentPosition&&n.compareDocumentPosition(a)&16))};var je=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function Y(n,r){return r?n==="\0"?"\uFFFD":n.slice(0,-1)+"\\"+n.charCodeAt(n.length-1).toString(16)+" ":"\\"+n}l.escapeSelector=function(n){return(n+"").replace(je,Y)};var W=_,X=d;(function(){var n,r,a,u,f,h=X,p,y,b,w,P,M=l.expando,O=0,U=0,ae=ir(),pe=ir(),ue=ir(),He=ir(),Le=function(m,E){return m===E&&(f=!0),0},Tt="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",wt="(?:\\\\[\\da-fA-F]{1,6}"+se+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",he="\\["+se+"*("+wt+")(?:"+se+"*([*^$|!~]?=)"+se+`*(?:'((?:\\\\.|[^\\\\'])*)'|"((?:\\\\.|[^\\\\"])*)"|(`+wt+"))|)"+se+"*\\]",pi=":("+wt+`)(?:\\((('((?:\\\\.|[^\\\\'])*)'|"((?:\\\\.|[^\\\\"])*)")|((?:\\\\.|[^\\\\()[\\]]|`+he+")*)|.*)\\)|)",ge=new RegExp(se+"+","g"),xe=new RegExp("^"+se+"*,"+se+"*"),mn=new RegExp("^"+se+"*([>+~]|"+se+")"+se+"*"),vs=new RegExp(se+"|>"),xt=new RegExp(pi),vn=new RegExp("^"+wt+"$"),Ct={ID:new RegExp("^#("+wt+")"),CLASS:new RegExp("^\\.("+wt+")"),TAG:new RegExp("^("+wt+"|[*])"),ATTR:new RegExp("^"+he),PSEUDO:new RegExp("^"+pi),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+se+"*(even|odd|(([+-]|)(\\d*)n|)"+se+"*(?:([+-]|)"+se+"*(\\d+)|))"+se+"*\\)|)","i"),bool:new RegExp("^(?:"+Tt+")$","i"),needsContext:new RegExp("^"+se+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+se+"*((?:-\\d)?\\d*)"+se+"*\\)|)(?=[^-]|$)","i")},Xt=/^(?:input|select|textarea|button)$/i,Yt=/^h\d$/i,ut=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,bs=/[+~]/,$t=new RegExp("\\\\[\\da-fA-F]{1,6}"+se+"?|\\\\([^\\r\\n\\f])","g"),Mt=function(m,E){var k="0x"+m.slice(1)-65536;return E||(k<0?String.fromCharCode(k+65536):String.fromCharCode(k>>10|55296,k&1023|56320))},Ju=function(){Gt()},Qu=rr(function(m){return m.disabled===!0&&G(m,"fieldset")},{dir:"parentNode",next:"legend"});function Zu(){try{return p.activeElement}catch{}}try{h.apply(i=o.call(W.childNodes),W.childNodes),i[W.childNodes.length].nodeType}catch{h={apply:function(E,k){X.apply(E,o.call(k))},call:function(E){X.apply(E,o.call(arguments,1))}}}function ve(m,E,k,L){var $,V,q,Q,z,ce,ne,le=E&&E.ownerDocument,fe=E?E.nodeType:9;if(k=k||[],typeof m!="string"||!m||fe!==1&&fe!==9&&fe!==11)return k;if(!L&&(Gt(E),E=E||p,b)){if(fe!==11&&(z=ut.exec(m)))if($=z[1]){if(fe===9)if(q=E.getElementById($)){if(q.id===$)return h.call(k,q),k}else return k;else if(le&&(q=le.getElementById($))&&ve.contains(E,q)&&q.id===$)return h.call(k,q),k}else{if(z[2])return h.apply(k,E.getElementsByTagName(m)),k;if(($=z[3])&&E.getElementsByClassName)return h.apply(k,E.getElementsByClassName($)),k}if(!He[m+" "]&&(!w||!w.test(m))){if(ne=m,le=E,fe===1&&(vs.test(m)||mn.test(m))){for(le=bs.test(m)&&ys(E.parentNode)||E,(le!=E||!S.scope)&&((Q=E.getAttribute("id"))?Q=l.escapeSelector(Q):E.setAttribute("id",Q=M)),ce=bn(m),V=ce.length;V--;)ce[V]=(Q?"#"+Q:":scope")+" "+nr(ce[V]);ne=ce.join(",")}try{return h.apply(k,le.querySelectorAll(ne)),k}catch{He(m,!0)}finally{Q===M&&E.removeAttribute("id")}}}return fa(m.replace(ye,"$1"),E,k,L)}function ir(){var m=[];function E(k,L){return m.push(k+" ")>r.cacheLength&&delete E[m.shift()],E[k+" "]=L}return E}function bt(m){return m[M]=!0,m}function ji(m){var E=p.createElement("fieldset");try{return!!m(E)}catch{return!1}finally{E.parentNode&&E.parentNode.removeChild(E),E=null}}function ec(m){return function(E){return G(E,"input")&&E.type===m}}function tc(m){return function(E){return(G(E,"input")||G(E,"button"))&&E.type===m}}function ua(m){return function(E){return"form"in E?E.parentNode&&E.disabled===!1?"label"in E?"label"in E.parentNode?E.parentNode.disabled===m:E.disabled===m:E.isDisabled===m||E.isDisabled!==!m&&Qu(E)===m:E.disabled===m:"label"in E?E.disabled===m:!1}}function gi(m){return bt(function(E){return E=+E,bt(function(k,L){for(var $,V=m([],k.length,E),q=V.length;q--;)k[$=V[q]]&&(k[$]=!(L[$]=k[$]))})})}function ys(m){return m&&typeof m.getElementsByTagName<"u"&&m}function Gt(m){var E,k=m?m.ownerDocument||m:W;return k==p||k.nodeType!==9||!k.documentElement||(p=k,y=p.documentElement,b=!l.isXMLDoc(p),P=y.matches||y.webkitMatchesSelector||y.msMatchesSelector,y.msMatchesSelector&&W!=p&&(E=p.defaultView)&&E.top!==E&&E.addEventListener("unload",Ju),S.getById=ji(function(L){return y.appendChild(L).id=l.expando,!p.getElementsByName||!p.getElementsByName(l.expando).length}),S.disconnectedMatch=ji(function(L){return P.call(L,"*")}),S.scope=ji(function(){return p.querySelectorAll(":scope")}),S.cssHas=ji(function(){try{return p.querySelector(":has(*,:jqfake)"),!1}catch{return!0}}),S.getById?(r.filter.ID=function(L){var $=L.replace($t,Mt);return function(V){return V.getAttribute("id")===$}},r.find.ID=function(L,$){if(typeof $.getElementById<"u"&&b){var V=$.getElementById(L);return V?[V]:[]}}):(r.filter.ID=function(L){var $=L.replace($t,Mt);return function(V){var q=typeof V.getAttributeNode<"u"&&V.getAttributeNode("id");return q&&q.value===$}},r.find.ID=function(L,$){if(typeof $.getElementById<"u"&&b){var V,q,Q,z=$.getElementById(L);if(z){if(V=z.getAttributeNode("id"),V&&V.value===L)return[z];for(Q=$.getElementsByName(L),q=0;z=Q[q++];)if(V=z.getAttributeNode("id"),V&&V.value===L)return[z]}return[]}}),r.find.TAG=function(L,$){return typeof $.getElementsByTagName<"u"?$.getElementsByTagName(L):$.querySelectorAll(L)},r.find.CLASS=function(L,$){if(typeof $.getElementsByClassName<"u"&&b)return $.getElementsByClassName(L)},w=[],ji(function(L){var $;y.appendChild(L).innerHTML="<a id='"+M+"' href='' disabled='disabled'></a><select id='"+M+"-\r\\' disabled='disabled'><option selected=''></option></select>",L.querySelectorAll("[selected]").length||w.push("\\["+se+"*(?:value|"+Tt+")"),L.querySelectorAll("[id~="+M+"-]").length||w.push("~="),L.querySelectorAll("a#"+M+"+*").length||w.push(".#.+[+~]"),L.querySelectorAll(":checked").length||w.push(":checked"),$=p.createElement("input"),$.setAttribute("type","hidden"),L.appendChild($).setAttribute("name","D"),y.appendChild(L).disabled=!0,L.querySelectorAll(":disabled").length!==2&&w.push(":enabled",":disabled"),$=p.createElement("input"),$.setAttribute("name",""),L.appendChild($),L.querySelectorAll("[name='']").length||w.push("\\["+se+"*name"+se+"*="+se+`*(?:''|"")`)}),S.cssHas||w.push(":has"),w=w.length&&new RegExp(w.join("|")),Le=function(L,$){if(L===$)return f=!0,0;var V=!L.compareDocumentPosition-!$.compareDocumentPosition;return V||(V=(L.ownerDocument||L)==($.ownerDocument||$)?L.compareDocumentPosition($):1,V&1||!S.sortDetached&&$.compareDocumentPosition(L)===V?L===p||L.ownerDocument==W&&ve.contains(W,L)?-1:$===p||$.ownerDocument==W&&ve.contains(W,$)?1:u?g.call(u,L)-g.call(u,$):0:V&4?-1:1)}),p}ve.matches=function(m,E){return ve(m,null,null,E)},ve.matchesSelector=function(m,E){if(Gt(m),b&&!He[E+" "]&&(!w||!w.test(E)))try{var k=P.call(m,E);if(k||S.disconnectedMatch||m.document&&m.document.nodeType!==11)return k}catch{He(E,!0)}return ve(E,p,null,[m]).length>0},ve.contains=function(m,E){return(m.ownerDocument||m)!=p&&Gt(m),l.contains(m,E)},ve.attr=function(m,E){(m.ownerDocument||m)!=p&&Gt(m);var k=r.attrHandle[E.toLowerCase()],L=k&&x.call(r.attrHandle,E.toLowerCase())?k(m,E,!b):void 0;return L!==void 0?L:m.getAttribute(E)},ve.error=function(m){throw new Error("Syntax error, unrecognized expression: "+m)},l.uniqueSort=function(m){var E,k=[],L=0,$=0;if(f=!S.sortStable,u=!S.sortStable&&o.call(m,0),me.call(m,Le),f){for(;E=m[$++];)E===m[$]&&(L=k.push($));for(;L--;)_e.call(m,k[L],1)}return u=null,m},l.fn.uniqueSort=function(){return this.pushStack(l.uniqueSort(o.apply(this)))},r=l.expr={cacheLength:50,createPseudo:bt,match:Ct,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(m){return m[1]=m[1].replace($t,Mt),m[3]=(m[3]||m[4]||m[5]||"").replace($t,Mt),m[2]==="~="&&(m[3]=" "+m[3]+" "),m.slice(0,4)},CHILD:function(m){return m[1]=m[1].toLowerCase(),m[1].slice(0,3)==="nth"?(m[3]||ve.error(m[0]),m[4]=+(m[4]?m[5]+(m[6]||1):2*(m[3]==="even"||m[3]==="odd")),m[5]=+(m[7]+m[8]||m[3]==="odd")):m[3]&&ve.error(m[0]),m},PSEUDO:function(m){var E,k=!m[6]&&m[2];return Ct.CHILD.test(m[0])?null:(m[3]?m[2]=m[4]||m[5]||"":k&&xt.test(k)&&(E=bn(k,!0))&&(E=k.indexOf(")",k.length-E)-k.length)&&(m[0]=m[0].slice(0,E),m[2]=k.slice(0,E)),m.slice(0,3))}},filter:{TAG:function(m){var E=m.replace($t,Mt).toLowerCase();return m==="*"?function(){return!0}:function(k){return G(k,E)}},CLASS:function(m){var E=ae[m+" "];return E||(E=new RegExp("(^|"+se+")"+m+"("+se+"|$)"))&&ae(m,function(k){return E.test(typeof k.className=="string"&&k.className||typeof k.getAttribute<"u"&&k.getAttribute("class")||"")})},ATTR:function(m,E,k){return function(L){var $=ve.attr(L,m);return $==null?E==="!=":E?($+="",E==="="?$===k:E==="!="?$!==k:E==="^="?k&&$.indexOf(k)===0:E==="*="?k&&$.indexOf(k)>-1:E==="$="?k&&$.slice(-k.length)===k:E==="~="?(" "+$.replace(ge," ")+" ").indexOf(k)>-1:E==="|="?$===k||$.slice(0,k.length+1)===k+"-":!1):!0}},CHILD:function(m,E,k,L,$){var V=m.slice(0,3)!=="nth",q=m.slice(-4)!=="last",Q=E==="of-type";return L===1&&$===0?function(z){return!!z.parentNode}:function(z,ce,ne){var le,fe,ie,be,Ze,Ue=V!==q?"nextSibling":"previousSibling",ct=z.parentNode,St=Q&&z.nodeName.toLowerCase(),Bi=!ne&&!Q,Ke=!1;if(ct){if(V){for(;Ue;){for(ie=z;ie=ie[Ue];)if(Q?G(ie,St):ie.nodeType===1)return!1;Ze=Ue=m==="only"&&!Ze&&"nextSibling"}return!0}if(Ze=[q?ct.firstChild:ct.lastChild],q&&Bi){for(fe=ct[M]||(ct[M]={}),le=fe[m]||[],be=le[0]===O&&le[1],Ke=be&&le[2],ie=be&&ct.childNodes[be];ie=++be&&ie&&ie[Ue]||(Ke=be=0)||Ze.pop();)if(ie.nodeType===1&&++Ke&&ie===z){fe[m]=[O,be,Ke];break}}else if(Bi&&(fe=z[M]||(z[M]={}),le=fe[m]||[],be=le[0]===O&&le[1],Ke=be),Ke===!1)for(;(ie=++be&&ie&&ie[Ue]||(Ke=be=0)||Ze.pop())&&!((Q?G(ie,St):ie.nodeType===1)&&++Ke&&(Bi&&(fe=ie[M]||(ie[M]={}),fe[m]=[O,Ke]),ie===z)););return Ke-=$,Ke===L||Ke%L===0&&Ke/L>=0}}},PSEUDO:function(m,E){var k,L=r.pseudos[m]||r.setFilters[m.toLowerCase()]||ve.error("unsupported pseudo: "+m);return L[M]?L(E):L.length>1?(k=[m,m,"",E],r.setFilters.hasOwnProperty(m.toLowerCase())?bt(function($,V){for(var q,Q=L($,E),z=Q.length;z--;)q=g.call($,Q[z]),$[q]=!(V[q]=Q[z])}):function($){return L($,0,k)}):L}},pseudos:{not:bt(function(m){var E=[],k=[],L=Ts(m.replace(ye,"$1"));return L[M]?bt(function($,V,q,Q){for(var z,ce=L($,null,Q,[]),ne=$.length;ne--;)(z=ce[ne])&&($[ne]=!(V[ne]=z))}):function($,V,q){return E[0]=$,L(E,null,q,k),E[0]=null,!k.pop()}}),has:bt(function(m){return function(E){return ve(m,E).length>0}}),contains:bt(function(m){return m=m.replace($t,Mt),function(E){return(E.textContent||l.text(E)).indexOf(m)>-1}}),lang:bt(function(m){return vn.test(m||"")||ve.error("unsupported lang: "+m),m=m.replace($t,Mt).toLowerCase(),function(E){var k;do if(k=b?E.lang:E.getAttribute("xml:lang")||E.getAttribute("lang"))return k=k.toLowerCase(),k===m||k.indexOf(m+"-")===0;while((E=E.parentNode)&&E.nodeType===1);return!1}}),target:function(m){var E=t.location&&t.location.hash;return E&&E.slice(1)===m.id},root:function(m){return m===y},focus:function(m){return m===Zu()&&p.hasFocus()&&!!(m.type||m.href||~m.tabIndex)},enabled:ua(!1),disabled:ua(!0),checked:function(m){return G(m,"input")&&!!m.checked||G(m,"option")&&!!m.selected},selected:function(m){return m.parentNode&&m.parentNode.selectedIndex,m.selected===!0},empty:function(m){for(m=m.firstChild;m;m=m.nextSibling)if(m.nodeType<6)return!1;return!0},parent:function(m){return!r.pseudos.empty(m)},header:function(m){return Yt.test(m.nodeName)},input:function(m){return Xt.test(m.nodeName)},button:function(m){return G(m,"input")&&m.type==="button"||G(m,"button")},text:function(m){var E;return G(m,"input")&&m.type==="text"&&((E=m.getAttribute("type"))==null||E.toLowerCase()==="text")},first:gi(function(){return[0]}),last:gi(function(m,E){return[E-1]}),eq:gi(function(m,E,k){return[k<0?k+E:k]}),even:gi(function(m,E){for(var k=0;k<E;k+=2)m.push(k);return m}),odd:gi(function(m,E){for(var k=1;k<E;k+=2)m.push(k);return m}),lt:gi(function(m,E,k){var L;for(k<0?L=k+E:k>E?L=E:L=k;--L>=0;)m.push(L);return m}),gt:gi(function(m,E,k){for(var L=k<0?k+E:k;++L<E;)m.push(L);return m})}},r.pseudos.nth=r.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})r.pseudos[n]=ec(n);for(n in{submit:!0,reset:!0})r.pseudos[n]=tc(n);function ca(){}ca.prototype=r.filters=r.pseudos,r.setFilters=new ca;function bn(m,E){var k,L,$,V,q,Q,z,ce=pe[m+" "];if(ce)return E?0:ce.slice(0);for(q=m,Q=[],z=r.preFilter;q;){(!k||(L=xe.exec(q)))&&(L&&(q=q.slice(L[0].length)||q),Q.push($=[])),k=!1,(L=mn.exec(q))&&(k=L.shift(),$.push({value:k,type:L[0].replace(ye," ")}),q=q.slice(k.length));for(V in r.filter)(L=Ct[V].exec(q))&&(!z[V]||(L=z[V](L)))&&(k=L.shift(),$.push({value:k,type:V,matches:L}),q=q.slice(k.length));if(!k)break}return E?q.length:q?ve.error(m):pe(m,Q).slice(0)}function nr(m){for(var E=0,k=m.length,L="";E<k;E++)L+=m[E].value;return L}function rr(m,E,k){var L=E.dir,$=E.next,V=$||L,q=k&&V==="parentNode",Q=U++;return E.first?function(z,ce,ne){for(;z=z[L];)if(z.nodeType===1||q)return m(z,ce,ne);return!1}:function(z,ce,ne){var le,fe,ie=[O,Q];if(ne){for(;z=z[L];)if((z.nodeType===1||q)&&m(z,ce,ne))return!0}else for(;z=z[L];)if(z.nodeType===1||q)if(fe=z[M]||(z[M]={}),$&&G(z,$))z=z[L]||z;else{if((le=fe[V])&&le[0]===O&&le[1]===Q)return ie[2]=le[2];if(fe[V]=ie,ie[2]=m(z,ce,ne))return!0}return!1}}function _s(m){return m.length>1?function(E,k,L){for(var $=m.length;$--;)if(!m[$](E,k,L))return!1;return!0}:m[0]}function ic(m,E,k){for(var L=0,$=E.length;L<$;L++)ve(m,E[L],k);return k}function sr(m,E,k,L,$){for(var V,q=[],Q=0,z=m.length,ce=E!=null;Q<z;Q++)(V=m[Q])&&(!k||k(V,L,$))&&(q.push(V),ce&&E.push(Q));return q}function Es(m,E,k,L,$,V){return L&&!L[M]&&(L=Es(L)),$&&!$[M]&&($=Es($,V)),bt(function(q,Q,z,ce){var ne,le,fe,ie,be=[],Ze=[],Ue=Q.length,ct=q||ic(E||"*",z.nodeType?[z]:z,[]),St=m&&(q||!E)?sr(ct,be,m,z,ce):ct;if(k?(ie=$||(q?m:Ue||L)?[]:Q,k(St,ie,z,ce)):ie=St,L)for(ne=sr(ie,Ze),L(ne,[],z,ce),le=ne.length;le--;)(fe=ne[le])&&(ie[Ze[le]]=!(St[Ze[le]]=fe));if(q){if($||m){if($){for(ne=[],le=ie.length;le--;)(fe=ie[le])&&ne.push(St[le]=fe);$(null,ie=[],ne,ce)}for(le=ie.length;le--;)(fe=ie[le])&&(ne=$?g.call(q,fe):be[le])>-1&&(q[ne]=!(Q[ne]=fe))}}else ie=sr(ie===Q?ie.splice(Ue,ie.length):ie),$?$(null,Q,ie,ce):h.apply(Q,ie)})}function As(m){for(var E,k,L,$=m.length,V=r.relative[m[0].type],q=V||r.relative[" "],Q=V?1:0,z=rr(function(le){return le===E},q,!0),ce=rr(function(le){return g.call(E,le)>-1},q,!0),ne=[function(le,fe,ie){var be=!V&&(ie||fe!=a)||((E=fe).nodeType?z(le,fe,ie):ce(le,fe,ie));return E=null,be}];Q<$;Q++)if(k=r.relative[m[Q].type])ne=[rr(_s(ne),k)];else{if(k=r.filter[m[Q].type].apply(null,m[Q].matches),k[M]){for(L=++Q;L<$&&!r.relative[m[L].type];L++);return Es(Q>1&&_s(ne),Q>1&&nr(m.slice(0,Q-1).concat({value:m[Q-2].type===" "?"*":""})).replace(ye,"$1"),k,Q<L&&As(m.slice(Q,L)),L<$&&As(m=m.slice(L)),L<$&&nr(m))}ne.push(k)}return _s(ne)}function nc(m,E){var k=E.length>0,L=m.length>0,$=function(V,q,Q,z,ce){var ne,le,fe,ie=0,be="0",Ze=V&&[],Ue=[],ct=a,St=V||L&&r.find.TAG("*",ce),Bi=O+=ct==null?1:Math.random()||.1,Ke=St.length;for(ce&&(a=q==p||q||ce);be!==Ke&&(ne=St[be])!=null;be++){if(L&&ne){for(le=0,!q&&ne.ownerDocument!=p&&(Gt(ne),Q=!b);fe=m[le++];)if(fe(ne,q||p,Q)){h.call(z,ne);break}ce&&(O=Bi)}k&&((ne=!fe&&ne)&&ie--,V&&Ze.push(ne))}if(ie+=be,k&&be!==ie){for(le=0;fe=E[le++];)fe(Ze,Ue,q,Q);if(V){if(ie>0)for(;be--;)Ze[be]||Ue[be]||(Ue[be]=re.call(z));Ue=sr(Ue)}h.apply(z,Ue),ce&&!V&&Ue.length>0&&ie+E.length>1&&l.uniqueSort(z)}return ce&&(O=Bi,a=ct),Ze};return k?bt($):$}function Ts(m,E){var k,L=[],$=[],V=ue[m+" "];if(!V){for(E||(E=bn(m)),k=E.length;k--;)V=As(E[k]),V[M]?L.push(V):$.push(V);V=ue(m,nc($,L)),V.selector=m}return V}function fa(m,E,k,L){var $,V,q,Q,z,ce=typeof m=="function"&&m,ne=!L&&bn(m=ce.selector||m);if(k=k||[],ne.length===1){if(V=ne[0]=ne[0].slice(0),V.length>2&&(q=V[0]).type==="ID"&&E.nodeType===9&&b&&r.relative[V[1].type]){if(E=(r.find.ID(q.matches[0].replace($t,Mt),E)||[])[0],E)ce&&(E=E.parentNode);else return k;m=m.slice(V.shift().value.length)}for($=Ct.needsContext.test(m)?0:V.length;$--&&(q=V[$],!r.relative[Q=q.type]);)if((z=r.find[Q])&&(L=z(q.matches[0].replace($t,Mt),bs.test(V[0].type)&&ys(E.parentNode)||E))){if(V.splice($,1),m=L.length&&nr(V),!m)return h.apply(k,L),k;break}}return(ce||Ts(m,ne))(L,E,!b,k,!E||bs.test(m)&&ys(E.parentNode)||E),k}S.sortStable=M.split("").sort(Le).join("")===M,Gt(),S.sortDetached=ji(function(m){return m.compareDocumentPosition(p.createElement("fieldset"))&1}),l.find=ve,l.expr[":"]=l.expr.pseudos,l.unique=l.uniqueSort,ve.compile=Ts,ve.select=fa,ve.setDocument=Gt,ve.tokenize=bn,ve.escape=l.escapeSelector,ve.getText=l.text,ve.isXML=l.isXMLDoc,ve.selectors=l.expr,ve.support=l.support,ve.uniqueSort=l.uniqueSort})();var oe=function(n,r,a){for(var u=[],f=a!==void 0;(n=n[r])&&n.nodeType!==9;)if(n.nodeType===1){if(f&&l(n).is(a))break;u.push(n)}return u},de=function(n,r){for(var a=[];n;n=n.nextSibling)n.nodeType===1&&n!==r&&a.push(n);return a},Pe=l.expr.match.needsContext,we=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function Oe(n,r,a){return N(r)?l.grep(n,function(u,f){return!!r.call(u,f,u)!==a}):r.nodeType?l.grep(n,function(u){return u===r!==a}):typeof r!="string"?l.grep(n,function(u){return g.call(r,u)>-1!==a}):l.filter(r,n,a)}l.filter=function(n,r,a){var u=r[0];return a&&(n=":not("+n+")"),r.length===1&&u.nodeType===1?l.find.matchesSelector(u,n)?[u]:[]:l.find.matches(n,l.grep(r,function(f){return f.nodeType===1}))},l.fn.extend({find:function(n){var r,a,u=this.length,f=this;if(typeof n!="string")return this.pushStack(l(n).filter(function(){for(r=0;r<u;r++)if(l.contains(f[r],this))return!0}));for(a=this.pushStack([]),r=0;r<u;r++)l.find(n,f[r],a);return u>1?l.uniqueSort(a):a},filter:function(n){return this.pushStack(Oe(this,n||[],!1))},not:function(n){return this.pushStack(Oe(this,n||[],!0))},is:function(n){return!!Oe(this,typeof n=="string"&&Pe.test(n)?l(n):n||[],!1).length}});var Se,Ie=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Ae=l.fn.init=function(n,r,a){var u,f;if(!n)return this;if(a=a||Se,typeof n=="string")if(n[0]==="<"&&n[n.length-1]===">"&&n.length>=3?u=[null,n,null]:u=Ie.exec(n),u&&(u[1]||!r))if(u[1]){if(r=r instanceof l?r[0]:r,l.merge(this,l.parseHTML(u[1],r&&r.nodeType?r.ownerDocument||r:_,!0)),we.test(u[1])&&l.isPlainObject(r))for(u in r)N(this[u])?this[u](r[u]):this.attr(u,r[u]);return this}else return f=_.getElementById(u[2]),f&&(this[0]=f,this.length=1),this;else return!r||r.jquery?(r||a).find(n):this.constructor(r).find(n);else{if(n.nodeType)return this[0]=n,this.length=1,this;if(N(n))return a.ready!==void 0?a.ready(n):n(l)}return l.makeArray(n,this)};Ae.prototype=l.fn,Se=l(_);var Ge=/^(?:parents|prev(?:Until|All))/,it={children:!0,contents:!0,next:!0,prev:!0};l.fn.extend({has:function(n){var r=l(n,this),a=r.length;return this.filter(function(){for(var u=0;u<a;u++)if(l.contains(this,r[u]))return!0})},closest:function(n,r){var a,u=0,f=this.length,h=[],p=typeof n!="string"&&l(n);if(!Pe.test(n)){for(;u<f;u++)for(a=this[u];a&&a!==r;a=a.parentNode)if(a.nodeType<11&&(p?p.index(a)>-1:a.nodeType===1&&l.find.matchesSelector(a,n))){h.push(a);break}}return this.pushStack(h.length>1?l.uniqueSort(h):h)},index:function(n){return n?typeof n=="string"?g.call(l(n),this[0]):g.call(this,n.jquery?n[0]:n):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(n,r){return this.pushStack(l.uniqueSort(l.merge(this.get(),l(n,r))))},addBack:function(n){return this.add(n==null?this.prevObject:this.prevObject.filter(n))}});function qe(n,r){for(;(n=n[r])&&n.nodeType!==1;);return n}l.each({parent:function(n){var r=n.parentNode;return r&&r.nodeType!==11?r:null},parents:function(n){return oe(n,"parentNode")},parentsUntil:function(n,r,a){return oe(n,"parentNode",a)},next:function(n){return qe(n,"nextSibling")},prev:function(n){return qe(n,"previousSibling")},nextAll:function(n){return oe(n,"nextSibling")},prevAll:function(n){return oe(n,"previousSibling")},nextUntil:function(n,r,a){return oe(n,"nextSibling",a)},prevUntil:function(n,r,a){return oe(n,"previousSibling",a)},siblings:function(n){return de((n.parentNode||{}).firstChild,n)},children:function(n){return de(n.firstChild)},contents:function(n){return n.contentDocument!=null&&s(n.contentDocument)?n.contentDocument:(G(n,"template")&&(n=n.content||n),l.merge([],n.childNodes))}},function(n,r){l.fn[n]=function(a,u){var f=l.map(this,r,a);return n.slice(-5)!=="Until"&&(u=a),u&&typeof u=="string"&&(f=l.filter(u,f)),this.length>1&&(it[n]||l.uniqueSort(f),Ge.test(n)&&f.reverse()),this.pushStack(f)}});var Be=/[^\x20\t\r\n\f]+/g;function ui(n){var r={};return l.each(n.match(Be)||[],function(a,u){r[u]=!0}),r}l.Callbacks=function(n){n=typeof n=="string"?ui(n):l.extend({},n);var r,a,u,f,h=[],p=[],y=-1,b=function(){for(f=f||n.once,u=r=!0;p.length;y=-1)for(a=p.shift();++y<h.length;)h[y].apply(a[0],a[1])===!1&&n.stopOnFalse&&(y=h.length,a=!1);n.memory||(a=!1),r=!1,f&&(a?h=[]:h="")},w={add:function(){return h&&(a&&!r&&(y=h.length-1,p.push(a)),function P(M){l.each(M,function(O,U){N(U)?(!n.unique||!w.has(U))&&h.push(U):U&&U.length&&T(U)!=="string"&&P(U)})}(arguments),a&&!r&&b()),this},remove:function(){return l.each(arguments,function(P,M){for(var O;(O=l.inArray(M,h,O))>-1;)h.splice(O,1),O<=y&&y--}),this},has:function(P){return P?l.inArray(P,h)>-1:h.length>0},empty:function(){return h&&(h=[]),this},disable:function(){return f=p=[],h=a="",this},disabled:function(){return!h},lock:function(){return f=p=[],!a&&!r&&(h=a=""),this},locked:function(){return!!f},fireWith:function(P,M){return f||(M=M||[],M=[P,M.slice?M.slice():M],p.push(M),r||b()),this},fire:function(){return w.fireWith(this,arguments),this},fired:function(){return!!u}};return w};function At(n){return n}function Pi(n){throw n}function ln(n,r,a,u){var f;try{n&&N(f=n.promise)?f.call(n).done(r).fail(a):n&&N(f=n.then)?f.call(n,r,a):r.apply(void 0,[n].slice(u))}catch(h){a.apply(void 0,[h])}}l.extend({Deferred:function(n){var r=[["notify","progress",l.Callbacks("memory"),l.Callbacks("memory"),2],["resolve","done",l.Callbacks("once memory"),l.Callbacks("once memory"),0,"resolved"],["reject","fail",l.Callbacks("once memory"),l.Callbacks("once memory"),1,"rejected"]],a="pending",u={state:function(){return a},always:function(){return f.done(arguments).fail(arguments),this},catch:function(h){return u.then(null,h)},pipe:function(){var h=arguments;return l.Deferred(function(p){l.each(r,function(y,b){var w=N(h[b[4]])&&h[b[4]];f[b[1]](function(){var P=w&&w.apply(this,arguments);P&&N(P.promise)?P.promise().progress(p.notify).done(p.resolve).fail(p.reject):p[b[0]+"With"](this,w?[P]:arguments)})}),h=null}).promise()},then:function(h,p,y){var b=0;function w(P,M,O,U){return function(){var ae=this,pe=arguments,ue=function(){var Le,Tt;if(!(P<b)){if(Le=O.apply(ae,pe),Le===M.promise())throw new TypeError("Thenable self-resolution");Tt=Le&&(typeof Le=="object"||typeof Le=="function")&&Le.then,N(Tt)?U?Tt.call(Le,w(b,M,At,U),w(b,M,Pi,U)):(b++,Tt.call(Le,w(b,M,At,U),w(b,M,Pi,U),w(b,M,At,M.notifyWith))):(O!==At&&(ae=void 0,pe=[Le]),(U||M.resolveWith)(ae,pe))}},He=U?ue:function(){try{ue()}catch(Le){l.Deferred.exceptionHook&&l.Deferred.exceptionHook(Le,He.error),P+1>=b&&(O!==Pi&&(ae=void 0,pe=[Le]),M.rejectWith(ae,pe))}};P?He():(l.Deferred.getErrorHook?He.error=l.Deferred.getErrorHook():l.Deferred.getStackHook&&(He.error=l.Deferred.getStackHook()),t.setTimeout(He))}}return l.Deferred(function(P){r[0][3].add(w(0,P,N(y)?y:At,P.notifyWith)),r[1][3].add(w(0,P,N(h)?h:At)),r[2][3].add(w(0,P,N(p)?p:Pi))}).promise()},promise:function(h){return h!=null?l.extend(h,u):u}},f={};return l.each(r,function(h,p){var y=p[2],b=p[5];u[p[1]]=y.add,b&&y.add(function(){a=b},r[3-h][2].disable,r[3-h][3].disable,r[0][2].lock,r[0][3].lock),y.add(p[3].fire),f[p[0]]=function(){return f[p[0]+"With"](this===f?void 0:this,arguments),this},f[p[0]+"With"]=y.fireWith}),u.promise(f),n&&n.call(f,f),f},when:function(n){var r=arguments.length,a=r,u=Array(a),f=o.call(arguments),h=l.Deferred(),p=function(y){return function(b){u[y]=this,f[y]=arguments.length>1?o.call(arguments):b,--r||h.resolveWith(u,f)}};if(r<=1&&(ln(n,h.done(p(a)).resolve,h.reject,!r),h.state()==="pending"||N(f[a]&&f[a].then)))return h.then();for(;a--;)ln(f[a],p(a),h.reject);return h.promise()}});var es=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;l.Deferred.exceptionHook=function(n,r){t.console&&t.console.warn&&n&&es.test(n.name)&&t.console.warn("jQuery.Deferred exception: "+n.message,n.stack,r)},l.readyException=function(n){t.setTimeout(function(){throw n})};var un=l.Deferred();l.fn.ready=function(n){return un.then(n).catch(function(r){l.readyException(r)}),this},l.extend({isReady:!1,readyWait:1,ready:function(n){(n===!0?--l.readyWait:l.isReady)||(l.isReady=!0,!(n!==!0&&--l.readyWait>0)&&un.resolveWith(_,[l]))}}),l.ready.then=un.then;function ci(){_.removeEventListener("DOMContentLoaded",ci),t.removeEventListener("load",ci),l.ready()}_.readyState==="complete"||_.readyState!=="loading"&&!_.documentElement.doScroll?t.setTimeout(l.ready):(_.addEventListener("DOMContentLoaded",ci),t.addEventListener("load",ci));var at=function(n,r,a,u,f,h,p){var y=0,b=n.length,w=a==null;if(T(a)==="object"){f=!0;for(y in a)at(n,r,y,a[y],!0,h,p)}else if(u!==void 0&&(f=!0,N(u)||(p=!0),w&&(p?(r.call(n,u),r=null):(w=r,r=function(P,M,O){return w.call(l(P),O)})),r))for(;y<b;y++)r(n[y],a,p?u:u.call(n[y],y,r(n[y],a)));return f?n:w?r.call(n):b?r(n[0],a):h},ts=/^-ms-/,is=/-([a-z])/g;function It(n,r){return r.toUpperCase()}function ze(n){return n.replace(ts,"ms-").replace(is,It)}var zt=function(n){return n.nodeType===1||n.nodeType===9||!+n.nodeType};function Kt(){this.expando=l.expando+Kt.uid++}Kt.uid=1,Kt.prototype={cache:function(n){var r=n[this.expando];return r||(r={},zt(n)&&(n.nodeType?n[this.expando]=r:Object.defineProperty(n,this.expando,{value:r,configurable:!0}))),r},set:function(n,r,a){var u,f=this.cache(n);if(typeof r=="string")f[ze(r)]=a;else for(u in r)f[ze(u)]=r[u];return f},get:function(n,r){return r===void 0?this.cache(n):n[this.expando]&&n[this.expando][ze(r)]},access:function(n,r,a){return r===void 0||r&&typeof r=="string"&&a===void 0?this.get(n,r):(this.set(n,r,a),a!==void 0?a:r)},remove:function(n,r){var a,u=n[this.expando];if(u!==void 0){if(r!==void 0)for(Array.isArray(r)?r=r.map(ze):(r=ze(r),r=r in u?[r]:r.match(Be)||[]),a=r.length;a--;)delete u[r[a]];(r===void 0||l.isEmptyObject(u))&&(n.nodeType?n[this.expando]=void 0:delete n[this.expando])}},hasData:function(n){var r=n[this.expando];return r!==void 0&&!l.isEmptyObject(r)}};var J=new Kt,Me=new Kt,Xn=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Yn=/[A-Z]/g;function Gn(n){return n==="true"?!0:n==="false"?!1:n==="null"?null:n===+n+""?+n:Xn.test(n)?JSON.parse(n):n}function No(n,r,a){var u;if(a===void 0&&n.nodeType===1)if(u="data-"+r.replace(Yn,"-$&").toLowerCase(),a=n.getAttribute(u),typeof a=="string"){try{a=Gn(a)}catch{}Me.set(n,r,a)}else a=void 0;return a}l.extend({hasData:function(n){return Me.hasData(n)||J.hasData(n)},data:function(n,r,a){return Me.access(n,r,a)},removeData:function(n,r){Me.remove(n,r)},_data:function(n,r,a){return J.access(n,r,a)},_removeData:function(n,r){J.remove(n,r)}}),l.fn.extend({data:function(n,r){var a,u,f,h=this[0],p=h&&h.attributes;if(n===void 0){if(this.length&&(f=Me.get(h),h.nodeType===1&&!J.get(h,"hasDataAttrs"))){for(a=p.length;a--;)p[a]&&(u=p[a].name,u.indexOf("data-")===0&&(u=ze(u.slice(5)),No(h,u,f[u])));J.set(h,"hasDataAttrs",!0)}return f}return typeof n=="object"?this.each(function(){Me.set(this,n)}):at(this,function(y){var b;if(h&&y===void 0)return b=Me.get(h,n),b!==void 0||(b=No(h,n),b!==void 0)?b:void 0;this.each(function(){Me.set(this,n,y)})},null,r,arguments.length>1,null,!0)},removeData:function(n){return this.each(function(){Me.remove(this,n)})}}),l.extend({queue:function(n,r,a){var u;if(n)return r=(r||"fx")+"queue",u=J.get(n,r),a&&(!u||Array.isArray(a)?u=J.access(n,r,l.makeArray(a)):u.push(a)),u||[]},dequeue:function(n,r){r=r||"fx";var a=l.queue(n,r),u=a.length,f=a.shift(),h=l._queueHooks(n,r),p=function(){l.dequeue(n,r)};f==="inprogress"&&(f=a.shift(),u--),f&&(r==="fx"&&a.unshift("inprogress"),delete h.stop,f.call(n,p,h)),!u&&h&&h.empty.fire()},_queueHooks:function(n,r){var a=r+"queueHooks";return J.get(n,a)||J.access(n,a,{empty:l.Callbacks("once memory").add(function(){J.remove(n,[r+"queue",a])})})}}),l.fn.extend({queue:function(n,r){var a=2;return typeof n!="string"&&(r=n,n="fx",a--),arguments.length<a?l.queue(this[0],n):r===void 0?this:this.each(function(){var u=l.queue(this,n,r);l._queueHooks(this,n),n==="fx"&&u[0]!=="inprogress"&&l.dequeue(this,n)})},dequeue:function(n){return this.each(function(){l.dequeue(this,n)})},clearQueue:function(n){return this.queue(n||"fx",[])},promise:function(n,r){var a,u=1,f=l.Deferred(),h=this,p=this.length,y=function(){--u||f.resolveWith(h,[h])};for(typeof n!="string"&&(r=n,n=void 0),n=n||"fx";p--;)a=J.get(h[p],n+"queueHooks"),a&&a.empty&&(u++,a.empty.add(y));return y(),f.promise(r)}});var Po=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,cn=new RegExp("^(?:([+-])=|)("+Po+")([a-z%]*)$","i"),Rt=["Top","Right","Bottom","Left"],fi=_.documentElement,Ii=function(n){return l.contains(n.ownerDocument,n)},gu={composed:!0};fi.getRootNode&&(Ii=function(n){return l.contains(n.ownerDocument,n)||n.getRootNode(gu)===n.ownerDocument});var Jn=function(n,r){return n=r||n,n.style.display==="none"||n.style.display===""&&Ii(n)&&l.css(n,"display")==="none"};function Io(n,r,a,u){var f,h,p=20,y=u?function(){return u.cur()}:function(){return l.css(n,r,"")},b=y(),w=a&&a[3]||(l.cssNumber[r]?"":"px"),P=n.nodeType&&(l.cssNumber[r]||w!=="px"&&+b)&&cn.exec(l.css(n,r));if(P&&P[3]!==w){for(b=b/2,w=w||P[3],P=+b||1;p--;)l.style(n,r,P+w),(1-h)*(1-(h=y()/b||.5))<=0&&(p=0),P=P/h;P=P*2,l.style(n,r,P+w),a=a||[]}return a&&(P=+P||+b||0,f=a[1]?P+(a[1]+1)*a[2]:+a[2],u&&(u.unit=w,u.start=P,u.end=f)),f}var Ro={};function mu(n){var r,a=n.ownerDocument,u=n.nodeName,f=Ro[u];return f||(r=a.body.appendChild(a.createElement(u)),f=l.css(r,"display"),r.parentNode.removeChild(r),f==="none"&&(f="block"),Ro[u]=f,f)}function Ri(n,r){for(var a,u,f=[],h=0,p=n.length;h<p;h++)u=n[h],u.style&&(a=u.style.display,r?(a==="none"&&(f[h]=J.get(u,"display")||null,f[h]||(u.style.display="")),u.style.display===""&&Jn(u)&&(f[h]=mu(u))):a!=="none"&&(f[h]="none",J.set(u,"display",a)));for(h=0;h<p;h++)f[h]!=null&&(n[h].style.display=f[h]);return n}l.fn.extend({show:function(){return Ri(this,!0)},hide:function(){return Ri(this)},toggle:function(n){return typeof n=="boolean"?n?this.show():this.hide():this.each(function(){Jn(this)?l(this).show():l(this).hide()})}});var fn=/^(?:checkbox|radio)$/i,$o=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,Mo=/^$|^module$|\/(?:java|ecma)script/i;(function(){var n=_.createDocumentFragment(),r=n.appendChild(_.createElement("div")),a=_.createElement("input");a.setAttribute("type","radio"),a.setAttribute("checked","checked"),a.setAttribute("name","t"),r.appendChild(a),S.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,r.innerHTML="<textarea>x</textarea>",S.noCloneChecked=!!r.cloneNode(!0).lastChild.defaultValue,r.innerHTML="<option></option>",S.option=!!r.lastChild})();var lt={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};lt.tbody=lt.tfoot=lt.colgroup=lt.caption=lt.thead,lt.th=lt.td,S.option||(lt.optgroup=lt.option=[1,"<select multiple='multiple'>","</select>"]);function Je(n,r){var a;return typeof n.getElementsByTagName<"u"?a=n.getElementsByTagName(r||"*"):typeof n.querySelectorAll<"u"?a=n.querySelectorAll(r||"*"):a=[],r===void 0||r&&G(n,r)?l.merge([n],a):a}function ns(n,r){for(var a=0,u=n.length;a<u;a++)J.set(n[a],"globalEval",!r||J.get(r[a],"globalEval"))}var vu=/<|&#?\w+;/;function Ho(n,r,a,u,f){for(var h,p,y,b,w,P,M=r.createDocumentFragment(),O=[],U=0,ae=n.length;U<ae;U++)if(h=n[U],h||h===0)if(T(h)==="object")l.merge(O,h.nodeType?[h]:h);else if(!vu.test(h))O.push(r.createTextNode(h));else{for(p=p||M.appendChild(r.createElement("div")),y=($o.exec(h)||["",""])[1].toLowerCase(),b=lt[y]||lt._default,p.innerHTML=b[1]+l.htmlPrefilter(h)+b[2],P=b[0];P--;)p=p.lastChild;l.merge(O,p.childNodes),p=M.firstChild,p.textContent=""}for(M.textContent="",U=0;h=O[U++];){if(u&&l.inArray(h,u)>-1){f&&f.push(h);continue}if(w=Ii(h),p=Je(M.appendChild(h),"script"),w&&ns(p),a)for(P=0;h=p[P++];)Mo.test(h.type||"")&&a.push(h)}return M}var Fo=/^([^.]*)(?:\.(.+)|)/;function $i(){return!0}function Mi(){return!1}function rs(n,r,a,u,f,h){var p,y;if(typeof r=="object"){typeof a!="string"&&(u=u||a,a=void 0);for(y in r)rs(n,y,a,u,r[y],h);return n}if(u==null&&f==null?(f=a,u=a=void 0):f==null&&(typeof a=="string"?(f=u,u=void 0):(f=u,u=a,a=void 0)),f===!1)f=Mi;else if(!f)return n;return h===1&&(p=f,f=function(b){return l().off(b),p.apply(this,arguments)},f.guid=p.guid||(p.guid=l.guid++)),n.each(function(){l.event.add(this,r,f,u,a)})}l.event={global:{},add:function(n,r,a,u,f){var h,p,y,b,w,P,M,O,U,ae,pe,ue=J.get(n);if(zt(n))for(a.handler&&(h=a,a=h.handler,f=h.selector),f&&l.find.matchesSelector(fi,f),a.guid||(a.guid=l.guid++),(b=ue.events)||(b=ue.events=Object.create(null)),(p=ue.handle)||(p=ue.handle=function(He){return typeof l<"u"&&l.event.triggered!==He.type?l.event.dispatch.apply(n,arguments):void 0}),r=(r||"").match(Be)||[""],w=r.length;w--;)y=Fo.exec(r[w])||[],U=pe=y[1],ae=(y[2]||"").split(".").sort(),U&&(M=l.event.special[U]||{},U=(f?M.delegateType:M.bindType)||U,M=l.event.special[U]||{},P=l.extend({type:U,origType:pe,data:u,handler:a,guid:a.guid,selector:f,needsContext:f&&l.expr.match.needsContext.test(f),namespace:ae.join(".")},h),(O=b[U])||(O=b[U]=[],O.delegateCount=0,(!M.setup||M.setup.call(n,u,ae,p)===!1)&&n.addEventListener&&n.addEventListener(U,p)),M.add&&(M.add.call(n,P),P.handler.guid||(P.handler.guid=a.guid)),f?O.splice(O.delegateCount++,0,P):O.push(P),l.event.global[U]=!0)},remove:function(n,r,a,u,f){var h,p,y,b,w,P,M,O,U,ae,pe,ue=J.hasData(n)&&J.get(n);if(!(!ue||!(b=ue.events))){for(r=(r||"").match(Be)||[""],w=r.length;w--;){if(y=Fo.exec(r[w])||[],U=pe=y[1],ae=(y[2]||"").split(".").sort(),!U){for(U in b)l.event.remove(n,U+r[w],a,u,!0);continue}for(M=l.event.special[U]||{},U=(u?M.delegateType:M.bindType)||U,O=b[U]||[],y=y[2]&&new RegExp("(^|\\.)"+ae.join("\\.(?:.*\\.|)")+"(\\.|$)"),p=h=O.length;h--;)P=O[h],(f||pe===P.origType)&&(!a||a.guid===P.guid)&&(!y||y.test(P.namespace))&&(!u||u===P.selector||u==="**"&&P.selector)&&(O.splice(h,1),P.selector&&O.delegateCount--,M.remove&&M.remove.call(n,P));p&&!O.length&&((!M.teardown||M.teardown.call(n,ae,ue.handle)===!1)&&l.removeEvent(n,U,ue.handle),delete b[U])}l.isEmptyObject(b)&&J.remove(n,"handle events")}},dispatch:function(n){var r,a,u,f,h,p,y=new Array(arguments.length),b=l.event.fix(n),w=(J.get(this,"events")||Object.create(null))[b.type]||[],P=l.event.special[b.type]||{};for(y[0]=b,r=1;r<arguments.length;r++)y[r]=arguments[r];if(b.delegateTarget=this,!(P.preDispatch&&P.preDispatch.call(this,b)===!1)){for(p=l.event.handlers.call(this,b,w),r=0;(f=p[r++])&&!b.isPropagationStopped();)for(b.currentTarget=f.elem,a=0;(h=f.handlers[a++])&&!b.isImmediatePropagationStopped();)(!b.rnamespace||h.namespace===!1||b.rnamespace.test(h.namespace))&&(b.handleObj=h,b.data=h.data,u=((l.event.special[h.origType]||{}).handle||h.handler).apply(f.elem,y),u!==void 0&&(b.result=u)===!1&&(b.preventDefault(),b.stopPropagation()));return P.postDispatch&&P.postDispatch.call(this,b),b.result}},handlers:function(n,r){var a,u,f,h,p,y=[],b=r.delegateCount,w=n.target;if(b&&w.nodeType&&!(n.type==="click"&&n.button>=1)){for(;w!==this;w=w.parentNode||this)if(w.nodeType===1&&!(n.type==="click"&&w.disabled===!0)){for(h=[],p={},a=0;a<b;a++)u=r[a],f=u.selector+" ",p[f]===void 0&&(p[f]=u.needsContext?l(f,this).index(w)>-1:l.find(f,this,null,[w]).length),p[f]&&h.push(u);h.length&&y.push({elem:w,handlers:h})}}return w=this,b<r.length&&y.push({elem:w,handlers:r.slice(b)}),y},addProp:function(n,r){Object.defineProperty(l.Event.prototype,n,{enumerable:!0,configurable:!0,get:N(r)?function(){if(this.originalEvent)return r(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[n]},set:function(a){Object.defineProperty(this,n,{enumerable:!0,configurable:!0,writable:!0,value:a})}})},fix:function(n){return n[l.expando]?n:new l.Event(n)},special:{load:{noBubble:!0},click:{setup:function(n){var r=this||n;return fn.test(r.type)&&r.click&&G(r,"input")&&Qn(r,"click",!0),!1},trigger:function(n){var r=this||n;return fn.test(r.type)&&r.click&&G(r,"input")&&Qn(r,"click"),!0},_default:function(n){var r=n.target;return fn.test(r.type)&&r.click&&G(r,"input")&&J.get(r,"click")||G(r,"a")}},beforeunload:{postDispatch:function(n){n.result!==void 0&&n.originalEvent&&(n.originalEvent.returnValue=n.result)}}}};function Qn(n,r,a){if(!a){J.get(n,r)===void 0&&l.event.add(n,r,$i);return}J.set(n,r,!1),l.event.add(n,r,{namespace:!1,handler:function(u){var f,h=J.get(this,r);if(u.isTrigger&1&&this[r]){if(h)(l.event.special[r]||{}).delegateType&&u.stopPropagation();else if(h=o.call(arguments),J.set(this,r,h),this[r](),f=J.get(this,r),J.set(this,r,!1),h!==f)return u.stopImmediatePropagation(),u.preventDefault(),f}else h&&(J.set(this,r,l.event.trigger(h[0],h.slice(1),this)),u.stopPropagation(),u.isImmediatePropagationStopped=$i)}})}l.removeEvent=function(n,r,a){n.removeEventListener&&n.removeEventListener(r,a)},l.Event=function(n,r){if(!(this instanceof l.Event))return new l.Event(n,r);n&&n.type?(this.originalEvent=n,this.type=n.type,this.isDefaultPrevented=n.defaultPrevented||n.defaultPrevented===void 0&&n.returnValue===!1?$i:Mi,this.target=n.target&&n.target.nodeType===3?n.target.parentNode:n.target,this.currentTarget=n.currentTarget,this.relatedTarget=n.relatedTarget):this.type=n,r&&l.extend(this,r),this.timeStamp=n&&n.timeStamp||Date.now(),this[l.expando]=!0},l.Event.prototype={constructor:l.Event,isDefaultPrevented:Mi,isPropagationStopped:Mi,isImmediatePropagationStopped:Mi,isSimulated:!1,preventDefault:function(){var n=this.originalEvent;this.isDefaultPrevented=$i,n&&!this.isSimulated&&n.preventDefault()},stopPropagation:function(){var n=this.originalEvent;this.isPropagationStopped=$i,n&&!this.isSimulated&&n.stopPropagation()},stopImmediatePropagation:function(){var n=this.originalEvent;this.isImmediatePropagationStopped=$i,n&&!this.isSimulated&&n.stopImmediatePropagation(),this.stopPropagation()}},l.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},l.event.addProp),l.each({focus:"focusin",blur:"focusout"},function(n,r){function a(u){if(_.documentMode){var f=J.get(this,"handle"),h=l.event.fix(u);h.type=u.type==="focusin"?"focus":"blur",h.isSimulated=!0,f(u),h.target===h.currentTarget&&f(h)}else l.event.simulate(r,u.target,l.event.fix(u))}l.event.special[n]={setup:function(){var u;if(Qn(this,n,!0),_.documentMode)u=J.get(this,r),u||this.addEventListener(r,a),J.set(this,r,(u||0)+1);else return!1},trigger:function(){return Qn(this,n),!0},teardown:function(){var u;if(_.documentMode)u=J.get(this,r)-1,u?J.set(this,r,u):(this.removeEventListener(r,a),J.remove(this,r));else return!1},_default:function(u){return J.get(u.target,n)},delegateType:r},l.event.special[r]={setup:function(){var u=this.ownerDocument||this.document||this,f=_.documentMode?this:u,h=J.get(f,r);h||(_.documentMode?this.addEventListener(r,a):u.addEventListener(n,a,!0)),J.set(f,r,(h||0)+1)},teardown:function(){var u=this.ownerDocument||this.document||this,f=_.documentMode?this:u,h=J.get(f,r)-1;h?J.set(f,r,h):(_.documentMode?this.removeEventListener(r,a):u.removeEventListener(n,a,!0),J.remove(f,r))}}}),l.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(n,r){l.event.special[n]={delegateType:r,bindType:r,handle:function(a){var u,f=this,h=a.relatedTarget,p=a.handleObj;return(!h||h!==f&&!l.contains(f,h))&&(a.type=p.origType,u=p.handler.apply(this,arguments),a.type=r),u}}}),l.fn.extend({on:function(n,r,a,u){return rs(this,n,r,a,u)},one:function(n,r,a,u){return rs(this,n,r,a,u,1)},off:function(n,r,a){var u,f;if(n&&n.preventDefault&&n.handleObj)return u=n.handleObj,l(n.delegateTarget).off(u.namespace?u.origType+"."+u.namespace:u.origType,u.selector,u.handler),this;if(typeof n=="object"){for(f in n)this.off(f,r,n[f]);return this}return(r===!1||typeof r=="function")&&(a=r,r=void 0),a===!1&&(a=Mi),this.each(function(){l.event.remove(this,n,a,r)})}});var bu=/<script|<style|<link/i,yu=/checked\s*(?:[^=]|=\s*.checked.)/i,_u=/^\s*<!\[CDATA\[|\]\]>\s*$/g;function jo(n,r){return G(n,"table")&&G(r.nodeType!==11?r:r.firstChild,"tr")&&l(n).children("tbody")[0]||n}function Eu(n){return n.type=(n.getAttribute("type")!==null)+"/"+n.type,n}function Au(n){return(n.type||"").slice(0,5)==="true/"?n.type=n.type.slice(5):n.removeAttribute("type"),n}function Bo(n,r){var a,u,f,h,p,y,b;if(r.nodeType===1){if(J.hasData(n)&&(h=J.get(n),b=h.events,b)){J.remove(r,"handle events");for(f in b)for(a=0,u=b[f].length;a<u;a++)l.event.add(r,f,b[f][a])}Me.hasData(n)&&(p=Me.access(n),y=l.extend({},p),Me.set(r,y))}}function Tu(n,r){var a=r.nodeName.toLowerCase();a==="input"&&fn.test(n.type)?r.checked=n.checked:(a==="input"||a==="textarea")&&(r.defaultValue=n.defaultValue)}function Hi(n,r,a,u){r=c(r);var f,h,p,y,b,w,P=0,M=n.length,O=M-1,U=r[0],ae=N(U);if(ae||M>1&&typeof U=="string"&&!S.checkClone&&yu.test(U))return n.each(function(pe){var ue=n.eq(pe);ae&&(r[0]=U.call(this,pe,ue.html())),Hi(ue,r,a,u)});if(M&&(f=Ho(r,n[0].ownerDocument,!1,n,u),h=f.firstChild,f.childNodes.length===1&&(f=h),h||u)){for(p=l.map(Je(f,"script"),Eu),y=p.length;P<M;P++)b=f,P!==O&&(b=l.clone(b,!0,!0),y&&l.merge(p,Je(b,"script"))),a.call(n[P],b,P);if(y)for(w=p[p.length-1].ownerDocument,l.map(p,Au),P=0;P<y;P++)b=p[P],Mo.test(b.type||"")&&!J.access(b,"globalEval")&&l.contains(w,b)&&(b.src&&(b.type||"").toLowerCase()!=="module"?l._evalUrl&&!b.noModule&&l._evalUrl(b.src,{nonce:b.nonce||b.getAttribute("nonce")},w):F(b.textContent.replace(_u,""),b,w))}return n}function Uo(n,r,a){for(var u,f=r?l.filter(r,n):n,h=0;(u=f[h])!=null;h++)!a&&u.nodeType===1&&l.cleanData(Je(u)),u.parentNode&&(a&&Ii(u)&&ns(Je(u,"script")),u.parentNode.removeChild(u));return n}l.extend({htmlPrefilter:function(n){return n},clone:function(n,r,a){var u,f,h,p,y=n.cloneNode(!0),b=Ii(n);if(!S.noCloneChecked&&(n.nodeType===1||n.nodeType===11)&&!l.isXMLDoc(n))for(p=Je(y),h=Je(n),u=0,f=h.length;u<f;u++)Tu(h[u],p[u]);if(r)if(a)for(h=h||Je(n),p=p||Je(y),u=0,f=h.length;u<f;u++)Bo(h[u],p[u]);else Bo(n,y);return p=Je(y,"script"),p.length>0&&ns(p,!b&&Je(n,"script")),y},cleanData:function(n){for(var r,a,u,f=l.event.special,h=0;(a=n[h])!==void 0;h++)if(zt(a)){if(r=a[J.expando]){if(r.events)for(u in r.events)f[u]?l.event.remove(a,u):l.removeEvent(a,u,r.handle);a[J.expando]=void 0}a[Me.expando]&&(a[Me.expando]=void 0)}}}),l.fn.extend({detach:function(n){return Uo(this,n,!0)},remove:function(n){return Uo(this,n)},text:function(n){return at(this,function(r){return r===void 0?l.text(this):this.empty().each(function(){(this.nodeType===1||this.nodeType===11||this.nodeType===9)&&(this.textContent=r)})},null,n,arguments.length)},append:function(){return Hi(this,arguments,function(n){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var r=jo(this,n);r.appendChild(n)}})},prepend:function(){return Hi(this,arguments,function(n){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var r=jo(this,n);r.insertBefore(n,r.firstChild)}})},before:function(){return Hi(this,arguments,function(n){this.parentNode&&this.parentNode.insertBefore(n,this)})},after:function(){return Hi(this,arguments,function(n){this.parentNode&&this.parentNode.insertBefore(n,this.nextSibling)})},empty:function(){for(var n,r=0;(n=this[r])!=null;r++)n.nodeType===1&&(l.cleanData(Je(n,!1)),n.textContent="");return this},clone:function(n,r){return n=n??!1,r=r??n,this.map(function(){return l.clone(this,n,r)})},html:function(n){return at(this,function(r){var a=this[0]||{},u=0,f=this.length;if(r===void 0&&a.nodeType===1)return a.innerHTML;if(typeof r=="string"&&!bu.test(r)&&!lt[($o.exec(r)||["",""])[1].toLowerCase()]){r=l.htmlPrefilter(r);try{for(;u<f;u++)a=this[u]||{},a.nodeType===1&&(l.cleanData(Je(a,!1)),a.innerHTML=r);a=0}catch{}}a&&this.empty().append(r)},null,n,arguments.length)},replaceWith:function(){var n=[];return Hi(this,arguments,function(r){var a=this.parentNode;l.inArray(this,n)<0&&(l.cleanData(Je(this)),a&&a.replaceChild(r,this))},n)}}),l.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(n,r){l.fn[n]=function(a){for(var u,f=[],h=l(a),p=h.length-1,y=0;y<=p;y++)u=y===p?this:this.clone(!0),l(h[y])[r](u),d.apply(f,u.get());return this.pushStack(f)}});var ss=new RegExp("^("+Po+")(?!px)[a-z%]+$","i"),os=/^--/,Zn=function(n){var r=n.ownerDocument.defaultView;return(!r||!r.opener)&&(r=t),r.getComputedStyle(n)},Vo=function(n,r,a){var u,f,h={};for(f in r)h[f]=n.style[f],n.style[f]=r[f];u=a.call(n);for(f in r)n.style[f]=h[f];return u},wu=new RegExp(Rt.join("|"),"i");(function(){function n(){if(w){b.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",w.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",fi.appendChild(b).appendChild(w);var P=t.getComputedStyle(w);a=P.top!=="1%",y=r(P.marginLeft)===12,w.style.right="60%",h=r(P.right)===36,u=r(P.width)===36,w.style.position="absolute",f=r(w.offsetWidth/3)===12,fi.removeChild(b),w=null}}function r(P){return Math.round(parseFloat(P))}var a,u,f,h,p,y,b=_.createElement("div"),w=_.createElement("div");w.style&&(w.style.backgroundClip="content-box",w.cloneNode(!0).style.backgroundClip="",S.clearCloneStyle=w.style.backgroundClip==="content-box",l.extend(S,{boxSizingReliable:function(){return n(),u},pixelBoxStyles:function(){return n(),h},pixelPosition:function(){return n(),a},reliableMarginLeft:function(){return n(),y},scrollboxSize:function(){return n(),f},reliableTrDimensions:function(){var P,M,O,U;return p==null&&(P=_.createElement("table"),M=_.createElement("tr"),O=_.createElement("div"),P.style.cssText="position:absolute;left:-11111px;border-collapse:separate",M.style.cssText="box-sizing:content-box;border:1px solid",M.style.height="1px",O.style.height="9px",O.style.display="block",fi.appendChild(P).appendChild(M).appendChild(O),U=t.getComputedStyle(M),p=parseInt(U.height,10)+parseInt(U.borderTopWidth,10)+parseInt(U.borderBottomWidth,10)===M.offsetHeight,fi.removeChild(P)),p}}))})();function hn(n,r,a){var u,f,h,p,y=os.test(r),b=n.style;return a=a||Zn(n),a&&(p=a.getPropertyValue(r)||a[r],y&&p&&(p=p.replace(ye,"$1")||void 0),p===""&&!Ii(n)&&(p=l.style(n,r)),!S.pixelBoxStyles()&&ss.test(p)&&wu.test(r)&&(u=b.width,f=b.minWidth,h=b.maxWidth,b.minWidth=b.maxWidth=b.width=p,p=a.width,b.width=u,b.minWidth=f,b.maxWidth=h)),p!==void 0?p+"":p}function Wo(n,r){return{get:function(){if(n()){delete this.get;return}return(this.get=r).apply(this,arguments)}}}var qo=["Webkit","Moz","ms"],zo=_.createElement("div").style,Ko={};function xu(n){for(var r=n[0].toUpperCase()+n.slice(1),a=qo.length;a--;)if(n=qo[a]+r,n in zo)return n}function as(n){var r=l.cssProps[n]||Ko[n];return r||(n in zo?n:Ko[n]=xu(n)||n)}var Cu=/^(none|table(?!-c[ea]).+)/,Su={position:"absolute",visibility:"hidden",display:"block"},Xo={letterSpacing:"0",fontWeight:"400"};function Yo(n,r,a){var u=cn.exec(r);return u?Math.max(0,u[2]-(a||0))+(u[3]||"px"):r}function ls(n,r,a,u,f,h){var p=r==="width"?1:0,y=0,b=0,w=0;if(a===(u?"border":"content"))return 0;for(;p<4;p+=2)a==="margin"&&(w+=l.css(n,a+Rt[p],!0,f)),u?(a==="content"&&(b-=l.css(n,"padding"+Rt[p],!0,f)),a!=="margin"&&(b-=l.css(n,"border"+Rt[p]+"Width",!0,f))):(b+=l.css(n,"padding"+Rt[p],!0,f),a!=="padding"?b+=l.css(n,"border"+Rt[p]+"Width",!0,f):y+=l.css(n,"border"+Rt[p]+"Width",!0,f));return!u&&h>=0&&(b+=Math.max(0,Math.ceil(n["offset"+r[0].toUpperCase()+r.slice(1)]-h-b-y-.5))||0),b+w}function Go(n,r,a){var u=Zn(n),f=!S.boxSizingReliable()||a,h=f&&l.css(n,"boxSizing",!1,u)==="border-box",p=h,y=hn(n,r,u),b="offset"+r[0].toUpperCase()+r.slice(1);if(ss.test(y)){if(!a)return y;y="auto"}return(!S.boxSizingReliable()&&h||!S.reliableTrDimensions()&&G(n,"tr")||y==="auto"||!parseFloat(y)&&l.css(n,"display",!1,u)==="inline")&&n.getClientRects().length&&(h=l.css(n,"boxSizing",!1,u)==="border-box",p=b in n,p&&(y=n[b])),y=parseFloat(y)||0,y+ls(n,r,a||(h?"border":"content"),p,u,y)+"px"}l.extend({cssHooks:{opacity:{get:function(n,r){if(r){var a=hn(n,"opacity");return a===""?"1":a}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(n,r,a,u){if(!(!n||n.nodeType===3||n.nodeType===8||!n.style)){var f,h,p,y=ze(r),b=os.test(r),w=n.style;if(b||(r=as(y)),p=l.cssHooks[r]||l.cssHooks[y],a!==void 0){if(h=typeof a,h==="string"&&(f=cn.exec(a))&&f[1]&&(a=Io(n,r,f),h="number"),a==null||a!==a)return;h==="number"&&!b&&(a+=f&&f[3]||(l.cssNumber[y]?"":"px")),!S.clearCloneStyle&&a===""&&r.indexOf("background")===0&&(w[r]="inherit"),(!p||!("set"in p)||(a=p.set(n,a,u))!==void 0)&&(b?w.setProperty(r,a):w[r]=a)}else return p&&"get"in p&&(f=p.get(n,!1,u))!==void 0?f:w[r]}},css:function(n,r,a,u){var f,h,p,y=ze(r),b=os.test(r);return b||(r=as(y)),p=l.cssHooks[r]||l.cssHooks[y],p&&"get"in p&&(f=p.get(n,!0,a)),f===void 0&&(f=hn(n,r,u)),f==="normal"&&r in Xo&&(f=Xo[r]),a===""||a?(h=parseFloat(f),a===!0||isFinite(h)?h||0:f):f}}),l.each(["height","width"],function(n,r){l.cssHooks[r]={get:function(a,u,f){if(u)return Cu.test(l.css(a,"display"))&&(!a.getClientRects().length||!a.getBoundingClientRect().width)?Vo(a,Su,function(){return Go(a,r,f)}):Go(a,r,f)},set:function(a,u,f){var h,p=Zn(a),y=!S.scrollboxSize()&&p.position==="absolute",b=y||f,w=b&&l.css(a,"boxSizing",!1,p)==="border-box",P=f?ls(a,r,f,w,p):0;return w&&y&&(P-=Math.ceil(a["offset"+r[0].toUpperCase()+r.slice(1)]-parseFloat(p[r])-ls(a,r,"border",!1,p)-.5)),P&&(h=cn.exec(u))&&(h[3]||"px")!=="px"&&(a.style[r]=u,u=l.css(a,r)),Yo(a,u,P)}}}),l.cssHooks.marginLeft=Wo(S.reliableMarginLeft,function(n,r){if(r)return(parseFloat(hn(n,"marginLeft"))||n.getBoundingClientRect().left-Vo(n,{marginLeft:0},function(){return n.getBoundingClientRect().left}))+"px"}),l.each({margin:"",padding:"",border:"Width"},function(n,r){l.cssHooks[n+r]={expand:function(a){for(var u=0,f={},h=typeof a=="string"?a.split(" "):[a];u<4;u++)f[n+Rt[u]+r]=h[u]||h[u-2]||h[0];return f}},n!=="margin"&&(l.cssHooks[n+r].set=Yo)}),l.fn.extend({css:function(n,r){return at(this,function(a,u,f){var h,p,y={},b=0;if(Array.isArray(u)){for(h=Zn(a),p=u.length;b<p;b++)y[u[b]]=l.css(a,u[b],!1,h);return y}return f!==void 0?l.style(a,u,f):l.css(a,u)},n,r,arguments.length>1)}});function Qe(n,r,a,u,f){return new Qe.prototype.init(n,r,a,u,f)}l.Tween=Qe,Qe.prototype={constructor:Qe,init:function(n,r,a,u,f,h){this.elem=n,this.prop=a,this.easing=f||l.easing._default,this.options=r,this.start=this.now=this.cur(),this.end=u,this.unit=h||(l.cssNumber[a]?"":"px")},cur:function(){var n=Qe.propHooks[this.prop];return n&&n.get?n.get(this):Qe.propHooks._default.get(this)},run:function(n){var r,a=Qe.propHooks[this.prop];return this.options.duration?this.pos=r=l.easing[this.easing](n,this.options.duration*n,0,1,this.options.duration):this.pos=r=n,this.now=(this.end-this.start)*r+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),a&&a.set?a.set(this):Qe.propHooks._default.set(this),this}},Qe.prototype.init.prototype=Qe.prototype,Qe.propHooks={_default:{get:function(n){var r;return n.elem.nodeType!==1||n.elem[n.prop]!=null&&n.elem.style[n.prop]==null?n.elem[n.prop]:(r=l.css(n.elem,n.prop,""),!r||r==="auto"?0:r)},set:function(n){l.fx.step[n.prop]?l.fx.step[n.prop](n):n.elem.nodeType===1&&(l.cssHooks[n.prop]||n.elem.style[as(n.prop)]!=null)?l.style(n.elem,n.prop,n.now+n.unit):n.elem[n.prop]=n.now}}},Qe.propHooks.scrollTop=Qe.propHooks.scrollLeft={set:function(n){n.elem.nodeType&&n.elem.parentNode&&(n.elem[n.prop]=n.now)}},l.easing={linear:function(n){return n},swing:function(n){return .5-Math.cos(n*Math.PI)/2},_default:"swing"},l.fx=Qe.prototype.init,l.fx.step={};var Fi,er,ku=/^(?:toggle|show|hide)$/,Ou=/queueHooks$/;function us(){er&&(_.hidden===!1&&t.requestAnimationFrame?t.requestAnimationFrame(us):t.setTimeout(us,l.fx.interval),l.fx.tick())}function Jo(){return t.setTimeout(function(){Fi=void 0}),Fi=Date.now()}function tr(n,r){var a,u=0,f={height:n};for(r=r?1:0;u<4;u+=2-r)a=Rt[u],f["margin"+a]=f["padding"+a]=n;return r&&(f.opacity=f.width=n),f}function Qo(n,r,a){for(var u,f=(vt.tweeners[r]||[]).concat(vt.tweeners["*"]),h=0,p=f.length;h<p;h++)if(u=f[h].call(a,r,n))return u}function Du(n,r,a){var u,f,h,p,y,b,w,P,M="width"in r||"height"in r,O=this,U={},ae=n.style,pe=n.nodeType&&Jn(n),ue=J.get(n,"fxshow");a.queue||(p=l._queueHooks(n,"fx"),p.unqueued==null&&(p.unqueued=0,y=p.empty.fire,p.empty.fire=function(){p.unqueued||y()}),p.unqueued++,O.always(function(){O.always(function(){p.unqueued--,l.queue(n,"fx").length||p.empty.fire()})}));for(u in r)if(f=r[u],ku.test(f)){if(delete r[u],h=h||f==="toggle",f===(pe?"hide":"show"))if(f==="show"&&ue&&ue[u]!==void 0)pe=!0;else continue;U[u]=ue&&ue[u]||l.style(n,u)}if(b=!l.isEmptyObject(r),!(!b&&l.isEmptyObject(U))){M&&n.nodeType===1&&(a.overflow=[ae.overflow,ae.overflowX,ae.overflowY],w=ue&&ue.display,w==null&&(w=J.get(n,"display")),P=l.css(n,"display"),P==="none"&&(w?P=w:(Ri([n],!0),w=n.style.display||w,P=l.css(n,"display"),Ri([n]))),(P==="inline"||P==="inline-block"&&w!=null)&&l.css(n,"float")==="none"&&(b||(O.done(function(){ae.display=w}),w==null&&(P=ae.display,w=P==="none"?"":P)),ae.display="inline-block")),a.overflow&&(ae.overflow="hidden",O.always(function(){ae.overflow=a.overflow[0],ae.overflowX=a.overflow[1],ae.overflowY=a.overflow[2]})),b=!1;for(u in U)b||(ue?"hidden"in ue&&(pe=ue.hidden):ue=J.access(n,"fxshow",{display:w}),h&&(ue.hidden=!pe),pe&&Ri([n],!0),O.done(function(){pe||Ri([n]),J.remove(n,"fxshow");for(u in U)l.style(n,u,U[u])})),b=Qo(pe?ue[u]:0,u,O),u in ue||(ue[u]=b.start,pe&&(b.end=b.start,b.start=0))}}function Lu(n,r){var a,u,f,h,p;for(a in n)if(u=ze(a),f=r[u],h=n[a],Array.isArray(h)&&(f=h[1],h=n[a]=h[0]),a!==u&&(n[u]=h,delete n[a]),p=l.cssHooks[u],p&&"expand"in p){h=p.expand(h),delete n[u];for(a in h)a in n||(n[a]=h[a],r[a]=f)}else r[u]=f}function vt(n,r,a){var u,f,h=0,p=vt.prefilters.length,y=l.Deferred().always(function(){delete b.elem}),b=function(){if(f)return!1;for(var M=Fi||Jo(),O=Math.max(0,w.startTime+w.duration-M),U=O/w.duration||0,ae=1-U,pe=0,ue=w.tweens.length;pe<ue;pe++)w.tweens[pe].run(ae);return y.notifyWith(n,[w,ae,O]),ae<1&&ue?O:(ue||y.notifyWith(n,[w,1,0]),y.resolveWith(n,[w]),!1)},w=y.promise({elem:n,props:l.extend({},r),opts:l.extend(!0,{specialEasing:{},easing:l.easing._default},a),originalProperties:r,originalOptions:a,startTime:Fi||Jo(),duration:a.duration,tweens:[],createTween:function(M,O){var U=l.Tween(n,w.opts,M,O,w.opts.specialEasing[M]||w.opts.easing);return w.tweens.push(U),U},stop:function(M){var O=0,U=M?w.tweens.length:0;if(f)return this;for(f=!0;O<U;O++)w.tweens[O].run(1);return M?(y.notifyWith(n,[w,1,0]),y.resolveWith(n,[w,M])):y.rejectWith(n,[w,M]),this}}),P=w.props;for(Lu(P,w.opts.specialEasing);h<p;h++)if(u=vt.prefilters[h].call(w,n,P,w.opts),u)return N(u.stop)&&(l._queueHooks(w.elem,w.opts.queue).stop=u.stop.bind(u)),u;return l.map(P,Qo,w),N(w.opts.start)&&w.opts.start.call(n,w),w.progress(w.opts.progress).done(w.opts.done,w.opts.complete).fail(w.opts.fail).always(w.opts.always),l.fx.timer(l.extend(b,{elem:n,anim:w,queue:w.opts.queue})),w}l.Animation=l.extend(vt,{tweeners:{"*":[function(n,r){var a=this.createTween(n,r);return Io(a.elem,n,cn.exec(r),a),a}]},tweener:function(n,r){N(n)?(r=n,n=["*"]):n=n.match(Be);for(var a,u=0,f=n.length;u<f;u++)a=n[u],vt.tweeners[a]=vt.tweeners[a]||[],vt.tweeners[a].unshift(r)},prefilters:[Du],prefilter:function(n,r){r?vt.prefilters.unshift(n):vt.prefilters.push(n)}}),l.speed=function(n,r,a){var u=n&&typeof n=="object"?l.extend({},n):{complete:a||!a&&r||N(n)&&n,duration:n,easing:a&&r||r&&!N(r)&&r};return l.fx.off?u.duration=0:typeof u.duration!="number"&&(u.duration in l.fx.speeds?u.duration=l.fx.speeds[u.duration]:u.duration=l.fx.speeds._default),(u.queue==null||u.queue===!0)&&(u.queue="fx"),u.old=u.complete,u.complete=function(){N(u.old)&&u.old.call(this),u.queue&&l.dequeue(this,u.queue)},u},l.fn.extend({fadeTo:function(n,r,a,u){return this.filter(Jn).css("opacity",0).show().end().animate({opacity:r},n,a,u)},animate:function(n,r,a,u){var f=l.isEmptyObject(n),h=l.speed(r,a,u),p=function(){var y=vt(this,l.extend({},n),h);(f||J.get(this,"finish"))&&y.stop(!0)};return p.finish=p,f||h.queue===!1?this.each(p):this.queue(h.queue,p)},stop:function(n,r,a){var u=function(f){var h=f.stop;delete f.stop,h(a)};return typeof n!="string"&&(a=r,r=n,n=void 0),r&&this.queue(n||"fx",[]),this.each(function(){var f=!0,h=n!=null&&n+"queueHooks",p=l.timers,y=J.get(this);if(h)y[h]&&y[h].stop&&u(y[h]);else for(h in y)y[h]&&y[h].stop&&Ou.test(h)&&u(y[h]);for(h=p.length;h--;)p[h].elem===this&&(n==null||p[h].queue===n)&&(p[h].anim.stop(a),f=!1,p.splice(h,1));(f||!a)&&l.dequeue(this,n)})},finish:function(n){return n!==!1&&(n=n||"fx"),this.each(function(){var r,a=J.get(this),u=a[n+"queue"],f=a[n+"queueHooks"],h=l.timers,p=u?u.length:0;for(a.finish=!0,l.queue(this,n,[]),f&&f.stop&&f.stop.call(this,!0),r=h.length;r--;)h[r].elem===this&&h[r].queue===n&&(h[r].anim.stop(!0),h.splice(r,1));for(r=0;r<p;r++)u[r]&&u[r].finish&&u[r].finish.call(this);delete a.finish})}}),l.each(["toggle","show","hide"],function(n,r){var a=l.fn[r];l.fn[r]=function(u,f,h){return u==null||typeof u=="boolean"?a.apply(this,arguments):this.animate(tr(r,!0),u,f,h)}}),l.each({slideDown:tr("show"),slideUp:tr("hide"),slideToggle:tr("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(n,r){l.fn[n]=function(a,u,f){return this.animate(r,a,u,f)}}),l.timers=[],l.fx.tick=function(){var n,r=0,a=l.timers;for(Fi=Date.now();r<a.length;r++)n=a[r],!n()&&a[r]===n&&a.splice(r--,1);a.length||l.fx.stop(),Fi=void 0},l.fx.timer=function(n){l.timers.push(n),l.fx.start()},l.fx.interval=13,l.fx.start=function(){er||(er=!0,us())},l.fx.stop=function(){er=null},l.fx.speeds={slow:600,fast:200,_default:400},l.fn.delay=function(n,r){return n=l.fx&&l.fx.speeds[n]||n,r=r||"fx",this.queue(r,function(a,u){var f=t.setTimeout(a,n);u.stop=function(){t.clearTimeout(f)}})},function(){var n=_.createElement("input"),r=_.createElement("select"),a=r.appendChild(_.createElement("option"));n.type="checkbox",S.checkOn=n.value!=="",S.optSelected=a.selected,n=_.createElement("input"),n.value="t",n.type="radio",S.radioValue=n.value==="t"}();var Zo,dn=l.expr.attrHandle;l.fn.extend({attr:function(n,r){return at(this,l.attr,n,r,arguments.length>1)},removeAttr:function(n){return this.each(function(){l.removeAttr(this,n)})}}),l.extend({attr:function(n,r,a){var u,f,h=n.nodeType;if(!(h===3||h===8||h===2)){if(typeof n.getAttribute>"u")return l.prop(n,r,a);if((h!==1||!l.isXMLDoc(n))&&(f=l.attrHooks[r.toLowerCase()]||(l.expr.match.bool.test(r)?Zo:void 0)),a!==void 0){if(a===null){l.removeAttr(n,r);return}return f&&"set"in f&&(u=f.set(n,a,r))!==void 0?u:(n.setAttribute(r,a+""),a)}return f&&"get"in f&&(u=f.get(n,r))!==null?u:(u=l.find.attr(n,r),u??void 0)}},attrHooks:{type:{set:function(n,r){if(!S.radioValue&&r==="radio"&&G(n,"input")){var a=n.value;return n.setAttribute("type",r),a&&(n.value=a),r}}}},removeAttr:function(n,r){var a,u=0,f=r&&r.match(Be);if(f&&n.nodeType===1)for(;a=f[u++];)n.removeAttribute(a)}}),Zo={set:function(n,r,a){return r===!1?l.removeAttr(n,a):n.setAttribute(a,a),a}},l.each(l.expr.match.bool.source.match(/\w+/g),function(n,r){var a=dn[r]||l.find.attr;dn[r]=function(u,f,h){var p,y,b=f.toLowerCase();return h||(y=dn[b],dn[b]=p,p=a(u,f,h)!=null?b:null,dn[b]=y),p}});var Nu=/^(?:input|select|textarea|button)$/i,Pu=/^(?:a|area)$/i;l.fn.extend({prop:function(n,r){return at(this,l.prop,n,r,arguments.length>1)},removeProp:function(n){return this.each(function(){delete this[l.propFix[n]||n]})}}),l.extend({prop:function(n,r,a){var u,f,h=n.nodeType;if(!(h===3||h===8||h===2))return(h!==1||!l.isXMLDoc(n))&&(r=l.propFix[r]||r,f=l.propHooks[r]),a!==void 0?f&&"set"in f&&(u=f.set(n,a,r))!==void 0?u:n[r]=a:f&&"get"in f&&(u=f.get(n,r))!==null?u:n[r]},propHooks:{tabIndex:{get:function(n){var r=l.find.attr(n,"tabindex");return r?parseInt(r,10):Nu.test(n.nodeName)||Pu.test(n.nodeName)&&n.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),S.optSelected||(l.propHooks.selected={get:function(n){var r=n.parentNode;return r&&r.parentNode&&r.parentNode.selectedIndex,null},set:function(n){var r=n.parentNode;r&&(r.selectedIndex,r.parentNode&&r.parentNode.selectedIndex)}}),l.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){l.propFix[this.toLowerCase()]=this});function hi(n){var r=n.match(Be)||[];return r.join(" ")}function di(n){return n.getAttribute&&n.getAttribute("class")||""}function cs(n){return Array.isArray(n)?n:typeof n=="string"?n.match(Be)||[]:[]}l.fn.extend({addClass:function(n){var r,a,u,f,h,p;return N(n)?this.each(function(y){l(this).addClass(n.call(this,y,di(this)))}):(r=cs(n),r.length?this.each(function(){if(u=di(this),a=this.nodeType===1&&" "+hi(u)+" ",a){for(h=0;h<r.length;h++)f=r[h],a.indexOf(" "+f+" ")<0&&(a+=f+" ");p=hi(a),u!==p&&this.setAttribute("class",p)}}):this)},removeClass:function(n){var r,a,u,f,h,p;return N(n)?this.each(function(y){l(this).removeClass(n.call(this,y,di(this)))}):arguments.length?(r=cs(n),r.length?this.each(function(){if(u=di(this),a=this.nodeType===1&&" "+hi(u)+" ",a){for(h=0;h<r.length;h++)for(f=r[h];a.indexOf(" "+f+" ")>-1;)a=a.replace(" "+f+" "," ");p=hi(a),u!==p&&this.setAttribute("class",p)}}):this):this.attr("class","")},toggleClass:function(n,r){var a,u,f,h,p=typeof n,y=p==="string"||Array.isArray(n);return N(n)?this.each(function(b){l(this).toggleClass(n.call(this,b,di(this),r),r)}):typeof r=="boolean"&&y?r?this.addClass(n):this.removeClass(n):(a=cs(n),this.each(function(){if(y)for(h=l(this),f=0;f<a.length;f++)u=a[f],h.hasClass(u)?h.removeClass(u):h.addClass(u);else(n===void 0||p==="boolean")&&(u=di(this),u&&J.set(this,"__className__",u),this.setAttribute&&this.setAttribute("class",u||n===!1?"":J.get(this,"__className__")||""))}))},hasClass:function(n){var r,a,u=0;for(r=" "+n+" ";a=this[u++];)if(a.nodeType===1&&(" "+hi(di(a))+" ").indexOf(r)>-1)return!0;return!1}});var Iu=/\r/g;l.fn.extend({val:function(n){var r,a,u,f=this[0];return arguments.length?(u=N(n),this.each(function(h){var p;this.nodeType===1&&(u?p=n.call(this,h,l(this).val()):p=n,p==null?p="":typeof p=="number"?p+="":Array.isArray(p)&&(p=l.map(p,function(y){return y==null?"":y+""})),r=l.valHooks[this.type]||l.valHooks[this.nodeName.toLowerCase()],(!r||!("set"in r)||r.set(this,p,"value")===void 0)&&(this.value=p))})):f?(r=l.valHooks[f.type]||l.valHooks[f.nodeName.toLowerCase()],r&&"get"in r&&(a=r.get(f,"value"))!==void 0?a:(a=f.value,typeof a=="string"?a.replace(Iu,""):a??"")):void 0}}),l.extend({valHooks:{option:{get:function(n){var r=l.find.attr(n,"value");return r??hi(l.text(n))}},select:{get:function(n){var r,a,u,f=n.options,h=n.selectedIndex,p=n.type==="select-one",y=p?null:[],b=p?h+1:f.length;for(h<0?u=b:u=p?h:0;u<b;u++)if(a=f[u],(a.selected||u===h)&&!a.disabled&&(!a.parentNode.disabled||!G(a.parentNode,"optgroup"))){if(r=l(a).val(),p)return r;y.push(r)}return y},set:function(n,r){for(var a,u,f=n.options,h=l.makeArray(r),p=f.length;p--;)u=f[p],(u.selected=l.inArray(l.valHooks.option.get(u),h)>-1)&&(a=!0);return a||(n.selectedIndex=-1),h}}}}),l.each(["radio","checkbox"],function(){l.valHooks[this]={set:function(n,r){if(Array.isArray(r))return n.checked=l.inArray(l(n).val(),r)>-1}},S.checkOn||(l.valHooks[this].get=function(n){return n.getAttribute("value")===null?"on":n.value})});var pn=t.location,ea={guid:Date.now()},fs=/\?/;l.parseXML=function(n){var r,a;if(!n||typeof n!="string")return null;try{r=new t.DOMParser().parseFromString(n,"text/xml")}catch{}return a=r&&r.getElementsByTagName("parsererror")[0],(!r||a)&&l.error("Invalid XML: "+(a?l.map(a.childNodes,function(u){return u.textContent}).join(`
+`):n)),r};var ta=/^(?:focusinfocus|focusoutblur)$/,ia=function(n){n.stopPropagation()};l.extend(l.event,{trigger:function(n,r,a,u){var f,h,p,y,b,w,P,M,O=[a||_],U=x.call(n,"type")?n.type:n,ae=x.call(n,"namespace")?n.namespace.split("."):[];if(h=M=p=a=a||_,!(a.nodeType===3||a.nodeType===8)&&!ta.test(U+l.event.triggered)&&(U.indexOf(".")>-1&&(ae=U.split("."),U=ae.shift(),ae.sort()),b=U.indexOf(":")<0&&"on"+U,n=n[l.expando]?n:new l.Event(U,typeof n=="object"&&n),n.isTrigger=u?2:3,n.namespace=ae.join("."),n.rnamespace=n.namespace?new RegExp("(^|\\.)"+ae.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=void 0,n.target||(n.target=a),r=r==null?[n]:l.makeArray(r,[n]),P=l.event.special[U]||{},!(!u&&P.trigger&&P.trigger.apply(a,r)===!1))){if(!u&&!P.noBubble&&!A(a)){for(y=P.delegateType||U,ta.test(y+U)||(h=h.parentNode);h;h=h.parentNode)O.push(h),p=h;p===(a.ownerDocument||_)&&O.push(p.defaultView||p.parentWindow||t)}for(f=0;(h=O[f++])&&!n.isPropagationStopped();)M=h,n.type=f>1?y:P.bindType||U,w=(J.get(h,"events")||Object.create(null))[n.type]&&J.get(h,"handle"),w&&w.apply(h,r),w=b&&h[b],w&&w.apply&&zt(h)&&(n.result=w.apply(h,r),n.result===!1&&n.preventDefault());return n.type=U,!u&&!n.isDefaultPrevented()&&(!P._default||P._default.apply(O.pop(),r)===!1)&&zt(a)&&b&&N(a[U])&&!A(a)&&(p=a[b],p&&(a[b]=null),l.event.triggered=U,n.isPropagationStopped()&&M.addEventListener(U,ia),a[U](),n.isPropagationStopped()&&M.removeEventListener(U,ia),l.event.triggered=void 0,p&&(a[b]=p)),n.result}},simulate:function(n,r,a){var u=l.extend(new l.Event,a,{type:n,isSimulated:!0});l.event.trigger(u,null,r)}}),l.fn.extend({trigger:function(n,r){return this.each(function(){l.event.trigger(n,r,this)})},triggerHandler:function(n,r){var a=this[0];if(a)return l.event.trigger(n,r,a,!0)}});var Ru=/\[\]$/,na=/\r?\n/g,$u=/^(?:submit|button|image|reset|file)$/i,Mu=/^(?:input|select|textarea|keygen)/i;function hs(n,r,a,u){var f;if(Array.isArray(r))l.each(r,function(h,p){a||Ru.test(n)?u(n,p):hs(n+"["+(typeof p=="object"&&p!=null?h:"")+"]",p,a,u)});else if(!a&&T(r)==="object")for(f in r)hs(n+"["+f+"]",r[f],a,u);else u(n,r)}l.param=function(n,r){var a,u=[],f=function(h,p){var y=N(p)?p():p;u[u.length]=encodeURIComponent(h)+"="+encodeURIComponent(y??"")};if(n==null)return"";if(Array.isArray(n)||n.jquery&&!l.isPlainObject(n))l.each(n,function(){f(this.name,this.value)});else for(a in n)hs(a,n[a],r,f);return u.join("&")},l.fn.extend({serialize:function(){return l.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var n=l.prop(this,"elements");return n?l.makeArray(n):this}).filter(function(){var n=this.type;return this.name&&!l(this).is(":disabled")&&Mu.test(this.nodeName)&&!$u.test(n)&&(this.checked||!fn.test(n))}).map(function(n,r){var a=l(this).val();return a==null?null:Array.isArray(a)?l.map(a,function(u){return{name:r.name,value:u.replace(na,`\r
+`)}}):{name:r.name,value:a.replace(na,`\r
+`)}}).get()}});var Hu=/%20/g,Fu=/#.*$/,ju=/([?&])_=[^&]*/,Bu=/^(.*?):[ \t]*([^\r\n]*)$/mg,Uu=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Vu=/^(?:GET|HEAD)$/,Wu=/^\/\//,ra={},ds={},sa="*/".concat("*"),ps=_.createElement("a");ps.href=pn.href;function oa(n){return function(r,a){typeof r!="string"&&(a=r,r="*");var u,f=0,h=r.toLowerCase().match(Be)||[];if(N(a))for(;u=h[f++];)u[0]==="+"?(u=u.slice(1)||"*",(n[u]=n[u]||[]).unshift(a)):(n[u]=n[u]||[]).push(a)}}function aa(n,r,a,u){var f={},h=n===ds;function p(y){var b;return f[y]=!0,l.each(n[y]||[],function(w,P){var M=P(r,a,u);if(typeof M=="string"&&!h&&!f[M])return r.dataTypes.unshift(M),p(M),!1;if(h)return!(b=M)}),b}return p(r.dataTypes[0])||!f["*"]&&p("*")}function gs(n,r){var a,u,f=l.ajaxSettings.flatOptions||{};for(a in r)r[a]!==void 0&&((f[a]?n:u||(u={}))[a]=r[a]);return u&&l.extend(!0,n,u),n}function qu(n,r,a){for(var u,f,h,p,y=n.contents,b=n.dataTypes;b[0]==="*";)b.shift(),u===void 0&&(u=n.mimeType||r.getResponseHeader("Content-Type"));if(u){for(f in y)if(y[f]&&y[f].test(u)){b.unshift(f);break}}if(b[0]in a)h=b[0];else{for(f in a){if(!b[0]||n.converters[f+" "+b[0]]){h=f;break}p||(p=f)}h=h||p}if(h)return h!==b[0]&&b.unshift(h),a[h]}function zu(n,r,a,u){var f,h,p,y,b,w={},P=n.dataTypes.slice();if(P[1])for(p in n.converters)w[p.toLowerCase()]=n.converters[p];for(h=P.shift();h;)if(n.responseFields[h]&&(a[n.responseFields[h]]=r),!b&&u&&n.dataFilter&&(r=n.dataFilter(r,n.dataType)),b=h,h=P.shift(),h){if(h==="*")h=b;else if(b!=="*"&&b!==h){if(p=w[b+" "+h]||w["* "+h],!p){for(f in w)if(y=f.split(" "),y[1]===h&&(p=w[b+" "+y[0]]||w["* "+y[0]],p)){p===!0?p=w[f]:w[f]!==!0&&(h=y[0],P.unshift(y[1]));break}}if(p!==!0)if(p&&n.throws)r=p(r);else try{r=p(r)}catch(M){return{state:"parsererror",error:p?M:"No conversion from "+b+" to "+h}}}}return{state:"success",data:r}}l.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:pn.href,type:"GET",isLocal:Uu.test(pn.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":sa,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":l.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(n,r){return r?gs(gs(n,l.ajaxSettings),r):gs(l.ajaxSettings,n)},ajaxPrefilter:oa(ra),ajaxTransport:oa(ds),ajax:function(n,r){typeof n=="object"&&(r=n,n=void 0),r=r||{};var a,u,f,h,p,y,b,w,P,M,O=l.ajaxSetup({},r),U=O.context||O,ae=O.context&&(U.nodeType||U.jquery)?l(U):l.event,pe=l.Deferred(),ue=l.Callbacks("once memory"),He=O.statusCode||{},Le={},Tt={},wt="canceled",he={readyState:0,getResponseHeader:function(ge){var xe;if(b){if(!h)for(h={};xe=Bu.exec(f);)h[xe[1].toLowerCase()+" "]=(h[xe[1].toLowerCase()+" "]||[]).concat(xe[2]);xe=h[ge.toLowerCase()+" "]}return xe==null?null:xe.join(", ")},getAllResponseHeaders:function(){return b?f:null},setRequestHeader:function(ge,xe){return b==null&&(ge=Tt[ge.toLowerCase()]=Tt[ge.toLowerCase()]||ge,Le[ge]=xe),this},overrideMimeType:function(ge){return b==null&&(O.mimeType=ge),this},statusCode:function(ge){var xe;if(ge)if(b)he.always(ge[he.status]);else for(xe in ge)He[xe]=[He[xe],ge[xe]];return this},abort:function(ge){var xe=ge||wt;return a&&a.abort(xe),pi(0,xe),this}};if(pe.promise(he),O.url=((n||O.url||pn.href)+"").replace(Wu,pn.protocol+"//"),O.type=r.method||r.type||O.method||O.type,O.dataTypes=(O.dataType||"*").toLowerCase().match(Be)||[""],O.crossDomain==null){y=_.createElement("a");try{y.href=O.url,y.href=y.href,O.crossDomain=ps.protocol+"//"+ps.host!=y.protocol+"//"+y.host}catch{O.crossDomain=!0}}if(O.data&&O.processData&&typeof O.data!="string"&&(O.data=l.param(O.data,O.traditional)),aa(ra,O,r,he),b)return he;w=l.event&&O.global,w&&l.active++===0&&l.event.trigger("ajaxStart"),O.type=O.type.toUpperCase(),O.hasContent=!Vu.test(O.type),u=O.url.replace(Fu,""),O.hasContent?O.data&&O.processData&&(O.contentType||"").indexOf("application/x-www-form-urlencoded")===0&&(O.data=O.data.replace(Hu,"+")):(M=O.url.slice(u.length),O.data&&(O.processData||typeof O.data=="string")&&(u+=(fs.test(u)?"&":"?")+O.data,delete O.data),O.cache===!1&&(u=u.replace(ju,"$1"),M=(fs.test(u)?"&":"?")+"_="+ea.guid+++M),O.url=u+M),O.ifModified&&(l.lastModified[u]&&he.setRequestHeader("If-Modified-Since",l.lastModified[u]),l.etag[u]&&he.setRequestHeader("If-None-Match",l.etag[u])),(O.data&&O.hasContent&&O.contentType!==!1||r.contentType)&&he.setRequestHeader("Content-Type",O.contentType),he.setRequestHeader("Accept",O.dataTypes[0]&&O.accepts[O.dataTypes[0]]?O.accepts[O.dataTypes[0]]+(O.dataTypes[0]!=="*"?", "+sa+"; q=0.01":""):O.accepts["*"]);for(P in O.headers)he.setRequestHeader(P,O.headers[P]);if(O.beforeSend&&(O.beforeSend.call(U,he,O)===!1||b))return he.abort();if(wt="abort",ue.add(O.complete),he.done(O.success),he.fail(O.error),a=aa(ds,O,r,he),!a)pi(-1,"No Transport");else{if(he.readyState=1,w&&ae.trigger("ajaxSend",[he,O]),b)return he;O.async&&O.timeout>0&&(p=t.setTimeout(function(){he.abort("timeout")},O.timeout));try{b=!1,a.send(Le,pi)}catch(ge){if(b)throw ge;pi(-1,ge)}}function pi(ge,xe,mn,vs){var xt,vn,Ct,Xt,Yt,ut=xe;b||(b=!0,p&&t.clearTimeout(p),a=void 0,f=vs||"",he.readyState=ge>0?4:0,xt=ge>=200&&ge<300||ge===304,mn&&(Xt=qu(O,he,mn)),!xt&&l.inArray("script",O.dataTypes)>-1&&l.inArray("json",O.dataTypes)<0&&(O.converters["text script"]=function(){}),Xt=zu(O,Xt,he,xt),xt?(O.ifModified&&(Yt=he.getResponseHeader("Last-Modified"),Yt&&(l.lastModified[u]=Yt),Yt=he.getResponseHeader("etag"),Yt&&(l.etag[u]=Yt)),ge===204||O.type==="HEAD"?ut="nocontent":ge===304?ut="notmodified":(ut=Xt.state,vn=Xt.data,Ct=Xt.error,xt=!Ct)):(Ct=ut,(ge||!ut)&&(ut="error",ge<0&&(ge=0))),he.status=ge,he.statusText=(xe||ut)+"",xt?pe.resolveWith(U,[vn,ut,he]):pe.rejectWith(U,[he,ut,Ct]),he.statusCode(He),He=void 0,w&&ae.trigger(xt?"ajaxSuccess":"ajaxError",[he,O,xt?vn:Ct]),ue.fireWith(U,[he,ut]),w&&(ae.trigger("ajaxComplete",[he,O]),--l.active||l.event.trigger("ajaxStop")))}return he},getJSON:function(n,r,a){return l.get(n,r,a,"json")},getScript:function(n,r){return l.get(n,void 0,r,"script")}}),l.each(["get","post"],function(n,r){l[r]=function(a,u,f,h){return N(u)&&(h=h||f,f=u,u=void 0),l.ajax(l.extend({url:a,type:r,dataType:h,data:u,success:f},l.isPlainObject(a)&&a))}}),l.ajaxPrefilter(function(n){var r;for(r in n.headers)r.toLowerCase()==="content-type"&&(n.contentType=n.headers[r]||"")}),l._evalUrl=function(n,r,a){return l.ajax({url:n,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(u){l.globalEval(u,r,a)}})},l.fn.extend({wrapAll:function(n){var r;return this[0]&&(N(n)&&(n=n.call(this[0])),r=l(n,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&r.insertBefore(this[0]),r.map(function(){for(var a=this;a.firstElementChild;)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(n){return N(n)?this.each(function(r){l(this).wrapInner(n.call(this,r))}):this.each(function(){var r=l(this),a=r.contents();a.length?a.wrapAll(n):r.append(n)})},wrap:function(n){var r=N(n);return this.each(function(a){l(this).wrapAll(r?n.call(this,a):n)})},unwrap:function(n){return this.parent(n).not("body").each(function(){l(this).replaceWith(this.childNodes)}),this}}),l.expr.pseudos.hidden=function(n){return!l.expr.pseudos.visible(n)},l.expr.pseudos.visible=function(n){return!!(n.offsetWidth||n.offsetHeight||n.getClientRects().length)},l.ajaxSettings.xhr=function(){try{return new t.XMLHttpRequest}catch{}};var Ku={0:200,1223:204},gn=l.ajaxSettings.xhr();S.cors=!!gn&&"withCredentials"in gn,S.ajax=gn=!!gn,l.ajaxTransport(function(n){var r,a;if(S.cors||gn&&!n.crossDomain)return{send:function(u,f){var h,p=n.xhr();if(p.open(n.type,n.url,n.async,n.username,n.password),n.xhrFields)for(h in n.xhrFields)p[h]=n.xhrFields[h];n.mimeType&&p.overrideMimeType&&p.overrideMimeType(n.mimeType),!n.crossDomain&&!u["X-Requested-With"]&&(u["X-Requested-With"]="XMLHttpRequest");for(h in u)p.setRequestHeader(h,u[h]);r=function(y){return function(){r&&(r=a=p.onload=p.onerror=p.onabort=p.ontimeout=p.onreadystatechange=null,y==="abort"?p.abort():y==="error"?typeof p.status!="number"?f(0,"error"):f(p.status,p.statusText):f(Ku[p.status]||p.status,p.statusText,(p.responseType||"text")!=="text"||typeof p.responseText!="string"?{binary:p.response}:{text:p.responseText},p.getAllResponseHeaders()))}},p.onload=r(),a=p.onerror=p.ontimeout=r("error"),p.onabort!==void 0?p.onabort=a:p.onreadystatechange=function(){p.readyState===4&&t.setTimeout(function(){r&&a()})},r=r("abort");try{p.send(n.hasContent&&n.data||null)}catch(y){if(r)throw y}},abort:function(){r&&r()}}}),l.ajaxPrefilter(function(n){n.crossDomain&&(n.contents.script=!1)}),l.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(n){return l.globalEval(n),n}}}),l.ajaxPrefilter("script",function(n){n.cache===void 0&&(n.cache=!1),n.crossDomain&&(n.type="GET")}),l.ajaxTransport("script",function(n){if(n.crossDomain||n.scriptAttrs){var r,a;return{send:function(u,f){r=l("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",a=function(h){r.remove(),a=null,h&&f(h.type==="error"?404:200,h.type)}),_.head.appendChild(r[0])},abort:function(){a&&a()}}}});var la=[],ms=/(=)\?(?=&|$)|\?\?/;l.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var n=la.pop()||l.expando+"_"+ea.guid++;return this[n]=!0,n}}),l.ajaxPrefilter("json jsonp",function(n,r,a){var u,f,h,p=n.jsonp!==!1&&(ms.test(n.url)?"url":typeof n.data=="string"&&(n.contentType||"").indexOf("application/x-www-form-urlencoded")===0&&ms.test(n.data)&&"data");if(p||n.dataTypes[0]==="jsonp")return u=n.jsonpCallback=N(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,p?n[p]=n[p].replace(ms,"$1"+u):n.jsonp!==!1&&(n.url+=(fs.test(n.url)?"&":"?")+n.jsonp+"="+u),n.converters["script json"]=function(){return h||l.error(u+" was not called"),h[0]},n.dataTypes[0]="json",f=t[u],t[u]=function(){h=arguments},a.always(function(){f===void 0?l(t).removeProp(u):t[u]=f,n[u]&&(n.jsonpCallback=r.jsonpCallback,la.push(u)),h&&N(f)&&f(h[0]),h=f=void 0}),"script"}),S.createHTMLDocument=function(){var n=_.implementation.createHTMLDocument("").body;return n.innerHTML="<form></form><form></form>",n.childNodes.length===2}(),l.parseHTML=function(n,r,a){if(typeof n!="string")return[];typeof r=="boolean"&&(a=r,r=!1);var u,f,h;return r||(S.createHTMLDocument?(r=_.implementation.createHTMLDocument(""),u=r.createElement("base"),u.href=_.location.href,r.head.appendChild(u)):r=_),f=we.exec(n),h=!a&&[],f?[r.createElement(f[1])]:(f=Ho([n],r,h),h&&h.length&&l(h).remove(),l.merge([],f.childNodes))},l.fn.load=function(n,r,a){var u,f,h,p=this,y=n.indexOf(" ");return y>-1&&(u=hi(n.slice(y)),n=n.slice(0,y)),N(r)?(a=r,r=void 0):r&&typeof r=="object"&&(f="POST"),p.length>0&&l.ajax({url:n,type:f||"GET",dataType:"html",data:r}).done(function(b){h=arguments,p.html(u?l("<div>").append(l.parseHTML(b)).find(u):b)}).always(a&&function(b,w){p.each(function(){a.apply(this,h||[b.responseText,w,b])})}),this},l.expr.pseudos.animated=function(n){return l.grep(l.timers,function(r){return n===r.elem}).length},l.offset={setOffset:function(n,r,a){var u,f,h,p,y,b,w,P=l.css(n,"position"),M=l(n),O={};P==="static"&&(n.style.position="relative"),y=M.offset(),h=l.css(n,"top"),b=l.css(n,"left"),w=(P==="absolute"||P==="fixed")&&(h+b).indexOf("auto")>-1,w?(u=M.position(),p=u.top,f=u.left):(p=parseFloat(h)||0,f=parseFloat(b)||0),N(r)&&(r=r.call(n,a,l.extend({},y))),r.top!=null&&(O.top=r.top-y.top+p),r.left!=null&&(O.left=r.left-y.left+f),"using"in r?r.using.call(n,O):M.css(O)}},l.fn.extend({offset:function(n){if(arguments.length)return n===void 0?this:this.each(function(f){l.offset.setOffset(this,n,f)});var r,a,u=this[0];if(u)return u.getClientRects().length?(r=u.getBoundingClientRect(),a=u.ownerDocument.defaultView,{top:r.top+a.pageYOffset,left:r.left+a.pageXOffset}):{top:0,left:0}},position:function(){if(this[0]){var n,r,a,u=this[0],f={top:0,left:0};if(l.css(u,"position")==="fixed")r=u.getBoundingClientRect();else{for(r=this.offset(),a=u.ownerDocument,n=u.offsetParent||a.documentElement;n&&(n===a.body||n===a.documentElement)&&l.css(n,"position")==="static";)n=n.parentNode;n&&n!==u&&n.nodeType===1&&(f=l(n).offset(),f.top+=l.css(n,"borderTopWidth",!0),f.left+=l.css(n,"borderLeftWidth",!0))}return{top:r.top-f.top-l.css(u,"marginTop",!0),left:r.left-f.left-l.css(u,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var n=this.offsetParent;n&&l.css(n,"position")==="static";)n=n.offsetParent;return n||fi})}}),l.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(n,r){var a=r==="pageYOffset";l.fn[n]=function(u){return at(this,function(f,h,p){var y;if(A(f)?y=f:f.nodeType===9&&(y=f.defaultView),p===void 0)return y?y[r]:f[h];y?y.scrollTo(a?y.pageXOffset:p,a?p:y.pageYOffset):f[h]=p},n,u,arguments.length)}}),l.each(["top","left"],function(n,r){l.cssHooks[r]=Wo(S.pixelPosition,function(a,u){if(u)return u=hn(a,r),ss.test(u)?l(a).position()[r]+"px":u})}),l.each({Height:"height",Width:"width"},function(n,r){l.each({padding:"inner"+n,content:r,"":"outer"+n},function(a,u){l.fn[u]=function(f,h){var p=arguments.length&&(a||typeof f!="boolean"),y=a||(f===!0||h===!0?"margin":"border");return at(this,function(b,w,P){var M;return A(b)?u.indexOf("outer")===0?b["inner"+n]:b.document.documentElement["client"+n]:b.nodeType===9?(M=b.documentElement,Math.max(b.body["scroll"+n],M["scroll"+n],b.body["offset"+n],M["offset"+n],M["client"+n])):P===void 0?l.css(b,w,y):l.style(b,w,P,y)},r,p?f:void 0,p)}})}),l.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(n,r){l.fn[r]=function(a){return this.on(r,a)}}),l.fn.extend({bind:function(n,r,a){return this.on(n,null,r,a)},unbind:function(n,r){return this.off(n,null,r)},delegate:function(n,r,a,u){return this.on(r,n,a,u)},undelegate:function(n,r,a){return arguments.length===1?this.off(n,"**"):this.off(r,n||"**",a)},hover:function(n,r){return this.on("mouseenter",n).on("mouseleave",r||n)}}),l.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(n,r){l.fn[r]=function(a,u){return arguments.length>0?this.on(r,null,a,u):this.trigger(r)}});var Xu=/^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;l.proxy=function(n,r){var a,u,f;if(typeof r=="string"&&(a=n[r],r=n,n=a),!!N(n))return u=o.call(arguments,2),f=function(){return n.apply(r||this,u.concat(o.call(arguments)))},f.guid=n.guid=n.guid||l.guid++,f},l.holdReady=function(n){n?l.readyWait++:l.ready(!0)},l.isArray=Array.isArray,l.parseJSON=JSON.parse,l.nodeName=G,l.isFunction=N,l.isWindow=A,l.camelCase=ze,l.type=T,l.now=Date.now,l.isNumeric=function(n){var r=l.type(n);return(r==="number"||r==="string")&&!isNaN(n-parseFloat(n))},l.trim=function(n){return n==null?"":(n+"").replace(Xu,"$1")},typeof define=="function"&&define.amd&&define("jquery",[],function(){return l});var Yu=t.jQuery,Gu=t.$;return l.noConflict=function(n){return t.$===l&&(t.$=Gu),n&&t.jQuery===l&&(t.jQuery=Yu),l},typeof e>"u"&&(t.jQuery=t.$=l),l})});var Pl=xs((u_,Mr)=>{var Gp=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};var Z=function(t){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,i=0,s={},o={manual:t.Prism&&t.Prism.manual,disableWorkerMessageHandler:t.Prism&&t.Prism.disableWorkerMessageHandler,util:{encode:function A(_){return _ instanceof c?new c(_.type,A(_.content),_.alias):Array.isArray(_)?_.map(A):_.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(A){return Object.prototype.toString.call(A).slice(8,-1)},objId:function(A){return A.__id||Object.defineProperty(A,"__id",{value:++i}),A.__id},clone:function A(_,R){R=R||{};var F,T;switch(o.util.type(_)){case"Object":if(T=o.util.objId(_),R[T])return R[T];F={},R[T]=F;for(var H in _)_.hasOwnProperty(H)&&(F[H]=A(_[H],R));return F;case"Array":return T=o.util.objId(_),R[T]?R[T]:(F=[],R[T]=F,_.forEach(function(K,l){F[l]=A(K,R)}),F);default:return _}},getLanguage:function(A){for(;A;){var _=e.exec(A.className);if(_)return _[1].toLowerCase();A=A.parentElement}return"none"},setLanguage:function(A,_){A.className=A.className.replace(RegExp(e,"gi"),""),A.classList.add("language-"+_)},currentScript:function(){if(typeof document>"u")return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(F){var A=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(F.stack)||[])[1];if(A){var _=document.getElementsByTagName("script");for(var R in _)if(_[R].src==A)return _[R]}return null}},isActive:function(A,_,R){for(var F="no-"+_;A;){var T=A.classList;if(T.contains(_))return!0;if(T.contains(F))return!1;A=A.parentElement}return!!R}},languages:{plain:s,plaintext:s,text:s,txt:s,extend:function(A,_){var R=o.util.clone(o.languages[A]);for(var F in _)R[F]=_[F];return R},insertBefore:function(A,_,R,F){F=F||o.languages;var T=F[A],H={};for(var K in T)if(T.hasOwnProperty(K)){if(K==_)for(var l in R)R.hasOwnProperty(l)&&(H[l]=R[l]);R.hasOwnProperty(K)||(H[K]=T[K])}var ee=F[A];return F[A]=H,o.languages.DFS(o.languages,function(G,re){re===ee&&G!=A&&(this[G]=H)}),H},DFS:function A(_,R,F,T){T=T||{};var H=o.util.objId;for(var K in _)if(_.hasOwnProperty(K)){R.call(_,K,_[K],F||K);var l=_[K],ee=o.util.type(l);ee==="Object"&&!T[H(l)]?(T[H(l)]=!0,A(l,R,null,T)):ee==="Array"&&!T[H(l)]&&(T[H(l)]=!0,A(l,R,K,T))}}},plugins:{},highlightAll:function(A,_){o.highlightAllUnder(document,A,_)},highlightAllUnder:function(A,_,R){var F={callback:R,container:A,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};o.hooks.run("before-highlightall",F),F.elements=Array.prototype.slice.apply(F.container.querySelectorAll(F.selector)),o.hooks.run("before-all-elements-highlight",F);for(var T=0,H;H=F.elements[T++];)o.highlightElement(H,_===!0,F.callback)},highlightElement:function(A,_,R){var F=o.util.getLanguage(A),T=o.languages[F];o.util.setLanguage(A,F);var H=A.parentElement;H&&H.nodeName.toLowerCase()==="pre"&&o.util.setLanguage(H,F);var K=A.textContent,l={element:A,language:F,grammar:T,code:K};function ee(re){l.highlightedCode=re,o.hooks.run("before-insert",l),l.element.innerHTML=l.highlightedCode,o.hooks.run("after-highlight",l),o.hooks.run("complete",l),R&&R.call(l.element)}if(o.hooks.run("before-sanity-check",l),H=l.element.parentElement,H&&H.nodeName.toLowerCase()==="pre"&&!H.hasAttribute("tabindex")&&H.setAttribute("tabindex","0"),!l.code){o.hooks.run("complete",l),R&&R.call(l.element);return}if(o.hooks.run("before-highlight",l),!l.grammar){ee(o.util.encode(l.code));return}if(_&&t.Worker){var G=new Worker(o.filename);G.onmessage=function(re){ee(re.data)},G.postMessage(JSON.stringify({language:l.language,code:l.code,immediateClose:!0}))}else ee(o.highlight(l.code,l.grammar,l.language))},highlight:function(A,_,R){var F={code:A,grammar:_,language:R};if(o.hooks.run("before-tokenize",F),!F.grammar)throw new Error('The language "'+F.language+'" has no grammar.');return F.tokens=o.tokenize(F.code,F.grammar),o.hooks.run("after-tokenize",F),c.stringify(o.util.encode(F.tokens),F.language)},tokenize:function(A,_){var R=_.rest;if(R){for(var F in R)_[F]=R[F];delete _.rest}var T=new v;return C(T,T.head,A),g(A,T,_,T.head,0),I(T)},hooks:{all:{},add:function(A,_){var R=o.hooks.all;R[A]=R[A]||[],R[A].push(_)},run:function(A,_){var R=o.hooks.all[A];if(!(!R||!R.length))for(var F=0,T;T=R[F++];)T(_)}},Token:c};t.Prism=o;function c(A,_,R,F){this.type=A,this.content=_,this.alias=R,this.length=(F||"").length|0}c.stringify=function A(_,R){if(typeof _=="string")return _;if(Array.isArray(_)){var F="";return _.forEach(function(ee){F+=A(ee,R)}),F}var T={type:_.type,content:A(_.content,R),tag:"span",classes:["token",_.type],attributes:{},language:R},H=_.alias;H&&(Array.isArray(H)?Array.prototype.push.apply(T.classes,H):T.classes.push(H)),o.hooks.run("wrap",T);var K="";for(var l in T.attributes)K+=" "+l+'="'+(T.attributes[l]||"").replace(/"/g,"&quot;")+'"';return"<"+T.tag+' class="'+T.classes.join(" ")+'"'+K+">"+T.content+"</"+T.tag+">"};function d(A,_,R,F){A.lastIndex=_;var T=A.exec(R);if(T&&F&&T[1]){var H=T[1].length;T.index+=H,T[0]=T[0].slice(H)}return T}function g(A,_,R,F,T,H){for(var K in R)if(!(!R.hasOwnProperty(K)||!R[K])){var l=R[K];l=Array.isArray(l)?l:[l];for(var ee=0;ee<l.length;++ee){if(H&&H.cause==K+","+ee)return;var G=l[ee],re=G.inside,me=!!G.lookbehind,_e=!!G.greedy,se=G.alias;if(_e&&!G.pattern.global){var ye=G.pattern.toString().match(/[imsuy]*$/)[0];G.pattern=RegExp(G.pattern.source,ye+"g")}for(var je=G.pattern||G,Y=F.next,W=T;Y!==_.tail&&!(H&&W>=H.reach);W+=Y.value.length,Y=Y.next){var X=Y.value;if(_.length>A.length)return;if(!(X instanceof c)){var oe=1,de;if(_e){if(de=d(je,W,A,me),!de||de.index>=A.length)break;var Se=de.index,Pe=de.index+de[0].length,we=W;for(we+=Y.value.length;Se>=we;)Y=Y.next,we+=Y.value.length;if(we-=Y.value.length,W=we,Y.value instanceof c)continue;for(var Oe=Y;Oe!==_.tail&&(we<Pe||typeof Oe.value=="string");Oe=Oe.next)oe++,we+=Oe.value.length;oe--,X=A.slice(W,we),de.index-=W}else if(de=d(je,0,X,me),!de)continue;var Se=de.index,Ie=de[0],Ae=X.slice(0,Se),Ge=X.slice(Se+Ie.length),it=W+X.length;H&&it>H.reach&&(H.reach=it);var qe=Y.prev;Ae&&(qe=C(_,qe,Ae),W+=Ae.length),x(_,qe,oe);var Be=new c(K,re?o.tokenize(Ie,re):Ie,se,Ie);if(Y=C(_,qe,Be),Ge&&C(_,Y,Ge),oe>1){var ui={cause:K+","+ee,reach:it};g(A,_,R,Y.prev,W,ui),H&&ui.reach>H.reach&&(H.reach=ui.reach)}}}}}}function v(){var A={value:null,prev:null,next:null},_={value:null,prev:A,next:null};A.next=_,this.head=A,this.tail=_,this.length=0}function C(A,_,R){var F=_.next,T={value:R,prev:_,next:F};return _.next=T,F.prev=T,A.length++,T}function x(A,_,R){for(var F=_.next,T=0;T<R&&F!==A.tail;T++)F=F.next;_.next=F,F.prev=_,A.length-=T}function I(A){for(var _=[],R=A.head.next;R!==A.tail;)_.push(R.value),R=R.next;return _}if(!t.document)return t.addEventListener&&(o.disableWorkerMessageHandler||t.addEventListener("message",function(A){var _=JSON.parse(A.data),R=_.language,F=_.code,T=_.immediateClose;t.postMessage(o.highlight(F,o.languages[R],R)),T&&t.close()},!1)),o;var D=o.util.currentScript();D&&(o.filename=D.src,D.hasAttribute("data-manual")&&(o.manual=!0));function S(){o.manual||o.highlightAll()}if(!o.manual){var N=document.readyState;N==="loading"||N==="interactive"&&D&&D.defer?document.addEventListener("DOMContentLoaded",S):window.requestAnimationFrame?window.requestAnimationFrame(S):window.setTimeout(S,16)}return o}(Gp);typeof Mr<"u"&&Mr.exports&&(Mr.exports=Z);typeof global<"u"&&(global.Prism=Z);Z.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]};Z.languages.markup.tag.inside["attr-value"].inside.entity=Z.languages.markup.entity;Z.languages.markup.doctype.inside["internal-subset"].inside=Z.languages.markup;Z.hooks.add("wrap",function(t){t.type==="entity"&&(t.attributes.title=t.content.replace(/&amp;/,"&"))});Object.defineProperty(Z.languages.markup.tag,"addInlined",{value:function(e,i){var s={};s["language-"+i]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Z.languages[i]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var o={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};o["language-"+i]={pattern:/[\s\S]+/,inside:Z.languages[i]};var c={};c[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:o},Z.languages.insertBefore("markup","cdata",c)}});Object.defineProperty(Z.languages.markup.tag,"addAttribute",{value:function(t,e){Z.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+t+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Z.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}});Z.languages.html=Z.languages.markup;Z.languages.mathml=Z.languages.markup;Z.languages.svg=Z.languages.markup;Z.languages.xml=Z.languages.extend("markup",{});Z.languages.ssml=Z.languages.xml;Z.languages.atom=Z.languages.xml;Z.languages.rss=Z.languages.xml;(function(t){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;t.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+e.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},t.languages.css.atrule.inside.rest=t.languages.css;var i=t.languages.markup;i&&(i.tag.addInlined("style","css"),i.tag.addAttribute("style","css"))})(Z);Z.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};Z.languages.javascript=Z.languages.extend("clike",{"class-name":[Z.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/});Z.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;Z.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Z.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Z.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Z.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Z.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Z.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/});Z.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Z.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}});Z.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}});Z.languages.markup&&(Z.languages.markup.tag.addInlined("script","javascript"),Z.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript"));Z.languages.js=Z.languages.javascript;(function(){if(typeof Z>"u"||typeof document>"u")return;Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var t="Loading\u2026",e=function(D,S){return"\u2716 Error "+D+" while fetching file: "+S},i="\u2716 Error: File does not exist or is empty",s={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},o="data-src-status",c="loading",d="loaded",g="failed",v="pre[data-src]:not(["+o+'="'+d+'"]):not(['+o+'="'+c+'"])';function C(D,S,N){var A=new XMLHttpRequest;A.open("GET",D,!0),A.onreadystatechange=function(){A.readyState==4&&(A.status<400&&A.responseText?S(A.responseText):A.status>=400?N(e(A.status,A.statusText)):N(i))},A.send(null)}function x(D){var S=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(D||"");if(S){var N=Number(S[1]),A=S[2],_=S[3];return A?_?[N,Number(_)]:[N,void 0]:[N,N]}}Z.hooks.add("before-highlightall",function(D){D.selector+=", "+v}),Z.hooks.add("before-sanity-check",function(D){var S=D.element;if(S.matches(v)){D.code="",S.setAttribute(o,c);var N=S.appendChild(document.createElement("CODE"));N.textContent=t;var A=S.getAttribute("data-src"),_=D.language;if(_==="none"){var R=(/\.(\w+)$/.exec(A)||[,"none"])[1];_=s[R]||R}Z.util.setLanguage(N,_),Z.util.setLanguage(S,_);var F=Z.plugins.autoloader;F&&F.loadLanguages(_),C(A,function(T){S.setAttribute(o,d);var H=x(S.getAttribute("data-range"));if(H){var K=T.split(/\r\n?|\n/g),l=H[0],ee=H[1]==null?K.length:H[1];l<0&&(l+=K.length),l=Math.max(0,Math.min(l-1,K.length)),ee<0&&(ee+=K.length),ee=Math.max(0,Math.min(ee,K.length)),T=K.slice(l,ee).join(`
+`),S.hasAttribute("data-start")||S.setAttribute("data-start",String(l+1))}N.textContent=T,Z.highlightElement(N)},function(T){S.setAttribute(o,g),N.textContent=T})}}),Z.plugins.fileHighlight={highlight:function(S){for(var N=(S||document).querySelectorAll(v),A=0,_;_=N[A++];)Z.highlightElement(_)}};var I=!1;Z.fileHighlight=function(){I||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),I=!0),Z.plugins.fileHighlight.highlight.apply(this,arguments)}})()});var du=xs((hu,Qr)=>{(function(t,e){"use strict";(function(){for(var D=0,S=["ms","moz","webkit","o"],N=0;N<S.length&&!t.requestAnimationFrame;++N)t.requestAnimationFrame=t[S[N]+"RequestAnimationFrame"],t.cancelAnimationFrame=t[S[N]+"CancelAnimationFrame"]||t[S[N]+"CancelRequestAnimationFrame"];t.requestAnimationFrame||(t.requestAnimationFrame=function(A,_){var R=new Date().getTime(),F=Math.max(0,16-(R-D)),T=t.setTimeout(function(){A(R+F)},F);return D=R+F,T}),t.cancelAnimationFrame||(t.cancelAnimationFrame=function(A){clearTimeout(A)})})();var i,s,o,c,d,g=function(D,S,N){D.addEventListener?D.addEventListener(S,N,!1):D.attachEvent?D.attachEvent("on"+S,N):D["on"+S]=N},v={autoRun:!0,barThickness:3,barColors:{0:"rgba(26,  188, 156, .9)",".25":"rgba(52,  152, 219, .9)",".50":"rgba(241, 196, 15,  .9)",".75":"rgba(230, 126, 34,  .9)","1.0":"rgba(211, 84,  0,   .9)"},shadowBlur:10,shadowColor:"rgba(0,   0,   0,   .6)",className:null},C=function(){i.width=t.innerWidth,i.height=v.barThickness*5;var D=i.getContext("2d");D.shadowBlur=v.shadowBlur,D.shadowColor=v.shadowColor;var S=D.createLinearGradient(0,0,i.width,0);for(var N in v.barColors)S.addColorStop(N,v.barColors[N]);D.lineWidth=v.barThickness,D.beginPath(),D.moveTo(0,v.barThickness/2),D.lineTo(Math.ceil(c*i.width),v.barThickness/2),D.strokeStyle=S,D.stroke()},x=function(){i=e.createElement("canvas");var D=i.style;D.position="fixed",D.top=D.left=D.right=D.margin=D.padding=0,D.zIndex=100001,D.display="none",v.className&&i.classList.add(v.className),e.body.appendChild(i),g(t,"resize",C)},I={config:function(D){for(var S in D)v.hasOwnProperty(S)&&(v[S]=D[S])},show:function(){d||(d=!0,o!==null&&t.cancelAnimationFrame(o),i||x(),i.style.opacity=1,i.style.display="block",I.progress(0),v.autoRun&&function D(){s=t.requestAnimationFrame(D),I.progress("+"+.05*Math.pow(1-Math.sqrt(c),2))}())},progress:function(D){return typeof D>"u"||(typeof D=="string"&&(D=(D.indexOf("+")>=0||D.indexOf("-")>=0?c:0)+parseFloat(D)),c=D>1?1:D,C()),c},hide:function(){d&&(d=!1,s!=null&&(t.cancelAnimationFrame(s),s=null),function D(){if(I.progress("+.1")>=1&&(i.style.opacity-=.05,i.style.opacity<=.05)){i.style.display="none",o=null;return}o=t.requestAnimationFrame(D)}())}};typeof Qr=="object"&&typeof Qr.exports=="object"?Qr.exports=I:typeof define=="function"&&define.amd?define(function(){return I}):this.topbar=I}).call(hu,window,document)});var Lo=yn(ar());var vr={};uc(vr,{afterMain:()=>ba,afterRead:()=>ga,afterWrite:()=>Ea,applyStyles:()=>Vi,arrow:()=>ur,auto:()=>_n,basePlacements:()=>Ht,beforeMain:()=>ma,beforeRead:()=>da,beforeWrite:()=>ya,bottom:()=>De,clippingParents:()=>Cs,computeStyles:()=>qi,createPopper:()=>On,createPopperBase:()=>Da,createPopperLite:()=>La,detectOverflow:()=>Ye,end:()=>Jt,eventListeners:()=>zi,flip:()=>dr,hide:()=>pr,left:()=>Ce,main:()=>va,modifierPhases:()=>ks,offset:()=>gr,placements:()=>An,popper:()=>mi,popperGenerator:()=>wi,popperOffsets:()=>Yi,preventOverflow:()=>mr,read:()=>pa,reference:()=>Ss,right:()=>ke,start:()=>kt,top:()=>Te,variationPlacements:()=>lr,viewport:()=>En,write:()=>_a});var Te="top",De="bottom",ke="right",Ce="left",_n="auto",Ht=[Te,De,ke,Ce],kt="start",Jt="end",Cs="clippingParents",En="viewport",mi="popper",Ss="reference",lr=Ht.reduce(function(t,e){return t.concat([e+"-"+kt,e+"-"+Jt])},[]),An=[].concat(Ht,[_n]).reduce(function(t,e){return t.concat([e,e+"-"+kt,e+"-"+Jt])},[]),da="beforeRead",pa="read",ga="afterRead",ma="beforeMain",va="main",ba="afterMain",ya="beforeWrite",_a="write",Ea="afterWrite",ks=[da,pa,ga,ma,va,ba,ya,_a,Ea];function Re(t){return t?(t.nodeName||"").toLowerCase():null}function Ee(t){if(t==null)return window;if(t.toString()!=="[object Window]"){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function ft(t){var e=Ee(t).Element;return t instanceof e||t instanceof Element}function Ne(t){var e=Ee(t).HTMLElement;return t instanceof e||t instanceof HTMLElement}function Ui(t){if(typeof ShadowRoot>"u")return!1;var e=Ee(t).ShadowRoot;return t instanceof e||t instanceof ShadowRoot}function fc(t){var e=t.state;Object.keys(e.elements).forEach(function(i){var s=e.styles[i]||{},o=e.attributes[i]||{},c=e.elements[i];!Ne(c)||!Re(c)||(Object.assign(c.style,s),Object.keys(o).forEach(function(d){var g=o[d];g===!1?c.removeAttribute(d):c.setAttribute(d,g===!0?"":g)}))})}function hc(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach(function(s){var o=e.elements[s],c=e.attributes[s]||{},d=Object.keys(e.styles.hasOwnProperty(s)?e.styles[s]:i[s]),g=d.reduce(function(v,C){return v[C]="",v},{});!Ne(o)||!Re(o)||(Object.assign(o.style,g),Object.keys(c).forEach(function(v){o.removeAttribute(v)}))})}}var Vi={name:"applyStyles",enabled:!0,phase:"write",fn:fc,effect:hc,requires:["computeStyles"]};function $e(t){return t.split("-")[0]}var yt=Math.max,vi=Math.min,Ft=Math.round;function Wi(){var t=navigator.userAgentData;return t!=null&&t.brands&&Array.isArray(t.brands)?t.brands.map(function(e){return e.brand+"/"+e.version}).join(" "):navigator.userAgent}function Tn(){return!/^((?!chrome|android).)*safari/i.test(Wi())}function ht(t,e,i){e===void 0&&(e=!1),i===void 0&&(i=!1);var s=t.getBoundingClientRect(),o=1,c=1;e&&Ne(t)&&(o=t.offsetWidth>0&&Ft(s.width)/t.offsetWidth||1,c=t.offsetHeight>0&&Ft(s.height)/t.offsetHeight||1);var d=ft(t)?Ee(t):window,g=d.visualViewport,v=!Tn()&&i,C=(s.left+(v&&g?g.offsetLeft:0))/o,x=(s.top+(v&&g?g.offsetTop:0))/c,I=s.width/o,D=s.height/c;return{width:I,height:D,top:x,right:C+I,bottom:x+D,left:C,x:C,y:x}}function bi(t){var e=ht(t),i=t.offsetWidth,s=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-s)<=1&&(s=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:s}}function wn(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&Ui(i)){var s=e;do{if(s&&t.isSameNode(s))return!0;s=s.parentNode||s.host}while(s)}return!1}function Xe(t){return Ee(t).getComputedStyle(t)}function Os(t){return["table","td","th"].indexOf(Re(t))>=0}function Fe(t){return((ft(t)?t.ownerDocument:t.document)||window.document).documentElement}function jt(t){return Re(t)==="html"?t:t.assignedSlot||t.parentNode||(Ui(t)?t.host:null)||Fe(t)}function Aa(t){return!Ne(t)||Xe(t).position==="fixed"?null:t.offsetParent}function dc(t){var e=/firefox/i.test(Wi()),i=/Trident/i.test(Wi());if(i&&Ne(t)){var s=Xe(t);if(s.position==="fixed")return null}var o=jt(t);for(Ui(o)&&(o=o.host);Ne(o)&&["html","body"].indexOf(Re(o))<0;){var c=Xe(o);if(c.transform!=="none"||c.perspective!=="none"||c.contain==="paint"||["transform","perspective"].indexOf(c.willChange)!==-1||e&&c.willChange==="filter"||e&&c.filter&&c.filter!=="none")return o;o=o.parentNode}return null}function _t(t){for(var e=Ee(t),i=Aa(t);i&&Os(i)&&Xe(i).position==="static";)i=Aa(i);return i&&(Re(i)==="html"||Re(i)==="body"&&Xe(i).position==="static")?e:i||dc(t)||e}function yi(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function _i(t,e,i){return yt(t,vi(e,i))}function Ta(t,e,i){var s=_i(t,e,i);return s>i?i:s}function xn(){return{top:0,right:0,bottom:0,left:0}}function Cn(t){return Object.assign({},xn(),t)}function Sn(t,e){return e.reduce(function(i,s){return i[s]=t,i},{})}var pc=function(e,i){return e=typeof e=="function"?e(Object.assign({},i.rects,{placement:i.placement})):e,Cn(typeof e!="number"?e:Sn(e,Ht))};function gc(t){var e,i=t.state,s=t.name,o=t.options,c=i.elements.arrow,d=i.modifiersData.popperOffsets,g=$e(i.placement),v=yi(g),C=[Ce,ke].indexOf(g)>=0,x=C?"height":"width";if(!(!c||!d)){var I=pc(o.padding,i),D=bi(c),S=v==="y"?Te:Ce,N=v==="y"?De:ke,A=i.rects.reference[x]+i.rects.reference[v]-d[v]-i.rects.popper[x],_=d[v]-i.rects.reference[v],R=_t(c),F=R?v==="y"?R.clientHeight||0:R.clientWidth||0:0,T=A/2-_/2,H=I[S],K=F-D[x]-I[N],l=F/2-D[x]/2+T,ee=_i(H,l,K),G=v;i.modifiersData[s]=(e={},e[G]=ee,e.centerOffset=ee-l,e)}}function mc(t){var e=t.state,i=t.options,s=i.element,o=s===void 0?"[data-popper-arrow]":s;o!=null&&(typeof o=="string"&&(o=e.elements.popper.querySelector(o),!o)||wn(e.elements.popper,o)&&(e.elements.arrow=o))}var ur={name:"arrow",enabled:!0,phase:"main",fn:gc,effect:mc,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function dt(t){return t.split("-")[1]}var vc={top:"auto",right:"auto",bottom:"auto",left:"auto"};function bc(t,e){var i=t.x,s=t.y,o=e.devicePixelRatio||1;return{x:Ft(i*o)/o||0,y:Ft(s*o)/o||0}}function wa(t){var e,i=t.popper,s=t.popperRect,o=t.placement,c=t.variation,d=t.offsets,g=t.position,v=t.gpuAcceleration,C=t.adaptive,x=t.roundOffsets,I=t.isFixed,D=d.x,S=D===void 0?0:D,N=d.y,A=N===void 0?0:N,_=typeof x=="function"?x({x:S,y:A}):{x:S,y:A};S=_.x,A=_.y;var R=d.hasOwnProperty("x"),F=d.hasOwnProperty("y"),T=Ce,H=Te,K=window;if(C){var l=_t(i),ee="clientHeight",G="clientWidth";if(l===Ee(i)&&(l=Fe(i),Xe(l).position!=="static"&&g==="absolute"&&(ee="scrollHeight",G="scrollWidth")),l=l,o===Te||(o===Ce||o===ke)&&c===Jt){H=De;var re=I&&l===K&&K.visualViewport?K.visualViewport.height:l[ee];A-=re-s.height,A*=v?1:-1}if(o===Ce||(o===Te||o===De)&&c===Jt){T=ke;var me=I&&l===K&&K.visualViewport?K.visualViewport.width:l[G];S-=me-s.width,S*=v?1:-1}}var _e=Object.assign({position:g},C&&vc),se=x===!0?bc({x:S,y:A},Ee(i)):{x:S,y:A};if(S=se.x,A=se.y,v){var ye;return Object.assign({},_e,(ye={},ye[H]=F?"0":"",ye[T]=R?"0":"",ye.transform=(K.devicePixelRatio||1)<=1?"translate("+S+"px, "+A+"px)":"translate3d("+S+"px, "+A+"px, 0)",ye))}return Object.assign({},_e,(e={},e[H]=F?A+"px":"",e[T]=R?S+"px":"",e.transform="",e))}function yc(t){var e=t.state,i=t.options,s=i.gpuAcceleration,o=s===void 0?!0:s,c=i.adaptive,d=c===void 0?!0:c,g=i.roundOffsets,v=g===void 0?!0:g,C={placement:$e(e.placement),variation:dt(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:o,isFixed:e.options.strategy==="fixed"};e.modifiersData.popperOffsets!=null&&(e.styles.popper=Object.assign({},e.styles.popper,wa(Object.assign({},C,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:d,roundOffsets:v})))),e.modifiersData.arrow!=null&&(e.styles.arrow=Object.assign({},e.styles.arrow,wa(Object.assign({},C,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:v})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})}var qi={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:yc,data:{}};var cr={passive:!0};function _c(t){var e=t.state,i=t.instance,s=t.options,o=s.scroll,c=o===void 0?!0:o,d=s.resize,g=d===void 0?!0:d,v=Ee(e.elements.popper),C=[].concat(e.scrollParents.reference,e.scrollParents.popper);return c&&C.forEach(function(x){x.addEventListener("scroll",i.update,cr)}),g&&v.addEventListener("resize",i.update,cr),function(){c&&C.forEach(function(x){x.removeEventListener("scroll",i.update,cr)}),g&&v.removeEventListener("resize",i.update,cr)}}var zi={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:_c,data:{}};var Ec={left:"right",right:"left",bottom:"top",top:"bottom"};function Ki(t){return t.replace(/left|right|bottom|top/g,function(e){return Ec[e]})}var Ac={start:"end",end:"start"};function fr(t){return t.replace(/start|end/g,function(e){return Ac[e]})}function Ei(t){var e=Ee(t),i=e.pageXOffset,s=e.pageYOffset;return{scrollLeft:i,scrollTop:s}}function Ai(t){return ht(Fe(t)).left+Ei(t).scrollLeft}function Ds(t,e){var i=Ee(t),s=Fe(t),o=i.visualViewport,c=s.clientWidth,d=s.clientHeight,g=0,v=0;if(o){c=o.width,d=o.height;var C=Tn();(C||!C&&e==="fixed")&&(g=o.offsetLeft,v=o.offsetTop)}return{width:c,height:d,x:g+Ai(t),y:v}}function Ls(t){var e,i=Fe(t),s=Ei(t),o=(e=t.ownerDocument)==null?void 0:e.body,c=yt(i.scrollWidth,i.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),d=yt(i.scrollHeight,i.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),g=-s.scrollLeft+Ai(t),v=-s.scrollTop;return Xe(o||i).direction==="rtl"&&(g+=yt(i.clientWidth,o?o.clientWidth:0)-c),{width:c,height:d,x:g,y:v}}function Ti(t){var e=Xe(t),i=e.overflow,s=e.overflowX,o=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+o+s)}function hr(t){return["html","body","#document"].indexOf(Re(t))>=0?t.ownerDocument.body:Ne(t)&&Ti(t)?t:hr(jt(t))}function Qt(t,e){var i;e===void 0&&(e=[]);var s=hr(t),o=s===((i=t.ownerDocument)==null?void 0:i.body),c=Ee(s),d=o?[c].concat(c.visualViewport||[],Ti(s)?s:[]):s,g=e.concat(d);return o?g:g.concat(Qt(jt(d)))}function Xi(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Tc(t,e){var i=ht(t,!1,e==="fixed");return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}function xa(t,e,i){return e===En?Xi(Ds(t,i)):ft(e)?Tc(e,i):Xi(Ls(Fe(t)))}function wc(t){var e=Qt(jt(t)),i=["absolute","fixed"].indexOf(Xe(t).position)>=0,s=i&&Ne(t)?_t(t):t;return ft(s)?e.filter(function(o){return ft(o)&&wn(o,s)&&Re(o)!=="body"}):[]}function Ns(t,e,i,s){var o=e==="clippingParents"?wc(t):[].concat(e),c=[].concat(o,[i]),d=c[0],g=c.reduce(function(v,C){var x=xa(t,C,s);return v.top=yt(x.top,v.top),v.right=vi(x.right,v.right),v.bottom=vi(x.bottom,v.bottom),v.left=yt(x.left,v.left),v},xa(t,d,s));return g.width=g.right-g.left,g.height=g.bottom-g.top,g.x=g.left,g.y=g.top,g}function kn(t){var e=t.reference,i=t.element,s=t.placement,o=s?$e(s):null,c=s?dt(s):null,d=e.x+e.width/2-i.width/2,g=e.y+e.height/2-i.height/2,v;switch(o){case Te:v={x:d,y:e.y-i.height};break;case De:v={x:d,y:e.y+e.height};break;case ke:v={x:e.x+e.width,y:g};break;case Ce:v={x:e.x-i.width,y:g};break;default:v={x:e.x,y:e.y}}var C=o?yi(o):null;if(C!=null){var x=C==="y"?"height":"width";switch(c){case kt:v[C]=v[C]-(e[x]/2-i[x]/2);break;case Jt:v[C]=v[C]+(e[x]/2-i[x]/2);break;default:}}return v}function Ye(t,e){e===void 0&&(e={});var i=e,s=i.placement,o=s===void 0?t.placement:s,c=i.strategy,d=c===void 0?t.strategy:c,g=i.boundary,v=g===void 0?Cs:g,C=i.rootBoundary,x=C===void 0?En:C,I=i.elementContext,D=I===void 0?mi:I,S=i.altBoundary,N=S===void 0?!1:S,A=i.padding,_=A===void 0?0:A,R=Cn(typeof _!="number"?_:Sn(_,Ht)),F=D===mi?Ss:mi,T=t.rects.popper,H=t.elements[N?F:D],K=Ns(ft(H)?H:H.contextElement||Fe(t.elements.popper),v,x,d),l=ht(t.elements.reference),ee=kn({reference:l,element:T,strategy:"absolute",placement:o}),G=Xi(Object.assign({},T,ee)),re=D===mi?G:l,me={top:K.top-re.top+R.top,bottom:re.bottom-K.bottom+R.bottom,left:K.left-re.left+R.left,right:re.right-K.right+R.right},_e=t.modifiersData.offset;if(D===mi&&_e){var se=_e[o];Object.keys(me).forEach(function(ye){var je=[ke,De].indexOf(ye)>=0?1:-1,Y=[Te,De].indexOf(ye)>=0?"y":"x";me[ye]+=se[Y]*je})}return me}function Ps(t,e){e===void 0&&(e={});var i=e,s=i.placement,o=i.boundary,c=i.rootBoundary,d=i.padding,g=i.flipVariations,v=i.allowedAutoPlacements,C=v===void 0?An:v,x=dt(s),I=x?g?lr:lr.filter(function(N){return dt(N)===x}):Ht,D=I.filter(function(N){return C.indexOf(N)>=0});D.length===0&&(D=I);var S=D.reduce(function(N,A){return N[A]=Ye(t,{placement:A,boundary:o,rootBoundary:c,padding:d})[$e(A)],N},{});return Object.keys(S).sort(function(N,A){return S[N]-S[A]})}function xc(t){if($e(t)===_n)return[];var e=Ki(t);return[fr(t),e,fr(e)]}function Cc(t){var e=t.state,i=t.options,s=t.name;if(!e.modifiersData[s]._skip){for(var o=i.mainAxis,c=o===void 0?!0:o,d=i.altAxis,g=d===void 0?!0:d,v=i.fallbackPlacements,C=i.padding,x=i.boundary,I=i.rootBoundary,D=i.altBoundary,S=i.flipVariations,N=S===void 0?!0:S,A=i.allowedAutoPlacements,_=e.options.placement,R=$e(_),F=R===_,T=v||(F||!N?[Ki(_)]:xc(_)),H=[_].concat(T).reduce(function(Ie,Ae){return Ie.concat($e(Ae)===_n?Ps(e,{placement:Ae,boundary:x,rootBoundary:I,padding:C,flipVariations:N,allowedAutoPlacements:A}):Ae)},[]),K=e.rects.reference,l=e.rects.popper,ee=new Map,G=!0,re=H[0],me=0;me<H.length;me++){var _e=H[me],se=$e(_e),ye=dt(_e)===kt,je=[Te,De].indexOf(se)>=0,Y=je?"width":"height",W=Ye(e,{placement:_e,boundary:x,rootBoundary:I,altBoundary:D,padding:C}),X=je?ye?ke:Ce:ye?De:Te;K[Y]>l[Y]&&(X=Ki(X));var oe=Ki(X),de=[];if(c&&de.push(W[se]<=0),g&&de.push(W[X]<=0,W[oe]<=0),de.every(function(Ie){return Ie})){re=_e,G=!1;break}ee.set(_e,de)}if(G)for(var Pe=N?3:1,we=function(Ae){var Ge=H.find(function(it){var qe=ee.get(it);if(qe)return qe.slice(0,Ae).every(function(Be){return Be})});if(Ge)return re=Ge,"break"},Oe=Pe;Oe>0;Oe--){var Se=we(Oe);if(Se==="break")break}e.placement!==re&&(e.modifiersData[s]._skip=!0,e.placement=re,e.reset=!0)}}var dr={name:"flip",enabled:!0,phase:"main",fn:Cc,requiresIfExists:["offset"],data:{_skip:!1}};function Ca(t,e,i){return i===void 0&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Sa(t){return[Te,ke,De,Ce].some(function(e){return t[e]>=0})}function Sc(t){var e=t.state,i=t.name,s=e.rects.reference,o=e.rects.popper,c=e.modifiersData.preventOverflow,d=Ye(e,{elementContext:"reference"}),g=Ye(e,{altBoundary:!0}),v=Ca(d,s),C=Ca(g,o,c),x=Sa(v),I=Sa(C);e.modifiersData[i]={referenceClippingOffsets:v,popperEscapeOffsets:C,isReferenceHidden:x,hasPopperEscaped:I},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":x,"data-popper-escaped":I})}var pr={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:Sc};function kc(t,e,i){var s=$e(t),o=[Ce,Te].indexOf(s)>=0?-1:1,c=typeof i=="function"?i(Object.assign({},e,{placement:t})):i,d=c[0],g=c[1];return d=d||0,g=(g||0)*o,[Ce,ke].indexOf(s)>=0?{x:g,y:d}:{x:d,y:g}}function Oc(t){var e=t.state,i=t.options,s=t.name,o=i.offset,c=o===void 0?[0,0]:o,d=An.reduce(function(x,I){return x[I]=kc(I,e.rects,c),x},{}),g=d[e.placement],v=g.x,C=g.y;e.modifiersData.popperOffsets!=null&&(e.modifiersData.popperOffsets.x+=v,e.modifiersData.popperOffsets.y+=C),e.modifiersData[s]=d}var gr={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:Oc};function Dc(t){var e=t.state,i=t.name;e.modifiersData[i]=kn({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})}var Yi={name:"popperOffsets",enabled:!0,phase:"read",fn:Dc,data:{}};function Is(t){return t==="x"?"y":"x"}function Lc(t){var e=t.state,i=t.options,s=t.name,o=i.mainAxis,c=o===void 0?!0:o,d=i.altAxis,g=d===void 0?!1:d,v=i.boundary,C=i.rootBoundary,x=i.altBoundary,I=i.padding,D=i.tether,S=D===void 0?!0:D,N=i.tetherOffset,A=N===void 0?0:N,_=Ye(e,{boundary:v,rootBoundary:C,padding:I,altBoundary:x}),R=$e(e.placement),F=dt(e.placement),T=!F,H=yi(R),K=Is(H),l=e.modifiersData.popperOffsets,ee=e.rects.reference,G=e.rects.popper,re=typeof A=="function"?A(Object.assign({},e.rects,{placement:e.placement})):A,me=typeof re=="number"?{mainAxis:re,altAxis:re}:Object.assign({mainAxis:0,altAxis:0},re),_e=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,se={x:0,y:0};if(l){if(c){var ye,je=H==="y"?Te:Ce,Y=H==="y"?De:ke,W=H==="y"?"height":"width",X=l[H],oe=X+_[je],de=X-_[Y],Pe=S?-G[W]/2:0,we=F===kt?ee[W]:G[W],Oe=F===kt?-G[W]:-ee[W],Se=e.elements.arrow,Ie=S&&Se?bi(Se):{width:0,height:0},Ae=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:xn(),Ge=Ae[je],it=Ae[Y],qe=_i(0,ee[W],Ie[W]),Be=T?ee[W]/2-Pe-qe-Ge-me.mainAxis:we-qe-Ge-me.mainAxis,ui=T?-ee[W]/2+Pe+qe+it+me.mainAxis:Oe+qe+it+me.mainAxis,At=e.elements.arrow&&_t(e.elements.arrow),Pi=At?H==="y"?At.clientTop||0:At.clientLeft||0:0,ln=(ye=_e?.[H])!=null?ye:0,es=X+Be-ln-Pi,un=X+ui-ln,ci=_i(S?vi(oe,es):oe,X,S?yt(de,un):de);l[H]=ci,se[H]=ci-X}if(g){var at,ts=H==="x"?Te:Ce,is=H==="x"?De:ke,It=l[K],ze=K==="y"?"height":"width",zt=It+_[ts],Kt=It-_[is],J=[Te,Ce].indexOf(R)!==-1,Me=(at=_e?.[K])!=null?at:0,Xn=J?zt:It-ee[ze]-G[ze]-Me+me.altAxis,Yn=J?It+ee[ze]+G[ze]-Me-me.altAxis:Kt,Gn=S&&J?Ta(Xn,It,Yn):_i(S?Xn:zt,It,S?Yn:Kt);l[K]=Gn,se[K]=Gn-It}e.modifiersData[s]=se}}var mr={name:"preventOverflow",enabled:!0,phase:"main",fn:Lc,requiresIfExists:["offset"]};function Rs(t){return{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}}function $s(t){return t===Ee(t)||!Ne(t)?Ei(t):Rs(t)}function Nc(t){var e=t.getBoundingClientRect(),i=Ft(e.width)/t.offsetWidth||1,s=Ft(e.height)/t.offsetHeight||1;return i!==1||s!==1}function Ms(t,e,i){i===void 0&&(i=!1);var s=Ne(e),o=Ne(e)&&Nc(e),c=Fe(e),d=ht(t,o,i),g={scrollLeft:0,scrollTop:0},v={x:0,y:0};return(s||!s&&!i)&&((Re(e)!=="body"||Ti(c))&&(g=$s(e)),Ne(e)?(v=ht(e,!0),v.x+=e.clientLeft,v.y+=e.clientTop):c&&(v.x=Ai(c))),{x:d.left+g.scrollLeft-v.x,y:d.top+g.scrollTop-v.y,width:d.width,height:d.height}}function Pc(t){var e=new Map,i=new Set,s=[];t.forEach(function(c){e.set(c.name,c)});function o(c){i.add(c.name);var d=[].concat(c.requires||[],c.requiresIfExists||[]);d.forEach(function(g){if(!i.has(g)){var v=e.get(g);v&&o(v)}}),s.push(c)}return t.forEach(function(c){i.has(c.name)||o(c)}),s}function Hs(t){var e=Pc(t);return ks.reduce(function(i,s){return i.concat(e.filter(function(o){return o.phase===s}))},[])}function Fs(t){var e;return function(){return e||(e=new Promise(function(i){Promise.resolve().then(function(){e=void 0,i(t())})})),e}}function js(t){var e=t.reduce(function(i,s){var o=i[s.name];return i[s.name]=o?Object.assign({},o,s,{options:Object.assign({},o.options,s.options),data:Object.assign({},o.data,s.data)}):s,i},{});return Object.keys(e).map(function(i){return e[i]})}var ka={placement:"bottom",modifiers:[],strategy:"absolute"};function Oa(){for(var t=arguments.length,e=new Array(t),i=0;i<t;i++)e[i]=arguments[i];return!e.some(function(s){return!(s&&typeof s.getBoundingClientRect=="function")})}function wi(t){t===void 0&&(t={});var e=t,i=e.defaultModifiers,s=i===void 0?[]:i,o=e.defaultOptions,c=o===void 0?ka:o;return function(g,v,C){C===void 0&&(C=c);var x={placement:"bottom",orderedModifiers:[],options:Object.assign({},ka,c),modifiersData:{},elements:{reference:g,popper:v},attributes:{},styles:{}},I=[],D=!1,S={state:x,setOptions:function(R){var F=typeof R=="function"?R(x.options):R;A(),x.options=Object.assign({},c,x.options,F),x.scrollParents={reference:ft(g)?Qt(g):g.contextElement?Qt(g.contextElement):[],popper:Qt(v)};var T=Hs(js([].concat(s,x.options.modifiers)));return x.orderedModifiers=T.filter(function(H){return H.enabled}),N(),S.update()},forceUpdate:function(){if(!D){var R=x.elements,F=R.reference,T=R.popper;if(Oa(F,T)){x.rects={reference:Ms(F,_t(T),x.options.strategy==="fixed"),popper:bi(T)},x.reset=!1,x.placement=x.options.placement,x.orderedModifiers.forEach(function(me){return x.modifiersData[me.name]=Object.assign({},me.data)});for(var H=0;H<x.orderedModifiers.length;H++){if(x.reset===!0){x.reset=!1,H=-1;continue}var K=x.orderedModifiers[H],l=K.fn,ee=K.options,G=ee===void 0?{}:ee,re=K.name;typeof l=="function"&&(x=l({state:x,options:G,name:re,instance:S})||x)}}}},update:Fs(function(){return new Promise(function(_){S.forceUpdate(),_(x)})}),destroy:function(){A(),D=!0}};if(!Oa(g,v))return S;S.setOptions(C).then(function(_){!D&&C.onFirstUpdate&&C.onFirstUpdate(_)});function N(){x.orderedModifiers.forEach(function(_){var R=_.name,F=_.options,T=F===void 0?{}:F,H=_.effect;if(typeof H=="function"){var K=H({state:x,name:R,instance:S,options:T}),l=function(){};I.push(K||l)}})}function A(){I.forEach(function(_){return _()}),I=[]}return S}}var Da=wi();var Ic=[zi,Yi,qi,Vi],La=wi({defaultModifiers:Ic});var Rc=[zi,Yi,qi,Vi,gr,dr,mr,ur,pr],On=wi({defaultModifiers:Rc});var Zt=new Map,Bs={set(t,e,i){Zt.has(t)||Zt.set(t,new Map);let s=Zt.get(t);if(!s.has(e)&&s.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`);return}s.set(e,i)},get(t,e){return Zt.has(t)&&Zt.get(t).get(e)||null},remove(t,e){if(!Zt.has(t))return;let i=Zt.get(t);i.delete(e),i.size===0&&Zt.delete(t)}},$c=1e6,Mc=1e3,io="transitionend",ol=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,(e,i)=>`#${CSS.escape(i)}`)),t),Hc=t=>t==null?`${t}`:Object.prototype.toString.call(t).match(/\s([a-z]+)/i)[1].toLowerCase(),Fc=t=>{do t+=Math.floor(Math.random()*$c);while(document.getElementById(t));return t},jc=t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t),s=Number.parseFloat(e),o=Number.parseFloat(i);return!s&&!o?0:(e=e.split(",")[0],i=i.split(",")[0],(Number.parseFloat(e)+Number.parseFloat(i))*Mc)},al=t=>{t.dispatchEvent(new Event(io))},Bt=t=>!t||typeof t!="object"?!1:(typeof t.jquery<"u"&&(t=t[0]),typeof t.nodeType<"u"),ei=t=>Bt(t)?t.jquery?t[0]:t:typeof t=="string"&&t.length>0?document.querySelector(ol(t)):null,rn=t=>{if(!Bt(t)||t.getClientRects().length===0)return!1;let e=getComputedStyle(t).getPropertyValue("visibility")==="visible",i=t.closest("details:not([open])");if(!i)return e;if(i!==t){let s=t.closest("summary");if(s&&s.parentNode!==i||s===null)return!1}return e},ti=t=>!t||t.nodeType!==Node.ELEMENT_NODE||t.classList.contains("disabled")?!0:typeof t.disabled<"u"?t.disabled:t.hasAttribute("disabled")&&t.getAttribute("disabled")!=="false",ll=t=>{if(!document.documentElement.attachShadow)return null;if(typeof t.getRootNode=="function"){let e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?ll(t.parentNode):null},Cr=()=>{},Rn=t=>{t.offsetHeight},ul=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,Us=[],Bc=t=>{document.readyState==="loading"?(Us.length||document.addEventListener("DOMContentLoaded",()=>{for(let e of Us)e()}),Us.push(t)):t()},pt=()=>document.documentElement.dir==="rtl",mt=t=>{Bc(()=>{let e=ul();if(e){let i=t.NAME,s=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=s,t.jQueryInterface)}})},et=(t,e=[],i=t)=>typeof t=="function"?t(...e):i,cl=(t,e,i=!0)=>{if(!i){et(t);return}let o=jc(e)+5,c=!1,d=({target:g})=>{g===e&&(c=!0,e.removeEventListener(io,d),et(t))};e.addEventListener(io,d),setTimeout(()=>{c||al(e)},o)},ao=(t,e,i,s)=>{let o=t.length,c=t.indexOf(e);return c===-1?!i&&s?t[o-1]:t[0]:(c+=i?1:-1,s&&(c=(c+o)%o),t[Math.max(0,Math.min(c,o-1))])},Uc=/[^.]*(?=\..*)\.|.*/,Vc=/\..*/,Wc=/::\d+$/,Vs={},Na=1,fl={mouseenter:"mouseover",mouseleave:"mouseout"},qc=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function hl(t,e){return e&&`${e}::${Na++}`||t.uidEvent||Na++}function dl(t){let e=hl(t);return t.uidEvent=e,Vs[e]=Vs[e]||{},Vs[e]}function zc(t,e){return function i(s){return lo(s,{delegateTarget:t}),i.oneOff&&B.off(t,s.type,e),e.apply(t,[s])}}function Kc(t,e,i){return function s(o){let c=t.querySelectorAll(e);for(let{target:d}=o;d&&d!==this;d=d.parentNode)for(let g of c)if(g===d)return lo(o,{delegateTarget:d}),s.oneOff&&B.off(t,o.type,e,i),i.apply(d,[o])}}function pl(t,e,i=null){return Object.values(t).find(s=>s.callable===e&&s.delegationSelector===i)}function gl(t,e,i){let s=typeof e=="string",o=s?i:e||i,c=ml(t);return qc.has(c)||(c=t),[s,o,c]}function Pa(t,e,i,s,o){if(typeof e!="string"||!t)return;let[c,d,g]=gl(e,i,s);e in fl&&(d=(N=>function(A){if(!A.relatedTarget||A.relatedTarget!==A.delegateTarget&&!A.delegateTarget.contains(A.relatedTarget))return N.call(this,A)})(d));let v=dl(t),C=v[g]||(v[g]={}),x=pl(C,d,c?i:null);if(x){x.oneOff=x.oneOff&&o;return}let I=hl(d,e.replace(Uc,"")),D=c?Kc(t,i,d):zc(t,d);D.delegationSelector=c?i:null,D.callable=d,D.oneOff=o,D.uidEvent=I,C[I]=D,t.addEventListener(g,D,c)}function no(t,e,i,s,o){let c=pl(e[i],s,o);c&&(t.removeEventListener(i,c,!!o),delete e[i][c.uidEvent])}function Xc(t,e,i,s){let o=e[i]||{};for(let[c,d]of Object.entries(o))c.includes(s)&&no(t,e,i,d.callable,d.delegationSelector)}function ml(t){return t=t.replace(Vc,""),fl[t]||t}var B={on(t,e,i,s){Pa(t,e,i,s,!1)},one(t,e,i,s){Pa(t,e,i,s,!0)},off(t,e,i,s){if(typeof e!="string"||!t)return;let[o,c,d]=gl(e,i,s),g=d!==e,v=dl(t),C=v[d]||{},x=e.startsWith(".");if(typeof c<"u"){if(!Object.keys(C).length)return;no(t,v,d,c,o?i:null);return}if(x)for(let I of Object.keys(v))Xc(t,v,I,e.slice(1));for(let[I,D]of Object.entries(C)){let S=I.replace(Wc,"");(!g||e.includes(S))&&no(t,v,d,D.callable,D.delegationSelector)}},trigger(t,e,i){if(typeof e!="string"||!t)return null;let s=ul(),o=ml(e),c=e!==o,d=null,g=!0,v=!0,C=!1;c&&s&&(d=s.Event(e,i),s(t).trigger(d),g=!d.isPropagationStopped(),v=!d.isImmediatePropagationStopped(),C=d.isDefaultPrevented());let x=lo(new Event(e,{bubbles:g,cancelable:!0}),i);return C&&x.preventDefault(),v&&t.dispatchEvent(x),x.defaultPrevented&&d&&d.preventDefault(),x}};function lo(t,e={}){for(let[i,s]of Object.entries(e))try{t[i]=s}catch{Object.defineProperty(t,i,{configurable:!0,get(){return s}})}return t}function Ia(t){if(t==="true")return!0;if(t==="false")return!1;if(t===Number(t).toString())return Number(t);if(t===""||t==="null")return null;if(typeof t!="string")return t;try{return JSON.parse(decodeURIComponent(t))}catch{return t}}function Ws(t){return t.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}var Ut={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${Ws(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${Ws(e)}`)},getDataAttributes(t){if(!t)return{};let e={},i=Object.keys(t.dataset).filter(s=>s.startsWith("bs")&&!s.startsWith("bsConfig"));for(let s of i){let o=s.replace(/^bs/,"");o=o.charAt(0).toLowerCase()+o.slice(1,o.length),e[o]=Ia(t.dataset[s])}return e},getDataAttribute(t,e){return Ia(t.getAttribute(`data-bs-${Ws(e)}`))}},Si=class{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(e){return e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e}_mergeConfigObj(e,i){let s=Bt(i)?Ut.getDataAttribute(i,"config"):{};return{...this.constructor.Default,...typeof s=="object"?s:{},...Bt(i)?Ut.getDataAttributes(i):{},...typeof e=="object"?e:{}}}_typeCheckConfig(e,i=this.constructor.DefaultType){for(let[s,o]of Object.entries(i)){let c=e[s],d=Bt(c)?"element":Hc(c);if(!new RegExp(o).test(d))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${s}" provided type "${d}" but expected type "${o}".`)}}},Yc="5.3.3",nt=class extends Si{constructor(e,i){super(),e=ei(e),e&&(this._element=e,this._config=this._getConfig(i),Bs.set(this._element,this.constructor.DATA_KEY,this))}dispose(){Bs.remove(this._element,this.constructor.DATA_KEY),B.off(this._element,this.constructor.EVENT_KEY);for(let e of Object.getOwnPropertyNames(this))this[e]=null}_queueCallback(e,i,s=!0){cl(e,i,s)}_getConfig(e){return e=this._mergeConfigObj(e,this._element),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}static getInstance(e){return Bs.get(ei(e),this.DATA_KEY)}static getOrCreateInstance(e,i={}){return this.getInstance(e)||new this(e,typeof i=="object"?i:null)}static get VERSION(){return Yc}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(e){return`${e}${this.EVENT_KEY}`}},qs=t=>{let e=t.getAttribute("data-bs-target");if(!e||e==="#"){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&i!=="#"?i.trim():null}return e?e.split(",").map(i=>ol(i)).join(","):null},te={find(t,e=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(e,t))},findOne(t,e=document.documentElement){return Element.prototype.querySelector.call(e,t)},children(t,e){return[].concat(...t.children).filter(i=>i.matches(e))},parents(t,e){let i=[],s=t.parentNode.closest(e);for(;s;)i.push(s),s=s.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){let e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(i=>`${i}:not([tabindex^="-"])`).join(",");return this.find(e,t).filter(i=>!ti(i)&&rn(i))},getSelectorFromElement(t){let e=qs(t);return e&&te.findOne(e)?e:null},getElementFromSelector(t){let e=qs(t);return e?te.findOne(e):null},getMultipleElementsFromSelector(t){let e=qs(t);return e?te.find(e):[]}},$r=(t,e="hide")=>{let i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;B.on(document,i,`[data-bs-dismiss="${s}"]`,function(o){if(["A","AREA"].includes(this.tagName)&&o.preventDefault(),ti(this))return;let c=te.getElementFromSelector(this)||this.closest(`.${s}`);t.getOrCreateInstance(c)[e]()})},Gc="alert",Jc="bs.alert",vl=`.${Jc}`,Qc=`close${vl}`,Zc=`closed${vl}`,ef="fade",tf="show",Sr=class t extends nt{static get NAME(){return Gc}close(){if(B.trigger(this._element,Qc).defaultPrevented)return;this._element.classList.remove(tf);let i=this._element.classList.contains(ef);this._queueCallback(()=>this._destroyElement(),this._element,i)}_destroyElement(){this._element.remove(),B.trigger(this._element,Zc),this.dispose()}static jQueryInterface(e){return this.each(function(){let i=t.getOrCreateInstance(this);if(typeof e=="string"){if(i[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);i[e](this)}})}};$r(Sr,"close");mt(Sr);var nf="button",rf="bs.button",sf=`.${rf}`,of=".data-api",af="active",Ra='[data-bs-toggle="button"]',lf=`click${sf}${of}`,kr=class t extends nt{static get NAME(){return nf}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(af))}static jQueryInterface(e){return this.each(function(){let i=t.getOrCreateInstance(this);e==="toggle"&&i[e]()})}};B.on(document,lf,Ra,t=>{t.preventDefault();let e=t.target.closest(Ra);kr.getOrCreateInstance(e).toggle()});mt(kr);var uf="swipe",sn=".bs.swipe",cf=`touchstart${sn}`,ff=`touchmove${sn}`,hf=`touchend${sn}`,df=`pointerdown${sn}`,pf=`pointerup${sn}`,gf="touch",mf="pen",vf="pointer-event",bf=40,yf={endCallback:null,leftCallback:null,rightCallback:null},_f={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"},Or=class t extends Si{constructor(e,i){super(),this._element=e,!(!e||!t.isSupported())&&(this._config=this._getConfig(i),this._deltaX=0,this._supportPointerEvents=!!window.PointerEvent,this._initEvents())}static get Default(){return yf}static get DefaultType(){return _f}static get NAME(){return uf}dispose(){B.off(this._element,sn)}_start(e){if(!this._supportPointerEvents){this._deltaX=e.touches[0].clientX;return}this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX)}_end(e){this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX-this._deltaX),this._handleSwipe(),et(this._config.endCallback)}_move(e){this._deltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this._deltaX}_handleSwipe(){let e=Math.abs(this._deltaX);if(e<=bf)return;let i=e/this._deltaX;this._deltaX=0,i&&et(i>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(B.on(this._element,df,e=>this._start(e)),B.on(this._element,pf,e=>this._end(e)),this._element.classList.add(vf)):(B.on(this._element,cf,e=>this._start(e)),B.on(this._element,ff,e=>this._move(e)),B.on(this._element,hf,e=>this._end(e)))}_eventIsPointerPenTouch(e){return this._supportPointerEvents&&(e.pointerType===mf||e.pointerType===gf)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}},Ef="carousel",Af="bs.carousel",ri=`.${Af}`,bl=".data-api",Tf="ArrowLeft",wf="ArrowRight",xf=500,Dn="next",Gi="prev",Qi="left",wr="right",Cf=`slide${ri}`,zs=`slid${ri}`,Sf=`keydown${ri}`,kf=`mouseenter${ri}`,Of=`mouseleave${ri}`,Df=`dragstart${ri}`,Lf=`load${ri}${bl}`,Nf=`click${ri}${bl}`,yl="carousel",br="active",Pf="slide",If="carousel-item-end",Rf="carousel-item-start",$f="carousel-item-next",Mf="carousel-item-prev",_l=".active",El=".carousel-item",Hf=_l+El,Ff=".carousel-item img",jf=".carousel-indicators",Bf="[data-bs-slide], [data-bs-slide-to]",Uf='[data-bs-ride="carousel"]',Vf={[Tf]:wr,[wf]:Qi},Wf={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},qf={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"},Nn=class t extends nt{constructor(e,i){super(e,i),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=te.findOne(jf,this._element),this._addEventListeners(),this._config.ride===yl&&this.cycle()}static get Default(){return Wf}static get DefaultType(){return qf}static get NAME(){return Ef}next(){this._slide(Dn)}nextWhenVisible(){!document.hidden&&rn(this._element)&&this.next()}prev(){this._slide(Gi)}pause(){this._isSliding&&al(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){if(this._config.ride){if(this._isSliding){B.one(this._element,zs,()=>this.cycle());return}this.cycle()}}to(e){let i=this._getItems();if(e>i.length-1||e<0)return;if(this._isSliding){B.one(this._element,zs,()=>this.to(e));return}let s=this._getItemIndex(this._getActive());if(s===e)return;let o=e>s?Dn:Gi;this._slide(o,i[e])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(e){return e.defaultInterval=e.interval,e}_addEventListeners(){this._config.keyboard&&B.on(this._element,Sf,e=>this._keydown(e)),this._config.pause==="hover"&&(B.on(this._element,kf,()=>this.pause()),B.on(this._element,Of,()=>this._maybeEnableCycle())),this._config.touch&&Or.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(let s of te.find(Ff,this._element))B.on(s,Df,o=>o.preventDefault());let i={leftCallback:()=>this._slide(this._directionToOrder(Qi)),rightCallback:()=>this._slide(this._directionToOrder(wr)),endCallback:()=>{this._config.pause==="hover"&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),xf+this._config.interval))}};this._swipeHelper=new Or(this._element,i)}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;let i=Vf[e.key];i&&(e.preventDefault(),this._slide(this._directionToOrder(i)))}_getItemIndex(e){return this._getItems().indexOf(e)}_setActiveIndicatorElement(e){if(!this._indicatorsElement)return;let i=te.findOne(_l,this._indicatorsElement);i.classList.remove(br),i.removeAttribute("aria-current");let s=te.findOne(`[data-bs-slide-to="${e}"]`,this._indicatorsElement);s&&(s.classList.add(br),s.setAttribute("aria-current","true"))}_updateInterval(){let e=this._activeElement||this._getActive();if(!e)return;let i=Number.parseInt(e.getAttribute("data-bs-interval"),10);this._config.interval=i||this._config.defaultInterval}_slide(e,i=null){if(this._isSliding)return;let s=this._getActive(),o=e===Dn,c=i||ao(this._getItems(),s,o,this._config.wrap);if(c===s)return;let d=this._getItemIndex(c),g=S=>B.trigger(this._element,S,{relatedTarget:c,direction:this._orderToDirection(e),from:this._getItemIndex(s),to:d});if(g(Cf).defaultPrevented||!s||!c)return;let C=!!this._interval;this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(d),this._activeElement=c;let x=o?Rf:If,I=o?$f:Mf;c.classList.add(I),Rn(c),s.classList.add(x),c.classList.add(x);let D=()=>{c.classList.remove(x,I),c.classList.add(br),s.classList.remove(br,I,x),this._isSliding=!1,g(zs)};this._queueCallback(D,s,this._isAnimated()),C&&this.cycle()}_isAnimated(){return this._element.classList.contains(Pf)}_getActive(){return te.findOne(Hf,this._element)}_getItems(){return te.find(El,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(e){return pt()?e===Qi?Gi:Dn:e===Qi?Dn:Gi}_orderToDirection(e){return pt()?e===Gi?Qi:wr:e===Gi?wr:Qi}static jQueryInterface(e){return this.each(function(){let i=t.getOrCreateInstance(this,e);if(typeof e=="number"){i.to(e);return}if(typeof e=="string"){if(i[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);i[e]()}})}};B.on(document,Nf,Bf,function(t){let e=te.getElementFromSelector(this);if(!e||!e.classList.contains(yl))return;t.preventDefault();let i=Nn.getOrCreateInstance(e),s=this.getAttribute("data-bs-slide-to");if(s){i.to(s),i._maybeEnableCycle();return}if(Ut.getDataAttribute(this,"slide")==="next"){i.next(),i._maybeEnableCycle();return}i.prev(),i._maybeEnableCycle()});B.on(window,Lf,()=>{let t=te.find(Uf);for(let e of t)Nn.getOrCreateInstance(e)});mt(Nn);var zf="collapse",Kf="bs.collapse",$n=`.${Kf}`,Xf=".data-api",Yf=`show${$n}`,Gf=`shown${$n}`,Jf=`hide${$n}`,Qf=`hidden${$n}`,Zf=`click${$n}${Xf}`,Ks="show",en="collapse",yr="collapsing",eh="collapsed",th=`:scope .${en} .${en}`,ih="collapse-horizontal",nh="width",rh="height",sh=".collapse.show, .collapse.collapsing",ro='[data-bs-toggle="collapse"]',oh={parent:null,toggle:!0},ah={parent:"(null|element)",toggle:"boolean"},Dr=class t extends nt{constructor(e,i){super(e,i),this._isTransitioning=!1,this._triggerArray=[];let s=te.find(ro);for(let o of s){let c=te.getSelectorFromElement(o),d=te.find(c).filter(g=>g===this._element);c!==null&&d.length&&this._triggerArray.push(o)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return oh}static get DefaultType(){return ah}static get NAME(){return zf}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let e=[];if(this._config.parent&&(e=this._getFirstLevelChildren(sh).filter(g=>g!==this._element).map(g=>t.getOrCreateInstance(g,{toggle:!1}))),e.length&&e[0]._isTransitioning||B.trigger(this._element,Yf).defaultPrevented)return;for(let g of e)g.hide();let s=this._getDimension();this._element.classList.remove(en),this._element.classList.add(yr),this._element.style[s]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;let o=()=>{this._isTransitioning=!1,this._element.classList.remove(yr),this._element.classList.add(en,Ks),this._element.style[s]="",B.trigger(this._element,Gf)},d=`scroll${s[0].toUpperCase()+s.slice(1)}`;this._queueCallback(o,this._element,!0),this._element.style[s]=`${this._element[d]}px`}hide(){if(this._isTransitioning||!this._isShown()||B.trigger(this._element,Jf).defaultPrevented)return;let i=this._getDimension();this._element.style[i]=`${this._element.getBoundingClientRect()[i]}px`,Rn(this._element),this._element.classList.add(yr),this._element.classList.remove(en,Ks);for(let o of this._triggerArray){let c=te.getElementFromSelector(o);c&&!this._isShown(c)&&this._addAriaAndCollapsedClass([o],!1)}this._isTransitioning=!0;let s=()=>{this._isTransitioning=!1,this._element.classList.remove(yr),this._element.classList.add(en),B.trigger(this._element,Qf)};this._element.style[i]="",this._queueCallback(s,this._element,!0)}_isShown(e=this._element){return e.classList.contains(Ks)}_configAfterMerge(e){return e.toggle=!!e.toggle,e.parent=ei(e.parent),e}_getDimension(){return this._element.classList.contains(ih)?nh:rh}_initializeChildren(){if(!this._config.parent)return;let e=this._getFirstLevelChildren(ro);for(let i of e){let s=te.getElementFromSelector(i);s&&this._addAriaAndCollapsedClass([i],this._isShown(s))}}_getFirstLevelChildren(e){let i=te.find(th,this._config.parent);return te.find(e,this._config.parent).filter(s=>!i.includes(s))}_addAriaAndCollapsedClass(e,i){if(e.length)for(let s of e)s.classList.toggle(eh,!i),s.setAttribute("aria-expanded",i)}static jQueryInterface(e){let i={};return typeof e=="string"&&/show|hide/.test(e)&&(i.toggle=!1),this.each(function(){let s=t.getOrCreateInstance(this,i);if(typeof e=="string"){if(typeof s[e]>"u")throw new TypeError(`No method named "${e}"`);s[e]()}})}};B.on(document,Zf,ro,function(t){(t.target.tagName==="A"||t.delegateTarget&&t.delegateTarget.tagName==="A")&&t.preventDefault();for(let e of te.getMultipleElementsFromSelector(this))Dr.getOrCreateInstance(e,{toggle:!1}).toggle()});mt(Dr);var $a="dropdown",lh="bs.dropdown",ki=`.${lh}`,uo=".data-api",uh="Escape",Ma="Tab",ch="ArrowUp",Ha="ArrowDown",fh=2,hh=`hide${ki}`,dh=`hidden${ki}`,ph=`show${ki}`,gh=`shown${ki}`,Al=`click${ki}${uo}`,Tl=`keydown${ki}${uo}`,mh=`keyup${ki}${uo}`,Zi="show",vh="dropup",bh="dropend",yh="dropstart",_h="dropup-center",Eh="dropdown-center",xi='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',Ah=`${xi}.${Zi}`,xr=".dropdown-menu",Th=".navbar",wh=".navbar-nav",xh=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Ch=pt()?"top-end":"top-start",Sh=pt()?"top-start":"top-end",kh=pt()?"bottom-end":"bottom-start",Oh=pt()?"bottom-start":"bottom-end",Dh=pt()?"left-start":"right-start",Lh=pt()?"right-start":"left-start",Nh="top",Ph="bottom",Ih={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Rh={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"},ii=class t extends nt{constructor(e,i){super(e,i),this._popper=null,this._parent=this._element.parentNode,this._menu=te.next(this._element,xr)[0]||te.prev(this._element,xr)[0]||te.findOne(xr,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return Ih}static get DefaultType(){return Rh}static get NAME(){return $a}toggle(){return this._isShown()?this.hide():this.show()}show(){if(ti(this._element)||this._isShown())return;let e={relatedTarget:this._element};if(!B.trigger(this._element,ph,e).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(wh))for(let s of[].concat(...document.body.children))B.on(s,"mouseover",Cr);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Zi),this._element.classList.add(Zi),B.trigger(this._element,gh,e)}}hide(){if(ti(this._element)||!this._isShown())return;let e={relatedTarget:this._element};this._completeHide(e)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(e){if(!B.trigger(this._element,hh,e).defaultPrevented){if("ontouchstart"in document.documentElement)for(let s of[].concat(...document.body.children))B.off(s,"mouseover",Cr);this._popper&&this._popper.destroy(),this._menu.classList.remove(Zi),this._element.classList.remove(Zi),this._element.setAttribute("aria-expanded","false"),Ut.removeDataAttribute(this._menu,"popper"),B.trigger(this._element,dh,e)}}_getConfig(e){if(e=super._getConfig(e),typeof e.reference=="object"&&!Bt(e.reference)&&typeof e.reference.getBoundingClientRect!="function")throw new TypeError(`${$a.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return e}_createPopper(){if(typeof vr>"u")throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;this._config.reference==="parent"?e=this._parent:Bt(this._config.reference)?e=ei(this._config.reference):typeof this._config.reference=="object"&&(e=this._config.reference);let i=this._getPopperConfig();this._popper=On(e,this._menu,i)}_isShown(){return this._menu.classList.contains(Zi)}_getPlacement(){let e=this._parent;if(e.classList.contains(bh))return Dh;if(e.classList.contains(yh))return Lh;if(e.classList.contains(_h))return Nh;if(e.classList.contains(Eh))return Ph;let i=getComputedStyle(this._menu).getPropertyValue("--bs-position").trim()==="end";return e.classList.contains(vh)?i?Sh:Ch:i?Oh:kh}_detectNavbar(){return this._element.closest(Th)!==null}_getOffset(){let{offset:e}=this._config;return typeof e=="string"?e.split(",").map(i=>Number.parseInt(i,10)):typeof e=="function"?i=>e(i,this._element):e}_getPopperConfig(){let e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display==="static")&&(Ut.setDataAttribute(this._menu,"popper","static"),e.modifiers=[{name:"applyStyles",enabled:!1}]),{...e,...et(this._config.popperConfig,[e])}}_selectMenuItem({key:e,target:i}){let s=te.find(xh,this._menu).filter(o=>rn(o));s.length&&ao(s,i,e===Ha,!s.includes(i)).focus()}static jQueryInterface(e){return this.each(function(){let i=t.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof i[e]>"u")throw new TypeError(`No method named "${e}"`);i[e]()}})}static clearMenus(e){if(e.button===fh||e.type==="keyup"&&e.key!==Ma)return;let i=te.find(Ah);for(let s of i){let o=t.getInstance(s);if(!o||o._config.autoClose===!1)continue;let c=e.composedPath(),d=c.includes(o._menu);if(c.includes(o._element)||o._config.autoClose==="inside"&&!d||o._config.autoClose==="outside"&&d||o._menu.contains(e.target)&&(e.type==="keyup"&&e.key===Ma||/input|select|option|textarea|form/i.test(e.target.tagName)))continue;let g={relatedTarget:o._element};e.type==="click"&&(g.clickEvent=e),o._completeHide(g)}}static dataApiKeydownHandler(e){let i=/input|textarea/i.test(e.target.tagName),s=e.key===uh,o=[ch,Ha].includes(e.key);if(!o&&!s||i&&!s)return;e.preventDefault();let c=this.matches(xi)?this:te.prev(this,xi)[0]||te.next(this,xi)[0]||te.findOne(xi,e.delegateTarget.parentNode),d=t.getOrCreateInstance(c);if(o){e.stopPropagation(),d.show(),d._selectMenuItem(e);return}d._isShown()&&(e.stopPropagation(),d.hide(),c.focus())}};B.on(document,Tl,xi,ii.dataApiKeydownHandler);B.on(document,Tl,xr,ii.dataApiKeydownHandler);B.on(document,Al,ii.clearMenus);B.on(document,mh,ii.clearMenus);B.on(document,Al,xi,function(t){t.preventDefault(),ii.getOrCreateInstance(this).toggle()});mt(ii);var wl="backdrop",$h="fade",Fa="show",ja=`mousedown.bs.${wl}`,Mh={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Hh={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"},Lr=class extends Si{constructor(e){super(),this._config=this._getConfig(e),this._isAppended=!1,this._element=null}static get Default(){return Mh}static get DefaultType(){return Hh}static get NAME(){return wl}show(e){if(!this._config.isVisible){et(e);return}this._append();let i=this._getElement();this._config.isAnimated&&Rn(i),i.classList.add(Fa),this._emulateAnimation(()=>{et(e)})}hide(e){if(!this._config.isVisible){et(e);return}this._getElement().classList.remove(Fa),this._emulateAnimation(()=>{this.dispose(),et(e)})}dispose(){this._isAppended&&(B.off(this._element,ja),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){let e=document.createElement("div");e.className=this._config.className,this._config.isAnimated&&e.classList.add($h),this._element=e}return this._element}_configAfterMerge(e){return e.rootElement=ei(e.rootElement),e}_append(){if(this._isAppended)return;let e=this._getElement();this._config.rootElement.append(e),B.on(e,ja,()=>{et(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(e){cl(e,this._getElement(),this._config.isAnimated)}},Fh="focustrap",jh="bs.focustrap",Nr=`.${jh}`,Bh=`focusin${Nr}`,Uh=`keydown.tab${Nr}`,Vh="Tab",Wh="forward",Ba="backward",qh={autofocus:!0,trapElement:null},zh={autofocus:"boolean",trapElement:"element"},Pr=class extends Si{constructor(e){super(),this._config=this._getConfig(e),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return qh}static get DefaultType(){return zh}static get NAME(){return Fh}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),B.off(document,Nr),B.on(document,Bh,e=>this._handleFocusin(e)),B.on(document,Uh,e=>this._handleKeydown(e)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,B.off(document,Nr))}_handleFocusin(e){let{trapElement:i}=this._config;if(e.target===document||e.target===i||i.contains(e.target))return;let s=te.focusableChildren(i);s.length===0?i.focus():this._lastTabNavDirection===Ba?s[s.length-1].focus():s[0].focus()}_handleKeydown(e){e.key===Vh&&(this._lastTabNavDirection=e.shiftKey?Ba:Wh)}},Ua=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Va=".sticky-top",_r="padding-right",Wa="margin-right",Pn=class{constructor(){this._element=document.body}getWidth(){let e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){let e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,_r,i=>i+e),this._setElementAttributes(Ua,_r,i=>i+e),this._setElementAttributes(Va,Wa,i=>i-e)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,_r),this._resetElementAttributes(Ua,_r),this._resetElementAttributes(Va,Wa)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,i,s){let o=this.getWidth(),c=d=>{if(d!==this._element&&window.innerWidth>d.clientWidth+o)return;this._saveInitialAttribute(d,i);let g=window.getComputedStyle(d).getPropertyValue(i);d.style.setProperty(i,`${s(Number.parseFloat(g))}px`)};this._applyManipulationCallback(e,c)}_saveInitialAttribute(e,i){let s=e.style.getPropertyValue(i);s&&Ut.setDataAttribute(e,i,s)}_resetElementAttributes(e,i){let s=o=>{let c=Ut.getDataAttribute(o,i);if(c===null){o.style.removeProperty(i);return}Ut.removeDataAttribute(o,i),o.style.setProperty(i,c)};this._applyManipulationCallback(e,s)}_applyManipulationCallback(e,i){if(Bt(e)){i(e);return}for(let s of te.find(e,this._element))i(s)}},Kh="modal",Xh="bs.modal",gt=`.${Xh}`,Yh=".data-api",Gh="Escape",Jh=`hide${gt}`,Qh=`hidePrevented${gt}`,xl=`hidden${gt}`,Cl=`show${gt}`,Zh=`shown${gt}`,ed=`resize${gt}`,td=`click.dismiss${gt}`,id=`mousedown.dismiss${gt}`,nd=`keydown.dismiss${gt}`,rd=`click${gt}${Yh}`,qa="modal-open",sd="fade",za="show",Xs="modal-static",od=".modal.show",ad=".modal-dialog",ld=".modal-body",ud='[data-bs-toggle="modal"]',cd={backdrop:!0,focus:!0,keyboard:!0},fd={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"},tn=class t extends nt{constructor(e,i){super(e,i),this._dialog=te.findOne(ad,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new Pn,this._addEventListeners()}static get Default(){return cd}static get DefaultType(){return fd}static get NAME(){return Kh}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||B.trigger(this._element,Cl,{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(qa),this._adjustDialog(),this._backdrop.show(()=>this._showElement(e)))}hide(){!this._isShown||this._isTransitioning||B.trigger(this._element,Jh).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(za),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated()))}dispose(){B.off(window,gt),B.off(this._dialog,gt),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Lr({isVisible:!!this._config.backdrop,isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Pr({trapElement:this._element})}_showElement(e){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;let i=te.findOne(ld,this._dialog);i&&(i.scrollTop=0),Rn(this._element),this._element.classList.add(za);let s=()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,B.trigger(this._element,Zh,{relatedTarget:e})};this._queueCallback(s,this._dialog,this._isAnimated())}_addEventListeners(){B.on(this._element,nd,e=>{if(e.key===Gh){if(this._config.keyboard){this.hide();return}this._triggerBackdropTransition()}}),B.on(window,ed,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),B.on(this._element,id,e=>{B.one(this._element,td,i=>{if(!(this._element!==e.target||this._element!==i.target)){if(this._config.backdrop==="static"){this._triggerBackdropTransition();return}this._config.backdrop&&this.hide()}})})}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(qa),this._resetAdjustments(),this._scrollBar.reset(),B.trigger(this._element,xl)})}_isAnimated(){return this._element.classList.contains(sd)}_triggerBackdropTransition(){if(B.trigger(this._element,Qh).defaultPrevented)return;let i=this._element.scrollHeight>document.documentElement.clientHeight,s=this._element.style.overflowY;s==="hidden"||this._element.classList.contains(Xs)||(i||(this._element.style.overflowY="hidden"),this._element.classList.add(Xs),this._queueCallback(()=>{this._element.classList.remove(Xs),this._queueCallback(()=>{this._element.style.overflowY=s},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){let e=this._element.scrollHeight>document.documentElement.clientHeight,i=this._scrollBar.getWidth(),s=i>0;if(s&&!e){let o=pt()?"paddingLeft":"paddingRight";this._element.style[o]=`${i}px`}if(!s&&e){let o=pt()?"paddingRight":"paddingLeft";this._element.style[o]=`${i}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,i){return this.each(function(){let s=t.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof s[e]>"u")throw new TypeError(`No method named "${e}"`);s[e](i)}})}};B.on(document,rd,ud,function(t){let e=te.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),B.one(e,Cl,o=>{o.defaultPrevented||B.one(e,xl,()=>{rn(this)&&this.focus()})});let i=te.findOne(od);i&&tn.getInstance(i).hide(),tn.getOrCreateInstance(e).toggle(this)});$r(tn);mt(tn);var hd="offcanvas",dd="bs.offcanvas",Vt=`.${dd}`,Sl=".data-api",pd=`load${Vt}${Sl}`,gd="Escape",Ka="show",Xa="showing",Ya="hiding",md="offcanvas-backdrop",kl=".offcanvas.show",vd=`show${Vt}`,bd=`shown${Vt}`,yd=`hide${Vt}`,Ga=`hidePrevented${Vt}`,Ol=`hidden${Vt}`,_d=`resize${Vt}`,Ed=`click${Vt}${Sl}`,Ad=`keydown.dismiss${Vt}`,Td='[data-bs-toggle="offcanvas"]',wd={backdrop:!0,keyboard:!0,scroll:!1},xd={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"},ni=class t extends nt{constructor(e,i){super(e,i),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return wd}static get DefaultType(){return xd}static get NAME(){return hd}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){if(this._isShown||B.trigger(this._element,vd,{relatedTarget:e}).defaultPrevented)return;this._isShown=!0,this._backdrop.show(),this._config.scroll||new Pn().hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Xa);let s=()=>{(!this._config.scroll||this._config.backdrop)&&this._focustrap.activate(),this._element.classList.add(Ka),this._element.classList.remove(Xa),B.trigger(this._element,bd,{relatedTarget:e})};this._queueCallback(s,this._element,!0)}hide(){if(!this._isShown||B.trigger(this._element,yd).defaultPrevented)return;this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Ya),this._backdrop.hide();let i=()=>{this._element.classList.remove(Ka,Ya),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||new Pn().reset(),B.trigger(this._element,Ol)};this._queueCallback(i,this._element,!0)}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){let e=()=>{if(this._config.backdrop==="static"){B.trigger(this._element,Ga);return}this.hide()},i=!!this._config.backdrop;return new Lr({className:md,isVisible:i,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:i?e:null})}_initializeFocusTrap(){return new Pr({trapElement:this._element})}_addEventListeners(){B.on(this._element,Ad,e=>{if(e.key===gd){if(this._config.keyboard){this.hide();return}B.trigger(this._element,Ga)}})}static jQueryInterface(e){return this.each(function(){let i=t.getOrCreateInstance(this,e);if(typeof e=="string"){if(i[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);i[e](this)}})}};B.on(document,Ed,Td,function(t){let e=te.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),ti(this))return;B.one(e,Ol,()=>{rn(this)&&this.focus()});let i=te.findOne(kl);i&&i!==e&&ni.getInstance(i).hide(),ni.getOrCreateInstance(e).toggle(this)});B.on(window,pd,()=>{for(let t of te.find(kl))ni.getOrCreateInstance(t).show()});B.on(window,_d,()=>{for(let t of te.find("[aria-modal][class*=show][class*=offcanvas-]"))getComputedStyle(t).position!=="fixed"&&ni.getOrCreateInstance(t).hide()});$r(ni);mt(ni);var Cd=/^aria-[\w-]*$/i,Dl={"*":["class","dir","id","lang","role",Cd],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Sd=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),kd=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Od=(t,e)=>{let i=t.nodeName.toLowerCase();return e.includes(i)?Sd.has(i)?!!kd.test(t.nodeValue):!0:e.filter(s=>s instanceof RegExp).some(s=>s.test(i))};function Dd(t,e,i){if(!t.length)return t;if(i&&typeof i=="function")return i(t);let o=new window.DOMParser().parseFromString(t,"text/html"),c=[].concat(...o.body.querySelectorAll("*"));for(let d of c){let g=d.nodeName.toLowerCase();if(!Object.keys(e).includes(g)){d.remove();continue}let v=[].concat(...d.attributes),C=[].concat(e["*"]||[],e[g]||[]);for(let x of v)Od(x,C)||d.removeAttribute(x.nodeName)}return o.body.innerHTML}var Ld="TemplateFactory",Nd={allowList:Dl,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"<div></div>"},Pd={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Id={entry:"(string|element|function|null)",selector:"(string|element)"},so=class extends Si{constructor(e){super(),this._config=this._getConfig(e)}static get Default(){return Nd}static get DefaultType(){return Pd}static get NAME(){return Ld}getContent(){return Object.values(this._config.content).map(e=>this._resolvePossibleFunction(e)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(e){return this._checkContent(e),this._config.content={...this._config.content,...e},this}toHtml(){let e=document.createElement("div");e.innerHTML=this._maybeSanitize(this._config.template);for(let[o,c]of Object.entries(this._config.content))this._setContent(e,c,o);let i=e.children[0],s=this._resolvePossibleFunction(this._config.extraClass);return s&&i.classList.add(...s.split(" ")),i}_typeCheckConfig(e){super._typeCheckConfig(e),this._checkContent(e.content)}_checkContent(e){for(let[i,s]of Object.entries(e))super._typeCheckConfig({selector:i,entry:s},Id)}_setContent(e,i,s){let o=te.findOne(s,e);if(o){if(i=this._resolvePossibleFunction(i),!i){o.remove();return}if(Bt(i)){this._putElementInTemplate(ei(i),o);return}if(this._config.html){o.innerHTML=this._maybeSanitize(i);return}o.textContent=i}}_maybeSanitize(e){return this._config.sanitize?Dd(e,this._config.allowList,this._config.sanitizeFn):e}_resolvePossibleFunction(e){return et(e,[this])}_putElementInTemplate(e,i){if(this._config.html){i.innerHTML="",i.append(e);return}i.textContent=e.textContent}},Rd="tooltip",$d=new Set(["sanitize","allowList","sanitizeFn"]),Ys="fade",Md="modal",Er="show",Hd=".tooltip-inner",Ja=`.${Md}`,Qa="hide.bs.modal",Ln="hover",Gs="focus",Fd="click",jd="manual",Bd="hide",Ud="hidden",Vd="show",Wd="shown",qd="inserted",zd="click",Kd="focusin",Xd="focusout",Yd="mouseenter",Gd="mouseleave",Jd={AUTO:"auto",TOP:"top",RIGHT:pt()?"left":"right",BOTTOM:"bottom",LEFT:pt()?"right":"left"},Qd={allowList:Dl,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',title:"",trigger:"hover focus"},Zd={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"},nn=class t extends nt{constructor(e,i){if(typeof vr>"u")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(e,i),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return Qd}static get DefaultType(){return Zd}static get NAME(){return Rd}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(this._isEnabled){if(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()){this._leave();return}this._enter()}}dispose(){clearTimeout(this._timeout),B.off(this._element.closest(Ja),Qa,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!(this._isWithContent()&&this._isEnabled))return;let e=B.trigger(this._element,this.constructor.eventName(Vd)),s=(ll(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(e.defaultPrevented||!s)return;this._disposePopper();let o=this._getTipElement();this._element.setAttribute("aria-describedby",o.getAttribute("id"));let{container:c}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(c.append(o),B.trigger(this._element,this.constructor.eventName(qd))),this._popper=this._createPopper(o),o.classList.add(Er),"ontouchstart"in document.documentElement)for(let g of[].concat(...document.body.children))B.on(g,"mouseover",Cr);let d=()=>{B.trigger(this._element,this.constructor.eventName(Wd)),this._isHovered===!1&&this._leave(),this._isHovered=!1};this._queueCallback(d,this.tip,this._isAnimated())}hide(){if(!this._isShown()||B.trigger(this._element,this.constructor.eventName(Bd)).defaultPrevented)return;if(this._getTipElement().classList.remove(Er),"ontouchstart"in document.documentElement)for(let o of[].concat(...document.body.children))B.off(o,"mouseover",Cr);this._activeTrigger[Fd]=!1,this._activeTrigger[Gs]=!1,this._activeTrigger[Ln]=!1,this._isHovered=null;let s=()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),B.trigger(this._element,this.constructor.eventName(Ud)))};this._queueCallback(s,this.tip,this._isAnimated())}update(){this._popper&&this._popper.update()}_isWithContent(){return!!this._getTitle()}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(e){let i=this._getTemplateFactory(e).toHtml();if(!i)return null;i.classList.remove(Ys,Er),i.classList.add(`bs-${this.constructor.NAME}-auto`);let s=Fc(this.constructor.NAME).toString();return i.setAttribute("id",s),this._isAnimated()&&i.classList.add(Ys),i}setContent(e){this._newContent=e,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(e){return this._templateFactory?this._templateFactory.changeContent(e):this._templateFactory=new so({...this._config,content:e,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[Hd]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(e){return this.constructor.getOrCreateInstance(e.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Ys)}_isShown(){return this.tip&&this.tip.classList.contains(Er)}_createPopper(e){let i=et(this._config.placement,[this,e,this._element]),s=Jd[i.toUpperCase()];return On(this._element,e,this._getPopperConfig(s))}_getOffset(){let{offset:e}=this._config;return typeof e=="string"?e.split(",").map(i=>Number.parseInt(i,10)):typeof e=="function"?i=>e(i,this._element):e}_resolvePossibleFunction(e){return et(e,[this._element])}_getPopperConfig(e){let i={placement:e,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:s=>{this._getTipElement().setAttribute("data-popper-placement",s.state.placement)}}]};return{...i,...et(this._config.popperConfig,[i])}}_setListeners(){let e=this._config.trigger.split(" ");for(let i of e)if(i==="click")B.on(this._element,this.constructor.eventName(zd),this._config.selector,s=>{this._initializeOnDelegatedTarget(s).toggle()});else if(i!==jd){let s=i===Ln?this.constructor.eventName(Yd):this.constructor.eventName(Kd),o=i===Ln?this.constructor.eventName(Gd):this.constructor.eventName(Xd);B.on(this._element,s,this._config.selector,c=>{let d=this._initializeOnDelegatedTarget(c);d._activeTrigger[c.type==="focusin"?Gs:Ln]=!0,d._enter()}),B.on(this._element,o,this._config.selector,c=>{let d=this._initializeOnDelegatedTarget(c);d._activeTrigger[c.type==="focusout"?Gs:Ln]=d._element.contains(c.relatedTarget),d._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},B.on(this._element.closest(Ja),Qa,this._hideModalHandler)}_fixTitle(){let e=this._element.getAttribute("title");e&&(!this._element.getAttribute("aria-label")&&!this._element.textContent.trim()&&this._element.setAttribute("aria-label",e),this._element.setAttribute("data-bs-original-title",e),this._element.removeAttribute("title"))}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show)}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide))}_setTimeout(e,i){clearTimeout(this._timeout),this._timeout=setTimeout(e,i)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(e){let i=Ut.getDataAttributes(this._element);for(let s of Object.keys(i))$d.has(s)&&delete i[s];return e={...i,...typeof e=="object"&&e?e:{}},e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e.container=e.container===!1?document.body:ei(e.container),typeof e.delay=="number"&&(e.delay={show:e.delay,hide:e.delay}),typeof e.title=="number"&&(e.title=e.title.toString()),typeof e.content=="number"&&(e.content=e.content.toString()),e}_getDelegateConfig(){let e={};for(let[i,s]of Object.entries(this._config))this.constructor.Default[i]!==s&&(e[i]=s);return e.selector=!1,e.trigger="manual",e}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(e){return this.each(function(){let i=t.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof i[e]>"u")throw new TypeError(`No method named "${e}"`);i[e]()}})}};mt(nn);var ep="popover",tp=".popover-header",ip=".popover-body",np={...nn.Default,content:"",offset:[0,8],placement:"right",template:'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',trigger:"click"},rp={...nn.DefaultType,content:"(null|string|element|function)"},oo=class t extends nn{static get Default(){return np}static get DefaultType(){return rp}static get NAME(){return ep}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[tp]:this._getTitle(),[ip]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(e){return this.each(function(){let i=t.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof i[e]>"u")throw new TypeError(`No method named "${e}"`);i[e]()}})}};mt(oo);var sp="scrollspy",op="bs.scrollspy",co=`.${op}`,ap=".data-api",lp=`activate${co}`,Za=`click${co}`,up=`load${co}${ap}`,cp="dropdown-item",Ji="active",fp='[data-bs-spy="scroll"]',Js="[href]",hp=".nav, .list-group",el=".nav-link",dp=".nav-item",pp=".list-group-item",gp=`${el}, ${dp} > ${el}, ${pp}`,mp=".dropdown",vp=".dropdown-toggle",bp={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},yp={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"},Ir=class t extends nt{constructor(e,i){super(e,i),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY==="visible"?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return bp}static get DefaultType(){return yp}static get NAME(){return sp}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(let e of this._observableSections.values())this._observer.observe(e)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(e){return e.target=ei(e.target)||document.body,e.rootMargin=e.offset?`${e.offset}px 0px -30%`:e.rootMargin,typeof e.threshold=="string"&&(e.threshold=e.threshold.split(",").map(i=>Number.parseFloat(i))),e}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(B.off(this._config.target,Za),B.on(this._config.target,Za,Js,e=>{let i=this._observableSections.get(e.target.hash);if(i){e.preventDefault();let s=this._rootElement||window,o=i.offsetTop-this._element.offsetTop;if(s.scrollTo){s.scrollTo({top:o,behavior:"smooth"});return}s.scrollTop=o}}))}_getNewObserver(){let e={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(i=>this._observerCallback(i),e)}_observerCallback(e){let i=d=>this._targetLinks.get(`#${d.target.id}`),s=d=>{this._previousScrollData.visibleEntryTop=d.target.offsetTop,this._process(i(d))},o=(this._rootElement||document.documentElement).scrollTop,c=o>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=o;for(let d of e){if(!d.isIntersecting){this._activeTarget=null,this._clearActiveClass(i(d));continue}let g=d.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(c&&g){if(s(d),!o)return;continue}!c&&!g&&s(d)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;let e=te.find(Js,this._config.target);for(let i of e){if(!i.hash||ti(i))continue;let s=te.findOne(decodeURI(i.hash),this._element);rn(s)&&(this._targetLinks.set(decodeURI(i.hash),i),this._observableSections.set(i.hash,s))}}_process(e){this._activeTarget!==e&&(this._clearActiveClass(this._config.target),this._activeTarget=e,e.classList.add(Ji),this._activateParents(e),B.trigger(this._element,lp,{relatedTarget:e}))}_activateParents(e){if(e.classList.contains(cp)){te.findOne(vp,e.closest(mp)).classList.add(Ji);return}for(let i of te.parents(e,hp))for(let s of te.prev(i,gp))s.classList.add(Ji)}_clearActiveClass(e){e.classList.remove(Ji);let i=te.find(`${Js}.${Ji}`,e);for(let s of i)s.classList.remove(Ji)}static jQueryInterface(e){return this.each(function(){let i=t.getOrCreateInstance(this,e);if(typeof e=="string"){if(i[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);i[e]()}})}};B.on(window,up,()=>{for(let t of te.find(fp))Ir.getOrCreateInstance(t)});mt(Ir);var _p="tab",Ep="bs.tab",Oi=`.${Ep}`,Ap=`hide${Oi}`,Tp=`hidden${Oi}`,wp=`show${Oi}`,xp=`shown${Oi}`,Cp=`click${Oi}`,Sp=`keydown${Oi}`,kp=`load${Oi}`,Op="ArrowLeft",tl="ArrowRight",Dp="ArrowUp",il="ArrowDown",Qs="Home",nl="End",Ci="active",rl="fade",Zs="show",Lp="dropdown",Ll=".dropdown-toggle",Np=".dropdown-menu",eo=`:not(${Ll})`,Pp='.list-group, .nav, [role="tablist"]',Ip=".nav-item, .list-group-item",Rp=`.nav-link${eo}, .list-group-item${eo}, [role="tab"]${eo}`,Nl='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',to=`${Rp}, ${Nl}`,$p=`.${Ci}[data-bs-toggle="tab"], .${Ci}[data-bs-toggle="pill"], .${Ci}[data-bs-toggle="list"]`,In=class t extends nt{constructor(e){super(e),this._parent=this._element.closest(Pp),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),B.on(this._element,Sp,i=>this._keydown(i)))}static get NAME(){return _p}show(){let e=this._element;if(this._elemIsActive(e))return;let i=this._getActiveElem(),s=i?B.trigger(i,Ap,{relatedTarget:e}):null;B.trigger(e,wp,{relatedTarget:i}).defaultPrevented||s&&s.defaultPrevented||(this._deactivate(i,e),this._activate(e,i))}_activate(e,i){if(!e)return;e.classList.add(Ci),this._activate(te.getElementFromSelector(e));let s=()=>{if(e.getAttribute("role")!=="tab"){e.classList.add(Zs);return}e.removeAttribute("tabindex"),e.setAttribute("aria-selected",!0),this._toggleDropDown(e,!0),B.trigger(e,xp,{relatedTarget:i})};this._queueCallback(s,e,e.classList.contains(rl))}_deactivate(e,i){if(!e)return;e.classList.remove(Ci),e.blur(),this._deactivate(te.getElementFromSelector(e));let s=()=>{if(e.getAttribute("role")!=="tab"){e.classList.remove(Zs);return}e.setAttribute("aria-selected",!1),e.setAttribute("tabindex","-1"),this._toggleDropDown(e,!1),B.trigger(e,Tp,{relatedTarget:i})};this._queueCallback(s,e,e.classList.contains(rl))}_keydown(e){if(![Op,tl,Dp,il,Qs,nl].includes(e.key))return;e.stopPropagation(),e.preventDefault();let i=this._getChildren().filter(o=>!ti(o)),s;if([Qs,nl].includes(e.key))s=i[e.key===Qs?0:i.length-1];else{let o=[tl,il].includes(e.key);s=ao(i,e.target,o,!0)}s&&(s.focus({preventScroll:!0}),t.getOrCreateInstance(s).show())}_getChildren(){return te.find(to,this._parent)}_getActiveElem(){return this._getChildren().find(e=>this._elemIsActive(e))||null}_setInitialAttributes(e,i){this._setAttributeIfNotExists(e,"role","tablist");for(let s of i)this._setInitialAttributesOnChild(s)}_setInitialAttributesOnChild(e){e=this._getInnerElement(e);let i=this._elemIsActive(e),s=this._getOuterElement(e);e.setAttribute("aria-selected",i),s!==e&&this._setAttributeIfNotExists(s,"role","presentation"),i||e.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(e,"role","tab"),this._setInitialAttributesOnTargetPanel(e)}_setInitialAttributesOnTargetPanel(e){let i=te.getElementFromSelector(e);i&&(this._setAttributeIfNotExists(i,"role","tabpanel"),e.id&&this._setAttributeIfNotExists(i,"aria-labelledby",`${e.id}`))}_toggleDropDown(e,i){let s=this._getOuterElement(e);if(!s.classList.contains(Lp))return;let o=(c,d)=>{let g=te.findOne(c,s);g&&g.classList.toggle(d,i)};o(Ll,Ci),o(Np,Zs),s.setAttribute("aria-expanded",i)}_setAttributeIfNotExists(e,i,s){e.hasAttribute(i)||e.setAttribute(i,s)}_elemIsActive(e){return e.classList.contains(Ci)}_getInnerElement(e){return e.matches(to)?e:te.findOne(to,e)}_getOuterElement(e){return e.closest(Ip)||e}static jQueryInterface(e){return this.each(function(){let i=t.getOrCreateInstance(this);if(typeof e=="string"){if(i[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);i[e]()}})}};B.on(document,Cp,Nl,function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),!ti(this)&&In.getOrCreateInstance(this).show()});B.on(window,kp,()=>{for(let t of te.find($p))In.getOrCreateInstance(t)});mt(In);var Mp="toast",Hp="bs.toast",si=`.${Hp}`,Fp=`mouseover${si}`,jp=`mouseout${si}`,Bp=`focusin${si}`,Up=`focusout${si}`,Vp=`hide${si}`,Wp=`hidden${si}`,qp=`show${si}`,zp=`shown${si}`,Kp="fade",sl="hide",Ar="show",Tr="showing",Xp={animation:"boolean",autohide:"boolean",delay:"number"},Yp={animation:!0,autohide:!0,delay:5e3},Rr=class t extends nt{constructor(e,i){super(e,i),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Yp}static get DefaultType(){return Xp}static get NAME(){return Mp}show(){if(B.trigger(this._element,qp).defaultPrevented)return;this._clearTimeout(),this._config.animation&&this._element.classList.add(Kp);let i=()=>{this._element.classList.remove(Tr),B.trigger(this._element,zp),this._maybeScheduleHide()};this._element.classList.remove(sl),Rn(this._element),this._element.classList.add(Ar,Tr),this._queueCallback(i,this._element,this._config.animation)}hide(){if(!this.isShown()||B.trigger(this._element,Vp).defaultPrevented)return;let i=()=>{this._element.classList.add(sl),this._element.classList.remove(Tr,Ar),B.trigger(this._element,Wp)};this._element.classList.add(Tr),this._queueCallback(i,this._element,this._config.animation)}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(Ar),super.dispose()}isShown(){return this._element.classList.contains(Ar)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(e,i){switch(e.type){case"mouseover":case"mouseout":{this._hasMouseInteraction=i;break}case"focusin":case"focusout":{this._hasKeyboardInteraction=i;break}}if(i){this._clearTimeout();return}let s=e.relatedTarget;this._element===s||this._element.contains(s)||this._maybeScheduleHide()}_setListeners(){B.on(this._element,Fp,e=>this._onInteraction(e,!0)),B.on(this._element,jp,e=>this._onInteraction(e,!1)),B.on(this._element,Bp,e=>this._onInteraction(e,!0)),B.on(this._element,Up,e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){let i=t.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof i[e]>"u")throw new TypeError(`No method named "${e}"`);i[e](this)}})}};$r(Rr);mt(Rr);var L_=yn(Pl());var fo=yn(ar());(0,fo.default)(function(){(0,fo.default)("select.tree").change(function(){document.location=this.value})});var Fr=yn(ar());var Jp={"kmx-black":"#1e1f1d","kmx-blue":"#5a60f9","kmx-blue1":"#6f72f9","kmx-blue2":"#9c99fd","kmx-blue3":"#5a60f9","kmx-blue4":"#6f72f9","kmx-blue5":"#9c99fd",index:["kmx-black","kmx-blue","kmx-blue1","kmx-blue2","kmx-blue3","kmx-blue4","kmx-blue5","kmx-cyan","kmx-cyan1","kmx-green","kmx-green1","kmx-orange","kmx-orange1","kmx-orange2","kmx-pink","kmx-white","kmx-white1","kmx-white2","kmx-yellow","kmx-yellow1","kmx-yellow2","kmx-yellow3"],"kmx-cyan":"#d4f3f6","kmx-cyan1":"#d4f3f6","kmx-green":"#c4ed3a","kmx-green1":"#c4ed3a","kmx-orange":"#f8681c","kmx-orange1":"#fa7734","kmx-orange2":"#ffa532","kmx-pink":"#fc9ef9","kmx-white":"#f5f8f4","kmx-white1":"#fff9f2","kmx-white2":"#ffffff","kmx-yellow":"#ecfe49","kmx-yellow1":"#fff43e","kmx-yellow2":"#ecfe49","kmx-yellow3":"#fff43e"},Hr=Jp;function Il(t){return Math.floor(Math.random()*t)}(0,Fr.default)(function(){setInterval(function(){let t=Il(Hr.index.length),e=Hr.index[t],i=Hr[e],s=(Il(99)-48)*.002;(0,Fr.default)("a").css("text-shadow","0 0 0"),(0,Fr.default)("a:hover").css("text-shadow",s+"em 0 0 "+i)},200)});(function(){var t=e();function e(){if(typeof window.CustomEvent=="function")return window.CustomEvent;function o(c,d){d=d||{bubbles:!1,cancelable:!1,detail:void 0};var g=document.createEvent("CustomEvent");return g.initCustomEvent(c,d.bubbles,d.cancelable,d.detail),g}return o.prototype=window.Event.prototype,o}function i(o,c){var d=document.createElement("input");return d.type="hidden",d.name=o,d.value=c,d}function s(o,c){var d=o.getAttribute("data-to"),g=i("_method",o.getAttribute("data-method")),v=i("_csrf_token",o.getAttribute("data-csrf")),C=document.createElement("form"),x=document.createElement("input"),I=o.getAttribute("target");C.method=o.getAttribute("data-method")==="get"?"get":"post",C.action=d,C.style.display="none",I?C.target=I:c&&(C.target="_blank"),C.appendChild(v),C.appendChild(g),document.body.appendChild(C),x.type="submit",C.appendChild(x),x.click()}window.addEventListener("click",function(o){var c=o.target;if(!o.defaultPrevented)for(;c&&c.getAttribute;){var d=new t("phoenix.link.click",{bubbles:!0,cancelable:!0});if(!c.dispatchEvent(d))return o.preventDefault(),o.stopImmediatePropagation(),!1;if(c.getAttribute("data-method"))return s(c,o.metaKey||o.shiftKey),o.preventDefault(),!1;c=c.parentNode}},!1),window.addEventListener("phoenix.link.click",function(o){var c=o.target.getAttribute("data-confirm");c&&!window.confirm(c)&&o.preventDefault()},!1)})();var Hn=t=>typeof t=="function"?t:function(){return t},Qp=typeof self<"u"?self:null,Mn=typeof window<"u"?window:null,Fn=Qp||Mn||Fn,Zp="2.0.0",Ot={connecting:0,open:1,closing:2,closed:3},eg=1e4,tg=1e3,rt={closed:"closed",errored:"errored",joined:"joined",joining:"joining",leaving:"leaving"},Wt={close:"phx_close",error:"phx_error",join:"phx_join",reply:"phx_reply",leave:"phx_leave"},po={longpoll:"longpoll",websocket:"websocket"},ig={complete:4},jr=class{constructor(t,e,i,s){this.channel=t,this.event=e,this.payload=i||function(){return{}},this.receivedResp=null,this.timeout=s,this.timeoutTimer=null,this.recHooks=[],this.sent=!1}resend(t){this.timeout=t,this.reset(),this.send()}send(){this.hasReceived("timeout")||(this.startTimeout(),this.sent=!0,this.channel.socket.push({topic:this.channel.topic,event:this.event,payload:this.payload(),ref:this.ref,join_ref:this.channel.joinRef()}))}receive(t,e){return this.hasReceived(t)&&e(this.receivedResp.response),this.recHooks.push({status:t,callback:e}),this}reset(){this.cancelRefEvent(),this.ref=null,this.refEvent=null,this.receivedResp=null,this.sent=!1}matchReceive({status:t,response:e,_ref:i}){this.recHooks.filter(s=>s.status===t).forEach(s=>s.callback(e))}cancelRefEvent(){this.refEvent&&this.channel.off(this.refEvent)}cancelTimeout(){clearTimeout(this.timeoutTimer),this.timeoutTimer=null}startTimeout(){this.timeoutTimer&&this.cancelTimeout(),this.ref=this.channel.socket.makeRef(),this.refEvent=this.channel.replyEventName(this.ref),this.channel.on(this.refEvent,t=>{this.cancelRefEvent(),this.cancelTimeout(),this.receivedResp=t,this.matchReceive(t)}),this.timeoutTimer=setTimeout(()=>{this.trigger("timeout",{})},this.timeout)}hasReceived(t){return this.receivedResp&&this.receivedResp.status===t}trigger(t,e){this.channel.trigger(this.refEvent,{status:t,response:e})}},Rl=class{constructor(t,e){this.callback=t,this.timerCalc=e,this.timer=null,this.tries=0}reset(){this.tries=0,clearTimeout(this.timer)}scheduleTimeout(){clearTimeout(this.timer),this.timer=setTimeout(()=>{this.tries=this.tries+1,this.callback()},this.timerCalc(this.tries+1))}},ng=class{constructor(t,e,i){this.state=rt.closed,this.topic=t,this.params=Hn(e||{}),this.socket=i,this.bindings=[],this.bindingRef=0,this.timeout=this.socket.timeout,this.joinedOnce=!1,this.joinPush=new jr(this,Wt.join,this.params,this.timeout),this.pushBuffer=[],this.stateChangeRefs=[],this.rejoinTimer=new Rl(()=>{this.socket.isConnected()&&this.rejoin()},this.socket.rejoinAfterMs),this.stateChangeRefs.push(this.socket.onError(()=>this.rejoinTimer.reset())),this.stateChangeRefs.push(this.socket.onOpen(()=>{this.rejoinTimer.reset(),this.isErrored()&&this.rejoin()})),this.joinPush.receive("ok",()=>{this.state=rt.joined,this.rejoinTimer.reset(),this.pushBuffer.forEach(s=>s.send()),this.pushBuffer=[]}),this.joinPush.receive("error",()=>{this.state=rt.errored,this.socket.isConnected()&&this.rejoinTimer.scheduleTimeout()}),this.onClose(()=>{this.rejoinTimer.reset(),this.socket.hasLogger()&&this.socket.log("channel",`close ${this.topic} ${this.joinRef()}`),this.state=rt.closed,this.socket.remove(this)}),this.onError(s=>{this.socket.hasLogger()&&this.socket.log("channel",`error ${this.topic}`,s),this.isJoining()&&this.joinPush.reset(),this.state=rt.errored,this.socket.isConnected()&&this.rejoinTimer.scheduleTimeout()}),this.joinPush.receive("timeout",()=>{this.socket.hasLogger()&&this.socket.log("channel",`timeout ${this.topic} (${this.joinRef()})`,this.joinPush.timeout),new jr(this,Wt.leave,Hn({}),this.timeout).send(),this.state=rt.errored,this.joinPush.reset(),this.socket.isConnected()&&this.rejoinTimer.scheduleTimeout()}),this.on(Wt.reply,(s,o)=>{this.trigger(this.replyEventName(o),s)})}join(t=this.timeout){if(this.joinedOnce)throw new Error("tried to join multiple times. 'join' can only be called a single time per channel instance");return this.timeout=t,this.joinedOnce=!0,this.rejoin(),this.joinPush}onClose(t){this.on(Wt.close,t)}onError(t){return this.on(Wt.error,e=>t(e))}on(t,e){let i=this.bindingRef++;return this.bindings.push({event:t,ref:i,callback:e}),i}off(t,e){this.bindings=this.bindings.filter(i=>!(i.event===t&&(typeof e>"u"||e===i.ref)))}canPush(){return this.socket.isConnected()&&this.isJoined()}push(t,e,i=this.timeout){if(e=e||{},!this.joinedOnce)throw new Error(`tried to push '${t}' to '${this.topic}' before joining. Use channel.join() before pushing events`);let s=new jr(this,t,function(){return e},i);return this.canPush()?s.send():(s.startTimeout(),this.pushBuffer.push(s)),s}leave(t=this.timeout){this.rejoinTimer.reset(),this.joinPush.cancelTimeout(),this.state=rt.leaving;let e=()=>{this.socket.hasLogger()&&this.socket.log("channel",`leave ${this.topic}`),this.trigger(Wt.close,"leave")},i=new jr(this,Wt.leave,Hn({}),t);return i.receive("ok",()=>e()).receive("timeout",()=>e()),i.send(),this.canPush()||i.trigger("ok",{}),i}onMessage(t,e,i){return e}isMember(t,e,i,s){return this.topic!==t?!1:s&&s!==this.joinRef()?(this.socket.hasLogger()&&this.socket.log("channel","dropping outdated message",{topic:t,event:e,payload:i,joinRef:s}),!1):!0}joinRef(){return this.joinPush.ref}rejoin(t=this.timeout){this.isLeaving()||(this.socket.leaveOpenTopic(this.topic),this.state=rt.joining,this.joinPush.resend(t))}trigger(t,e,i,s){let o=this.onMessage(t,e,i,s);if(e&&!o)throw new Error("channel onMessage callbacks must return the payload, modified or unmodified");let c=this.bindings.filter(d=>d.event===t);for(let d=0;d<c.length;d++)c[d].callback(o,i,s||this.joinRef())}replyEventName(t){return`chan_reply_${t}`}isClosed(){return this.state===rt.closed}isErrored(){return this.state===rt.errored}isJoined(){return this.state===rt.joined}isJoining(){return this.state===rt.joining}isLeaving(){return this.state===rt.leaving}},Ur=class{static request(t,e,i,s,o,c,d){if(Fn.XDomainRequest){let g=new Fn.XDomainRequest;return this.xdomainRequest(g,t,e,s,o,c,d)}else{let g=new Fn.XMLHttpRequest;return this.xhrRequest(g,t,e,i,s,o,c,d)}}static xdomainRequest(t,e,i,s,o,c,d){return t.timeout=o,t.open(e,i),t.onload=()=>{let g=this.parseJSON(t.responseText);d&&d(g)},c&&(t.ontimeout=c),t.onprogress=()=>{},t.send(s),t}static xhrRequest(t,e,i,s,o,c,d,g){return t.open(e,i,!0),t.timeout=c,t.setRequestHeader("Content-Type",s),t.onerror=()=>g&&g(null),t.onreadystatechange=()=>{if(t.readyState===ig.complete&&g){let v=this.parseJSON(t.responseText);g(v)}},d&&(t.ontimeout=d),t.send(o),t}static parseJSON(t){if(!t||t==="")return null;try{return JSON.parse(t)}catch{return console&&console.log("failed to parse JSON response",t),null}}static serialize(t,e){let i=[];for(var s in t){if(!Object.prototype.hasOwnProperty.call(t,s))continue;let o=e?`${e}[${s}]`:s,c=t[s];typeof c=="object"?i.push(this.serialize(c,o)):i.push(encodeURIComponent(o)+"="+encodeURIComponent(c))}return i.join("&")}static appendParams(t,e){if(Object.keys(e).length===0)return t;let i=t.match(/\?/)?"&":"?";return`${t}${i}${this.serialize(e)}`}},ho=class{constructor(t){this.endPoint=null,this.token=null,this.skipHeartbeat=!0,this.reqs=new Set,this.onopen=function(){},this.onerror=function(){},this.onmessage=function(){},this.onclose=function(){},this.pollEndpoint=this.normalizeEndpoint(t),this.readyState=Ot.connecting,this.poll()}normalizeEndpoint(t){return t.replace("ws://","http://").replace("wss://","https://").replace(new RegExp("(.*)/"+po.websocket),"$1/"+po.longpoll)}endpointURL(){return Ur.appendParams(this.pollEndpoint,{token:this.token})}closeAndRetry(t,e,i){this.close(t,e,i),this.readyState=Ot.connecting}ontimeout(){this.onerror("timeout"),this.closeAndRetry(1005,"timeout",!1)}isActive(){return this.readyState===Ot.open||this.readyState===Ot.connecting}poll(){this.ajax("GET",null,()=>this.ontimeout(),t=>{if(t){var{status:e,token:i,messages:s}=t;this.token=i}else e=0;switch(e){case 200:s.forEach(o=>{setTimeout(()=>this.onmessage({data:o}),0)}),this.poll();break;case 204:this.poll();break;case 410:this.readyState=Ot.open,this.onopen({}),this.poll();break;case 403:this.onerror(403),this.close(1008,"forbidden",!1);break;case 0:case 500:this.onerror(500),this.closeAndRetry(1011,"internal server error",500);break;default:throw new Error(`unhandled poll status ${e}`)}})}send(t){this.ajax("POST",t,()=>this.onerror("timeout"),e=>{(!e||e.status!==200)&&(this.onerror(e&&e.status),this.closeAndRetry(1011,"internal server error",!1))})}close(t,e,i){for(let o of this.reqs)o.abort();this.readyState=Ot.closed;let s=Object.assign({code:1e3,reason:void 0,wasClean:!0},{code:t,reason:e,wasClean:i});typeof CloseEvent<"u"?this.onclose(new CloseEvent("close",s)):this.onclose(s)}ajax(t,e,i,s){let o,c=()=>{this.reqs.delete(o),i()};o=Ur.request(t,this.endpointURL(),"application/json",e,this.timeout,c,d=>{this.reqs.delete(o),this.isActive()&&s(d)}),this.reqs.add(o)}};var Br={HEADER_LENGTH:1,META_LENGTH:4,KINDS:{push:0,reply:1,broadcast:2},encode(t,e){if(t.payload.constructor===ArrayBuffer)return e(this.binaryEncode(t));{let i=[t.join_ref,t.ref,t.topic,t.event,t.payload];return e(JSON.stringify(i))}},decode(t,e){if(t.constructor===ArrayBuffer)return e(this.binaryDecode(t));{let[i,s,o,c,d]=JSON.parse(t);return e({join_ref:i,ref:s,topic:o,event:c,payload:d})}},binaryEncode(t){let{join_ref:e,ref:i,event:s,topic:o,payload:c}=t,d=this.META_LENGTH+e.length+i.length+o.length+s.length,g=new ArrayBuffer(this.HEADER_LENGTH+d),v=new DataView(g),C=0;v.setUint8(C++,this.KINDS.push),v.setUint8(C++,e.length),v.setUint8(C++,i.length),v.setUint8(C++,o.length),v.setUint8(C++,s.length),Array.from(e,I=>v.setUint8(C++,I.charCodeAt(0))),Array.from(i,I=>v.setUint8(C++,I.charCodeAt(0))),Array.from(o,I=>v.setUint8(C++,I.charCodeAt(0))),Array.from(s,I=>v.setUint8(C++,I.charCodeAt(0)));var x=new Uint8Array(g.byteLength+c.byteLength);return x.set(new Uint8Array(g),0),x.set(new Uint8Array(c),g.byteLength),x.buffer},binaryDecode(t){let e=new DataView(t),i=e.getUint8(0),s=new TextDecoder;switch(i){case this.KINDS.push:return this.decodePush(t,e,s);case this.KINDS.reply:return this.decodeReply(t,e,s);case this.KINDS.broadcast:return this.decodeBroadcast(t,e,s)}},decodePush(t,e,i){let s=e.getUint8(1),o=e.getUint8(2),c=e.getUint8(3),d=this.HEADER_LENGTH+this.META_LENGTH-1,g=i.decode(t.slice(d,d+s));d=d+s;let v=i.decode(t.slice(d,d+o));d=d+o;let C=i.decode(t.slice(d,d+c));d=d+c;let x=t.slice(d,t.byteLength);return{join_ref:g,ref:null,topic:v,event:C,payload:x}},decodeReply(t,e,i){let s=e.getUint8(1),o=e.getUint8(2),c=e.getUint8(3),d=e.getUint8(4),g=this.HEADER_LENGTH+this.META_LENGTH,v=i.decode(t.slice(g,g+s));g=g+s;let C=i.decode(t.slice(g,g+o));g=g+o;let x=i.decode(t.slice(g,g+c));g=g+c;let I=i.decode(t.slice(g,g+d));g=g+d;let D=t.slice(g,t.byteLength),S={status:I,response:D};return{join_ref:v,ref:C,topic:x,event:Wt.reply,payload:S}},decodeBroadcast(t,e,i){let s=e.getUint8(1),o=e.getUint8(2),c=this.HEADER_LENGTH+2,d=i.decode(t.slice(c,c+s));c=c+s;let g=i.decode(t.slice(c,c+o));c=c+o;let v=t.slice(c,t.byteLength);return{join_ref:null,ref:null,topic:d,event:g,payload:v}}},$l=class{constructor(t,e={}){this.stateChangeCallbacks={open:[],close:[],error:[],message:[]},this.channels=[],this.sendBuffer=[],this.ref=0,this.timeout=e.timeout||eg,this.transport=e.transport||Fn.WebSocket||ho,this.establishedConnections=0,this.defaultEncoder=Br.encode.bind(Br),this.defaultDecoder=Br.decode.bind(Br),this.closeWasClean=!1,this.binaryType=e.binaryType||"arraybuffer",this.connectClock=1,this.transport!==ho?(this.encode=e.encode||this.defaultEncoder,this.decode=e.decode||this.defaultDecoder):(this.encode=this.defaultEncoder,this.decode=this.defaultDecoder);let i=null;Mn&&Mn.addEventListener&&(Mn.addEventListener("pagehide",s=>{this.conn&&(this.disconnect(),i=this.connectClock)}),Mn.addEventListener("pageshow",s=>{i===this.connectClock&&(i=null,this.connect())})),this.heartbeatIntervalMs=e.heartbeatIntervalMs||3e4,this.rejoinAfterMs=s=>e.rejoinAfterMs?e.rejoinAfterMs(s):[1e3,2e3,5e3][s-1]||1e4,this.reconnectAfterMs=s=>e.reconnectAfterMs?e.reconnectAfterMs(s):[10,50,100,150,200,250,500,1e3,2e3][s-1]||5e3,this.logger=e.logger||null,this.longpollerTimeout=e.longpollerTimeout||2e4,this.params=Hn(e.params||{}),this.endPoint=`${t}/${po.websocket}`,this.vsn=e.vsn||Zp,this.heartbeatTimeoutTimer=null,this.heartbeatTimer=null,this.pendingHeartbeatRef=null,this.reconnectTimer=new Rl(()=>{this.teardown(()=>this.connect())},this.reconnectAfterMs)}getLongPollTransport(){return ho}replaceTransport(t){this.connectClock++,this.closeWasClean=!0,this.reconnectTimer.reset(),this.sendBuffer=[],this.conn&&(this.conn.close(),this.conn=null),this.transport=t}protocol(){return location.protocol.match(/^https/)?"wss":"ws"}endPointURL(){let t=Ur.appendParams(Ur.appendParams(this.endPoint,this.params()),{vsn:this.vsn});return t.charAt(0)!=="/"?t:t.charAt(1)==="/"?`${this.protocol()}:${t}`:`${this.protocol()}://${location.host}${t}`}disconnect(t,e,i){this.connectClock++,this.closeWasClean=!0,this.reconnectTimer.reset(),this.teardown(t,e,i)}connect(t){t&&(console&&console.log("passing params to connect is deprecated. Instead pass :params to the Socket constructor"),this.params=Hn(t)),!this.conn&&(this.connectClock++,this.closeWasClean=!1,this.conn=new this.transport(this.endPointURL()),this.conn.binaryType=this.binaryType,this.conn.timeout=this.longpollerTimeout,this.conn.onopen=()=>this.onConnOpen(),this.conn.onerror=e=>this.onConnError(e),this.conn.onmessage=e=>this.onConnMessage(e),this.conn.onclose=e=>this.onConnClose(e))}log(t,e,i){this.logger(t,e,i)}hasLogger(){return this.logger!==null}onOpen(t){let e=this.makeRef();return this.stateChangeCallbacks.open.push([e,t]),e}onClose(t){let e=this.makeRef();return this.stateChangeCallbacks.close.push([e,t]),e}onError(t){let e=this.makeRef();return this.stateChangeCallbacks.error.push([e,t]),e}onMessage(t){let e=this.makeRef();return this.stateChangeCallbacks.message.push([e,t]),e}ping(t){if(!this.isConnected())return!1;let e=this.makeRef(),i=Date.now();this.push({topic:"phoenix",event:"heartbeat",payload:{},ref:e});let s=this.onMessage(o=>{o.ref===e&&(this.off([s]),t(Date.now()-i))});return!0}clearHeartbeats(){clearTimeout(this.heartbeatTimer),clearTimeout(this.heartbeatTimeoutTimer)}onConnOpen(){this.hasLogger()&&this.log("transport",`connected to ${this.endPointURL()}`),this.closeWasClean=!1,this.establishedConnections++,this.flushSendBuffer(),this.reconnectTimer.reset(),this.resetHeartbeat(),this.stateChangeCallbacks.open.forEach(([,t])=>t())}heartbeatTimeout(){this.pendingHeartbeatRef&&(this.pendingHeartbeatRef=null,this.hasLogger()&&this.log("transport","heartbeat timeout. Attempting to re-establish connection"),this.triggerChanError(),this.closeWasClean=!1,this.teardown(()=>this.reconnectTimer.scheduleTimeout(),tg,"heartbeat timeout"))}resetHeartbeat(){this.conn&&this.conn.skipHeartbeat||(this.pendingHeartbeatRef=null,this.clearHeartbeats(),this.heartbeatTimer=setTimeout(()=>this.sendHeartbeat(),this.heartbeatIntervalMs))}teardown(t,e,i){if(!this.conn)return t&&t();this.waitForBufferDone(()=>{this.conn&&(e?this.conn.close(e,i||""):this.conn.close()),this.waitForSocketClosed(()=>{this.conn&&(this.conn.onopen=function(){},this.conn.onerror=function(){},this.conn.onmessage=function(){},this.conn.onclose=function(){},this.conn=null),t&&t()})})}waitForBufferDone(t,e=1){if(e===5||!this.conn||!this.conn.bufferedAmount){t();return}setTimeout(()=>{this.waitForBufferDone(t,e+1)},150*e)}waitForSocketClosed(t,e=1){if(e===5||!this.conn||this.conn.readyState===Ot.closed){t();return}setTimeout(()=>{this.waitForSocketClosed(t,e+1)},150*e)}onConnClose(t){let e=t&&t.code;this.hasLogger()&&this.log("transport","close",t),this.triggerChanError(),this.clearHeartbeats(),!this.closeWasClean&&e!==1e3&&this.reconnectTimer.scheduleTimeout(),this.stateChangeCallbacks.close.forEach(([,i])=>i(t))}onConnError(t){this.hasLogger()&&this.log("transport",t);let e=this.transport,i=this.establishedConnections;this.stateChangeCallbacks.error.forEach(([,s])=>{s(t,e,i)}),(e===this.transport||i>0)&&this.triggerChanError()}triggerChanError(){this.channels.forEach(t=>{t.isErrored()||t.isLeaving()||t.isClosed()||t.trigger(Wt.error)})}connectionState(){switch(this.conn&&this.conn.readyState){case Ot.connecting:return"connecting";case Ot.open:return"open";case Ot.closing:return"closing";default:return"closed"}}isConnected(){return this.connectionState()==="open"}remove(t){this.off(t.stateChangeRefs),this.channels=this.channels.filter(e=>e.joinRef()!==t.joinRef())}off(t){for(let e in this.stateChangeCallbacks)this.stateChangeCallbacks[e]=this.stateChangeCallbacks[e].filter(([i])=>t.indexOf(i)===-1)}channel(t,e={}){let i=new ng(t,e,this);return this.channels.push(i),i}push(t){if(this.hasLogger()){let{topic:e,event:i,payload:s,ref:o,join_ref:c}=t;this.log("push",`${e} ${i} (${c}, ${o})`,s)}this.isConnected()?this.encode(t,e=>this.conn.send(e)):this.sendBuffer.push(()=>this.encode(t,e=>this.conn.send(e)))}makeRef(){let t=this.ref+1;return t===this.ref?this.ref=0:this.ref=t,this.ref.toString()}sendHeartbeat(){this.pendingHeartbeatRef&&!this.isConnected()||(this.pendingHeartbeatRef=this.makeRef(),this.push({topic:"phoenix",event:"heartbeat",payload:{},ref:this.pendingHeartbeatRef}),this.heartbeatTimeoutTimer=setTimeout(()=>this.heartbeatTimeout(),this.heartbeatIntervalMs))}flushSendBuffer(){this.isConnected()&&this.sendBuffer.length>0&&(this.sendBuffer.forEach(t=>t()),this.sendBuffer=[])}onConnMessage(t){this.decode(t.data,e=>{let{topic:i,event:s,payload:o,ref:c,join_ref:d}=e;c&&c===this.pendingHeartbeatRef&&(this.clearHeartbeats(),this.pendingHeartbeatRef=null,this.heartbeatTimer=setTimeout(()=>this.sendHeartbeat(),this.heartbeatIntervalMs)),this.hasLogger()&&this.log("receive",`${o.status||""} ${i} ${s} ${c&&"("+c+")"||""}`,o);for(let g=0;g<this.channels.length;g++){let v=this.channels[g];v.isMember(i,s,o,d)&&v.trigger(s,o,c,d)}for(let g=0;g<this.stateChangeCallbacks.message.length;g++){let[,v]=this.stateChangeCallbacks.message[g];v(e)}})}leaveOpenTopic(t){let e=this.channels.find(i=>i.topic===t&&(i.isJoined()||i.isJoining()));e&&(this.hasLogger()&&this.log("transport",`leaving duplicate topic "${t}"`),e.leave())}};var nu="consecutive-reloads",rg=10,sg=5e3,og=1e4,ag=3e4,ru=["phx-click-loading","phx-change-loading","phx-submit-loading","phx-keydown-loading","phx-keyup-loading","phx-blur-loading","phx-focus-loading"],ot="data-phx-component",go="data-phx-link",lg="track-static",ug="data-phx-link-state",Pt="data-phx-ref",Li="data-phx-ref-src",su="track-uploads",Ni="data-phx-upload-ref",Oo="data-phx-preflighted-refs",cg="data-phx-done-refs",Ml="drop-target",To="data-phx-active-refs",wo="phx:live-file:updated",xo="data-phx-skip",Hl="data-phx-prune",Fl="page-loading",jl="phx-connected",mo="phx-loading",Bl="phx-no-feedback",Ul="phx-error",on="data-phx-parent-id",Do="data-phx-main",Kn="data-phx-root-id",fg="trigger-action",Co="feedback-for",ou="phx-has-focused",hg=["text","textarea","number","email","password","search","tel","url","date","time","datetime-local","color","range"],au=["checkbox","radio"],lu="phx-has-submitted",li="data-phx-session",an=`[${li}]`,Vl="data-phx-sticky",qn="data-phx-static",vo="data-phx-readonly",Vr="data-phx-disabled",So="disable-with",Wr="data-phx-disable-with-restore",jn="hook",dg="debounce",pg="throttle",ko="update",gg="key",Dt="phxPrivate",Wl="auto-recover",qr="phx:live-socket:debug",bo="phx:live-socket:profiling",yo="phx:live-socket:latency-sim",mg="progress",vg=1,bg=200,yg="phx-",_g=3e4,Bn="debounce-trigger",zr="throttled",ql="debounce-prev-key",Eg={debounce:300,throttle:300},zl="d",Lt="s",st="c",Kl="e",Xl="r",Yl="t",Ag="p",Tg=class{constructor(t,e,i){this.liveSocket=i,this.entry=t,this.offset=0,this.chunkSize=e,this.chunkTimer=null,this.uploadChannel=i.channel(`lvu:${t.ref}`,{token:t.metadata()})}error(t){clearTimeout(this.chunkTimer),this.uploadChannel.leave(),this.entry.error(t)}upload(){this.uploadChannel.onError(t=>this.error(t)),this.uploadChannel.join().receive("ok",t=>this.readNextChunk()).receive("error",t=>this.error(t))}isDone(){return this.offset>=this.entry.file.size}readNextChunk(){let t=new window.FileReader,e=this.entry.file.slice(this.offset,this.chunkSize+this.offset);t.onload=i=>{if(i.target.error===null)this.offset+=i.target.result.byteLength,this.pushChunk(i.target.result);else return We("Read error: "+i.target.error)},t.readAsArrayBuffer(e)}pushChunk(t){this.uploadChannel.isJoined()&&this.uploadChannel.push("chunk",t).receive("ok",()=>{this.entry.progress(this.offset/this.entry.file.size*100),this.isDone()||(this.chunkTimer=setTimeout(()=>this.readNextChunk(),this.liveSocket.getLatencySim()||0))})}},We=(t,e)=>console.error&&console.error(t,e),ai=t=>{let e=typeof t;return e==="number"||e==="string"&&/^(0|[1-9]\d*)$/.test(t)};function wg(){let t=new Set,e=document.querySelectorAll("*[id]");for(let i=0,s=e.length;i<s;i++)t.has(e[i].id)?console.error(`Multiple IDs detected: ${e[i].id}. Ensure unique element ids.`):t.add(e[i].id)}var xg=(t,e,i,s)=>{t.liveSocket.isDebugEnabled()&&console.log(`${t.id} ${e}: ${i} - `,s)},_o=t=>typeof t=="function"?t:function(){return t},Jr=t=>JSON.parse(JSON.stringify(t)),zn=(t,e,i)=>{do{if(t.matches(`[${e}]`))return t;t=t.parentElement||t.parentNode}while(t!==null&&t.nodeType===1&&!(i&&i.isSameNode(t)||t.matches(an)));return null},Un=t=>t!==null&&typeof t=="object"&&!(t instanceof Array),Cg=(t,e)=>JSON.stringify(t)===JSON.stringify(e),Gl=t=>{for(let e in t)return!1;return!0},qt=(t,e)=>t&&e(t),Sg=function(t,e,i,s){t.forEach(o=>{new Tg(o,i.config.chunk_size,s).upload()})},uu={canPushState(){return typeof history.pushState<"u"},dropLocal(t,e,i){return t.removeItem(this.localKey(e,i))},updateLocal(t,e,i,s,o){let c=this.getLocal(t,e,i),d=this.localKey(e,i),g=c===null?s:o(c);return t.setItem(d,JSON.stringify(g)),g},getLocal(t,e,i){return JSON.parse(t.getItem(this.localKey(e,i)))},updateCurrentState(t){this.canPushState()&&history.replaceState(t(history.state||{}),"",window.location.href)},pushState(t,e,i){if(this.canPushState()){if(i!==window.location.href){if(e.type=="redirect"&&e.scroll){let o=history.state||{};o.scroll=e.scroll,history.replaceState(o,"",window.location.href)}delete e.scroll,history[t+"State"](e,"",i||null);let s=this.getHashTargetEl(window.location.hash);s?s.scrollIntoView():e.type==="redirect"&&window.scroll(0,0)}}else this.redirect(i)},setCookie(t,e){document.cookie=`${t}=${e}`},getCookie(t){return document.cookie.replace(new RegExp(`(?:(?:^|.*;s*)${t}s*=s*([^;]*).*$)|^.*$`),"$1")},redirect(t,e){e&&uu.setCookie("__phoenix_flash__",e+"; max-age=60000; path=/"),window.location=t},localKey(t,e){return`${t}-${e}`},getHashTargetEl(t){let e=t.toString().substring(1);if(e!=="")return document.getElementById(e)||document.querySelector(`a[name="${e}"]`)}},oi=uu,Et={byId(t){return document.getElementById(t)||We(`no id found for ${t}`)},removeClass(t,e){t.classList.remove(e),t.classList.length===0&&t.removeAttribute("class")},all(t,e,i){if(!t)return[];let s=Array.from(t.querySelectorAll(e));return i?s.forEach(i):s},childNodeLength(t){let e=document.createElement("template");return e.innerHTML=t,e.content.childElementCount},isUploadInput(t){return t.type==="file"&&t.getAttribute(Ni)!==null},findUploadInputs(t){return this.all(t,`input[type="file"][${Ni}]`)},findComponentNodeList(t,e){return this.filterWithinSameLiveView(this.all(t,`[${ot}="${e}"]`),t)},isPhxDestroyed(t){return!!(t.id&&Et.private(t,"destroyed"))},markPhxChildDestroyed(t){this.isPhxChild(t)&&t.setAttribute(li,""),this.putPrivate(t,"destroyed",!0)},findPhxChildrenInFragment(t,e){let i=document.createElement("template");return i.innerHTML=t,this.findPhxChildren(i.content,e)},isIgnored(t,e){return(t.getAttribute(e)||t.getAttribute("data-phx-update"))==="ignore"},isPhxUpdate(t,e,i){return t.getAttribute&&i.indexOf(t.getAttribute(e))>=0},findPhxSticky(t){return this.all(t,`[${Vl}]`)},findPhxChildren(t,e){return this.all(t,`${an}[${on}="${e}"]`)},findParentCIDs(t,e){let i=new Set(e);return e.reduce((s,o)=>{let c=`[${ot}="${o}"] [${ot}]`;return this.filterWithinSameLiveView(this.all(t,c),t).map(d=>parseInt(d.getAttribute(ot))).forEach(d=>s.delete(d)),s},i)},filterWithinSameLiveView(t,e){return e.querySelector(an)?t.filter(i=>this.withinSameLiveView(i,e)):t},withinSameLiveView(t,e){for(;t=t.parentNode;){if(t.isSameNode(e))return!0;if(t.getAttribute(li)!==null)return!1}},private(t,e){return t[Dt]&&t[Dt][e]},deletePrivate(t,e){t[Dt]&&delete t[Dt][e]},putPrivate(t,e,i){t[Dt]||(t[Dt]={}),t[Dt][e]=i},updatePrivate(t,e,i,s){let o=this.private(t,e);o===void 0?this.putPrivate(t,e,s(i)):this.putPrivate(t,e,s(o))},copyPrivates(t,e){e[Dt]&&(t[Dt]=e[Dt])},putTitle(t){let e=document.querySelector("title"),{prefix:i,suffix:s}=e.dataset;document.title=`${i||""}${t}${s||""}`},debounce(t,e,i,s,o,c,d,g){let v=t.getAttribute(i),C=t.getAttribute(o);v===""&&(v=s),C===""&&(C=c);let x=v||C;switch(x){case null:return g();case"blur":this.once(t,"debounce-blur")&&t.addEventListener("blur",()=>g());return;default:let I=parseInt(x),D=()=>C?this.deletePrivate(t,zr):g(),S=this.incCycle(t,Bn,D);if(isNaN(I))return We(`invalid throttle/debounce value: ${x}`);if(C){let A=!1;if(e.type==="keydown"){let _=this.private(t,ql);this.putPrivate(t,ql,e.key),A=_!==e.key}if(!A&&this.private(t,zr))return!1;g(),this.putPrivate(t,zr,!0),setTimeout(()=>{d()&&this.triggerCycle(t,Bn)},I)}else setTimeout(()=>{d()&&this.triggerCycle(t,Bn,S)},I);let N=t.form;N&&this.once(N,"bind-debounce")&&N.addEventListener("submit",()=>{Array.from(new FormData(N).entries(),([A])=>{let _=N.querySelector(`[name="${A}"]`);this.incCycle(_,Bn),this.deletePrivate(_,zr)})}),this.once(t,"bind-debounce")&&t.addEventListener("blur",()=>this.triggerCycle(t,Bn))}},triggerCycle(t,e,i){let[s,o]=this.private(t,e);i||(i=s),i===s&&(this.incCycle(t,e),o())},once(t,e){return this.private(t,e)===!0?!1:(this.putPrivate(t,e,!0),!0)},incCycle(t,e,i=function(){}){let[s]=this.private(t,e)||[0,i];return s++,this.putPrivate(t,e,[s,i]),s},discardError(t,e,i){let s=e.getAttribute&&e.getAttribute(i),o=s&&t.querySelector(`[id="${s}"], [name="${s}"]`);o&&(this.private(o,ou)||this.private(o.form,lu)||e.classList.add(Bl))},showError(t,e){(t.id||t.name)&&this.all(t.form,`[${e}="${t.id}"], [${e}="${t.name}"]`,i=>{this.removeClass(i,Bl)})},isPhxChild(t){return t.getAttribute&&t.getAttribute(on)},isPhxSticky(t){return t.getAttribute&&t.getAttribute(Vl)!==null},firstPhxChild(t){return this.isPhxChild(t)?t:this.all(t,`[${on}]`)[0]},dispatchEvent(t,e,i={}){let o={bubbles:i.bubbles===void 0?!0:!!i.bubbles,cancelable:!0,detail:i.detail||{}},c=e==="click"?new MouseEvent("click",o):new CustomEvent(e,o);t.dispatchEvent(c)},cloneNode(t,e){if(typeof e>"u")return t.cloneNode(!0);{let i=t.cloneNode(!1);return i.innerHTML=e,i}},mergeAttrs(t,e,i={}){let s=i.exclude||[],o=i.isIgnored,c=e.attributes;for(let g=c.length-1;g>=0;g--){let v=c[g].name;s.indexOf(v)<0&&t.setAttribute(v,e.getAttribute(v))}let d=t.attributes;for(let g=d.length-1;g>=0;g--){let v=d[g].name;o?v.startsWith("data-")&&!e.hasAttribute(v)&&t.removeAttribute(v):e.hasAttribute(v)||t.removeAttribute(v)}},mergeFocusedInput(t,e){t instanceof HTMLSelectElement||Et.mergeAttrs(t,e,{exclude:["value"]}),e.readOnly?t.setAttribute("readonly",!0):t.removeAttribute("readonly")},hasSelectionRange(t){return t.setSelectionRange&&(t.type==="text"||t.type==="textarea")},restoreFocus(t,e,i){if(!Et.isTextualInput(t))return;let s=t.matches(":focus");t.readOnly&&t.blur(),s||t.focus(),this.hasSelectionRange(t)&&t.setSelectionRange(e,i)},isFormInput(t){return/^(?:input|select|textarea)$/i.test(t.tagName)&&t.type!=="button"},syncAttrsToProps(t){t instanceof HTMLInputElement&&au.indexOf(t.type.toLocaleLowerCase())>=0&&(t.checked=t.getAttribute("checked")!==null)},isTextualInput(t){return hg.indexOf(t.type)>=0},isNowTriggerFormExternal(t,e){return t.getAttribute&&t.getAttribute(e)!==null},syncPendingRef(t,e,i){let s=t.getAttribute(Pt);if(s===null)return!0;let o=t.getAttribute(Li);return Et.isFormInput(t)||t.getAttribute(i)!==null?(Et.isUploadInput(t)&&Et.mergeAttrs(t,e,{isIgnored:!0}),Et.putPrivate(t,Pt,e),!1):(ru.forEach(c=>{t.classList.contains(c)&&e.classList.add(c)}),e.setAttribute(Pt,s),e.setAttribute(Li,o),!0)},cleanChildNodes(t,e){if(Et.isPhxUpdate(t,e,["append","prepend"])){let i=[];t.childNodes.forEach(s=>{s.id||(s.nodeType===Node.TEXT_NODE&&s.nodeValue.trim()===""||We(`only HTML element tags with an id are allowed inside containers with phx-update.
 
-  // node_modules/jquery/dist/jquery.js
-  var require_jquery = __commonJS({
-    "node_modules/jquery/dist/jquery.js"(exports, module) {
-      (function(global3, factory) {
-        "use strict";
-        if (typeof module === "object" && typeof module.exports === "object") {
-          module.exports = global3.document ? factory(global3, true) : function(w) {
-            if (!w.document) {
-              throw new Error("jQuery requires a window with a document");
-            }
-            return factory(w);
-          };
-        } else {
-          factory(global3);
-        }
-      })(typeof window !== "undefined" ? window : exports, function(window2, noGlobal) {
-        "use strict";
-        var arr = [];
-        var getProto = Object.getPrototypeOf;
-        var slice = arr.slice;
-        var flat = arr.flat ? function(array) {
-          return arr.flat.call(array);
-        } : function(array) {
-          return arr.concat.apply([], array);
-        };
-        var push = arr.push;
-        var indexOf = arr.indexOf;
-        var class2type = {};
-        var toString = class2type.toString;
-        var hasOwn = class2type.hasOwnProperty;
-        var fnToString = hasOwn.toString;
-        var ObjectFunctionString = fnToString.call(Object);
-        var support = {};
-        var isFunction = function isFunction2(obj) {
-          return typeof obj === "function" && typeof obj.nodeType !== "number" && typeof obj.item !== "function";
-        };
-        var isWindow = function isWindow2(obj) {
-          return obj != null && obj === obj.window;
-        };
-        var document2 = window2.document;
-        var preservedScriptAttributes = {
-          type: true,
-          src: true,
-          nonce: true,
-          noModule: true
-        };
-        function DOMEval(code, node, doc2) {
-          doc2 = doc2 || document2;
-          var i, val, script = doc2.createElement("script");
-          script.text = code;
-          if (node) {
-            for (i in preservedScriptAttributes) {
-              val = node[i] || node.getAttribute && node.getAttribute(i);
-              if (val) {
-                script.setAttribute(i, val);
-              }
-            }
-          }
-          doc2.head.appendChild(script).parentNode.removeChild(script);
-        }
-        function toType2(obj) {
-          if (obj == null) {
-            return obj + "";
-          }
-          return typeof obj === "object" || typeof obj === "function" ? class2type[toString.call(obj)] || "object" : typeof obj;
-        }
-        var version = "3.7.1", rhtmlSuffix = /HTML$/i, jQuery = function(selector, context) {
-          return new jQuery.fn.init(selector, context);
-        };
-        jQuery.fn = jQuery.prototype = {
-          // The current version of jQuery being used
-          jquery: version,
-          constructor: jQuery,
-          // The default length of a jQuery object is 0
-          length: 0,
-          toArray: function() {
-            return slice.call(this);
-          },
-          // Get the Nth element in the matched element set OR
-          // Get the whole matched element set as a clean array
-          get: function(num) {
-            if (num == null) {
-              return slice.call(this);
-            }
-            return num < 0 ? this[num + this.length] : this[num];
-          },
-          // Take an array of elements and push it onto the stack
-          // (returning the new matched element set)
-          pushStack: function(elems) {
-            var ret = jQuery.merge(this.constructor(), elems);
-            ret.prevObject = this;
-            return ret;
-          },
-          // Execute a callback for every element in the matched set.
-          each: function(callback) {
-            return jQuery.each(this, callback);
-          },
-          map: function(callback) {
-            return this.pushStack(jQuery.map(this, function(elem, i) {
-              return callback.call(elem, i, elem);
-            }));
-          },
-          slice: function() {
-            return this.pushStack(slice.apply(this, arguments));
-          },
-          first: function() {
-            return this.eq(0);
-          },
-          last: function() {
-            return this.eq(-1);
-          },
-          even: function() {
-            return this.pushStack(jQuery.grep(this, function(_elem, i) {
-              return (i + 1) % 2;
-            }));
-          },
-          odd: function() {
-            return this.pushStack(jQuery.grep(this, function(_elem, i) {
-              return i % 2;
-            }));
-          },
-          eq: function(i) {
-            var len = this.length, j = +i + (i < 0 ? len : 0);
-            return this.pushStack(j >= 0 && j < len ? [this[j]] : []);
-          },
-          end: function() {
-            return this.prevObject || this.constructor();
-          },
-          // For internal use only.
-          // Behaves like an Array's method, not like a jQuery method.
-          push,
-          sort: arr.sort,
-          splice: arr.splice
-        };
-        jQuery.extend = jQuery.fn.extend = function() {
-          var options, name, src, copy, copyIsArray, clone2, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false;
-          if (typeof target === "boolean") {
-            deep = target;
-            target = arguments[i] || {};
-            i++;
-          }
-          if (typeof target !== "object" && !isFunction(target)) {
-            target = {};
-          }
-          if (i === length) {
-            target = this;
-            i--;
-          }
-          for (; i < length; i++) {
-            if ((options = arguments[i]) != null) {
-              for (name in options) {
-                copy = options[name];
-                if (name === "__proto__" || target === copy) {
-                  continue;
-                }
-                if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) {
-                  src = target[name];
-                  if (copyIsArray && !Array.isArray(src)) {
-                    clone2 = [];
-                  } else if (!copyIsArray && !jQuery.isPlainObject(src)) {
-                    clone2 = {};
-                  } else {
-                    clone2 = src;
-                  }
-                  copyIsArray = false;
-                  target[name] = jQuery.extend(deep, clone2, copy);
-                } else if (copy !== void 0) {
-                  target[name] = copy;
-                }
-              }
-            }
-          }
-          return target;
-        };
-        jQuery.extend({
-          // Unique for each copy of jQuery on the page
-          expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""),
-          // Assume jQuery is ready without the ready module
-          isReady: true,
-          error: function(msg) {
-            throw new Error(msg);
-          },
-          noop: function() {
-          },
-          isPlainObject: function(obj) {
-            var proto, Ctor;
-            if (!obj || toString.call(obj) !== "[object Object]") {
-              return false;
-            }
-            proto = getProto(obj);
-            if (!proto) {
-              return true;
-            }
-            Ctor = hasOwn.call(proto, "constructor") && proto.constructor;
-            return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString;
-          },
-          isEmptyObject: function(obj) {
-            var name;
-            for (name in obj) {
-              return false;
-            }
-            return true;
-          },
-          // Evaluates a script in a provided context; falls back to the global one
-          // if not specified.
-          globalEval: function(code, options, doc2) {
-            DOMEval(code, { nonce: options && options.nonce }, doc2);
-          },
-          each: function(obj, callback) {
-            var length, i = 0;
-            if (isArrayLike(obj)) {
-              length = obj.length;
-              for (; i < length; i++) {
-                if (callback.call(obj[i], i, obj[i]) === false) {
-                  break;
-                }
-              }
-            } else {
-              for (i in obj) {
-                if (callback.call(obj[i], i, obj[i]) === false) {
-                  break;
-                }
-              }
-            }
-            return obj;
-          },
-          // Retrieve the text value of an array of DOM nodes
-          text: function(elem) {
-            var node, ret = "", i = 0, nodeType = elem.nodeType;
-            if (!nodeType) {
-              while (node = elem[i++]) {
-                ret += jQuery.text(node);
-              }
-            }
-            if (nodeType === 1 || nodeType === 11) {
-              return elem.textContent;
-            }
-            if (nodeType === 9) {
-              return elem.documentElement.textContent;
-            }
-            if (nodeType === 3 || nodeType === 4) {
-              return elem.nodeValue;
-            }
-            return ret;
-          },
-          // results is for internal usage only
-          makeArray: function(arr2, results) {
-            var ret = results || [];
-            if (arr2 != null) {
-              if (isArrayLike(Object(arr2))) {
-                jQuery.merge(
-                  ret,
-                  typeof arr2 === "string" ? [arr2] : arr2
-                );
-              } else {
-                push.call(ret, arr2);
-              }
-            }
-            return ret;
-          },
-          inArray: function(elem, arr2, i) {
-            return arr2 == null ? -1 : indexOf.call(arr2, elem, i);
-          },
-          isXMLDoc: function(elem) {
-            var namespace = elem && elem.namespaceURI, docElem = elem && (elem.ownerDocument || elem).documentElement;
-            return !rhtmlSuffix.test(namespace || docElem && docElem.nodeName || "HTML");
-          },
-          // Support: Android <=4.0 only, PhantomJS 1 only
-          // push.apply(_, arraylike) throws on ancient WebKit
-          merge: function(first, second) {
-            var len = +second.length, j = 0, i = first.length;
-            for (; j < len; j++) {
-              first[i++] = second[j];
-            }
-            first.length = i;
-            return first;
-          },
-          grep: function(elems, callback, invert) {
-            var callbackInverse, matches = [], i = 0, length = elems.length, callbackExpect = !invert;
-            for (; i < length; i++) {
-              callbackInverse = !callback(elems[i], i);
-              if (callbackInverse !== callbackExpect) {
-                matches.push(elems[i]);
-              }
-            }
-            return matches;
-          },
-          // arg is for internal usage only
-          map: function(elems, callback, arg) {
-            var length, value, i = 0, ret = [];
-            if (isArrayLike(elems)) {
-              length = elems.length;
-              for (; i < length; i++) {
-                value = callback(elems[i], i, arg);
-                if (value != null) {
-                  ret.push(value);
-                }
-              }
-            } else {
-              for (i in elems) {
-                value = callback(elems[i], i, arg);
-                if (value != null) {
-                  ret.push(value);
-                }
-              }
-            }
-            return flat(ret);
-          },
-          // A global GUID counter for objects
-          guid: 1,
-          // jQuery.support is not used in Core but other projects attach their
-          // properties to it so it needs to exist.
-          support
-        });
-        if (typeof Symbol === "function") {
-          jQuery.fn[Symbol.iterator] = arr[Symbol.iterator];
-        }
-        jQuery.each(
-          "Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),
-          function(_i, name) {
-            class2type["[object " + name + "]"] = name.toLowerCase();
-          }
-        );
-        function isArrayLike(obj) {
-          var length = !!obj && "length" in obj && obj.length, type = toType2(obj);
-          if (isFunction(obj) || isWindow(obj)) {
-            return false;
-          }
-          return type === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj;
-        }
-        function nodeName(elem, name) {
-          return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-        }
-        var pop = arr.pop;
-        var sort = arr.sort;
-        var splice = arr.splice;
-        var whitespace = "[\\x20\\t\\r\\n\\f]";
-        var rtrimCSS = new RegExp(
-          "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$",
-          "g"
-        );
-        jQuery.contains = function(a, b) {
-          var bup = b && b.parentNode;
-          return a === bup || !!(bup && bup.nodeType === 1 && // Support: IE 9 - 11+
-          // IE doesn't have `contains` on SVG.
-          (a.contains ? a.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16));
-        };
-        var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
-        function fcssescape(ch, asCodePoint) {
-          if (asCodePoint) {
-            if (ch === "\0") {
-              return "\uFFFD";
-            }
-            return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " ";
-          }
-          return "\\" + ch;
-        }
-        jQuery.escapeSelector = function(sel) {
-          return (sel + "").replace(rcssescape, fcssescape);
-        };
-        var preferredDoc = document2, pushNative = push;
-        (function() {
-          var i, Expr, outermostContext, sortInput, hasDuplicate, push2 = pushNative, document3, documentElement2, documentIsHTML, rbuggyQSA, matches, expando = jQuery.expando, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), nonnativeSelectorCache = createCache(), sortOrder = function(a, b) {
-            if (a === b) {
-              hasDuplicate = true;
-            }
-            return 0;
-          }, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2)
-          "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
-          `*(?:'((?:\\\\.|[^\\\\'])*)'|"((?:\\\\.|[^\\\\"])*)"|(` + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + identifier + `)(?:\\((('((?:\\\\.|[^\\\\'])*)'|"((?:\\\\.|[^\\\\"])*)")|((?:\\\\.|[^\\\\()[\\]]|` + attributes + ")*)|.*)\\)|)", rwhitespace = new RegExp(whitespace + "+", "g"), rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"), rleadingCombinator = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"), rdescend = new RegExp(whitespace + "|>"), rpseudo = new RegExp(pseudos), ridentifier = new RegExp("^" + identifier + "$"), matchExpr = {
-            ID: new RegExp("^#(" + identifier + ")"),
-            CLASS: new RegExp("^\\.(" + identifier + ")"),
-            TAG: new RegExp("^(" + identifier + "|[*])"),
-            ATTR: new RegExp("^" + attributes),
-            PSEUDO: new RegExp("^" + pseudos),
-            CHILD: new RegExp(
-              "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)",
-              "i"
-            ),
-            bool: new RegExp("^(?:" + booleans + ")$", "i"),
-            // For use in libraries implementing .is()
-            // We use this for POS matching in `select`
-            needsContext: new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
-          }, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rquickExpr2 = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, runescape = new RegExp("\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g"), funescape = function(escape, nonHex) {
-            var high = "0x" + escape.slice(1) - 65536;
-            if (nonHex) {
-              return nonHex;
-            }
-            return high < 0 ? String.fromCharCode(high + 65536) : String.fromCharCode(high >> 10 | 55296, high & 1023 | 56320);
-          }, unloadHandler = function() {
-            setDocument();
-          }, inDisabledFieldset = addCombinator(
-            function(elem) {
-              return elem.disabled === true && nodeName(elem, "fieldset");
-            },
-            { dir: "parentNode", next: "legend" }
-          );
-          function safeActiveElement() {
-            try {
-              return document3.activeElement;
-            } catch (err) {
-            }
-          }
-          try {
-            push2.apply(
-              arr = slice.call(preferredDoc.childNodes),
-              preferredDoc.childNodes
-            );
-            arr[preferredDoc.childNodes.length].nodeType;
-          } catch (e) {
-            push2 = {
-              apply: function(target, els) {
-                pushNative.apply(target, slice.call(els));
-              },
-              call: function(target) {
-                pushNative.apply(target, slice.call(arguments, 1));
-              }
-            };
-          }
-          function find(selector, context, results, seed) {
-            var m, i2, elem, nid, match, groups, newSelector, newContext = context && context.ownerDocument, nodeType = context ? context.nodeType : 9;
-            results = results || [];
-            if (typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11) {
-              return results;
-            }
-            if (!seed) {
-              setDocument(context);
-              context = context || document3;
-              if (documentIsHTML) {
-                if (nodeType !== 11 && (match = rquickExpr2.exec(selector))) {
-                  if (m = match[1]) {
-                    if (nodeType === 9) {
-                      if (elem = context.getElementById(m)) {
-                        if (elem.id === m) {
-                          push2.call(results, elem);
-                          return results;
-                        }
-                      } else {
-                        return results;
-                      }
-                    } else {
-                      if (newContext && (elem = newContext.getElementById(m)) && find.contains(context, elem) && elem.id === m) {
-                        push2.call(results, elem);
-                        return results;
-                      }
-                    }
-                  } else if (match[2]) {
-                    push2.apply(results, context.getElementsByTagName(selector));
-                    return results;
-                  } else if ((m = match[3]) && context.getElementsByClassName) {
-                    push2.apply(results, context.getElementsByClassName(m));
-                    return results;
-                  }
-                }
-                if (!nonnativeSelectorCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector))) {
-                  newSelector = selector;
-                  newContext = context;
-                  if (nodeType === 1 && (rdescend.test(selector) || rleadingCombinator.test(selector))) {
-                    newContext = rsibling.test(selector) && testContext(context.parentNode) || context;
-                    if (newContext != context || !support.scope) {
-                      if (nid = context.getAttribute("id")) {
-                        nid = jQuery.escapeSelector(nid);
-                      } else {
-                        context.setAttribute("id", nid = expando);
-                      }
-                    }
-                    groups = tokenize(selector);
-                    i2 = groups.length;
-                    while (i2--) {
-                      groups[i2] = (nid ? "#" + nid : ":scope") + " " + toSelector(groups[i2]);
-                    }
-                    newSelector = groups.join(",");
-                  }
-                  try {
-                    push2.apply(
-                      results,
-                      newContext.querySelectorAll(newSelector)
-                    );
-                    return results;
-                  } catch (qsaError) {
-                    nonnativeSelectorCache(selector, true);
-                  } finally {
-                    if (nid === expando) {
-                      context.removeAttribute("id");
-                    }
-                  }
-                }
-              }
-            }
-            return select(selector.replace(rtrimCSS, "$1"), context, results, seed);
-          }
-          function createCache() {
-            var keys = [];
-            function cache(key, value) {
-              if (keys.push(key + " ") > Expr.cacheLength) {
-                delete cache[keys.shift()];
-              }
-              return cache[key + " "] = value;
-            }
-            return cache;
-          }
-          function markFunction(fn2) {
-            fn2[expando] = true;
-            return fn2;
-          }
-          function assert(fn2) {
-            var el = document3.createElement("fieldset");
-            try {
-              return !!fn2(el);
-            } catch (e) {
-              return false;
-            } finally {
-              if (el.parentNode) {
-                el.parentNode.removeChild(el);
-              }
-              el = null;
-            }
-          }
-          function createInputPseudo(type) {
-            return function(elem) {
-              return nodeName(elem, "input") && elem.type === type;
-            };
-          }
-          function createButtonPseudo(type) {
-            return function(elem) {
-              return (nodeName(elem, "input") || nodeName(elem, "button")) && elem.type === type;
-            };
-          }
-          function createDisabledPseudo(disabled) {
-            return function(elem) {
-              if ("form" in elem) {
-                if (elem.parentNode && elem.disabled === false) {
-                  if ("label" in elem) {
-                    if ("label" in elem.parentNode) {
-                      return elem.parentNode.disabled === disabled;
-                    } else {
-                      return elem.disabled === disabled;
-                    }
-                  }
-                  return elem.isDisabled === disabled || // Where there is no isDisabled, check manually
-                  elem.isDisabled !== !disabled && inDisabledFieldset(elem) === disabled;
-                }
-                return elem.disabled === disabled;
-              } else if ("label" in elem) {
-                return elem.disabled === disabled;
-              }
-              return false;
-            };
-          }
-          function createPositionalPseudo(fn2) {
-            return markFunction(function(argument) {
-              argument = +argument;
-              return markFunction(function(seed, matches2) {
-                var j, matchIndexes = fn2([], seed.length, argument), i2 = matchIndexes.length;
-                while (i2--) {
-                  if (seed[j = matchIndexes[i2]]) {
-                    seed[j] = !(matches2[j] = seed[j]);
-                  }
-                }
-              });
-            });
-          }
-          function testContext(context) {
-            return context && typeof context.getElementsByTagName !== "undefined" && context;
-          }
-          function setDocument(node) {
-            var subWindow, doc2 = node ? node.ownerDocument || node : preferredDoc;
-            if (doc2 == document3 || doc2.nodeType !== 9 || !doc2.documentElement) {
-              return document3;
-            }
-            document3 = doc2;
-            documentElement2 = document3.documentElement;
-            documentIsHTML = !jQuery.isXMLDoc(document3);
-            matches = documentElement2.matches || documentElement2.webkitMatchesSelector || documentElement2.msMatchesSelector;
-            if (documentElement2.msMatchesSelector && // Support: IE 11+, Edge 17 - 18+
-            // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
-            // two documents; shallow comparisons work.
-            // eslint-disable-next-line eqeqeq
-            preferredDoc != document3 && (subWindow = document3.defaultView) && subWindow.top !== subWindow) {
-              subWindow.addEventListener("unload", unloadHandler);
-            }
-            support.getById = assert(function(el) {
-              documentElement2.appendChild(el).id = jQuery.expando;
-              return !document3.getElementsByName || !document3.getElementsByName(jQuery.expando).length;
-            });
-            support.disconnectedMatch = assert(function(el) {
-              return matches.call(el, "*");
-            });
-            support.scope = assert(function() {
-              return document3.querySelectorAll(":scope");
-            });
-            support.cssHas = assert(function() {
-              try {
-                document3.querySelector(":has(*,:jqfake)");
-                return false;
-              } catch (e) {
-                return true;
-              }
-            });
-            if (support.getById) {
-              Expr.filter.ID = function(id) {
-                var attrId = id.replace(runescape, funescape);
-                return function(elem) {
-                  return elem.getAttribute("id") === attrId;
-                };
-              };
-              Expr.find.ID = function(id, context) {
-                if (typeof context.getElementById !== "undefined" && documentIsHTML) {
-                  var elem = context.getElementById(id);
-                  return elem ? [elem] : [];
-                }
-              };
-            } else {
-              Expr.filter.ID = function(id) {
-                var attrId = id.replace(runescape, funescape);
-                return function(elem) {
-                  var node2 = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
-                  return node2 && node2.value === attrId;
-                };
-              };
-              Expr.find.ID = function(id, context) {
-                if (typeof context.getElementById !== "undefined" && documentIsHTML) {
-                  var node2, i2, elems, elem = context.getElementById(id);
-                  if (elem) {
-                    node2 = elem.getAttributeNode("id");
-                    if (node2 && node2.value === id) {
-                      return [elem];
-                    }
-                    elems = context.getElementsByName(id);
-                    i2 = 0;
-                    while (elem = elems[i2++]) {
-                      node2 = elem.getAttributeNode("id");
-                      if (node2 && node2.value === id) {
-                        return [elem];
-                      }
-                    }
-                  }
-                  return [];
-                }
-              };
-            }
-            Expr.find.TAG = function(tag, context) {
-              if (typeof context.getElementsByTagName !== "undefined") {
-                return context.getElementsByTagName(tag);
-              } else {
-                return context.querySelectorAll(tag);
-              }
-            };
-            Expr.find.CLASS = function(className, context) {
-              if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) {
-                return context.getElementsByClassName(className);
-              }
-            };
-            rbuggyQSA = [];
-            assert(function(el) {
-              var input;
-              documentElement2.appendChild(el).innerHTML = "<a id='" + expando + "' href='' disabled='disabled'></a><select id='" + expando + "-\r\\' disabled='disabled'><option selected=''></option></select>";
-              if (!el.querySelectorAll("[selected]").length) {
-                rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");
-              }
-              if (!el.querySelectorAll("[id~=" + expando + "-]").length) {
-                rbuggyQSA.push("~=");
-              }
-              if (!el.querySelectorAll("a#" + expando + "+*").length) {
-                rbuggyQSA.push(".#.+[+~]");
-              }
-              if (!el.querySelectorAll(":checked").length) {
-                rbuggyQSA.push(":checked");
-              }
-              input = document3.createElement("input");
-              input.setAttribute("type", "hidden");
-              el.appendChild(input).setAttribute("name", "D");
-              documentElement2.appendChild(el).disabled = true;
-              if (el.querySelectorAll(":disabled").length !== 2) {
-                rbuggyQSA.push(":enabled", ":disabled");
-              }
-              input = document3.createElement("input");
-              input.setAttribute("name", "");
-              el.appendChild(input);
-              if (!el.querySelectorAll("[name='']").length) {
-                rbuggyQSA.push("\\[" + whitespace + "*name" + whitespace + "*=" + whitespace + `*(?:''|"")`);
-              }
-            });
-            if (!support.cssHas) {
-              rbuggyQSA.push(":has");
-            }
-            rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));
-            sortOrder = function(a, b) {
-              if (a === b) {
-                hasDuplicate = true;
-                return 0;
-              }
-              var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
-              if (compare) {
-                return compare;
-              }
-              compare = (a.ownerDocument || a) == (b.ownerDocument || b) ? a.compareDocumentPosition(b) : (
-                // Otherwise we know they are disconnected
-                1
-              );
-              if (compare & 1 || !support.sortDetached && b.compareDocumentPosition(a) === compare) {
-                if (a === document3 || a.ownerDocument == preferredDoc && find.contains(preferredDoc, a)) {
-                  return -1;
-                }
-                if (b === document3 || b.ownerDocument == preferredDoc && find.contains(preferredDoc, b)) {
-                  return 1;
-                }
-                return sortInput ? indexOf.call(sortInput, a) - indexOf.call(sortInput, b) : 0;
-              }
-              return compare & 4 ? -1 : 1;
-            };
-            return document3;
-          }
-          find.matches = function(expr, elements) {
-            return find(expr, null, null, elements);
-          };
-          find.matchesSelector = function(elem, expr) {
-            setDocument(elem);
-            if (documentIsHTML && !nonnativeSelectorCache[expr + " "] && (!rbuggyQSA || !rbuggyQSA.test(expr))) {
-              try {
-                var ret = matches.call(elem, expr);
-                if (ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document
-                // fragment in IE 9
-                elem.document && elem.document.nodeType !== 11) {
-                  return ret;
-                }
-              } catch (e) {
-                nonnativeSelectorCache(expr, true);
-              }
-            }
-            return find(expr, document3, null, [elem]).length > 0;
-          };
-          find.contains = function(context, elem) {
-            if ((context.ownerDocument || context) != document3) {
-              setDocument(context);
-            }
-            return jQuery.contains(context, elem);
-          };
-          find.attr = function(elem, name) {
-            if ((elem.ownerDocument || elem) != document3) {
-              setDocument(elem);
-            }
-            var fn2 = Expr.attrHandle[name.toLowerCase()], val = fn2 && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn2(elem, name, !documentIsHTML) : void 0;
-            if (val !== void 0) {
-              return val;
-            }
-            return elem.getAttribute(name);
-          };
-          find.error = function(msg) {
-            throw new Error("Syntax error, unrecognized expression: " + msg);
-          };
-          jQuery.uniqueSort = function(results) {
-            var elem, duplicates = [], j = 0, i2 = 0;
-            hasDuplicate = !support.sortStable;
-            sortInput = !support.sortStable && slice.call(results, 0);
-            sort.call(results, sortOrder);
-            if (hasDuplicate) {
-              while (elem = results[i2++]) {
-                if (elem === results[i2]) {
-                  j = duplicates.push(i2);
-                }
-              }
-              while (j--) {
-                splice.call(results, duplicates[j], 1);
-              }
-            }
-            sortInput = null;
-            return results;
-          };
-          jQuery.fn.uniqueSort = function() {
-            return this.pushStack(jQuery.uniqueSort(slice.apply(this)));
-          };
-          Expr = jQuery.expr = {
-            // Can be adjusted by the user
-            cacheLength: 50,
-            createPseudo: markFunction,
-            match: matchExpr,
-            attrHandle: {},
-            find: {},
-            relative: {
-              ">": { dir: "parentNode", first: true },
-              " ": { dir: "parentNode" },
-              "+": { dir: "previousSibling", first: true },
-              "~": { dir: "previousSibling" }
-            },
-            preFilter: {
-              ATTR: function(match) {
-                match[1] = match[1].replace(runescape, funescape);
-                match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape);
-                if (match[2] === "~=") {
-                  match[3] = " " + match[3] + " ";
-                }
-                return match.slice(0, 4);
-              },
-              CHILD: function(match) {
-                match[1] = match[1].toLowerCase();
-                if (match[1].slice(0, 3) === "nth") {
-                  if (!match[3]) {
-                    find.error(match[0]);
-                  }
-                  match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd"));
-                  match[5] = +(match[7] + match[8] || match[3] === "odd");
-                } else if (match[3]) {
-                  find.error(match[0]);
-                }
-                return match;
-              },
-              PSEUDO: function(match) {
-                var excess, unquoted = !match[6] && match[2];
-                if (matchExpr.CHILD.test(match[0])) {
-                  return null;
-                }
-                if (match[3]) {
-                  match[2] = match[4] || match[5] || "";
-                } else if (unquoted && rpseudo.test(unquoted) && // Get excess from tokenize (recursively)
-                (excess = tokenize(unquoted, true)) && // advance to the next closing parenthesis
-                (excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {
-                  match[0] = match[0].slice(0, excess);
-                  match[2] = unquoted.slice(0, excess);
-                }
-                return match.slice(0, 3);
-              }
-            },
-            filter: {
-              TAG: function(nodeNameSelector) {
-                var expectedNodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();
-                return nodeNameSelector === "*" ? function() {
-                  return true;
-                } : function(elem) {
-                  return nodeName(elem, expectedNodeName);
-                };
-              },
-              CLASS: function(className) {
-                var pattern = classCache[className + " "];
-                return pattern || (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && classCache(className, function(elem) {
-                  return pattern.test(
-                    typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || ""
-                  );
-                });
-              },
-              ATTR: function(name, operator, check) {
-                return function(elem) {
-                  var result = find.attr(elem, name);
-                  if (result == null) {
-                    return operator === "!=";
-                  }
-                  if (!operator) {
-                    return true;
-                  }
-                  result += "";
-                  if (operator === "=") {
-                    return result === check;
-                  }
-                  if (operator === "!=") {
-                    return result !== check;
-                  }
-                  if (operator === "^=") {
-                    return check && result.indexOf(check) === 0;
-                  }
-                  if (operator === "*=") {
-                    return check && result.indexOf(check) > -1;
-                  }
-                  if (operator === "$=") {
-                    return check && result.slice(-check.length) === check;
-                  }
-                  if (operator === "~=") {
-                    return (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1;
-                  }
-                  if (operator === "|=") {
-                    return result === check || result.slice(0, check.length + 1) === check + "-";
-                  }
-                  return false;
-                };
-              },
-              CHILD: function(type, what, _argument, first, last) {
-                var simple = type.slice(0, 3) !== "nth", forward = type.slice(-4) !== "last", ofType = what === "of-type";
-                return first === 1 && last === 0 ? (
-                  // Shortcut for :nth-*(n)
-                  function(elem) {
-                    return !!elem.parentNode;
-                  }
-                ) : function(elem, _context, xml) {
-                  var cache, outerCache, node, nodeIndex, start2, dir2 = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType, diff = false;
-                  if (parent) {
-                    if (simple) {
-                      while (dir2) {
-                        node = elem;
-                        while (node = node[dir2]) {
-                          if (ofType ? nodeName(node, name) : node.nodeType === 1) {
-                            return false;
-                          }
-                        }
-                        start2 = dir2 = type === "only" && !start2 && "nextSibling";
-                      }
-                      return true;
-                    }
-                    start2 = [forward ? parent.firstChild : parent.lastChild];
-                    if (forward && useCache) {
-                      outerCache = parent[expando] || (parent[expando] = {});
-                      cache = outerCache[type] || [];
-                      nodeIndex = cache[0] === dirruns && cache[1];
-                      diff = nodeIndex && cache[2];
-                      node = nodeIndex && parent.childNodes[nodeIndex];
-                      while (node = ++nodeIndex && node && node[dir2] || // Fallback to seeking `elem` from the start
-                      (diff = nodeIndex = 0) || start2.pop()) {
-                        if (node.nodeType === 1 && ++diff && node === elem) {
-                          outerCache[type] = [dirruns, nodeIndex, diff];
-                          break;
-                        }
-                      }
-                    } else {
-                      if (useCache) {
-                        outerCache = elem[expando] || (elem[expando] = {});
-                        cache = outerCache[type] || [];
-                        nodeIndex = cache[0] === dirruns && cache[1];
-                        diff = nodeIndex;
-                      }
-                      if (diff === false) {
-                        while (node = ++nodeIndex && node && node[dir2] || (diff = nodeIndex = 0) || start2.pop()) {
-                          if ((ofType ? nodeName(node, name) : node.nodeType === 1) && ++diff) {
-                            if (useCache) {
-                              outerCache = node[expando] || (node[expando] = {});
-                              outerCache[type] = [dirruns, diff];
-                            }
-                            if (node === elem) {
-                              break;
-                            }
-                          }
-                        }
-                      }
-                    }
-                    diff -= last;
-                    return diff === first || diff % first === 0 && diff / first >= 0;
-                  }
-                };
-              },
-              PSEUDO: function(pseudo, argument) {
-                var args, fn2 = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || find.error("unsupported pseudo: " + pseudo);
-                if (fn2[expando]) {
-                  return fn2(argument);
-                }
-                if (fn2.length > 1) {
-                  args = [pseudo, pseudo, "", argument];
-                  return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function(seed, matches2) {
-                    var idx, matched = fn2(seed, argument), i2 = matched.length;
-                    while (i2--) {
-                      idx = indexOf.call(seed, matched[i2]);
-                      seed[idx] = !(matches2[idx] = matched[i2]);
-                    }
-                  }) : function(elem) {
-                    return fn2(elem, 0, args);
-                  };
-                }
-                return fn2;
-              }
-            },
-            pseudos: {
-              // Potentially complex pseudos
-              not: markFunction(function(selector) {
-                var input = [], results = [], matcher = compile(selector.replace(rtrimCSS, "$1"));
-                return matcher[expando] ? markFunction(function(seed, matches2, _context, xml) {
-                  var elem, unmatched = matcher(seed, null, xml, []), i2 = seed.length;
-                  while (i2--) {
-                    if (elem = unmatched[i2]) {
-                      seed[i2] = !(matches2[i2] = elem);
-                    }
-                  }
-                }) : function(elem, _context, xml) {
-                  input[0] = elem;
-                  matcher(input, null, xml, results);
-                  input[0] = null;
-                  return !results.pop();
-                };
-              }),
-              has: markFunction(function(selector) {
-                return function(elem) {
-                  return find(selector, elem).length > 0;
-                };
-              }),
-              contains: markFunction(function(text) {
-                text = text.replace(runescape, funescape);
-                return function(elem) {
-                  return (elem.textContent || jQuery.text(elem)).indexOf(text) > -1;
-                };
-              }),
-              // "Whether an element is represented by a :lang() selector
-              // is based solely on the element's language value
-              // being equal to the identifier C,
-              // or beginning with the identifier C immediately followed by "-".
-              // The matching of C against the element's language value is performed case-insensitively.
-              // The identifier C does not have to be a valid language name."
-              // https://www.w3.org/TR/selectors/#lang-pseudo
-              lang: markFunction(function(lang) {
-                if (!ridentifier.test(lang || "")) {
-                  find.error("unsupported lang: " + lang);
-                }
-                lang = lang.replace(runescape, funescape).toLowerCase();
-                return function(elem) {
-                  var elemLang;
-                  do {
-                    if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) {
-                      elemLang = elemLang.toLowerCase();
-                      return elemLang === lang || elemLang.indexOf(lang + "-") === 0;
-                    }
-                  } while ((elem = elem.parentNode) && elem.nodeType === 1);
-                  return false;
-                };
-              }),
-              // Miscellaneous
-              target: function(elem) {
-                var hash3 = window2.location && window2.location.hash;
-                return hash3 && hash3.slice(1) === elem.id;
-              },
-              root: function(elem) {
-                return elem === documentElement2;
-              },
-              focus: function(elem) {
-                return elem === safeActiveElement() && document3.hasFocus() && !!(elem.type || elem.href || ~elem.tabIndex);
-              },
-              // Boolean properties
-              enabled: createDisabledPseudo(false),
-              disabled: createDisabledPseudo(true),
-              checked: function(elem) {
-                return nodeName(elem, "input") && !!elem.checked || nodeName(elem, "option") && !!elem.selected;
-              },
-              selected: function(elem) {
-                if (elem.parentNode) {
-                  elem.parentNode.selectedIndex;
-                }
-                return elem.selected === true;
-              },
-              // Contents
-              empty: function(elem) {
-                for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
-                  if (elem.nodeType < 6) {
-                    return false;
-                  }
-                }
-                return true;
-              },
-              parent: function(elem) {
-                return !Expr.pseudos.empty(elem);
-              },
-              // Element/input types
-              header: function(elem) {
-                return rheader.test(elem.nodeName);
-              },
-              input: function(elem) {
-                return rinputs.test(elem.nodeName);
-              },
-              button: function(elem) {
-                return nodeName(elem, "input") && elem.type === "button" || nodeName(elem, "button");
-              },
-              text: function(elem) {
-                var attr;
-                return nodeName(elem, "input") && elem.type === "text" && // Support: IE <10 only
-                // New HTML5 attribute values (e.g., "search") appear
-                // with elem.type === "text"
-                ((attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text");
-              },
-              // Position-in-collection
-              first: createPositionalPseudo(function() {
-                return [0];
-              }),
-              last: createPositionalPseudo(function(_matchIndexes, length) {
-                return [length - 1];
-              }),
-              eq: createPositionalPseudo(function(_matchIndexes, length, argument) {
-                return [argument < 0 ? argument + length : argument];
-              }),
-              even: createPositionalPseudo(function(matchIndexes, length) {
-                var i2 = 0;
-                for (; i2 < length; i2 += 2) {
-                  matchIndexes.push(i2);
-                }
-                return matchIndexes;
-              }),
-              odd: createPositionalPseudo(function(matchIndexes, length) {
-                var i2 = 1;
-                for (; i2 < length; i2 += 2) {
-                  matchIndexes.push(i2);
-                }
-                return matchIndexes;
-              }),
-              lt: createPositionalPseudo(function(matchIndexes, length, argument) {
-                var i2;
-                if (argument < 0) {
-                  i2 = argument + length;
-                } else if (argument > length) {
-                  i2 = length;
-                } else {
-                  i2 = argument;
-                }
-                for (; --i2 >= 0; ) {
-                  matchIndexes.push(i2);
-                }
-                return matchIndexes;
-              }),
-              gt: createPositionalPseudo(function(matchIndexes, length, argument) {
-                var i2 = argument < 0 ? argument + length : argument;
-                for (; ++i2 < length; ) {
-                  matchIndexes.push(i2);
-                }
-                return matchIndexes;
-              })
-            }
-          };
-          Expr.pseudos.nth = Expr.pseudos.eq;
-          for (i in { radio: true, checkbox: true, file: true, password: true, image: true }) {
-            Expr.pseudos[i] = createInputPseudo(i);
-          }
-          for (i in { submit: true, reset: true }) {
-            Expr.pseudos[i] = createButtonPseudo(i);
-          }
-          function setFilters() {
-          }
-          setFilters.prototype = Expr.filters = Expr.pseudos;
-          Expr.setFilters = new setFilters();
-          function tokenize(selector, parseOnly) {
-            var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[selector + " "];
-            if (cached) {
-              return parseOnly ? 0 : cached.slice(0);
-            }
-            soFar = selector;
-            groups = [];
-            preFilters = Expr.preFilter;
-            while (soFar) {
-              if (!matched || (match = rcomma.exec(soFar))) {
-                if (match) {
-                  soFar = soFar.slice(match[0].length) || soFar;
-                }
-                groups.push(tokens = []);
-              }
-              matched = false;
-              if (match = rleadingCombinator.exec(soFar)) {
-                matched = match.shift();
-                tokens.push({
-                  value: matched,
-                  // Cast descendant combinators to space
-                  type: match[0].replace(rtrimCSS, " ")
-                });
-                soFar = soFar.slice(matched.length);
-              }
-              for (type in Expr.filter) {
-                if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) {
-                  matched = match.shift();
-                  tokens.push({
-                    value: matched,
-                    type,
-                    matches: match
-                  });
-                  soFar = soFar.slice(matched.length);
-                }
-              }
-              if (!matched) {
-                break;
-              }
-            }
-            if (parseOnly) {
-              return soFar.length;
-            }
-            return soFar ? find.error(selector) : (
-              // Cache the tokens
-              tokenCache(selector, groups).slice(0)
-            );
-          }
-          function toSelector(tokens) {
-            var i2 = 0, len = tokens.length, selector = "";
-            for (; i2 < len; i2++) {
-              selector += tokens[i2].value;
-            }
-            return selector;
-          }
-          function addCombinator(matcher, combinator, base) {
-            var dir2 = combinator.dir, skip = combinator.next, key = skip || dir2, checkNonElements = base && key === "parentNode", doneName = done++;
-            return combinator.first ? (
-              // Check against closest ancestor/preceding element
-              function(elem, context, xml) {
-                while (elem = elem[dir2]) {
-                  if (elem.nodeType === 1 || checkNonElements) {
-                    return matcher(elem, context, xml);
-                  }
-                }
-                return false;
-              }
-            ) : (
-              // Check against all ancestor/preceding elements
-              function(elem, context, xml) {
-                var oldCache, outerCache, newCache = [dirruns, doneName];
-                if (xml) {
-                  while (elem = elem[dir2]) {
-                    if (elem.nodeType === 1 || checkNonElements) {
-                      if (matcher(elem, context, xml)) {
-                        return true;
-                      }
-                    }
-                  }
-                } else {
-                  while (elem = elem[dir2]) {
-                    if (elem.nodeType === 1 || checkNonElements) {
-                      outerCache = elem[expando] || (elem[expando] = {});
-                      if (skip && nodeName(elem, skip)) {
-                        elem = elem[dir2] || elem;
-                      } else if ((oldCache = outerCache[key]) && oldCache[0] === dirruns && oldCache[1] === doneName) {
-                        return newCache[2] = oldCache[2];
-                      } else {
-                        outerCache[key] = newCache;
-                        if (newCache[2] = matcher(elem, context, xml)) {
-                          return true;
-                        }
-                      }
-                    }
-                  }
-                }
-                return false;
-              }
-            );
-          }
-          function elementMatcher(matchers) {
-            return matchers.length > 1 ? function(elem, context, xml) {
-              var i2 = matchers.length;
-              while (i2--) {
-                if (!matchers[i2](elem, context, xml)) {
-                  return false;
-                }
-              }
-              return true;
-            } : matchers[0];
-          }
-          function multipleContexts(selector, contexts, results) {
-            var i2 = 0, len = contexts.length;
-            for (; i2 < len; i2++) {
-              find(selector, contexts[i2], results);
-            }
-            return results;
-          }
-          function condense(unmatched, map, filter, context, xml) {
-            var elem, newUnmatched = [], i2 = 0, len = unmatched.length, mapped = map != null;
-            for (; i2 < len; i2++) {
-              if (elem = unmatched[i2]) {
-                if (!filter || filter(elem, context, xml)) {
-                  newUnmatched.push(elem);
-                  if (mapped) {
-                    map.push(i2);
-                  }
-                }
-              }
-            }
-            return newUnmatched;
-          }
-          function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
-            if (postFilter && !postFilter[expando]) {
-              postFilter = setMatcher(postFilter);
-            }
-            if (postFinder && !postFinder[expando]) {
-              postFinder = setMatcher(postFinder, postSelector);
-            }
-            return markFunction(function(seed, results, context, xml) {
-              var temp, i2, elem, matcherOut, preMap = [], postMap = [], preexisting = results.length, elems = seed || multipleContexts(
-                selector || "*",
-                context.nodeType ? [context] : context,
-                []
-              ), matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems;
-              if (matcher) {
-                matcherOut = postFinder || (seed ? preFilter : preexisting || postFilter) ? (
-                  // ...intermediate processing is necessary
-                  []
-                ) : (
-                  // ...otherwise use results directly
-                  results
-                );
-                matcher(matcherIn, matcherOut, context, xml);
-              } else {
-                matcherOut = matcherIn;
-              }
-              if (postFilter) {
-                temp = condense(matcherOut, postMap);
-                postFilter(temp, [], context, xml);
-                i2 = temp.length;
-                while (i2--) {
-                  if (elem = temp[i2]) {
-                    matcherOut[postMap[i2]] = !(matcherIn[postMap[i2]] = elem);
-                  }
-                }
-              }
-              if (seed) {
-                if (postFinder || preFilter) {
-                  if (postFinder) {
-                    temp = [];
-                    i2 = matcherOut.length;
-                    while (i2--) {
-                      if (elem = matcherOut[i2]) {
-                        temp.push(matcherIn[i2] = elem);
-                      }
-                    }
-                    postFinder(null, matcherOut = [], temp, xml);
-                  }
-                  i2 = matcherOut.length;
-                  while (i2--) {
-                    if ((elem = matcherOut[i2]) && (temp = postFinder ? indexOf.call(seed, elem) : preMap[i2]) > -1) {
-                      seed[temp] = !(results[temp] = elem);
-                    }
-                  }
-                }
-              } else {
-                matcherOut = condense(
-                  matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut
-                );
-                if (postFinder) {
-                  postFinder(null, results, matcherOut, xml);
-                } else {
-                  push2.apply(results, matcherOut);
-                }
-              }
-            });
-          }
-          function matcherFromTokens(tokens) {
-            var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[tokens[0].type], implicitRelative = leadingRelative || Expr.relative[" "], i2 = leadingRelative ? 1 : 0, matchContext = addCombinator(function(elem) {
-              return elem === checkContext;
-            }, implicitRelative, true), matchAnyContext = addCombinator(function(elem) {
-              return indexOf.call(checkContext, elem) > -1;
-            }, implicitRelative, true), matchers = [function(elem, context, xml) {
-              var ret = !leadingRelative && (xml || context != outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml));
-              checkContext = null;
-              return ret;
-            }];
-            for (; i2 < len; i2++) {
-              if (matcher = Expr.relative[tokens[i2].type]) {
-                matchers = [addCombinator(elementMatcher(matchers), matcher)];
-              } else {
-                matcher = Expr.filter[tokens[i2].type].apply(null, tokens[i2].matches);
-                if (matcher[expando]) {
-                  j = ++i2;
-                  for (; j < len; j++) {
-                    if (Expr.relative[tokens[j].type]) {
-                      break;
-                    }
-                  }
-                  return setMatcher(
-                    i2 > 1 && elementMatcher(matchers),
-                    i2 > 1 && toSelector(
-                      // If the preceding token was a descendant combinator, insert an implicit any-element `*`
-                      tokens.slice(0, i2 - 1).concat({ value: tokens[i2 - 2].type === " " ? "*" : "" })
-                    ).replace(rtrimCSS, "$1"),
-                    matcher,
-                    i2 < j && matcherFromTokens(tokens.slice(i2, j)),
-                    j < len && matcherFromTokens(tokens = tokens.slice(j)),
-                    j < len && toSelector(tokens)
-                  );
-                }
-                matchers.push(matcher);
-              }
-            }
-            return elementMatcher(matchers);
-          }
-          function matcherFromGroupMatchers(elementMatchers, setMatchers) {
-            var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function(seed, context, xml, results, outermost) {
-              var elem, j, matcher, matchedCount = 0, i2 = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, elems = seed || byElement && Expr.find.TAG("*", outermost), dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1, len = elems.length;
-              if (outermost) {
-                outermostContext = context == document3 || context || outermost;
-              }
-              for (; i2 !== len && (elem = elems[i2]) != null; i2++) {
-                if (byElement && elem) {
-                  j = 0;
-                  if (!context && elem.ownerDocument != document3) {
-                    setDocument(elem);
-                    xml = !documentIsHTML;
-                  }
-                  while (matcher = elementMatchers[j++]) {
-                    if (matcher(elem, context || document3, xml)) {
-                      push2.call(results, elem);
-                      break;
-                    }
-                  }
-                  if (outermost) {
-                    dirruns = dirrunsUnique;
-                  }
-                }
-                if (bySet) {
-                  if (elem = !matcher && elem) {
-                    matchedCount--;
-                  }
-                  if (seed) {
-                    unmatched.push(elem);
-                  }
-                }
-              }
-              matchedCount += i2;
-              if (bySet && i2 !== matchedCount) {
-                j = 0;
-                while (matcher = setMatchers[j++]) {
-                  matcher(unmatched, setMatched, context, xml);
-                }
-                if (seed) {
-                  if (matchedCount > 0) {
-                    while (i2--) {
-                      if (!(unmatched[i2] || setMatched[i2])) {
-                        setMatched[i2] = pop.call(results);
-                      }
-                    }
-                  }
-                  setMatched = condense(setMatched);
-                }
-                push2.apply(results, setMatched);
-                if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) {
-                  jQuery.uniqueSort(results);
-                }
-              }
-              if (outermost) {
-                dirruns = dirrunsUnique;
-                outermostContext = contextBackup;
-              }
-              return unmatched;
-            };
-            return bySet ? markFunction(superMatcher) : superMatcher;
-          }
-          function compile(selector, match) {
-            var i2, setMatchers = [], elementMatchers = [], cached = compilerCache[selector + " "];
-            if (!cached) {
-              if (!match) {
-                match = tokenize(selector);
-              }
-              i2 = match.length;
-              while (i2--) {
-                cached = matcherFromTokens(match[i2]);
-                if (cached[expando]) {
-                  setMatchers.push(cached);
-                } else {
-                  elementMatchers.push(cached);
-                }
-              }
-              cached = compilerCache(
-                selector,
-                matcherFromGroupMatchers(elementMatchers, setMatchers)
-              );
-              cached.selector = selector;
-            }
-            return cached;
-          }
-          function select(selector, context, results, seed) {
-            var i2, tokens, token, type, find2, compiled = typeof selector === "function" && selector, match = !seed && tokenize(selector = compiled.selector || selector);
-            results = results || [];
-            if (match.length === 1) {
-              tokens = match[0] = match[0].slice(0);
-              if (tokens.length > 2 && (token = tokens[0]).type === "ID" && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) {
-                context = (Expr.find.ID(
-                  token.matches[0].replace(runescape, funescape),
-                  context
-                ) || [])[0];
-                if (!context) {
-                  return results;
-                } else if (compiled) {
-                  context = context.parentNode;
-                }
-                selector = selector.slice(tokens.shift().value.length);
-              }
-              i2 = matchExpr.needsContext.test(selector) ? 0 : tokens.length;
-              while (i2--) {
-                token = tokens[i2];
-                if (Expr.relative[type = token.type]) {
-                  break;
-                }
-                if (find2 = Expr.find[type]) {
-                  if (seed = find2(
-                    token.matches[0].replace(runescape, funescape),
-                    rsibling.test(tokens[0].type) && testContext(context.parentNode) || context
-                  )) {
-                    tokens.splice(i2, 1);
-                    selector = seed.length && toSelector(tokens);
-                    if (!selector) {
-                      push2.apply(results, seed);
-                      return results;
-                    }
-                    break;
-                  }
-                }
-              }
-            }
-            (compiled || compile(selector, match))(
-              seed,
-              context,
-              !documentIsHTML,
-              results,
-              !context || rsibling.test(selector) && testContext(context.parentNode) || context
-            );
-            return results;
-          }
-          support.sortStable = expando.split("").sort(sortOrder).join("") === expando;
-          setDocument();
-          support.sortDetached = assert(function(el) {
-            return el.compareDocumentPosition(document3.createElement("fieldset")) & 1;
-          });
-          jQuery.find = find;
-          jQuery.expr[":"] = jQuery.expr.pseudos;
-          jQuery.unique = jQuery.uniqueSort;
-          find.compile = compile;
-          find.select = select;
-          find.setDocument = setDocument;
-          find.tokenize = tokenize;
-          find.escape = jQuery.escapeSelector;
-          find.getText = jQuery.text;
-          find.isXML = jQuery.isXMLDoc;
-          find.selectors = jQuery.expr;
-          find.support = jQuery.support;
-          find.uniqueSort = jQuery.uniqueSort;
-        })();
-        var dir = function(elem, dir2, until) {
-          var matched = [], truncate = until !== void 0;
-          while ((elem = elem[dir2]) && elem.nodeType !== 9) {
-            if (elem.nodeType === 1) {
-              if (truncate && jQuery(elem).is(until)) {
-                break;
-              }
-              matched.push(elem);
-            }
-          }
-          return matched;
-        };
-        var siblings = function(n, elem) {
-          var matched = [];
-          for (; n; n = n.nextSibling) {
-            if (n.nodeType === 1 && n !== elem) {
-              matched.push(n);
-            }
-          }
-          return matched;
-        };
-        var rneedsContext = jQuery.expr.match.needsContext;
-        var rsingleTag = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;
-        function winnow(elements, qualifier, not) {
-          if (isFunction(qualifier)) {
-            return jQuery.grep(elements, function(elem, i) {
-              return !!qualifier.call(elem, i, elem) !== not;
-            });
-          }
-          if (qualifier.nodeType) {
-            return jQuery.grep(elements, function(elem) {
-              return elem === qualifier !== not;
-            });
-          }
-          if (typeof qualifier !== "string") {
-            return jQuery.grep(elements, function(elem) {
-              return indexOf.call(qualifier, elem) > -1 !== not;
-            });
-          }
-          return jQuery.filter(qualifier, elements, not);
-        }
-        jQuery.filter = function(expr, elems, not) {
-          var elem = elems[0];
-          if (not) {
-            expr = ":not(" + expr + ")";
-          }
-          if (elems.length === 1 && elem.nodeType === 1) {
-            return jQuery.find.matchesSelector(elem, expr) ? [elem] : [];
-          }
-          return jQuery.find.matches(expr, jQuery.grep(elems, function(elem2) {
-            return elem2.nodeType === 1;
-          }));
-        };
-        jQuery.fn.extend({
-          find: function(selector) {
-            var i, ret, len = this.length, self2 = this;
-            if (typeof selector !== "string") {
-              return this.pushStack(jQuery(selector).filter(function() {
-                for (i = 0; i < len; i++) {
-                  if (jQuery.contains(self2[i], this)) {
-                    return true;
-                  }
-                }
-              }));
-            }
-            ret = this.pushStack([]);
-            for (i = 0; i < len; i++) {
-              jQuery.find(selector, self2[i], ret);
-            }
-            return len > 1 ? jQuery.uniqueSort(ret) : ret;
-          },
-          filter: function(selector) {
-            return this.pushStack(winnow(this, selector || [], false));
-          },
-          not: function(selector) {
-            return this.pushStack(winnow(this, selector || [], true));
-          },
-          is: function(selector) {
-            return !!winnow(
-              this,
-              // If this is a positional/relative selector, check membership in the returned set
-              // so $("p:first").is("p:last") won't return true for a doc with two "p".
-              typeof selector === "string" && rneedsContext.test(selector) ? jQuery(selector) : selector || [],
-              false
-            ).length;
-          }
-        });
-        var rootjQuery, rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, init = jQuery.fn.init = function(selector, context, root) {
-          var match, elem;
-          if (!selector) {
-            return this;
-          }
-          root = root || rootjQuery;
-          if (typeof selector === "string") {
-            if (selector[0] === "<" && selector[selector.length - 1] === ">" && selector.length >= 3) {
-              match = [null, selector, null];
-            } else {
-              match = rquickExpr.exec(selector);
-            }
-            if (match && (match[1] || !context)) {
-              if (match[1]) {
-                context = context instanceof jQuery ? context[0] : context;
-                jQuery.merge(this, jQuery.parseHTML(
-                  match[1],
-                  context && context.nodeType ? context.ownerDocument || context : document2,
-                  true
-                ));
-                if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
-                  for (match in context) {
-                    if (isFunction(this[match])) {
-                      this[match](context[match]);
-                    } else {
-                      this.attr(match, context[match]);
-                    }
-                  }
-                }
-                return this;
-              } else {
-                elem = document2.getElementById(match[2]);
-                if (elem) {
-                  this[0] = elem;
-                  this.length = 1;
-                }
-                return this;
-              }
-            } else if (!context || context.jquery) {
-              return (context || root).find(selector);
-            } else {
-              return this.constructor(context).find(selector);
-            }
-          } else if (selector.nodeType) {
-            this[0] = selector;
-            this.length = 1;
-            return this;
-          } else if (isFunction(selector)) {
-            return root.ready !== void 0 ? root.ready(selector) : (
-              // Execute immediately if ready is not present
-              selector(jQuery)
-            );
-          }
-          return jQuery.makeArray(selector, this);
-        };
-        init.prototype = jQuery.fn;
-        rootjQuery = jQuery(document2);
-        var rparentsprev = /^(?:parents|prev(?:Until|All))/, guaranteedUnique = {
-          children: true,
-          contents: true,
-          next: true,
-          prev: true
-        };
-        jQuery.fn.extend({
-          has: function(target) {
-            var targets = jQuery(target, this), l = targets.length;
-            return this.filter(function() {
-              var i = 0;
-              for (; i < l; i++) {
-                if (jQuery.contains(this, targets[i])) {
-                  return true;
-                }
-              }
-            });
-          },
-          closest: function(selectors, context) {
-            var cur, i = 0, l = this.length, matched = [], targets = typeof selectors !== "string" && jQuery(selectors);
-            if (!rneedsContext.test(selectors)) {
-              for (; i < l; i++) {
-                for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {
-                  if (cur.nodeType < 11 && (targets ? targets.index(cur) > -1 : (
-                    // Don't pass non-elements to jQuery#find
-                    cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors)
-                  ))) {
-                    matched.push(cur);
-                    break;
-                  }
-                }
-              }
-            }
-            return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched);
-          },
-          // Determine the position of an element within the set
-          index: function(elem) {
-            if (!elem) {
-              return this[0] && this[0].parentNode ? this.first().prevAll().length : -1;
-            }
-            if (typeof elem === "string") {
-              return indexOf.call(jQuery(elem), this[0]);
-            }
-            return indexOf.call(
-              this,
-              // If it receives a jQuery object, the first element is used
-              elem.jquery ? elem[0] : elem
-            );
-          },
-          add: function(selector, context) {
-            return this.pushStack(
-              jQuery.uniqueSort(
-                jQuery.merge(this.get(), jQuery(selector, context))
-              )
-            );
-          },
-          addBack: function(selector) {
-            return this.add(
-              selector == null ? this.prevObject : this.prevObject.filter(selector)
-            );
-          }
-        });
-        function sibling(cur, dir2) {
-          while ((cur = cur[dir2]) && cur.nodeType !== 1) {
-          }
-          return cur;
-        }
-        jQuery.each({
-          parent: function(elem) {
-            var parent = elem.parentNode;
-            return parent && parent.nodeType !== 11 ? parent : null;
-          },
-          parents: function(elem) {
-            return dir(elem, "parentNode");
-          },
-          parentsUntil: function(elem, _i, until) {
-            return dir(elem, "parentNode", until);
-          },
-          next: function(elem) {
-            return sibling(elem, "nextSibling");
-          },
-          prev: function(elem) {
-            return sibling(elem, "previousSibling");
-          },
-          nextAll: function(elem) {
-            return dir(elem, "nextSibling");
-          },
-          prevAll: function(elem) {
-            return dir(elem, "previousSibling");
-          },
-          nextUntil: function(elem, _i, until) {
-            return dir(elem, "nextSibling", until);
-          },
-          prevUntil: function(elem, _i, until) {
-            return dir(elem, "previousSibling", until);
-          },
-          siblings: function(elem) {
-            return siblings((elem.parentNode || {}).firstChild, elem);
-          },
-          children: function(elem) {
-            return siblings(elem.firstChild);
-          },
-          contents: function(elem) {
-            if (elem.contentDocument != null && // Support: IE 11+
-            // <object> elements with no `data` attribute has an object
-            // `contentDocument` with a `null` prototype.
-            getProto(elem.contentDocument)) {
-              return elem.contentDocument;
-            }
-            if (nodeName(elem, "template")) {
-              elem = elem.content || elem;
-            }
-            return jQuery.merge([], elem.childNodes);
-          }
-        }, function(name, fn2) {
-          jQuery.fn[name] = function(until, selector) {
-            var matched = jQuery.map(this, fn2, until);
-            if (name.slice(-5) !== "Until") {
-              selector = until;
-            }
-            if (selector && typeof selector === "string") {
-              matched = jQuery.filter(selector, matched);
-            }
-            if (this.length > 1) {
-              if (!guaranteedUnique[name]) {
-                jQuery.uniqueSort(matched);
-              }
-              if (rparentsprev.test(name)) {
-                matched.reverse();
-              }
-            }
-            return this.pushStack(matched);
-          };
-        });
-        var rnothtmlwhite = /[^\x20\t\r\n\f]+/g;
-        function createOptions(options) {
-          var object = {};
-          jQuery.each(options.match(rnothtmlwhite) || [], function(_, flag) {
-            object[flag] = true;
-          });
-          return object;
-        }
-        jQuery.Callbacks = function(options) {
-          options = typeof options === "string" ? createOptions(options) : jQuery.extend({}, options);
-          var firing, memory, fired, locked, list = [], queue = [], firingIndex = -1, fire = function() {
-            locked = locked || options.once;
-            fired = firing = true;
-            for (; queue.length; firingIndex = -1) {
-              memory = queue.shift();
-              while (++firingIndex < list.length) {
-                if (list[firingIndex].apply(memory[0], memory[1]) === false && options.stopOnFalse) {
-                  firingIndex = list.length;
-                  memory = false;
-                }
-              }
-            }
-            if (!options.memory) {
-              memory = false;
-            }
-            firing = false;
-            if (locked) {
-              if (memory) {
-                list = [];
-              } else {
-                list = "";
-              }
-            }
-          }, self2 = {
-            // Add a callback or a collection of callbacks to the list
-            add: function() {
-              if (list) {
-                if (memory && !firing) {
-                  firingIndex = list.length - 1;
-                  queue.push(memory);
-                }
-                (function add(args) {
-                  jQuery.each(args, function(_, arg) {
-                    if (isFunction(arg)) {
-                      if (!options.unique || !self2.has(arg)) {
-                        list.push(arg);
-                      }
-                    } else if (arg && arg.length && toType2(arg) !== "string") {
-                      add(arg);
-                    }
-                  });
-                })(arguments);
-                if (memory && !firing) {
-                  fire();
-                }
-              }
-              return this;
-            },
-            // Remove a callback from the list
-            remove: function() {
-              jQuery.each(arguments, function(_, arg) {
-                var index;
-                while ((index = jQuery.inArray(arg, list, index)) > -1) {
-                  list.splice(index, 1);
-                  if (index <= firingIndex) {
-                    firingIndex--;
-                  }
-                }
-              });
-              return this;
-            },
-            // Check if a given callback is in the list.
-            // If no argument is given, return whether or not list has callbacks attached.
-            has: function(fn2) {
-              return fn2 ? jQuery.inArray(fn2, list) > -1 : list.length > 0;
-            },
-            // Remove all callbacks from the list
-            empty: function() {
-              if (list) {
-                list = [];
-              }
-              return this;
-            },
-            // Disable .fire and .add
-            // Abort any current/pending executions
-            // Clear all callbacks and values
-            disable: function() {
-              locked = queue = [];
-              list = memory = "";
-              return this;
-            },
-            disabled: function() {
-              return !list;
-            },
-            // Disable .fire
-            // Also disable .add unless we have memory (since it would have no effect)
-            // Abort any pending executions
-            lock: function() {
-              locked = queue = [];
-              if (!memory && !firing) {
-                list = memory = "";
-              }
-              return this;
-            },
-            locked: function() {
-              return !!locked;
-            },
-            // Call all callbacks with the given context and arguments
-            fireWith: function(context, args) {
-              if (!locked) {
-                args = args || [];
-                args = [context, args.slice ? args.slice() : args];
-                queue.push(args);
-                if (!firing) {
-                  fire();
-                }
-              }
-              return this;
-            },
-            // Call all the callbacks with the given arguments
-            fire: function() {
-              self2.fireWith(this, arguments);
-              return this;
-            },
-            // To know if the callbacks have already been called at least once
-            fired: function() {
-              return !!fired;
-            }
-          };
-          return self2;
-        };
-        function Identity(v) {
-          return v;
-        }
-        function Thrower(ex) {
-          throw ex;
-        }
-        function adoptValue(value, resolve, reject, noValue) {
-          var method;
-          try {
-            if (value && isFunction(method = value.promise)) {
-              method.call(value).done(resolve).fail(reject);
-            } else if (value && isFunction(method = value.then)) {
-              method.call(value, resolve, reject);
-            } else {
-              resolve.apply(void 0, [value].slice(noValue));
-            }
-          } catch (value2) {
-            reject.apply(void 0, [value2]);
-          }
-        }
-        jQuery.extend({
-          Deferred: function(func) {
-            var tuples = [
-              // action, add listener, callbacks,
-              // ... .then handlers, argument index, [final state]
-              [
-                "notify",
-                "progress",
-                jQuery.Callbacks("memory"),
-                jQuery.Callbacks("memory"),
-                2
-              ],
-              [
-                "resolve",
-                "done",
-                jQuery.Callbacks("once memory"),
-                jQuery.Callbacks("once memory"),
-                0,
-                "resolved"
-              ],
-              [
-                "reject",
-                "fail",
-                jQuery.Callbacks("once memory"),
-                jQuery.Callbacks("once memory"),
-                1,
-                "rejected"
-              ]
-            ], state = "pending", promise = {
-              state: function() {
-                return state;
-              },
-              always: function() {
-                deferred.done(arguments).fail(arguments);
-                return this;
-              },
-              "catch": function(fn2) {
-                return promise.then(null, fn2);
-              },
-              // Keep pipe for back-compat
-              pipe: function() {
-                var fns = arguments;
-                return jQuery.Deferred(function(newDefer) {
-                  jQuery.each(tuples, function(_i, tuple) {
-                    var fn2 = isFunction(fns[tuple[4]]) && fns[tuple[4]];
-                    deferred[tuple[1]](function() {
-                      var returned = fn2 && fn2.apply(this, arguments);
-                      if (returned && isFunction(returned.promise)) {
-                        returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject);
-                      } else {
-                        newDefer[tuple[0] + "With"](
-                          this,
-                          fn2 ? [returned] : arguments
-                        );
-                      }
-                    });
-                  });
-                  fns = null;
-                }).promise();
-              },
-              then: function(onFulfilled, onRejected, onProgress) {
-                var maxDepth = 0;
-                function resolve(depth, deferred2, handler, special) {
-                  return function() {
-                    var that = this, args = arguments, mightThrow = function() {
-                      var returned, then;
-                      if (depth < maxDepth) {
-                        return;
-                      }
-                      returned = handler.apply(that, args);
-                      if (returned === deferred2.promise()) {
-                        throw new TypeError("Thenable self-resolution");
-                      }
-                      then = returned && // Support: Promises/A+ section 2.3.4
-                      // https://promisesaplus.com/#point-64
-                      // Only check objects and functions for thenability
-                      (typeof returned === "object" || typeof returned === "function") && returned.then;
-                      if (isFunction(then)) {
-                        if (special) {
-                          then.call(
-                            returned,
-                            resolve(maxDepth, deferred2, Identity, special),
-                            resolve(maxDepth, deferred2, Thrower, special)
-                          );
-                        } else {
-                          maxDepth++;
-                          then.call(
-                            returned,
-                            resolve(maxDepth, deferred2, Identity, special),
-                            resolve(maxDepth, deferred2, Thrower, special),
-                            resolve(
-                              maxDepth,
-                              deferred2,
-                              Identity,
-                              deferred2.notifyWith
-                            )
-                          );
-                        }
-                      } else {
-                        if (handler !== Identity) {
-                          that = void 0;
-                          args = [returned];
-                        }
-                        (special || deferred2.resolveWith)(that, args);
-                      }
-                    }, process = special ? mightThrow : function() {
-                      try {
-                        mightThrow();
-                      } catch (e) {
-                        if (jQuery.Deferred.exceptionHook) {
-                          jQuery.Deferred.exceptionHook(
-                            e,
-                            process.error
-                          );
-                        }
-                        if (depth + 1 >= maxDepth) {
-                          if (handler !== Thrower) {
-                            that = void 0;
-                            args = [e];
-                          }
-                          deferred2.rejectWith(that, args);
-                        }
-                      }
-                    };
-                    if (depth) {
-                      process();
-                    } else {
-                      if (jQuery.Deferred.getErrorHook) {
-                        process.error = jQuery.Deferred.getErrorHook();
-                      } else if (jQuery.Deferred.getStackHook) {
-                        process.error = jQuery.Deferred.getStackHook();
-                      }
-                      window2.setTimeout(process);
-                    }
-                  };
-                }
-                return jQuery.Deferred(function(newDefer) {
-                  tuples[0][3].add(
-                    resolve(
-                      0,
-                      newDefer,
-                      isFunction(onProgress) ? onProgress : Identity,
-                      newDefer.notifyWith
-                    )
-                  );
-                  tuples[1][3].add(
-                    resolve(
-                      0,
-                      newDefer,
-                      isFunction(onFulfilled) ? onFulfilled : Identity
-                    )
-                  );
-                  tuples[2][3].add(
-                    resolve(
-                      0,
-                      newDefer,
-                      isFunction(onRejected) ? onRejected : Thrower
-                    )
-                  );
-                }).promise();
-              },
-              // Get a promise for this deferred
-              // If obj is provided, the promise aspect is added to the object
-              promise: function(obj) {
-                return obj != null ? jQuery.extend(obj, promise) : promise;
-              }
-            }, deferred = {};
-            jQuery.each(tuples, function(i, tuple) {
-              var list = tuple[2], stateString = tuple[5];
-              promise[tuple[1]] = list.add;
-              if (stateString) {
-                list.add(
-                  function() {
-                    state = stateString;
-                  },
-                  // rejected_callbacks.disable
-                  // fulfilled_callbacks.disable
-                  tuples[3 - i][2].disable,
-                  // rejected_handlers.disable
-                  // fulfilled_handlers.disable
-                  tuples[3 - i][3].disable,
-                  // progress_callbacks.lock
-                  tuples[0][2].lock,
-                  // progress_handlers.lock
-                  tuples[0][3].lock
-                );
-              }
-              list.add(tuple[3].fire);
-              deferred[tuple[0]] = function() {
-                deferred[tuple[0] + "With"](this === deferred ? void 0 : this, arguments);
-                return this;
-              };
-              deferred[tuple[0] + "With"] = list.fireWith;
-            });
-            promise.promise(deferred);
-            if (func) {
-              func.call(deferred, deferred);
-            }
-            return deferred;
-          },
-          // Deferred helper
-          when: function(singleValue) {
-            var remaining = arguments.length, i = remaining, resolveContexts = Array(i), resolveValues = slice.call(arguments), primary = jQuery.Deferred(), updateFunc = function(i2) {
-              return function(value) {
-                resolveContexts[i2] = this;
-                resolveValues[i2] = arguments.length > 1 ? slice.call(arguments) : value;
-                if (!--remaining) {
-                  primary.resolveWith(resolveContexts, resolveValues);
-                }
-              };
-            };
-            if (remaining <= 1) {
-              adoptValue(
-                singleValue,
-                primary.done(updateFunc(i)).resolve,
-                primary.reject,
-                !remaining
-              );
-              if (primary.state() === "pending" || isFunction(resolveValues[i] && resolveValues[i].then)) {
-                return primary.then();
-              }
-            }
-            while (i--) {
-              adoptValue(resolveValues[i], updateFunc(i), primary.reject);
-            }
-            return primary.promise();
-          }
-        });
-        var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
-        jQuery.Deferred.exceptionHook = function(error, asyncError) {
-          if (window2.console && window2.console.warn && error && rerrorNames.test(error.name)) {
-            window2.console.warn(
-              "jQuery.Deferred exception: " + error.message,
-              error.stack,
-              asyncError
-            );
-          }
-        };
-        jQuery.readyException = function(error) {
-          window2.setTimeout(function() {
-            throw error;
-          });
-        };
-        var readyList = jQuery.Deferred();
-        jQuery.fn.ready = function(fn2) {
-          readyList.then(fn2).catch(function(error) {
-            jQuery.readyException(error);
-          });
-          return this;
-        };
-        jQuery.extend({
-          // Is the DOM ready to be used? Set to true once it occurs.
-          isReady: false,
-          // A counter to track how many items to wait for before
-          // the ready event fires. See trac-6781
-          readyWait: 1,
-          // Handle when the DOM is ready
-          ready: function(wait) {
-            if (wait === true ? --jQuery.readyWait : jQuery.isReady) {
-              return;
-            }
-            jQuery.isReady = true;
-            if (wait !== true && --jQuery.readyWait > 0) {
-              return;
-            }
-            readyList.resolveWith(document2, [jQuery]);
-          }
-        });
-        jQuery.ready.then = readyList.then;
-        function completed() {
-          document2.removeEventListener("DOMContentLoaded", completed);
-          window2.removeEventListener("load", completed);
-          jQuery.ready();
-        }
-        if (document2.readyState === "complete" || document2.readyState !== "loading" && !document2.documentElement.doScroll) {
-          window2.setTimeout(jQuery.ready);
-        } else {
-          document2.addEventListener("DOMContentLoaded", completed);
-          window2.addEventListener("load", completed);
-        }
-        var access = function(elems, fn2, key, value, chainable, emptyGet, raw) {
-          var i = 0, len = elems.length, bulk = key == null;
-          if (toType2(key) === "object") {
-            chainable = true;
-            for (i in key) {
-              access(elems, fn2, i, key[i], true, emptyGet, raw);
-            }
-          } else if (value !== void 0) {
-            chainable = true;
-            if (!isFunction(value)) {
-              raw = true;
-            }
-            if (bulk) {
-              if (raw) {
-                fn2.call(elems, value);
-                fn2 = null;
-              } else {
-                bulk = fn2;
-                fn2 = function(elem, _key, value2) {
-                  return bulk.call(jQuery(elem), value2);
-                };
-              }
-            }
-            if (fn2) {
-              for (; i < len; i++) {
-                fn2(
-                  elems[i],
-                  key,
-                  raw ? value : value.call(elems[i], i, fn2(elems[i], key))
-                );
-              }
-            }
-          }
-          if (chainable) {
-            return elems;
-          }
-          if (bulk) {
-            return fn2.call(elems);
-          }
-          return len ? fn2(elems[0], key) : emptyGet;
-        };
-        var rmsPrefix = /^-ms-/, rdashAlpha = /-([a-z])/g;
-        function fcamelCase(_all, letter) {
-          return letter.toUpperCase();
-        }
-        function camelCase(string) {
-          return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);
-        }
-        var acceptData = function(owner) {
-          return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType;
-        };
-        function Data2() {
-          this.expando = jQuery.expando + Data2.uid++;
-        }
-        Data2.uid = 1;
-        Data2.prototype = {
-          cache: function(owner) {
-            var value = owner[this.expando];
-            if (!value) {
-              value = {};
-              if (acceptData(owner)) {
-                if (owner.nodeType) {
-                  owner[this.expando] = value;
-                } else {
-                  Object.defineProperty(owner, this.expando, {
-                    value,
-                    configurable: true
-                  });
-                }
-              }
-            }
-            return value;
-          },
-          set: function(owner, data, value) {
-            var prop, cache = this.cache(owner);
-            if (typeof data === "string") {
-              cache[camelCase(data)] = value;
-            } else {
-              for (prop in data) {
-                cache[camelCase(prop)] = data[prop];
-              }
-            }
-            return cache;
-          },
-          get: function(owner, key) {
-            return key === void 0 ? this.cache(owner) : (
-              // Always use camelCase key (gh-2257)
-              owner[this.expando] && owner[this.expando][camelCase(key)]
-            );
-          },
-          access: function(owner, key, value) {
-            if (key === void 0 || key && typeof key === "string" && value === void 0) {
-              return this.get(owner, key);
-            }
-            this.set(owner, key, value);
-            return value !== void 0 ? value : key;
-          },
-          remove: function(owner, key) {
-            var i, cache = owner[this.expando];
-            if (cache === void 0) {
-              return;
-            }
-            if (key !== void 0) {
-              if (Array.isArray(key)) {
-                key = key.map(camelCase);
-              } else {
-                key = camelCase(key);
-                key = key in cache ? [key] : key.match(rnothtmlwhite) || [];
-              }
-              i = key.length;
-              while (i--) {
-                delete cache[key[i]];
-              }
-            }
-            if (key === void 0 || jQuery.isEmptyObject(cache)) {
-              if (owner.nodeType) {
-                owner[this.expando] = void 0;
-              } else {
-                delete owner[this.expando];
-              }
-            }
-          },
-          hasData: function(owner) {
-            var cache = owner[this.expando];
-            return cache !== void 0 && !jQuery.isEmptyObject(cache);
-          }
-        };
-        var dataPriv = new Data2();
-        var dataUser = new Data2();
-        var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /[A-Z]/g;
-        function getData(data) {
-          if (data === "true") {
-            return true;
-          }
-          if (data === "false") {
-            return false;
-          }
-          if (data === "null") {
-            return null;
-          }
-          if (data === +data + "") {
-            return +data;
-          }
-          if (rbrace.test(data)) {
-            return JSON.parse(data);
-          }
-          return data;
-        }
-        function dataAttr(elem, key, data) {
-          var name;
-          if (data === void 0 && elem.nodeType === 1) {
-            name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase();
-            data = elem.getAttribute(name);
-            if (typeof data === "string") {
-              try {
-                data = getData(data);
-              } catch (e) {
-              }
-              dataUser.set(elem, key, data);
-            } else {
-              data = void 0;
-            }
-          }
-          return data;
-        }
-        jQuery.extend({
-          hasData: function(elem) {
-            return dataUser.hasData(elem) || dataPriv.hasData(elem);
-          },
-          data: function(elem, name, data) {
-            return dataUser.access(elem, name, data);
-          },
-          removeData: function(elem, name) {
-            dataUser.remove(elem, name);
-          },
-          // TODO: Now that all calls to _data and _removeData have been replaced
-          // with direct calls to dataPriv methods, these can be deprecated.
-          _data: function(elem, name, data) {
-            return dataPriv.access(elem, name, data);
-          },
-          _removeData: function(elem, name) {
-            dataPriv.remove(elem, name);
-          }
-        });
-        jQuery.fn.extend({
-          data: function(key, value) {
-            var i, name, data, elem = this[0], attrs = elem && elem.attributes;
-            if (key === void 0) {
-              if (this.length) {
-                data = dataUser.get(elem);
-                if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) {
-                  i = attrs.length;
-                  while (i--) {
-                    if (attrs[i]) {
-                      name = attrs[i].name;
-                      if (name.indexOf("data-") === 0) {
-                        name = camelCase(name.slice(5));
-                        dataAttr(elem, name, data[name]);
-                      }
-                    }
-                  }
-                  dataPriv.set(elem, "hasDataAttrs", true);
-                }
-              }
-              return data;
-            }
-            if (typeof key === "object") {
-              return this.each(function() {
-                dataUser.set(this, key);
-              });
-            }
-            return access(this, function(value2) {
-              var data2;
-              if (elem && value2 === void 0) {
-                data2 = dataUser.get(elem, key);
-                if (data2 !== void 0) {
-                  return data2;
-                }
-                data2 = dataAttr(elem, key);
-                if (data2 !== void 0) {
-                  return data2;
-                }
-                return;
-              }
-              this.each(function() {
-                dataUser.set(this, key, value2);
-              });
-            }, null, value, arguments.length > 1, null, true);
-          },
-          removeData: function(key) {
-            return this.each(function() {
-              dataUser.remove(this, key);
-            });
-          }
-        });
-        jQuery.extend({
-          queue: function(elem, type, data) {
-            var queue;
-            if (elem) {
-              type = (type || "fx") + "queue";
-              queue = dataPriv.get(elem, type);
-              if (data) {
-                if (!queue || Array.isArray(data)) {
-                  queue = dataPriv.access(elem, type, jQuery.makeArray(data));
-                } else {
-                  queue.push(data);
-                }
-              }
-              return queue || [];
-            }
-          },
-          dequeue: function(elem, type) {
-            type = type || "fx";
-            var queue = jQuery.queue(elem, type), startLength = queue.length, fn2 = queue.shift(), hooks = jQuery._queueHooks(elem, type), next = function() {
-              jQuery.dequeue(elem, type);
-            };
-            if (fn2 === "inprogress") {
-              fn2 = queue.shift();
-              startLength--;
-            }
-            if (fn2) {
-              if (type === "fx") {
-                queue.unshift("inprogress");
-              }
-              delete hooks.stop;
-              fn2.call(elem, next, hooks);
-            }
-            if (!startLength && hooks) {
-              hooks.empty.fire();
-            }
-          },
-          // Not public - generate a queueHooks object, or return the current one
-          _queueHooks: function(elem, type) {
-            var key = type + "queueHooks";
-            return dataPriv.get(elem, key) || dataPriv.access(elem, key, {
-              empty: jQuery.Callbacks("once memory").add(function() {
-                dataPriv.remove(elem, [type + "queue", key]);
-              })
-            });
-          }
-        });
-        jQuery.fn.extend({
-          queue: function(type, data) {
-            var setter = 2;
-            if (typeof type !== "string") {
-              data = type;
-              type = "fx";
-              setter--;
-            }
-            if (arguments.length < setter) {
-              return jQuery.queue(this[0], type);
-            }
-            return data === void 0 ? this : this.each(function() {
-              var queue = jQuery.queue(this, type, data);
-              jQuery._queueHooks(this, type);
-              if (type === "fx" && queue[0] !== "inprogress") {
-                jQuery.dequeue(this, type);
-              }
-            });
-          },
-          dequeue: function(type) {
-            return this.each(function() {
-              jQuery.dequeue(this, type);
-            });
-          },
-          clearQueue: function(type) {
-            return this.queue(type || "fx", []);
-          },
-          // Get a promise resolved when queues of a certain type
-          // are emptied (fx is the type by default)
-          promise: function(type, obj) {
-            var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() {
-              if (!--count) {
-                defer.resolveWith(elements, [elements]);
-              }
-            };
-            if (typeof type !== "string") {
-              obj = type;
-              type = void 0;
-            }
-            type = type || "fx";
-            while (i--) {
-              tmp = dataPriv.get(elements[i], type + "queueHooks");
-              if (tmp && tmp.empty) {
-                count++;
-                tmp.empty.add(resolve);
-              }
-            }
-            resolve();
-            return defer.promise(obj);
-          }
-        });
-        var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source;
-        var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i");
-        var cssExpand = ["Top", "Right", "Bottom", "Left"];
-        var documentElement = document2.documentElement;
-        var isAttached = function(elem) {
-          return jQuery.contains(elem.ownerDocument, elem);
-        }, composed = { composed: true };
-        if (documentElement.getRootNode) {
-          isAttached = function(elem) {
-            return jQuery.contains(elem.ownerDocument, elem) || elem.getRootNode(composed) === elem.ownerDocument;
-          };
-        }
-        var isHiddenWithinTree = function(elem, el) {
-          elem = el || elem;
-          return elem.style.display === "none" || elem.style.display === "" && // Otherwise, check computed style
-          // Support: Firefox <=43 - 45
-          // Disconnected elements can have computed display: none, so first confirm that elem is
-          // in the document.
-          isAttached(elem) && jQuery.css(elem, "display") === "none";
-        };
-        function adjustCSS(elem, prop, valueParts, tween) {
-          var adjusted, scale, maxIterations = 20, currentValue = tween ? function() {
-            return tween.cur();
-          } : function() {
-            return jQuery.css(elem, prop, "");
-          }, initial = currentValue(), unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"), initialInUnit = elem.nodeType && (jQuery.cssNumber[prop] || unit !== "px" && +initial) && rcssNum.exec(jQuery.css(elem, prop));
-          if (initialInUnit && initialInUnit[3] !== unit) {
-            initial = initial / 2;
-            unit = unit || initialInUnit[3];
-            initialInUnit = +initial || 1;
-            while (maxIterations--) {
-              jQuery.style(elem, prop, initialInUnit + unit);
-              if ((1 - scale) * (1 - (scale = currentValue() / initial || 0.5)) <= 0) {
-                maxIterations = 0;
-              }
-              initialInUnit = initialInUnit / scale;
-            }
-            initialInUnit = initialInUnit * 2;
-            jQuery.style(elem, prop, initialInUnit + unit);
-            valueParts = valueParts || [];
-          }
-          if (valueParts) {
-            initialInUnit = +initialInUnit || +initial || 0;
-            adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2];
-            if (tween) {
-              tween.unit = unit;
-              tween.start = initialInUnit;
-              tween.end = adjusted;
-            }
-          }
-          return adjusted;
-        }
-        var defaultDisplayMap = {};
-        function getDefaultDisplay(elem) {
-          var temp, doc2 = elem.ownerDocument, nodeName2 = elem.nodeName, display = defaultDisplayMap[nodeName2];
-          if (display) {
-            return display;
-          }
-          temp = doc2.body.appendChild(doc2.createElement(nodeName2));
-          display = jQuery.css(temp, "display");
-          temp.parentNode.removeChild(temp);
-          if (display === "none") {
-            display = "block";
-          }
-          defaultDisplayMap[nodeName2] = display;
-          return display;
-        }
-        function showHide(elements, show) {
-          var display, elem, values = [], index = 0, length = elements.length;
-          for (; index < length; index++) {
-            elem = elements[index];
-            if (!elem.style) {
-              continue;
-            }
-            display = elem.style.display;
-            if (show) {
-              if (display === "none") {
-                values[index] = dataPriv.get(elem, "display") || null;
-                if (!values[index]) {
-                  elem.style.display = "";
-                }
-              }
-              if (elem.style.display === "" && isHiddenWithinTree(elem)) {
-                values[index] = getDefaultDisplay(elem);
-              }
-            } else {
-              if (display !== "none") {
-                values[index] = "none";
-                dataPriv.set(elem, "display", display);
-              }
-            }
-          }
-          for (index = 0; index < length; index++) {
-            if (values[index] != null) {
-              elements[index].style.display = values[index];
-            }
-          }
-          return elements;
-        }
-        jQuery.fn.extend({
-          show: function() {
-            return showHide(this, true);
-          },
-          hide: function() {
-            return showHide(this);
-          },
-          toggle: function(state) {
-            if (typeof state === "boolean") {
-              return state ? this.show() : this.hide();
-            }
-            return this.each(function() {
-              if (isHiddenWithinTree(this)) {
-                jQuery(this).show();
-              } else {
-                jQuery(this).hide();
-              }
-            });
-          }
-        });
-        var rcheckableType = /^(?:checkbox|radio)$/i;
-        var rtagName = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i;
-        var rscriptType = /^$|^module$|\/(?:java|ecma)script/i;
-        (function() {
-          var fragment = document2.createDocumentFragment(), div = fragment.appendChild(document2.createElement("div")), input = document2.createElement("input");
-          input.setAttribute("type", "radio");
-          input.setAttribute("checked", "checked");
-          input.setAttribute("name", "t");
-          div.appendChild(input);
-          support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked;
-          div.innerHTML = "<textarea>x</textarea>";
-          support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue;
-          div.innerHTML = "<option></option>";
-          support.option = !!div.lastChild;
-        })();
-        var wrapMap = {
-          // XHTML parsers do not magically insert elements in the
-          // same way that tag soup parsers do. So we cannot shorten
-          // this by omitting <tbody> or other required elements.
-          thead: [1, "<table>", "</table>"],
-          col: [2, "<table><colgroup>", "</colgroup></table>"],
-          tr: [2, "<table><tbody>", "</tbody></table>"],
-          td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
-          _default: [0, "", ""]
-        };
-        wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-        wrapMap.th = wrapMap.td;
-        if (!support.option) {
-          wrapMap.optgroup = wrapMap.option = [1, "<select multiple='multiple'>", "</select>"];
-        }
-        function getAll(context, tag) {
-          var ret;
-          if (typeof context.getElementsByTagName !== "undefined") {
-            ret = context.getElementsByTagName(tag || "*");
-          } else if (typeof context.querySelectorAll !== "undefined") {
-            ret = context.querySelectorAll(tag || "*");
-          } else {
-            ret = [];
-          }
-          if (tag === void 0 || tag && nodeName(context, tag)) {
-            return jQuery.merge([context], ret);
-          }
-          return ret;
-        }
-        function setGlobalEval(elems, refElements) {
-          var i = 0, l = elems.length;
-          for (; i < l; i++) {
-            dataPriv.set(
-              elems[i],
-              "globalEval",
-              !refElements || dataPriv.get(refElements[i], "globalEval")
-            );
-          }
-        }
-        var rhtml = /<|&#?\w+;/;
-        function buildFragment(elems, context, scripts, selection, ignored) {
-          var elem, tmp, tag, wrap, attached, j, fragment = context.createDocumentFragment(), nodes = [], i = 0, l = elems.length;
-          for (; i < l; i++) {
-            elem = elems[i];
-            if (elem || elem === 0) {
-              if (toType2(elem) === "object") {
-                jQuery.merge(nodes, elem.nodeType ? [elem] : elem);
-              } else if (!rhtml.test(elem)) {
-                nodes.push(context.createTextNode(elem));
-              } else {
-                tmp = tmp || fragment.appendChild(context.createElement("div"));
-                tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase();
-                wrap = wrapMap[tag] || wrapMap._default;
-                tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2];
-                j = wrap[0];
-                while (j--) {
-                  tmp = tmp.lastChild;
-                }
-                jQuery.merge(nodes, tmp.childNodes);
-                tmp = fragment.firstChild;
-                tmp.textContent = "";
-              }
-            }
-          }
-          fragment.textContent = "";
-          i = 0;
-          while (elem = nodes[i++]) {
-            if (selection && jQuery.inArray(elem, selection) > -1) {
-              if (ignored) {
-                ignored.push(elem);
-              }
-              continue;
-            }
-            attached = isAttached(elem);
-            tmp = getAll(fragment.appendChild(elem), "script");
-            if (attached) {
-              setGlobalEval(tmp);
-            }
-            if (scripts) {
-              j = 0;
-              while (elem = tmp[j++]) {
-                if (rscriptType.test(elem.type || "")) {
-                  scripts.push(elem);
-                }
-              }
-            }
-          }
-          return fragment;
-        }
-        var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
-        function returnTrue() {
-          return true;
-        }
-        function returnFalse() {
-          return false;
-        }
-        function on(elem, types, selector, data, fn2, one) {
-          var origFn, type;
-          if (typeof types === "object") {
-            if (typeof selector !== "string") {
-              data = data || selector;
-              selector = void 0;
-            }
-            for (type in types) {
-              on(elem, type, selector, data, types[type], one);
-            }
-            return elem;
-          }
-          if (data == null && fn2 == null) {
-            fn2 = selector;
-            data = selector = void 0;
-          } else if (fn2 == null) {
-            if (typeof selector === "string") {
-              fn2 = data;
-              data = void 0;
-            } else {
-              fn2 = data;
-              data = selector;
-              selector = void 0;
-            }
-          }
-          if (fn2 === false) {
-            fn2 = returnFalse;
-          } else if (!fn2) {
-            return elem;
-          }
-          if (one === 1) {
-            origFn = fn2;
-            fn2 = function(event) {
-              jQuery().off(event);
-              return origFn.apply(this, arguments);
-            };
-            fn2.guid = origFn.guid || (origFn.guid = jQuery.guid++);
-          }
-          return elem.each(function() {
-            jQuery.event.add(this, types, fn2, data, selector);
-          });
-        }
-        jQuery.event = {
-          global: {},
-          add: function(elem, types, handler, data, selector) {
-            var handleObjIn, eventHandle, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.get(elem);
-            if (!acceptData(elem)) {
-              return;
-            }
-            if (handler.handler) {
-              handleObjIn = handler;
-              handler = handleObjIn.handler;
-              selector = handleObjIn.selector;
-            }
-            if (selector) {
-              jQuery.find.matchesSelector(documentElement, selector);
-            }
-            if (!handler.guid) {
-              handler.guid = jQuery.guid++;
-            }
-            if (!(events = elemData.events)) {
-              events = elemData.events = /* @__PURE__ */ Object.create(null);
-            }
-            if (!(eventHandle = elemData.handle)) {
-              eventHandle = elemData.handle = function(e) {
-                return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply(elem, arguments) : void 0;
-              };
-            }
-            types = (types || "").match(rnothtmlwhite) || [""];
-            t = types.length;
-            while (t--) {
-              tmp = rtypenamespace.exec(types[t]) || [];
-              type = origType = tmp[1];
-              namespaces = (tmp[2] || "").split(".").sort();
-              if (!type) {
-                continue;
-              }
-              special = jQuery.event.special[type] || {};
-              type = (selector ? special.delegateType : special.bindType) || type;
-              special = jQuery.event.special[type] || {};
-              handleObj = jQuery.extend({
-                type,
-                origType,
-                data,
-                handler,
-                guid: handler.guid,
-                selector,
-                needsContext: selector && jQuery.expr.match.needsContext.test(selector),
-                namespace: namespaces.join(".")
-              }, handleObjIn);
-              if (!(handlers = events[type])) {
-                handlers = events[type] = [];
-                handlers.delegateCount = 0;
-                if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {
-                  if (elem.addEventListener) {
-                    elem.addEventListener(type, eventHandle);
-                  }
-                }
-              }
-              if (special.add) {
-                special.add.call(elem, handleObj);
-                if (!handleObj.handler.guid) {
-                  handleObj.handler.guid = handler.guid;
-                }
-              }
-              if (selector) {
-                handlers.splice(handlers.delegateCount++, 0, handleObj);
-              } else {
-                handlers.push(handleObj);
-              }
-              jQuery.event.global[type] = true;
-            }
-          },
-          // Detach an event or set of events from an element
-          remove: function(elem, types, handler, selector, mappedTypes) {
-            var j, origCount, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.hasData(elem) && dataPriv.get(elem);
-            if (!elemData || !(events = elemData.events)) {
-              return;
-            }
-            types = (types || "").match(rnothtmlwhite) || [""];
-            t = types.length;
-            while (t--) {
-              tmp = rtypenamespace.exec(types[t]) || [];
-              type = origType = tmp[1];
-              namespaces = (tmp[2] || "").split(".").sort();
-              if (!type) {
-                for (type in events) {
-                  jQuery.event.remove(elem, type + types[t], handler, selector, true);
-                }
-                continue;
-              }
-              special = jQuery.event.special[type] || {};
-              type = (selector ? special.delegateType : special.bindType) || type;
-              handlers = events[type] || [];
-              tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)");
-              origCount = j = handlers.length;
-              while (j--) {
-                handleObj = handlers[j];
-                if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) {
-                  handlers.splice(j, 1);
-                  if (handleObj.selector) {
-                    handlers.delegateCount--;
-                  }
-                  if (special.remove) {
-                    special.remove.call(elem, handleObj);
-                  }
-                }
-              }
-              if (origCount && !handlers.length) {
-                if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {
-                  jQuery.removeEvent(elem, type, elemData.handle);
-                }
-                delete events[type];
-              }
-            }
-            if (jQuery.isEmptyObject(events)) {
-              dataPriv.remove(elem, "handle events");
-            }
-          },
-          dispatch: function(nativeEvent) {
-            var i, j, ret, matched, handleObj, handlerQueue, args = new Array(arguments.length), event = jQuery.event.fix(nativeEvent), handlers = (dataPriv.get(this, "events") || /* @__PURE__ */ Object.create(null))[event.type] || [], special = jQuery.event.special[event.type] || {};
-            args[0] = event;
-            for (i = 1; i < arguments.length; i++) {
-              args[i] = arguments[i];
-            }
-            event.delegateTarget = this;
-            if (special.preDispatch && special.preDispatch.call(this, event) === false) {
-              return;
-            }
-            handlerQueue = jQuery.event.handlers.call(this, event, handlers);
-            i = 0;
-            while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {
-              event.currentTarget = matched.elem;
-              j = 0;
-              while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) {
-                if (!event.rnamespace || handleObj.namespace === false || event.rnamespace.test(handleObj.namespace)) {
-                  event.handleObj = handleObj;
-                  event.data = handleObj.data;
-                  ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args);
-                  if (ret !== void 0) {
-                    if ((event.result = ret) === false) {
-                      event.preventDefault();
-                      event.stopPropagation();
-                    }
-                  }
-                }
-              }
-            }
-            if (special.postDispatch) {
-              special.postDispatch.call(this, event);
-            }
-            return event.result;
-          },
-          handlers: function(event, handlers) {
-            var i, handleObj, sel, matchedHandlers, matchedSelectors, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target;
-            if (delegateCount && // Support: IE <=9
-            // Black-hole SVG <use> instance trees (trac-13180)
-            cur.nodeType && // Support: Firefox <=42
-            // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
-            // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
-            // Support: IE 11 only
-            // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
-            !(event.type === "click" && event.button >= 1)) {
-              for (; cur !== this; cur = cur.parentNode || this) {
-                if (cur.nodeType === 1 && !(event.type === "click" && cur.disabled === true)) {
-                  matchedHandlers = [];
-                  matchedSelectors = {};
-                  for (i = 0; i < delegateCount; i++) {
-                    handleObj = handlers[i];
-                    sel = handleObj.selector + " ";
-                    if (matchedSelectors[sel] === void 0) {
-                      matchedSelectors[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) > -1 : jQuery.find(sel, this, null, [cur]).length;
-                    }
-                    if (matchedSelectors[sel]) {
-                      matchedHandlers.push(handleObj);
-                    }
-                  }
-                  if (matchedHandlers.length) {
-                    handlerQueue.push({ elem: cur, handlers: matchedHandlers });
-                  }
-                }
-              }
-            }
-            cur = this;
-            if (delegateCount < handlers.length) {
-              handlerQueue.push({ elem: cur, handlers: handlers.slice(delegateCount) });
-            }
-            return handlerQueue;
-          },
-          addProp: function(name, hook) {
-            Object.defineProperty(jQuery.Event.prototype, name, {
-              enumerable: true,
-              configurable: true,
-              get: isFunction(hook) ? function() {
-                if (this.originalEvent) {
-                  return hook(this.originalEvent);
-                }
-              } : function() {
-                if (this.originalEvent) {
-                  return this.originalEvent[name];
-                }
-              },
-              set: function(value) {
-                Object.defineProperty(this, name, {
-                  enumerable: true,
-                  configurable: true,
-                  writable: true,
-                  value
-                });
-              }
-            });
-          },
-          fix: function(originalEvent) {
-            return originalEvent[jQuery.expando] ? originalEvent : new jQuery.Event(originalEvent);
-          },
-          special: {
-            load: {
-              // Prevent triggered image.load events from bubbling to window.load
-              noBubble: true
-            },
-            click: {
-              // Utilize native event to ensure correct state for checkable inputs
-              setup: function(data) {
-                var el = this || data;
-                if (rcheckableType.test(el.type) && el.click && nodeName(el, "input")) {
-                  leverageNative(el, "click", true);
-                }
-                return false;
-              },
-              trigger: function(data) {
-                var el = this || data;
-                if (rcheckableType.test(el.type) && el.click && nodeName(el, "input")) {
-                  leverageNative(el, "click");
-                }
-                return true;
-              },
-              // For cross-browser consistency, suppress native .click() on links
-              // Also prevent it if we're currently inside a leveraged native-event stack
-              _default: function(event) {
-                var target = event.target;
-                return rcheckableType.test(target.type) && target.click && nodeName(target, "input") && dataPriv.get(target, "click") || nodeName(target, "a");
-              }
-            },
-            beforeunload: {
-              postDispatch: function(event) {
-                if (event.result !== void 0 && event.originalEvent) {
-                  event.originalEvent.returnValue = event.result;
-                }
-              }
-            }
-          }
-        };
-        function leverageNative(el, type, isSetup) {
-          if (!isSetup) {
-            if (dataPriv.get(el, type) === void 0) {
-              jQuery.event.add(el, type, returnTrue);
-            }
-            return;
-          }
-          dataPriv.set(el, type, false);
-          jQuery.event.add(el, type, {
-            namespace: false,
-            handler: function(event) {
-              var result, saved = dataPriv.get(this, type);
-              if (event.isTrigger & 1 && this[type]) {
-                if (!saved) {
-                  saved = slice.call(arguments);
-                  dataPriv.set(this, type, saved);
-                  this[type]();
-                  result = dataPriv.get(this, type);
-                  dataPriv.set(this, type, false);
-                  if (saved !== result) {
-                    event.stopImmediatePropagation();
-                    event.preventDefault();
-                    return result;
-                  }
-                } else if ((jQuery.event.special[type] || {}).delegateType) {
-                  event.stopPropagation();
-                }
-              } else if (saved) {
-                dataPriv.set(this, type, jQuery.event.trigger(
-                  saved[0],
-                  saved.slice(1),
-                  this
-                ));
-                event.stopPropagation();
-                event.isImmediatePropagationStopped = returnTrue;
-              }
-            }
-          });
-        }
-        jQuery.removeEvent = function(elem, type, handle) {
-          if (elem.removeEventListener) {
-            elem.removeEventListener(type, handle);
-          }
-        };
-        jQuery.Event = function(src, props) {
-          if (!(this instanceof jQuery.Event)) {
-            return new jQuery.Event(src, props);
-          }
-          if (src && src.type) {
-            this.originalEvent = src;
-            this.type = src.type;
-            this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === void 0 && // Support: Android <=2.3 only
-            src.returnValue === false ? returnTrue : returnFalse;
-            this.target = src.target && src.target.nodeType === 3 ? src.target.parentNode : src.target;
-            this.currentTarget = src.currentTarget;
-            this.relatedTarget = src.relatedTarget;
-          } else {
-            this.type = src;
-          }
-          if (props) {
-            jQuery.extend(this, props);
-          }
-          this.timeStamp = src && src.timeStamp || Date.now();
-          this[jQuery.expando] = true;
-        };
-        jQuery.Event.prototype = {
-          constructor: jQuery.Event,
-          isDefaultPrevented: returnFalse,
-          isPropagationStopped: returnFalse,
-          isImmediatePropagationStopped: returnFalse,
-          isSimulated: false,
-          preventDefault: function() {
-            var e = this.originalEvent;
-            this.isDefaultPrevented = returnTrue;
-            if (e && !this.isSimulated) {
-              e.preventDefault();
-            }
-          },
-          stopPropagation: function() {
-            var e = this.originalEvent;
-            this.isPropagationStopped = returnTrue;
-            if (e && !this.isSimulated) {
-              e.stopPropagation();
-            }
-          },
-          stopImmediatePropagation: function() {
-            var e = this.originalEvent;
-            this.isImmediatePropagationStopped = returnTrue;
-            if (e && !this.isSimulated) {
-              e.stopImmediatePropagation();
-            }
-            this.stopPropagation();
-          }
-        };
-        jQuery.each({
-          altKey: true,
-          bubbles: true,
-          cancelable: true,
-          changedTouches: true,
-          ctrlKey: true,
-          detail: true,
-          eventPhase: true,
-          metaKey: true,
-          pageX: true,
-          pageY: true,
-          shiftKey: true,
-          view: true,
-          "char": true,
-          code: true,
-          charCode: true,
-          key: true,
-          keyCode: true,
-          button: true,
-          buttons: true,
-          clientX: true,
-          clientY: true,
-          offsetX: true,
-          offsetY: true,
-          pointerId: true,
-          pointerType: true,
-          screenX: true,
-          screenY: true,
-          targetTouches: true,
-          toElement: true,
-          touches: true,
-          which: true
-        }, jQuery.event.addProp);
-        jQuery.each({ focus: "focusin", blur: "focusout" }, function(type, delegateType) {
-          function focusMappedHandler(nativeEvent) {
-            if (document2.documentMode) {
-              var handle = dataPriv.get(this, "handle"), event = jQuery.event.fix(nativeEvent);
-              event.type = nativeEvent.type === "focusin" ? "focus" : "blur";
-              event.isSimulated = true;
-              handle(nativeEvent);
-              if (event.target === event.currentTarget) {
-                handle(event);
-              }
-            } else {
-              jQuery.event.simulate(
-                delegateType,
-                nativeEvent.target,
-                jQuery.event.fix(nativeEvent)
-              );
-            }
-          }
-          jQuery.event.special[type] = {
-            // Utilize native event if possible so blur/focus sequence is correct
-            setup: function() {
-              var attaches;
-              leverageNative(this, type, true);
-              if (document2.documentMode) {
-                attaches = dataPriv.get(this, delegateType);
-                if (!attaches) {
-                  this.addEventListener(delegateType, focusMappedHandler);
-                }
-                dataPriv.set(this, delegateType, (attaches || 0) + 1);
-              } else {
-                return false;
-              }
-            },
-            trigger: function() {
-              leverageNative(this, type);
-              return true;
-            },
-            teardown: function() {
-              var attaches;
-              if (document2.documentMode) {
-                attaches = dataPriv.get(this, delegateType) - 1;
-                if (!attaches) {
-                  this.removeEventListener(delegateType, focusMappedHandler);
-                  dataPriv.remove(this, delegateType);
-                } else {
-                  dataPriv.set(this, delegateType, attaches);
-                }
-              } else {
-                return false;
-              }
-            },
-            // Suppress native focus or blur if we're currently inside
-            // a leveraged native-event stack
-            _default: function(event) {
-              return dataPriv.get(event.target, type);
-            },
-            delegateType
-          };
-          jQuery.event.special[delegateType] = {
-            setup: function() {
-              var doc2 = this.ownerDocument || this.document || this, dataHolder = document2.documentMode ? this : doc2, attaches = dataPriv.get(dataHolder, delegateType);
-              if (!attaches) {
-                if (document2.documentMode) {
-                  this.addEventListener(delegateType, focusMappedHandler);
-                } else {
-                  doc2.addEventListener(type, focusMappedHandler, true);
-                }
-              }
-              dataPriv.set(dataHolder, delegateType, (attaches || 0) + 1);
-            },
-            teardown: function() {
-              var doc2 = this.ownerDocument || this.document || this, dataHolder = document2.documentMode ? this : doc2, attaches = dataPriv.get(dataHolder, delegateType) - 1;
-              if (!attaches) {
-                if (document2.documentMode) {
-                  this.removeEventListener(delegateType, focusMappedHandler);
-                } else {
-                  doc2.removeEventListener(type, focusMappedHandler, true);
-                }
-                dataPriv.remove(dataHolder, delegateType);
-              } else {
-                dataPriv.set(dataHolder, delegateType, attaches);
-              }
-            }
-          };
-        });
-        jQuery.each({
-          mouseenter: "mouseover",
-          mouseleave: "mouseout",
-          pointerenter: "pointerover",
-          pointerleave: "pointerout"
-        }, function(orig, fix) {
-          jQuery.event.special[orig] = {
-            delegateType: fix,
-            bindType: fix,
-            handle: function(event) {
-              var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj;
-              if (!related || related !== target && !jQuery.contains(target, related)) {
-                event.type = handleObj.origType;
-                ret = handleObj.handler.apply(this, arguments);
-                event.type = fix;
-              }
-              return ret;
-            }
-          };
-        });
-        jQuery.fn.extend({
-          on: function(types, selector, data, fn2) {
-            return on(this, types, selector, data, fn2);
-          },
-          one: function(types, selector, data, fn2) {
-            return on(this, types, selector, data, fn2, 1);
-          },
-          off: function(types, selector, fn2) {
-            var handleObj, type;
-            if (types && types.preventDefault && types.handleObj) {
-              handleObj = types.handleObj;
-              jQuery(types.delegateTarget).off(
-                handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
-                handleObj.selector,
-                handleObj.handler
-              );
-              return this;
-            }
-            if (typeof types === "object") {
-              for (type in types) {
-                this.off(type, selector, types[type]);
-              }
-              return this;
-            }
-            if (selector === false || typeof selector === "function") {
-              fn2 = selector;
-              selector = void 0;
-            }
-            if (fn2 === false) {
-              fn2 = returnFalse;
-            }
-            return this.each(function() {
-              jQuery.event.remove(this, types, fn2, selector);
-            });
-          }
-        });
-        var rnoInnerhtml = /<script|<style|<link/i, rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g;
-        function manipulationTarget(elem, content) {
-          if (nodeName(elem, "table") && nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr")) {
-            return jQuery(elem).children("tbody")[0] || elem;
-          }
-          return elem;
-        }
-        function disableScript(elem) {
-          elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
-          return elem;
-        }
-        function restoreScript(elem) {
-          if ((elem.type || "").slice(0, 5) === "true/") {
-            elem.type = elem.type.slice(5);
-          } else {
-            elem.removeAttribute("type");
-          }
-          return elem;
-        }
-        function cloneCopyEvent(src, dest) {
-          var i, l, type, pdataOld, udataOld, udataCur, events;
-          if (dest.nodeType !== 1) {
-            return;
-          }
-          if (dataPriv.hasData(src)) {
-            pdataOld = dataPriv.get(src);
-            events = pdataOld.events;
-            if (events) {
-              dataPriv.remove(dest, "handle events");
-              for (type in events) {
-                for (i = 0, l = events[type].length; i < l; i++) {
-                  jQuery.event.add(dest, type, events[type][i]);
-                }
-              }
-            }
-          }
-          if (dataUser.hasData(src)) {
-            udataOld = dataUser.access(src);
-            udataCur = jQuery.extend({}, udataOld);
-            dataUser.set(dest, udataCur);
-          }
-        }
-        function fixInput(src, dest) {
-          var nodeName2 = dest.nodeName.toLowerCase();
-          if (nodeName2 === "input" && rcheckableType.test(src.type)) {
-            dest.checked = src.checked;
-          } else if (nodeName2 === "input" || nodeName2 === "textarea") {
-            dest.defaultValue = src.defaultValue;
-          }
-        }
-        function domManip(collection, args, callback, ignored) {
-          args = flat(args);
-          var fragment, first, scripts, hasScripts, node, doc2, i = 0, l = collection.length, iNoClone = l - 1, value = args[0], valueIsFunction = isFunction(value);
-          if (valueIsFunction || l > 1 && typeof value === "string" && !support.checkClone && rchecked.test(value)) {
-            return collection.each(function(index) {
-              var self2 = collection.eq(index);
-              if (valueIsFunction) {
-                args[0] = value.call(this, index, self2.html());
-              }
-              domManip(self2, args, callback, ignored);
-            });
-          }
-          if (l) {
-            fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored);
-            first = fragment.firstChild;
-            if (fragment.childNodes.length === 1) {
-              fragment = first;
-            }
-            if (first || ignored) {
-              scripts = jQuery.map(getAll(fragment, "script"), disableScript);
-              hasScripts = scripts.length;
-              for (; i < l; i++) {
-                node = fragment;
-                if (i !== iNoClone) {
-                  node = jQuery.clone(node, true, true);
-                  if (hasScripts) {
-                    jQuery.merge(scripts, getAll(node, "script"));
-                  }
-                }
-                callback.call(collection[i], node, i);
-              }
-              if (hasScripts) {
-                doc2 = scripts[scripts.length - 1].ownerDocument;
-                jQuery.map(scripts, restoreScript);
-                for (i = 0; i < hasScripts; i++) {
-                  node = scripts[i];
-                  if (rscriptType.test(node.type || "") && !dataPriv.access(node, "globalEval") && jQuery.contains(doc2, node)) {
-                    if (node.src && (node.type || "").toLowerCase() !== "module") {
-                      if (jQuery._evalUrl && !node.noModule) {
-                        jQuery._evalUrl(node.src, {
-                          nonce: node.nonce || node.getAttribute("nonce")
-                        }, doc2);
-                      }
-                    } else {
-                      DOMEval(node.textContent.replace(rcleanScript, ""), node, doc2);
-                    }
-                  }
-                }
-              }
-            }
-          }
-          return collection;
-        }
-        function remove(elem, selector, keepData) {
-          var node, nodes = selector ? jQuery.filter(selector, elem) : elem, i = 0;
-          for (; (node = nodes[i]) != null; i++) {
-            if (!keepData && node.nodeType === 1) {
-              jQuery.cleanData(getAll(node));
-            }
-            if (node.parentNode) {
-              if (keepData && isAttached(node)) {
-                setGlobalEval(getAll(node, "script"));
-              }
-              node.parentNode.removeChild(node);
-            }
-          }
-          return elem;
-        }
-        jQuery.extend({
-          htmlPrefilter: function(html) {
-            return html;
-          },
-          clone: function(elem, dataAndEvents, deepDataAndEvents) {
-            var i, l, srcElements, destElements, clone2 = elem.cloneNode(true), inPage = isAttached(elem);
-            if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) {
-              destElements = getAll(clone2);
-              srcElements = getAll(elem);
-              for (i = 0, l = srcElements.length; i < l; i++) {
-                fixInput(srcElements[i], destElements[i]);
-              }
-            }
-            if (dataAndEvents) {
-              if (deepDataAndEvents) {
-                srcElements = srcElements || getAll(elem);
-                destElements = destElements || getAll(clone2);
-                for (i = 0, l = srcElements.length; i < l; i++) {
-                  cloneCopyEvent(srcElements[i], destElements[i]);
-                }
-              } else {
-                cloneCopyEvent(elem, clone2);
-              }
-            }
-            destElements = getAll(clone2, "script");
-            if (destElements.length > 0) {
-              setGlobalEval(destElements, !inPage && getAll(elem, "script"));
-            }
-            return clone2;
-          },
-          cleanData: function(elems) {
-            var data, elem, type, special = jQuery.event.special, i = 0;
-            for (; (elem = elems[i]) !== void 0; i++) {
-              if (acceptData(elem)) {
-                if (data = elem[dataPriv.expando]) {
-                  if (data.events) {
-                    for (type in data.events) {
-                      if (special[type]) {
-                        jQuery.event.remove(elem, type);
-                      } else {
-                        jQuery.removeEvent(elem, type, data.handle);
-                      }
-                    }
-                  }
-                  elem[dataPriv.expando] = void 0;
-                }
-                if (elem[dataUser.expando]) {
-                  elem[dataUser.expando] = void 0;
-                }
-              }
-            }
-          }
-        });
-        jQuery.fn.extend({
-          detach: function(selector) {
-            return remove(this, selector, true);
-          },
-          remove: function(selector) {
-            return remove(this, selector);
-          },
-          text: function(value) {
-            return access(this, function(value2) {
-              return value2 === void 0 ? jQuery.text(this) : this.empty().each(function() {
-                if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
-                  this.textContent = value2;
-                }
-              });
-            }, null, value, arguments.length);
-          },
-          append: function() {
-            return domManip(this, arguments, function(elem) {
-              if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
-                var target = manipulationTarget(this, elem);
-                target.appendChild(elem);
-              }
-            });
-          },
-          prepend: function() {
-            return domManip(this, arguments, function(elem) {
-              if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
-                var target = manipulationTarget(this, elem);
-                target.insertBefore(elem, target.firstChild);
-              }
-            });
-          },
-          before: function() {
-            return domManip(this, arguments, function(elem) {
-              if (this.parentNode) {
-                this.parentNode.insertBefore(elem, this);
-              }
-            });
-          },
-          after: function() {
-            return domManip(this, arguments, function(elem) {
-              if (this.parentNode) {
-                this.parentNode.insertBefore(elem, this.nextSibling);
-              }
-            });
-          },
-          empty: function() {
-            var elem, i = 0;
-            for (; (elem = this[i]) != null; i++) {
-              if (elem.nodeType === 1) {
-                jQuery.cleanData(getAll(elem, false));
-                elem.textContent = "";
-              }
-            }
-            return this;
-          },
-          clone: function(dataAndEvents, deepDataAndEvents) {
-            dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-            deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-            return this.map(function() {
-              return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
-            });
-          },
-          html: function(value) {
-            return access(this, function(value2) {
-              var elem = this[0] || {}, i = 0, l = this.length;
-              if (value2 === void 0 && elem.nodeType === 1) {
-                return elem.innerHTML;
-              }
-              if (typeof value2 === "string" && !rnoInnerhtml.test(value2) && !wrapMap[(rtagName.exec(value2) || ["", ""])[1].toLowerCase()]) {
-                value2 = jQuery.htmlPrefilter(value2);
-                try {
-                  for (; i < l; i++) {
-                    elem = this[i] || {};
-                    if (elem.nodeType === 1) {
-                      jQuery.cleanData(getAll(elem, false));
-                      elem.innerHTML = value2;
-                    }
-                  }
-                  elem = 0;
-                } catch (e) {
-                }
-              }
-              if (elem) {
-                this.empty().append(value2);
-              }
-            }, null, value, arguments.length);
-          },
-          replaceWith: function() {
-            var ignored = [];
-            return domManip(this, arguments, function(elem) {
-              var parent = this.parentNode;
-              if (jQuery.inArray(this, ignored) < 0) {
-                jQuery.cleanData(getAll(this));
-                if (parent) {
-                  parent.replaceChild(elem, this);
-                }
-              }
-            }, ignored);
-          }
-        });
-        jQuery.each({
-          appendTo: "append",
-          prependTo: "prepend",
-          insertBefore: "before",
-          insertAfter: "after",
-          replaceAll: "replaceWith"
-        }, function(name, original) {
-          jQuery.fn[name] = function(selector) {
-            var elems, ret = [], insert = jQuery(selector), last = insert.length - 1, i = 0;
-            for (; i <= last; i++) {
-              elems = i === last ? this : this.clone(true);
-              jQuery(insert[i])[original](elems);
-              push.apply(ret, elems.get());
-            }
-            return this.pushStack(ret);
-          };
-        });
-        var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i");
-        var rcustomProp = /^--/;
-        var getStyles = function(elem) {
-          var view = elem.ownerDocument.defaultView;
-          if (!view || !view.opener) {
-            view = window2;
-          }
-          return view.getComputedStyle(elem);
-        };
-        var swap = function(elem, options, callback) {
-          var ret, name, old = {};
-          for (name in options) {
-            old[name] = elem.style[name];
-            elem.style[name] = options[name];
-          }
-          ret = callback.call(elem);
-          for (name in options) {
-            elem.style[name] = old[name];
-          }
-          return ret;
-        };
-        var rboxStyle = new RegExp(cssExpand.join("|"), "i");
-        (function() {
-          function computeStyleTests() {
-            if (!div) {
-              return;
-            }
-            container.style.cssText = "position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0";
-            div.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%";
-            documentElement.appendChild(container).appendChild(div);
-            var divStyle = window2.getComputedStyle(div);
-            pixelPositionVal = divStyle.top !== "1%";
-            reliableMarginLeftVal = roundPixelMeasures(divStyle.marginLeft) === 12;
-            div.style.right = "60%";
-            pixelBoxStylesVal = roundPixelMeasures(divStyle.right) === 36;
-            boxSizingReliableVal = roundPixelMeasures(divStyle.width) === 36;
-            div.style.position = "absolute";
-            scrollboxSizeVal = roundPixelMeasures(div.offsetWidth / 3) === 12;
-            documentElement.removeChild(container);
-            div = null;
-          }
-          function roundPixelMeasures(measure) {
-            return Math.round(parseFloat(measure));
-          }
-          var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, reliableTrDimensionsVal, reliableMarginLeftVal, container = document2.createElement("div"), div = document2.createElement("div");
-          if (!div.style) {
-            return;
-          }
-          div.style.backgroundClip = "content-box";
-          div.cloneNode(true).style.backgroundClip = "";
-          support.clearCloneStyle = div.style.backgroundClip === "content-box";
-          jQuery.extend(support, {
-            boxSizingReliable: function() {
-              computeStyleTests();
-              return boxSizingReliableVal;
-            },
-            pixelBoxStyles: function() {
-              computeStyleTests();
-              return pixelBoxStylesVal;
-            },
-            pixelPosition: function() {
-              computeStyleTests();
-              return pixelPositionVal;
-            },
-            reliableMarginLeft: function() {
-              computeStyleTests();
-              return reliableMarginLeftVal;
-            },
-            scrollboxSize: function() {
-              computeStyleTests();
-              return scrollboxSizeVal;
-            },
-            // Support: IE 9 - 11+, Edge 15 - 18+
-            // IE/Edge misreport `getComputedStyle` of table rows with width/height
-            // set in CSS while `offset*` properties report correct values.
-            // Behavior in IE 9 is more subtle than in newer versions & it passes
-            // some versions of this test; make sure not to make it pass there!
-            //
-            // Support: Firefox 70+
-            // Only Firefox includes border widths
-            // in computed dimensions. (gh-4529)
-            reliableTrDimensions: function() {
-              var table, tr, trChild, trStyle;
-              if (reliableTrDimensionsVal == null) {
-                table = document2.createElement("table");
-                tr = document2.createElement("tr");
-                trChild = document2.createElement("div");
-                table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
-                tr.style.cssText = "box-sizing:content-box;border:1px solid";
-                tr.style.height = "1px";
-                trChild.style.height = "9px";
-                trChild.style.display = "block";
-                documentElement.appendChild(table).appendChild(tr).appendChild(trChild);
-                trStyle = window2.getComputedStyle(tr);
-                reliableTrDimensionsVal = parseInt(trStyle.height, 10) + parseInt(trStyle.borderTopWidth, 10) + parseInt(trStyle.borderBottomWidth, 10) === tr.offsetHeight;
-                documentElement.removeChild(table);
-              }
-              return reliableTrDimensionsVal;
-            }
-          });
-        })();
-        function curCSS(elem, name, computed) {
-          var width, minWidth, maxWidth, ret, isCustomProp = rcustomProp.test(name), style = elem.style;
-          computed = computed || getStyles(elem);
-          if (computed) {
-            ret = computed.getPropertyValue(name) || computed[name];
-            if (isCustomProp && ret) {
-              ret = ret.replace(rtrimCSS, "$1") || void 0;
-            }
-            if (ret === "" && !isAttached(elem)) {
-              ret = jQuery.style(elem, name);
-            }
-            if (!support.pixelBoxStyles() && rnumnonpx.test(ret) && rboxStyle.test(name)) {
-              width = style.width;
-              minWidth = style.minWidth;
-              maxWidth = style.maxWidth;
-              style.minWidth = style.maxWidth = style.width = ret;
-              ret = computed.width;
-              style.width = width;
-              style.minWidth = minWidth;
-              style.maxWidth = maxWidth;
-            }
-          }
-          return ret !== void 0 ? (
-            // Support: IE <=9 - 11 only
-            // IE returns zIndex value as an integer.
-            ret + ""
-          ) : ret;
-        }
-        function addGetHookIf(conditionFn, hookFn) {
-          return {
-            get: function() {
-              if (conditionFn()) {
-                delete this.get;
-                return;
-              }
-              return (this.get = hookFn).apply(this, arguments);
-            }
-          };
-        }
-        var cssPrefixes = ["Webkit", "Moz", "ms"], emptyStyle = document2.createElement("div").style, vendorProps = {};
-        function vendorPropName(name) {
-          var capName = name[0].toUpperCase() + name.slice(1), i = cssPrefixes.length;
-          while (i--) {
-            name = cssPrefixes[i] + capName;
-            if (name in emptyStyle) {
-              return name;
-            }
-          }
-        }
-        function finalPropName(name) {
-          var final = jQuery.cssProps[name] || vendorProps[name];
-          if (final) {
-            return final;
-          }
-          if (name in emptyStyle) {
-            return name;
-          }
-          return vendorProps[name] = vendorPropName(name) || name;
-        }
-        var rdisplayswap = /^(none|table(?!-c[ea]).+)/, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = {
-          letterSpacing: "0",
-          fontWeight: "400"
-        };
-        function setPositiveNumber(_elem, value, subtract) {
-          var matches = rcssNum.exec(value);
-          return matches ? (
-            // Guard against undefined "subtract", e.g., when used as in cssHooks
-            Math.max(0, matches[2] - (subtract || 0)) + (matches[3] || "px")
-          ) : value;
-        }
-        function boxModelAdjustment(elem, dimension, box, isBorderBox, styles, computedVal) {
-          var i = dimension === "width" ? 1 : 0, extra = 0, delta = 0, marginDelta = 0;
-          if (box === (isBorderBox ? "border" : "content")) {
-            return 0;
-          }
-          for (; i < 4; i += 2) {
-            if (box === "margin") {
-              marginDelta += jQuery.css(elem, box + cssExpand[i], true, styles);
-            }
-            if (!isBorderBox) {
-              delta += jQuery.css(elem, "padding" + cssExpand[i], true, styles);
-              if (box !== "padding") {
-                delta += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
-              } else {
-                extra += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
-              }
-            } else {
-              if (box === "content") {
-                delta -= jQuery.css(elem, "padding" + cssExpand[i], true, styles);
-              }
-              if (box !== "margin") {
-                delta -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
-              }
-            }
-          }
-          if (!isBorderBox && computedVal >= 0) {
-            delta += Math.max(0, Math.ceil(
-              elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - computedVal - delta - extra - 0.5
-              // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
-              // Use an explicit zero to avoid NaN (gh-3964)
-            )) || 0;
-          }
-          return delta + marginDelta;
-        }
-        function getWidthOrHeight(elem, dimension, extra) {
-          var styles = getStyles(elem), boxSizingNeeded = !support.boxSizingReliable() || extra, isBorderBox = boxSizingNeeded && jQuery.css(elem, "boxSizing", false, styles) === "border-box", valueIsBorderBox = isBorderBox, val = curCSS(elem, dimension, styles), offsetProp = "offset" + dimension[0].toUpperCase() + dimension.slice(1);
-          if (rnumnonpx.test(val)) {
-            if (!extra) {
-              return val;
-            }
-            val = "auto";
-          }
-          if ((!support.boxSizingReliable() && isBorderBox || // Support: IE 10 - 11+, Edge 15 - 18+
-          // IE/Edge misreport `getComputedStyle` of table rows with width/height
-          // set in CSS while `offset*` properties report correct values.
-          // Interestingly, in some cases IE 9 doesn't suffer from this issue.
-          !support.reliableTrDimensions() && nodeName(elem, "tr") || // Fall back to offsetWidth/offsetHeight when value is "auto"
-          // This happens for inline elements with no explicit setting (gh-3571)
-          val === "auto" || // Support: Android <=4.1 - 4.3 only
-          // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
-          !parseFloat(val) && jQuery.css(elem, "display", false, styles) === "inline") && // Make sure the element is visible & connected
-          elem.getClientRects().length) {
-            isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box";
-            valueIsBorderBox = offsetProp in elem;
-            if (valueIsBorderBox) {
-              val = elem[offsetProp];
-            }
-          }
-          val = parseFloat(val) || 0;
-          return val + boxModelAdjustment(
-            elem,
-            dimension,
-            extra || (isBorderBox ? "border" : "content"),
-            valueIsBorderBox,
-            styles,
-            // Provide the current computed size to request scroll gutter calculation (gh-3589)
-            val
-          ) + "px";
-        }
-        jQuery.extend({
-          // Add in style property hooks for overriding the default
-          // behavior of getting and setting a style property
-          cssHooks: {
-            opacity: {
-              get: function(elem, computed) {
-                if (computed) {
-                  var ret = curCSS(elem, "opacity");
-                  return ret === "" ? "1" : ret;
-                }
-              }
-            }
-          },
-          // Don't automatically add "px" to these possibly-unitless properties
-          cssNumber: {
-            animationIterationCount: true,
-            aspectRatio: true,
-            borderImageSlice: true,
-            columnCount: true,
-            flexGrow: true,
-            flexShrink: true,
-            fontWeight: true,
-            gridArea: true,
-            gridColumn: true,
-            gridColumnEnd: true,
-            gridColumnStart: true,
-            gridRow: true,
-            gridRowEnd: true,
-            gridRowStart: true,
-            lineHeight: true,
-            opacity: true,
-            order: true,
-            orphans: true,
-            scale: true,
-            widows: true,
-            zIndex: true,
-            zoom: true,
-            // SVG-related
-            fillOpacity: true,
-            floodOpacity: true,
-            stopOpacity: true,
-            strokeMiterlimit: true,
-            strokeOpacity: true
-          },
-          // Add in properties whose names you wish to fix before
-          // setting or getting the value
-          cssProps: {},
-          // Get and set the style property on a DOM Node
-          style: function(elem, name, value, extra) {
-            if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {
-              return;
-            }
-            var ret, type, hooks, origName = camelCase(name), isCustomProp = rcustomProp.test(name), style = elem.style;
-            if (!isCustomProp) {
-              name = finalPropName(origName);
-            }
-            hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
-            if (value !== void 0) {
-              type = typeof value;
-              if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) {
-                value = adjustCSS(elem, name, ret);
-                type = "number";
-              }
-              if (value == null || value !== value) {
-                return;
-              }
-              if (type === "number" && !isCustomProp) {
-                value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px");
-              }
-              if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) {
-                style[name] = "inherit";
-              }
-              if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== void 0) {
-                if (isCustomProp) {
-                  style.setProperty(name, value);
-                } else {
-                  style[name] = value;
-                }
-              }
-            } else {
-              if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== void 0) {
-                return ret;
-              }
-              return style[name];
-            }
-          },
-          css: function(elem, name, extra, styles) {
-            var val, num, hooks, origName = camelCase(name), isCustomProp = rcustomProp.test(name);
-            if (!isCustomProp) {
-              name = finalPropName(origName);
-            }
-            hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
-            if (hooks && "get" in hooks) {
-              val = hooks.get(elem, true, extra);
-            }
-            if (val === void 0) {
-              val = curCSS(elem, name, styles);
-            }
-            if (val === "normal" && name in cssNormalTransform) {
-              val = cssNormalTransform[name];
-            }
-            if (extra === "" || extra) {
-              num = parseFloat(val);
-              return extra === true || isFinite(num) ? num || 0 : val;
-            }
-            return val;
-          }
-        });
-        jQuery.each(["height", "width"], function(_i, dimension) {
-          jQuery.cssHooks[dimension] = {
-            get: function(elem, computed, extra) {
-              if (computed) {
-                return rdisplayswap.test(jQuery.css(elem, "display")) && // Support: Safari 8+
-                // Table columns in Safari have non-zero offsetWidth & zero
-                // getBoundingClientRect().width unless display is changed.
-                // Support: IE <=11 only
-                // Running getBoundingClientRect on a disconnected node
-                // in IE throws an error.
-                (!elem.getClientRects().length || !elem.getBoundingClientRect().width) ? swap(elem, cssShow, function() {
-                  return getWidthOrHeight(elem, dimension, extra);
-                }) : getWidthOrHeight(elem, dimension, extra);
-              }
-            },
-            set: function(elem, value, extra) {
-              var matches, styles = getStyles(elem), scrollboxSizeBuggy = !support.scrollboxSize() && styles.position === "absolute", boxSizingNeeded = scrollboxSizeBuggy || extra, isBorderBox = boxSizingNeeded && jQuery.css(elem, "boxSizing", false, styles) === "border-box", subtract = extra ? boxModelAdjustment(
-                elem,
-                dimension,
-                extra,
-                isBorderBox,
-                styles
-              ) : 0;
-              if (isBorderBox && scrollboxSizeBuggy) {
-                subtract -= Math.ceil(
-                  elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - parseFloat(styles[dimension]) - boxModelAdjustment(elem, dimension, "border", false, styles) - 0.5
-                );
-              }
-              if (subtract && (matches = rcssNum.exec(value)) && (matches[3] || "px") !== "px") {
-                elem.style[dimension] = value;
-                value = jQuery.css(elem, dimension);
-              }
-              return setPositiveNumber(elem, value, subtract);
-            }
-          };
-        });
-        jQuery.cssHooks.marginLeft = addGetHookIf(
-          support.reliableMarginLeft,
-          function(elem, computed) {
-            if (computed) {
-              return (parseFloat(curCSS(elem, "marginLeft")) || elem.getBoundingClientRect().left - swap(elem, { marginLeft: 0 }, function() {
-                return elem.getBoundingClientRect().left;
-              })) + "px";
-            }
-          }
-        );
-        jQuery.each({
-          margin: "",
-          padding: "",
-          border: "Width"
-        }, function(prefix, suffix) {
-          jQuery.cssHooks[prefix + suffix] = {
-            expand: function(value) {
-              var i = 0, expanded = {}, parts = typeof value === "string" ? value.split(" ") : [value];
-              for (; i < 4; i++) {
-                expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0];
-              }
-              return expanded;
-            }
-          };
-          if (prefix !== "margin") {
-            jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
-          }
-        });
-        jQuery.fn.extend({
-          css: function(name, value) {
-            return access(this, function(elem, name2, value2) {
-              var styles, len, map = {}, i = 0;
-              if (Array.isArray(name2)) {
-                styles = getStyles(elem);
-                len = name2.length;
-                for (; i < len; i++) {
-                  map[name2[i]] = jQuery.css(elem, name2[i], false, styles);
-                }
-                return map;
-              }
-              return value2 !== void 0 ? jQuery.style(elem, name2, value2) : jQuery.css(elem, name2);
-            }, name, value, arguments.length > 1);
-          }
-        });
-        function Tween(elem, options, prop, end2, easing) {
-          return new Tween.prototype.init(elem, options, prop, end2, easing);
-        }
-        jQuery.Tween = Tween;
-        Tween.prototype = {
-          constructor: Tween,
-          init: function(elem, options, prop, end2, easing, unit) {
-            this.elem = elem;
-            this.prop = prop;
-            this.easing = easing || jQuery.easing._default;
-            this.options = options;
-            this.start = this.now = this.cur();
-            this.end = end2;
-            this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px");
-          },
-          cur: function() {
-            var hooks = Tween.propHooks[this.prop];
-            return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this);
-          },
-          run: function(percent) {
-            var eased, hooks = Tween.propHooks[this.prop];
-            if (this.options.duration) {
-              this.pos = eased = jQuery.easing[this.easing](
-                percent,
-                this.options.duration * percent,
-                0,
-                1,
-                this.options.duration
-              );
-            } else {
-              this.pos = eased = percent;
-            }
-            this.now = (this.end - this.start) * eased + this.start;
-            if (this.options.step) {
-              this.options.step.call(this.elem, this.now, this);
-            }
-            if (hooks && hooks.set) {
-              hooks.set(this);
-            } else {
-              Tween.propHooks._default.set(this);
-            }
-            return this;
-          }
-        };
-        Tween.prototype.init.prototype = Tween.prototype;
-        Tween.propHooks = {
-          _default: {
-            get: function(tween) {
-              var result;
-              if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) {
-                return tween.elem[tween.prop];
-              }
-              result = jQuery.css(tween.elem, tween.prop, "");
-              return !result || result === "auto" ? 0 : result;
-            },
-            set: function(tween) {
-              if (jQuery.fx.step[tween.prop]) {
-                jQuery.fx.step[tween.prop](tween);
-              } else if (tween.elem.nodeType === 1 && (jQuery.cssHooks[tween.prop] || tween.elem.style[finalPropName(tween.prop)] != null)) {
-                jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
-              } else {
-                tween.elem[tween.prop] = tween.now;
-              }
-            }
-          }
-        };
-        Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
-          set: function(tween) {
-            if (tween.elem.nodeType && tween.elem.parentNode) {
-              tween.elem[tween.prop] = tween.now;
-            }
-          }
-        };
-        jQuery.easing = {
-          linear: function(p) {
-            return p;
-          },
-          swing: function(p) {
-            return 0.5 - Math.cos(p * Math.PI) / 2;
-          },
-          _default: "swing"
-        };
-        jQuery.fx = Tween.prototype.init;
-        jQuery.fx.step = {};
-        var fxNow, inProgress, rfxtypes = /^(?:toggle|show|hide)$/, rrun = /queueHooks$/;
-        function schedule() {
-          if (inProgress) {
-            if (document2.hidden === false && window2.requestAnimationFrame) {
-              window2.requestAnimationFrame(schedule);
-            } else {
-              window2.setTimeout(schedule, jQuery.fx.interval);
-            }
-            jQuery.fx.tick();
-          }
-        }
-        function createFxNow() {
-          window2.setTimeout(function() {
-            fxNow = void 0;
-          });
-          return fxNow = Date.now();
-        }
-        function genFx(type, includeWidth) {
-          var which, i = 0, attrs = { height: type };
-          includeWidth = includeWidth ? 1 : 0;
-          for (; i < 4; i += 2 - includeWidth) {
-            which = cssExpand[i];
-            attrs["margin" + which] = attrs["padding" + which] = type;
-          }
-          if (includeWidth) {
-            attrs.opacity = attrs.width = type;
-          }
-          return attrs;
-        }
-        function createTween(value, prop, animation) {
-          var tween, collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]), index = 0, length = collection.length;
-          for (; index < length; index++) {
-            if (tween = collection[index].call(animation, prop, value)) {
-              return tween;
-            }
-          }
-        }
-        function defaultPrefilter(elem, props, opts) {
-          var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, isBox = "width" in props || "height" in props, anim = this, orig = {}, style = elem.style, hidden = elem.nodeType && isHiddenWithinTree(elem), dataShow = dataPriv.get(elem, "fxshow");
-          if (!opts.queue) {
-            hooks = jQuery._queueHooks(elem, "fx");
-            if (hooks.unqueued == null) {
-              hooks.unqueued = 0;
-              oldfire = hooks.empty.fire;
-              hooks.empty.fire = function() {
-                if (!hooks.unqueued) {
-                  oldfire();
-                }
-              };
-            }
-            hooks.unqueued++;
-            anim.always(function() {
-              anim.always(function() {
-                hooks.unqueued--;
-                if (!jQuery.queue(elem, "fx").length) {
-                  hooks.empty.fire();
-                }
-              });
-            });
-          }
-          for (prop in props) {
-            value = props[prop];
-            if (rfxtypes.test(value)) {
-              delete props[prop];
-              toggle = toggle || value === "toggle";
-              if (value === (hidden ? "hide" : "show")) {
-                if (value === "show" && dataShow && dataShow[prop] !== void 0) {
-                  hidden = true;
-                } else {
-                  continue;
-                }
-              }
-              orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);
-            }
-          }
-          propTween = !jQuery.isEmptyObject(props);
-          if (!propTween && jQuery.isEmptyObject(orig)) {
-            return;
-          }
-          if (isBox && elem.nodeType === 1) {
-            opts.overflow = [style.overflow, style.overflowX, style.overflowY];
-            restoreDisplay = dataShow && dataShow.display;
-            if (restoreDisplay == null) {
-              restoreDisplay = dataPriv.get(elem, "display");
-            }
-            display = jQuery.css(elem, "display");
-            if (display === "none") {
-              if (restoreDisplay) {
-                display = restoreDisplay;
-              } else {
-                showHide([elem], true);
-                restoreDisplay = elem.style.display || restoreDisplay;
-                display = jQuery.css(elem, "display");
-                showHide([elem]);
-              }
-            }
-            if (display === "inline" || display === "inline-block" && restoreDisplay != null) {
-              if (jQuery.css(elem, "float") === "none") {
-                if (!propTween) {
-                  anim.done(function() {
-                    style.display = restoreDisplay;
-                  });
-                  if (restoreDisplay == null) {
-                    display = style.display;
-                    restoreDisplay = display === "none" ? "" : display;
-                  }
-                }
-                style.display = "inline-block";
-              }
-            }
-          }
-          if (opts.overflow) {
-            style.overflow = "hidden";
-            anim.always(function() {
-              style.overflow = opts.overflow[0];
-              style.overflowX = opts.overflow[1];
-              style.overflowY = opts.overflow[2];
-            });
-          }
-          propTween = false;
-          for (prop in orig) {
-            if (!propTween) {
-              if (dataShow) {
-                if ("hidden" in dataShow) {
-                  hidden = dataShow.hidden;
-                }
-              } else {
-                dataShow = dataPriv.access(elem, "fxshow", { display: restoreDisplay });
-              }
-              if (toggle) {
-                dataShow.hidden = !hidden;
-              }
-              if (hidden) {
-                showHide([elem], true);
-              }
-              anim.done(function() {
-                if (!hidden) {
-                  showHide([elem]);
-                }
-                dataPriv.remove(elem, "fxshow");
-                for (prop in orig) {
-                  jQuery.style(elem, prop, orig[prop]);
-                }
-              });
-            }
-            propTween = createTween(hidden ? dataShow[prop] : 0, prop, anim);
-            if (!(prop in dataShow)) {
-              dataShow[prop] = propTween.start;
-              if (hidden) {
-                propTween.end = propTween.start;
-                propTween.start = 0;
-              }
-            }
-          }
-        }
-        function propFilter(props, specialEasing) {
-          var index, name, easing, value, hooks;
-          for (index in props) {
-            name = camelCase(index);
-            easing = specialEasing[name];
-            value = props[index];
-            if (Array.isArray(value)) {
-              easing = value[1];
-              value = props[index] = value[0];
-            }
-            if (index !== name) {
-              props[name] = value;
-              delete props[index];
-            }
-            hooks = jQuery.cssHooks[name];
-            if (hooks && "expand" in hooks) {
-              value = hooks.expand(value);
-              delete props[name];
-              for (index in value) {
-                if (!(index in props)) {
-                  props[index] = value[index];
-                  specialEasing[index] = easing;
-                }
-              }
-            } else {
-              specialEasing[name] = easing;
-            }
-          }
-        }
-        function Animation(elem, properties, options) {
-          var result, stopped, index = 0, length = Animation.prefilters.length, deferred = jQuery.Deferred().always(function() {
-            delete tick.elem;
-          }), tick = function() {
-            if (stopped) {
-              return false;
-            }
-            var currentTime = fxNow || createFxNow(), remaining = Math.max(0, animation.startTime + animation.duration - currentTime), temp = remaining / animation.duration || 0, percent = 1 - temp, index2 = 0, length2 = animation.tweens.length;
-            for (; index2 < length2; index2++) {
-              animation.tweens[index2].run(percent);
-            }
-            deferred.notifyWith(elem, [animation, percent, remaining]);
-            if (percent < 1 && length2) {
-              return remaining;
-            }
-            if (!length2) {
-              deferred.notifyWith(elem, [animation, 1, 0]);
-            }
-            deferred.resolveWith(elem, [animation]);
-            return false;
-          }, animation = deferred.promise({
-            elem,
-            props: jQuery.extend({}, properties),
-            opts: jQuery.extend(true, {
-              specialEasing: {},
-              easing: jQuery.easing._default
-            }, options),
-            originalProperties: properties,
-            originalOptions: options,
-            startTime: fxNow || createFxNow(),
-            duration: options.duration,
-            tweens: [],
-            createTween: function(prop, end2) {
-              var tween = jQuery.Tween(
-                elem,
-                animation.opts,
-                prop,
-                end2,
-                animation.opts.specialEasing[prop] || animation.opts.easing
-              );
-              animation.tweens.push(tween);
-              return tween;
-            },
-            stop: function(gotoEnd) {
-              var index2 = 0, length2 = gotoEnd ? animation.tweens.length : 0;
-              if (stopped) {
-                return this;
-              }
-              stopped = true;
-              for (; index2 < length2; index2++) {
-                animation.tweens[index2].run(1);
-              }
-              if (gotoEnd) {
-                deferred.notifyWith(elem, [animation, 1, 0]);
-                deferred.resolveWith(elem, [animation, gotoEnd]);
-              } else {
-                deferred.rejectWith(elem, [animation, gotoEnd]);
-              }
-              return this;
-            }
-          }), props = animation.props;
-          propFilter(props, animation.opts.specialEasing);
-          for (; index < length; index++) {
-            result = Animation.prefilters[index].call(animation, elem, props, animation.opts);
-            if (result) {
-              if (isFunction(result.stop)) {
-                jQuery._queueHooks(animation.elem, animation.opts.queue).stop = result.stop.bind(result);
-              }
-              return result;
-            }
-          }
-          jQuery.map(props, createTween, animation);
-          if (isFunction(animation.opts.start)) {
-            animation.opts.start.call(elem, animation);
-          }
-          animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always);
-          jQuery.fx.timer(
-            jQuery.extend(tick, {
-              elem,
-              anim: animation,
-              queue: animation.opts.queue
-            })
-          );
-          return animation;
-        }
-        jQuery.Animation = jQuery.extend(Animation, {
-          tweeners: {
-            "*": [function(prop, value) {
-              var tween = this.createTween(prop, value);
-              adjustCSS(tween.elem, prop, rcssNum.exec(value), tween);
-              return tween;
-            }]
-          },
-          tweener: function(props, callback) {
-            if (isFunction(props)) {
-              callback = props;
-              props = ["*"];
-            } else {
-              props = props.match(rnothtmlwhite);
-            }
-            var prop, index = 0, length = props.length;
-            for (; index < length; index++) {
-              prop = props[index];
-              Animation.tweeners[prop] = Animation.tweeners[prop] || [];
-              Animation.tweeners[prop].unshift(callback);
-            }
-          },
-          prefilters: [defaultPrefilter],
-          prefilter: function(callback, prepend) {
-            if (prepend) {
-              Animation.prefilters.unshift(callback);
-            } else {
-              Animation.prefilters.push(callback);
-            }
-          }
-        });
-        jQuery.speed = function(speed, easing, fn2) {
-          var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
-            complete: fn2 || !fn2 && easing || isFunction(speed) && speed,
-            duration: speed,
-            easing: fn2 && easing || easing && !isFunction(easing) && easing
-          };
-          if (jQuery.fx.off) {
-            opt.duration = 0;
-          } else {
-            if (typeof opt.duration !== "number") {
-              if (opt.duration in jQuery.fx.speeds) {
-                opt.duration = jQuery.fx.speeds[opt.duration];
-              } else {
-                opt.duration = jQuery.fx.speeds._default;
-              }
-            }
-          }
-          if (opt.queue == null || opt.queue === true) {
-            opt.queue = "fx";
-          }
-          opt.old = opt.complete;
-          opt.complete = function() {
-            if (isFunction(opt.old)) {
-              opt.old.call(this);
-            }
-            if (opt.queue) {
-              jQuery.dequeue(this, opt.queue);
-            }
-          };
-          return opt;
-        };
-        jQuery.fn.extend({
-          fadeTo: function(speed, to, easing, callback) {
-            return this.filter(isHiddenWithinTree).css("opacity", 0).show().end().animate({ opacity: to }, speed, easing, callback);
-          },
-          animate: function(prop, speed, easing, callback) {
-            var empty = jQuery.isEmptyObject(prop), optall = jQuery.speed(speed, easing, callback), doAnimation = function() {
-              var anim = Animation(this, jQuery.extend({}, prop), optall);
-              if (empty || dataPriv.get(this, "finish")) {
-                anim.stop(true);
-              }
-            };
-            doAnimation.finish = doAnimation;
-            return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation);
-          },
-          stop: function(type, clearQueue, gotoEnd) {
-            var stopQueue = function(hooks) {
-              var stop = hooks.stop;
-              delete hooks.stop;
-              stop(gotoEnd);
-            };
-            if (typeof type !== "string") {
-              gotoEnd = clearQueue;
-              clearQueue = type;
-              type = void 0;
-            }
-            if (clearQueue) {
-              this.queue(type || "fx", []);
-            }
-            return this.each(function() {
-              var dequeue = true, index = type != null && type + "queueHooks", timers = jQuery.timers, data = dataPriv.get(this);
-              if (index) {
-                if (data[index] && data[index].stop) {
-                  stopQueue(data[index]);
-                }
-              } else {
-                for (index in data) {
-                  if (data[index] && data[index].stop && rrun.test(index)) {
-                    stopQueue(data[index]);
-                  }
-                }
-              }
-              for (index = timers.length; index--; ) {
-                if (timers[index].elem === this && (type == null || timers[index].queue === type)) {
-                  timers[index].anim.stop(gotoEnd);
-                  dequeue = false;
-                  timers.splice(index, 1);
-                }
-              }
-              if (dequeue || !gotoEnd) {
-                jQuery.dequeue(this, type);
-              }
-            });
-          },
-          finish: function(type) {
-            if (type !== false) {
-              type = type || "fx";
-            }
-            return this.each(function() {
-              var index, data = dataPriv.get(this), queue = data[type + "queue"], hooks = data[type + "queueHooks"], timers = jQuery.timers, length = queue ? queue.length : 0;
-              data.finish = true;
-              jQuery.queue(this, type, []);
-              if (hooks && hooks.stop) {
-                hooks.stop.call(this, true);
-              }
-              for (index = timers.length; index--; ) {
-                if (timers[index].elem === this && timers[index].queue === type) {
-                  timers[index].anim.stop(true);
-                  timers.splice(index, 1);
-                }
-              }
-              for (index = 0; index < length; index++) {
-                if (queue[index] && queue[index].finish) {
-                  queue[index].finish.call(this);
-                }
-              }
-              delete data.finish;
-            });
-          }
-        });
-        jQuery.each(["toggle", "show", "hide"], function(_i, name) {
-          var cssFn = jQuery.fn[name];
-          jQuery.fn[name] = function(speed, easing, callback) {
-            return speed == null || typeof speed === "boolean" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback);
-          };
-        });
-        jQuery.each({
-          slideDown: genFx("show"),
-          slideUp: genFx("hide"),
-          slideToggle: genFx("toggle"),
-          fadeIn: { opacity: "show" },
-          fadeOut: { opacity: "hide" },
-          fadeToggle: { opacity: "toggle" }
-        }, function(name, props) {
-          jQuery.fn[name] = function(speed, easing, callback) {
-            return this.animate(props, speed, easing, callback);
-          };
-        });
-        jQuery.timers = [];
-        jQuery.fx.tick = function() {
-          var timer, i = 0, timers = jQuery.timers;
-          fxNow = Date.now();
-          for (; i < timers.length; i++) {
-            timer = timers[i];
-            if (!timer() && timers[i] === timer) {
-              timers.splice(i--, 1);
-            }
-          }
-          if (!timers.length) {
-            jQuery.fx.stop();
-          }
-          fxNow = void 0;
-        };
-        jQuery.fx.timer = function(timer) {
-          jQuery.timers.push(timer);
-          jQuery.fx.start();
-        };
-        jQuery.fx.interval = 13;
-        jQuery.fx.start = function() {
-          if (inProgress) {
-            return;
-          }
-          inProgress = true;
-          schedule();
-        };
-        jQuery.fx.stop = function() {
-          inProgress = null;
-        };
-        jQuery.fx.speeds = {
-          slow: 600,
-          fast: 200,
-          // Default speed
-          _default: 400
-        };
-        jQuery.fn.delay = function(time, type) {
-          time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
-          type = type || "fx";
-          return this.queue(type, function(next, hooks) {
-            var timeout = window2.setTimeout(next, time);
-            hooks.stop = function() {
-              window2.clearTimeout(timeout);
-            };
-          });
-        };
-        (function() {
-          var input = document2.createElement("input"), select = document2.createElement("select"), opt = select.appendChild(document2.createElement("option"));
-          input.type = "checkbox";
-          support.checkOn = input.value !== "";
-          support.optSelected = opt.selected;
-          input = document2.createElement("input");
-          input.value = "t";
-          input.type = "radio";
-          support.radioValue = input.value === "t";
-        })();
-        var boolHook, attrHandle = jQuery.expr.attrHandle;
-        jQuery.fn.extend({
-          attr: function(name, value) {
-            return access(this, jQuery.attr, name, value, arguments.length > 1);
-          },
-          removeAttr: function(name) {
-            return this.each(function() {
-              jQuery.removeAttr(this, name);
-            });
-          }
-        });
-        jQuery.extend({
-          attr: function(elem, name, value) {
-            var ret, hooks, nType = elem.nodeType;
-            if (nType === 3 || nType === 8 || nType === 2) {
-              return;
-            }
-            if (typeof elem.getAttribute === "undefined") {
-              return jQuery.prop(elem, name, value);
-            }
-            if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
-              hooks = jQuery.attrHooks[name.toLowerCase()] || (jQuery.expr.match.bool.test(name) ? boolHook : void 0);
-            }
-            if (value !== void 0) {
-              if (value === null) {
-                jQuery.removeAttr(elem, name);
-                return;
-              }
-              if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== void 0) {
-                return ret;
-              }
-              elem.setAttribute(name, value + "");
-              return value;
-            }
-            if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
-              return ret;
-            }
-            ret = jQuery.find.attr(elem, name);
-            return ret == null ? void 0 : ret;
-          },
-          attrHooks: {
-            type: {
-              set: function(elem, value) {
-                if (!support.radioValue && value === "radio" && nodeName(elem, "input")) {
-                  var val = elem.value;
-                  elem.setAttribute("type", value);
-                  if (val) {
-                    elem.value = val;
-                  }
-                  return value;
-                }
-              }
-            }
-          },
-          removeAttr: function(elem, value) {
-            var name, i = 0, attrNames = value && value.match(rnothtmlwhite);
-            if (attrNames && elem.nodeType === 1) {
-              while (name = attrNames[i++]) {
-                elem.removeAttribute(name);
-              }
-            }
-          }
-        });
-        boolHook = {
-          set: function(elem, value, name) {
-            if (value === false) {
-              jQuery.removeAttr(elem, name);
-            } else {
-              elem.setAttribute(name, name);
-            }
-            return name;
-          }
-        };
-        jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function(_i, name) {
-          var getter = attrHandle[name] || jQuery.find.attr;
-          attrHandle[name] = function(elem, name2, isXML) {
-            var ret, handle, lowercaseName = name2.toLowerCase();
-            if (!isXML) {
-              handle = attrHandle[lowercaseName];
-              attrHandle[lowercaseName] = ret;
-              ret = getter(elem, name2, isXML) != null ? lowercaseName : null;
-              attrHandle[lowercaseName] = handle;
-            }
-            return ret;
-          };
-        });
-        var rfocusable = /^(?:input|select|textarea|button)$/i, rclickable = /^(?:a|area)$/i;
-        jQuery.fn.extend({
-          prop: function(name, value) {
-            return access(this, jQuery.prop, name, value, arguments.length > 1);
-          },
-          removeProp: function(name) {
-            return this.each(function() {
-              delete this[jQuery.propFix[name] || name];
-            });
-          }
-        });
-        jQuery.extend({
-          prop: function(elem, name, value) {
-            var ret, hooks, nType = elem.nodeType;
-            if (nType === 3 || nType === 8 || nType === 2) {
-              return;
-            }
-            if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
-              name = jQuery.propFix[name] || name;
-              hooks = jQuery.propHooks[name];
-            }
-            if (value !== void 0) {
-              if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== void 0) {
-                return ret;
-              }
-              return elem[name] = value;
-            }
-            if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
-              return ret;
-            }
-            return elem[name];
-          },
-          propHooks: {
-            tabIndex: {
-              get: function(elem) {
-                var tabindex = jQuery.find.attr(elem, "tabindex");
-                if (tabindex) {
-                  return parseInt(tabindex, 10);
-                }
-                if (rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href) {
-                  return 0;
-                }
-                return -1;
-              }
-            }
-          },
-          propFix: {
-            "for": "htmlFor",
-            "class": "className"
-          }
-        });
-        if (!support.optSelected) {
-          jQuery.propHooks.selected = {
-            get: function(elem) {
-              var parent = elem.parentNode;
-              if (parent && parent.parentNode) {
-                parent.parentNode.selectedIndex;
-              }
-              return null;
-            },
-            set: function(elem) {
-              var parent = elem.parentNode;
-              if (parent) {
-                parent.selectedIndex;
-                if (parent.parentNode) {
-                  parent.parentNode.selectedIndex;
-                }
-              }
-            }
-          };
-        }
-        jQuery.each([
-          "tabIndex",
-          "readOnly",
-          "maxLength",
-          "cellSpacing",
-          "cellPadding",
-          "rowSpan",
-          "colSpan",
-          "useMap",
-          "frameBorder",
-          "contentEditable"
-        ], function() {
-          jQuery.propFix[this.toLowerCase()] = this;
-        });
-        function stripAndCollapse(value) {
-          var tokens = value.match(rnothtmlwhite) || [];
-          return tokens.join(" ");
-        }
-        function getClass(elem) {
-          return elem.getAttribute && elem.getAttribute("class") || "";
-        }
-        function classesToArray(value) {
-          if (Array.isArray(value)) {
-            return value;
-          }
-          if (typeof value === "string") {
-            return value.match(rnothtmlwhite) || [];
-          }
-          return [];
-        }
-        jQuery.fn.extend({
-          addClass: function(value) {
-            var classNames, cur, curValue, className, i, finalValue;
-            if (isFunction(value)) {
-              return this.each(function(j) {
-                jQuery(this).addClass(value.call(this, j, getClass(this)));
-              });
-            }
-            classNames = classesToArray(value);
-            if (classNames.length) {
-              return this.each(function() {
-                curValue = getClass(this);
-                cur = this.nodeType === 1 && " " + stripAndCollapse(curValue) + " ";
-                if (cur) {
-                  for (i = 0; i < classNames.length; i++) {
-                    className = classNames[i];
-                    if (cur.indexOf(" " + className + " ") < 0) {
-                      cur += className + " ";
-                    }
-                  }
-                  finalValue = stripAndCollapse(cur);
-                  if (curValue !== finalValue) {
-                    this.setAttribute("class", finalValue);
-                  }
-                }
-              });
-            }
-            return this;
-          },
-          removeClass: function(value) {
-            var classNames, cur, curValue, className, i, finalValue;
-            if (isFunction(value)) {
-              return this.each(function(j) {
-                jQuery(this).removeClass(value.call(this, j, getClass(this)));
-              });
-            }
-            if (!arguments.length) {
-              return this.attr("class", "");
-            }
-            classNames = classesToArray(value);
-            if (classNames.length) {
-              return this.each(function() {
-                curValue = getClass(this);
-                cur = this.nodeType === 1 && " " + stripAndCollapse(curValue) + " ";
-                if (cur) {
-                  for (i = 0; i < classNames.length; i++) {
-                    className = classNames[i];
-                    while (cur.indexOf(" " + className + " ") > -1) {
-                      cur = cur.replace(" " + className + " ", " ");
-                    }
-                  }
-                  finalValue = stripAndCollapse(cur);
-                  if (curValue !== finalValue) {
-                    this.setAttribute("class", finalValue);
-                  }
-                }
-              });
-            }
-            return this;
-          },
-          toggleClass: function(value, stateVal) {
-            var classNames, className, i, self2, type = typeof value, isValidValue = type === "string" || Array.isArray(value);
-            if (isFunction(value)) {
-              return this.each(function(i2) {
-                jQuery(this).toggleClass(
-                  value.call(this, i2, getClass(this), stateVal),
-                  stateVal
-                );
-              });
-            }
-            if (typeof stateVal === "boolean" && isValidValue) {
-              return stateVal ? this.addClass(value) : this.removeClass(value);
-            }
-            classNames = classesToArray(value);
-            return this.each(function() {
-              if (isValidValue) {
-                self2 = jQuery(this);
-                for (i = 0; i < classNames.length; i++) {
-                  className = classNames[i];
-                  if (self2.hasClass(className)) {
-                    self2.removeClass(className);
-                  } else {
-                    self2.addClass(className);
-                  }
-                }
-              } else if (value === void 0 || type === "boolean") {
-                className = getClass(this);
-                if (className) {
-                  dataPriv.set(this, "__className__", className);
-                }
-                if (this.setAttribute) {
-                  this.setAttribute(
-                    "class",
-                    className || value === false ? "" : dataPriv.get(this, "__className__") || ""
-                  );
-                }
-              }
-            });
-          },
-          hasClass: function(selector) {
-            var className, elem, i = 0;
-            className = " " + selector + " ";
-            while (elem = this[i++]) {
-              if (elem.nodeType === 1 && (" " + stripAndCollapse(getClass(elem)) + " ").indexOf(className) > -1) {
-                return true;
-              }
-            }
-            return false;
-          }
-        });
-        var rreturn = /\r/g;
-        jQuery.fn.extend({
-          val: function(value) {
-            var hooks, ret, valueIsFunction, elem = this[0];
-            if (!arguments.length) {
-              if (elem) {
-                hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()];
-                if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== void 0) {
-                  return ret;
-                }
-                ret = elem.value;
-                if (typeof ret === "string") {
-                  return ret.replace(rreturn, "");
-                }
-                return ret == null ? "" : ret;
-              }
-              return;
-            }
-            valueIsFunction = isFunction(value);
-            return this.each(function(i) {
-              var val;
-              if (this.nodeType !== 1) {
-                return;
-              }
-              if (valueIsFunction) {
-                val = value.call(this, i, jQuery(this).val());
-              } else {
-                val = value;
-              }
-              if (val == null) {
-                val = "";
-              } else if (typeof val === "number") {
-                val += "";
-              } else if (Array.isArray(val)) {
-                val = jQuery.map(val, function(value2) {
-                  return value2 == null ? "" : value2 + "";
-                });
-              }
-              hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()];
-              if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === void 0) {
-                this.value = val;
-              }
-            });
-          }
-        });
-        jQuery.extend({
-          valHooks: {
-            option: {
-              get: function(elem) {
-                var val = jQuery.find.attr(elem, "value");
-                return val != null ? val : (
-                  // Support: IE <=10 - 11 only
-                  // option.text throws exceptions (trac-14686, trac-14858)
-                  // Strip and collapse whitespace
-                  // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
-                  stripAndCollapse(jQuery.text(elem))
-                );
-              }
-            },
-            select: {
-              get: function(elem) {
-                var value, option, i, options = elem.options, index = elem.selectedIndex, one = elem.type === "select-one", values = one ? null : [], max2 = one ? index + 1 : options.length;
-                if (index < 0) {
-                  i = max2;
-                } else {
-                  i = one ? index : 0;
-                }
-                for (; i < max2; i++) {
-                  option = options[i];
-                  if ((option.selected || i === index) && // Don't return options that are disabled or in a disabled optgroup
-                  !option.disabled && (!option.parentNode.disabled || !nodeName(option.parentNode, "optgroup"))) {
-                    value = jQuery(option).val();
-                    if (one) {
-                      return value;
-                    }
-                    values.push(value);
-                  }
-                }
-                return values;
-              },
-              set: function(elem, value) {
-                var optionSet, option, options = elem.options, values = jQuery.makeArray(value), i = options.length;
-                while (i--) {
-                  option = options[i];
-                  if (option.selected = jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1) {
-                    optionSet = true;
-                  }
-                }
-                if (!optionSet) {
-                  elem.selectedIndex = -1;
-                }
-                return values;
-              }
-            }
-          }
-        });
-        jQuery.each(["radio", "checkbox"], function() {
-          jQuery.valHooks[this] = {
-            set: function(elem, value) {
-              if (Array.isArray(value)) {
-                return elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1;
-              }
-            }
-          };
-          if (!support.checkOn) {
-            jQuery.valHooks[this].get = function(elem) {
-              return elem.getAttribute("value") === null ? "on" : elem.value;
-            };
-          }
-        });
-        var location2 = window2.location;
-        var nonce = { guid: Date.now() };
-        var rquery = /\?/;
-        jQuery.parseXML = function(data) {
-          var xml, parserErrorElem;
-          if (!data || typeof data !== "string") {
-            return null;
-          }
-          try {
-            xml = new window2.DOMParser().parseFromString(data, "text/xml");
-          } catch (e) {
-          }
-          parserErrorElem = xml && xml.getElementsByTagName("parsererror")[0];
-          if (!xml || parserErrorElem) {
-            jQuery.error("Invalid XML: " + (parserErrorElem ? jQuery.map(parserErrorElem.childNodes, function(el) {
-              return el.textContent;
-            }).join("\n") : data));
-          }
-          return xml;
-        };
-        var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, stopPropagationCallback = function(e) {
-          e.stopPropagation();
-        };
-        jQuery.extend(jQuery.event, {
-          trigger: function(event, data, elem, onlyHandlers) {
-            var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, eventPath = [elem || document2], type = hasOwn.call(event, "type") ? event.type : event, namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : [];
-            cur = lastElement = tmp = elem = elem || document2;
-            if (elem.nodeType === 3 || elem.nodeType === 8) {
-              return;
-            }
-            if (rfocusMorph.test(type + jQuery.event.triggered)) {
-              return;
-            }
-            if (type.indexOf(".") > -1) {
-              namespaces = type.split(".");
-              type = namespaces.shift();
-              namespaces.sort();
-            }
-            ontype = type.indexOf(":") < 0 && "on" + type;
-            event = event[jQuery.expando] ? event : new jQuery.Event(type, typeof event === "object" && event);
-            event.isTrigger = onlyHandlers ? 2 : 3;
-            event.namespace = namespaces.join(".");
-            event.rnamespace = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
-            event.result = void 0;
-            if (!event.target) {
-              event.target = elem;
-            }
-            data = data == null ? [event] : jQuery.makeArray(data, [event]);
-            special = jQuery.event.special[type] || {};
-            if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) {
-              return;
-            }
-            if (!onlyHandlers && !special.noBubble && !isWindow(elem)) {
-              bubbleType = special.delegateType || type;
-              if (!rfocusMorph.test(bubbleType + type)) {
-                cur = cur.parentNode;
-              }
-              for (; cur; cur = cur.parentNode) {
-                eventPath.push(cur);
-                tmp = cur;
-              }
-              if (tmp === (elem.ownerDocument || document2)) {
-                eventPath.push(tmp.defaultView || tmp.parentWindow || window2);
-              }
-            }
-            i = 0;
-            while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {
-              lastElement = cur;
-              event.type = i > 1 ? bubbleType : special.bindType || type;
-              handle = (dataPriv.get(cur, "events") || /* @__PURE__ */ Object.create(null))[event.type] && dataPriv.get(cur, "handle");
-              if (handle) {
-                handle.apply(cur, data);
-              }
-              handle = ontype && cur[ontype];
-              if (handle && handle.apply && acceptData(cur)) {
-                event.result = handle.apply(cur, data);
-                if (event.result === false) {
-                  event.preventDefault();
-                }
-              }
-            }
-            event.type = type;
-            if (!onlyHandlers && !event.isDefaultPrevented()) {
-              if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && acceptData(elem)) {
-                if (ontype && isFunction(elem[type]) && !isWindow(elem)) {
-                  tmp = elem[ontype];
-                  if (tmp) {
-                    elem[ontype] = null;
-                  }
-                  jQuery.event.triggered = type;
-                  if (event.isPropagationStopped()) {
-                    lastElement.addEventListener(type, stopPropagationCallback);
-                  }
-                  elem[type]();
-                  if (event.isPropagationStopped()) {
-                    lastElement.removeEventListener(type, stopPropagationCallback);
-                  }
-                  jQuery.event.triggered = void 0;
-                  if (tmp) {
-                    elem[ontype] = tmp;
-                  }
-                }
-              }
-            }
-            return event.result;
-          },
-          // Piggyback on a donor event to simulate a different one
-          // Used only for `focus(in | out)` events
-          simulate: function(type, elem, event) {
-            var e = jQuery.extend(
-              new jQuery.Event(),
-              event,
-              {
-                type,
-                isSimulated: true
-              }
-            );
-            jQuery.event.trigger(e, null, elem);
-          }
-        });
-        jQuery.fn.extend({
-          trigger: function(type, data) {
-            return this.each(function() {
-              jQuery.event.trigger(type, data, this);
-            });
-          },
-          triggerHandler: function(type, data) {
-            var elem = this[0];
-            if (elem) {
-              return jQuery.event.trigger(type, data, elem, true);
-            }
-          }
-        });
-        var rbracket = /\[\]$/, rCRLF = /\r?\n/g, rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, rsubmittable = /^(?:input|select|textarea|keygen)/i;
-        function buildParams(prefix, obj, traditional, add) {
-          var name;
-          if (Array.isArray(obj)) {
-            jQuery.each(obj, function(i, v) {
-              if (traditional || rbracket.test(prefix)) {
-                add(prefix, v);
-              } else {
-                buildParams(
-                  prefix + "[" + (typeof v === "object" && v != null ? i : "") + "]",
-                  v,
-                  traditional,
-                  add
-                );
-              }
-            });
-          } else if (!traditional && toType2(obj) === "object") {
-            for (name in obj) {
-              buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
-            }
-          } else {
-            add(prefix, obj);
-          }
-        }
-        jQuery.param = function(a, traditional) {
-          var prefix, s = [], add = function(key, valueOrFunction) {
-            var value = isFunction(valueOrFunction) ? valueOrFunction() : valueOrFunction;
-            s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value == null ? "" : value);
-          };
-          if (a == null) {
-            return "";
-          }
-          if (Array.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) {
-            jQuery.each(a, function() {
-              add(this.name, this.value);
-            });
-          } else {
-            for (prefix in a) {
-              buildParams(prefix, a[prefix], traditional, add);
-            }
-          }
-          return s.join("&");
-        };
-        jQuery.fn.extend({
-          serialize: function() {
-            return jQuery.param(this.serializeArray());
-          },
-          serializeArray: function() {
-            return this.map(function() {
-              var elements = jQuery.prop(this, "elements");
-              return elements ? jQuery.makeArray(elements) : this;
-            }).filter(function() {
-              var type = this.type;
-              return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !rcheckableType.test(type));
-            }).map(function(_i, elem) {
-              var val = jQuery(this).val();
-              if (val == null) {
-                return null;
-              }
-              if (Array.isArray(val)) {
-                return jQuery.map(val, function(val2) {
-                  return { name: elem.name, value: val2.replace(rCRLF, "\r\n") };
-                });
-              }
-              return { name: elem.name, value: val.replace(rCRLF, "\r\n") };
-            }).get();
-          }
-        });
-        var r20 = /%20/g, rhash = /#.*$/, rantiCache = /([?&])_=[^&]*/, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, prefilters = {}, transports = {}, allTypes = "*/".concat("*"), originAnchor = document2.createElement("a");
-        originAnchor.href = location2.href;
-        function addToPrefiltersOrTransports(structure) {
-          return function(dataTypeExpression, func) {
-            if (typeof dataTypeExpression !== "string") {
-              func = dataTypeExpression;
-              dataTypeExpression = "*";
-            }
-            var dataType, i = 0, dataTypes = dataTypeExpression.toLowerCase().match(rnothtmlwhite) || [];
-            if (isFunction(func)) {
-              while (dataType = dataTypes[i++]) {
-                if (dataType[0] === "+") {
-                  dataType = dataType.slice(1) || "*";
-                  (structure[dataType] = structure[dataType] || []).unshift(func);
-                } else {
-                  (structure[dataType] = structure[dataType] || []).push(func);
-                }
-              }
-            }
-          };
-        }
-        function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {
-          var inspected = {}, seekingTransport = structure === transports;
-          function inspect(dataType) {
-            var selected;
-            inspected[dataType] = true;
-            jQuery.each(structure[dataType] || [], function(_, prefilterOrFactory) {
-              var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);
-              if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) {
-                options.dataTypes.unshift(dataTypeOrTransport);
-                inspect(dataTypeOrTransport);
-                return false;
-              } else if (seekingTransport) {
-                return !(selected = dataTypeOrTransport);
-              }
-            });
-            return selected;
-          }
-          return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*");
-        }
-        function ajaxExtend(target, src) {
-          var key, deep, flatOptions = jQuery.ajaxSettings.flatOptions || {};
-          for (key in src) {
-            if (src[key] !== void 0) {
-              (flatOptions[key] ? target : deep || (deep = {}))[key] = src[key];
-            }
-          }
-          if (deep) {
-            jQuery.extend(true, target, deep);
-          }
-          return target;
-        }
-        function ajaxHandleResponses(s, jqXHR, responses) {
-          var ct, type, finalDataType, firstDataType, contents = s.contents, dataTypes = s.dataTypes;
-          while (dataTypes[0] === "*") {
-            dataTypes.shift();
-            if (ct === void 0) {
-              ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
-            }
-          }
-          if (ct) {
-            for (type in contents) {
-              if (contents[type] && contents[type].test(ct)) {
-                dataTypes.unshift(type);
-                break;
-              }
-            }
-          }
-          if (dataTypes[0] in responses) {
-            finalDataType = dataTypes[0];
-          } else {
-            for (type in responses) {
-              if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
-                finalDataType = type;
-                break;
-              }
-              if (!firstDataType) {
-                firstDataType = type;
-              }
-            }
-            finalDataType = finalDataType || firstDataType;
-          }
-          if (finalDataType) {
-            if (finalDataType !== dataTypes[0]) {
-              dataTypes.unshift(finalDataType);
-            }
-            return responses[finalDataType];
-          }
-        }
-        function ajaxConvert(s, response, jqXHR, isSuccess) {
-          var conv2, current, conv, tmp, prev, converters = {}, dataTypes = s.dataTypes.slice();
-          if (dataTypes[1]) {
-            for (conv in s.converters) {
-              converters[conv.toLowerCase()] = s.converters[conv];
-            }
-          }
-          current = dataTypes.shift();
-          while (current) {
-            if (s.responseFields[current]) {
-              jqXHR[s.responseFields[current]] = response;
-            }
-            if (!prev && isSuccess && s.dataFilter) {
-              response = s.dataFilter(response, s.dataType);
-            }
-            prev = current;
-            current = dataTypes.shift();
-            if (current) {
-              if (current === "*") {
-                current = prev;
-              } else if (prev !== "*" && prev !== current) {
-                conv = converters[prev + " " + current] || converters["* " + current];
-                if (!conv) {
-                  for (conv2 in converters) {
-                    tmp = conv2.split(" ");
-                    if (tmp[1] === current) {
-                      conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]];
-                      if (conv) {
-                        if (conv === true) {
-                          conv = converters[conv2];
-                        } else if (converters[conv2] !== true) {
-                          current = tmp[0];
-                          dataTypes.unshift(tmp[1]);
-                        }
-                        break;
-                      }
-                    }
-                  }
-                }
-                if (conv !== true) {
-                  if (conv && s.throws) {
-                    response = conv(response);
-                  } else {
-                    try {
-                      response = conv(response);
-                    } catch (e) {
-                      return {
-                        state: "parsererror",
-                        error: conv ? e : "No conversion from " + prev + " to " + current
-                      };
-                    }
-                  }
-                }
-              }
-            }
-          }
-          return { state: "success", data: response };
-        }
-        jQuery.extend({
-          // Counter for holding the number of active queries
-          active: 0,
-          // Last-Modified header cache for next request
-          lastModified: {},
-          etag: {},
-          ajaxSettings: {
-            url: location2.href,
-            type: "GET",
-            isLocal: rlocalProtocol.test(location2.protocol),
-            global: true,
-            processData: true,
-            async: true,
-            contentType: "application/x-www-form-urlencoded; charset=UTF-8",
-            /*
-            timeout: 0,
-            data: null,
-            dataType: null,
-            username: null,
-            password: null,
-            cache: null,
-            throws: false,
-            traditional: false,
-            headers: {},
-            */
-            accepts: {
-              "*": allTypes,
-              text: "text/plain",
-              html: "text/html",
-              xml: "application/xml, text/xml",
-              json: "application/json, text/javascript"
-            },
-            contents: {
-              xml: /\bxml\b/,
-              html: /\bhtml/,
-              json: /\bjson\b/
-            },
-            responseFields: {
-              xml: "responseXML",
-              text: "responseText",
-              json: "responseJSON"
-            },
-            // Data converters
-            // Keys separate source (or catchall "*") and destination types with a single space
-            converters: {
-              // Convert anything to text
-              "* text": String,
-              // Text to html (true = no transformation)
-              "text html": true,
-              // Evaluate text as a json expression
-              "text json": JSON.parse,
-              // Parse text as xml
-              "text xml": jQuery.parseXML
-            },
-            // For options that shouldn't be deep extended:
-            // you can add your own custom options here if
-            // and when you create one that shouldn't be
-            // deep extended (see ajaxExtend)
-            flatOptions: {
-              url: true,
-              context: true
-            }
-          },
-          // Creates a full fledged settings object into target
-          // with both ajaxSettings and settings fields.
-          // If target is omitted, writes into ajaxSettings.
-          ajaxSetup: function(target, settings) {
-            return settings ? (
-              // Building a settings object
-              ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings)
-            ) : (
-              // Extending ajaxSettings
-              ajaxExtend(jQuery.ajaxSettings, target)
-            );
-          },
-          ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
-          ajaxTransport: addToPrefiltersOrTransports(transports),
-          // Main method
-          ajax: function(url, options) {
-            if (typeof url === "object") {
-              options = url;
-              url = void 0;
-            }
-            options = options || {};
-            var transport, cacheURL, responseHeadersString, responseHeaders, timeoutTimer, urlAnchor, completed2, fireGlobals, i, uncached, s = jQuery.ajaxSetup({}, options), callbackContext = s.context || s, globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery(callbackContext) : jQuery.event, deferred = jQuery.Deferred(), completeDeferred = jQuery.Callbacks("once memory"), statusCode = s.statusCode || {}, requestHeaders = {}, requestHeadersNames = {}, strAbort = "canceled", jqXHR = {
-              readyState: 0,
-              // Builds headers hashtable if needed
-              getResponseHeader: function(key) {
-                var match;
-                if (completed2) {
-                  if (!responseHeaders) {
-                    responseHeaders = {};
-                    while (match = rheaders.exec(responseHeadersString)) {
-                      responseHeaders[match[1].toLowerCase() + " "] = (responseHeaders[match[1].toLowerCase() + " "] || []).concat(match[2]);
-                    }
-                  }
-                  match = responseHeaders[key.toLowerCase() + " "];
-                }
-                return match == null ? null : match.join(", ");
-              },
-              // Raw string
-              getAllResponseHeaders: function() {
-                return completed2 ? responseHeadersString : null;
-              },
-              // Caches the header
-              setRequestHeader: function(name, value) {
-                if (completed2 == null) {
-                  name = requestHeadersNames[name.toLowerCase()] = requestHeadersNames[name.toLowerCase()] || name;
-                  requestHeaders[name] = value;
-                }
-                return this;
-              },
-              // Overrides response content-type header
-              overrideMimeType: function(type) {
-                if (completed2 == null) {
-                  s.mimeType = type;
-                }
-                return this;
-              },
-              // Status-dependent callbacks
-              statusCode: function(map) {
-                var code;
-                if (map) {
-                  if (completed2) {
-                    jqXHR.always(map[jqXHR.status]);
-                  } else {
-                    for (code in map) {
-                      statusCode[code] = [statusCode[code], map[code]];
-                    }
-                  }
-                }
-                return this;
-              },
-              // Cancel the request
-              abort: function(statusText) {
-                var finalText = statusText || strAbort;
-                if (transport) {
-                  transport.abort(finalText);
-                }
-                done(0, finalText);
-                return this;
-              }
-            };
-            deferred.promise(jqXHR);
-            s.url = ((url || s.url || location2.href) + "").replace(rprotocol, location2.protocol + "//");
-            s.type = options.method || options.type || s.method || s.type;
-            s.dataTypes = (s.dataType || "*").toLowerCase().match(rnothtmlwhite) || [""];
-            if (s.crossDomain == null) {
-              urlAnchor = document2.createElement("a");
-              try {
-                urlAnchor.href = s.url;
-                urlAnchor.href = urlAnchor.href;
-                s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host;
-              } catch (e) {
-                s.crossDomain = true;
-              }
-            }
-            if (s.data && s.processData && typeof s.data !== "string") {
-              s.data = jQuery.param(s.data, s.traditional);
-            }
-            inspectPrefiltersOrTransports(prefilters, s, options, jqXHR);
-            if (completed2) {
-              return jqXHR;
-            }
-            fireGlobals = jQuery.event && s.global;
-            if (fireGlobals && jQuery.active++ === 0) {
-              jQuery.event.trigger("ajaxStart");
-            }
-            s.type = s.type.toUpperCase();
-            s.hasContent = !rnoContent.test(s.type);
-            cacheURL = s.url.replace(rhash, "");
-            if (!s.hasContent) {
-              uncached = s.url.slice(cacheURL.length);
-              if (s.data && (s.processData || typeof s.data === "string")) {
-                cacheURL += (rquery.test(cacheURL) ? "&" : "?") + s.data;
-                delete s.data;
-              }
-              if (s.cache === false) {
-                cacheURL = cacheURL.replace(rantiCache, "$1");
-                uncached = (rquery.test(cacheURL) ? "&" : "?") + "_=" + nonce.guid++ + uncached;
-              }
-              s.url = cacheURL + uncached;
-            } else if (s.data && s.processData && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0) {
-              s.data = s.data.replace(r20, "+");
-            }
-            if (s.ifModified) {
-              if (jQuery.lastModified[cacheURL]) {
-                jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]);
-              }
-              if (jQuery.etag[cacheURL]) {
-                jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]);
-              }
-            }
-            if (s.data && s.hasContent && s.contentType !== false || options.contentType) {
-              jqXHR.setRequestHeader("Content-Type", s.contentType);
-            }
-            jqXHR.setRequestHeader(
-              "Accept",
-              s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"]
-            );
-            for (i in s.headers) {
-              jqXHR.setRequestHeader(i, s.headers[i]);
-            }
-            if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || completed2)) {
-              return jqXHR.abort();
-            }
-            strAbort = "abort";
-            completeDeferred.add(s.complete);
-            jqXHR.done(s.success);
-            jqXHR.fail(s.error);
-            transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR);
-            if (!transport) {
-              done(-1, "No Transport");
-            } else {
-              jqXHR.readyState = 1;
-              if (fireGlobals) {
-                globalEventContext.trigger("ajaxSend", [jqXHR, s]);
-              }
-              if (completed2) {
-                return jqXHR;
-              }
-              if (s.async && s.timeout > 0) {
-                timeoutTimer = window2.setTimeout(function() {
-                  jqXHR.abort("timeout");
-                }, s.timeout);
-              }
-              try {
-                completed2 = false;
-                transport.send(requestHeaders, done);
-              } catch (e) {
-                if (completed2) {
-                  throw e;
-                }
-                done(-1, e);
-              }
-            }
-            function done(status, nativeStatusText, responses, headers) {
-              var isSuccess, success, error, response, modified, statusText = nativeStatusText;
-              if (completed2) {
-                return;
-              }
-              completed2 = true;
-              if (timeoutTimer) {
-                window2.clearTimeout(timeoutTimer);
-              }
-              transport = void 0;
-              responseHeadersString = headers || "";
-              jqXHR.readyState = status > 0 ? 4 : 0;
-              isSuccess = status >= 200 && status < 300 || status === 304;
-              if (responses) {
-                response = ajaxHandleResponses(s, jqXHR, responses);
-              }
-              if (!isSuccess && jQuery.inArray("script", s.dataTypes) > -1 && jQuery.inArray("json", s.dataTypes) < 0) {
-                s.converters["text script"] = function() {
-                };
-              }
-              response = ajaxConvert(s, response, jqXHR, isSuccess);
-              if (isSuccess) {
-                if (s.ifModified) {
-                  modified = jqXHR.getResponseHeader("Last-Modified");
-                  if (modified) {
-                    jQuery.lastModified[cacheURL] = modified;
-                  }
-                  modified = jqXHR.getResponseHeader("etag");
-                  if (modified) {
-                    jQuery.etag[cacheURL] = modified;
-                  }
-                }
-                if (status === 204 || s.type === "HEAD") {
-                  statusText = "nocontent";
-                } else if (status === 304) {
-                  statusText = "notmodified";
-                } else {
-                  statusText = response.state;
-                  success = response.data;
-                  error = response.error;
-                  isSuccess = !error;
-                }
-              } else {
-                error = statusText;
-                if (status || !statusText) {
-                  statusText = "error";
-                  if (status < 0) {
-                    status = 0;
-                  }
-                }
-              }
-              jqXHR.status = status;
-              jqXHR.statusText = (nativeStatusText || statusText) + "";
-              if (isSuccess) {
-                deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);
-              } else {
-                deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);
-              }
-              jqXHR.statusCode(statusCode);
-              statusCode = void 0;
-              if (fireGlobals) {
-                globalEventContext.trigger(
-                  isSuccess ? "ajaxSuccess" : "ajaxError",
-                  [jqXHR, s, isSuccess ? success : error]
-                );
-              }
-              completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);
-              if (fireGlobals) {
-                globalEventContext.trigger("ajaxComplete", [jqXHR, s]);
-                if (!--jQuery.active) {
-                  jQuery.event.trigger("ajaxStop");
-                }
-              }
-            }
-            return jqXHR;
-          },
-          getJSON: function(url, data, callback) {
-            return jQuery.get(url, data, callback, "json");
-          },
-          getScript: function(url, callback) {
-            return jQuery.get(url, void 0, callback, "script");
-          }
-        });
-        jQuery.each(["get", "post"], function(_i, method) {
-          jQuery[method] = function(url, data, callback, type) {
-            if (isFunction(data)) {
-              type = type || callback;
-              callback = data;
-              data = void 0;
-            }
-            return jQuery.ajax(jQuery.extend({
-              url,
-              type: method,
-              dataType: type,
-              data,
-              success: callback
-            }, jQuery.isPlainObject(url) && url));
-          };
-        });
-        jQuery.ajaxPrefilter(function(s) {
-          var i;
-          for (i in s.headers) {
-            if (i.toLowerCase() === "content-type") {
-              s.contentType = s.headers[i] || "";
-            }
-          }
-        });
-        jQuery._evalUrl = function(url, options, doc2) {
-          return jQuery.ajax({
-            url,
-            // Make this explicit, since user can override this through ajaxSetup (trac-11264)
-            type: "GET",
-            dataType: "script",
-            cache: true,
-            async: false,
-            global: false,
-            // Only evaluate the response if it is successful (gh-4126)
-            // dataFilter is not invoked for failure responses, so using it instead
-            // of the default converter is kludgy but it works.
-            converters: {
-              "text script": function() {
-              }
-            },
-            dataFilter: function(response) {
-              jQuery.globalEval(response, options, doc2);
-            }
-          });
-        };
-        jQuery.fn.extend({
-          wrapAll: function(html) {
-            var wrap;
-            if (this[0]) {
-              if (isFunction(html)) {
-                html = html.call(this[0]);
-              }
-              wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);
-              if (this[0].parentNode) {
-                wrap.insertBefore(this[0]);
-              }
-              wrap.map(function() {
-                var elem = this;
-                while (elem.firstElementChild) {
-                  elem = elem.firstElementChild;
-                }
-                return elem;
-              }).append(this);
-            }
-            return this;
-          },
-          wrapInner: function(html) {
-            if (isFunction(html)) {
-              return this.each(function(i) {
-                jQuery(this).wrapInner(html.call(this, i));
-              });
-            }
-            return this.each(function() {
-              var self2 = jQuery(this), contents = self2.contents();
-              if (contents.length) {
-                contents.wrapAll(html);
-              } else {
-                self2.append(html);
-              }
-            });
-          },
-          wrap: function(html) {
-            var htmlIsFunction = isFunction(html);
-            return this.each(function(i) {
-              jQuery(this).wrapAll(htmlIsFunction ? html.call(this, i) : html);
-            });
-          },
-          unwrap: function(selector) {
-            this.parent(selector).not("body").each(function() {
-              jQuery(this).replaceWith(this.childNodes);
-            });
-            return this;
-          }
-        });
-        jQuery.expr.pseudos.hidden = function(elem) {
-          return !jQuery.expr.pseudos.visible(elem);
-        };
-        jQuery.expr.pseudos.visible = function(elem) {
-          return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);
-        };
-        jQuery.ajaxSettings.xhr = function() {
-          try {
-            return new window2.XMLHttpRequest();
-          } catch (e) {
-          }
-        };
-        var xhrSuccessStatus = {
-          // File protocol always yields status code 0, assume 200
-          0: 200,
-          // Support: IE <=9 only
-          // trac-1450: sometimes IE returns 1223 when it should be 204
-          1223: 204
-        }, xhrSupported = jQuery.ajaxSettings.xhr();
-        support.cors = !!xhrSupported && "withCredentials" in xhrSupported;
-        support.ajax = xhrSupported = !!xhrSupported;
-        jQuery.ajaxTransport(function(options) {
-          var callback, errorCallback;
-          if (support.cors || xhrSupported && !options.crossDomain) {
-            return {
-              send: function(headers, complete) {
-                var i, xhr = options.xhr();
-                xhr.open(
-                  options.type,
-                  options.url,
-                  options.async,
-                  options.username,
-                  options.password
-                );
-                if (options.xhrFields) {
-                  for (i in options.xhrFields) {
-                    xhr[i] = options.xhrFields[i];
-                  }
-                }
-                if (options.mimeType && xhr.overrideMimeType) {
-                  xhr.overrideMimeType(options.mimeType);
-                }
-                if (!options.crossDomain && !headers["X-Requested-With"]) {
-                  headers["X-Requested-With"] = "XMLHttpRequest";
-                }
-                for (i in headers) {
-                  xhr.setRequestHeader(i, headers[i]);
-                }
-                callback = function(type) {
-                  return function() {
-                    if (callback) {
-                      callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null;
-                      if (type === "abort") {
-                        xhr.abort();
-                      } else if (type === "error") {
-                        if (typeof xhr.status !== "number") {
-                          complete(0, "error");
-                        } else {
-                          complete(
-                            // File: protocol always yields status 0; see trac-8605, trac-14207
-                            xhr.status,
-                            xhr.statusText
-                          );
-                        }
-                      } else {
-                        complete(
-                          xhrSuccessStatus[xhr.status] || xhr.status,
-                          xhr.statusText,
-                          // Support: IE <=9 only
-                          // IE9 has no XHR2 but throws on binary (trac-11426)
-                          // For XHR2 non-text, let the caller handle it (gh-2498)
-                          (xhr.responseType || "text") !== "text" || typeof xhr.responseText !== "string" ? { binary: xhr.response } : { text: xhr.responseText },
-                          xhr.getAllResponseHeaders()
-                        );
-                      }
-                    }
-                  };
-                };
-                xhr.onload = callback();
-                errorCallback = xhr.onerror = xhr.ontimeout = callback("error");
-                if (xhr.onabort !== void 0) {
-                  xhr.onabort = errorCallback;
-                } else {
-                  xhr.onreadystatechange = function() {
-                    if (xhr.readyState === 4) {
-                      window2.setTimeout(function() {
-                        if (callback) {
-                          errorCallback();
-                        }
-                      });
-                    }
-                  };
-                }
-                callback = callback("abort");
-                try {
-                  xhr.send(options.hasContent && options.data || null);
-                } catch (e) {
-                  if (callback) {
-                    throw e;
-                  }
-                }
-              },
-              abort: function() {
-                if (callback) {
-                  callback();
-                }
-              }
-            };
-          }
-        });
-        jQuery.ajaxPrefilter(function(s) {
-          if (s.crossDomain) {
-            s.contents.script = false;
-          }
-        });
-        jQuery.ajaxSetup({
-          accepts: {
-            script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
-          },
-          contents: {
-            script: /\b(?:java|ecma)script\b/
-          },
-          converters: {
-            "text script": function(text) {
-              jQuery.globalEval(text);
-              return text;
-            }
-          }
-        });
-        jQuery.ajaxPrefilter("script", function(s) {
-          if (s.cache === void 0) {
-            s.cache = false;
-          }
-          if (s.crossDomain) {
-            s.type = "GET";
-          }
-        });
-        jQuery.ajaxTransport("script", function(s) {
-          if (s.crossDomain || s.scriptAttrs) {
-            var script, callback;
-            return {
-              send: function(_, complete) {
-                script = jQuery("<script>").attr(s.scriptAttrs || {}).prop({ charset: s.scriptCharset, src: s.url }).on("load error", callback = function(evt) {
-                  script.remove();
-                  callback = null;
-                  if (evt) {
-                    complete(evt.type === "error" ? 404 : 200, evt.type);
-                  }
-                });
-                document2.head.appendChild(script[0]);
-              },
-              abort: function() {
-                if (callback) {
-                  callback();
-                }
-              }
-            };
-          }
-        });
-        var oldCallbacks = [], rjsonp = /(=)\?(?=&|$)|\?\?/;
-        jQuery.ajaxSetup({
-          jsonp: "callback",
-          jsonpCallback: function() {
-            var callback = oldCallbacks.pop() || jQuery.expando + "_" + nonce.guid++;
-            this[callback] = true;
-            return callback;
-          }
-        });
-        jQuery.ajaxPrefilter("json jsonp", function(s, originalSettings, jqXHR) {
-          var callbackName, overwritten, responseContainer, jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ? "url" : typeof s.data === "string" && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0 && rjsonp.test(s.data) && "data");
-          if (jsonProp || s.dataTypes[0] === "jsonp") {
-            callbackName = s.jsonpCallback = isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback;
-            if (jsonProp) {
-              s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName);
-            } else if (s.jsonp !== false) {
-              s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName;
-            }
-            s.converters["script json"] = function() {
-              if (!responseContainer) {
-                jQuery.error(callbackName + " was not called");
-              }
-              return responseContainer[0];
-            };
-            s.dataTypes[0] = "json";
-            overwritten = window2[callbackName];
-            window2[callbackName] = function() {
-              responseContainer = arguments;
-            };
-            jqXHR.always(function() {
-              if (overwritten === void 0) {
-                jQuery(window2).removeProp(callbackName);
-              } else {
-                window2[callbackName] = overwritten;
-              }
-              if (s[callbackName]) {
-                s.jsonpCallback = originalSettings.jsonpCallback;
-                oldCallbacks.push(callbackName);
-              }
-              if (responseContainer && isFunction(overwritten)) {
-                overwritten(responseContainer[0]);
-              }
-              responseContainer = overwritten = void 0;
-            });
-            return "script";
-          }
-        });
-        support.createHTMLDocument = function() {
-          var body = document2.implementation.createHTMLDocument("").body;
-          body.innerHTML = "<form></form><form></form>";
-          return body.childNodes.length === 2;
-        }();
-        jQuery.parseHTML = function(data, context, keepScripts) {
-          if (typeof data !== "string") {
-            return [];
-          }
-          if (typeof context === "boolean") {
-            keepScripts = context;
-            context = false;
-          }
-          var base, parsed, scripts;
-          if (!context) {
-            if (support.createHTMLDocument) {
-              context = document2.implementation.createHTMLDocument("");
-              base = context.createElement("base");
-              base.href = document2.location.href;
-              context.head.appendChild(base);
-            } else {
-              context = document2;
-            }
-          }
-          parsed = rsingleTag.exec(data);
-          scripts = !keepScripts && [];
-          if (parsed) {
-            return [context.createElement(parsed[1])];
-          }
-          parsed = buildFragment([data], context, scripts);
-          if (scripts && scripts.length) {
-            jQuery(scripts).remove();
-          }
-          return jQuery.merge([], parsed.childNodes);
-        };
-        jQuery.fn.load = function(url, params, callback) {
-          var selector, type, response, self2 = this, off = url.indexOf(" ");
-          if (off > -1) {
-            selector = stripAndCollapse(url.slice(off));
-            url = url.slice(0, off);
-          }
-          if (isFunction(params)) {
-            callback = params;
-            params = void 0;
-          } else if (params && typeof params === "object") {
-            type = "POST";
-          }
-          if (self2.length > 0) {
-            jQuery.ajax({
-              url,
-              // If "type" variable is undefined, then "GET" method will be used.
-              // Make value of this field explicit since
-              // user can override it through ajaxSetup method
-              type: type || "GET",
-              dataType: "html",
-              data: params
-            }).done(function(responseText) {
-              response = arguments;
-              self2.html(selector ? (
-                // If a selector was specified, locate the right elements in a dummy div
-                // Exclude scripts to avoid IE 'Permission Denied' errors
-                jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector)
-              ) : (
-                // Otherwise use the full result
-                responseText
-              ));
-            }).always(callback && function(jqXHR, status) {
-              self2.each(function() {
-                callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
-              });
-            });
-          }
-          return this;
-        };
-        jQuery.expr.pseudos.animated = function(elem) {
-          return jQuery.grep(jQuery.timers, function(fn2) {
-            return elem === fn2.elem;
-          }).length;
-        };
-        jQuery.offset = {
-          setOffset: function(elem, options, i) {
-            var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, position = jQuery.css(elem, "position"), curElem = jQuery(elem), props = {};
-            if (position === "static") {
-              elem.style.position = "relative";
-            }
-            curOffset = curElem.offset();
-            curCSSTop = jQuery.css(elem, "top");
-            curCSSLeft = jQuery.css(elem, "left");
-            calculatePosition = (position === "absolute" || position === "fixed") && (curCSSTop + curCSSLeft).indexOf("auto") > -1;
-            if (calculatePosition) {
-              curPosition = curElem.position();
-              curTop = curPosition.top;
-              curLeft = curPosition.left;
-            } else {
-              curTop = parseFloat(curCSSTop) || 0;
-              curLeft = parseFloat(curCSSLeft) || 0;
-            }
-            if (isFunction(options)) {
-              options = options.call(elem, i, jQuery.extend({}, curOffset));
-            }
-            if (options.top != null) {
-              props.top = options.top - curOffset.top + curTop;
-            }
-            if (options.left != null) {
-              props.left = options.left - curOffset.left + curLeft;
-            }
-            if ("using" in options) {
-              options.using.call(elem, props);
-            } else {
-              curElem.css(props);
-            }
-          }
-        };
-        jQuery.fn.extend({
-          // offset() relates an element's border box to the document origin
-          offset: function(options) {
-            if (arguments.length) {
-              return options === void 0 ? this : this.each(function(i) {
-                jQuery.offset.setOffset(this, options, i);
-              });
-            }
-            var rect, win, elem = this[0];
-            if (!elem) {
-              return;
-            }
-            if (!elem.getClientRects().length) {
-              return { top: 0, left: 0 };
-            }
-            rect = elem.getBoundingClientRect();
-            win = elem.ownerDocument.defaultView;
-            return {
-              top: rect.top + win.pageYOffset,
-              left: rect.left + win.pageXOffset
-            };
-          },
-          // position() relates an element's margin box to its offset parent's padding box
-          // This corresponds to the behavior of CSS absolute positioning
-          position: function() {
-            if (!this[0]) {
-              return;
-            }
-            var offsetParent, offset2, doc2, elem = this[0], parentOffset = { top: 0, left: 0 };
-            if (jQuery.css(elem, "position") === "fixed") {
-              offset2 = elem.getBoundingClientRect();
-            } else {
-              offset2 = this.offset();
-              doc2 = elem.ownerDocument;
-              offsetParent = elem.offsetParent || doc2.documentElement;
-              while (offsetParent && (offsetParent === doc2.body || offsetParent === doc2.documentElement) && jQuery.css(offsetParent, "position") === "static") {
-                offsetParent = offsetParent.parentNode;
-              }
-              if (offsetParent && offsetParent !== elem && offsetParent.nodeType === 1) {
-                parentOffset = jQuery(offsetParent).offset();
-                parentOffset.top += jQuery.css(offsetParent, "borderTopWidth", true);
-                parentOffset.left += jQuery.css(offsetParent, "borderLeftWidth", true);
-              }
-            }
-            return {
-              top: offset2.top - parentOffset.top - jQuery.css(elem, "marginTop", true),
-              left: offset2.left - parentOffset.left - jQuery.css(elem, "marginLeft", true)
-            };
-          },
-          // This method will return documentElement in the following cases:
-          // 1) For the element inside the iframe without offsetParent, this method will return
-          //    documentElement of the parent window
-          // 2) For the hidden or detached element
-          // 3) For body or html element, i.e. in case of the html node - it will return itself
-          //
-          // but those exceptions were never presented as a real life use-cases
-          // and might be considered as more preferable results.
-          //
-          // This logic, however, is not guaranteed and can change at any point in the future
-          offsetParent: function() {
-            return this.map(function() {
-              var offsetParent = this.offsetParent;
-              while (offsetParent && jQuery.css(offsetParent, "position") === "static") {
-                offsetParent = offsetParent.offsetParent;
-              }
-              return offsetParent || documentElement;
-            });
-          }
-        });
-        jQuery.each({ scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(method, prop) {
-          var top2 = "pageYOffset" === prop;
-          jQuery.fn[method] = function(val) {
-            return access(this, function(elem, method2, val2) {
-              var win;
-              if (isWindow(elem)) {
-                win = elem;
-              } else if (elem.nodeType === 9) {
-                win = elem.defaultView;
-              }
-              if (val2 === void 0) {
-                return win ? win[prop] : elem[method2];
-              }
-              if (win) {
-                win.scrollTo(
-                  !top2 ? val2 : win.pageXOffset,
-                  top2 ? val2 : win.pageYOffset
-                );
-              } else {
-                elem[method2] = val2;
-              }
-            }, method, val, arguments.length);
-          };
-        });
-        jQuery.each(["top", "left"], function(_i, prop) {
-          jQuery.cssHooks[prop] = addGetHookIf(
-            support.pixelPosition,
-            function(elem, computed) {
-              if (computed) {
-                computed = curCSS(elem, prop);
-                return rnumnonpx.test(computed) ? jQuery(elem).position()[prop] + "px" : computed;
-              }
-            }
-          );
-        });
-        jQuery.each({ Height: "height", Width: "width" }, function(name, type) {
-          jQuery.each({
-            padding: "inner" + name,
-            content: type,
-            "": "outer" + name
-          }, function(defaultExtra, funcName) {
-            jQuery.fn[funcName] = function(margin, value) {
-              var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"), extra = defaultExtra || (margin === true || value === true ? "margin" : "border");
-              return access(this, function(elem, type2, value2) {
-                var doc2;
-                if (isWindow(elem)) {
-                  return funcName.indexOf("outer") === 0 ? elem["inner" + name] : elem.document.documentElement["client" + name];
-                }
-                if (elem.nodeType === 9) {
-                  doc2 = elem.documentElement;
-                  return Math.max(
-                    elem.body["scroll" + name],
-                    doc2["scroll" + name],
-                    elem.body["offset" + name],
-                    doc2["offset" + name],
-                    doc2["client" + name]
-                  );
-                }
-                return value2 === void 0 ? (
-                  // Get width or height on the element, requesting but not forcing parseFloat
-                  jQuery.css(elem, type2, extra)
-                ) : (
-                  // Set width or height on the element
-                  jQuery.style(elem, type2, value2, extra)
-                );
-              }, type, chainable ? margin : void 0, chainable);
-            };
-          });
-        });
-        jQuery.each([
-          "ajaxStart",
-          "ajaxStop",
-          "ajaxComplete",
-          "ajaxError",
-          "ajaxSuccess",
-          "ajaxSend"
-        ], function(_i, type) {
-          jQuery.fn[type] = function(fn2) {
-            return this.on(type, fn2);
-          };
-        });
-        jQuery.fn.extend({
-          bind: function(types, data, fn2) {
-            return this.on(types, null, data, fn2);
-          },
-          unbind: function(types, fn2) {
-            return this.off(types, null, fn2);
-          },
-          delegate: function(selector, types, data, fn2) {
-            return this.on(types, selector, data, fn2);
-          },
-          undelegate: function(selector, types, fn2) {
-            return arguments.length === 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn2);
-          },
-          hover: function(fnOver, fnOut) {
-            return this.on("mouseenter", fnOver).on("mouseleave", fnOut || fnOver);
-          }
-        });
-        jQuery.each(
-          "blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),
-          function(_i, name) {
-            jQuery.fn[name] = function(data, fn2) {
-              return arguments.length > 0 ? this.on(name, null, data, fn2) : this.trigger(name);
-            };
-          }
-        );
-        var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
-        jQuery.proxy = function(fn2, context) {
-          var tmp, args, proxy;
-          if (typeof context === "string") {
-            tmp = fn2[context];
-            context = fn2;
-            fn2 = tmp;
-          }
-          if (!isFunction(fn2)) {
-            return void 0;
-          }
-          args = slice.call(arguments, 2);
-          proxy = function() {
-            return fn2.apply(context || this, args.concat(slice.call(arguments)));
-          };
-          proxy.guid = fn2.guid = fn2.guid || jQuery.guid++;
-          return proxy;
-        };
-        jQuery.holdReady = function(hold) {
-          if (hold) {
-            jQuery.readyWait++;
-          } else {
-            jQuery.ready(true);
-          }
-        };
-        jQuery.isArray = Array.isArray;
-        jQuery.parseJSON = JSON.parse;
-        jQuery.nodeName = nodeName;
-        jQuery.isFunction = isFunction;
-        jQuery.isWindow = isWindow;
-        jQuery.camelCase = camelCase;
-        jQuery.type = toType2;
-        jQuery.now = Date.now;
-        jQuery.isNumeric = function(obj) {
-          var type = jQuery.type(obj);
-          return (type === "number" || type === "string") && // parseFloat NaNs numeric-cast false positives ("")
-          // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
-          // subtraction forces infinities to NaN
-          !isNaN(obj - parseFloat(obj));
-        };
-        jQuery.trim = function(text) {
-          return text == null ? "" : (text + "").replace(rtrim, "$1");
-        };
-        if (typeof define === "function" && define.amd) {
-          define("jquery", [], function() {
-            return jQuery;
-          });
-        }
-        var _jQuery = window2.jQuery, _$ = window2.$;
-        jQuery.noConflict = function(deep) {
-          if (window2.$ === jQuery) {
-            window2.$ = _$;
-          }
-          if (deep && window2.jQuery === jQuery) {
-            window2.jQuery = _jQuery;
-          }
-          return jQuery;
-        };
-        if (typeof noGlobal === "undefined") {
-          window2.jQuery = window2.$ = jQuery;
-        }
-        return jQuery;
-      });
-    }
-  });
+removing illegal node: "${(s.outerHTML||s.nodeValue).trim()}"
 
-  // vendor/prism.js
-  var require_prism = __commonJS({
-    "vendor/prism.js"(exports, module) {
-      var _self = typeof window !== "undefined" ? window : typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope ? self : {};
-      var Prism = function(_self2) {
-        var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i;
-        var uniqueId = 0;
-        var plainTextGrammar = {};
-        var _ = {
-          /**
-           * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the
-           * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load
-           * additional languages or plugins yourself.
-           *
-           * By setting this value to `true`, Prism will not automatically highlight all code elements on the page.
-           *
-           * You obviously have to change this value before the automatic highlighting started. To do this, you can add an
-           * empty Prism object into the global scope before loading the Prism script like this:
-           *
-           * ```js
-           * window.Prism = window.Prism || {};
-           * Prism.manual = true;
-           * // add a new <script> to load Prism's script
-           * ```
-           *
-           * @default false
-           * @type {boolean}
-           * @memberof Prism
-           * @public
-           */
-          manual: _self2.Prism && _self2.Prism.manual,
-          /**
-           * By default, if Prism is in a web worker, it assumes that it is in a worker it created itself, so it uses
-           * `addEventListener` to communicate with its parent instance. However, if you're using Prism manually in your
-           * own worker, you don't want it to do this.
-           *
-           * By setting this value to `true`, Prism will not add its own listeners to the worker.
-           *
-           * You obviously have to change this value before Prism executes. To do this, you can add an
-           * empty Prism object into the global scope before loading the Prism script like this:
-           *
-           * ```js
-           * window.Prism = window.Prism || {};
-           * Prism.disableWorkerMessageHandler = true;
-           * // Load Prism's script
-           * ```
-           *
-           * @default false
-           * @type {boolean}
-           * @memberof Prism
-           * @public
-           */
-          disableWorkerMessageHandler: _self2.Prism && _self2.Prism.disableWorkerMessageHandler,
-          /**
-           * A namespace for utility methods.
-           *
-           * All function in this namespace that are not explicitly marked as _public_ are for __internal use only__ and may
-           * change or disappear at any time.
-           *
-           * @namespace
-           * @memberof Prism
-           */
-          util: {
-            encode: function encode(tokens) {
-              if (tokens instanceof Token) {
-                return new Token(tokens.type, encode(tokens.content), tokens.alias);
-              } else if (Array.isArray(tokens)) {
-                return tokens.map(encode);
-              } else {
-                return tokens.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/\u00a0/g, " ");
-              }
-            },
-            /**
-             * Returns the name of the type of the given value.
-             *
-             * @param {any} o
-             * @returns {string}
-             * @example
-             * type(null)      === 'Null'
-             * type(undefined) === 'Undefined'
-             * type(123)       === 'Number'
-             * type('foo')     === 'String'
-             * type(true)      === 'Boolean'
-             * type([1, 2])    === 'Array'
-             * type({})        === 'Object'
-             * type(String)    === 'Function'
-             * type(/abc+/)    === 'RegExp'
-             */
-            type: function(o) {
-              return Object.prototype.toString.call(o).slice(8, -1);
-            },
-            /**
-             * Returns a unique number for the given object. Later calls will still return the same number.
-             *
-             * @param {Object} obj
-             * @returns {number}
-             */
-            objId: function(obj) {
-              if (!obj["__id"]) {
-                Object.defineProperty(obj, "__id", { value: ++uniqueId });
-              }
-              return obj["__id"];
-            },
-            /**
-             * Creates a deep clone of the given object.
-             *
-             * The main intended use of this function is to clone language definitions.
-             *
-             * @param {T} o
-             * @param {Record<number, any>} [visited]
-             * @returns {T}
-             * @template T
-             */
-            clone: function deepClone(o, visited) {
-              visited = visited || {};
-              var clone2;
-              var id;
-              switch (_.util.type(o)) {
-                case "Object":
-                  id = _.util.objId(o);
-                  if (visited[id]) {
-                    return visited[id];
-                  }
-                  clone2 = /** @type {Record<string, any>} */
-                  {};
-                  visited[id] = clone2;
-                  for (var key in o) {
-                    if (o.hasOwnProperty(key)) {
-                      clone2[key] = deepClone(o[key], visited);
-                    }
-                  }
-                  return (
-                    /** @type {any} */
-                    clone2
-                  );
-                case "Array":
-                  id = _.util.objId(o);
-                  if (visited[id]) {
-                    return visited[id];
-                  }
-                  clone2 = [];
-                  visited[id] = clone2;
-                  /** @type {Array} */
-                  /** @type {any} */
-                  o.forEach(function(v, i) {
-                    clone2[i] = deepClone(v, visited);
-                  });
-                  return (
-                    /** @type {any} */
-                    clone2
-                  );
-                default:
-                  return o;
-              }
-            },
-            /**
-             * Returns the Prism language of the given element set by a `language-xxxx` or `lang-xxxx` class.
-             *
-             * If no language is set for the element or the element is `null` or `undefined`, `none` will be returned.
-             *
-             * @param {Element} element
-             * @returns {string}
-             */
-            getLanguage: function(element) {
-              while (element) {
-                var m = lang.exec(element.className);
-                if (m) {
-                  return m[1].toLowerCase();
-                }
-                element = element.parentElement;
-              }
-              return "none";
-            },
-            /**
-             * Sets the Prism `language-xxxx` class of the given element.
-             *
-             * @param {Element} element
-             * @param {string} language
-             * @returns {void}
-             */
-            setLanguage: function(element, language) {
-              element.className = element.className.replace(RegExp(lang, "gi"), "");
-              element.classList.add("language-" + language);
-            },
-            /**
-             * Returns the script element that is currently executing.
-             *
-             * This does __not__ work for line script element.
-             *
-             * @returns {HTMLScriptElement | null}
-             */
-            currentScript: function() {
-              if (typeof document === "undefined") {
-                return null;
-              }
-              if ("currentScript" in document && 1 < 2) {
-                return (
-                  /** @type {any} */
-                  document.currentScript
-                );
-              }
-              try {
-                throw new Error();
-              } catch (err) {
-                var src = (/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(err.stack) || [])[1];
-                if (src) {
-                  var scripts = document.getElementsByTagName("script");
-                  for (var i in scripts) {
-                    if (scripts[i].src == src) {
-                      return scripts[i];
-                    }
-                  }
-                }
-                return null;
-              }
-            },
-            /**
-             * Returns whether a given class is active for `element`.
-             *
-             * The class can be activated if `element` or one of its ancestors has the given class and it can be deactivated
-             * if `element` or one of its ancestors has the negated version of the given class. The _negated version_ of the
-             * given class is just the given class with a `no-` prefix.
-             *
-             * Whether the class is active is determined by the closest ancestor of `element` (where `element` itself is
-             * closest ancestor) that has the given class or the negated version of it. If neither `element` nor any of its
-             * ancestors have the given class or the negated version of it, then the default activation will be returned.
-             *
-             * In the paradoxical situation where the closest ancestor contains __both__ the given class and the negated
-             * version of it, the class is considered active.
-             *
-             * @param {Element} element
-             * @param {string} className
-             * @param {boolean} [defaultActivation=false]
-             * @returns {boolean}
-             */
-            isActive: function(element, className, defaultActivation) {
-              var no = "no-" + className;
-              while (element) {
-                var classList = element.classList;
-                if (classList.contains(className)) {
-                  return true;
-                }
-                if (classList.contains(no)) {
-                  return false;
-                }
-                element = element.parentElement;
-              }
-              return !!defaultActivation;
-            }
-          },
-          /**
-           * This namespace contains all currently loaded languages and the some helper functions to create and modify languages.
-           *
-           * @namespace
-           * @memberof Prism
-           * @public
-           */
-          languages: {
-            /**
-             * The grammar for plain, unformatted text.
-             */
-            plain: plainTextGrammar,
-            plaintext: plainTextGrammar,
-            text: plainTextGrammar,
-            txt: plainTextGrammar,
-            /**
-             * Creates a deep copy of the language with the given id and appends the given tokens.
-             *
-             * If a token in `redef` also appears in the copied language, then the existing token in the copied language
-             * will be overwritten at its original position.
-             *
-             * ## Best practices
-             *
-             * Since the position of overwriting tokens (token in `redef` that overwrite tokens in the copied language)
-             * doesn't matter, they can technically be in any order. However, this can be confusing to others that trying to
-             * understand the language definition because, normally, the order of tokens matters in Prism grammars.
-             *
-             * Therefore, it is encouraged to order overwriting tokens according to the positions of the overwritten tokens.
-             * Furthermore, all non-overwriting tokens should be placed after the overwriting ones.
-             *
-             * @param {string} id The id of the language to extend. This has to be a key in `Prism.languages`.
-             * @param {Grammar} redef The new tokens to append.
-             * @returns {Grammar} The new language created.
-             * @public
-             * @example
-             * Prism.languages['css-with-colors'] = Prism.languages.extend('css', {
-             *     // Prism.languages.css already has a 'comment' token, so this token will overwrite CSS' 'comment' token
-             *     // at its original position
-             *     'comment': { ... },
-             *     // CSS doesn't have a 'color' token, so this token will be appended
-             *     'color': /\b(?:red|green|blue)\b/
-             * });
-             */
-            extend: function(id, redef) {
-              var lang2 = _.util.clone(_.languages[id]);
-              for (var key in redef) {
-                lang2[key] = redef[key];
-              }
-              return lang2;
-            },
-            /**
-             * Inserts tokens _before_ another token in a language definition or any other grammar.
-             *
-             * ## Usage
-             *
-             * This helper method makes it easy to modify existing languages. For example, the CSS language definition
-             * not only defines CSS highlighting for CSS documents, but also needs to define highlighting for CSS embedded
-             * in HTML through `<style>` elements. To do this, it needs to modify `Prism.languages.markup` and add the
-             * appropriate tokens. However, `Prism.languages.markup` is a regular JavaScript object literal, so if you do
-             * this:
-             *
-             * ```js
-             * Prism.languages.markup.style = {
-             *     // token
-             * };
-             * ```
-             *
-             * then the `style` token will be added (and processed) at the end. `insertBefore` allows you to insert tokens
-             * before existing tokens. For the CSS example above, you would use it like this:
-             *
-             * ```js
-             * Prism.languages.insertBefore('markup', 'cdata', {
-             *     'style': {
-             *         // token
-             *     }
-             * });
-             * ```
-             *
-             * ## Special cases
-             *
-             * If the grammars of `inside` and `insert` have tokens with the same name, the tokens in `inside`'s grammar
-             * will be ignored.
-             *
-             * This behavior can be used to insert tokens after `before`:
-             *
-             * ```js
-             * Prism.languages.insertBefore('markup', 'comment', {
-             *     'comment': Prism.languages.markup.comment,
-             *     // tokens after 'comment'
-             * });
-             * ```
-             *
-             * ## Limitations
-             *
-             * The main problem `insertBefore` has to solve is iteration order. Since ES2015, the iteration order for object
-             * properties is guaranteed to be the insertion order (except for integer keys) but some browsers behave
-             * differently when keys are deleted and re-inserted. So `insertBefore` can't be implemented by temporarily
-             * deleting properties which is necessary to insert at arbitrary positions.
-             *
-             * To solve this problem, `insertBefore` doesn't actually insert the given tokens into the target object.
-             * Instead, it will create a new object and replace all references to the target object with the new one. This
-             * can be done without temporarily deleting properties, so the iteration order is well-defined.
-             *
-             * However, only references that can be reached from `Prism.languages` or `insert` will be replaced. I.e. if
-             * you hold the target object in a variable, then the value of the variable will not change.
-             *
-             * ```js
-             * var oldMarkup = Prism.languages.markup;
-             * var newMarkup = Prism.languages.insertBefore('markup', 'comment', { ... });
-             *
-             * assert(oldMarkup !== Prism.languages.markup);
-             * assert(newMarkup === Prism.languages.markup);
-             * ```
-             *
-             * @param {string} inside The property of `root` (e.g. a language id in `Prism.languages`) that contains the
-             * object to be modified.
-             * @param {string} before The key to insert before.
-             * @param {Grammar} insert An object containing the key-value pairs to be inserted.
-             * @param {Object<string, any>} [root] The object containing `inside`, i.e. the object that contains the
-             * object to be modified.
-             *
-             * Defaults to `Prism.languages`.
-             * @returns {Grammar} The new grammar object.
-             * @public
-             */
-            insertBefore: function(inside, before, insert, root) {
-              root = root || /** @type {any} */
-              _.languages;
-              var grammar = root[inside];
-              var ret = {};
-              for (var token in grammar) {
-                if (grammar.hasOwnProperty(token)) {
-                  if (token == before) {
-                    for (var newToken in insert) {
-                      if (insert.hasOwnProperty(newToken)) {
-                        ret[newToken] = insert[newToken];
-                      }
-                    }
-                  }
-                  if (!insert.hasOwnProperty(token)) {
-                    ret[token] = grammar[token];
-                  }
-                }
-              }
-              var old = root[inside];
-              root[inside] = ret;
-              _.languages.DFS(_.languages, function(key, value) {
-                if (value === old && key != inside) {
-                  this[key] = ret;
-                }
-              });
-              return ret;
-            },
-            // Traverse a language definition with Depth First Search
-            DFS: function DFS(o, callback, type, visited) {
-              visited = visited || {};
-              var objId = _.util.objId;
-              for (var i in o) {
-                if (o.hasOwnProperty(i)) {
-                  callback.call(o, i, o[i], type || i);
-                  var property = o[i];
-                  var propertyType = _.util.type(property);
-                  if (propertyType === "Object" && !visited[objId(property)]) {
-                    visited[objId(property)] = true;
-                    DFS(property, callback, null, visited);
-                  } else if (propertyType === "Array" && !visited[objId(property)]) {
-                    visited[objId(property)] = true;
-                    DFS(property, callback, i, visited);
-                  }
-                }
-              }
-            }
-          },
-          plugins: {},
-          /**
-           * This is the most high-level function in Prism’s API.
-           * It fetches all the elements that have a `.language-xxxx` class and then calls {@link Prism.highlightElement} on
-           * each one of them.
-           *
-           * This is equivalent to `Prism.highlightAllUnder(document, async, callback)`.
-           *
-           * @param {boolean} [async=false] Same as in {@link Prism.highlightAllUnder}.
-           * @param {HighlightCallback} [callback] Same as in {@link Prism.highlightAllUnder}.
-           * @memberof Prism
-           * @public
-           */
-          highlightAll: function(async, callback) {
-            _.highlightAllUnder(document, async, callback);
-          },
-          /**
-           * Fetches all the descendants of `container` that have a `.language-xxxx` class and then calls
-           * {@link Prism.highlightElement} on each one of them.
-           *
-           * The following hooks will be run:
-           * 1. `before-highlightall`
-           * 2. `before-all-elements-highlight`
-           * 3. All hooks of {@link Prism.highlightElement} for each element.
-           *
-           * @param {ParentNode} container The root element, whose descendants that have a `.language-xxxx` class will be highlighted.
-           * @param {boolean} [async=false] Whether each element is to be highlighted asynchronously using Web Workers.
-           * @param {HighlightCallback} [callback] An optional callback to be invoked on each element after its highlighting is done.
-           * @memberof Prism
-           * @public
-           */
-          highlightAllUnder: function(container, async, callback) {
-            var env = {
-              callback,
-              container,
-              selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
-            };
-            _.hooks.run("before-highlightall", env);
-            env.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector));
-            _.hooks.run("before-all-elements-highlight", env);
-            for (var i = 0, element; element = env.elements[i++]; ) {
-              _.highlightElement(element, async === true, env.callback);
-            }
-          },
-          /**
-           * Highlights the code inside a single element.
-           *
-           * The following hooks will be run:
-           * 1. `before-sanity-check`
-           * 2. `before-highlight`
-           * 3. All hooks of {@link Prism.highlight}. These hooks will be run by an asynchronous worker if `async` is `true`.
-           * 4. `before-insert`
-           * 5. `after-highlight`
-           * 6. `complete`
-           *
-           * Some the above hooks will be skipped if the element doesn't contain any text or there is no grammar loaded for
-           * the element's language.
-           *
-           * @param {Element} element The element containing the code.
-           * It must have a class of `language-xxxx` to be processed, where `xxxx` is a valid language identifier.
-           * @param {boolean} [async=false] Whether the element is to be highlighted asynchronously using Web Workers
-           * to improve performance and avoid blocking the UI when highlighting very large chunks of code. This option is
-           * [disabled by default](https://prismjs.com/faq.html#why-is-asynchronous-highlighting-disabled-by-default).
-           *
-           * Note: All language definitions required to highlight the code must be included in the main `prism.js` file for
-           * asynchronous highlighting to work. You can build your own bundle on the
-           * [Download page](https://prismjs.com/download.html).
-           * @param {HighlightCallback} [callback] An optional callback to be invoked after the highlighting is done.
-           * Mostly useful when `async` is `true`, since in that case, the highlighting is done asynchronously.
-           * @memberof Prism
-           * @public
-           */
-          highlightElement: function(element, async, callback) {
-            var language = _.util.getLanguage(element);
-            var grammar = _.languages[language];
-            _.util.setLanguage(element, language);
-            var parent = element.parentElement;
-            if (parent && parent.nodeName.toLowerCase() === "pre") {
-              _.util.setLanguage(parent, language);
-            }
-            var code = element.textContent;
-            var env = {
-              element,
-              language,
-              grammar,
-              code
-            };
-            function insertHighlightedCode(highlightedCode) {
-              env.highlightedCode = highlightedCode;
-              _.hooks.run("before-insert", env);
-              env.element.innerHTML = env.highlightedCode;
-              _.hooks.run("after-highlight", env);
-              _.hooks.run("complete", env);
-              callback && callback.call(env.element);
-            }
-            _.hooks.run("before-sanity-check", env);
-            parent = env.element.parentElement;
-            if (parent && parent.nodeName.toLowerCase() === "pre" && !parent.hasAttribute("tabindex")) {
-              parent.setAttribute("tabindex", "0");
-            }
-            if (!env.code) {
-              _.hooks.run("complete", env);
-              callback && callback.call(env.element);
-              return;
-            }
-            _.hooks.run("before-highlight", env);
-            if (!env.grammar) {
-              insertHighlightedCode(_.util.encode(env.code));
-              return;
-            }
-            if (async && _self2.Worker) {
-              var worker = new Worker(_.filename);
-              worker.onmessage = function(evt) {
-                insertHighlightedCode(evt.data);
-              };
-              worker.postMessage(JSON.stringify({
-                language: env.language,
-                code: env.code,
-                immediateClose: true
-              }));
-            } else {
-              insertHighlightedCode(_.highlight(env.code, env.grammar, env.language));
-            }
-          },
-          /**
-           * Low-level function, only use if you know what you’re doing. It accepts a string of text as input
-           * and the language definitions to use, and returns a string with the HTML produced.
-           *
-           * The following hooks will be run:
-           * 1. `before-tokenize`
-           * 2. `after-tokenize`
-           * 3. `wrap`: On each {@link Token}.
-           *
-           * @param {string} text A string with the code to be highlighted.
-           * @param {Grammar} grammar An object containing the tokens to use.
-           *
-           * Usually a language definition like `Prism.languages.markup`.
-           * @param {string} language The name of the language definition passed to `grammar`.
-           * @returns {string} The highlighted HTML.
-           * @memberof Prism
-           * @public
-           * @example
-           * Prism.highlight('var foo = true;', Prism.languages.javascript, 'javascript');
-           */
-          highlight: function(text, grammar, language) {
-            var env = {
-              code: text,
-              grammar,
-              language
-            };
-            _.hooks.run("before-tokenize", env);
-            if (!env.grammar) {
-              throw new Error('The language "' + env.language + '" has no grammar.');
-            }
-            env.tokens = _.tokenize(env.code, env.grammar);
-            _.hooks.run("after-tokenize", env);
-            return Token.stringify(_.util.encode(env.tokens), env.language);
-          },
-          /**
-           * This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input
-           * and the language definitions to use, and returns an array with the tokenized code.
-           *
-           * When the language definition includes nested tokens, the function is called recursively on each of these tokens.
-           *
-           * This method could be useful in other contexts as well, as a very crude parser.
-           *
-           * @param {string} text A string with the code to be highlighted.
-           * @param {Grammar} grammar An object containing the tokens to use.
-           *
-           * Usually a language definition like `Prism.languages.markup`.
-           * @returns {TokenStream} An array of strings and tokens, a token stream.
-           * @memberof Prism
-           * @public
-           * @example
-           * let code = `var foo = 0;`;
-           * let tokens = Prism.tokenize(code, Prism.languages.javascript);
-           * tokens.forEach(token => {
-           *     if (token instanceof Prism.Token && token.type === 'number') {
-           *         console.log(`Found numeric literal: ${token.content}`);
-           *     }
-           * });
-           */
-          tokenize: function(text, grammar) {
-            var rest = grammar.rest;
-            if (rest) {
-              for (var token in rest) {
-                grammar[token] = rest[token];
-              }
-              delete grammar.rest;
-            }
-            var tokenList = new LinkedList();
-            addAfter(tokenList, tokenList.head, text);
-            matchGrammar(text, tokenList, grammar, tokenList.head, 0);
-            return toArray(tokenList);
-          },
-          /**
-           * @namespace
-           * @memberof Prism
-           * @public
-           */
-          hooks: {
-            all: {},
-            /**
-             * Adds the given callback to the list of callbacks for the given hook.
-             *
-             * The callback will be invoked when the hook it is registered for is run.
-             * Hooks are usually directly run by a highlight function but you can also run hooks yourself.
-             *
-             * One callback function can be registered to multiple hooks and the same hook multiple times.
-             *
-             * @param {string} name The name of the hook.
-             * @param {HookCallback} callback The callback function which is given environment variables.
-             * @public
-             */
-            add: function(name, callback) {
-              var hooks = _.hooks.all;
-              hooks[name] = hooks[name] || [];
-              hooks[name].push(callback);
-            },
-            /**
-             * Runs a hook invoking all registered callbacks with the given environment variables.
-             *
-             * Callbacks will be invoked synchronously and in the order in which they were registered.
-             *
-             * @param {string} name The name of the hook.
-             * @param {Object<string, any>} env The environment variables of the hook passed to all callbacks registered.
-             * @public
-             */
-            run: function(name, env) {
-              var callbacks = _.hooks.all[name];
-              if (!callbacks || !callbacks.length) {
-                return;
-              }
-              for (var i = 0, callback; callback = callbacks[i++]; ) {
-                callback(env);
-              }
-            }
-          },
-          Token
-        };
-        _self2.Prism = _;
-        function Token(type, content, alias, matchedStr) {
-          this.type = type;
-          this.content = content;
-          this.alias = alias;
-          this.length = (matchedStr || "").length | 0;
-        }
-        Token.stringify = function stringify(o, language) {
-          if (typeof o == "string") {
-            return o;
-          }
-          if (Array.isArray(o)) {
-            var s = "";
-            o.forEach(function(e) {
-              s += stringify(e, language);
-            });
-            return s;
-          }
-          var env = {
-            type: o.type,
-            content: stringify(o.content, language),
-            tag: "span",
-            classes: ["token", o.type],
-            attributes: {},
-            language
-          };
-          var aliases = o.alias;
-          if (aliases) {
-            if (Array.isArray(aliases)) {
-              Array.prototype.push.apply(env.classes, aliases);
-            } else {
-              env.classes.push(aliases);
-            }
-          }
-          _.hooks.run("wrap", env);
-          var attributes = "";
-          for (var name in env.attributes) {
-            attributes += " " + name + '="' + (env.attributes[name] || "").replace(/"/g, "&quot;") + '"';
-          }
-          return "<" + env.tag + ' class="' + env.classes.join(" ") + '"' + attributes + ">" + env.content + "</" + env.tag + ">";
-        };
-        function matchPattern(pattern, pos, text, lookbehind) {
-          pattern.lastIndex = pos;
-          var match = pattern.exec(text);
-          if (match && lookbehind && match[1]) {
-            var lookbehindLength = match[1].length;
-            match.index += lookbehindLength;
-            match[0] = match[0].slice(lookbehindLength);
-          }
-          return match;
-        }
-        function matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) {
-          for (var token in grammar) {
-            if (!grammar.hasOwnProperty(token) || !grammar[token]) {
-              continue;
-            }
-            var patterns = grammar[token];
-            patterns = Array.isArray(patterns) ? patterns : [patterns];
-            for (var j = 0; j < patterns.length; ++j) {
-              if (rematch && rematch.cause == token + "," + j) {
-                return;
-              }
-              var patternObj = patterns[j];
-              var inside = patternObj.inside;
-              var lookbehind = !!patternObj.lookbehind;
-              var greedy = !!patternObj.greedy;
-              var alias = patternObj.alias;
-              if (greedy && !patternObj.pattern.global) {
-                var flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0];
-                patternObj.pattern = RegExp(patternObj.pattern.source, flags + "g");
-              }
-              var pattern = patternObj.pattern || patternObj;
-              for (var currentNode = startNode.next, pos = startPos; currentNode !== tokenList.tail; pos += currentNode.value.length, currentNode = currentNode.next) {
-                if (rematch && pos >= rematch.reach) {
-                  break;
-                }
-                var str = currentNode.value;
-                if (tokenList.length > text.length) {
-                  return;
-                }
-                if (str instanceof Token) {
-                  continue;
-                }
-                var removeCount = 1;
-                var match;
-                if (greedy) {
-                  match = matchPattern(pattern, pos, text, lookbehind);
-                  if (!match || match.index >= text.length) {
-                    break;
-                  }
-                  var from = match.index;
-                  var to = match.index + match[0].length;
-                  var p = pos;
-                  p += currentNode.value.length;
-                  while (from >= p) {
-                    currentNode = currentNode.next;
-                    p += currentNode.value.length;
-                  }
-                  p -= currentNode.value.length;
-                  pos = p;
-                  if (currentNode.value instanceof Token) {
-                    continue;
-                  }
-                  for (var k = currentNode; k !== tokenList.tail && (p < to || typeof k.value === "string"); k = k.next) {
-                    removeCount++;
-                    p += k.value.length;
-                  }
-                  removeCount--;
-                  str = text.slice(pos, p);
-                  match.index -= pos;
-                } else {
-                  match = matchPattern(pattern, 0, str, lookbehind);
-                  if (!match) {
-                    continue;
-                  }
-                }
-                var from = match.index;
-                var matchStr = match[0];
-                var before = str.slice(0, from);
-                var after = str.slice(from + matchStr.length);
-                var reach = pos + str.length;
-                if (rematch && reach > rematch.reach) {
-                  rematch.reach = reach;
-                }
-                var removeFrom = currentNode.prev;
-                if (before) {
-                  removeFrom = addAfter(tokenList, removeFrom, before);
-                  pos += before.length;
-                }
-                removeRange(tokenList, removeFrom, removeCount);
-                var wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr);
-                currentNode = addAfter(tokenList, removeFrom, wrapped);
-                if (after) {
-                  addAfter(tokenList, currentNode, after);
-                }
-                if (removeCount > 1) {
-                  var nestedRematch = {
-                    cause: token + "," + j,
-                    reach
-                  };
-                  matchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch);
-                  if (rematch && nestedRematch.reach > rematch.reach) {
-                    rematch.reach = nestedRematch.reach;
-                  }
-                }
-              }
-            }
-          }
-        }
-        function LinkedList() {
-          var head = { value: null, prev: null, next: null };
-          var tail = { value: null, prev: head, next: null };
-          head.next = tail;
-          this.head = head;
-          this.tail = tail;
-          this.length = 0;
-        }
-        function addAfter(list, node, value) {
-          var next = node.next;
-          var newNode = { value, prev: node, next };
-          node.next = newNode;
-          next.prev = newNode;
-          list.length++;
-          return newNode;
-        }
-        function removeRange(list, node, count) {
-          var next = node.next;
-          for (var i = 0; i < count && next !== list.tail; i++) {
-            next = next.next;
-          }
-          node.next = next;
-          next.prev = node;
-          list.length -= i;
-        }
-        function toArray(list) {
-          var array = [];
-          var node = list.head.next;
-          while (node !== list.tail) {
-            array.push(node.value);
-            node = node.next;
-          }
-          return array;
-        }
-        if (!_self2.document) {
-          if (!_self2.addEventListener) {
-            return _;
-          }
-          if (!_.disableWorkerMessageHandler) {
-            _self2.addEventListener("message", function(evt) {
-              var message = JSON.parse(evt.data);
-              var lang2 = message.language;
-              var code = message.code;
-              var immediateClose = message.immediateClose;
-              _self2.postMessage(_.highlight(code, _.languages[lang2], lang2));
-              if (immediateClose) {
-                _self2.close();
-              }
-            }, false);
-          }
-          return _;
-        }
-        var script = _.util.currentScript();
-        if (script) {
-          _.filename = script.src;
-          if (script.hasAttribute("data-manual")) {
-            _.manual = true;
-          }
-        }
-        function highlightAutomaticallyCallback() {
-          if (!_.manual) {
-            _.highlightAll();
-          }
-        }
-        if (!_.manual) {
-          var readyState = document.readyState;
-          if (readyState === "loading" || readyState === "interactive" && script && script.defer) {
-            document.addEventListener("DOMContentLoaded", highlightAutomaticallyCallback);
-          } else {
-            if (window.requestAnimationFrame) {
-              window.requestAnimationFrame(highlightAutomaticallyCallback);
-            } else {
-              window.setTimeout(highlightAutomaticallyCallback, 16);
-            }
-          }
-        }
-        return _;
-      }(_self);
-      if (typeof module !== "undefined" && module.exports) {
-        module.exports = Prism;
-      }
-      if (typeof global !== "undefined") {
-        global.Prism = Prism;
-      }
-      Prism.languages.markup = {
-        "comment": {
-          pattern: /<!--(?:(?!<!--)[\s\S])*?-->/,
-          greedy: true
-        },
-        "prolog": {
-          pattern: /<\?[\s\S]+?\?>/,
-          greedy: true
-        },
-        "doctype": {
-          // https://www.w3.org/TR/xml/#NT-doctypedecl
-          pattern: /<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,
-          greedy: true,
-          inside: {
-            "internal-subset": {
-              pattern: /(^[^\[]*\[)[\s\S]+(?=\]>$)/,
-              lookbehind: true,
-              greedy: true,
-              inside: null
-              // see below
-            },
-            "string": {
-              pattern: /"[^"]*"|'[^']*'/,
-              greedy: true
-            },
-            "punctuation": /^<!|>$|[[\]]/,
-            "doctype-tag": /^DOCTYPE/i,
-            "name": /[^\s<>'"]+/
-          }
-        },
-        "cdata": {
-          pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
-          greedy: true
-        },
-        "tag": {
-          pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,
-          greedy: true,
-          inside: {
-            "tag": {
-              pattern: /^<\/?[^\s>\/]+/,
-              inside: {
-                "punctuation": /^<\/?/,
-                "namespace": /^[^\s>\/:]+:/
-              }
-            },
-            "special-attr": [],
-            "attr-value": {
-              pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,
-              inside: {
-                "punctuation": [
-                  {
-                    pattern: /^=/,
-                    alias: "attr-equals"
-                  },
-                  {
-                    pattern: /^(\s*)["']|["']$/,
-                    lookbehind: true
-                  }
-                ]
-              }
-            },
-            "punctuation": /\/?>/,
-            "attr-name": {
-              pattern: /[^\s>\/]+/,
-              inside: {
-                "namespace": /^[^\s>\/:]+:/
-              }
-            }
-          }
-        },
-        "entity": [
-          {
-            pattern: /&[\da-z]{1,8};/i,
-            alias: "named-entity"
-          },
-          /&#x?[\da-f]{1,8};/i
-        ]
-      };
-      Prism.languages.markup["tag"].inside["attr-value"].inside["entity"] = Prism.languages.markup["entity"];
-      Prism.languages.markup["doctype"].inside["internal-subset"].inside = Prism.languages.markup;
-      Prism.hooks.add("wrap", function(env) {
-        if (env.type === "entity") {
-          env.attributes["title"] = env.content.replace(/&amp;/, "&");
-        }
-      });
-      Object.defineProperty(Prism.languages.markup.tag, "addInlined", {
-        /**
-         * Adds an inlined language to markup.
-         *
-         * An example of an inlined language is CSS with `<style>` tags.
-         *
-         * @param {string} tagName The name of the tag that contains the inlined language. This name will be treated as
-         * case insensitive.
-         * @param {string} lang The language key.
-         * @example
-         * addInlined('style', 'css');
-         */
-        value: function addInlined(tagName, lang) {
-          var includedCdataInside = {};
-          includedCdataInside["language-" + lang] = {
-            pattern: /(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,
-            lookbehind: true,
-            inside: Prism.languages[lang]
-          };
-          includedCdataInside["cdata"] = /^<!\[CDATA\[|\]\]>$/i;
-          var inside = {
-            "included-cdata": {
-              pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
-              inside: includedCdataInside
-            }
-          };
-          inside["language-" + lang] = {
-            pattern: /[\s\S]+/,
-            inside: Prism.languages[lang]
-          };
-          var def = {};
-          def[tagName] = {
-            pattern: RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g, function() {
-              return tagName;
-            }), "i"),
-            lookbehind: true,
-            greedy: true,
-            inside
-          };
-          Prism.languages.insertBefore("markup", "cdata", def);
-        }
-      });
-      Object.defineProperty(Prism.languages.markup.tag, "addAttribute", {
-        /**
-         * Adds an pattern to highlight languages embedded in HTML attributes.
-         *
-         * An example of an inlined language is CSS with `style` attributes.
-         *
-         * @param {string} attrName The name of the tag that contains the inlined language. This name will be treated as
-         * case insensitive.
-         * @param {string} lang The language key.
-         * @example
-         * addAttribute('style', 'css');
-         */
-        value: function(attrName, lang) {
-          Prism.languages.markup.tag.inside["special-attr"].push({
-            pattern: RegExp(
-              /(^|["'\s])/.source + "(?:" + attrName + ")" + /\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,
-              "i"
-            ),
-            lookbehind: true,
-            inside: {
-              "attr-name": /^[^\s=]+/,
-              "attr-value": {
-                pattern: /=[\s\S]+/,
-                inside: {
-                  "value": {
-                    pattern: /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,
-                    lookbehind: true,
-                    alias: [lang, "language-" + lang],
-                    inside: Prism.languages[lang]
-                  },
-                  "punctuation": [
-                    {
-                      pattern: /^=/,
-                      alias: "attr-equals"
-                    },
-                    /"|'/
-                  ]
-                }
-              }
-            }
-          });
-        }
-      });
-      Prism.languages.html = Prism.languages.markup;
-      Prism.languages.mathml = Prism.languages.markup;
-      Prism.languages.svg = Prism.languages.markup;
-      Prism.languages.xml = Prism.languages.extend("markup", {});
-      Prism.languages.ssml = Prism.languages.xml;
-      Prism.languages.atom = Prism.languages.xml;
-      Prism.languages.rss = Prism.languages.xml;
-      (function(Prism2) {
-        var string = /(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;
-        Prism2.languages.css = {
-          "comment": /\/\*[\s\S]*?\*\//,
-          "atrule": {
-            pattern: RegExp("@[\\w-](?:" + /[^;{\s"']|\s+(?!\s)/.source + "|" + string.source + ")*?" + /(?:;|(?=\s*\{))/.source),
-            inside: {
-              "rule": /^@[\w-]+/,
-              "selector-function-argument": {
-                pattern: /(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,
-                lookbehind: true,
-                alias: "selector"
-              },
-              "keyword": {
-                pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/,
-                lookbehind: true
-              }
-              // See rest below
-            }
-          },
-          "url": {
-            // https://drafts.csswg.org/css-values-3/#urls
-            pattern: RegExp("\\burl\\((?:" + string.source + "|" + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + ")\\)", "i"),
-            greedy: true,
-            inside: {
-              "function": /^url/i,
-              "punctuation": /^\(|\)$/,
-              "string": {
-                pattern: RegExp("^" + string.source + "$"),
-                alias: "url"
-              }
-            }
-          },
-          "selector": {
-            pattern: RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|` + string.source + ")*(?=\\s*\\{)"),
-            lookbehind: true
-          },
-          "string": {
-            pattern: string,
-            greedy: true
-          },
-          "property": {
-            pattern: /(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,
-            lookbehind: true
-          },
-          "important": /!important\b/i,
-          "function": {
-            pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,
-            lookbehind: true
-          },
-          "punctuation": /[(){};:,]/
-        };
-        Prism2.languages.css["atrule"].inside.rest = Prism2.languages.css;
-        var markup = Prism2.languages.markup;
-        if (markup) {
-          markup.tag.addInlined("style", "css");
-          markup.tag.addAttribute("style", "css");
-        }
-      })(Prism);
-      Prism.languages.clike = {
-        "comment": [
-          {
-            pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
-            lookbehind: true,
-            greedy: true
-          },
-          {
-            pattern: /(^|[^\\:])\/\/.*/,
-            lookbehind: true,
-            greedy: true
-          }
-        ],
-        "string": {
-          pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
-          greedy: true
-        },
-        "class-name": {
-          pattern: /(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,
-          lookbehind: true,
-          inside: {
-            "punctuation": /[.\\]/
-          }
-        },
-        "keyword": /\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "function": /\b\w+(?=\()/,
-        "number": /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
-        "operator": /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,
-        "punctuation": /[{}[\];(),.:]/
-      };
-      Prism.languages.javascript = Prism.languages.extend("clike", {
-        "class-name": [
-          Prism.languages.clike["class-name"],
-          {
-            pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,
-            lookbehind: true
-          }
-        ],
-        "keyword": [
-          {
-            pattern: /((?:^|\})\s*)catch\b/,
-            lookbehind: true
-          },
-          {
-            pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,
-            lookbehind: true
-          }
-        ],
-        // Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)
-        "function": /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,
-        "number": {
-          pattern: RegExp(
-            /(^|[^\w$])/.source + "(?:" + // constant
-            (/NaN|Infinity/.source + "|" + // binary integer
-            /0[bB][01]+(?:_[01]+)*n?/.source + "|" + // octal integer
-            /0[oO][0-7]+(?:_[0-7]+)*n?/.source + "|" + // hexadecimal integer
-            /0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source + "|" + // decimal bigint
-            /\d+(?:_\d+)*n/.source + "|" + // decimal number (integer or float) but no bigint
-            /(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source) + ")" + /(?![\w$])/.source
-          ),
-          lookbehind: true
-        },
-        "operator": /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/
-      });
-      Prism.languages.javascript["class-name"][0].pattern = /(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;
-      Prism.languages.insertBefore("javascript", "keyword", {
-        "regex": {
-          pattern: RegExp(
-            // lookbehind
-            // eslint-disable-next-line regexp/no-dupe-characters-character-class
-            /((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source + // Regex pattern:
-            // There are 2 regex patterns here. The RegExp set notation proposal added support for nested character
-            // classes if the `v` flag is present. Unfortunately, nested CCs are both context-free and incompatible
-            // with the only syntax, so we have to define 2 different regex patterns.
-            /\//.source + "(?:" + /(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source + "|" + // `v` flag syntax. This supports 3 levels of nested character classes.
-            /(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source + ")" + // lookahead
-            /(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source
-          ),
-          lookbehind: true,
-          greedy: true,
-          inside: {
-            "regex-source": {
-              pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/,
-              lookbehind: true,
-              alias: "language-regex",
-              inside: Prism.languages.regex
-            },
-            "regex-delimiter": /^\/|\/$/,
-            "regex-flags": /^[a-z]+$/
-          }
-        },
-        // This must be declared before keyword because we use "function" inside the look-forward
-        "function-variable": {
-          pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,
-          alias: "function"
-        },
-        "parameter": [
-          {
-            pattern: /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,
-            lookbehind: true,
-            inside: Prism.languages.javascript
-          },
-          {
-            pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,
-            lookbehind: true,
-            inside: Prism.languages.javascript
-          },
-          {
-            pattern: /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,
-            lookbehind: true,
-            inside: Prism.languages.javascript
-          },
-          {
-            pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,
-            lookbehind: true,
-            inside: Prism.languages.javascript
-          }
-        ],
-        "constant": /\b[A-Z](?:[A-Z_]|\dx?)*\b/
-      });
-      Prism.languages.insertBefore("javascript", "string", {
-        "hashbang": {
-          pattern: /^#!.*/,
-          greedy: true,
-          alias: "comment"
-        },
-        "template-string": {
-          pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,
-          greedy: true,
-          inside: {
-            "template-punctuation": {
-              pattern: /^`|`$/,
-              alias: "string"
-            },
-            "interpolation": {
-              pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
-              lookbehind: true,
-              inside: {
-                "interpolation-punctuation": {
-                  pattern: /^\$\{|\}$/,
-                  alias: "punctuation"
-                },
-                rest: Prism.languages.javascript
-              }
-            },
-            "string": /[\s\S]+/
-          }
-        },
-        "string-property": {
-          pattern: /((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,
-          lookbehind: true,
-          greedy: true,
-          alias: "property"
-        }
-      });
-      Prism.languages.insertBefore("javascript", "operator", {
-        "literal-property": {
-          pattern: /((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,
-          lookbehind: true,
-          alias: "property"
-        }
-      });
-      if (Prism.languages.markup) {
-        Prism.languages.markup.tag.addInlined("script", "javascript");
-        Prism.languages.markup.tag.addAttribute(
-          /on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,
-          "javascript"
-        );
-      }
-      Prism.languages.js = Prism.languages.javascript;
-      Prism.languages.abap = {
-        "comment": /^\*.*/m,
-        "string": /(`|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
-        "string-template": {
-          pattern: /([|}])(?:\\.|[^\\|{\r\n])*(?=[|{])/,
-          lookbehind: true,
-          alias: "string"
-        },
-        /* End Of Line comments should not interfere with strings when the
-        quote character occurs within them. We assume a string being highlighted
-        inside an EOL comment is more acceptable than the opposite.
-        */
-        "eol-comment": {
-          pattern: /(^|\s)".*/m,
-          lookbehind: true,
-          alias: "comment"
-        },
-        "keyword": {
-          pattern: /(\s|\.|^)(?:\*-INPUT|\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN|BETWEEN|BIG|BINARY|BINDING|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHAR-TO-HEX|CHARACTER|CHARLEN|CHECK|CHECKBOX|CIRCULAR|CI_|CLASS|CLASS-CODING|CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE|CN|CNT|CO|COALESCE|CODE|CODING|COLLECT|COLOR|COLUMN|COLUMNS|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE|DAYLIGHT|DBMAXLEN|DD\/MM\/YY|DD\/MM\/YYYY|DDMMYY|DEALLOCATE|DECIMALS|DECIMAL_SHIFT|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO|E|EACH|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|END-ENHANCEMENT-SECTION|END-LINES|END-OF-DEFINITION|END-OF-FILE|END-OF-PAGE|END-OF-SELECTION|ENDAT|ENDCASE|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|ENDEXEC|ENDFOR|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|ENHANCEMENTS|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUAL|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTION-TABLE|EXCEPTIONS|EXCLUDE|EXCLUDING|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD|FIELD-GROUPS|FIELD-SYMBOL|FIELD-SYMBOLS|FIELDS|FILE|FILTER|FILTER-TABLE|FILTERS|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTION-POOL|FUNCTIONALITY|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT|GREATER|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEAD-LINES|HEADER|HEADERS|HEADING|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS|ISO|ITERATOR|ITNO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS|LEFTSPACE|LEGACY|LENGTH|LESS|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINE-SELECTION|LINE-SIZE|LINEFEED|LINES|LIST|LIST-PROCESSING|LISTBOX|LITTLE|LLANG|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG-POINT|LOG10|LOGFILE|LOGICAL|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM\/DD\/YY|MM\/DD\/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NO-DISPLAY|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NO-SCROLLING|NO-SIGN|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NODE|NODES|NON-UNICODE|NON-UNIQUE|NOT|NP|NS|NULL|NUMBER|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE|PAGES|PARAMETER|PARAMETER-TABLE|PARAMETERS|PART|PARTIALLY|PATTERN|PERCENTAGE|PERFORM|PERFORMING|PERSON|PF|PF-STATUS|PINK|PLACES|POOL|POSITION|POS_HIGH|POS_LOW|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES|RAW|READ|READ-ONLY|READER|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECT-OPTIONS|SELECTION|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECTIONS|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|START-OF-SELECTION|STARTING|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP|TIMEZONE|TITLE|TITLE-LINES|TITLEBAR|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITH-TITLE|WITHOUT|WORD|WORK|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE)(?![\w-])/i,
-          lookbehind: true
-        },
-        /* Numbers can be only integers. Decimal or Hex appear only as strings */
-        "number": /\b\d+\b/,
-        /* Operators must always be surrounded by whitespace, they cannot be put
-        adjacent to operands.
-        */
-        "operator": {
-          pattern: /(\s)(?:\*\*?|<[=>]?|>=?|\?=|[-+\/=])(?=\s)/,
-          lookbehind: true
-        },
-        "string-operator": {
-          pattern: /(\s)&&?(?=\s)/,
-          lookbehind: true,
-          /* The official editor highlights */
-          alias: "keyword"
-        },
-        "token-operator": [{
-          /* Special operators used to access structure components, class methods/attributes, etc. */
-          pattern: /(\w)(?:->?|=>|[~|{}])(?=\w)/,
-          lookbehind: true,
-          alias: "punctuation"
-        }, {
-          /* Special tokens used do delimit string templates */
-          pattern: /[|{}]/,
-          alias: "punctuation"
-        }],
-        "punctuation": /[,.:()]/
-      };
-      (function(Prism2) {
-        var coreRules = "(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)";
-        Prism2.languages.abnf = {
-          "comment": /;.*/,
-          "string": {
-            pattern: /(?:%[is])?"[^"\n\r]*"/,
-            greedy: true,
-            inside: {
-              "punctuation": /^%[is]/
-            }
-          },
-          "range": {
-            pattern: /%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,
-            alias: "number"
-          },
-          "terminal": {
-            pattern: /%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,
-            alias: "number"
-          },
-          "repetition": {
-            pattern: /(^|[^\w-])(?:\d*\*\d*|\d+)/,
-            lookbehind: true,
-            alias: "operator"
-          },
-          "definition": {
-            pattern: /(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,
-            lookbehind: true,
-            alias: "keyword",
-            inside: {
-              "punctuation": /<|>/
-            }
-          },
-          "core-rule": {
-            pattern: RegExp("(?:(^|[^<\\w-])" + coreRules + "|<" + coreRules + ">)(?![\\w-])", "i"),
-            lookbehind: true,
-            alias: ["rule", "constant"],
-            inside: {
-              "punctuation": /<|>/
-            }
-          },
-          "rule": {
-            pattern: /(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,
-            lookbehind: true,
-            inside: {
-              "punctuation": /<|>/
-            }
-          },
-          "operator": /=\/?|\//,
-          "punctuation": /[()\[\]]/
-        };
-      })(Prism);
-      Prism.languages.actionscript = Prism.languages.extend("javascript", {
-        "keyword": /\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,
-        "operator": /\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/
-      });
-      Prism.languages.actionscript["class-name"].alias = "function";
-      delete Prism.languages.actionscript["parameter"];
-      delete Prism.languages.actionscript["literal-property"];
-      if (Prism.languages.markup) {
-        Prism.languages.insertBefore("actionscript", "string", {
-          "xml": {
-            pattern: /(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,
-            lookbehind: true,
-            inside: Prism.languages.markup
-          }
-        });
-      }
-      Prism.languages.ada = {
-        "comment": /--.*/,
-        "string": /"(?:""|[^"\r\f\n])*"/,
-        "number": [
-          {
-            pattern: /\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i
-          },
-          {
-            pattern: /\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i
-          }
-        ],
-        "attribute": {
-          pattern: /\b'\w+/,
-          alias: "attr-name"
-        },
-        "keyword": /\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|or|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,
-        "boolean": /\b(?:false|true)\b/i,
-        "operator": /<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,
-        "punctuation": /\.\.?|[,;():]/,
-        "char": /'.'/,
-        "variable": /\b[a-z](?:\w)*\b/i
-      };
-      (function(Prism2) {
-        Prism2.languages.agda = {
-          "comment": /\{-[\s\S]*?(?:-\}|$)|--.*/,
-          "string": {
-            pattern: /"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,
-            greedy: true
-          },
-          "punctuation": /[(){}⦃⦄.;@]/,
-          "class-name": {
-            pattern: /((?:data|record) +)\S+/,
-            lookbehind: true
-          },
-          "function": {
-            pattern: /(^[ \t]*)(?!\s)[^:\r\n]+(?=:)/m,
-            lookbehind: true
-          },
-          "operator": {
-            pattern: /(^\s*|\s)(?:[=|:∀→λ\\?_]|->)(?=\s)/,
-            lookbehind: true
-          },
-          "keyword": /\b(?:Set|abstract|constructor|data|eta-equality|field|forall|hiding|import|in|inductive|infix|infixl|infixr|instance|let|macro|module|mutual|no-eta-equality|open|overlap|pattern|postulate|primitive|private|public|quote|quoteContext|quoteGoal|quoteTerm|record|renaming|rewrite|syntax|tactic|unquote|unquoteDecl|unquoteDef|using|variable|where|with)\b/
-        };
-      })(Prism);
-      Prism.languages.al = {
-        "comment": /\/\/.*|\/\*[\s\S]*?\*\//,
-        "string": {
-          pattern: /'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,
-          greedy: true
-        },
-        "function": {
-          pattern: /(\b(?:event|procedure|trigger)\s+|(?:^|[^.])\.\s*)[a-z_]\w*(?=\s*\()/i,
-          lookbehind: true
-        },
-        "keyword": [
-          // keywords
-          /\b(?:array|asserterror|begin|break|case|do|downto|else|end|event|exit|for|foreach|function|if|implements|in|indataset|interface|internal|local|of|procedure|program|protected|repeat|runonclient|securityfiltering|suppressdispose|temporary|then|to|trigger|until|var|while|with|withevents)\b/i,
-          // objects and metadata that are used like keywords
-          /\b(?:action|actions|addafter|addbefore|addfirst|addlast|area|assembly|chartpart|codeunit|column|controladdin|cuegroup|customizes|dataitem|dataset|dotnet|elements|enum|enumextension|extends|field|fieldattribute|fieldelement|fieldgroup|fieldgroups|fields|filter|fixed|grid|group|key|keys|label|labels|layout|modify|moveafter|movebefore|movefirst|movelast|page|pagecustomization|pageextension|part|profile|query|repeater|report|requestpage|schema|separator|systempart|table|tableelement|tableextension|textattribute|textelement|type|usercontrol|value|xmlport)\b/i
-        ],
-        "number": /\b(?:0x[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)(?:F|LL?|U(?:LL?)?)?\b/i,
-        "boolean": /\b(?:false|true)\b/i,
-        "variable": /\b(?:Curr(?:FieldNo|Page|Report)|x?Rec|RequestOptionsPage)\b/,
-        "class-name": /\b(?:automation|biginteger|bigtext|blob|boolean|byte|char|clienttype|code|completiontriggererrorlevel|connectiontype|database|dataclassification|datascope|date|dateformula|datetime|decimal|defaultlayout|dialog|dictionary|dotnetassembly|dotnettypedeclaration|duration|errorinfo|errortype|executioncontext|executionmode|fieldclass|fieldref|fieldtype|file|filterpagebuilder|guid|httpclient|httpcontent|httpheaders|httprequestmessage|httpresponsemessage|instream|integer|joker|jsonarray|jsonobject|jsontoken|jsonvalue|keyref|list|moduledependencyinfo|moduleinfo|none|notification|notificationscope|objecttype|option|outstream|pageresult|record|recordid|recordref|reportformat|securityfilter|sessionsettings|tableconnectiontype|tablefilter|testaction|testfield|testfilterfield|testpage|testpermissions|testrequestpage|text|textbuilder|textconst|textencoding|time|transactionmodel|transactiontype|variant|verbosity|version|view|views|webserviceactioncontext|webserviceactionresultcode|xmlattribute|xmlattributecollection|xmlcdata|xmlcomment|xmldeclaration|xmldocument|xmldocumenttype|xmlelement|xmlnamespacemanager|xmlnametable|xmlnode|xmlnodelist|xmlprocessinginstruction|xmlreadoptions|xmltext|xmlwriteoptions)\b/i,
-        "operator": /\.\.|:[=:]|[-+*/]=?|<>|[<>]=?|=|\b(?:and|div|mod|not|or|xor)\b/i,
-        "punctuation": /[()\[\]{}:.;,]/
-      };
-      Prism.languages.antlr4 = {
-        "comment": /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
-        "string": {
-          pattern: /'(?:\\.|[^\\'\r\n])*'/,
-          greedy: true
-        },
-        "character-class": {
-          pattern: /\[(?:\\.|[^\\\]\r\n])*\]/,
-          greedy: true,
-          alias: "regex",
-          inside: {
-            "range": {
-              pattern: /([^[]|(?:^|[^\\])(?:\\\\)*\\\[)-(?!\])/,
-              lookbehind: true,
-              alias: "punctuation"
-            },
-            "escape": /\\(?:u(?:[a-fA-F\d]{4}|\{[a-fA-F\d]+\})|[pP]\{[=\w-]+\}|[^\r\nupP])/,
-            "punctuation": /[\[\]]/
-          }
-        },
-        "action": {
-          pattern: /\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\}/,
-          greedy: true,
-          inside: {
-            "content": {
-              // this might be C, C++, Python, Java, C#, or any other language ANTLR4 compiles to
-              pattern: /(\{)[\s\S]+(?=\})/,
-              lookbehind: true
-            },
-            "punctuation": /[{}]/
-          }
-        },
-        "command": {
-          pattern: /(->\s*(?!\s))(?:\s*(?:,\s*)?\b[a-z]\w*(?:\s*\([^()\r\n]*\))?)+(?=\s*;)/i,
-          lookbehind: true,
-          inside: {
-            "function": /\b\w+(?=\s*(?:[,(]|$))/,
-            "punctuation": /[,()]/
-          }
-        },
-        "annotation": {
-          pattern: /@\w+(?:::\w+)*/,
-          alias: "keyword"
-        },
-        "label": {
-          pattern: /#[ \t]*\w+/,
-          alias: "punctuation"
-        },
-        "keyword": /\b(?:catch|channels|finally|fragment|grammar|import|lexer|locals|mode|options|parser|returns|throws|tokens)\b/,
-        "definition": [
-          {
-            pattern: /\b[a-z]\w*(?=\s*:)/,
-            alias: ["rule", "class-name"]
-          },
-          {
-            pattern: /\b[A-Z]\w*(?=\s*:)/,
-            alias: ["token", "constant"]
-          }
-        ],
-        "constant": /\b[A-Z][A-Z_]*\b/,
-        "operator": /\.\.|->|[|~]|[*+?]\??/,
-        "punctuation": /[;:()=]/
-      };
-      Prism.languages.g4 = Prism.languages.antlr4;
-      Prism.languages.apacheconf = {
-        "comment": /#.*/,
-        "directive-inline": {
-          pattern: /(^[\t ]*)\b(?:AcceptFilter|AcceptPathInfo|AccessFileName|Action|Add(?:Alt|AltByEncoding|AltByType|Charset|DefaultCharset|Description|Encoding|Handler|Icon|IconByEncoding|IconByType|InputFilter|Language|ModuleInfo|OutputFilter|OutputFilterByType|Type)|Alias|AliasMatch|Allow(?:CONNECT|EncodedSlashes|Methods|Override|OverrideList)?|Anonymous(?:_LogEmail|_MustGiveEmail|_NoUserID|_VerifyEmail)?|AsyncRequestWorkerFactor|Auth(?:BasicAuthoritative|BasicFake|BasicProvider|BasicUseDigestAlgorithm|DBDUserPWQuery|DBDUserRealmQuery|DBMGroupFile|DBMType|DBMUserFile|Digest(?:Algorithm|Domain|NonceLifetime|Provider|Qop|ShmemSize)|Form(?:Authoritative|Body|DisableNoStore|FakeBasicAuth|Location|LoginRequiredLocation|LoginSuccessLocation|LogoutLocation|Method|Mimetype|Password|Provider|SitePassphrase|Size|Username)|GroupFile|LDAP(?:AuthorizePrefix|BindAuthoritative|BindDN|BindPassword|CharsetConfig|CompareAsUser|CompareDNOnServer|DereferenceAliases|GroupAttribute|GroupAttributeIsDN|InitialBindAsUser|InitialBindPattern|MaxSubGroupDepth|RemoteUserAttribute|RemoteUserIsDN|SearchAsUser|SubGroupAttribute|SubGroupClass|Url)|Merging|Name|nCache(?:Context|Enable|ProvideFor|SOCache|Timeout)|nzFcgiCheckAuthnProvider|nzFcgiDefineProvider|Type|UserFile|zDBDLoginToReferer|zDBDQuery|zDBDRedirectQuery|zDBMType|zSendForbiddenOnFailure)|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferedLogs|BufferSize|Cache(?:DefaultExpire|DetailHeader|DirLength|DirLevels|Disable|Enable|File|Header|IgnoreCacheControl|IgnoreHeaders|IgnoreNoLastMod|IgnoreQueryString|IgnoreURLSessionIdentifiers|KeyBaseURL|LastModifiedFactor|Lock|LockMaxAge|LockPath|MaxExpire|MaxFileSize|MinExpire|MinFileSize|NegotiatedDocs|QuickHandler|ReadSize|ReadTime|Root|Socache(?:MaxSize|MaxTime|MinTime|ReadSize|ReadTime)?|StaleOnError|StoreExpired|StoreNoStore|StorePrivate)|CGIDScriptTimeout|CGIMapExtension|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|Deflate(?:BufferSize|CompressionLevel|FilterNote|InflateLimitRequestBody|InflateRatio(?:Burst|Limit)|MemLevel|WindowSize)|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DTracePrivileges|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtendedStatus|ExtFilterDefine|ExtFilterOptions|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|Heartbeat(?:Address|Listen|MaxServers|Storage)|HostnameLookups|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|Index(?:HeadInsert|Ignore|IgnoreReset|Options|OrderDefault|StyleSheet)|InputSed|ISAPI(?:AppendLogToErrors|AppendLogToQuery|CacheFile|FakeAsync|LogNotSupported|ReadAheadBuffer)|KeepAlive|KeepAliveTimeout|KeptBodySize|LanguagePriority|LDAP(?:CacheEntries|CacheTTL|ConnectionPoolTTL|ConnectionTimeout|LibraryDebug|OpCacheEntries|OpCacheTTL|ReferralHopLimit|Referrals|Retries|RetryDelay|SharedCacheFile|SharedCacheSize|Timeout|TrustedClientCert|TrustedGlobalCert|TrustedMode|VerifyServerCert)|Limit(?:InternalRecursion|Request(?:Body|Fields|FieldSize|Line)|XMLRequestBody)|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|Lua(?:Hook(?:AccessChecker|AuthChecker|CheckUserID|Fixups|InsertFilter|Log|MapToStorage|TranslateName|TypeChecker)|Inherit|InputFilter|MapHandler|OutputFilter|PackageCPath|PackagePath|QuickHandler|Root|Scope)|Max(?:ConnectionsPerChild|KeepAliveRequests|MemFree|RangeOverlaps|RangeReversals|Ranges|RequestWorkers|SpareServers|SpareThreads|Threads)|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|MMapFile|ModemStandard|ModMimeUsePathInfo|MultiviewsMatch|Mutex|NameVirtualHost|NoProxy|NWSSLTrustedCerts|NWSSLUpgradeable|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|Proxy(?:AddHeaders|BadHeader|Block|Domain|ErrorOverride|ExpressDBMFile|ExpressDBMType|ExpressEnable|FtpDirCharset|FtpEscapeWildcards|FtpListOnWildcard|HTML(?:BufSize|CharsetOut|DocType|Enable|Events|Extended|Fixups|Interp|Links|Meta|StripComments|URLMap)|IOBufferSize|MaxForwards|Pass(?:Inherit|InterpolateEnv|Match|Reverse|ReverseCookieDomain|ReverseCookiePath)?|PreserveHost|ReceiveBufferSize|Remote|RemoteMatch|Requests|SCGIInternalRedirect|SCGISendfile|Set|SourceAddress|Status|Timeout|Via)|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIP(?:Header|InternalProxy|InternalProxyList|ProxiesHeader|TrustedProxy|TrustedProxyList)|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|Rewrite(?:Base|Cond|Engine|Map|Options|Rule)|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScoreBoardFile|Script(?:Alias|AliasMatch|InterpreterSource|Log|LogBuffer|LogLength|Sock)?|SecureListen|SeeRequestTail|SendBufferSize|Server(?:Admin|Alias|Limit|Name|Path|Root|Signature|Tokens)|Session(?:Cookie(?:Name|Name2|Remove)|Crypto(?:Cipher|Driver|Passphrase|PassphraseFile)|DBD(?:CookieName|CookieName2|CookieRemove|DeleteLabel|InsertLabel|PerUser|SelectLabel|UpdateLabel)|Env|Exclude|Header|Include|MaxAge)?|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|SSIEndTag|SSIErrorMsg|SSIETag|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSL(?:CACertificateFile|CACertificatePath|CADNRequestFile|CADNRequestPath|CARevocationCheck|CARevocationFile|CARevocationPath|CertificateChainFile|CertificateFile|CertificateKeyFile|CipherSuite|Compression|CryptoDevice|Engine|FIPS|HonorCipherOrder|InsecureRenegotiation|OCSP(?:DefaultResponder|Enable|OverrideResponder|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|UseRequestNonce)|OpenSSLConfCmd|Options|PassPhraseDialog|Protocol|Proxy(?:CACertificateFile|CACertificatePath|CARevocation(?:Check|File|Path)|CheckPeer(?:CN|Expire|Name)|CipherSuite|Engine|MachineCertificate(?:ChainFile|File|Path)|Protocol|Verify|VerifyDepth)|RandomSeed|RenegBufferSize|Require|RequireSSL|Session(?:Cache|CacheTimeout|TicketKeyFile|Tickets)|SRPUnknownUserSeed|SRPVerifierFile|Stapling(?:Cache|ErrorCacheTimeout|FakeTryLater|ForceURL|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|ReturnResponderErrors|StandardCacheTimeout)|StrictSNIVHostCheck|UserName|UseStapling|VerifyClient|VerifyDepth)|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadsPerChild|ThreadStackSize|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|Virtual(?:DocumentRoot|ScriptAlias)(?:IP)?|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\b/im,
-          lookbehind: true,
-          alias: "property"
-        },
-        "directive-block": {
-          pattern: /<\/?\b(?:Auth[nz]ProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|Require(?:All|Any|None)|VirtualHost)\b.*>/i,
-          inside: {
-            "directive-block": {
-              pattern: /^<\/?\w+/,
-              inside: {
-                "punctuation": /^<\/?/
-              },
-              alias: "tag"
-            },
-            "directive-block-parameter": {
-              pattern: /.*[^>]/,
-              inside: {
-                "punctuation": /:/,
-                "string": {
-                  pattern: /("|').*\1/,
-                  inside: {
-                    "variable": /[$%]\{?(?:\w\.?[-+:]?)+\}?/
-                  }
-                }
-              },
-              alias: "attr-value"
-            },
-            "punctuation": />/
-          },
-          alias: "tag"
-        },
-        "directive-flags": {
-          pattern: /\[(?:[\w=],?)+\]/,
-          alias: "keyword"
-        },
-        "string": {
-          pattern: /("|').*\1/,
-          inside: {
-            "variable": /[$%]\{?(?:\w\.?[-+:]?)+\}?/
-          }
-        },
-        "variable": /[$%]\{?(?:\w\.?[-+:]?)+\}?/,
-        "regex": /\^?.*\$|\^.*\$?/
-      };
-      Prism.languages.sql = {
-        "comment": {
-          pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,
-          lookbehind: true
-        },
-        "variable": [
-          {
-            pattern: /@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,
-            greedy: true
-          },
-          /@[\w.$]+/
-        ],
-        "string": {
-          pattern: /(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,
-          greedy: true,
-          lookbehind: true
-        },
-        "identifier": {
-          pattern: /(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,
-          greedy: true,
-          lookbehind: true,
-          inside: {
-            "punctuation": /^`|`$/
-          }
-        },
-        "function": /\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,
-        // Should we highlight user defined functions too?
-        "keyword": /\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,
-        "boolean": /\b(?:FALSE|NULL|TRUE)\b/i,
-        "number": /\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,
-        "operator": /[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,
-        "punctuation": /[;[\]()`,.]/
-      };
-      (function(Prism2) {
-        var keywords = /\b(?:(?:after|before)(?=\s+[a-z])|abstract|activate|and|any|array|as|asc|autonomous|begin|bigdecimal|blob|boolean|break|bulk|by|byte|case|cast|catch|char|class|collect|commit|const|continue|currency|date|datetime|decimal|default|delete|desc|do|double|else|end|enum|exception|exit|export|extends|final|finally|float|for|from|get(?=\s*[{};])|global|goto|group|having|hint|if|implements|import|in|inner|insert|instanceof|int|integer|interface|into|join|like|limit|list|long|loop|map|merge|new|not|null|nulls|number|object|of|on|or|outer|override|package|parallel|pragma|private|protected|public|retrieve|return|rollback|select|set|short|sObject|sort|static|string|super|switch|synchronized|system|testmethod|then|this|throw|time|transaction|transient|trigger|try|undelete|update|upsert|using|virtual|void|webservice|when|where|while|(?:inherited|with|without)\s+sharing)\b/i;
-        var className = /\b(?:(?=[a-z_]\w*\s*[<\[])|(?!<keyword>))[A-Z_]\w*(?:\s*\.\s*[A-Z_]\w*)*\b(?:\s*(?:\[\s*\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*/.source.replace(/<keyword>/g, function() {
-          return keywords.source;
-        });
-        function insertClassName(pattern) {
-          return RegExp(pattern.replace(/<CLASS-NAME>/g, function() {
-            return className;
-          }), "i");
-        }
-        var classNameInside = {
-          "keyword": keywords,
-          "punctuation": /[()\[\]{};,:.<>]/
-        };
-        Prism2.languages.apex = {
-          "comment": Prism2.languages.clike.comment,
-          "string": Prism2.languages.clike.string,
-          "sql": {
-            pattern: /((?:[=,({:]|\breturn)\s*)\[[^\[\]]*\]/i,
-            lookbehind: true,
-            greedy: true,
-            alias: "language-sql",
-            inside: Prism2.languages.sql
-          },
-          "annotation": {
-            pattern: /@\w+\b/,
-            alias: "punctuation"
-          },
-          "class-name": [
-            {
-              pattern: insertClassName(/(\b(?:class|enum|extends|implements|instanceof|interface|new|trigger\s+\w+\s+on)\s+)<CLASS-NAME>/.source),
-              lookbehind: true,
-              inside: classNameInside
-            },
-            {
-              // cast
-              pattern: insertClassName(/(\(\s*)<CLASS-NAME>(?=\s*\)\s*[\w(])/.source),
-              lookbehind: true,
-              inside: classNameInside
-            },
-            {
-              // variable/parameter declaration and return types
-              pattern: insertClassName(/<CLASS-NAME>(?=\s*\w+\s*[;=,(){:])/.source),
-              inside: classNameInside
-            }
-          ],
-          "trigger": {
-            pattern: /(\btrigger\s+)\w+\b/i,
-            lookbehind: true,
-            alias: "class-name"
-          },
-          "keyword": keywords,
-          "function": /\b[a-z_]\w*(?=\s*\()/i,
-          "boolean": /\b(?:false|true)\b/i,
-          "number": /(?:\B\.\d+|\b\d+(?:\.\d+|L)?)\b/i,
-          "operator": /[!=](?:==?)?|\?\.?|&&|\|\||--|\+\+|[-+*/^&|]=?|:|<<?=?|>{1,3}=?/,
-          "punctuation": /[()\[\]{};,.]/
-        };
-      })(Prism);
-      Prism.languages.apl = {
-        "comment": /(?:⍝|#[! ]).*$/m,
-        "string": {
-          pattern: /'(?:[^'\r\n]|'')*'/,
-          greedy: true
-        },
-        "number": /¯?(?:\d*\.?\b\d+(?:e[+¯]?\d+)?|¯|∞)(?:j¯?(?:(?:\d+(?:\.\d+)?|\.\d+)(?:e[+¯]?\d+)?|¯|∞))?/i,
-        "statement": /:[A-Z][a-z][A-Za-z]*\b/,
-        "system-function": {
-          pattern: /⎕[A-Z]+/i,
-          alias: "function"
-        },
-        "constant": /[⍬⌾#⎕⍞]/,
-        "function": /[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,
-        "monadic-operator": {
-          pattern: /[\\\/⌿⍀¨⍨⌶&∥]/,
-          alias: "operator"
-        },
-        "dyadic-operator": {
-          pattern: /[.⍣⍠⍤∘⌸@⌺⍥]/,
-          alias: "operator"
-        },
-        "assignment": {
-          pattern: /←/,
-          alias: "keyword"
-        },
-        "punctuation": /[\[;\]()◇⋄]/,
-        "dfn": {
-          pattern: /[{}⍺⍵⍶⍹∇⍫:]/,
-          alias: "builtin"
-        }
-      };
-      Prism.languages.applescript = {
-        "comment": [
-          // Allow one level of nesting
-          /\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,
-          /--.+/,
-          /#.+/
-        ],
-        "string": /"(?:\\.|[^"\\\r\n])*"/,
-        "number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?\b/i,
-        "operator": [
-          /[&=≠≤≥*+\-\/÷^]|[<>]=?/,
-          /\b(?:(?:begin|end|start)s? with|(?:contains?|(?:does not|doesn't) contain)|(?:is|isn't|is not) (?:contained by|in)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:comes|(?:does not|doesn't) come) (?:after|before)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equal to|equals|is not|isn't)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|as|div|mod|not|or))\b/
-        ],
-        "keyword": /\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\b/,
-        "class-name": /\b(?:POSIX file|RGB color|alias|application|boolean|centimeters|centimetres|class|constant|cubic centimeters|cubic centimetres|cubic feet|cubic inches|cubic meters|cubic metres|cubic yards|date|degrees Celsius|degrees Fahrenheit|degrees Kelvin|feet|file|gallons|grams|inches|integer|kilograms|kilometers|kilometres|list|liters|litres|meters|metres|miles|number|ounces|pounds|quarts|real|record|reference|script|square feet|square kilometers|square kilometres|square meters|square metres|square miles|square yards|text|yards)\b/,
-        "punctuation": /[{}():,¬«»《》]/
-      };
-      Prism.languages.aql = {
-        "comment": /\/\/.*|\/\*[\s\S]*?\*\//,
-        "property": {
-          pattern: /([{,]\s*)(?:(?!\d)\w+|(["'´`])(?:(?!\2)[^\\\r\n]|\\.)*\2)(?=\s*:)/,
-          lookbehind: true,
-          greedy: true
-        },
-        "string": {
-          pattern: /(["'])(?:(?!\1)[^\\\r\n]|\\.)*\1/,
-          greedy: true
-        },
-        "identifier": {
-          pattern: /([´`])(?:(?!\1)[^\\\r\n]|\\.)*\1/,
-          greedy: true
-        },
-        "variable": /@@?\w+/,
-        "keyword": [
-          {
-            pattern: /(\bWITH\s+)COUNT(?=\s+INTO\b)/i,
-            lookbehind: true
-          },
-          /\b(?:AGGREGATE|ALL|AND|ANY|ASC|COLLECT|DESC|DISTINCT|FILTER|FOR|GRAPH|IN|INBOUND|INSERT|INTO|K_PATHS|K_SHORTEST_PATHS|LET|LIKE|LIMIT|NONE|NOT|NULL|OR|OUTBOUND|REMOVE|REPLACE|RETURN|SHORTEST_PATH|SORT|UPDATE|UPSERT|WINDOW|WITH)\b/i,
-          // pseudo keywords get a lookbehind to avoid false positives
-          {
-            pattern: /(^|[^\w.[])(?:KEEP|PRUNE|SEARCH|TO)\b/i,
-            lookbehind: true
-          },
-          {
-            pattern: /(^|[^\w.[])(?:CURRENT|NEW|OLD)\b/,
-            lookbehind: true
-          },
-          {
-            pattern: /\bOPTIONS(?=\s*\{)/i
-          }
-        ],
-        "function": /\b(?!\d)\w+(?=\s*\()/,
-        "boolean": /\b(?:false|true)\b/i,
-        "range": {
-          pattern: /\.\./,
-          alias: "operator"
-        },
-        "number": [
-          /\b0b[01]+/i,
-          /\b0x[0-9a-f]+/i,
-          /(?:\B\.\d+|\b(?:0|[1-9]\d*)(?:\.\d+)?)(?:e[+-]?\d+)?/i
-        ],
-        "operator": /\*{2,}|[=!]~|[!=<>]=?|&&|\|\||[-+*/%]/,
-        "punctuation": /::|[?.:,;()[\]{}]/
-      };
-      Prism.languages.c = Prism.languages.extend("clike", {
-        "comment": {
-          pattern: /\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,
-          greedy: true
-        },
-        "string": {
-          // https://en.cppreference.com/w/c/language/string_literal
-          pattern: /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
-          greedy: true
-        },
-        "class-name": {
-          pattern: /(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,
-          lookbehind: true
-        },
-        "keyword": /\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,
-        "function": /\b[a-z_]\w*(?=\s*\()/i,
-        "number": /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,
-        "operator": />>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/
-      });
-      Prism.languages.insertBefore("c", "string", {
-        "char": {
-          // https://en.cppreference.com/w/c/language/character_constant
-          pattern: /'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,
-          greedy: true
-        }
-      });
-      Prism.languages.insertBefore("c", "string", {
-        "macro": {
-          // allow for multiline macro definitions
-          // spaces after the # character compile fine with gcc
-          pattern: /(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,
-          lookbehind: true,
-          greedy: true,
-          alias: "property",
-          inside: {
-            "string": [
-              {
-                // highlight the path of the include statement as a string
-                pattern: /^(#\s*include\s*)<[^>]+>/,
-                lookbehind: true
-              },
-              Prism.languages.c["string"]
-            ],
-            "char": Prism.languages.c["char"],
-            "comment": Prism.languages.c["comment"],
-            "macro-name": [
-              {
-                pattern: /(^#\s*define\s+)\w+\b(?!\()/i,
-                lookbehind: true
-              },
-              {
-                pattern: /(^#\s*define\s+)\w+\b(?=\()/i,
-                lookbehind: true,
-                alias: "function"
-              }
-            ],
-            // highlight macro directives as keywords
-            "directive": {
-              pattern: /^(#\s*)[a-z]+/,
-              lookbehind: true,
-              alias: "keyword"
-            },
-            "directive-hash": /^#/,
-            "punctuation": /##|\\(?=[\r\n])/,
-            "expression": {
-              pattern: /\S[\s\S]*/,
-              inside: Prism.languages.c
-            }
-          }
-        }
-      });
-      Prism.languages.insertBefore("c", "function", {
-        // highlight predefined macros as constants
-        "constant": /\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/
-      });
-      delete Prism.languages.c["boolean"];
-      (function(Prism2) {
-        var keyword = /\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/;
-        var modName = /\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g, function() {
-          return keyword.source;
-        });
-        Prism2.languages.cpp = Prism2.languages.extend("c", {
-          "class-name": [
-            {
-              pattern: RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g, function() {
-                return keyword.source;
-              })),
-              lookbehind: true
-            },
-            // This is intended to capture the class name of method implementations like:
-            //   void foo::bar() const {}
-            // However! The `foo` in the above example could also be a namespace, so we only capture the class name if
-            // it starts with an uppercase letter. This approximation should give decent results.
-            /\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,
-            // This will capture the class name before destructors like:
-            //   Foo::~Foo() {}
-            /\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,
-            // This also intends to capture the class name of method implementations but here the class has template
-            // parameters, so it can't be a namespace (until C++ adds generic namespaces).
-            /\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/
-          ],
-          "keyword": keyword,
-          "number": {
-            pattern: /(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,
-            greedy: true
-          },
-          "operator": />>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,
-          "boolean": /\b(?:false|true)\b/
-        });
-        Prism2.languages.insertBefore("cpp", "string", {
-          "module": {
-            // https://en.cppreference.com/w/cpp/language/modules
-            pattern: RegExp(
-              /(\b(?:import|module)\s+)/.source + "(?:" + // header-name
-              /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source + "|" + // module name or partition or both
-              /<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g, function() {
-                return modName;
-              }) + ")"
-            ),
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "string": /^[<"][\s\S]+/,
-              "operator": /:/,
-              "punctuation": /\./
-            }
-          },
-          "raw-string": {
-            pattern: /R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,
-            alias: "string",
-            greedy: true
-          }
-        });
-        Prism2.languages.insertBefore("cpp", "keyword", {
-          "generic-function": {
-            pattern: /\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,
-            inside: {
-              "function": /^\w+/,
-              "generic": {
-                pattern: /<[\s\S]+/,
-                alias: "class-name",
-                inside: Prism2.languages.cpp
-              }
-            }
-          }
-        });
-        Prism2.languages.insertBefore("cpp", "operator", {
-          "double-colon": {
-            pattern: /::/,
-            alias: "punctuation"
-          }
-        });
-        Prism2.languages.insertBefore("cpp", "class-name", {
-          // the base clause is an optional list of parent classes
-          // https://en.cppreference.com/w/cpp/language/class
-          "base-clause": {
-            pattern: /(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,
-            lookbehind: true,
-            greedy: true,
-            inside: Prism2.languages.extend("cpp", {})
-          }
-        });
-        Prism2.languages.insertBefore("inside", "double-colon", {
-          // All untokenized words that are not namespaces should be class names
-          "class-name": /\b[a-z_]\w*\b(?!\s*::)/i
-        }, Prism2.languages.cpp["base-clause"]);
-      })(Prism);
-      Prism.languages.arduino = Prism.languages.extend("cpp", {
-        "keyword": /\b(?:String|array|bool|boolean|break|byte|case|catch|continue|default|do|double|else|finally|for|function|goto|if|in|instanceof|int|integer|long|loop|new|null|return|setup|string|switch|throw|try|void|while|word)\b/,
-        "constant": /\b(?:ANALOG_MESSAGE|DEFAULT|DIGITAL_MESSAGE|EXTERNAL|FIRMATA_STRING|HIGH|INPUT|INPUT_PULLUP|INTERNAL|INTERNAL1V1|INTERNAL2V56|LED_BUILTIN|LOW|OUTPUT|REPORT_ANALOG|REPORT_DIGITAL|SET_PIN_MODE|SYSEX_START|SYSTEM_RESET)\b/,
-        "builtin": /\b(?:Audio|BSSID|Bridge|Client|Console|EEPROM|Esplora|EsploraTFT|Ethernet|EthernetClient|EthernetServer|EthernetUDP|File|FileIO|FileSystem|Firmata|GPRS|GSM|GSMBand|GSMClient|GSMModem|GSMPIN|GSMScanner|GSMServer|GSMVoiceCall|GSM_SMS|HttpClient|IPAddress|IRread|Keyboard|KeyboardController|LiquidCrystal|LiquidCrystal_I2C|Mailbox|Mouse|MouseController|PImage|Process|RSSI|RobotControl|RobotMotor|SD|SPI|SSID|Scheduler|Serial|Server|Servo|SoftwareSerial|Stepper|Stream|TFT|Task|USBHost|WiFi|WiFiClient|WiFiServer|WiFiUDP|Wire|YunClient|YunServer|abs|addParameter|analogRead|analogReadResolution|analogReference|analogWrite|analogWriteResolution|answerCall|attach|attachGPRS|attachInterrupt|attached|autoscroll|available|background|beep|begin|beginPacket|beginSD|beginSMS|beginSpeaker|beginTFT|beginTransmission|beginWrite|bit|bitClear|bitRead|bitSet|bitWrite|blink|blinkVersion|buffer|changePIN|checkPIN|checkPUK|checkReg|circle|cityNameRead|cityNameWrite|clear|clearScreen|click|close|compassRead|config|connect|connected|constrain|cos|countryNameRead|countryNameWrite|createChar|cursor|debugPrint|delay|delayMicroseconds|detach|detachInterrupt|digitalRead|digitalWrite|disconnect|display|displayLogos|drawBMP|drawCompass|encryptionType|end|endPacket|endSMS|endTransmission|endWrite|exists|exitValue|fill|find|findUntil|flush|gatewayIP|get|getAsynchronously|getBand|getButton|getCurrentCarrier|getIMEI|getKey|getModifiers|getOemKey|getPINUsed|getResult|getSignalStrength|getSocket|getVoiceCallStatus|getXChange|getYChange|hangCall|height|highByte|home|image|interrupts|isActionDone|isDirectory|isListening|isPIN|isPressed|isValid|keyPressed|keyReleased|keyboardRead|knobRead|leftToRight|line|lineFollowConfig|listen|listenOnLocalhost|loadImage|localIP|lowByte|macAddress|maintain|map|max|messageAvailable|micros|millis|min|mkdir|motorsStop|motorsWrite|mouseDragged|mouseMoved|mousePressed|mouseReleased|move|noAutoscroll|noBlink|noBuffer|noCursor|noDisplay|noFill|noInterrupts|noListenOnLocalhost|noStroke|noTone|onReceive|onRequest|open|openNextFile|overflow|parseCommand|parseFloat|parseInt|parsePacket|pauseMode|peek|pinMode|playFile|playMelody|point|pointTo|position|pow|prepare|press|print|printFirmwareVersion|printVersion|println|process|processInput|pulseIn|put|random|randomSeed|read|readAccelerometer|readBlue|readButton|readBytes|readBytesUntil|readGreen|readJoystickButton|readJoystickSwitch|readJoystickX|readJoystickY|readLightSensor|readMessage|readMicrophone|readNetworks|readRed|readSlider|readString|readStringUntil|readTemperature|ready|rect|release|releaseAll|remoteIP|remoteNumber|remotePort|remove|requestFrom|retrieveCallingNumber|rewindDirectory|rightToLeft|rmdir|robotNameRead|robotNameWrite|run|runAsynchronously|runShellCommand|runShellCommandAsynchronously|running|scanNetworks|scrollDisplayLeft|scrollDisplayRight|seek|sendAnalog|sendDigitalPortPair|sendDigitalPorts|sendString|sendSysex|serialEvent|setBand|setBitOrder|setClockDivider|setCursor|setDNS|setDataMode|setFirmwareVersion|setMode|setPINUsed|setSpeed|setTextSize|setTimeout|shiftIn|shiftOut|shutdown|sin|size|sqrt|startLoop|step|stop|stroke|subnetMask|switchPIN|tan|tempoWrite|text|tone|transfer|tuneWrite|turn|updateIR|userNameRead|userNameWrite|voiceCall|waitContinue|width|write|writeBlue|writeGreen|writeJSON|writeMessage|writeMicroseconds|writeRGB|writeRed|yield)\b/
-      });
-      Prism.languages.ino = Prism.languages.arduino;
-      Prism.languages.arff = {
-        "comment": /%.*/,
-        "string": {
-          pattern: /(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,
-          greedy: true
-        },
-        "keyword": /@(?:attribute|data|end|relation)\b/i,
-        "number": /\b\d+(?:\.\d+)?\b/,
-        "punctuation": /[{},]/
-      };
-      Prism.languages.armasm = {
-        "comment": {
-          pattern: /;.*/,
-          greedy: true
-        },
-        "string": {
-          pattern: /"(?:[^"\r\n]|"")*"/,
-          greedy: true,
-          inside: {
-            "variable": {
-              pattern: /((?:^|[^$])(?:\${2})*)\$\w+/,
-              lookbehind: true
-            }
-          }
-        },
-        "char": {
-          pattern: /'(?:[^'\r\n]{0,4}|'')'/,
-          greedy: true
-        },
-        "version-symbol": {
-          pattern: /\|[\w@]+\|/,
-          greedy: true,
-          alias: "property"
-        },
-        "boolean": /\b(?:FALSE|TRUE)\b/,
-        "directive": {
-          pattern: /\b(?:ALIAS|ALIGN|AREA|ARM|ASSERT|ATTR|CN|CODE|CODE16|CODE32|COMMON|CP|DATA|DCB|DCD|DCDO|DCDU|DCFD|DCFDU|DCI|DCQ|DCQU|DCW|DCWU|DN|ELIF|ELSE|END|ENDFUNC|ENDIF|ENDP|ENTRY|EQU|EXPORT|EXPORTAS|EXTERN|FIELD|FILL|FN|FUNCTION|GBLA|GBLL|GBLS|GET|GLOBAL|IF|IMPORT|INCBIN|INCLUDE|INFO|KEEP|LCLA|LCLL|LCLS|LTORG|MACRO|MAP|MEND|MEXIT|NOFP|OPT|PRESERVE8|PROC|QN|READONLY|RELOC|REQUIRE|REQUIRE8|RLIST|ROUT|SETA|SETL|SETS|SN|SPACE|SUBT|THUMB|THUMBX|TTL|WEND|WHILE)\b/,
-          alias: "property"
-        },
-        "instruction": {
-          pattern: /((?:^|(?:^|[^\\])(?:\r\n?|\n))[ \t]*(?:(?:[A-Z][A-Z0-9_]*[a-z]\w*|[a-z]\w*|\d+)[ \t]+)?)\b[A-Z.]+\b/,
-          lookbehind: true,
-          alias: "keyword"
-        },
-        "variable": /\$\w+/,
-        "number": /(?:\b[2-9]_\d+|(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e-?\d+)?|\b0(?:[fd]_|x)[0-9a-f]+|&[0-9a-f]+)\b/i,
-        "register": {
-          pattern: /\b(?:r\d|lr)\b/,
-          alias: "symbol"
-        },
-        "operator": /<>|<<|>>|&&|\|\||[=!<>/]=?|[+\-*%#?&|^]|:[A-Z]+:/,
-        "punctuation": /[()[\],]/
-      };
-      Prism.languages["arm-asm"] = Prism.languages.armasm;
-      (function(Prism2) {
-        var createLanguageString = function(lang, pattern) {
-          return {
-            pattern: RegExp(/\{!/.source + "(?:" + (pattern || lang) + ")" + /$[\s\S]*\}/.source, "m"),
-            greedy: true,
-            inside: {
-              "embedded": {
-                pattern: /(^\{!\w+\b)[\s\S]+(?=\}$)/,
-                lookbehind: true,
-                alias: "language-" + lang,
-                inside: Prism2.languages[lang]
-              },
-              "string": /[\s\S]+/
-            }
-          };
-        };
-        Prism2.languages.arturo = {
-          "comment": {
-            pattern: /;.*/,
-            greedy: true
-          },
-          "character": {
-            pattern: /`.`/,
-            alias: "char",
-            greedy: true
-          },
-          "number": {
-            pattern: /\b\d+(?:\.\d+(?:\.\d+(?:-[\w+-]+)?)?)?\b/
-          },
-          "string": {
-            pattern: /"(?:[^"\\\r\n]|\\.)*"/,
-            greedy: true
-          },
-          "regex": {
-            pattern: /\{\/.*?\/\}/,
-            greedy: true
-          },
-          "html-string": createLanguageString("html"),
-          "css-string": createLanguageString("css"),
-          "js-string": createLanguageString("js"),
-          "md-string": createLanguageString("md"),
-          "sql-string": createLanguageString("sql"),
-          "sh-string": createLanguageString("shell", "sh"),
-          "multistring": {
-            pattern: /».*|\{:[\s\S]*?:\}|\{[\s\S]*?\}|^-{6}$[\s\S]*/m,
-            alias: "string",
-            greedy: true
-          },
-          "label": {
-            pattern: /\w+\b\??:/,
-            alias: "property"
-          },
-          "literal": {
-            pattern: /'(?:\w+\b\??:?)/,
-            alias: "constant"
-          },
-          "type": {
-            pattern: /:(?:\w+\b\??:?)/,
-            alias: "class-name"
-          },
-          "color": /#\w+/,
-          "predicate": {
-            pattern: /\b(?:all|and|any|ascii|attr|attribute|attributeLabel|binary|block|char|contains|database|date|dictionary|empty|equal|even|every|exists|false|floating|function|greater|greaterOrEqual|if|in|inline|integer|is|key|label|leap|less|lessOrEqual|literal|logical|lower|nand|negative|nor|not|notEqual|null|numeric|odd|or|path|pathLabel|positive|prefix|prime|regex|same|set|some|sorted|standalone|string|subset|suffix|superset|symbol|symbolLiteral|true|try|type|unless|upper|when|whitespace|word|xnor|xor|zero)\?/,
-            alias: "keyword"
-          },
-          "builtin-function": {
-            pattern: /\b(?:abs|acos|acosh|acsec|acsech|actan|actanh|add|after|alert|alias|and|angle|append|arg|args|arity|array|as|asec|asech|asin|asinh|atan|atan2|atanh|attr|attrs|average|before|benchmark|blend|break|call|capitalize|case|ceil|chop|clear|clip|close|color|combine|conj|continue|copy|cos|cosh|crc|csec|csech|ctan|ctanh|cursor|darken|dec|decode|define|delete|desaturate|deviation|dialog|dictionary|difference|digest|digits|div|do|download|drop|dup|e|else|empty|encode|ensure|env|escape|execute|exit|exp|extend|extract|factors|fdiv|filter|first|flatten|floor|fold|from|function|gamma|gcd|get|goto|hash|hypot|if|inc|indent|index|infinity|info|input|insert|inspect|intersection|invert|jaro|join|keys|kurtosis|last|let|levenshtein|lighten|list|ln|log|loop|lower|mail|map|match|max|median|min|mod|module|mul|nand|neg|new|nor|normalize|not|now|null|open|or|outdent|pad|palette|panic|path|pause|permissions|permutate|pi|pop|popup|pow|powerset|powmod|prefix|print|prints|process|product|query|random|range|read|relative|remove|rename|render|repeat|replace|request|return|reverse|round|sample|saturate|script|sec|sech|select|serve|set|shl|shr|shuffle|sin|sinh|size|skewness|slice|sort|spin|split|sqrt|squeeze|stack|strip|sub|suffix|sum|switch|symbols|symlink|sys|take|tan|tanh|terminal|terminate|to|truncate|try|type|unclip|union|unique|unless|until|unzip|upper|values|var|variance|volume|webview|while|with|wordwrap|write|xnor|xor|zip)\b/,
-            alias: "keyword"
-          },
-          "sugar": {
-            pattern: /->|=>|\||::/,
-            alias: "operator"
-          },
-          "punctuation": /[()[\],]/,
-          "symbol": {
-            pattern: /<:|-:|ø|@|#|\+|\||\*|\$|---|-|%|\/|\.\.|\^|~|=|<|>|\\/
-          },
-          "boolean": {
-            pattern: /\b(?:false|maybe|true)\b/
-          }
-        };
-        Prism2.languages.art = Prism2.languages["arturo"];
-      })(Prism);
-      (function(Prism2) {
-        var attributes = {
-          pattern: /(^[ \t]*)\[(?!\[)(?:(["'$`])(?:(?!\2)[^\\]|\\.)*\2|\[(?:[^\[\]\\]|\\.)*\]|[^\[\]\\"'$`]|\\.)*\]/m,
-          lookbehind: true,
-          inside: {
-            "quoted": {
-              pattern: /([$`])(?:(?!\1)[^\\]|\\.)*\1/,
-              inside: {
-                "punctuation": /^[$`]|[$`]$/
-              }
-            },
-            "interpreted": {
-              pattern: /'(?:[^'\\]|\\.)*'/,
-              inside: {
-                "punctuation": /^'|'$/
-                // See rest below
-              }
-            },
-            "string": /"(?:[^"\\]|\\.)*"/,
-            "variable": /\w+(?==)/,
-            "punctuation": /^\[|\]$|,/,
-            "operator": /=/,
-            // The negative look-ahead prevents blank matches
-            "attr-value": /(?!^\s+$).+/
-          }
-        };
-        var asciidoc = Prism2.languages.asciidoc = {
-          "comment-block": {
-            pattern: /^(\/{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1/m,
-            alias: "comment"
-          },
-          "table": {
-            pattern: /^\|={3,}(?:(?:\r?\n|\r(?!\n)).*)*?(?:\r?\n|\r)\|={3,}$/m,
-            inside: {
-              "specifiers": {
-                pattern: /(?:(?:(?:\d+(?:\.\d+)?|\.\d+)[+*](?:[<^>](?:\.[<^>])?|\.[<^>])?|[<^>](?:\.[<^>])?|\.[<^>])[a-z]*|[a-z]+)(?=\|)/,
-                alias: "attr-value"
-              },
-              "punctuation": {
-                pattern: /(^|[^\\])[|!]=*/,
-                lookbehind: true
-              }
-              // See rest below
-            }
-          },
-          "passthrough-block": {
-            pattern: /^(\+{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,
-            inside: {
-              "punctuation": /^\++|\++$/
-              // See rest below
-            }
-          },
-          // Literal blocks and listing blocks
-          "literal-block": {
-            pattern: /^(-{4,}|\.{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,
-            inside: {
-              "punctuation": /^(?:-+|\.+)|(?:-+|\.+)$/
-              // See rest below
-            }
-          },
-          // Sidebar blocks, quote blocks, example blocks and open blocks
-          "other-block": {
-            pattern: /^(--|\*{4,}|_{4,}|={4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,
-            inside: {
-              "punctuation": /^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/
-              // See rest below
-            }
-          },
-          // list-punctuation and list-label must appear before indented-block
-          "list-punctuation": {
-            pattern: /(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,
-            lookbehind: true,
-            alias: "punctuation"
-          },
-          "list-label": {
-            pattern: /(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,
-            lookbehind: true,
-            alias: "symbol"
-          },
-          "indented-block": {
-            pattern: /((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,
-            lookbehind: true
-          },
-          "comment": /^\/\/.*/m,
-          "title": {
-            pattern: /^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,
-            alias: "important",
-            inside: {
-              "punctuation": /^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/
-              // See rest below
-            }
-          },
-          "attribute-entry": {
-            pattern: /^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,
-            alias: "tag"
-          },
-          "attributes": attributes,
-          "hr": {
-            pattern: /^'{3,}$/m,
-            alias: "punctuation"
-          },
-          "page-break": {
-            pattern: /^<{3,}$/m,
-            alias: "punctuation"
-          },
-          "admonition": {
-            pattern: /^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,
-            alias: "keyword"
-          },
-          "callout": [
-            {
-              pattern: /(^[ \t]*)<?\d*>/m,
-              lookbehind: true,
-              alias: "symbol"
-            },
-            {
-              pattern: /<\d+>/,
-              alias: "symbol"
-            }
-          ],
-          "macro": {
-            pattern: /\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,
-            inside: {
-              "function": /^[a-z\d-]+(?=:)/,
-              "punctuation": /^::?/,
-              "attributes": {
-                pattern: /(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,
-                inside: attributes.inside
-              }
-            }
-          },
-          "inline": {
-            /*
-            			The initial look-behind prevents the highlighting of escaped quoted text.
-            
-            			Quoted text can be multi-line but cannot span an empty line.
-            			All quoted text can have attributes before [foobar, 'foobar', baz="bar"].
-            
-            			First, we handle the constrained quotes.
-            			Those must be bounded by non-word chars and cannot have spaces between the delimiter and the first char.
-            			They are, in order: _emphasis_, ``double quotes'', `single quotes', `monospace`, 'emphasis', *strong*, +monospace+ and #unquoted#
-            
-            			Then we handle the unconstrained quotes.
-            			Those do not have the restrictions of the constrained quotes.
-            			They are, in order: __emphasis__, **strong**, ++monospace++, +++passthrough+++, ##unquoted##, $$passthrough$$, ~subscript~, ^superscript^, {attribute-reference}, [[anchor]], [[[bibliography anchor]]], <<xref>>, (((indexes))) and ((indexes))
-            			 */
-            pattern: /(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,
-            lookbehind: true,
-            inside: {
-              "attributes": attributes,
-              "url": {
-                pattern: /^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,
-                inside: {
-                  "punctuation": /^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/
-                }
-              },
-              "attribute-ref": {
-                pattern: /^\{.+\}$/,
-                inside: {
-                  "variable": {
-                    pattern: /(^\{)[a-z\d,+_-]+/,
-                    lookbehind: true
-                  },
-                  "operator": /^[=?!#%@$]|!(?=[:}])/,
-                  "punctuation": /^\{|\}$|::?/
-                }
-              },
-              "italic": {
-                pattern: /^(['_])[\s\S]+\1$/,
-                inside: {
-                  "punctuation": /^(?:''?|__?)|(?:''?|__?)$/
-                }
-              },
-              "bold": {
-                pattern: /^\*[\s\S]+\*$/,
-                inside: {
-                  punctuation: /^\*\*?|\*\*?$/
-                }
-              },
-              "punctuation": /^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/
-            }
-          },
-          "replacement": {
-            pattern: /\((?:C|R|TM)\)/,
-            alias: "builtin"
-          },
-          "entity": /&#?[\da-z]{1,8};/i,
-          "line-continuation": {
-            pattern: /(^| )\+$/m,
-            lookbehind: true,
-            alias: "punctuation"
-          }
-        };
-        function copyFromAsciiDoc(keys) {
-          keys = keys.split(" ");
-          var o = {};
-          for (var i = 0, l = keys.length; i < l; i++) {
-            o[keys[i]] = asciidoc[keys[i]];
-          }
-          return o;
-        }
-        attributes.inside["interpreted"].inside.rest = copyFromAsciiDoc("macro inline replacement entity");
-        asciidoc["passthrough-block"].inside.rest = copyFromAsciiDoc("macro");
-        asciidoc["literal-block"].inside.rest = copyFromAsciiDoc("callout");
-        asciidoc["table"].inside.rest = copyFromAsciiDoc("comment-block passthrough-block literal-block other-block list-punctuation indented-block comment title attribute-entry attributes hr page-break admonition list-label callout macro inline replacement entity line-continuation");
-        asciidoc["other-block"].inside.rest = copyFromAsciiDoc("table list-punctuation indented-block comment attribute-entry attributes hr page-break admonition list-label macro inline replacement entity line-continuation");
-        asciidoc["title"].inside.rest = copyFromAsciiDoc("macro inline replacement entity");
-        Prism2.hooks.add("wrap", function(env) {
-          if (env.type === "entity") {
-            env.attributes["title"] = env.content.replace(/&amp;/, "&");
-          }
-        });
-        Prism2.languages.adoc = Prism2.languages.asciidoc;
-      })(Prism);
-      (function(Prism2) {
-        function replace(pattern, replacements) {
-          return pattern.replace(/<<(\d+)>>/g, function(m, index) {
-            return "(?:" + replacements[+index] + ")";
-          });
-        }
-        function re(pattern, replacements, flags) {
-          return RegExp(replace(pattern, replacements), flags || "");
-        }
-        function nested(pattern, depthLog2) {
-          for (var i = 0; i < depthLog2; i++) {
-            pattern = pattern.replace(/<<self>>/g, function() {
-              return "(?:" + pattern + ")";
-            });
-          }
-          return pattern.replace(/<<self>>/g, "[^\\s\\S]");
-        }
-        var keywordKinds = {
-          // keywords which represent a return or variable type
-          type: "bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",
-          // keywords which are used to declare a type
-          typeDeclaration: "class enum interface record struct",
-          // contextual keywords
-          // ("var" and "dynamic" are missing because they are used like types)
-          contextual: "add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",
-          // all other keywords
-          other: "abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield"
-        };
-        function keywordsToPattern(words) {
-          return "\\b(?:" + words.trim().replace(/ /g, "|") + ")\\b";
-        }
-        var typeDeclarationKeywords = keywordsToPattern(keywordKinds.typeDeclaration);
-        var keywords = RegExp(keywordsToPattern(keywordKinds.type + " " + keywordKinds.typeDeclaration + " " + keywordKinds.contextual + " " + keywordKinds.other));
-        var nonTypeKeywords = keywordsToPattern(keywordKinds.typeDeclaration + " " + keywordKinds.contextual + " " + keywordKinds.other);
-        var nonContextualKeywords = keywordsToPattern(keywordKinds.type + " " + keywordKinds.typeDeclaration + " " + keywordKinds.other);
-        var generic = nested(/<(?:[^<>;=+\-*/%&|^]|<<self>>)*>/.source, 2);
-        var nestedRound = nested(/\((?:[^()]|<<self>>)*\)/.source, 2);
-        var name = /@?\b[A-Za-z_]\w*\b/.source;
-        var genericName = replace(/<<0>>(?:\s*<<1>>)?/.source, [name, generic]);
-        var identifier = replace(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source, [nonTypeKeywords, genericName]);
-        var array = /\[\s*(?:,\s*)*\]/.source;
-        var typeExpressionWithoutTuple = replace(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source, [identifier, array]);
-        var tupleElement = replace(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source, [generic, nestedRound, array]);
-        var tuple = replace(/\(<<0>>+(?:,<<0>>+)+\)/.source, [tupleElement]);
-        var typeExpression = replace(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source, [tuple, identifier, array]);
-        var typeInside = {
-          "keyword": keywords,
-          "punctuation": /[<>()?,.:[\]]/
-        };
-        var character = /'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source;
-        var regularString = /"(?:\\.|[^\\"\r\n])*"/.source;
-        var verbatimString = /@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;
-        Prism2.languages.csharp = Prism2.languages.extend("clike", {
-          "string": [
-            {
-              pattern: re(/(^|[^$\\])<<0>>/.source, [verbatimString]),
-              lookbehind: true,
-              greedy: true
-            },
-            {
-              pattern: re(/(^|[^@$\\])<<0>>/.source, [regularString]),
-              lookbehind: true,
-              greedy: true
-            }
-          ],
-          "class-name": [
-            {
-              // Using static
-              // using static System.Math;
-              pattern: re(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source, [identifier]),
-              lookbehind: true,
-              inside: typeInside
-            },
-            {
-              // Using alias (type)
-              // using Project = PC.MyCompany.Project;
-              pattern: re(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source, [name, typeExpression]),
-              lookbehind: true,
-              inside: typeInside
-            },
-            {
-              // Using alias (alias)
-              // using Project = PC.MyCompany.Project;
-              pattern: re(/(\busing\s+)<<0>>(?=\s*=)/.source, [name]),
-              lookbehind: true
-            },
-            {
-              // Type declarations
-              // class Foo<A, B>
-              // interface Foo<out A, B>
-              pattern: re(/(\b<<0>>\s+)<<1>>/.source, [typeDeclarationKeywords, genericName]),
-              lookbehind: true,
-              inside: typeInside
-            },
-            {
-              // Single catch exception declaration
-              // catch(Foo)
-              // (things like catch(Foo e) is covered by variable declaration)
-              pattern: re(/(\bcatch\s*\(\s*)<<0>>/.source, [identifier]),
-              lookbehind: true,
-              inside: typeInside
-            },
-            {
-              // Name of the type parameter of generic constraints
-              // where Foo : class
-              pattern: re(/(\bwhere\s+)<<0>>/.source, [name]),
-              lookbehind: true
-            },
-            {
-              // Casts and checks via as and is.
-              // as Foo<A>, is Bar<B>
-              // (things like if(a is Foo b) is covered by variable declaration)
-              pattern: re(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source, [typeExpressionWithoutTuple]),
-              lookbehind: true,
-              inside: typeInside
-            },
-            {
-              // Variable, field and parameter declaration
-              // (Foo bar, Bar baz, Foo[,,] bay, Foo<Bar, FooBar<Bar>> bax)
-              pattern: re(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source, [typeExpression, nonContextualKeywords, name]),
-              inside: typeInside
-            }
-          ],
-          "keyword": keywords,
-          // https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure#literals
-          "number": /(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,
-          "operator": />>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,
-          "punctuation": /\?\.?|::|[{}[\];(),.:]/
-        });
-        Prism2.languages.insertBefore("csharp", "number", {
-          "range": {
-            pattern: /\.\./,
-            alias: "operator"
-          }
-        });
-        Prism2.languages.insertBefore("csharp", "punctuation", {
-          "named-parameter": {
-            pattern: re(/([(,]\s*)<<0>>(?=\s*:)/.source, [name]),
-            lookbehind: true,
-            alias: "punctuation"
-          }
-        });
-        Prism2.languages.insertBefore("csharp", "class-name", {
-          "namespace": {
-            // namespace Foo.Bar {}
-            // using Foo.Bar;
-            pattern: re(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source, [name]),
-            lookbehind: true,
-            inside: {
-              "punctuation": /\./
-            }
-          },
-          "type-expression": {
-            // default(Foo), typeof(Foo<Bar>), sizeof(int)
-            pattern: re(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source, [nestedRound]),
-            lookbehind: true,
-            alias: "class-name",
-            inside: typeInside
-          },
-          "return-type": {
-            // Foo<Bar> ForBar(); Foo IFoo.Bar() => 0
-            // int this[int index] => 0; T IReadOnlyList<T>.this[int index] => this[index];
-            // int Foo => 0; int Foo { get; set } = 0;
-            pattern: re(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source, [typeExpression, identifier]),
-            inside: typeInside,
-            alias: "class-name"
-          },
-          "constructor-invocation": {
-            // new List<Foo<Bar[]>> { }
-            pattern: re(/(\bnew\s+)<<0>>(?=\s*[[({])/.source, [typeExpression]),
-            lookbehind: true,
-            inside: typeInside,
-            alias: "class-name"
-          },
-          /*'explicit-implementation': {
-          	// int IFoo<Foo>.Bar => 0; void IFoo<Foo<Foo>>.Foo<T>();
-          	pattern: replace(/\b<<0>>(?=\.<<1>>)/, className, methodOrPropertyDeclaration),
-          	inside: classNameInside,
-          	alias: 'class-name'
-          },*/
-          "generic-method": {
-            // foo<Bar>()
-            pattern: re(/<<0>>\s*<<1>>(?=\s*\()/.source, [name, generic]),
-            inside: {
-              "function": re(/^<<0>>/.source, [name]),
-              "generic": {
-                pattern: RegExp(generic),
-                alias: "class-name",
-                inside: typeInside
-              }
-            }
-          },
-          "type-list": {
-            // The list of types inherited or of generic constraints
-            // class Foo<F> : Bar, IList<FooBar>
-            // where F : Bar, IList<int>
-            pattern: re(
-              /\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,
-              [typeDeclarationKeywords, genericName, name, typeExpression, keywords.source, nestedRound, /\bnew\s*\(\s*\)/.source]
-            ),
-            lookbehind: true,
-            inside: {
-              "record-arguments": {
-                pattern: re(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source, [genericName, nestedRound]),
-                lookbehind: true,
-                greedy: true,
-                inside: Prism2.languages.csharp
-              },
-              "keyword": keywords,
-              "class-name": {
-                pattern: RegExp(typeExpression),
-                greedy: true,
-                inside: typeInside
-              },
-              "punctuation": /[,()]/
-            }
-          },
-          "preprocessor": {
-            pattern: /(^[\t ]*)#.*/m,
-            lookbehind: true,
-            alias: "property",
-            inside: {
-              // highlight preprocessor directives as keywords
-              "directive": {
-                pattern: /(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,
-                lookbehind: true,
-                alias: "keyword"
-              }
-            }
-          }
-        });
-        var regularStringOrCharacter = regularString + "|" + character;
-        var regularStringCharacterOrComment = replace(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source, [regularStringOrCharacter]);
-        var roundExpression = nested(replace(/[^"'/()]|<<0>>|\(<<self>>*\)/.source, [regularStringCharacterOrComment]), 2);
-        var attrTarget = /\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source;
-        var attr = replace(/<<0>>(?:\s*\(<<1>>*\))?/.source, [identifier, roundExpression]);
-        Prism2.languages.insertBefore("csharp", "class-name", {
-          "attribute": {
-            // Attributes
-            // [Foo], [Foo(1), Bar(2, Prop = "foo")], [return: Foo(1), Bar(2)], [assembly: Foo(Bar)]
-            pattern: re(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source, [attrTarget, attr]),
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "target": {
-                pattern: re(/^<<0>>(?=\s*:)/.source, [attrTarget]),
-                alias: "keyword"
-              },
-              "attribute-arguments": {
-                pattern: re(/\(<<0>>*\)/.source, [roundExpression]),
-                inside: Prism2.languages.csharp
-              },
-              "class-name": {
-                pattern: RegExp(identifier),
-                inside: {
-                  "punctuation": /\./
-                }
-              },
-              "punctuation": /[:,]/
-            }
-          }
-        });
-        var formatString = /:[^}\r\n]+/.source;
-        var mInterpolationRound = nested(replace(/[^"'/()]|<<0>>|\(<<self>>*\)/.source, [regularStringCharacterOrComment]), 2);
-        var mInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [mInterpolationRound, formatString]);
-        var sInterpolationRound = nested(replace(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<<self>>*\)/.source, [regularStringOrCharacter]), 2);
-        var sInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [sInterpolationRound, formatString]);
-        function createInterpolationInside(interpolation, interpolationRound) {
-          return {
-            "interpolation": {
-              pattern: re(/((?:^|[^{])(?:\{\{)*)<<0>>/.source, [interpolation]),
-              lookbehind: true,
-              inside: {
-                "format-string": {
-                  pattern: re(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source, [interpolationRound, formatString]),
-                  lookbehind: true,
-                  inside: {
-                    "punctuation": /^:/
-                  }
-                },
-                "punctuation": /^\{|\}$/,
-                "expression": {
-                  pattern: /[\s\S]+/,
-                  alias: "language-csharp",
-                  inside: Prism2.languages.csharp
-                }
-              }
-            },
-            "string": /[\s\S]+/
-          };
-        }
-        Prism2.languages.insertBefore("csharp", "string", {
-          "interpolation-string": [
-            {
-              pattern: re(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source, [mInterpolation]),
-              lookbehind: true,
-              greedy: true,
-              inside: createInterpolationInside(mInterpolation, mInterpolationRound)
-            },
-            {
-              pattern: re(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source, [sInterpolation]),
-              lookbehind: true,
-              greedy: true,
-              inside: createInterpolationInside(sInterpolation, sInterpolationRound)
-            }
-          ],
-          "char": {
-            pattern: RegExp(character),
-            greedy: true
-          }
-        });
-        Prism2.languages.dotnet = Prism2.languages.cs = Prism2.languages.csharp;
-      })(Prism);
-      Prism.languages.aspnet = Prism.languages.extend("markup", {
-        "page-directive": {
-          pattern: /<%\s*@.*%>/,
-          alias: "tag",
-          inside: {
-            "page-directive": {
-              pattern: /<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,
-              alias: "tag"
-            },
-            rest: Prism.languages.markup.tag.inside
-          }
-        },
-        "directive": {
-          pattern: /<%.*%>/,
-          alias: "tag",
-          inside: {
-            "directive": {
-              pattern: /<%\s*?[$=%#:]{0,2}|%>/,
-              alias: "tag"
-            },
-            rest: Prism.languages.csharp
-          }
-        }
-      });
-      Prism.languages.aspnet.tag.pattern = /<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/;
-      Prism.languages.insertBefore("inside", "punctuation", {
-        "directive": Prism.languages.aspnet["directive"]
-      }, Prism.languages.aspnet.tag.inside["attr-value"]);
-      Prism.languages.insertBefore("aspnet", "comment", {
-        "asp-comment": {
-          pattern: /<%--[\s\S]*?--%>/,
-          alias: ["asp", "comment"]
-        }
-      });
-      Prism.languages.insertBefore("aspnet", Prism.languages.javascript ? "script" : "tag", {
-        "asp-script": {
-          pattern: /(<script(?=.*runat=['"]?server\b)[^>]*>)[\s\S]*?(?=<\/script>)/i,
-          lookbehind: true,
-          alias: ["asp", "script"],
-          inside: Prism.languages.csharp || {}
-        }
-      });
-      Prism.languages.asm6502 = {
-        "comment": /;.*/,
-        "directive": {
-          pattern: /\.\w+(?= )/,
-          alias: "property"
-        },
-        "string": /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
-        "op-code": {
-          pattern: /\b(?:ADC|AND|ASL|BCC|BCS|BEQ|BIT|BMI|BNE|BPL|BRK|BVC|BVS|CLC|CLD|CLI|CLV|CMP|CPX|CPY|DEC|DEX|DEY|EOR|INC|INX|INY|JMP|JSR|LDA|LDX|LDY|LSR|NOP|ORA|PHA|PHP|PLA|PLP|ROL|ROR|RTI|RTS|SBC|SEC|SED|SEI|STA|STX|STY|TAX|TAY|TSX|TXA|TXS|TYA|adc|and|asl|bcc|bcs|beq|bit|bmi|bne|bpl|brk|bvc|bvs|clc|cld|cli|clv|cmp|cpx|cpy|dec|dex|dey|eor|inc|inx|iny|jmp|jsr|lda|ldx|ldy|lsr|nop|ora|pha|php|pla|plp|rol|ror|rti|rts|sbc|sec|sed|sei|sta|stx|sty|tax|tay|tsx|txa|txs|tya)\b/,
-          alias: "keyword"
-        },
-        "hex-number": {
-          pattern: /#?\$[\da-f]{1,4}\b/i,
-          alias: "number"
-        },
-        "binary-number": {
-          pattern: /#?%[01]+\b/,
-          alias: "number"
-        },
-        "decimal-number": {
-          pattern: /#?\b\d+\b/,
-          alias: "number"
-        },
-        "register": {
-          pattern: /\b[xya]\b/i,
-          alias: "variable"
-        },
-        "punctuation": /[(),:]/
-      };
-      Prism.languages.asmatmel = {
-        "comment": {
-          pattern: /;.*/,
-          greedy: true
-        },
-        "string": {
-          pattern: /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
-          greedy: true
-        },
-        "constant": /\b(?:PORT[A-Z]|DDR[A-Z]|(?:DD|P)[A-Z](?:\d|[0-2]\d|3[01]))\b/,
-        "directive": {
-          pattern: /\.\w+(?= )/,
-          alias: "property"
-        },
-        "r-register": {
-          pattern: /\br(?:\d|[12]\d|3[01])\b/,
-          alias: "variable"
-        },
-        "op-code": {
-          pattern: /\b(?:ADC|ADD|ADIW|AND|ANDI|ASR|BCLR|BLD|BRBC|BRBS|BRCC|BRCS|BREAK|BREQ|BRGE|BRHC|BRHS|BRID|BRIE|BRLO|BRLT|BRMI|BRNE|BRPL|BRSH|BRTC|BRTS|BRVC|BRVS|BSET|BST|CALL|CBI|CBR|CLC|CLH|CLI|CLN|CLR|CLS|CLT|CLV|CLZ|COM|CP|CPC|CPI|CPSE|DEC|DES|EICALL|EIJMP|ELPM|EOR|FMUL|FMULS|FMULSU|ICALL|IJMP|IN|INC|JMP|LAC|LAS|LAT|LD|LD[A-Za-z0-9]|LPM|LSL|LSR|MOV|MOVW|MUL|MULS|MULSU|NEG|NOP|OR|ORI|OUT|POP|PUSH|RCALL|RET|RETI|RJMP|ROL|ROR|SBC|SBCI|SBI|SBIC|SBIS|SBIW|SBR|SBRC|SBRS|SEC|SEH|SEI|SEN|SER|SES|SET|SEV|SEZ|SLEEP|SPM|ST|ST[A-Z0-9]|SUB|SUBI|SWAP|TST|WDR|XCH|adc|add|adiw|and|andi|asr|bclr|bld|brbc|brbs|brcc|brcs|break|breq|brge|brhc|brhs|brid|brie|brlo|brlt|brmi|brne|brpl|brsh|brtc|brts|brvc|brvs|bset|bst|call|cbi|cbr|clc|clh|cli|cln|clr|cls|clt|clv|clz|com|cp|cpc|cpi|cpse|dec|des|eicall|eijmp|elpm|eor|fmul|fmuls|fmulsu|icall|ijmp|in|inc|jmp|lac|las|lat|ld|ld[a-z0-9]|lpm|lsl|lsr|mov|movw|mul|muls|mulsu|neg|nop|or|ori|out|pop|push|rcall|ret|reti|rjmp|rol|ror|sbc|sbci|sbi|sbic|sbis|sbiw|sbr|sbrc|sbrs|sec|seh|sei|sen|ser|ses|set|sev|sez|sleep|spm|st|st[a-zA-Z0-9]|sub|subi|swap|tst|wdr|xch)\b/,
-          alias: "keyword"
-        },
-        "hex-number": {
-          pattern: /#?\$[\da-f]{2,4}\b/i,
-          alias: "number"
-        },
-        "binary-number": {
-          pattern: /#?%[01]+\b/,
-          alias: "number"
-        },
-        "decimal-number": {
-          pattern: /#?\b\d+\b/,
-          alias: "number"
-        },
-        "register": {
-          pattern: /\b[acznvshtixy]\b/i,
-          alias: "variable"
-        },
-        "operator": />>=?|<<=?|&[&=]?|\|[\|=]?|[-+*/%^!=<>?]=?/,
-        "punctuation": /[(),:]/
-      };
-      Prism.languages.autohotkey = {
-        "comment": [
-          {
-            pattern: /(^|\s);.*/,
-            lookbehind: true
-          },
-          {
-            pattern: /(^[\t ]*)\/\*(?:[\r\n](?![ \t]*\*\/)|[^\r\n])*(?:[\r\n][ \t]*\*\/)?/m,
-            lookbehind: true,
-            greedy: true
-          }
-        ],
-        "tag": {
-          // labels
-          pattern: /^([ \t]*)[^\s,`":]+(?=:[ \t]*$)/m,
-          lookbehind: true
-        },
-        "string": /"(?:[^"\n\r]|"")*"/,
-        "variable": /%\w+%/,
-        "number": /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,
-        "operator": /\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "command": {
-          pattern: /\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i,
-          alias: "selector"
-        },
-        "constant": /\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i,
-        "builtin": /\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|isfunc|islabel|IsObject|ln|log|ltrim|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|numget|numput|onmessage|regexmatch|regexreplace|registercallback|round|rtrim|sb_seticon|sb_setparts|sb_settext|sin|sqrt|strlen|strreplace|strsplit|substr|tan|tv_add|tv_delete|tv_get|tv_getchild|tv_getcount|tv_getnext|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__Call|__Get|__New|__Set)\b/i,
-        "symbol": /\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i,
-        "directive": {
-          pattern: /#[a-z]+\b/i,
-          alias: "important"
-        },
-        "keyword": /\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i,
-        "function": /[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/,
-        "punctuation": /[{}[\]():,]/
-      };
-      Prism.languages.autoit = {
-        "comment": [
-          /;.*/,
-          {
-            // The multi-line comments delimiters can actually be commented out with ";"
-            pattern: /(^[\t ]*)#(?:comments-start|cs)[\s\S]*?^[ \t]*#(?:ce|comments-end)/m,
-            lookbehind: true
-          }
-        ],
-        "url": {
-          pattern: /(^[\t ]*#include\s+)(?:<[^\r\n>]+>|"[^\r\n"]+")/m,
-          lookbehind: true
-        },
-        "string": {
-          pattern: /(["'])(?:\1\1|(?!\1)[^\r\n])*\1/,
-          greedy: true,
-          inside: {
-            "variable": /([%$@])\w+\1/
-          }
-        },
-        "directive": {
-          pattern: /(^[\t ]*)#[\w-]+/m,
-          lookbehind: true,
-          alias: "keyword"
-        },
-        "function": /\b\w+(?=\()/,
-        // Variables and macros
-        "variable": /[$@]\w+/,
-        "keyword": /\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\b/i,
-        "number": /\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,
-        "boolean": /\b(?:False|True)\b/i,
-        "operator": /<[=>]?|[-+*\/=&>]=?|[?^]|\b(?:And|Not|Or)\b/i,
-        "punctuation": /[\[\]().,:]/
-      };
-      (function(Prism2) {
-        function replace(pattern, replacements) {
-          return pattern.replace(/<<(\d+)>>/g, function(m, index) {
-            return replacements[+index];
-          });
-        }
-        function re(pattern, replacements, flags) {
-          return RegExp(replace(pattern, replacements), flags || "");
-        }
-        var types = /bool|clip|float|int|string|val/.source;
-        var internals = [
-          // bools
-          /is(?:bool|clip|float|int|string)|defined|(?:(?:internal)?function|var)?exists?/.source,
-          // control
-          /apply|assert|default|eval|import|nop|select|undefined/.source,
-          // global
-          /opt_(?:allowfloataudio|avipadscanlines|dwchannelmask|enable_(?:b64a|planartopackedrgb|v210|y3_10_10|y3_10_16)|usewaveextensible|vdubplanarhack)|set(?:cachemode|maxcpu|memorymax|planarlegacyalignment|workingdir)/.source,
-          // conv
-          /hex(?:value)?|value/.source,
-          // numeric
-          /abs|ceil|continued(?:denominator|numerator)?|exp|floor|fmod|frac|log(?:10)?|max|min|muldiv|pi|pow|rand|round|sign|spline|sqrt/.source,
-          // trig
-          /a?sinh?|a?cosh?|a?tan[2h]?/.source,
-          // bit
-          /(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))/.source,
-          // runtime
-          /average(?:[bgr]|chroma[uv]|luma)|(?:[rgb]|chroma[uv]|luma|rgb|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)/.source,
-          // script
-          /getprocessinfo|logmsg|script(?:dir(?:utf8)?|file(?:utf8)?|name(?:utf8)?)|setlogparams/.source,
-          // string
-          /chr|(?:fill|find|left|mid|replace|rev|right)str|format|[lu]case|ord|str(?:cmpi?|fromutf8|len|toutf8)|time|trim(?:all|left|right)/.source,
-          // version
-          /isversionorgreater|version(?:number|string)/.source,
-          // helper
-          /buildpixeltype|colorspacenametopixeltype/.source,
-          // avsplus
-          /addautoloaddir|on(?:cpu|cuda)|prefetch|setfiltermtmode/.source
-        ].join("|");
-        var properties = [
-          // content
-          /has(?:audio|video)/.source,
-          // resolution
-          /height|width/.source,
-          // framerate
-          /frame(?:count|rate)|framerate(?:denominator|numerator)/.source,
-          // interlacing
-          /getparity|is(?:field|frame)based/.source,
-          // color format
-          /bitspercomponent|componentsize|hasalpha|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:va?|y2))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|numcomponents|pixeltype/.source,
-          // audio
-          /audio(?:bits|channels|duration|length(?:[fs]|hi|lo)?|rate)|isaudio(?:float|int)/.source
-        ].join("|");
-        var filters = [
-          // source
-          /avi(?:file)?source|directshowsource|image(?:reader|source|sourceanim)|opendmlsource|segmented(?:avisource|directshowsource)|wavsource/.source,
-          // color
-          /coloryuv|convertbacktoyuy2|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:411|420|422|444)|YUY2)|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:chroma|luma)|rgbadjust|show(?:alpha|blue|green|red)|swapuv|tweak|[uv]toy8?|ytouv/.source,
-          // overlay
-          /(?:colorkey|reset)mask|layer|mask(?:hs)?|merge|overlay|subtract/.source,
-          // geometry
-          /addborders|(?:bicubic|bilinear|blackman|gauss|lanczos4|lanczos|point|sinc|spline(?:16|36|64))resize|crop(?:bottom)?|flip(?:horizontal|vertical)|(?:horizontal|vertical)?reduceby2|letterbox|skewrows|turn(?:180|left|right)/.source,
-          // pixel
-          /blur|fixbrokenchromaupsampling|generalconvolution|(?:spatial|temporal)soften|sharpen/.source,
-          // timeline
-          /trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|io|out)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)/.source,
-          // interlace
-          /assume[bt]ff|assume(?:field|frame)based|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|fields|rows)|swapfields|weave(?:columns|rows)?/.source,
-          // audio
-          /amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|ssrc|supereq|timestretch/.source,
-          // conditional
-          /animate|applyrange|conditional(?:filter|reader|select)|frameevaluate|scriptclip|tcp(?:server|source)|writefile(?:end|if|start)?/.source,
-          // export
-          /imagewriter/.source,
-          // debug
-          /blackness|blankclip|colorbars(?:hd)?|compare|dumpfiltergraph|echo|histogram|info|messageclip|preroll|setgraphanalysis|show(?:framenumber|smpte|time)|showfiveversions|stack(?:horizontal|vertical)|subtitle|tone|version/.source
-        ].join("|");
-        var allinternals = [internals, properties, filters].join("|");
-        Prism2.languages.avisynth = {
-          "comment": [
-            {
-              // Matches [* *] nestable block comments, but only supports 1 level of nested comments
-              // /\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|<self>)*\*\]/
-              pattern: /(^|[^\\])\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|\[\*(?:[^\[*]|\[(?!\*)|\*(?!\]))*\*\])*\*\]/,
-              lookbehind: true,
-              greedy: true
-            },
-            {
-              // Matches /* */ block comments
-              pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
-              lookbehind: true,
-              greedy: true
-            },
-            {
-              // Matches # comments
-              pattern: /(^|[^\\$])#.*/,
-              lookbehind: true,
-              greedy: true
-            }
-          ],
-          // Handle before strings because optional arguments are surrounded by double quotes
-          "argument": {
-            pattern: re(/\b(?:<<0>>)\s+("?)\w+\1/.source, [types], "i"),
-            inside: {
-              "keyword": /^\w+/
-            }
-          },
-          // Optional argument assignment
-          "argument-label": {
-            pattern: /([,(][\s\\]*)\w+\s*=(?!=)/,
-            lookbehind: true,
-            inside: {
-              "argument-name": {
-                pattern: /^\w+/,
-                alias: "punctuation"
-              },
-              "punctuation": /=$/
-            }
-          },
-          "string": [
-            {
-              // triple double-quoted
-              pattern: /"""[\s\S]*?"""/,
-              greedy: true
-            },
-            {
-              // single double-quoted
-              pattern: /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
-              greedy: true,
-              inside: {
-                "constant": {
-                  // These *are* case-sensitive!
-                  pattern: /\b(?:DEFAULT_MT_MODE|(?:MAINSCRIPT|PROGRAM|SCRIPT)DIR|(?:MACHINE|USER)_(?:CLASSIC|PLUS)_PLUGINS)\b/
-                }
-              }
-            }
-          ],
-          // The special "last" variable that takes the value of the last implicitly returned clip
-          "variable": /\b(?:last)\b/i,
-          "boolean": /\b(?:false|no|true|yes)\b/i,
-          "keyword": /\b(?:catch|else|for|function|global|if|return|try|while|__END__)\b/i,
-          "constant": /\bMT_(?:MULTI_INSTANCE|NICE_FILTER|SERIALIZED|SPECIAL_MT)\b/,
-          // AviSynth's internal functions, filters, and properties
-          "builtin-function": {
-            pattern: re(/\b(?:<<0>>)\b/.source, [allinternals], "i"),
-            alias: "function"
-          },
-          "type-cast": {
-            pattern: re(/\b(?:<<0>>)(?=\s*\()/.source, [types], "i"),
-            alias: "keyword"
-          },
-          // External/user-defined filters
-          "function": {
-            pattern: /\b[a-z_]\w*(?=\s*\()|(\.)[a-z_]\w*\b/i,
-            lookbehind: true
-          },
-          // Matches a \ as the first or last character on a line
-          "line-continuation": {
-            pattern: /(^[ \t]*)\\|\\(?=[ \t]*$)/m,
-            lookbehind: true,
-            alias: "punctuation"
-          },
-          "number": /\B\$(?:[\da-f]{6}|[\da-f]{8})\b|(?:(?:\b|\B-)\d+(?:\.\d*)?\b|\B\.\d+\b)/i,
-          "operator": /\+\+?|[!=<>]=?|&&|\|\||[?:*/%-]/,
-          "punctuation": /[{}\[\]();,.]/
-        };
-        Prism2.languages.avs = Prism2.languages.avisynth;
-      })(Prism);
-      Prism.languages["avro-idl"] = {
-        "comment": {
-          pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
-          greedy: true
-        },
-        "string": {
-          pattern: /(^|[^\\])"(?:[^\r\n"\\]|\\.)*"/,
-          lookbehind: true,
-          greedy: true
-        },
-        "annotation": {
-          pattern: /@(?:[$\w.-]|`[^\r\n`]+`)+/,
-          greedy: true,
-          alias: "function"
-        },
-        "function-identifier": {
-          pattern: /`[^\r\n`]+`(?=\s*\()/,
-          greedy: true,
-          alias: "function"
-        },
-        "identifier": {
-          pattern: /`[^\r\n`]+`/,
-          greedy: true
-        },
-        "class-name": {
-          pattern: /(\b(?:enum|error|protocol|record|throws)\b\s+)[$\w]+/,
-          lookbehind: true,
-          greedy: true
-        },
-        "keyword": /\b(?:array|boolean|bytes|date|decimal|double|enum|error|false|fixed|float|idl|import|int|local_timestamp_ms|long|map|null|oneway|protocol|record|schema|string|throws|time_ms|timestamp_ms|true|union|uuid|void)\b/,
-        "function": /\b[a-z_]\w*(?=\s*\()/i,
-        "number": [
-          {
-            pattern: /(^|[^\w.])-?(?:(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|0x(?:[a-f0-9]+(?:\.[a-f0-9]*)?|\.[a-f0-9]+)(?:p[+-]?\d+)?)[dfl]?(?![\w.])/i,
-            lookbehind: true
-          },
-          /-?\b(?:Infinity|NaN)\b/
-        ],
-        "operator": /=/,
-        "punctuation": /[()\[\]{}<>.:,;-]/
-      };
-      Prism.languages.avdl = Prism.languages["avro-idl"];
-      Prism.languages.awk = {
-        "hashbang": {
-          pattern: /^#!.*/,
-          greedy: true,
-          alias: "comment"
-        },
-        "comment": {
-          pattern: /#.*/,
-          greedy: true
-        },
-        "string": {
-          pattern: /(^|[^\\])"(?:[^\\"\r\n]|\\.)*"/,
-          lookbehind: true,
-          greedy: true
-        },
-        "regex": {
-          pattern: /((?:^|[^\w\s)])\s*)\/(?:[^\/\\\r\n]|\\.)*\//,
-          lookbehind: true,
-          greedy: true
-        },
-        "variable": /\$\w+/,
-        "keyword": /\b(?:BEGIN|BEGINFILE|END|ENDFILE|break|case|continue|default|delete|do|else|exit|for|function|getline|if|in|next|nextfile|printf?|return|switch|while)\b|@(?:include|load)\b/,
-        "function": /\b[a-z_]\w*(?=\s*\()/i,
-        "number": /\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[a-fA-F0-9]+)\b/,
-        "operator": /--|\+\+|!?~|>&|>>|<<|(?:\*\*|[<>!=+\-*/%^])=?|&&|\|[|&]|[?:]/,
-        "punctuation": /[()[\]{},;]/
-      };
-      Prism.languages.gawk = Prism.languages.awk;
-      (function(Prism2) {
-        var envVars = "\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b";
-        var commandAfterHeredoc = {
-          pattern: /(^(["']?)\w+\2)[ \t]+\S.*/,
-          lookbehind: true,
-          alias: "punctuation",
-          // this looks reasonably well in all themes
-          inside: null
-          // see below
-        };
-        var insideString = {
-          "bash": commandAfterHeredoc,
-          "environment": {
-            pattern: RegExp("\\$" + envVars),
-            alias: "constant"
-          },
-          "variable": [
-            // [0]: Arithmetic Environment
-            {
-              pattern: /\$?\(\([\s\S]+?\)\)/,
-              greedy: true,
-              inside: {
-                // If there is a $ sign at the beginning highlight $(( and )) as variable
-                "variable": [
-                  {
-                    pattern: /(^\$\(\([\s\S]+)\)\)/,
-                    lookbehind: true
-                  },
-                  /^\$\(\(/
-                ],
-                "number": /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,
-                // Operators according to https://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic
-                "operator": /--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,
-                // If there is no $ sign at the beginning highlight (( and )) as punctuation
-                "punctuation": /\(\(?|\)\)?|,|;/
-              }
-            },
-            // [1]: Command Substitution
-            {
-              pattern: /\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,
-              greedy: true,
-              inside: {
-                "variable": /^\$\(|^`|\)$|`$/
-              }
-            },
-            // [2]: Brace expansion
-            {
-              pattern: /\$\{[^}]+\}/,
-              greedy: true,
-              inside: {
-                "operator": /:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,
-                "punctuation": /[\[\]]/,
-                "environment": {
-                  pattern: RegExp("(\\{)" + envVars),
-                  lookbehind: true,
-                  alias: "constant"
-                }
-              }
-            },
-            /\$(?:\w+|[#?*!@$])/
-          ],
-          // Escape sequences from echo and printf's manuals, and escaped quotes.
-          "entity": /\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/
-        };
-        Prism2.languages.bash = {
-          "shebang": {
-            pattern: /^#!\s*\/.*/,
-            alias: "important"
-          },
-          "comment": {
-            pattern: /(^|[^"{\\$])#.*/,
-            lookbehind: true
-          },
-          "function-name": [
-            // a) function foo {
-            // b) foo() {
-            // c) function foo() {
-            // but not “foo {”
-            {
-              // a) and c)
-              pattern: /(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,
-              lookbehind: true,
-              alias: "function"
-            },
-            {
-              // b)
-              pattern: /\b[\w-]+(?=\s*\(\s*\)\s*\{)/,
-              alias: "function"
-            }
-          ],
-          // Highlight variable names as variables in for and select beginnings.
-          "for-or-select": {
-            pattern: /(\b(?:for|select)\s+)\w+(?=\s+in\s)/,
-            alias: "variable",
-            lookbehind: true
-          },
-          // Highlight variable names as variables in the left-hand part
-          // of assignments (“=” and “+=”).
-          "assign-left": {
-            pattern: /(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,
-            inside: {
-              "environment": {
-                pattern: RegExp("(^|[\\s;|&]|[<>]\\()" + envVars),
-                lookbehind: true,
-                alias: "constant"
-              }
-            },
-            alias: "variable",
-            lookbehind: true
-          },
-          "string": [
-            // Support for Here-documents https://en.wikipedia.org/wiki/Here_document
-            {
-              pattern: /((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,
-              lookbehind: true,
-              greedy: true,
-              inside: insideString
-            },
-            // Here-document with quotes around the tag
-            // → No expansion (so no “inside”).
-            {
-              pattern: /((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,
-              lookbehind: true,
-              greedy: true,
-              inside: {
-                "bash": commandAfterHeredoc
-              }
-            },
-            // “Normal” string
-            {
-              // https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html
-              pattern: /(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,
-              lookbehind: true,
-              greedy: true,
-              inside: insideString
-            },
-            {
-              // https://www.gnu.org/software/bash/manual/html_node/Single-Quotes.html
-              pattern: /(^|[^$\\])'[^']*'/,
-              lookbehind: true,
-              greedy: true
-            },
-            {
-              // https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html
-              pattern: /\$'(?:[^'\\]|\\[\s\S])*'/,
-              greedy: true,
-              inside: {
-                "entity": insideString.entity
-              }
-            }
-          ],
-          "environment": {
-            pattern: RegExp("\\$?" + envVars),
-            alias: "constant"
-          },
-          "variable": insideString.variable,
-          "function": {
-            pattern: /(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,
-            lookbehind: true
-          },
-          "keyword": {
-            pattern: /(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,
-            lookbehind: true
-          },
-          // https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html
-          "builtin": {
-            pattern: /(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,
-            lookbehind: true,
-            // Alias added to make those easier to distinguish from strings.
-            alias: "class-name"
-          },
-          "boolean": {
-            pattern: /(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,
-            lookbehind: true
-          },
-          "file-descriptor": {
-            pattern: /\B&\d\b/,
-            alias: "important"
-          },
-          "operator": {
-            // Lots of redirections here, but not just that.
-            pattern: /\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,
-            inside: {
-              "file-descriptor": {
-                pattern: /^\d/,
-                alias: "important"
-              }
-            }
-          },
-          "punctuation": /\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,
-          "number": {
-            pattern: /(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,
-            lookbehind: true
-          }
-        };
-        commandAfterHeredoc.inside = Prism2.languages.bash;
-        var toBeCopied = [
-          "comment",
-          "function-name",
-          "for-or-select",
-          "assign-left",
-          "string",
-          "environment",
-          "function",
-          "keyword",
-          "builtin",
-          "boolean",
-          "file-descriptor",
-          "operator",
-          "punctuation",
-          "number"
-        ];
-        var inside = insideString.variable[1].inside;
-        for (var i = 0; i < toBeCopied.length; i++) {
-          inside[toBeCopied[i]] = Prism2.languages.bash[toBeCopied[i]];
-        }
-        Prism2.languages.shell = Prism2.languages.bash;
-      })(Prism);
-      Prism.languages.basic = {
-        "comment": {
-          pattern: /(?:!|REM\b).+/i,
-          inside: {
-            "keyword": /^REM/i
-          }
-        },
-        "string": {
-          pattern: /"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/,
-          greedy: true
-        },
-        "number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
-        "keyword": /\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SELECT CASE|SHARED|SHELL|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\$|\b)/i,
-        "function": /\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\$|\b)/i,
-        "operator": /<[=>]?|>=?|[+\-*\/^=&]|\b(?:AND|EQV|IMP|NOT|OR|XOR)\b/i,
-        "punctuation": /[,;:()]/
-      };
-      (function(Prism2) {
-        var variable = /%%?[~:\w]+%?|!\S+!/;
-        var parameter = {
-          pattern: /\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,
-          alias: "attr-name",
-          inside: {
-            "punctuation": /:/
-          }
-        };
-        var string = /"(?:[\\"]"|[^"])*"(?!")/;
-        var number = /(?:\b|-)\d+\b/;
-        Prism2.languages.batch = {
-          "comment": [
-            /^::.*/m,
-            {
-              pattern: /((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,
-              lookbehind: true
-            }
-          ],
-          "label": {
-            pattern: /^:.*/m,
-            alias: "property"
-          },
-          "command": [
-            {
-              // FOR command
-              pattern: /((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,
-              lookbehind: true,
-              inside: {
-                "keyword": /\b(?:do|in)\b|^for\b/i,
-                "string": string,
-                "parameter": parameter,
-                "variable": variable,
-                "number": number,
-                "punctuation": /[()',]/
-              }
-            },
-            {
-              // IF command
-              pattern: /((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im,
-              lookbehind: true,
-              inside: {
-                "keyword": /\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i,
-                "string": string,
-                "parameter": parameter,
-                "variable": variable,
-                "number": number,
-                "operator": /\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i
-              }
-            },
-            {
-              // ELSE command
-              pattern: /((?:^|[&()])[ \t]*)else\b/im,
-              lookbehind: true,
-              inside: {
-                "keyword": /^else\b/i
-              }
-            },
-            {
-              // SET command
-              pattern: /((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,
-              lookbehind: true,
-              inside: {
-                "keyword": /^set\b/i,
-                "string": string,
-                "parameter": parameter,
-                "variable": [
-                  variable,
-                  /\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/
-                ],
-                "number": number,
-                "operator": /[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,
-                "punctuation": /[()',]/
-              }
-            },
-            {
-              // Other commands
-              pattern: /((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m,
-              lookbehind: true,
-              inside: {
-                "keyword": /^\w+\b/,
-                "string": string,
-                "parameter": parameter,
-                "label": {
-                  pattern: /(^\s*):\S+/m,
-                  lookbehind: true,
-                  alias: "property"
-                },
-                "variable": variable,
-                "number": number,
-                "operator": /\^/
-              }
-            }
-          ],
-          "operator": /[&@]/,
-          "punctuation": /[()']/
-        };
-      })(Prism);
-      Prism.languages.bbcode = {
-        "tag": {
-          pattern: /\[\/?[^\s=\]]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))?(?:\s+[^\s=\]]+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))*\s*\]/,
-          inside: {
-            "tag": {
-              pattern: /^\[\/?[^\s=\]]+/,
-              inside: {
-                "punctuation": /^\[\/?/
-              }
-            },
-            "attr-value": {
-              pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+)/,
-              inside: {
-                "punctuation": [
-                  /^=/,
-                  {
-                    pattern: /^(\s*)["']|["']$/,
-                    lookbehind: true
-                  }
-                ]
-              }
-            },
-            "punctuation": /\]/,
-            "attr-name": /[^\s=\]]+/
-          }
-        }
-      };
-      Prism.languages.shortcode = Prism.languages.bbcode;
-      Prism.languages.bicep = {
-        "comment": [
-          {
-            // multiline comments eg /* ASDF */
-            pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
-            lookbehind: true,
-            greedy: true
-          },
-          {
-            // singleline comments eg // ASDF
-            pattern: /(^|[^\\:])\/\/.*/,
-            lookbehind: true,
-            greedy: true
-          }
-        ],
-        "property": [
-          {
-            pattern: /([\r\n][ \t]*)[a-z_]\w*(?=[ \t]*:)/i,
-            lookbehind: true
-          },
-          {
-            pattern: /([\r\n][ \t]*)'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'(?=[ \t]*:)/,
-            lookbehind: true,
-            greedy: true
-          }
-        ],
-        "string": [
-          {
-            pattern: /'''[^'][\s\S]*?'''/,
-            greedy: true
-          },
-          {
-            pattern: /(^|[^\\'])'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'/,
-            lookbehind: true,
-            greedy: true
-          }
-        ],
-        "interpolated-string": {
-          pattern: /(^|[^\\'])'(?:\\.|\$(?:(?!\{)|\{[^{}\r\n]*\})|[^'\\\r\n$])*'/,
-          lookbehind: true,
-          greedy: true,
-          inside: {
-            "interpolation": {
-              pattern: /\$\{[^{}\r\n]*\}/,
-              inside: {
-                "expression": {
-                  pattern: /(^\$\{)[\s\S]+(?=\}$)/,
-                  lookbehind: true
-                },
-                "punctuation": /^\$\{|\}$/
-              }
-            },
-            "string": /[\s\S]+/
-          }
-        },
-        "datatype": {
-          pattern: /(\b(?:output|param)\b[ \t]+\w+[ \t]+)\w+\b/,
-          lookbehind: true,
-          alias: "class-name"
-        },
-        "boolean": /\b(?:false|true)\b/,
-        // https://github.com/Azure/bicep/blob/114a3251b4e6e30082a58729f19a8cc4e374ffa6/src/textmate/bicep.tmlanguage#L184
-        "keyword": /\b(?:existing|for|if|in|module|null|output|param|resource|targetScope|var)\b/,
-        "decorator": /@\w+\b/,
-        "function": /\b[a-z_]\w*(?=[ \t]*\()/i,
-        "number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
-        "operator": /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/,
-        "punctuation": /[{}[\];(),.:]/
-      };
-      Prism.languages.bicep["interpolated-string"].inside["interpolation"].inside["expression"].inside = Prism.languages.bicep;
-      Prism.languages.birb = Prism.languages.extend("clike", {
-        "string": {
-          pattern: /r?("|')(?:\\.|(?!\1)[^\\])*\1/,
-          greedy: true
-        },
-        "class-name": [
-          /\b[A-Z](?:[\d_]*[a-zA-Z]\w*)?\b/,
-          // matches variable and function return types (parameters as well).
-          /\b(?:[A-Z]\w*|(?!(?:var|void)\b)[a-z]\w*)(?=\s+\w+\s*[;,=()])/
-        ],
-        "keyword": /\b(?:assert|break|case|class|const|default|else|enum|final|follows|for|grab|if|nest|new|next|noSeeb|return|static|switch|throw|var|void|while)\b/,
-        "operator": /\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?|:/,
-        "variable": /\b[a-z_]\w*\b/
-      });
-      Prism.languages.insertBefore("birb", "function", {
-        "metadata": {
-          pattern: /<\w+>/,
-          greedy: true,
-          alias: "symbol"
-        }
-      });
-      Prism.languages.bison = Prism.languages.extend("c", {});
-      Prism.languages.insertBefore("bison", "comment", {
-        "bison": {
-          // This should match all the beginning of the file
-          // including the prologue(s), the bison declarations and
-          // the grammar rules.
-          pattern: /^(?:[^%]|%(?!%))*%%[\s\S]*?%%/,
-          inside: {
-            "c": {
-              // Allow for one level of nested braces
-              pattern: /%\{[\s\S]*?%\}|\{(?:\{[^}]*\}|[^{}])*\}/,
-              inside: {
-                "delimiter": {
-                  pattern: /^%?\{|%?\}$/,
-                  alias: "punctuation"
-                },
-                "bison-variable": {
-                  pattern: /[$@](?:<[^\s>]+>)?[\w$]+/,
-                  alias: "variable",
-                  inside: {
-                    "punctuation": /<|>/
-                  }
-                },
-                rest: Prism.languages.c
-              }
-            },
-            "comment": Prism.languages.c.comment,
-            "string": Prism.languages.c.string,
-            "property": /\S+(?=:)/,
-            "keyword": /%\w+/,
-            "number": {
-              pattern: /(^|[^@])\b(?:0x[\da-f]+|\d+)/i,
-              lookbehind: true
-            },
-            "punctuation": /%[%?]|[|:;\[\]<>]/
-          }
-        }
-      });
-      Prism.languages.bnf = {
-        "string": {
-          pattern: /"[^\r\n"]*"|'[^\r\n']*'/
-        },
-        "definition": {
-          pattern: /<[^<>\r\n\t]+>(?=\s*::=)/,
-          alias: ["rule", "keyword"],
-          inside: {
-            "punctuation": /^<|>$/
-          }
-        },
-        "rule": {
-          pattern: /<[^<>\r\n\t]+>/,
-          inside: {
-            "punctuation": /^<|>$/
-          }
-        },
-        "operator": /::=|[|()[\]{}*+?]|\.{3}/
-      };
-      Prism.languages.rbnf = Prism.languages.bnf;
-      Prism.languages.brainfuck = {
-        "pointer": {
-          pattern: /<|>/,
-          alias: "keyword"
-        },
-        "increment": {
-          pattern: /\+/,
-          alias: "inserted"
-        },
-        "decrement": {
-          pattern: /-/,
-          alias: "deleted"
-        },
-        "branching": {
-          pattern: /\[|\]/,
-          alias: "important"
-        },
-        "operator": /[.,]/,
-        "comment": /\S+/
-      };
-      Prism.languages.brightscript = {
-        "comment": /(?:\brem|').*/i,
-        "directive-statement": {
-          pattern: /(^[\t ]*)#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if).*/im,
-          lookbehind: true,
-          alias: "property",
-          inside: {
-            "error-message": {
-              pattern: /(^#error).+/,
-              lookbehind: true
-            },
-            "directive": {
-              pattern: /^#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if)/,
-              alias: "keyword"
-            },
-            "expression": {
-              pattern: /[\s\S]+/,
-              inside: null
-              // see below
-            }
-          }
-        },
-        "property": {
-          pattern: /([\r\n{,][\t ]*)(?:(?!\d)\w+|"(?:[^"\r\n]|"")*"(?!"))(?=[ \t]*:)/,
-          lookbehind: true,
-          greedy: true
-        },
-        "string": {
-          pattern: /"(?:[^"\r\n]|"")*"(?!")/,
-          greedy: true
-        },
-        "class-name": {
-          pattern: /(\bAs[\t ]+)\w+/i,
-          lookbehind: true
-        },
-        "keyword": /\b(?:As|Dim|Each|Else|Elseif|End|Exit|For|Function|Goto|If|In|Print|Return|Step|Stop|Sub|Then|To|While)\b/i,
-        "boolean": /\b(?:false|true)\b/i,
-        "function": /\b(?!\d)\w+(?=[\t ]*\()/,
-        "number": /(?:\b\d+(?:\.\d+)?(?:[ed][+-]\d+)?|&h[a-f\d]+)\b[%&!#]?/i,
-        "operator": /--|\+\+|>>=?|<<=?|<>|[-+*/\\<>]=?|[:^=?]|\b(?:and|mod|not|or)\b/i,
-        "punctuation": /[.,;()[\]{}]/,
-        "constant": /\b(?:LINE_NUM)\b/i
-      };
-      Prism.languages.brightscript["directive-statement"].inside.expression.inside = Prism.languages.brightscript;
-      Prism.languages.bro = {
-        "comment": {
-          pattern: /(^|[^\\$])#.*/,
-          lookbehind: true,
-          inside: {
-            "italic": /\b(?:FIXME|TODO|XXX)\b/
-          }
-        },
-        "string": {
-          pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
-          greedy: true
-        },
-        "boolean": /\b[TF]\b/,
-        "function": {
-          pattern: /(\b(?:event|function|hook)[ \t]+)\w+(?:::\w+)?/,
-          lookbehind: true
-        },
-        "builtin": /(?:@(?:load(?:-(?:plugin|sigs))?|unload|prefixes|ifn?def|else|(?:end)?if|DIR|FILENAME))|(?:&?(?:add_func|create_expire|default|delete_func|encrypt|error_handler|expire_func|group|log|mergeable|optional|persistent|priority|raw_output|read_expire|redef|rotate_interval|rotate_size|synchronized|type_column|write_expire))/,
-        "constant": {
-          pattern: /(\bconst[ \t]+)\w+/i,
-          lookbehind: true
-        },
-        "keyword": /\b(?:add|addr|alarm|any|bool|break|const|continue|count|delete|double|else|enum|event|export|file|for|function|global|hook|if|in|int|interval|local|module|next|of|opaque|pattern|port|print|record|return|schedule|set|string|subnet|table|time|timeout|using|vector|when)\b/,
-        "operator": /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&|\|\|?|\?|\*|\/|~|\^|%/,
-        "number": /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
-        "punctuation": /[{}[\];(),.:]/
-      };
-      Prism.languages.bsl = {
-        "comment": /\/\/.*/,
-        "string": [
-          // Строки
-          // Strings
-          {
-            pattern: /"(?:[^"]|"")*"(?!")/,
-            greedy: true
-          },
-          // Дата и время
-          // Date & time
-          {
-            pattern: /'(?:[^'\r\n\\]|\\.)*'/
-          }
-        ],
-        "keyword": [
-          {
-            // RU
-            pattern: /(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:пока|для|новый|прервать|попытка|исключение|вызватьисключение|иначе|конецпопытки|неопределено|функция|перем|возврат|конецфункции|если|иначеесли|процедура|конецпроцедуры|тогда|знач|экспорт|конецесли|из|каждого|истина|ложь|по|цикл|конеццикла|выполнить)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,
-            lookbehind: true
-          },
-          {
-            // EN
-            pattern: /\b(?:break|do|each|else|elseif|enddo|endfunction|endif|endprocedure|endtry|except|execute|export|false|for|function|if|in|new|null|procedure|raise|return|then|to|true|try|undefined|val|var|while)\b/i
-          }
-        ],
-        "number": {
-          pattern: /(^(?=\d)|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?/i,
-          lookbehind: true
-        },
-        "operator": [
-          /[<>+\-*/]=?|[%=]/,
-          // RU
-          {
-            pattern: /(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:и|или|не)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,
-            lookbehind: true
-          },
-          // EN
-          {
-            pattern: /\b(?:and|not|or)\b/i
-          }
-        ],
-        "punctuation": /\(\.|\.\)|[()\[\]:;,.]/,
-        "directive": [
-          // Теги препроцессора вида &Клиент, &Сервер, ...
-          // Preprocessor tags of the type &Client, &Server, ...
-          {
-            pattern: /^([ \t]*)&.*/m,
-            lookbehind: true,
-            greedy: true,
-            alias: "important"
-          },
-          // Инструкции препроцессора вида:
-          // #Если Сервер Тогда
-          // ...
-          // #КонецЕсли
-          // Preprocessor instructions of the form:
-          // #If Server Then
-          // ...
-          // #EndIf
-          {
-            pattern: /^([ \t]*)#.*/gm,
-            lookbehind: true,
-            greedy: true,
-            alias: "important"
-          }
-        ]
-      };
-      Prism.languages.oscript = Prism.languages["bsl"];
-      Prism.languages.cfscript = Prism.languages.extend("clike", {
-        "comment": [
-          {
-            pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
-            lookbehind: true,
-            inside: {
-              "annotation": {
-                pattern: /(?:^|[^.])@[\w\.]+/,
-                alias: "punctuation"
-              }
-            }
-          },
-          {
-            pattern: /(^|[^\\:])\/\/.*/,
-            lookbehind: true,
-            greedy: true
-          }
-        ],
-        "keyword": /\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/,
-        "operator": [
-          /\+\+|--|&&|\|\||::|=>|[!=]==|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|:/,
-          /\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/
-        ],
-        "scope": {
-          pattern: /\b(?:application|arguments|cgi|client|cookie|local|session|super|this|variables)\b/,
-          alias: "global"
-        },
-        "type": {
-          pattern: /\b(?:any|array|binary|boolean|date|guid|numeric|query|string|struct|uuid|void|xml)\b/,
-          alias: "builtin"
-        }
-      });
-      Prism.languages.insertBefore("cfscript", "keyword", {
-        // This must be declared before keyword because we use "function" inside the lookahead
-        "function-variable": {
-          pattern: /[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,
-          alias: "function"
-        }
-      });
-      delete Prism.languages.cfscript["class-name"];
-      Prism.languages.cfc = Prism.languages["cfscript"];
-      Prism.languages.chaiscript = Prism.languages.extend("clike", {
-        "string": {
-          pattern: /(^|[^\\])'(?:[^'\\]|\\[\s\S])*'/,
-          lookbehind: true,
-          greedy: true
-        },
-        "class-name": [
-          {
-            // e.g. class Rectangle { ... }
-            pattern: /(\bclass\s+)\w+/,
-            lookbehind: true
-          },
-          {
-            // e.g. attr Rectangle::height, def Rectangle::area() { ... }
-            pattern: /(\b(?:attr|def)\s+)\w+(?=\s*::)/,
-            lookbehind: true
-          }
-        ],
-        "keyword": /\b(?:attr|auto|break|case|catch|class|continue|def|default|else|finally|for|fun|global|if|return|switch|this|try|var|while)\b/,
-        "number": [
-          Prism.languages.cpp.number,
-          /\b(?:Infinity|NaN)\b/
-        ],
-        "operator": />>=?|<<=?|\|\||&&|:[:=]?|--|\+\+|[=!<>+\-*/%|&^]=?|[?~]|`[^`\r\n]{1,4}`/
-      });
-      Prism.languages.insertBefore("chaiscript", "operator", {
-        "parameter-type": {
-          // e.g. def foo(int x, Vector y) {...}
-          pattern: /([,(]\s*)\w+(?=\s+\w)/,
-          lookbehind: true,
-          alias: "class-name"
-        }
-      });
-      Prism.languages.insertBefore("chaiscript", "string", {
-        "string-interpolation": {
-          pattern: /(^|[^\\])"(?:[^"$\\]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*"/,
-          lookbehind: true,
-          greedy: true,
-          inside: {
-            "interpolation": {
-              pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\}/,
-              lookbehind: true,
-              inside: {
-                "interpolation-expression": {
-                  pattern: /(^\$\{)[\s\S]+(?=\}$)/,
-                  lookbehind: true,
-                  inside: Prism.languages.chaiscript
-                },
-                "interpolation-punctuation": {
-                  pattern: /^\$\{|\}$/,
-                  alias: "punctuation"
-                }
-              }
-            },
-            "string": /[\s\S]+/
-          }
-        }
-      });
-      Prism.languages.cil = {
-        "comment": /\/\/.*/,
-        "string": {
-          pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
-          greedy: true
-        },
-        "directive": {
-          pattern: /(^|\W)\.[a-z]+(?=\s)/,
-          lookbehind: true,
-          alias: "class-name"
-        },
-        // Actually an assembly reference
-        "variable": /\[[\w\.]+\]/,
-        "keyword": /\b(?:abstract|ansi|assembly|auto|autochar|beforefieldinit|bool|bstr|byvalstr|catch|char|cil|class|currency|date|decimal|default|enum|error|explicit|extends|extern|famandassem|family|famorassem|final(?:ly)?|float32|float64|hidebysig|u?int(?:8|16|32|64)?|iant|idispatch|implements|import|initonly|instance|interface|iunknown|literal|lpstr|lpstruct|lptstr|lpwstr|managed|method|native(?:Type)?|nested|newslot|object(?:ref)?|pinvokeimpl|private|privatescope|public|reqsecobj|rtspecialname|runtime|sealed|sequential|serializable|specialname|static|string|struct|syschar|tbstr|unicode|unmanagedexp|unsigned|value(?:type)?|variant|virtual|void)\b/,
-        "function": /\b(?:(?:constrained|no|readonly|tail|unaligned|volatile)\.)?(?:conv\.(?:[iu][1248]?|ovf\.[iu][1248]?(?:\.un)?|r\.un|r4|r8)|ldc\.(?:i4(?:\.\d+|\.[mM]1|\.s)?|i8|r4|r8)|ldelem(?:\.[iu][1248]?|\.r[48]|\.ref|a)?|ldind\.(?:[iu][1248]?|r[48]|ref)|stelem\.?(?:i[1248]?|r[48]|ref)?|stind\.(?:i[1248]?|r[48]|ref)?|end(?:fault|filter|finally)|ldarg(?:\.[0-3s]|a(?:\.s)?)?|ldloc(?:\.\d+|\.s)?|sub(?:\.ovf(?:\.un)?)?|mul(?:\.ovf(?:\.un)?)?|add(?:\.ovf(?:\.un)?)?|stloc(?:\.[0-3s])?|refany(?:type|val)|blt(?:\.un)?(?:\.s)?|ble(?:\.un)?(?:\.s)?|bgt(?:\.un)?(?:\.s)?|bge(?:\.un)?(?:\.s)?|unbox(?:\.any)?|init(?:blk|obj)|call(?:i|virt)?|brfalse(?:\.s)?|bne\.un(?:\.s)?|ldloca(?:\.s)?|brzero(?:\.s)?|brtrue(?:\.s)?|brnull(?:\.s)?|brinst(?:\.s)?|starg(?:\.s)?|leave(?:\.s)?|shr(?:\.un)?|rem(?:\.un)?|div(?:\.un)?|clt(?:\.un)?|alignment|castclass|ldvirtftn|beq(?:\.s)?|ckfinite|ldsflda|ldtoken|localloc|mkrefany|rethrow|cgt\.un|arglist|switch|stsfld|sizeof|newobj|newarr|ldsfld|ldnull|ldflda|isinst|throw|stobj|stfld|ldstr|ldobj|ldlen|ldftn|ldfld|cpobj|cpblk|break|br\.s|xor|shl|ret|pop|not|nop|neg|jmp|dup|cgt|ceq|box|and|or|br)\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "number": /\b-?(?:0x[0-9a-f]+|\d+)(?:\.[0-9a-f]+)?\b/i,
-        "punctuation": /[{}[\];(),:=]|IL_[0-9A-Za-z]+/
-      };
-      Prism.languages.clojure = {
-        "comment": {
-          pattern: /;.*/,
-          greedy: true
-        },
-        "string": {
-          pattern: /"(?:[^"\\]|\\.)*"/,
-          greedy: true
-        },
-        "char": /\\\w+/,
-        "symbol": {
-          pattern: /(^|[\s()\[\]{},])::?[\w*+!?'<>=/.-]+/,
-          lookbehind: true
-        },
-        "keyword": {
-          pattern: /(\()(?:-|->|->>|\.|\.\.|\*|\/|\+|<|<=|=|==|>|>=|accessor|agent|agent-errors|aget|alength|all-ns|alter|and|append-child|apply|array-map|aset|aset-boolean|aset-byte|aset-char|aset-double|aset-float|aset-int|aset-long|aset-short|assert|assoc|await|await-for|bean|binding|bit-and|bit-not|bit-or|bit-shift-left|bit-shift-right|bit-xor|boolean|branch\?|butlast|byte|cast|char|children|class|clear-agent-errors|comment|commute|comp|comparator|complement|concat|cond|conj|cons|constantly|construct-proxy|contains\?|count|create-ns|create-struct|cycle|dec|declare|def|def-|definline|definterface|defmacro|defmethod|defmulti|defn|defn-|defonce|defproject|defprotocol|defrecord|defstruct|deftype|deref|difference|disj|dissoc|distinct|do|doall|doc|dorun|doseq|dosync|dotimes|doto|double|down|drop|drop-while|edit|end\?|ensure|eval|every\?|false\?|ffirst|file-seq|filter|find|find-doc|find-ns|find-var|first|float|flush|fn|fnseq|for|frest|gensym|get|get-proxy-class|hash-map|hash-set|identical\?|identity|if|if-let|if-not|import|in-ns|inc|index|insert-child|insert-left|insert-right|inspect-table|inspect-tree|instance\?|int|interleave|intersection|into|into-array|iterate|join|key|keys|keyword|keyword\?|last|lazy-cat|lazy-cons|left|lefts|let|line-seq|list|list\*|load|load-file|locking|long|loop|macroexpand|macroexpand-1|make-array|make-node|map|map-invert|map\?|mapcat|max|max-key|memfn|merge|merge-with|meta|min|min-key|monitor-enter|name|namespace|neg\?|new|newline|next|nil\?|node|not|not-any\?|not-every\?|not=|ns|ns-imports|ns-interns|ns-map|ns-name|ns-publics|ns-refers|ns-resolve|ns-unmap|nth|nthrest|or|parse|partial|path|peek|pop|pos\?|pr|pr-str|print|print-str|println|println-str|prn|prn-str|project|proxy|proxy-mappings|quot|quote|rand|rand-int|range|re-find|re-groups|re-matcher|re-matches|re-pattern|re-seq|read|read-line|recur|reduce|ref|ref-set|refer|rem|remove|remove-method|remove-ns|rename|rename-keys|repeat|replace|replicate|resolve|rest|resultset-seq|reverse|rfirst|right|rights|root|rrest|rseq|second|select|select-keys|send|send-off|seq|seq-zip|seq\?|set|set!|short|slurp|some|sort|sort-by|sorted-map|sorted-map-by|sorted-set|special-symbol\?|split-at|split-with|str|string\?|struct|struct-map|subs|subvec|symbol|symbol\?|sync|take|take-nth|take-while|test|throw|time|to-array|to-array-2d|tree-seq|true\?|try|union|up|update-proxy|val|vals|var|var-get|var-set|var\?|vector|vector-zip|vector\?|when|when-first|when-let|when-not|with-local-vars|with-meta|with-open|with-out-str|xml-seq|xml-zip|zero\?|zipmap|zipper)(?=[\s)]|$)/,
-          lookbehind: true
-        },
-        "boolean": /\b(?:false|nil|true)\b/,
-        "number": {
-          pattern: /(^|[^\w$@])(?:\d+(?:[/.]\d+)?(?:e[+-]?\d+)?|0x[a-f0-9]+|[1-9]\d?r[a-z0-9]+)[lmn]?(?![\w$@])/i,
-          lookbehind: true
-        },
-        "function": {
-          pattern: /((?:^|[^'])\()[\w*+!?'<>=/.-]+(?=[\s)]|$)/,
-          lookbehind: true
-        },
-        "operator": /[#@^`~]/,
-        "punctuation": /[{}\[\](),]/
-      };
-      Prism.languages.cmake = {
-        "comment": /#.*/,
-        "string": {
-          pattern: /"(?:[^\\"]|\\.)*"/,
-          greedy: true,
-          inside: {
-            "interpolation": {
-              pattern: /\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,
-              inside: {
-                "punctuation": /\$\{|\}/,
-                "variable": /\w+/
-              }
-            }
-          }
-        },
-        "variable": /\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_NAME|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE))\b/,
-        "property": /\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,
-        "keyword": /\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,
-        "boolean": /\b(?:FALSE|OFF|ON|TRUE)\b/,
-        "namespace": /\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/,
-        "operator": /\b(?:AND|DEFINED|EQUAL|GREATER|LESS|MATCHES|NOT|OR|STREQUAL|STRGREATER|STRLESS|VERSION_EQUAL|VERSION_GREATER|VERSION_LESS)\b/,
-        "inserted": {
-          pattern: /\b\w+::\w+\b/,
-          alias: "class-name"
-        },
-        "number": /\b\d+(?:\.\d+)*\b/,
-        "function": /\b[a-z_]\w*(?=\s*\()\b/i,
-        "punctuation": /[()>}]|\$[<{]/
-      };
-      Prism.languages.cobol = {
-        "comment": {
-          pattern: /\*>.*|(^[ \t]*)\*.*/m,
-          lookbehind: true,
-          greedy: true
-        },
-        "string": {
-          pattern: /[xzgn]?(?:"(?:[^\r\n"]|"")*"(?!")|'(?:[^\r\n']|'')*'(?!'))/i,
-          greedy: true
-        },
-        "level": {
-          pattern: /(^[ \t]*)\d+\b/m,
-          lookbehind: true,
-          greedy: true,
-          alias: "number"
-        },
-        "class-name": {
-          // https://github.com/antlr/grammars-v4/blob/42edd5b687d183b5fa679e858a82297bd27141e7/cobol85/Cobol85.g4#L1015
-          pattern: /(\bpic(?:ture)?\s+)(?:(?:[-\w$/,:*+<>]|\.(?!\s|$))(?:\(\d+\))?)+/i,
-          lookbehind: true,
-          inside: {
-            "number": {
-              pattern: /(\()\d+/,
-              lookbehind: true
-            },
-            "punctuation": /[()]/
-          }
-        },
-        "keyword": {
-          pattern: /(^|[^\w-])(?:ABORT|ACCEPT|ACCESS|ADD|ADDRESS|ADVANCING|AFTER|ALIGNED|ALL|ALPHABET|ALPHABETIC|ALPHABETIC-LOWER|ALPHABETIC-UPPER|ALPHANUMERIC|ALPHANUMERIC-EDITED|ALSO|ALTER|ALTERNATE|ANY|ARE|AREA|AREAS|AS|ASCENDING|ASCII|ASSIGN|ASSOCIATED-DATA|ASSOCIATED-DATA-LENGTH|AT|ATTRIBUTE|AUTHOR|AUTO|AUTO-SKIP|BACKGROUND-COLOR|BACKGROUND-COLOUR|BASIS|BEEP|BEFORE|BEGINNING|BELL|BINARY|BIT|BLANK|BLINK|BLOCK|BOTTOM|BOUNDS|BY|BYFUNCTION|BYTITLE|CALL|CANCEL|CAPABLE|CCSVERSION|CD|CF|CH|CHAINING|CHANGED|CHANNEL|CHARACTER|CHARACTERS|CLASS|CLASS-ID|CLOCK-UNITS|CLOSE|CLOSE-DISPOSITION|COBOL|CODE|CODE-SET|COL|COLLATING|COLUMN|COM-REG|COMMA|COMMITMENT|COMMON|COMMUNICATION|COMP|COMP-1|COMP-2|COMP-3|COMP-4|COMP-5|COMPUTATIONAL|COMPUTATIONAL-1|COMPUTATIONAL-2|COMPUTATIONAL-3|COMPUTATIONAL-4|COMPUTATIONAL-5|COMPUTE|CONFIGURATION|CONTAINS|CONTENT|CONTINUE|CONTROL|CONTROL-POINT|CONTROLS|CONVENTION|CONVERTING|COPY|CORR|CORRESPONDING|COUNT|CRUNCH|CURRENCY|CURSOR|DATA|DATA-BASE|DATE|DATE-COMPILED|DATE-WRITTEN|DAY|DAY-OF-WEEK|DBCS|DE|DEBUG-CONTENTS|DEBUG-ITEM|DEBUG-LINE|DEBUG-NAME|DEBUG-SUB-1|DEBUG-SUB-2|DEBUG-SUB-3|DEBUGGING|DECIMAL-POINT|DECLARATIVES|DEFAULT|DEFAULT-DISPLAY|DEFINITION|DELETE|DELIMITED|DELIMITER|DEPENDING|DESCENDING|DESTINATION|DETAIL|DFHRESP|DFHVALUE|DISABLE|DISK|DISPLAY|DISPLAY-1|DIVIDE|DIVISION|DONTCARE|DOUBLE|DOWN|DUPLICATES|DYNAMIC|EBCDIC|EGCS|EGI|ELSE|EMI|EMPTY-CHECK|ENABLE|END|END-ACCEPT|END-ADD|END-CALL|END-COMPUTE|END-DELETE|END-DIVIDE|END-EVALUATE|END-IF|END-MULTIPLY|END-OF-PAGE|END-PERFORM|END-READ|END-RECEIVE|END-RETURN|END-REWRITE|END-SEARCH|END-START|END-STRING|END-SUBTRACT|END-UNSTRING|END-WRITE|ENDING|ENTER|ENTRY|ENTRY-PROCEDURE|ENVIRONMENT|EOL|EOP|EOS|ERASE|ERROR|ESCAPE|ESI|EVALUATE|EVENT|EVERY|EXCEPTION|EXCLUSIVE|EXHIBIT|EXIT|EXPORT|EXTEND|EXTENDED|EXTERNAL|FD|FILE|FILE-CONTROL|FILLER|FINAL|FIRST|FOOTING|FOR|FOREGROUND-COLOR|FOREGROUND-COLOUR|FROM|FULL|FUNCTION|FUNCTION-POINTER|FUNCTIONNAME|GENERATE|GIVING|GLOBAL|GO|GOBACK|GRID|GROUP|HEADING|HIGH-VALUE|HIGH-VALUES|HIGHLIGHT|I-O|I-O-CONTROL|ID|IDENTIFICATION|IF|IMPLICIT|IMPORT|IN|INDEX|INDEXED|INDICATE|INITIAL|INITIALIZE|INITIATE|INPUT|INPUT-OUTPUT|INSPECT|INSTALLATION|INTEGER|INTO|INVALID|INVOKE|IS|JUST|JUSTIFIED|KANJI|KEPT|KEY|KEYBOARD|LABEL|LANGUAGE|LAST|LB|LD|LEADING|LEFT|LEFTLINE|LENGTH|LENGTH-CHECK|LIBACCESS|LIBPARAMETER|LIBRARY|LIMIT|LIMITS|LINAGE|LINAGE-COUNTER|LINE|LINE-COUNTER|LINES|LINKAGE|LIST|LOCAL|LOCAL-STORAGE|LOCK|LONG-DATE|LONG-TIME|LOW-VALUE|LOW-VALUES|LOWER|LOWLIGHT|MEMORY|MERGE|MESSAGE|MMDDYYYY|MODE|MODULES|MORE-LABELS|MOVE|MULTIPLE|MULTIPLY|NAMED|NATIONAL|NATIONAL-EDITED|NATIVE|NEGATIVE|NETWORK|NEXT|NO|NO-ECHO|NULL|NULLS|NUMBER|NUMERIC|NUMERIC-DATE|NUMERIC-EDITED|NUMERIC-TIME|OBJECT-COMPUTER|OCCURS|ODT|OF|OFF|OMITTED|ON|OPEN|OPTIONAL|ORDER|ORDERLY|ORGANIZATION|OTHER|OUTPUT|OVERFLOW|OVERLINE|OWN|PACKED-DECIMAL|PADDING|PAGE|PAGE-COUNTER|PASSWORD|PERFORM|PF|PH|PIC|PICTURE|PLUS|POINTER|PORT|POSITION|POSITIVE|PRINTER|PRINTING|PRIVATE|PROCEDURE|PROCEDURE-POINTER|PROCEDURES|PROCEED|PROCESS|PROGRAM|PROGRAM-ID|PROGRAM-LIBRARY|PROMPT|PURGE|QUEUE|QUOTE|QUOTES|RANDOM|RD|READ|READER|REAL|RECEIVE|RECEIVED|RECORD|RECORDING|RECORDS|RECURSIVE|REDEFINES|REEL|REF|REFERENCE|REFERENCES|RELATIVE|RELEASE|REMAINDER|REMARKS|REMOTE|REMOVAL|REMOVE|RENAMES|REPLACE|REPLACING|REPORT|REPORTING|REPORTS|REQUIRED|RERUN|RESERVE|RESET|RETURN|RETURN-CODE|RETURNING|REVERSE-VIDEO|REVERSED|REWIND|REWRITE|RF|RH|RIGHT|ROUNDED|RUN|SAME|SAVE|SCREEN|SD|SEARCH|SECTION|SECURE|SECURITY|SEGMENT|SEGMENT-LIMIT|SELECT|SEND|SENTENCE|SEPARATE|SEQUENCE|SEQUENTIAL|SET|SHARED|SHAREDBYALL|SHAREDBYRUNUNIT|SHARING|SHIFT-IN|SHIFT-OUT|SHORT-DATE|SIGN|SIZE|SORT|SORT-CONTROL|SORT-CORE-SIZE|SORT-FILE-SIZE|SORT-MERGE|SORT-MESSAGE|SORT-MODE-SIZE|SORT-RETURN|SOURCE|SOURCE-COMPUTER|SPACE|SPACES|SPECIAL-NAMES|STANDARD|STANDARD-1|STANDARD-2|START|STATUS|STOP|STRING|SUB-QUEUE-1|SUB-QUEUE-2|SUB-QUEUE-3|SUBTRACT|SUM|SUPPRESS|SYMBOL|SYMBOLIC|SYNC|SYNCHRONIZED|TABLE|TALLY|TALLYING|TAPE|TASK|TERMINAL|TERMINATE|TEST|TEXT|THEN|THREAD|THREAD-LOCAL|THROUGH|THRU|TIME|TIMER|TIMES|TITLE|TO|TODAYS-DATE|TODAYS-NAME|TOP|TRAILING|TRUNCATED|TYPE|TYPEDEF|UNDERLINE|UNIT|UNSTRING|UNTIL|UP|UPON|USAGE|USE|USING|VALUE|VALUES|VARYING|VIRTUAL|WAIT|WHEN|WHEN-COMPILED|WITH|WORDS|WORKING-STORAGE|WRITE|YEAR|YYYYDDD|YYYYMMDD|ZERO-FILL|ZEROES|ZEROS)(?![\w-])/i,
-          lookbehind: true
-        },
-        "boolean": {
-          pattern: /(^|[^\w-])(?:false|true)(?![\w-])/i,
-          lookbehind: true
-        },
-        "number": {
-          pattern: /(^|[^\w-])(?:[+-]?(?:(?:\d+(?:[.,]\d+)?|[.,]\d+)(?:e[+-]?\d+)?|zero))(?![\w-])/i,
-          lookbehind: true
-        },
-        "operator": [
-          /<>|[<>]=?|[=+*/&]/,
-          {
-            pattern: /(^|[^\w-])(?:-|and|equal|greater|less|not|or|than)(?![\w-])/i,
-            lookbehind: true
-          }
-        ],
-        "punctuation": /[.:,()]/
-      };
-      (function(Prism2) {
-        var comment = /#(?!\{).+/;
-        var interpolation = {
-          pattern: /#\{[^}]+\}/,
-          alias: "variable"
-        };
-        Prism2.languages.coffeescript = Prism2.languages.extend("javascript", {
-          "comment": comment,
-          "string": [
-            // Strings are multiline
-            {
-              pattern: /'(?:\\[\s\S]|[^\\'])*'/,
-              greedy: true
-            },
-            {
-              // Strings are multiline
-              pattern: /"(?:\\[\s\S]|[^\\"])*"/,
-              greedy: true,
-              inside: {
-                "interpolation": interpolation
-              }
-            }
-          ],
-          "keyword": /\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,
-          "class-member": {
-            pattern: /@(?!\d)\w+/,
-            alias: "variable"
-          }
-        });
-        Prism2.languages.insertBefore("coffeescript", "comment", {
-          "multiline-comment": {
-            pattern: /###[\s\S]+?###/,
-            alias: "comment"
-          },
-          // Block regexp can contain comments and interpolation
-          "block-regex": {
-            pattern: /\/{3}[\s\S]*?\/{3}/,
-            alias: "regex",
-            inside: {
-              "comment": comment,
-              "interpolation": interpolation
-            }
-          }
-        });
-        Prism2.languages.insertBefore("coffeescript", "string", {
-          "inline-javascript": {
-            pattern: /`(?:\\[\s\S]|[^\\`])*`/,
-            inside: {
-              "delimiter": {
-                pattern: /^`|`$/,
-                alias: "punctuation"
-              },
-              "script": {
-                pattern: /[\s\S]+/,
-                alias: "language-javascript",
-                inside: Prism2.languages.javascript
-              }
-            }
-          },
-          // Block strings
-          "multiline-string": [
-            {
-              pattern: /'''[\s\S]*?'''/,
-              greedy: true,
-              alias: "string"
-            },
-            {
-              pattern: /"""[\s\S]*?"""/,
-              greedy: true,
-              alias: "string",
-              inside: {
-                interpolation
-              }
-            }
-          ]
-        });
-        Prism2.languages.insertBefore("coffeescript", "keyword", {
-          // Object property
-          "property": /(?!\d)\w+(?=\s*:(?!:))/
-        });
-        delete Prism2.languages.coffeescript["template-string"];
-        Prism2.languages.coffee = Prism2.languages.coffeescript;
-      })(Prism);
-      Prism.languages.concurnas = {
-        "comment": {
-          pattern: /(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*)/,
-          lookbehind: true,
-          greedy: true
-        },
-        "langext": {
-          pattern: /\b\w+\s*\|\|[\s\S]+?\|\|/,
-          greedy: true,
-          inside: {
-            "class-name": /^\w+/,
-            "string": {
-              pattern: /(^\s*\|\|)[\s\S]+(?=\|\|$)/,
-              lookbehind: true
-            },
-            "punctuation": /\|\|/
-          }
-        },
-        "function": {
-          pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/,
-          lookbehind: true
-        },
-        "keyword": /\b(?:abstract|actor|also|annotation|assert|async|await|bool|boolean|break|byte|case|catch|changed|char|class|closed|constant|continue|def|default|del|double|elif|else|enum|every|extends|false|finally|float|for|from|global|gpudef|gpukernel|if|import|in|init|inject|int|lambda|local|long|loop|match|new|nodefault|null|of|onchange|open|out|override|package|parfor|parforsync|post|pre|private|protected|provide|provider|public|return|shared|short|single|size_t|sizeof|super|sync|this|throw|trait|trans|transient|true|try|typedef|unchecked|using|val|var|void|while|with)\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "number": /\b0b[01][01_]*L?\b|\b0x(?:[\da-f_]*\.)?[\da-f_p+-]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfls]?/i,
-        "punctuation": /[{}[\];(),.:]/,
-        "operator": /<==|>==|=>|->|<-|<>|&==|&<>|\?:?|\.\?|\+\+|--|[-+*/=<>]=?|[!^~]|\b(?:and|as|band|bor|bxor|comp|is|isnot|mod|or)\b=?/,
-        "annotation": {
-          pattern: /@(?:\w+:)?(?:\w+|\[[^\]]+\])?/,
-          alias: "builtin"
-        }
-      };
-      Prism.languages.insertBefore("concurnas", "langext", {
-        "regex-literal": {
-          pattern: /\br("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
-          greedy: true,
-          inside: {
-            "interpolation": {
-              pattern: /((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
-              lookbehind: true,
-              inside: Prism.languages.concurnas
-            },
-            "regex": /[\s\S]+/
-          }
-        },
-        "string-literal": {
-          pattern: /(?:\B|\bs)("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
-          greedy: true,
-          inside: {
-            "interpolation": {
-              pattern: /((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
-              lookbehind: true,
-              inside: Prism.languages.concurnas
-            },
-            "string": /[\s\S]+/
-          }
-        }
-      });
-      Prism.languages.conc = Prism.languages.concurnas;
-      (function(Prism2) {
-        function value(source) {
-          return RegExp(/([ \t])/.source + "(?:" + source + ")" + /(?=[\s;]|$)/.source, "i");
-        }
-        Prism2.languages.csp = {
-          "directive": {
-            pattern: /(^|[\s;])(?:base-uri|block-all-mixed-content|(?:child|connect|default|font|frame|img|manifest|media|object|prefetch|script|style|worker)-src|disown-opener|form-action|frame-(?:ancestors|options)|input-protection(?:-(?:clip|selectors))?|navigate-to|plugin-types|policy-uri|referrer|reflected-xss|report-(?:to|uri)|require-sri-for|sandbox|(?:script|style)-src-(?:attr|elem)|upgrade-insecure-requests)(?=[\s;]|$)/i,
-            lookbehind: true,
-            alias: "property"
-          },
-          "scheme": {
-            pattern: value(/[a-z][a-z0-9.+-]*:/.source),
-            lookbehind: true
-          },
-          "none": {
-            pattern: value(/'none'/.source),
-            lookbehind: true,
-            alias: "keyword"
-          },
-          "nonce": {
-            pattern: value(/'nonce-[-+/\w=]+'/.source),
-            lookbehind: true,
-            alias: "number"
-          },
-          "hash": {
-            pattern: value(/'sha(?:256|384|512)-[-+/\w=]+'/.source),
-            lookbehind: true,
-            alias: "number"
-          },
-          "host": {
-            pattern: value(
-              /[a-z][a-z0-9.+-]*:\/\/[^\s;,']*/.source + "|" + /\*[^\s;,']*/.source + "|" + /[a-z0-9-]+(?:\.[a-z0-9-]+)+(?::[\d*]+)?(?:\/[^\s;,']*)?/.source
-            ),
-            lookbehind: true,
-            alias: "url",
-            inside: {
-              "important": /\*/
-            }
-          },
-          "keyword": [
-            {
-              pattern: value(/'unsafe-[a-z-]+'/.source),
-              lookbehind: true,
-              alias: "unsafe"
-            },
-            {
-              pattern: value(/'[a-z-]+'/.source),
-              lookbehind: true,
-              alias: "safe"
-            }
-          ],
-          "punctuation": /;/
-        };
-      })(Prism);
-      (function(Prism2) {
-        var single_token_suffix = /(?:(?!\s)[\d$+<=a-zA-Z\x80-\uFFFF])+/.source;
-        var multi_token_infix = /[^{}@#]+/.source;
-        var multi_token_suffix = /\{[^}#@]*\}/.source;
-        var multi_token = multi_token_infix + multi_token_suffix;
-        var timer_units = /(?:h|hours|hrs|m|min|minutes)/.source;
-        var amount_group_impl = {
-          pattern: /\{[^{}]*\}/,
-          inside: {
-            "amount": {
-              pattern: /([\{|])[^{}|*%]+/,
-              lookbehind: true,
-              alias: "number"
-            },
-            "unit": {
-              pattern: /(%)[^}]+/,
-              lookbehind: true,
-              alias: "symbol"
-            },
-            "servings-scaler": {
-              pattern: /\*/,
-              alias: "operator"
-            },
-            "servings-alternative-separator": {
-              pattern: /\|/,
-              alias: "operator"
-            },
-            "unit-separator": {
-              pattern: /(?:%|(\*)%)/,
-              lookbehind: true,
-              alias: "operator"
-            },
-            "punctuation": /[{}]/
-          }
-        };
-        Prism2.languages.cooklang = {
-          "comment": {
-            // [- comment -]
-            // -- comment
-            pattern: /\[-[\s\S]*?-\]|--.*/,
-            greedy: true
-          },
-          "meta": {
-            // >> key: value
-            pattern: />>.*:.*/,
-            inside: {
-              "property": {
-                // key:
-                pattern: /(>>\s*)[^\s:](?:[^:]*[^\s:])?/,
-                lookbehind: true
-              }
-            }
-          },
-          "cookware-group": {
-            // #...{...}, #...
-            pattern: new RegExp(
-              "#(?:" + multi_token + "|" + single_token_suffix + ")"
-            ),
-            inside: {
-              "cookware": {
-                pattern: new RegExp(
-                  "(^#)(?:" + multi_token_infix + ")"
-                ),
-                lookbehind: true,
-                alias: "variable"
-              },
-              "cookware-keyword": {
-                pattern: /^#/,
-                alias: "keyword"
-              },
-              "quantity-group": {
-                pattern: new RegExp(/\{[^{}@#]*\}/),
-                inside: {
-                  "quantity": {
-                    pattern: new RegExp(/(^\{)/.source + multi_token_infix),
-                    lookbehind: true,
-                    alias: "number"
-                  },
-                  "punctuation": /[{}]/
-                }
-              }
-            }
-          },
-          "ingredient-group": {
-            // @...{...}, @...
-            pattern: new RegExp("@(?:" + multi_token + "|" + single_token_suffix + ")"),
-            inside: {
-              "ingredient": {
-                pattern: new RegExp("(^@)(?:" + multi_token_infix + ")"),
-                lookbehind: true,
-                alias: "variable"
-              },
-              "ingredient-keyword": {
-                pattern: /^@/,
-                alias: "keyword"
-              },
-              "amount-group": amount_group_impl
-            }
-          },
-          "timer-group": {
-            // ~timer{...}
-            // eslint-disable-next-line regexp/sort-alternatives
-            pattern: /~(?!\s)[^@#~{}]*\{[^{}]*\}/,
-            inside: {
-              "timer": {
-                pattern: /(^~)[^{]+/,
-                lookbehind: true,
-                alias: "variable"
-              },
-              "duration-group": {
-                // {...}
-                pattern: /\{[^{}]*\}/,
-                inside: {
-                  "punctuation": /[{}]/,
-                  "unit": {
-                    pattern: new RegExp(/(%\s*)/.source + timer_units + /\b/.source),
-                    lookbehind: true,
-                    alias: "symbol"
-                  },
-                  "operator": /%/,
-                  "duration": {
-                    pattern: /\d+/,
-                    alias: "number"
-                  }
-                }
-              },
-              "timer-keyword": {
-                pattern: /^~/,
-                alias: "keyword"
-              }
-            }
-          }
-        };
-      })(Prism);
-      (function(Prism2) {
-        var commentSource = /\(\*(?:[^(*]|\((?!\*)|\*(?!\))|<self>)*\*\)/.source;
-        for (var i = 0; i < 2; i++) {
-          commentSource = commentSource.replace(/<self>/g, function() {
-            return commentSource;
-          });
-        }
-        commentSource = commentSource.replace(/<self>/g, "[]");
-        Prism2.languages.coq = {
-          "comment": RegExp(commentSource),
-          "string": {
-            pattern: /"(?:[^"]|"")*"(?!")/,
-            greedy: true
-          },
-          "attribute": [
-            {
-              pattern: RegExp(
-                /#\[(?:[^\[\]("]|"(?:[^"]|"")*"(?!")|\((?!\*)|<comment>)*\]/.source.replace(/<comment>/g, function() {
-                  return commentSource;
-                })
-              ),
-              greedy: true,
-              alias: "attr-name",
-              inside: {
-                "comment": RegExp(commentSource),
-                "string": {
-                  pattern: /"(?:[^"]|"")*"(?!")/,
-                  greedy: true
-                },
-                "operator": /=/,
-                "punctuation": /^#\[|\]$|[,()]/
-              }
-            },
-            {
-              pattern: /\b(?:Cumulative|Global|Local|Monomorphic|NonCumulative|Polymorphic|Private|Program)\b/,
-              alias: "attr-name"
-            }
-          ],
-          "keyword": /\b(?:Abort|About|Add|Admit|Admitted|All|Arguments|As|Assumptions|Axiom|Axioms|Back|BackTo|Backtrace|BinOp|BinOpSpec|BinRel|Bind|Blacklist|Canonical|Case|Cd|Check|Class|Classes|Close|CoFixpoint|CoInductive|Coercion|Coercions|Collection|Combined|Compute|Conjecture|Conjectures|Constant|Constants|Constraint|Constructors|Context|Corollary|Create|CstOp|Custom|Cut|Debug|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Diffs|Drop|Elimination|End|Entry|Equality|Eval|Example|Existential|Existentials|Existing|Export|Extern|Extraction|Fact|Fail|Field|File|Firstorder|Fixpoint|Flags|Focus|From|Funclass|Function|Functional|GC|Generalizable|Goal|Grab|Grammar|Graph|Guarded|Haskell|Heap|Hide|Hint|HintDb|Hints|Hypotheses|Hypothesis|IF|Identity|Immediate|Implicit|Implicits|Import|Include|Induction|Inductive|Infix|Info|Initial|InjTyp|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|JSON|Language|Left|Lemma|Let|Lia|Libraries|Library|Load|LoadPath|Locate|Ltac|Ltac2|ML|Match|Method|Minimality|Module|Modules|Morphism|Next|NoInline|Notation|Number|OCaml|Obligation|Obligations|Opaque|Open|Optimize|Parameter|Parameters|Parametric|Path|Paths|Prenex|Preterm|Primitive|Print|Profile|Projections|Proof|Prop|PropBinOp|PropOp|PropUOp|Property|Proposition|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Reduction|Register|Relation|Remark|Remove|Require|Reserved|Reset|Resolve|Restart|Rewrite|Right|Ring|Rings|SProp|Saturate|Save|Scheme|Scope|Scopes|Search|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Solver|Sort|Sortclass|Sorted|Spec|Step|Strategies|Strategy|String|Structure|SubClass|Subgraph|SuchThat|Tactic|Term|TestCompile|Theorem|Time|Timeout|To|Transparent|Type|Typeclasses|Types|Typing|UnOp|UnOpSpec|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|Unshelve|Variable|Variables|Variant|Verbose|View|Visibility|Zify|_|apply|as|at|by|cofix|else|end|exists|exists2|fix|for|forall|fun|if|in|let|match|measure|move|removed|return|struct|then|using|wf|where|with)\b/,
-          "number": /\b(?:0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]+)?(?:p[+-]?\d[\d_]*)?|\d[\d_]*(?:\.[\d_]+)?(?:e[+-]?\d[\d_]*)?)\b/i,
-          "punct": {
-            pattern: /@\{|\{\||\[=|:>/,
-            alias: "punctuation"
-          },
-          "operator": /\/\\|\\\/|\.{2,3}|:{1,2}=|\*\*|[-=]>|<(?:->?|[+:=>]|<:)|>(?:=|->)|\|[-|]?|[-!%&*+/<=>?@^~']/,
-          "punctuation": /\.\(|`\(|@\{|`\{|\{\||\[=|:>|[:.,;(){}\[\]]/
-        };
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages.ruby = Prism2.languages.extend("clike", {
-          "comment": {
-            pattern: /#.*|^=begin\s[\s\S]*?^=end/m,
-            greedy: true
-          },
-          "class-name": {
-            pattern: /(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,
-            lookbehind: true,
-            inside: {
-              "punctuation": /[.\\]/
-            }
-          },
-          "keyword": /\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,
-          "operator": /\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,
-          "punctuation": /[(){}[\].,;]/
-        });
-        Prism2.languages.insertBefore("ruby", "operator", {
-          "double-colon": {
-            pattern: /::/,
-            alias: "punctuation"
-          }
-        });
-        var interpolation = {
-          pattern: /((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,
-          lookbehind: true,
-          inside: {
-            "content": {
-              pattern: /^(#\{)[\s\S]+(?=\}$)/,
-              lookbehind: true,
-              inside: Prism2.languages.ruby
-            },
-            "delimiter": {
-              pattern: /^#\{|\}$/,
-              alias: "punctuation"
-            }
-          }
-        };
-        delete Prism2.languages.ruby.function;
-        var percentExpression = "(?:" + [
-          /([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,
-          /\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,
-          /\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,
-          /\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,
-          /<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source
-        ].join("|") + ")";
-        var symbolName = /(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;
-        Prism2.languages.insertBefore("ruby", "keyword", {
-          "regex-literal": [
-            {
-              pattern: RegExp(/%r/.source + percentExpression + /[egimnosux]{0,6}/.source),
-              greedy: true,
-              inside: {
-                "interpolation": interpolation,
-                "regex": /[\s\S]+/
-              }
-            },
-            {
-              pattern: /(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,
-              lookbehind: true,
-              greedy: true,
-              inside: {
-                "interpolation": interpolation,
-                "regex": /[\s\S]+/
-              }
-            }
-          ],
-          "variable": /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,
-          "symbol": [
-            {
-              pattern: RegExp(/(^|[^:]):/.source + symbolName),
-              lookbehind: true,
-              greedy: true
-            },
-            {
-              pattern: RegExp(/([\r\n{(,][ \t]*)/.source + symbolName + /(?=:(?!:))/.source),
-              lookbehind: true,
-              greedy: true
-            }
-          ],
-          "method-definition": {
-            pattern: /(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,
-            lookbehind: true,
-            inside: {
-              "function": /\b\w+$/,
-              "keyword": /^self\b/,
-              "class-name": /^\w+/,
-              "punctuation": /\./
-            }
-          }
-        });
-        Prism2.languages.insertBefore("ruby", "string", {
-          "string-literal": [
-            {
-              pattern: RegExp(/%[qQiIwWs]?/.source + percentExpression),
-              greedy: true,
-              inside: {
-                "interpolation": interpolation,
-                "string": /[\s\S]+/
-              }
-            },
-            {
-              pattern: /("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,
-              greedy: true,
-              inside: {
-                "interpolation": interpolation,
-                "string": /[\s\S]+/
-              }
-            },
-            {
-              pattern: /<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,
-              alias: "heredoc-string",
-              greedy: true,
-              inside: {
-                "delimiter": {
-                  pattern: /^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,
-                  inside: {
-                    "symbol": /\b\w+/,
-                    "punctuation": /^<<[-~]?/
-                  }
-                },
-                "interpolation": interpolation,
-                "string": /[\s\S]+/
-              }
-            },
-            {
-              pattern: /<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,
-              alias: "heredoc-string",
-              greedy: true,
-              inside: {
-                "delimiter": {
-                  pattern: /^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,
-                  inside: {
-                    "symbol": /\b\w+/,
-                    "punctuation": /^<<[-~]?'|'$/
-                  }
-                },
-                "string": /[\s\S]+/
-              }
-            }
-          ],
-          "command-literal": [
-            {
-              pattern: RegExp(/%x/.source + percentExpression),
-              greedy: true,
-              inside: {
-                "interpolation": interpolation,
-                "command": {
-                  pattern: /[\s\S]+/,
-                  alias: "string"
-                }
-              }
-            },
-            {
-              pattern: /`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,
-              greedy: true,
-              inside: {
-                "interpolation": interpolation,
-                "command": {
-                  pattern: /[\s\S]+/,
-                  alias: "string"
-                }
-              }
-            }
-          ]
-        });
-        delete Prism2.languages.ruby.string;
-        Prism2.languages.insertBefore("ruby", "number", {
-          "builtin": /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,
-          "constant": /\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/
-        });
-        Prism2.languages.rb = Prism2.languages.ruby;
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages.crystal = Prism2.languages.extend("ruby", {
-          "keyword": [
-            /\b(?:__DIR__|__END_LINE__|__FILE__|__LINE__|abstract|alias|annotation|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|ifdef|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|ptr|require|rescue|return|select|self|sizeof|struct|super|then|type|typeof|undef|uninitialized|union|unless|until|when|while|with|yield)\b/,
-            {
-              pattern: /(\.\s*)(?:is_a|responds_to)\?/,
-              lookbehind: true
-            }
-          ],
-          "number": /\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[\da-fA-F_]*[\da-fA-F]|(?:\d(?:[\d_]*\d)?)(?:\.[\d_]*\d)?(?:[eE][+-]?[\d_]*\d)?)(?:_(?:[uif](?:8|16|32|64))?)?\b/,
-          "operator": [
-            /->/,
-            Prism2.languages.ruby.operator
-          ],
-          "punctuation": /[(){}[\].,;\\]/
-        });
-        Prism2.languages.insertBefore("crystal", "string-literal", {
-          "attribute": {
-            pattern: /@\[.*?\]/,
-            inside: {
-              "delimiter": {
-                pattern: /^@\[|\]$/,
-                alias: "punctuation"
-              },
-              "attribute": {
-                pattern: /^(\s*)\w+/,
-                lookbehind: true,
-                alias: "class-name"
-              },
-              "args": {
-                pattern: /\S(?:[\s\S]*\S)?/,
-                inside: Prism2.languages.crystal
-              }
-            }
-          },
-          "expansion": {
-            pattern: /\{(?:\{.*?\}|%.*?%)\}/,
-            inside: {
-              "content": {
-                pattern: /^(\{.)[\s\S]+(?=.\}$)/,
-                lookbehind: true,
-                inside: Prism2.languages.crystal
-              },
-              "delimiter": {
-                pattern: /^\{[\{%]|[\}%]\}$/,
-                alias: "operator"
-              }
-            }
-          },
-          "char": {
-            pattern: /'(?:[^\\\r\n]{1,2}|\\(?:.|u(?:[A-Fa-f0-9]{1,4}|\{[A-Fa-f0-9]{1,6}\})))'/,
-            greedy: true
-          }
-        });
-      })(Prism);
-      (function(Prism2) {
-        var string = /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;
-        var selectorInside;
-        Prism2.languages.css.selector = {
-          pattern: Prism2.languages.css.selector.pattern,
-          lookbehind: true,
-          inside: selectorInside = {
-            "pseudo-element": /:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,
-            "pseudo-class": /:[-\w]+/,
-            "class": /\.[-\w]+/,
-            "id": /#[-\w]+/,
-            "attribute": {
-              pattern: RegExp(`\\[(?:[^[\\]"']|` + string.source + ")*\\]"),
-              greedy: true,
-              inside: {
-                "punctuation": /^\[|\]$/,
-                "case-sensitivity": {
-                  pattern: /(\s)[si]$/i,
-                  lookbehind: true,
-                  alias: "keyword"
-                },
-                "namespace": {
-                  pattern: /^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,
-                  lookbehind: true,
-                  inside: {
-                    "punctuation": /\|$/
-                  }
-                },
-                "attr-name": {
-                  pattern: /^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,
-                  lookbehind: true
-                },
-                "attr-value": [
-                  string,
-                  {
-                    pattern: /(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,
-                    lookbehind: true
-                  }
-                ],
-                "operator": /[|~*^$]?=/
-              }
-            },
-            "n-th": [
-              {
-                pattern: /(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,
-                lookbehind: true,
-                inside: {
-                  "number": /[\dn]+/,
-                  "operator": /[+-]/
-                }
-              },
-              {
-                pattern: /(\(\s*)(?:even|odd)(?=\s*\))/i,
-                lookbehind: true
-              }
-            ],
-            "combinator": />|\+|~|\|\|/,
-            // the `tag` token has been existed and removed.
-            // because we can't find a perfect tokenize to match it.
-            // if you want to add it, please read https://github.com/PrismJS/prism/pull/2373 first.
-            "punctuation": /[(),]/
-          }
-        };
-        Prism2.languages.css["atrule"].inside["selector-function-argument"].inside = selectorInside;
-        Prism2.languages.insertBefore("css", "property", {
-          "variable": {
-            pattern: /(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,
-            lookbehind: true
-          }
-        });
-        var unit = {
-          pattern: /(\b\d+)(?:%|[a-z]+(?![\w-]))/,
-          lookbehind: true
-        };
-        var number = {
-          pattern: /(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,
-          lookbehind: true
-        };
-        Prism2.languages.insertBefore("css", "function", {
-          "operator": {
-            pattern: /(\s)[+\-*\/](?=\s)/,
-            lookbehind: true
-          },
-          // CAREFUL!
-          // Previewers and Inline color use hexcode and color.
-          "hexcode": {
-            pattern: /\B#[\da-f]{3,8}\b/i,
-            alias: "color"
-          },
-          "color": [
-            {
-              pattern: /(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,
-              lookbehind: true
-            },
-            {
-              pattern: /\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,
-              inside: {
-                "unit": unit,
-                "number": number,
-                "function": /[\w-]+(?=\()/,
-                "punctuation": /[(),]/
-              }
-            }
-          ],
-          // it's important that there is no boundary assertion after the hex digits
-          "entity": /\\[\da-f]{1,8}/i,
-          "unit": unit,
-          "number": number
-        });
-      })(Prism);
-      Prism.languages.csv = {
-        "value": /[^\r\n,"]+|"(?:[^"]|"")*"(?!")/,
-        "punctuation": /,/
-      };
-      (function(Prism2) {
-        var stringEscape = /\\(?:(?!\2)|\2(?:[^()\r\n]|\([^()]*\)))/.source;
-        var stringTypes = /"""(?:[^\\"]|"(?!""\2)|<esc>)*"""/.source + // eslint-disable-next-line regexp/strict
-        "|" + /'''(?:[^\\']|'(?!''\2)|<esc>)*'''/.source + // eslint-disable-next-line regexp/strict
-        "|" + /"(?:[^\\\r\n"]|"(?!\2)|<esc>)*"/.source + // eslint-disable-next-line regexp/strict
-        "|" + /'(?:[^\\\r\n']|'(?!\2)|<esc>)*'/.source;
-        var stringLiteral = "(?:" + stringTypes.replace(/<esc>/g, stringEscape) + ")";
-        Prism2.languages.cue = {
-          "comment": {
-            pattern: /\/\/.*/,
-            greedy: true
-          },
-          "string-literal": {
-            // eslint-disable-next-line regexp/strict
-            pattern: RegExp(/(^|[^#"'\\])(#*)/.source + stringLiteral + /(?!["'])\2/.source),
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              // I'm using dirty hack here. We have to know the number hashes at the start of the string somehow,
-              // but we can't look back. So instead, we will use a lookahead, go to the end of the string, and
-              // capture the hashes at the end of the string.
-              "escape": {
-                pattern: /(?=[\s\S]*["'](#*)$)\\\1(?:U[a-fA-F0-9]{1,8}|u[a-fA-F0-9]{1,4}|x[a-fA-F0-9]{1,2}|\d{2,3}|[^(])/,
-                greedy: true,
-                alias: "string"
-              },
-              "interpolation": {
-                pattern: /(?=[\s\S]*["'](#*)$)\\\1\([^()]*\)/,
-                greedy: true,
-                inside: {
-                  "punctuation": /^\\#*\(|\)$/,
-                  "expression": {
-                    pattern: /[\s\S]+/,
-                    inside: null
-                  }
-                }
-              },
-              "string": /[\s\S]+/
-            }
-          },
-          "keyword": {
-            pattern: /(^|[^\w$])(?:for|if|import|in|let|null|package)(?![\w$])/,
-            lookbehind: true
-          },
-          "boolean": {
-            pattern: /(^|[^\w$])(?:false|true)(?![\w$])/,
-            lookbehind: true
-          },
-          "builtin": {
-            pattern: /(^|[^\w$])(?:bool|bytes|float|float(?:32|64)|u?int(?:8|16|32|64|128)?|number|rune|string)(?![\w$])/,
-            lookbehind: true
-          },
-          "attribute": {
-            pattern: /@[\w$]+(?=\s*\()/,
-            alias: "function"
-          },
-          "function": {
-            pattern: /(^|[^\w$])[a-z_$][\w$]*(?=\s*\()/i,
-            lookbehind: true
-          },
-          "number": {
-            pattern: /(^|[^\w$.])(?:0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|0[xX][0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*|(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[eE][+-]?\d+(?:_\d+)*)?(?:[KMGTP]i?)?)(?![\w$])/,
-            lookbehind: true
-          },
-          "operator": /\.{3}|_\|_|&&?|\|\|?|[=!]~|[<>=!]=?|[+\-*/?]/,
-          "punctuation": /[()[\]{},.:]/
-        };
-        Prism2.languages.cue["string-literal"].inside.interpolation.inside.expression.inside = Prism2.languages.cue;
-      })(Prism);
-      Prism.languages.cypher = {
-        // https://neo4j.com/docs/cypher-manual/current/syntax/comments/
-        "comment": /\/\/.*/,
-        "string": {
-          pattern: /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/,
-          greedy: true
-        },
-        "class-name": {
-          pattern: /(:\s*)(?:\w+|`(?:[^`\\\r\n])*`)(?=\s*[{):])/,
-          lookbehind: true,
-          greedy: true
-        },
-        "relationship": {
-          pattern: /(-\[\s*(?:\w+\s*|`(?:[^`\\\r\n])*`\s*)?:\s*|\|\s*:\s*)(?:\w+|`(?:[^`\\\r\n])*`)/,
-          lookbehind: true,
-          greedy: true,
-          alias: "property"
-        },
-        "identifier": {
-          pattern: /`(?:[^`\\\r\n])*`/,
-          greedy: true
-        },
-        "variable": /\$\w+/,
-        // https://neo4j.com/docs/cypher-manual/current/syntax/reserved/
-        "keyword": /\b(?:ADD|ALL|AND|AS|ASC|ASCENDING|ASSERT|BY|CALL|CASE|COMMIT|CONSTRAINT|CONTAINS|CREATE|CSV|DELETE|DESC|DESCENDING|DETACH|DISTINCT|DO|DROP|ELSE|END|ENDS|EXISTS|FOR|FOREACH|IN|INDEX|IS|JOIN|KEY|LIMIT|LOAD|MANDATORY|MATCH|MERGE|NODE|NOT|OF|ON|OPTIONAL|OR|ORDER(?=\s+BY)|PERIODIC|REMOVE|REQUIRE|RETURN|SCALAR|SCAN|SET|SKIP|START|STARTS|THEN|UNION|UNIQUE|UNWIND|USING|WHEN|WHERE|WITH|XOR|YIELD)\b/i,
-        "function": /\b\w+\b(?=\s*\()/,
-        "boolean": /\b(?:false|null|true)\b/i,
-        "number": /\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)\b/,
-        // https://neo4j.com/docs/cypher-manual/current/syntax/operators/
-        "operator": /:|<--?|--?>?|<>|=~?|[<>]=?|[+*/%^|]|\.\.\.?/,
-        "punctuation": /[()[\]{},;.]/
-      };
-      Prism.languages.d = Prism.languages.extend("clike", {
-        "comment": [
-          {
-            // Shebang
-            pattern: /^\s*#!.+/,
-            greedy: true
-          },
-          {
-            pattern: RegExp(/(^|[^\\])/.source + "(?:" + [
-              // /+ comment +/
-              // Allow one level of nesting
-              /\/\+(?:\/\+(?:[^+]|\+(?!\/))*\+\/|(?!\/\+)[\s\S])*?\+\//.source,
-              // // comment
-              /\/\/.*/.source,
-              // /* comment */
-              /\/\*[\s\S]*?\*\//.source
-            ].join("|") + ")"),
-            lookbehind: true,
-            greedy: true
-          }
-        ],
-        "string": [
-          {
-            pattern: RegExp([
-              // r"", x""
-              /\b[rx]"(?:\\[\s\S]|[^\\"])*"[cwd]?/.source,
-              // q"[]", q"()", q"<>", q"{}"
-              /\bq"(?:\[[\s\S]*?\]|\([\s\S]*?\)|<[\s\S]*?>|\{[\s\S]*?\})"/.source,
-              // q"IDENT
-              // ...
-              // IDENT"
-              /\bq"((?!\d)\w+)$[\s\S]*?^\1"/.source,
-              // q"//", q"||", etc.
-              // eslint-disable-next-line regexp/strict
-              /\bq"(.)[\s\S]*?\2"/.source,
-              // eslint-disable-next-line regexp/strict
-              /(["`])(?:\\[\s\S]|(?!\3)[^\\])*\3[cwd]?/.source
-            ].join("|"), "m"),
-            greedy: true
-          },
-          {
-            pattern: /\bq\{(?:\{[^{}]*\}|[^{}])*\}/,
-            greedy: true,
-            alias: "token-string"
-          }
-        ],
-        // In order: $, keywords and special tokens, globally defined symbols
-        "keyword": /\$|\b(?:__(?:(?:DATE|EOF|FILE|FUNCTION|LINE|MODULE|PRETTY_FUNCTION|TIMESTAMP|TIME|VENDOR|VERSION)__|gshared|parameters|traits|vector)|abstract|alias|align|asm|assert|auto|body|bool|break|byte|case|cast|catch|cdouble|cent|cfloat|char|class|const|continue|creal|dchar|debug|default|delegate|delete|deprecated|do|double|dstring|else|enum|export|extern|false|final|finally|float|for|foreach|foreach_reverse|function|goto|idouble|if|ifloat|immutable|import|inout|int|interface|invariant|ireal|lazy|long|macro|mixin|module|new|nothrow|null|out|override|package|pragma|private|protected|ptrdiff_t|public|pure|real|ref|return|scope|shared|short|size_t|static|string|struct|super|switch|synchronized|template|this|throw|true|try|typedef|typeid|typeof|ubyte|ucent|uint|ulong|union|unittest|ushort|version|void|volatile|wchar|while|with|wstring)\b/,
-        "number": [
-          // The lookbehind and the negative look-ahead try to prevent bad highlighting of the .. operator
-          // Hexadecimal numbers must be handled separately to avoid problems with exponent "e"
-          /\b0x\.?[a-f\d_]+(?:(?!\.\.)\.[a-f\d_]*)?(?:p[+-]?[a-f\d_]+)?[ulfi]{0,4}/i,
-          {
-            pattern: /((?:\.\.)?)(?:\b0b\.?|\b|\.)\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:e[+-]?\d[\d_]*)?[ulfi]{0,4}/i,
-            lookbehind: true
-          }
-        ],
-        "operator": /\|[|=]?|&[&=]?|\+[+=]?|-[-=]?|\.?\.\.|=[>=]?|!(?:i[ns]\b|<>?=?|>=?|=)?|\bi[ns]\b|(?:<[<>]?|>>?>?|\^\^|[*\/%^~])=?/
-      });
-      Prism.languages.insertBefore("d", "string", {
-        // Characters
-        // 'a', '\\', '\n', '\xFF', '\377', '\uFFFF', '\U0010FFFF', '\quot'
-        "char": /'(?:\\(?:\W|\w+)|[^\\])'/
-      });
-      Prism.languages.insertBefore("d", "keyword", {
-        "property": /\B@\w*/
-      });
-      Prism.languages.insertBefore("d", "function", {
-        "register": {
-          // Iasm registers
-          pattern: /\b(?:[ABCD][LHX]|E?(?:BP|DI|SI|SP)|[BS]PL|[ECSDGF]S|CR[0234]|[DS]IL|DR[012367]|E[ABCD]X|X?MM[0-7]|R(?:1[0-5]|[89])[BWD]?|R[ABCD]X|R[BS]P|R[DS]I|TR[3-7]|XMM(?:1[0-5]|[89])|YMM(?:1[0-5]|\d))\b|\bST(?:\([0-7]\)|\b)/,
-          alias: "variable"
-        }
-      });
-      (function(Prism2) {
-        var keywords = [
-          /\b(?:async|sync|yield)\*/,
-          /\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extends|extension|external|factory|final|finally|for|get|hide|if|implements|import|in|interface|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/
-        ];
-        var packagePrefix = /(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source;
-        var className = {
-          pattern: RegExp(packagePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),
-          lookbehind: true,
-          inside: {
-            "namespace": {
-              pattern: /^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,
-              inside: {
-                "punctuation": /\./
-              }
-            }
-          }
-        };
-        Prism2.languages.dart = Prism2.languages.extend("clike", {
-          "class-name": [
-            className,
-            {
-              // variables and parameters
-              // this to support class names (or generic parameters) which do not contain a lower case letter (also works for methods)
-              pattern: RegExp(packagePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),
-              lookbehind: true,
-              inside: className.inside
-            }
-          ],
-          "keyword": keywords,
-          "operator": /\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/
-        });
-        Prism2.languages.insertBefore("dart", "string", {
-          "string-literal": {
-            pattern: /r?(?:("""|''')[\s\S]*?\1|(["'])(?:\\.|(?!\2)[^\\\r\n])*\2(?!\2))/,
-            greedy: true,
-            inside: {
-              "interpolation": {
-                pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,
-                lookbehind: true,
-                inside: {
-                  "punctuation": /^\$\{?|\}$/,
-                  "expression": {
-                    pattern: /[\s\S]+/,
-                    inside: Prism2.languages.dart
-                  }
-                }
-              },
-              "string": /[\s\S]+/
-            }
-          },
-          "string": void 0
-        });
-        Prism2.languages.insertBefore("dart", "class-name", {
-          "metadata": {
-            pattern: /@\w+/,
-            alias: "function"
-          }
-        });
-        Prism2.languages.insertBefore("dart", "class-name", {
-          "generics": {
-            pattern: /<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,
-            inside: {
-              "class-name": className,
-              "keyword": keywords,
-              "punctuation": /[<>(),.:]/,
-              "operator": /[?&|]/
-            }
-          }
-        });
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages.dataweave = {
-          "url": /\b[A-Za-z]+:\/\/[\w/:.?=&-]+|\burn:[\w:.?=&-]+/,
-          "property": {
-            pattern: /(?:\b\w+#)?(?:"(?:\\.|[^\\"\r\n])*"|\b\w+)(?=\s*[:@])/,
-            greedy: true
-          },
-          "string": {
-            pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,
-            greedy: true
-          },
-          "mime-type": /\b(?:application|audio|image|multipart|text|video)\/[\w+-]+/,
-          "date": {
-            pattern: /\|[\w:+-]+\|/,
-            greedy: true
-          },
-          "comment": [
-            {
-              pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
-              lookbehind: true,
-              greedy: true
-            },
-            {
-              pattern: /(^|[^\\:])\/\/.*/,
-              lookbehind: true,
-              greedy: true
-            }
-          ],
-          "regex": {
-            pattern: /\/(?:[^\\\/\r\n]|\\[^\r\n])+\//,
-            greedy: true
-          },
-          "keyword": /\b(?:and|as|at|case|do|else|fun|if|input|is|match|not|ns|null|or|output|type|unless|update|using|var)\b/,
-          "function": /\b[A-Z_]\w*(?=\s*\()/i,
-          "number": /-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
-          "punctuation": /[{}[\];(),.:@]/,
-          "operator": /<<|>>|->|[<>~=]=?|!=|--?-?|\+\+?|!|\?/,
-          "boolean": /\b(?:false|true)\b/
-        };
-      })(Prism);
-      Prism.languages.dax = {
-        "comment": {
-          pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/).*)/,
-          lookbehind: true
-        },
-        "data-field": {
-          pattern: /'(?:[^']|'')*'(?!')(?:\[[ \w\xA0-\uFFFF]+\])?|\w+\[[ \w\xA0-\uFFFF]+\]/,
-          alias: "symbol"
-        },
-        "measure": {
-          pattern: /\[[ \w\xA0-\uFFFF]+\]/,
-          alias: "constant"
-        },
-        "string": {
-          pattern: /"(?:[^"]|"")*"(?!")/,
-          greedy: true
-        },
-        "function": /\b(?:ABS|ACOS|ACOSH|ACOT|ACOTH|ADDCOLUMNS|ADDMISSINGITEMS|ALL|ALLCROSSFILTERED|ALLEXCEPT|ALLNOBLANKROW|ALLSELECTED|AND|APPROXIMATEDISTINCTCOUNT|ASIN|ASINH|ATAN|ATANH|AVERAGE|AVERAGEA|AVERAGEX|BETA\.DIST|BETA\.INV|BLANK|CALCULATE|CALCULATETABLE|CALENDAR|CALENDARAUTO|CEILING|CHISQ\.DIST|CHISQ\.DIST\.RT|CHISQ\.INV|CHISQ\.INV\.RT|CLOSINGBALANCEMONTH|CLOSINGBALANCEQUARTER|CLOSINGBALANCEYEAR|COALESCE|COMBIN|COMBINA|COMBINEVALUES|CONCATENATE|CONCATENATEX|CONFIDENCE\.NORM|CONFIDENCE\.T|CONTAINS|CONTAINSROW|CONTAINSSTRING|CONTAINSSTRINGEXACT|CONVERT|COS|COSH|COT|COTH|COUNT|COUNTA|COUNTAX|COUNTBLANK|COUNTROWS|COUNTX|CROSSFILTER|CROSSJOIN|CURRENCY|CURRENTGROUP|CUSTOMDATA|DATATABLE|DATE|DATEADD|DATEDIFF|DATESBETWEEN|DATESINPERIOD|DATESMTD|DATESQTD|DATESYTD|DATEVALUE|DAY|DEGREES|DETAILROWS|DISTINCT|DISTINCTCOUNT|DISTINCTCOUNTNOBLANK|DIVIDE|EARLIER|EARLIEST|EDATE|ENDOFMONTH|ENDOFQUARTER|ENDOFYEAR|EOMONTH|ERROR|EVEN|EXACT|EXCEPT|EXP|EXPON\.DIST|FACT|FALSE|FILTER|FILTERS|FIND|FIRSTDATE|FIRSTNONBLANK|FIRSTNONBLANKVALUE|FIXED|FLOOR|FORMAT|GCD|GENERATE|GENERATEALL|GENERATESERIES|GEOMEAN|GEOMEANX|GROUPBY|HASONEFILTER|HASONEVALUE|HOUR|IF|IF\.EAGER|IFERROR|IGNORE|INT|INTERSECT|ISBLANK|ISCROSSFILTERED|ISEMPTY|ISERROR|ISEVEN|ISFILTERED|ISINSCOPE|ISLOGICAL|ISNONTEXT|ISNUMBER|ISO\.CEILING|ISODD|ISONORAFTER|ISSELECTEDMEASURE|ISSUBTOTAL|ISTEXT|KEEPFILTERS|KEYWORDMATCH|LASTDATE|LASTNONBLANK|LASTNONBLANKVALUE|LCM|LEFT|LEN|LN|LOG|LOG10|LOOKUPVALUE|LOWER|MAX|MAXA|MAXX|MEDIAN|MEDIANX|MID|MIN|MINA|MINUTE|MINX|MOD|MONTH|MROUND|NATURALINNERJOIN|NATURALLEFTOUTERJOIN|NEXTDAY|NEXTMONTH|NEXTQUARTER|NEXTYEAR|NONVISUAL|NORM\.DIST|NORM\.INV|NORM\.S\.DIST|NORM\.S\.INV|NOT|NOW|ODD|OPENINGBALANCEMONTH|OPENINGBALANCEQUARTER|OPENINGBALANCEYEAR|OR|PARALLELPERIOD|PATH|PATHCONTAINS|PATHITEM|PATHITEMREVERSE|PATHLENGTH|PERCENTILE\.EXC|PERCENTILE\.INC|PERCENTILEX\.EXC|PERCENTILEX\.INC|PERMUT|PI|POISSON\.DIST|POWER|PREVIOUSDAY|PREVIOUSMONTH|PREVIOUSQUARTER|PREVIOUSYEAR|PRODUCT|PRODUCTX|QUARTER|QUOTIENT|RADIANS|RAND|RANDBETWEEN|RANK\.EQ|RANKX|RELATED|RELATEDTABLE|REMOVEFILTERS|REPLACE|REPT|RIGHT|ROLLUP|ROLLUPADDISSUBTOTAL|ROLLUPGROUP|ROLLUPISSUBTOTAL|ROUND|ROUNDDOWN|ROUNDUP|ROW|SAMEPERIODLASTYEAR|SAMPLE|SEARCH|SECOND|SELECTCOLUMNS|SELECTEDMEASURE|SELECTEDMEASUREFORMATSTRING|SELECTEDMEASURENAME|SELECTEDVALUE|SIGN|SIN|SINH|SQRT|SQRTPI|STARTOFMONTH|STARTOFQUARTER|STARTOFYEAR|STDEV\.P|STDEV\.S|STDEVX\.P|STDEVX\.S|SUBSTITUTE|SUBSTITUTEWITHINDEX|SUM|SUMMARIZE|SUMMARIZECOLUMNS|SUMX|SWITCH|T\.DIST|T\.DIST\.2T|T\.DIST\.RT|T\.INV|T\.INV\.2T|TAN|TANH|TIME|TIMEVALUE|TODAY|TOPN|TOPNPERLEVEL|TOPNSKIP|TOTALMTD|TOTALQTD|TOTALYTD|TREATAS|TRIM|TRUE|TRUNC|UNICHAR|UNICODE|UNION|UPPER|USERELATIONSHIP|USERNAME|USEROBJECTID|USERPRINCIPALNAME|UTCNOW|UTCTODAY|VALUE|VALUES|VAR\.P|VAR\.S|VARX\.P|VARX\.S|WEEKDAY|WEEKNUM|XIRR|XNPV|YEAR|YEARFRAC)(?=\s*\()/i,
-        "keyword": /\b(?:DEFINE|EVALUATE|MEASURE|ORDER\s+BY|RETURN|VAR|START\s+AT|ASC|DESC)\b/i,
-        "boolean": {
-          pattern: /\b(?:FALSE|NULL|TRUE)\b/i,
-          alias: "constant"
-        },
-        "number": /\b\d+(?:\.\d*)?|\B\.\d+\b/,
-        "operator": /:=|[-+*\/=^]|&&?|\|\||<(?:=>?|<|>)?|>[>=]?|\b(?:IN|NOT)\b/i,
-        "punctuation": /[;\[\](){}`,.]/
-      };
-      Prism.languages.dhall = {
-        // Multi-line comments can be nested. E.g. {- foo {- bar -} -}
-        // The multi-line pattern is essentially this:
-        //   \{-(?:[^-{]|-(?!\})|\{(?!-)|<SELF>)*-\}
-        "comment": /--.*|\{-(?:[^-{]|-(?!\})|\{(?!-)|\{-(?:[^-{]|-(?!\})|\{(?!-))*-\})*-\}/,
-        "string": {
-          pattern: /"(?:[^"\\]|\\.)*"|''(?:[^']|'(?!')|'''|''\$\{)*''(?!'|\$)/,
-          greedy: true,
-          inside: {
-            "interpolation": {
-              pattern: /\$\{[^{}]*\}/,
-              inside: {
-                "expression": {
-                  pattern: /(^\$\{)[\s\S]+(?=\}$)/,
-                  lookbehind: true,
-                  alias: "language-dhall",
-                  inside: null
-                  // see blow
-                },
-                "punctuation": /\$\{|\}/
-              }
-            }
-          }
-        },
-        "label": {
-          pattern: /`[^`]*`/,
-          greedy: true
-        },
-        "url": {
-          // https://github.com/dhall-lang/dhall-lang/blob/5fde8ef1bead6fb4e999d3c1ffe7044cd019d63a/standard/dhall.abnf#L596
-          pattern: /\bhttps?:\/\/[\w.:%!$&'*+;=@~-]+(?:\/[\w.:%!$&'*+;=@~-]*)*(?:\?[/?\w.:%!$&'*+;=@~-]*)?/,
-          greedy: true
-        },
-        "env": {
-          // https://github.com/dhall-lang/dhall-lang/blob/5fde8ef1bead6fb4e999d3c1ffe7044cd019d63a/standard/dhall.abnf#L661
-          pattern: /\benv:(?:(?!\d)\w+|"(?:[^"\\=]|\\.)*")/,
-          greedy: true,
-          inside: {
-            "function": /^env/,
-            "operator": /^:/,
-            "variable": /[\s\S]+/
-          }
-        },
-        "hash": {
-          // https://github.com/dhall-lang/dhall-lang/blob/5fde8ef1bead6fb4e999d3c1ffe7044cd019d63a/standard/dhall.abnf#L725
-          pattern: /\bsha256:[\da-fA-F]{64}\b/,
-          inside: {
-            "function": /sha256/,
-            "operator": /:/,
-            "number": /[\da-fA-F]{64}/
-          }
-        },
-        // https://github.com/dhall-lang/dhall-lang/blob/5fde8ef1bead6fb4e999d3c1ffe7044cd019d63a/standard/dhall.abnf#L359
-        "keyword": /\b(?:as|assert|else|forall|if|in|let|merge|missing|then|toMap|using|with)\b|\u2200/,
-        "builtin": /\b(?:None|Some)\b/,
-        "boolean": /\b(?:False|True)\b/,
-        "number": /\bNaN\b|-?\bInfinity\b|[+-]?\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/,
-        "operator": /\/\\|\/\/\\\\|&&|\|\||===|[!=]=|\/\/|->|\+\+|::|[+*#@=:?<>|\\\u2227\u2a53\u2261\u2afd\u03bb\u2192]/,
-        "punctuation": /\.\.|[{}\[\](),./]/,
-        // we'll just assume that every capital word left is a type name
-        "class-name": /\b[A-Z]\w*\b/
-      };
-      Prism.languages.dhall.string.inside.interpolation.inside.expression.inside = Prism.languages.dhall;
-      (function(Prism2) {
-        Prism2.languages.diff = {
-          "coord": [
-            // Match all kinds of coord lines (prefixed by "+++", "---" or "***").
-            /^(?:\*{3}|-{3}|\+{3}).*$/m,
-            // Match "@@ ... @@" coord lines in unified diff.
-            /^@@.*@@$/m,
-            // Match coord lines in normal diff (starts with a number).
-            /^\d.*$/m
-          ]
-          // deleted, inserted, unchanged, diff
-        };
-        var PREFIXES = {
-          "deleted-sign": "-",
-          "deleted-arrow": "<",
-          "inserted-sign": "+",
-          "inserted-arrow": ">",
-          "unchanged": " ",
-          "diff": "!"
-        };
-        Object.keys(PREFIXES).forEach(function(name) {
-          var prefix = PREFIXES[name];
-          var alias = [];
-          if (!/^\w+$/.test(name)) {
-            alias.push(/\w+/.exec(name)[0]);
-          }
-          if (name === "diff") {
-            alias.push("bold");
-          }
-          Prism2.languages.diff[name] = {
-            pattern: RegExp("^(?:[" + prefix + "].*(?:\r\n?|\n|(?![\\s\\S])))+", "m"),
-            alias,
-            inside: {
-              "line": {
-                pattern: /(.)(?=[\s\S]).*(?:\r\n?|\n)?/,
-                lookbehind: true
-              },
-              "prefix": {
-                pattern: /[\s\S]/,
-                alias: /\w+/.exec(name)[0]
-              }
-            }
-          };
-        });
-        Object.defineProperty(Prism2.languages.diff, "PREFIXES", {
-          value: PREFIXES
-        });
-      })(Prism);
-      (function(Prism2) {
-        function getPlaceholder(language, index) {
-          return "___" + language.toUpperCase() + index + "___";
-        }
-        Object.defineProperties(Prism2.languages["markup-templating"] = {}, {
-          buildPlaceholders: {
-            /**
-             * Tokenize all inline templating expressions matching `placeholderPattern`.
-             *
-             * If `replaceFilter` is provided, only matches of `placeholderPattern` for which `replaceFilter` returns
-             * `true` will be replaced.
-             *
-             * @param {object} env The environment of the `before-tokenize` hook.
-             * @param {string} language The language id.
-             * @param {RegExp} placeholderPattern The matches of this pattern will be replaced by placeholders.
-             * @param {(match: string) => boolean} [replaceFilter]
-             */
-            value: function(env, language, placeholderPattern, replaceFilter) {
-              if (env.language !== language) {
-                return;
-              }
-              var tokenStack = env.tokenStack = [];
-              env.code = env.code.replace(placeholderPattern, function(match) {
-                if (typeof replaceFilter === "function" && !replaceFilter(match)) {
-                  return match;
-                }
-                var i = tokenStack.length;
-                var placeholder;
-                while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) {
-                  ++i;
-                }
-                tokenStack[i] = match;
-                return placeholder;
-              });
-              env.grammar = Prism2.languages.markup;
-            }
-          },
-          tokenizePlaceholders: {
-            /**
-             * Replace placeholders with proper tokens after tokenizing.
-             *
-             * @param {object} env The environment of the `after-tokenize` hook.
-             * @param {string} language The language id.
-             */
-            value: function(env, language) {
-              if (env.language !== language || !env.tokenStack) {
-                return;
-              }
-              env.grammar = Prism2.languages[language];
-              var j = 0;
-              var keys = Object.keys(env.tokenStack);
-              function walkTokens(tokens) {
-                for (var i = 0; i < tokens.length; i++) {
-                  if (j >= keys.length) {
-                    break;
-                  }
-                  var token = tokens[i];
-                  if (typeof token === "string" || token.content && typeof token.content === "string") {
-                    var k = keys[j];
-                    var t = env.tokenStack[k];
-                    var s = typeof token === "string" ? token : token.content;
-                    var placeholder = getPlaceholder(language, k);
-                    var index = s.indexOf(placeholder);
-                    if (index > -1) {
-                      ++j;
-                      var before = s.substring(0, index);
-                      var middle = new Prism2.Token(language, Prism2.tokenize(t, env.grammar), "language-" + language, t);
-                      var after = s.substring(index + placeholder.length);
-                      var replacement = [];
-                      if (before) {
-                        replacement.push.apply(replacement, walkTokens([before]));
-                      }
-                      replacement.push(middle);
-                      if (after) {
-                        replacement.push.apply(replacement, walkTokens([after]));
-                      }
-                      if (typeof token === "string") {
-                        tokens.splice.apply(tokens, [i, 1].concat(replacement));
-                      } else {
-                        token.content = replacement;
-                      }
-                    }
-                  } else if (token.content) {
-                    walkTokens(token.content);
-                  }
-                }
-                return tokens;
-              }
-              walkTokens(env.tokens);
-            }
-          }
-        });
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages.django = {
-          "comment": /^\{#[\s\S]*?#\}$/,
-          "tag": {
-            pattern: /(^\{%[+-]?\s*)\w+/,
-            lookbehind: true,
-            alias: "keyword"
-          },
-          "delimiter": {
-            pattern: /^\{[{%][+-]?|[+-]?[}%]\}$/,
-            alias: "punctuation"
-          },
-          "string": {
-            pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
-            greedy: true
-          },
-          "filter": {
-            pattern: /(\|)\w+/,
-            lookbehind: true,
-            alias: "function"
-          },
-          "test": {
-            pattern: /(\bis\s+(?:not\s+)?)(?!not\b)\w+/,
-            lookbehind: true,
-            alias: "function"
-          },
-          "function": /\b[a-z_]\w+(?=\s*\()/i,
-          "keyword": /\b(?:and|as|by|else|for|if|import|in|is|loop|not|or|recursive|with|without)\b/,
-          "operator": /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,
-          "number": /\b\d+(?:\.\d+)?\b/,
-          "boolean": /[Ff]alse|[Nn]one|[Tt]rue/,
-          "variable": /\b\w+\b/,
-          "punctuation": /[{}[\](),.:;]/
-        };
-        var pattern = /\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g;
-        var markupTemplating = Prism2.languages["markup-templating"];
-        Prism2.hooks.add("before-tokenize", function(env) {
-          markupTemplating.buildPlaceholders(env, "django", pattern);
-        });
-        Prism2.hooks.add("after-tokenize", function(env) {
-          markupTemplating.tokenizePlaceholders(env, "django");
-        });
-        Prism2.languages.jinja2 = Prism2.languages.django;
-        Prism2.hooks.add("before-tokenize", function(env) {
-          markupTemplating.buildPlaceholders(env, "jinja2", pattern);
-        });
-        Prism2.hooks.add("after-tokenize", function(env) {
-          markupTemplating.tokenizePlaceholders(env, "jinja2");
-        });
-      })(Prism);
-      Prism.languages["dns-zone-file"] = {
-        "comment": /;.*/,
-        "string": {
-          pattern: /"(?:\\.|[^"\\\r\n])*"/,
-          greedy: true
-        },
-        "variable": [
-          {
-            pattern: /(^\$ORIGIN[ \t]+)\S+/m,
-            lookbehind: true
-          },
-          {
-            pattern: /(^|\s)@(?=\s|$)/,
-            lookbehind: true
-          }
-        ],
-        "keyword": /^\$(?:INCLUDE|ORIGIN|TTL)(?=\s|$)/m,
-        "class": {
-          // https://tools.ietf.org/html/rfc1035#page-13
-          pattern: /(^|\s)(?:CH|CS|HS|IN)(?=\s|$)/,
-          lookbehind: true,
-          alias: "keyword"
-        },
-        "type": {
-          // https://en.wikipedia.org/wiki/List_of_DNS_record_types
-          pattern: /(^|\s)(?:A|A6|AAAA|AFSDB|APL|ATMA|CAA|CDNSKEY|CDS|CERT|CNAME|DHCID|DLV|DNAME|DNSKEY|DS|EID|GID|GPOS|HINFO|HIP|IPSECKEY|ISDN|KEY|KX|LOC|MAILA|MAILB|MB|MD|MF|MG|MINFO|MR|MX|NAPTR|NB|NBSTAT|NIMLOC|NINFO|NS|NSAP|NSAP-PTR|NSEC|NSEC3|NSEC3PARAM|NULL|NXT|OPENPGPKEY|PTR|PX|RKEY|RP|RRSIG|RT|SIG|SINK|SMIMEA|SOA|SPF|SRV|SSHFP|TA|TKEY|TLSA|TSIG|TXT|UID|UINFO|UNSPEC|URI|WKS|X25)(?=\s|$)/,
-          lookbehind: true,
-          alias: "keyword"
-        },
-        "punctuation": /[()]/
-      };
-      Prism.languages["dns-zone"] = Prism.languages["dns-zone-file"];
-      (function(Prism2) {
-        var spaceAfterBackSlash = /\\[\r\n](?:\s|\\[\r\n]|#.*(?!.))*(?![\s#]|\\[\r\n])/.source;
-        var space = /(?:[ \t]+(?![ \t])(?:<SP_BS>)?|<SP_BS>)/.source.replace(/<SP_BS>/g, function() {
-          return spaceAfterBackSlash;
-        });
-        var string = /"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"|'(?:[^'\\\r\n]|\\(?:\r\n|[\s\S]))*'/.source;
-        var option = /--[\w-]+=(?:<STR>|(?!["'])(?:[^\s\\]|\\.)+)/.source.replace(/<STR>/g, function() {
-          return string;
-        });
-        var stringRule = {
-          pattern: RegExp(string),
-          greedy: true
-        };
-        var commentRule = {
-          pattern: /(^[ \t]*)#.*/m,
-          lookbehind: true,
-          greedy: true
-        };
-        function re(source, flags) {
-          source = source.replace(/<OPT>/g, function() {
-            return option;
-          }).replace(/<SP>/g, function() {
-            return space;
-          });
-          return RegExp(source, flags);
-        }
-        Prism2.languages.docker = {
-          "instruction": {
-            pattern: /(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "options": {
-                pattern: re(/(^(?:ONBUILD<SP>)?\w+<SP>)<OPT>(?:<SP><OPT>)*/.source, "i"),
-                lookbehind: true,
-                greedy: true,
-                inside: {
-                  "property": {
-                    pattern: /(^|\s)--[\w-]+/,
-                    lookbehind: true
-                  },
-                  "string": [
-                    stringRule,
-                    {
-                      pattern: /(=)(?!["'])(?:[^\s\\]|\\.)+/,
-                      lookbehind: true
-                    }
-                  ],
-                  "operator": /\\$/m,
-                  "punctuation": /=/
-                }
-              },
-              "keyword": [
-                {
-                  // https://docs.docker.com/engine/reference/builder/#healthcheck
-                  pattern: re(/(^(?:ONBUILD<SP>)?HEALTHCHECK<SP>(?:<OPT><SP>)*)(?:CMD|NONE)\b/.source, "i"),
-                  lookbehind: true,
-                  greedy: true
-                },
-                {
-                  // https://docs.docker.com/engine/reference/builder/#from
-                  pattern: re(/(^(?:ONBUILD<SP>)?FROM<SP>(?:<OPT><SP>)*(?!--)[^ \t\\]+<SP>)AS/.source, "i"),
-                  lookbehind: true,
-                  greedy: true
-                },
-                {
-                  // https://docs.docker.com/engine/reference/builder/#onbuild
-                  pattern: re(/(^ONBUILD<SP>)\w+/.source, "i"),
-                  lookbehind: true,
-                  greedy: true
-                },
-                {
-                  pattern: /^\w+/,
-                  greedy: true
-                }
-              ],
-              "comment": commentRule,
-              "string": stringRule,
-              "variable": /\$(?:\w+|\{[^{}"'\\]*\})/,
-              "operator": /\\$/m
-            }
-          },
-          "comment": commentRule
-        };
-        Prism2.languages.dockerfile = Prism2.languages.docker;
-      })(Prism);
-      (function(Prism2) {
-        var ID = "(?:" + [
-          // an identifier
-          /[a-zA-Z_\x80-\uFFFF][\w\x80-\uFFFF]*/.source,
-          // a number
-          /-?(?:\.\d+|\d+(?:\.\d*)?)/.source,
-          // a double-quoted string
-          /"[^"\\]*(?:\\[\s\S][^"\\]*)*"/.source,
-          // HTML-like string
-          /<(?:[^<>]|(?!<!--)<(?:[^<>"']|"[^"]*"|'[^']*')+>|<!--(?:[^-]|-(?!->))*-->)*>/.source
-        ].join("|") + ")";
-        var IDInside = {
-          "markup": {
-            pattern: /(^<)[\s\S]+(?=>$)/,
-            lookbehind: true,
-            alias: ["language-markup", "language-html", "language-xml"],
-            inside: Prism2.languages.markup
-          }
-        };
-        function withID(source, flags) {
-          return RegExp(source.replace(/<ID>/g, function() {
-            return ID;
-          }), flags);
-        }
-        Prism2.languages.dot = {
-          "comment": {
-            pattern: /\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,
-            greedy: true
-          },
-          "graph-name": {
-            pattern: withID(/(\b(?:digraph|graph|subgraph)[ \t\r\n]+)<ID>/.source, "i"),
-            lookbehind: true,
-            greedy: true,
-            alias: "class-name",
-            inside: IDInside
-          },
-          "attr-value": {
-            pattern: withID(/(=[ \t\r\n]*)<ID>/.source),
-            lookbehind: true,
-            greedy: true,
-            inside: IDInside
-          },
-          "attr-name": {
-            pattern: withID(/([\[;, \t\r\n])<ID>(?=[ \t\r\n]*=)/.source),
-            lookbehind: true,
-            greedy: true,
-            inside: IDInside
-          },
-          "keyword": /\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,
-          "compass-point": {
-            pattern: /(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,
-            lookbehind: true,
-            alias: "builtin"
-          },
-          "node": {
-            pattern: withID(/(^|[^-.\w\x80-\uFFFF\\])<ID>/.source),
-            lookbehind: true,
-            greedy: true,
-            inside: IDInside
-          },
-          "operator": /[=:]|-[->]/,
-          "punctuation": /[\[\]{};,]/
-        };
-        Prism2.languages.gv = Prism2.languages.dot;
-      })(Prism);
-      Prism.languages.ebnf = {
-        "comment": /\(\*[\s\S]*?\*\)/,
-        "string": {
-          pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
-          greedy: true
-        },
-        "special": {
-          pattern: /\?[^?\r\n]*\?/,
-          greedy: true,
-          alias: "class-name"
-        },
-        "definition": {
-          pattern: /^([\t ]*)[a-z]\w*(?:[ \t]+[a-z]\w*)*(?=\s*=)/im,
-          lookbehind: true,
-          alias: ["rule", "keyword"]
-        },
-        "rule": /\b[a-z]\w*(?:[ \t]+[a-z]\w*)*\b/i,
-        "punctuation": /\([:/]|[:/]\)|[.,;()[\]{}]/,
-        "operator": /[-=|*/!]/
-      };
-      Prism.languages.editorconfig = {
-        // https://editorconfig-specification.readthedocs.io
-        "comment": /[;#].*/,
-        "section": {
-          pattern: /(^[ \t]*)\[.+\]/m,
-          lookbehind: true,
-          alias: "selector",
-          inside: {
-            "regex": /\\\\[\[\]{},!?.*]/,
-            // Escape special characters with '\\'
-            "operator": /[!?]|\.\.|\*{1,2}/,
-            "punctuation": /[\[\]{},]/
-          }
-        },
-        "key": {
-          pattern: /(^[ \t]*)[^\s=]+(?=[ \t]*=)/m,
-          lookbehind: true,
-          alias: "attr-name"
-        },
-        "value": {
-          pattern: /=.*/,
-          alias: "attr-value",
-          inside: {
-            "punctuation": /^=/
-          }
-        }
-      };
-      Prism.languages.eiffel = {
-        "comment": /--.*/,
-        "string": [
-          // Aligned-verbatim-strings
-          {
-            pattern: /"([^[]*)\[[\s\S]*?\]\1"/,
-            greedy: true
-          },
-          // Non-aligned-verbatim-strings
-          {
-            pattern: /"([^{]*)\{[\s\S]*?\}\1"/,
-            greedy: true
-          },
-          // Single-line string
-          {
-            pattern: /"(?:%(?:(?!\n)\s)*\n\s*%|%\S|[^%"\r\n])*"/,
-            greedy: true
-          }
-        ],
-        // normal char | special char | char code
-        "char": /'(?:%.|[^%'\r\n])+'/,
-        "keyword": /\b(?:across|agent|alias|all|and|as|assign|attached|attribute|check|class|convert|create|Current|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|implies|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|or|Precursor|redefine|rename|require|rescue|Result|retry|select|separate|some|then|undefine|until|variant|Void|when|xor)\b/i,
-        "boolean": /\b(?:False|True)\b/i,
-        // Convention: class-names are always all upper-case characters
-        "class-name": /\b[A-Z][\dA-Z_]*\b/,
-        "number": [
-          // hexa | octal | bin
-          /\b0[xcb][\da-f](?:_*[\da-f])*\b/i,
-          // Decimal
-          /(?:\b\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?e[+-]?)?\d(?:_*\d)*\b|\b\d(?:_*\d)*\b\.?/i
-        ],
-        "punctuation": /:=|<<|>>|\(\||\|\)|->|\.(?=\w)|[{}[\];(),:?]/,
-        "operator": /\\\\|\|\.\.\||\.\.|\/[~\/=]?|[><]=?|[-+*^=~]/
-      };
-      (function(Prism2) {
-        Prism2.languages.ejs = {
-          "delimiter": {
-            pattern: /^<%[-_=]?|[-_]?%>$/,
-            alias: "punctuation"
-          },
-          "comment": /^#[\s\S]*/,
-          "language-javascript": {
-            pattern: /[\s\S]+/,
-            inside: Prism2.languages.javascript
-          }
-        };
-        Prism2.hooks.add("before-tokenize", function(env) {
-          var ejsPattern = /<%(?!%)[\s\S]+?%>/g;
-          Prism2.languages["markup-templating"].buildPlaceholders(env, "ejs", ejsPattern);
-        });
-        Prism2.hooks.add("after-tokenize", function(env) {
-          Prism2.languages["markup-templating"].tokenizePlaceholders(env, "ejs");
-        });
-        Prism2.languages.eta = Prism2.languages.ejs;
-      })(Prism);
-      Prism.languages.elixir = {
-        "doc": {
-          pattern: /@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,
-          inside: {
-            "attribute": /^@\w+/,
-            "string": /['"][\s\S]+/
-          }
-        },
-        "comment": {
-          pattern: /#.*/,
-          greedy: true
-        },
-        // ~r"""foo""" (multi-line), ~r'''foo''' (multi-line), ~r/foo/, ~r|foo|, ~r"foo", ~r'foo', ~r(foo), ~r[foo], ~r{foo}, ~r<foo>
-        "regex": {
-          pattern: /~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,
-          greedy: true
-        },
-        "string": [
-          {
-            // ~s"""foo""" (multi-line), ~s'''foo''' (multi-line), ~s/foo/, ~s|foo|, ~s"foo", ~s'foo', ~s(foo), ~s[foo], ~s{foo} (with interpolation care), ~s<foo>
-            pattern: /~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,
-            greedy: true,
-            inside: {
-              // See interpolation below
-            }
-          },
-          {
-            pattern: /("""|''')[\s\S]*?\1/,
-            greedy: true,
-            inside: {
-              // See interpolation below
-            }
-          },
-          {
-            // Multi-line strings are allowed
-            pattern: /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
-            greedy: true,
-            inside: {
-              // See interpolation below
-            }
-          }
-        ],
-        "atom": {
-          // Look-behind prevents bad highlighting of the :: operator
-          pattern: /(^|[^:]):\w+/,
-          lookbehind: true,
-          alias: "symbol"
-        },
-        "module": {
-          pattern: /\b[A-Z]\w*\b/,
-          alias: "class-name"
-        },
-        // Look-ahead prevents bad highlighting of the :: operator
-        "attr-name": /\b\w+\??:(?!:)/,
-        "argument": {
-          // Look-behind prevents bad highlighting of the && operator
-          pattern: /(^|[^&])&\d+/,
-          lookbehind: true,
-          alias: "variable"
-        },
-        "attribute": {
-          pattern: /@\w+/,
-          alias: "variable"
-        },
-        "function": /\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,
-        "number": /\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,
-        "keyword": /\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,
-        "boolean": /\b(?:false|nil|true)\b/,
-        "operator": [
-          /\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,
-          {
-            // We don't want to match <<
-            pattern: /([^<])<(?!<)/,
-            lookbehind: true
-          },
-          {
-            // We don't want to match >>
-            pattern: /([^>])>(?!>)/,
-            lookbehind: true
-          }
-        ],
-        "punctuation": /<<|>>|[.,%\[\]{}()]/
-      };
-      Prism.languages.elixir.string.forEach(function(o) {
-        o.inside = {
-          "interpolation": {
-            pattern: /#\{[^}]+\}/,
-            inside: {
-              "delimiter": {
-                pattern: /^#\{|\}$/,
-                alias: "punctuation"
-              },
-              rest: Prism.languages.elixir
-            }
-          }
-        };
-      });
-      Prism.languages.elm = {
-        "comment": /--.*|\{-[\s\S]*?-\}/,
-        "char": {
-          pattern: /'(?:[^\\'\r\n]|\\(?:[abfnrtv\\']|\d+|x[0-9a-fA-F]+|u\{[0-9a-fA-F]+\}))'/,
-          greedy: true
-        },
-        "string": [
-          {
-            // Multiline strings are wrapped in triple ". Quotes may appear unescaped.
-            pattern: /"""[\s\S]*?"""/,
-            greedy: true
-          },
-          {
-            pattern: /"(?:[^\\"\r\n]|\\.)*"/,
-            greedy: true
-          }
-        ],
-        "import-statement": {
-          // The imported or hidden names are not included in this import
-          // statement. This is because we want to highlight those exactly like
-          // we do for the names in the program.
-          pattern: /(^[\t ]*)import\s+[A-Z]\w*(?:\.[A-Z]\w*)*(?:\s+as\s+(?:[A-Z]\w*)(?:\.[A-Z]\w*)*)?(?:\s+exposing\s+)?/m,
-          lookbehind: true,
-          inside: {
-            "keyword": /\b(?:as|exposing|import)\b/
-          }
-        },
-        "keyword": /\b(?:alias|as|case|else|exposing|if|in|infixl|infixr|let|module|of|then|type)\b/,
-        // These are builtin variables only. Constructors are highlighted later as a constant.
-        "builtin": /\b(?:abs|acos|always|asin|atan|atan2|ceiling|clamp|compare|cos|curry|degrees|e|flip|floor|fromPolar|identity|isInfinite|isNaN|logBase|max|min|negate|never|not|pi|radians|rem|round|sin|sqrt|tan|toFloat|toPolar|toString|truncate|turns|uncurry|xor)\b/,
-        // decimal integers and floating point numbers | hexadecimal integers
-        "number": /\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[0-9a-f]+)\b/i,
-        // Most of this is needed because of the meaning of a single '.'.
-        // If it stands alone freely, it is the function composition.
-        // It may also be a separator between a module name and an identifier => no
-        // operator. If it comes together with other special characters it is an
-        // operator too.
-        // Valid operator characters in 0.18: +-/*=.$<>:&|^?%#@~!
-        // Ref: https://groups.google.com/forum/#!msg/elm-dev/0AHSnDdkSkQ/E0SVU70JEQAJ
-        "operator": /\s\.\s|[+\-/*=.$<>:&|^?%#@~!]{2,}|[+\-/*=$<>:&|^?%#@~!]/,
-        // In Elm, nearly everything is a variable, do not highlight these.
-        "hvariable": /\b(?:[A-Z]\w*\.)*[a-z]\w*\b/,
-        "constant": /\b(?:[A-Z]\w*\.)*[A-Z]\w*\b/,
-        "punctuation": /[{}[\]|(),.:]/
-      };
-      Prism.languages.lua = {
-        "comment": /^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,
-        // \z may be used to skip the following space
-        "string": {
-          pattern: /(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,
-          greedy: true
-        },
-        "number": /\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,
-        "keyword": /\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,
-        "function": /(?!\d)\w+(?=\s*(?:[({]))/,
-        "operator": [
-          /[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,
-          {
-            // Match ".." but don't break "..."
-            pattern: /(^|[^.])\.\.(?!\.)/,
-            lookbehind: true
-          }
-        ],
-        "punctuation": /[\[\](){},;]|\.+|:+/
-      };
-      (function(Prism2) {
-        Prism2.languages.etlua = {
-          "delimiter": {
-            pattern: /^<%[-=]?|-?%>$/,
-            alias: "punctuation"
-          },
-          "language-lua": {
-            pattern: /[\s\S]+/,
-            inside: Prism2.languages.lua
-          }
-        };
-        Prism2.hooks.add("before-tokenize", function(env) {
-          var pattern = /<%[\s\S]+?%>/g;
-          Prism2.languages["markup-templating"].buildPlaceholders(env, "etlua", pattern);
-        });
-        Prism2.hooks.add("after-tokenize", function(env) {
-          Prism2.languages["markup-templating"].tokenizePlaceholders(env, "etlua");
-        });
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages.erb = {
-          "delimiter": {
-            pattern: /^(\s*)<%=?|%>(?=\s*$)/,
-            lookbehind: true,
-            alias: "punctuation"
-          },
-          "ruby": {
-            pattern: /\s*\S[\s\S]*/,
-            alias: "language-ruby",
-            inside: Prism2.languages.ruby
-          }
-        };
-        Prism2.hooks.add("before-tokenize", function(env) {
-          var erbPattern = /<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g;
-          Prism2.languages["markup-templating"].buildPlaceholders(env, "erb", erbPattern);
-        });
-        Prism2.hooks.add("after-tokenize", function(env) {
-          Prism2.languages["markup-templating"].tokenizePlaceholders(env, "erb");
-        });
-      })(Prism);
-      Prism.languages.erlang = {
-        "comment": /%.+/,
-        "string": {
-          pattern: /"(?:\\.|[^\\"\r\n])*"/,
-          greedy: true
-        },
-        "quoted-function": {
-          pattern: /'(?:\\.|[^\\'\r\n])+'(?=\()/,
-          alias: "function"
-        },
-        "quoted-atom": {
-          pattern: /'(?:\\.|[^\\'\r\n])+'/,
-          alias: "atom"
-        },
-        "boolean": /\b(?:false|true)\b/,
-        "keyword": /\b(?:after|begin|case|catch|end|fun|if|of|receive|try|when)\b/,
-        "number": [
-          /\$\\?./,
-          /\b\d+#[a-z0-9]+/i,
-          /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i
-        ],
-        "function": /\b[a-z][\w@]*(?=\()/,
-        "variable": {
-          // Look-behind is used to prevent wrong highlighting of atoms containing "@"
-          pattern: /(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,
-          lookbehind: true
-        },
-        "operator": [
-          /[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:and|andalso|band|bnot|bor|bsl|bsr|bxor|div|not|or|orelse|rem|xor)\b/,
-          {
-            // We don't want to match <<
-            pattern: /(^|[^<])<(?!<)/,
-            lookbehind: true
-          },
-          {
-            // We don't want to match >>
-            pattern: /(^|[^>])>(?!>)/,
-            lookbehind: true
-          }
-        ],
-        "atom": /\b[a-z][\w@]*/,
-        "punctuation": /[()[\]{}:;,.#|]|<<|>>/
-      };
-      Prism.languages["excel-formula"] = {
-        "comment": {
-          pattern: /(\bN\(\s*)"(?:[^"]|"")*"(?=\s*\))/i,
-          lookbehind: true,
-          greedy: true
-        },
-        "string": {
-          pattern: /"(?:[^"]|"")*"(?!")/,
-          greedy: true
-        },
-        "reference": {
-          // https://www.ablebits.com/office-addins-blog/2015/12/08/excel-reference-another-sheet-workbook/
-          // Sales!B2
-          // 'Winter sales'!B2
-          // [Sales.xlsx]Jan!B2:B5
-          // D:\Reports\[Sales.xlsx]Jan!B2:B5
-          // '[Sales.xlsx]Jan sales'!B2:B5
-          // 'D:\Reports\[Sales.xlsx]Jan sales'!B2:B5
-          pattern: /(?:'[^']*'|(?:[^\s()[\]{}<>*?"';,$&]*\[[^^\s()[\]{}<>*?"']+\])?\w+)!/,
-          greedy: true,
-          alias: "string",
-          inside: {
-            "operator": /!$/,
-            "punctuation": /'/,
-            "sheet": {
-              pattern: /[^[\]]+$/,
-              alias: "function"
-            },
-            "file": {
-              pattern: /\[[^[\]]+\]$/,
-              inside: {
-                "punctuation": /[[\]]/
-              }
-            },
-            "path": /[\s\S]+/
-          }
-        },
-        "function-name": {
-          pattern: /\b[A-Z]\w*(?=\()/i,
-          alias: "builtin"
-        },
-        "range": {
-          pattern: /\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i,
-          alias: "selector",
-          inside: {
-            "operator": /:/,
-            "cell": /\$?[A-Z]+\$?\d+/i,
-            "column": /\$?[A-Z]+/i,
-            "row": /\$?\d+/
-          }
-        },
-        "cell": {
-          // Excel is case insensitive, so the string "foo1" could be either a variable or a cell.
-          // To combat this, we match cells case insensitive, if the contain at least one "$", and case sensitive otherwise.
-          pattern: /\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/,
-          alias: "selector"
-        },
-        "number": /(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i,
-        "boolean": /\b(?:FALSE|TRUE)\b/i,
-        "operator": /[-+*/^%=&,]|<[=>]?|>=?/,
-        "punctuation": /[[\]();{}|]/
-      };
-      Prism.languages["xlsx"] = Prism.languages["xls"] = Prism.languages["excel-formula"];
-      Prism.languages.fsharp = Prism.languages.extend("clike", {
-        "comment": [
-          {
-            pattern: /(^|[^\\])\(\*(?!\))[\s\S]*?\*\)/,
-            lookbehind: true,
-            greedy: true
-          },
-          {
-            pattern: /(^|[^\\:])\/\/.*/,
-            lookbehind: true,
-            greedy: true
-          }
-        ],
-        "string": {
-          pattern: /(?:"""[\s\S]*?"""|@"(?:""|[^"])*"|"(?:\\[\s\S]|[^\\"])*")B?/,
-          greedy: true
-        },
-        "class-name": {
-          pattern: /(\b(?:exception|inherit|interface|new|of|type)\s+|\w\s*:\s*|\s:\??>\s*)[.\w]+\b(?:\s*(?:->|\*)\s*[.\w]+\b)*(?!\s*[:.])/,
-          lookbehind: true,
-          inside: {
-            "operator": /->|\*/,
-            "punctuation": /\./
-          }
-        },
-        "keyword": /\b(?:let|return|use|yield)(?:!\B|\b)|\b(?:abstract|and|as|asr|assert|atomic|base|begin|break|checked|class|component|const|constraint|constructor|continue|default|delegate|do|done|downcast|downto|eager|elif|else|end|event|exception|extern|external|false|finally|fixed|for|fun|function|functor|global|if|in|include|inherit|inline|interface|internal|land|lazy|lor|lsl|lsr|lxor|match|member|method|mixin|mod|module|mutable|namespace|new|not|null|object|of|open|or|override|parallel|private|process|protected|public|pure|rec|sealed|select|sig|static|struct|tailcall|then|to|trait|true|try|type|upcast|val|virtual|void|volatile|when|while|with)\b/,
-        "number": [
-          /\b0x[\da-fA-F]+(?:LF|lf|un)?\b/,
-          /\b0b[01]+(?:uy|y)?\b/,
-          /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[fm]|e[+-]?\d+)?\b/i,
-          /\b\d+(?:[IlLsy]|UL|u[lsy]?)?\b/
-        ],
-        "operator": /([<>~&^])\1\1|([*.:<>&])\2|<-|->|[!=:]=|<?\|{1,3}>?|\??(?:<=|>=|<>|[-+*/%=<>])\??|[!?^&]|~[+~-]|:>|:\?>?/
-      });
-      Prism.languages.insertBefore("fsharp", "keyword", {
-        "preprocessor": {
-          pattern: /(^[\t ]*)#.*/m,
-          lookbehind: true,
-          alias: "property",
-          inside: {
-            "directive": {
-              pattern: /(^#)\b(?:else|endif|if|light|line|nowarn)\b/,
-              lookbehind: true,
-              alias: "keyword"
-            }
-          }
-        }
-      });
-      Prism.languages.insertBefore("fsharp", "punctuation", {
-        "computation-expression": {
-          pattern: /\b[_a-z]\w*(?=\s*\{)/i,
-          alias: "keyword"
-        }
-      });
-      Prism.languages.insertBefore("fsharp", "string", {
-        "annotation": {
-          pattern: /\[<.+?>\]/,
-          greedy: true,
-          inside: {
-            "punctuation": /^\[<|>\]$/,
-            "class-name": {
-              pattern: /^\w+$|(^|;\s*)[A-Z]\w*(?=\()/,
-              lookbehind: true
-            },
-            "annotation-content": {
-              pattern: /[\s\S]+/,
-              inside: Prism.languages.fsharp
-            }
-          }
-        },
-        "char": {
-          pattern: /'(?:[^\\']|\\(?:.|\d{3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}|U[a-fA-F\d]{8}))'B?/,
-          greedy: true
-        }
-      });
-      (function(Prism2) {
-        var comment_inside = {
-          "function": /\b(?:BUGS?|FIX(?:MES?)?|NOTES?|TODOS?|XX+|HACKS?|WARN(?:ING)?|\?{2,}|!{2,})\b/
-        };
-        var string_inside = {
-          "number": /\\[^\s']|%\w/
-        };
-        var factor = {
-          "comment": [
-            {
-              // ! single-line exclamation point comments with whitespace after/around the !
-              pattern: /(^|\s)(?:! .*|!$)/,
-              lookbehind: true,
-              inside: comment_inside
-            },
-            /* from basis/multiline: */
-            {
-              // /* comment */, /* comment*/
-              pattern: /(^|\s)\/\*\s[\s\S]*?\*\/(?=\s|$)/,
-              lookbehind: true,
-              greedy: true,
-              inside: comment_inside
-            },
-            {
-              // ![[ comment ]] , ![===[ comment]===]
-              pattern: /(^|\s)!\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,
-              lookbehind: true,
-              greedy: true,
-              inside: comment_inside
-            }
-          ],
-          "number": [
-            {
-              // basic base 10 integers 9, -9
-              pattern: /(^|\s)[+-]?\d+(?=\s|$)/,
-              lookbehind: true
-            },
-            {
-              // base prefix integers 0b010 0o70 0xad 0d10 0XAD -0xa9
-              pattern: /(^|\s)[+-]?0(?:b[01]+|o[0-7]+|d\d+|x[\dA-F]+)(?=\s|$)/i,
-              lookbehind: true
-            },
-            {
-              // fractional ratios 1/5 -1/5 and the literal float approximations 1/5. -1/5.
-              pattern: /(^|\s)[+-]?\d+\/\d+\.?(?=\s|$)/,
-              lookbehind: true
-            },
-            {
-              // positive mixed numbers 23+1/5 +23+1/5
-              pattern: /(^|\s)\+?\d+\+\d+\/\d+(?=\s|$)/,
-              lookbehind: true
-            },
-            {
-              // negative mixed numbers -23-1/5
-              pattern: /(^|\s)-\d+-\d+\/\d+(?=\s|$)/,
-              lookbehind: true
-            },
-            {
-              // basic decimal floats -0.01 0. .0 .1 -.1 -1. -12.13 +12.13
-              // and scientific notation with base 10 exponents 3e4 3e-4 .3e-4
-              pattern: /(^|\s)[+-]?(?:\d*\.\d+|\d+\.\d*|\d+)(?:e[+-]?\d+)?(?=\s|$)/i,
-              lookbehind: true
-            },
-            {
-              // NAN literal syntax NAN: 80000deadbeef, NAN: a
-              pattern: /(^|\s)NAN:\s+[\da-fA-F]+(?=\s|$)/,
-              lookbehind: true
-            },
-            {
-              /*
-              	base prefix floats 0x1.0p3 (8.0) 0b1.010p2 (5.0) 0x1.p1 0b1.11111111p11111...
-              	"The normalized hex form ±0x1.MMMMMMMMMMMMM[pP]±EEEE allows any floating-point number to be specified precisely.
-              	The values of MMMMMMMMMMMMM and EEEE map directly to the mantissa and exponent fields of the binary IEEE 754 representation."
-              	<https://docs.factorcode.org/content/article-syntax-floats.html>
-              */
-              pattern: /(^|\s)[+-]?0(?:b1\.[01]*|o1\.[0-7]*|d1\.\d*|x1\.[\dA-F]*)p\d+(?=\s|$)/i,
-              lookbehind: true
-            }
-          ],
-          // R/ regexp?\/\\/
-          "regexp": {
-            pattern: /(^|\s)R\/\s(?:\\\S|[^\\/])*\/(?:[idmsr]*|[idmsr]+-[idmsr]+)(?=\s|$)/,
-            lookbehind: true,
-            alias: "number",
-            inside: {
-              "variable": /\\\S/,
-              "keyword": /[+?*\[\]^$(){}.|]/,
-              "operator": {
-                pattern: /(\/)[idmsr]+(?:-[idmsr]+)?/,
-                lookbehind: true
-              }
-            }
-          },
-          "boolean": {
-            pattern: /(^|\s)[tf](?=\s|$)/,
-            lookbehind: true
-          },
-          // SBUF" asd", URL" ://...", P" /etc/"
-          "custom-string": {
-            pattern: /(^|\s)[A-Z0-9\-]+"\s(?:\\\S|[^"\\])*"/,
-            lookbehind: true,
-            greedy: true,
-            alias: "string",
-            inside: {
-              "number": /\\\S|%\w|\//
-            }
-          },
-          "multiline-string": [
-            {
-              // STRING: name \n content \n ; -> CONSTANT: name "content" (symbol)
-              pattern: /(^|\s)STRING:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*;(?=\s|$)/,
-              lookbehind: true,
-              greedy: true,
-              alias: "string",
-              inside: {
-                "number": string_inside.number,
-                // trailing semicolon on its own line
-                "semicolon-or-setlocal": {
-                  pattern: /([\r\n][ \t]*);(?=\s|$)/,
-                  lookbehind: true,
-                  alias: "function"
-                }
-              }
-            },
-            {
-              // HEREDOC: marker \n content \n marker ; -> "content" (immediate)
-              pattern: /(^|\s)HEREDOC:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*\S+(?=\s|$)/,
-              lookbehind: true,
-              greedy: true,
-              alias: "string",
-              inside: string_inside
-            },
-            {
-              // [[ string ]], [==[ string]==]
-              pattern: /(^|\s)\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,
-              lookbehind: true,
-              greedy: true,
-              alias: "string",
-              inside: string_inside
-            }
-          ],
-          "special-using": {
-            pattern: /(^|\s)USING:(?:\s\S+)*(?=\s+;(?:\s|$))/,
-            lookbehind: true,
-            alias: "function",
-            inside: {
-              // this is essentially a regex for vocab names, which i don't want to specify
-              // but the USING: gets picked up as a vocab name
-              "string": {
-                pattern: /(\s)[^:\s]+/,
-                lookbehind: true
-              }
-            }
-          },
-          /* this description of stack effect literal syntax is not complete and not as specific as theoretically possible
-          			trying to do better is more work and regex-computation-time than it's worth though.
-          			- we'd like to have the "delimiter" parts of the stack effect [ (, --, and ) ] be a different (less-important or comment-like) colour to the stack effect contents
-          			- we'd like if nested stack effects were treated as such rather than just appearing flat (with `inside`)
-          			- we'd like if the following variable name conventions were recognised specifically:
-          				special row variables = ..a b..
-          				type and stack effect annotations end with a colon = ( quot: ( a: ( -- ) -- b ) -- x ), ( x: number -- )
-          				word throws unconditional error = *
-          				any other word-like variable name = a ? q' etc
-          
-          			https://docs.factorcode.org/content/article-effects.html
-          
-          			these are pretty complicated to highlight properly without a real parser, and therefore out of scope
-          			the old pattern, which may be later useful, was: (^|\s)(?:call|execute|eval)?\((?:\s+[^"\r\n\t ]\S*)*?\s+--(?:\s+[^"\n\t ]\S*)*?\s+\)(?=\s|$)
-          		*/
-          // current solution is not great
-          "stack-effect-delimiter": [
-            {
-              // opening parenthesis
-              pattern: /(^|\s)(?:call|eval|execute)?\((?=\s)/,
-              lookbehind: true,
-              alias: "operator"
-            },
-            {
-              // middle --
-              pattern: /(\s)--(?=\s)/,
-              lookbehind: true,
-              alias: "operator"
-            },
-            {
-              // closing parenthesis
-              pattern: /(\s)\)(?=\s|$)/,
-              lookbehind: true,
-              alias: "operator"
-            }
-          ],
-          "combinators": {
-            pattern: null,
-            lookbehind: true,
-            alias: "keyword"
-          },
-          "kernel-builtin": {
-            pattern: null,
-            lookbehind: true,
-            alias: "variable"
-          },
-          "sequences-builtin": {
-            pattern: null,
-            lookbehind: true,
-            alias: "variable"
-          },
-          "math-builtin": {
-            pattern: null,
-            lookbehind: true,
-            alias: "variable"
-          },
-          "constructor-word": {
-            // <array> but not <=>
-            pattern: /(^|\s)<(?!=+>|-+>)\S+>(?=\s|$)/,
-            lookbehind: true,
-            alias: "keyword"
-          },
-          "other-builtin-syntax": {
-            pattern: null,
-            lookbehind: true,
-            alias: "operator"
-          },
-          /*
-          			full list of supported word naming conventions: (the convention appears outside of the [brackets])
-          				set-[x]
-          				change-[x]
-          				with-[x]
-          				new-[x]
-          				>[string]
-          				[base]>
-          				[string]>[number]
-          				+[symbol]+
-          				[boolean-word]?
-          				?[of]
-          				[slot-reader]>>
-          				>>[slot-setter]
-          				[slot-writer]<<
-          				([implementation-detail])
-          				[mutater]!
-          				[variant]*
-          				[prettyprint].
-          				$[help-markup]
-          
-          			<constructors>, SYNTAX:, etc are supported by their own patterns.
-          
-          			`with` and `new` from `kernel` are their own builtins.
-          
-          			see <https://docs.factorcode.org/content/article-conventions.html>
-          		*/
-          "conventionally-named-word": {
-            pattern: /(^|\s)(?!")(?:(?:change|new|set|with)-\S+|\$\S+|>[^>\s]+|[^:>\s]+>|[^>\s]+>[^>\s]+|\+[^+\s]+\+|[^?\s]+\?|\?[^?\s]+|[^>\s]+>>|>>[^>\s]+|[^<\s]+<<|\([^()\s]+\)|[^!\s]+!|[^*\s]\S*\*|[^.\s]\S*\.)(?=\s|$)/,
-            lookbehind: true,
-            alias: "keyword"
-          },
-          "colon-syntax": {
-            pattern: /(^|\s)(?:[A-Z0-9\-]+#?)?:{1,2}\s+(?:;\S+|(?!;)\S+)(?=\s|$)/,
-            lookbehind: true,
-            greedy: true,
-            alias: "function"
-          },
-          "semicolon-or-setlocal": {
-            pattern: /(\s)(?:;|:>)(?=\s|$)/,
-            lookbehind: true,
-            alias: "function"
-          },
-          // do not highlight leading } or trailing X{ at the begin/end of the file as it's invalid syntax
-          "curly-brace-literal-delimiter": [
-            {
-              // opening
-              pattern: /(^|\s)[a-z]*\{(?=\s)/i,
-              lookbehind: true,
-              alias: "operator"
-            },
-            {
-              // closing
-              pattern: /(\s)\}(?=\s|$)/,
-              lookbehind: true,
-              alias: "operator"
-            }
-          ],
-          // do not highlight leading ] or trailing [ at the begin/end of the file as it's invalid syntax
-          "quotation-delimiter": [
-            {
-              // opening
-              pattern: /(^|\s)\[(?=\s)/,
-              lookbehind: true,
-              alias: "operator"
-            },
-            {
-              // closing
-              pattern: /(\s)\](?=\s|$)/,
-              lookbehind: true,
-              alias: "operator"
-            }
-          ],
-          "normal-word": {
-            pattern: /(^|\s)[^"\s]\S*(?=\s|$)/,
-            lookbehind: true
-          },
-          /*
-          			basic first-class string "a"
-          				with escaped double-quote "a\""
-          				escaped backslash "\\"
-          				and general escapes since Factor has so many "\N"
-          
-          			syntax that works in the reference implementation that isn't fully
-          			supported because it's an implementation detail:
-          				"string 1""string 2" -> 2 strings (works anyway)
-          				"string"5 -> string, 5
-          				"string"[ ] -> string, quotation
-          				{ "a"} -> array<string>
-          
-          			the rest of those examples all properly recognise the string, but not
-          				the other object (number, quotation, etc)
-          			this is fine for a regex-only implementation.
-          		*/
-          "string": {
-            pattern: /"(?:\\\S|[^"\\])*"/,
-            greedy: true,
-            inside: string_inside
-          }
-        };
-        var escape = function(str) {
-          return (str + "").replace(/([.?*+\^$\[\]\\(){}|\-])/g, "\\$1");
-        };
-        var arrToWordsRegExp = function(arr) {
-          return new RegExp(
-            "(^|\\s)(?:" + arr.map(escape).join("|") + ")(?=\\s|$)"
-          );
-        };
-        var builtins = {
-          "kernel-builtin": [
-            "or",
-            "2nipd",
-            "4drop",
-            "tuck",
-            "wrapper",
-            "nip",
-            "wrapper?",
-            "callstack>array",
-            "die",
-            "dupd",
-            "callstack",
-            "callstack?",
-            "3dup",
-            "hashcode",
-            "pick",
-            "4nip",
-            "build",
-            ">boolean",
-            "nipd",
-            "clone",
-            "5nip",
-            "eq?",
-            "?",
-            "=",
-            "swapd",
-            "2over",
-            "clear",
-            "2dup",
-            "get-retainstack",
-            "not",
-            "tuple?",
-            "dup",
-            "3nipd",
-            "call",
-            "-rotd",
-            "object",
-            "drop",
-            "assert=",
-            "assert?",
-            "-rot",
-            "execute",
-            "boa",
-            "get-callstack",
-            "curried?",
-            "3drop",
-            "pickd",
-            "overd",
-            "over",
-            "roll",
-            "3nip",
-            "swap",
-            "and",
-            "2nip",
-            "rotd",
-            "throw",
-            "(clone)",
-            "hashcode*",
-            "spin",
-            "reach",
-            "4dup",
-            "equal?",
-            "get-datastack",
-            "assert",
-            "2drop",
-            "<wrapper>",
-            "boolean?",
-            "identity-hashcode",
-            "identity-tuple?",
-            "null",
-            "composed?",
-            "new",
-            "5drop",
-            "rot",
-            "-roll",
-            "xor",
-            "identity-tuple",
-            "boolean"
-          ],
-          "other-builtin-syntax": [
-            // syntax
-            "=======",
-            "recursive",
-            "flushable",
-            ">>",
-            "<<<<<<",
-            "M\\",
-            "B",
-            "PRIVATE>",
-            "\\",
-            "======",
-            "final",
-            "inline",
-            "delimiter",
-            "deprecated",
-            "<PRIVATE",
-            ">>>>>>",
-            "<<<<<<<",
-            "parse-complex",
-            "malformed-complex",
-            "read-only",
-            ">>>>>>>",
-            "call-next-method",
-            "<<",
-            "foldable",
-            // literals
-            "$",
-            "$[",
-            "${"
-          ],
-          "sequences-builtin": [
-            "member-eq?",
-            "mismatch",
-            "append",
-            "assert-sequence=",
-            "longer",
-            "repetition",
-            "clone-like",
-            "3sequence",
-            "assert-sequence?",
-            "last-index-from",
-            "reversed",
-            "index-from",
-            "cut*",
-            "pad-tail",
-            "join-as",
-            "remove-eq!",
-            "concat-as",
-            "but-last",
-            "snip",
-            "nths",
-            "nth",
-            "sequence",
-            "longest",
-            "slice?",
-            "<slice>",
-            "remove-nth",
-            "tail-slice",
-            "empty?",
-            "tail*",
-            "member?",
-            "virtual-sequence?",
-            "set-length",
-            "drop-prefix",
-            "iota",
-            "unclip",
-            "bounds-error?",
-            "unclip-last-slice",
-            "non-negative-integer-expected",
-            "non-negative-integer-expected?",
-            "midpoint@",
-            "longer?",
-            "?set-nth",
-            "?first",
-            "rest-slice",
-            "prepend-as",
-            "prepend",
-            "fourth",
-            "sift",
-            "subseq-start",
-            "new-sequence",
-            "?last",
-            "like",
-            "first4",
-            "1sequence",
-            "reverse",
-            "slice",
-            "virtual@",
-            "repetition?",
-            "set-last",
-            "index",
-            "4sequence",
-            "max-length",
-            "set-second",
-            "immutable-sequence",
-            "first2",
-            "first3",
-            "supremum",
-            "unclip-slice",
-            "suffix!",
-            "insert-nth",
-            "tail",
-            "3append",
-            "short",
-            "suffix",
-            "concat",
-            "flip",
-            "immutable?",
-            "reverse!",
-            "2sequence",
-            "sum",
-            "delete-all",
-            "indices",
-            "snip-slice",
-            "<iota>",
-            "check-slice",
-            "sequence?",
-            "head",
-            "append-as",
-            "halves",
-            "sequence=",
-            "collapse-slice",
-            "?second",
-            "slice-error?",
-            "product",
-            "bounds-check?",
-            "bounds-check",
-            "immutable",
-            "virtual-exemplar",
-            "harvest",
-            "remove",
-            "pad-head",
-            "last",
-            "set-fourth",
-            "cartesian-product",
-            "remove-eq",
-            "shorten",
-            "shorter",
-            "reversed?",
-            "shorter?",
-            "shortest",
-            "head-slice",
-            "pop*",
-            "tail-slice*",
-            "but-last-slice",
-            "iota?",
-            "append!",
-            "cut-slice",
-            "new-resizable",
-            "head-slice*",
-            "sequence-hashcode",
-            "pop",
-            "set-nth",
-            "?nth",
-            "second",
-            "join",
-            "immutable-sequence?",
-            "<reversed>",
-            "3append-as",
-            "virtual-sequence",
-            "subseq?",
-            "remove-nth!",
-            "length",
-            "last-index",
-            "lengthen",
-            "assert-sequence",
-            "copy",
-            "move",
-            "third",
-            "first",
-            "tail?",
-            "set-first",
-            "prefix",
-            "bounds-error",
-            "<repetition>",
-            "exchange",
-            "surround",
-            "cut",
-            "min-length",
-            "set-third",
-            "push-all",
-            "head?",
-            "subseq-start-from",
-            "delete-slice",
-            "rest",
-            "sum-lengths",
-            "head*",
-            "infimum",
-            "remove!",
-            "glue",
-            "slice-error",
-            "subseq",
-            "push",
-            "replace-slice",
-            "subseq-as",
-            "unclip-last"
-          ],
-          "math-builtin": [
-            "number=",
-            "next-power-of-2",
-            "?1+",
-            "fp-special?",
-            "imaginary-part",
-            "float>bits",
-            "number?",
-            "fp-infinity?",
-            "bignum?",
-            "fp-snan?",
-            "denominator",
-            "gcd",
-            "*",
-            "+",
-            "fp-bitwise=",
-            "-",
-            "u>=",
-            "/",
-            ">=",
-            "bitand",
-            "power-of-2?",
-            "log2-expects-positive",
-            "neg?",
-            "<",
-            "log2",
-            ">",
-            "integer?",
-            "number",
-            "bits>double",
-            "2/",
-            "zero?",
-            "bits>float",
-            "float?",
-            "shift",
-            "ratio?",
-            "rect>",
-            "even?",
-            "ratio",
-            "fp-sign",
-            "bitnot",
-            ">fixnum",
-            "complex?",
-            "/i",
-            "integer>fixnum",
-            "/f",
-            "sgn",
-            ">bignum",
-            "next-float",
-            "u<",
-            "u>",
-            "mod",
-            "recip",
-            "rational",
-            ">float",
-            "2^",
-            "integer",
-            "fixnum?",
-            "neg",
-            "fixnum",
-            "sq",
-            "bignum",
-            ">rect",
-            "bit?",
-            "fp-qnan?",
-            "simple-gcd",
-            "complex",
-            "<fp-nan>",
-            "real",
-            ">fraction",
-            "double>bits",
-            "bitor",
-            "rem",
-            "fp-nan-payload",
-            "real-part",
-            "log2-expects-positive?",
-            "prev-float",
-            "align",
-            "unordered?",
-            "float",
-            "fp-nan?",
-            "abs",
-            "bitxor",
-            "integer>fixnum-strict",
-            "u<=",
-            "odd?",
-            "<=",
-            "/mod",
-            ">integer",
-            "real?",
-            "rational?",
-            "numerator"
-          ]
-          // that's all for now
-        };
-        Object.keys(builtins).forEach(function(k) {
-          factor[k].pattern = arrToWordsRegExp(builtins[k]);
-        });
-        var combinators = [
-          // kernel
-          "2bi",
-          "while",
-          "2tri",
-          "bi*",
-          "4dip",
-          "both?",
-          "same?",
-          "tri@",
-          "curry",
-          "prepose",
-          "3bi",
-          "?if",
-          "tri*",
-          "2keep",
-          "3keep",
-          "curried",
-          "2keepd",
-          "when",
-          "2bi*",
-          "2tri*",
-          "4keep",
-          "bi@",
-          "keepdd",
-          "do",
-          "unless*",
-          "tri-curry",
-          "if*",
-          "loop",
-          "bi-curry*",
-          "when*",
-          "2bi@",
-          "2tri@",
-          "with",
-          "2with",
-          "either?",
-          "bi",
-          "until",
-          "3dip",
-          "3curry",
-          "tri-curry*",
-          "tri-curry@",
-          "bi-curry",
-          "keepd",
-          "compose",
-          "2dip",
-          "if",
-          "3tri",
-          "unless",
-          "tuple",
-          "keep",
-          "2curry",
-          "tri",
-          "most",
-          "while*",
-          "dip",
-          "composed",
-          "bi-curry@",
-          // sequences
-          "find-last-from",
-          "trim-head-slice",
-          "map-as",
-          "each-from",
-          "none?",
-          "trim-tail",
-          "partition",
-          "if-empty",
-          "accumulate*",
-          "reject!",
-          "find-from",
-          "accumulate-as",
-          "collector-for-as",
-          "reject",
-          "map",
-          "map-sum",
-          "accumulate!",
-          "2each-from",
-          "follow",
-          "supremum-by",
-          "map!",
-          "unless-empty",
-          "collector",
-          "padding",
-          "reduce-index",
-          "replicate-as",
-          "infimum-by",
-          "trim-tail-slice",
-          "count",
-          "find-index",
-          "filter",
-          "accumulate*!",
-          "reject-as",
-          "map-integers",
-          "map-find",
-          "reduce",
-          "selector",
-          "interleave",
-          "2map",
-          "filter-as",
-          "binary-reduce",
-          "map-index-as",
-          "find",
-          "produce",
-          "filter!",
-          "replicate",
-          "cartesian-map",
-          "cartesian-each",
-          "find-index-from",
-          "map-find-last",
-          "3map-as",
-          "3map",
-          "find-last",
-          "selector-as",
-          "2map-as",
-          "2map-reduce",
-          "accumulate",
-          "each",
-          "each-index",
-          "accumulate*-as",
-          "when-empty",
-          "all?",
-          "collector-as",
-          "push-either",
-          "new-like",
-          "collector-for",
-          "2selector",
-          "push-if",
-          "2all?",
-          "map-reduce",
-          "3each",
-          "any?",
-          "trim-slice",
-          "2reduce",
-          "change-nth",
-          "produce-as",
-          "2each",
-          "trim",
-          "trim-head",
-          "cartesian-find",
-          "map-index",
-          // math
-          "if-zero",
-          "each-integer",
-          "unless-zero",
-          "(find-integer)",
-          "when-zero",
-          "find-last-integer",
-          "(all-integers?)",
-          "times",
-          "(each-integer)",
-          "find-integer",
-          "all-integers?",
-          // math.combinators
-          "unless-negative",
-          "if-positive",
-          "when-positive",
-          "when-negative",
-          "unless-positive",
-          "if-negative",
-          // combinators
-          "case",
-          "2cleave",
-          "cond>quot",
-          "case>quot",
-          "3cleave",
-          "wrong-values",
-          "to-fixed-point",
-          "alist>quot",
-          "cond",
-          "cleave",
-          "call-effect",
-          "recursive-hashcode",
-          "spread",
-          "deep-spread>quot",
-          // combinators.short-circuit
-          "2||",
-          "0||",
-          "n||",
-          "0&&",
-          "2&&",
-          "3||",
-          "1||",
-          "1&&",
-          "n&&",
-          "3&&",
-          // combinators.smart
-          "smart-unless*",
-          "keep-inputs",
-          "reduce-outputs",
-          "smart-when*",
-          "cleave>array",
-          "smart-with",
-          "smart-apply",
-          "smart-if",
-          "inputs/outputs",
-          "output>sequence-n",
-          "map-outputs",
-          "map-reduce-outputs",
-          "dropping",
-          "output>array",
-          "smart-map-reduce",
-          "smart-2map-reduce",
-          "output>array-n",
-          "nullary",
-          "input<sequence",
-          "append-outputs",
-          "drop-inputs",
-          "inputs",
-          "smart-2reduce",
-          "drop-outputs",
-          "smart-reduce",
-          "preserving",
-          "smart-when",
-          "outputs",
-          "append-outputs-as",
-          "smart-unless",
-          "smart-if*",
-          "sum-outputs",
-          "input<sequence-unsafe",
-          "output>sequence"
-          // tafn
-        ];
-        factor.combinators.pattern = arrToWordsRegExp(combinators);
-        Prism2.languages.factor = factor;
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages["false"] = {
-          "comment": {
-            pattern: /\{[^}]*\}/
-          },
-          "string": {
-            pattern: /"[^"]*"/,
-            greedy: true
-          },
-          "character-code": {
-            pattern: /'(?:[^\r]|\r\n?)/,
-            alias: "number"
-          },
-          "assembler-code": {
-            pattern: /\d+`/,
-            alias: "important"
-          },
-          "number": /\d+/,
-          "operator": /[-!#$%&'*+,./:;=>?@\\^_`|~ßø]/,
-          "punctuation": /\[|\]/,
-          "variable": /[a-z]/,
-          "non-standard": {
-            pattern: /[()<BDO®]/,
-            alias: "bold"
-          }
-        };
-      })(Prism);
-      Prism.languages["firestore-security-rules"] = Prism.languages.extend("clike", {
-        "comment": /\/\/.*/,
-        "keyword": /\b(?:allow|function|if|match|null|return|rules_version|service)\b/,
-        "operator": /&&|\|\||[<>!=]=?|[-+*/%]|\b(?:in|is)\b/
-      });
-      delete Prism.languages["firestore-security-rules"]["class-name"];
-      Prism.languages.insertBefore("firestore-security-rules", "keyword", {
-        "path": {
-          pattern: /(^|[\s(),])(?:\/(?:[\w\xA0-\uFFFF]+|\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)))+/,
-          lookbehind: true,
-          greedy: true,
-          inside: {
-            "variable": {
-              pattern: /\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)/,
-              inside: {
-                "operator": /=/,
-                "keyword": /\*\*/,
-                "punctuation": /[.$(){}]/
-              }
-            },
-            "punctuation": /\//
-          }
-        },
-        "method": {
-          // to make the pattern shorter, the actual method names are omitted
-          pattern: /(\ballow\s+)[a-z]+(?:\s*,\s*[a-z]+)*(?=\s*[:;])/,
-          lookbehind: true,
-          alias: "builtin",
-          inside: {
-            "punctuation": /,/
-          }
-        }
-      });
-      (function(Prism2) {
-        Prism2.languages.flow = Prism2.languages.extend("javascript", {});
-        Prism2.languages.insertBefore("flow", "keyword", {
-          "type": [
-            {
-              pattern: /\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,
-              alias: "class-name"
-            }
-          ]
-        });
-        Prism2.languages.flow["function-variable"].pattern = /(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i;
-        delete Prism2.languages.flow["parameter"];
-        Prism2.languages.insertBefore("flow", "operator", {
-          "flow-punctuation": {
-            pattern: /\{\||\|\}/,
-            alias: "punctuation"
-          }
-        });
-        if (!Array.isArray(Prism2.languages.flow.keyword)) {
-          Prism2.languages.flow.keyword = [Prism2.languages.flow.keyword];
-        }
-        Prism2.languages.flow.keyword.unshift(
-          {
-            pattern: /(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,
-            lookbehind: true
-          },
-          {
-            pattern: /(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,
-            lookbehind: true
-          }
-        );
-      })(Prism);
-      Prism.languages.fortran = {
-        "quoted-number": {
-          pattern: /[BOZ](['"])[A-F0-9]+\1/i,
-          alias: "number"
-        },
-        "string": {
-          pattern: /(?:\b\w+_)?(['"])(?:\1\1|&(?:\r\n?|\n)(?:[ \t]*!.*(?:\r\n?|\n)|(?![ \t]*!))|(?!\1).)*(?:\1|&)/,
-          inside: {
-            "comment": {
-              pattern: /(&(?:\r\n?|\n)\s*)!.*/,
-              lookbehind: true
-            }
-          }
-        },
-        "comment": {
-          pattern: /!.*/,
-          greedy: true
-        },
-        "boolean": /\.(?:FALSE|TRUE)\.(?:_\w+)?/i,
-        "number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[ED][+-]?\d+)?(?:_\w+)?/i,
-        "keyword": [
-          // Types
-          /\b(?:CHARACTER|COMPLEX|DOUBLE ?PRECISION|INTEGER|LOGICAL|REAL)\b/i,
-          // END statements
-          /\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\b/i,
-          // Statements
-          /\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\b/i,
-          // Others
-          /\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEIF|ELSEWHERE|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\b/i
-        ],
-        "operator": [
-          /\*\*|\/\/|=>|[=\/]=|[<>]=?|::|[+\-*=%]|\.[A-Z]+\./i,
-          {
-            // Use lookbehind to prevent confusion with (/ /)
-            pattern: /(^|(?!\().)\/(?!\))/,
-            lookbehind: true
-          }
-        ],
-        "punctuation": /\(\/|\/\)|[(),;:&]/
-      };
-      (function(Prism2) {
-        var FTL_EXPR = /[^<()"']|\((?:<expr>)*\)|<(?!#--)|<#--(?:[^-]|-(?!->))*-->|"(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*'/.source;
-        for (var i = 0; i < 2; i++) {
-          FTL_EXPR = FTL_EXPR.replace(/<expr>/g, function() {
-            return FTL_EXPR;
-          });
-        }
-        FTL_EXPR = FTL_EXPR.replace(/<expr>/g, /[^\s\S]/.source);
-        var ftl = {
-          "comment": /<#--[\s\S]*?-->/,
-          "string": [
-            {
-              // raw string
-              pattern: /\br("|')(?:(?!\1)[^\\]|\\.)*\1/,
-              greedy: true
-            },
-            {
-              pattern: RegExp(/("|')(?:(?!\1|\$\{)[^\\]|\\.|\$\{(?:(?!\})(?:<expr>))*\})*\1/.source.replace(/<expr>/g, function() {
-                return FTL_EXPR;
-              })),
-              greedy: true,
-              inside: {
-                "interpolation": {
-                  pattern: RegExp(/((?:^|[^\\])(?:\\\\)*)\$\{(?:(?!\})(?:<expr>))*\}/.source.replace(/<expr>/g, function() {
-                    return FTL_EXPR;
-                  })),
-                  lookbehind: true,
-                  inside: {
-                    "interpolation-punctuation": {
-                      pattern: /^\$\{|\}$/,
-                      alias: "punctuation"
-                    },
-                    rest: null
-                  }
-                }
-              }
-            }
-          ],
-          "keyword": /\b(?:as)\b/,
-          "boolean": /\b(?:false|true)\b/,
-          "builtin-function": {
-            pattern: /((?:^|[^?])\?\s*)\w+/,
-            lookbehind: true,
-            alias: "function"
-          },
-          "function": /\b\w+(?=\s*\()/,
-          "number": /\b\d+(?:\.\d+)?\b/,
-          "operator": /\.\.[<*!]?|->|--|\+\+|&&|\|\||\?{1,2}|[-+*/%!=<>]=?|\b(?:gt|gte|lt|lte)\b/,
-          "punctuation": /[,;.:()[\]{}]/
-        };
-        ftl.string[1].inside.interpolation.inside.rest = ftl;
-        Prism2.languages.ftl = {
-          "ftl-comment": {
-            // the pattern is shortened to be more efficient
-            pattern: /^<#--[\s\S]*/,
-            alias: "comment"
-          },
-          "ftl-directive": {
-            pattern: /^<[\s\S]+>$/,
-            inside: {
-              "directive": {
-                pattern: /(^<\/?)[#@][a-z]\w*/i,
-                lookbehind: true,
-                alias: "keyword"
-              },
-              "punctuation": /^<\/?|\/?>$/,
-              "content": {
-                pattern: /\s*\S[\s\S]*/,
-                alias: "ftl",
-                inside: ftl
-              }
-            }
-          },
-          "ftl-interpolation": {
-            pattern: /^\$\{[\s\S]*\}$/,
-            inside: {
-              "punctuation": /^\$\{|\}$/,
-              "content": {
-                pattern: /\s*\S[\s\S]*/,
-                alias: "ftl",
-                inside: ftl
-              }
-            }
-          }
-        };
-        Prism2.hooks.add("before-tokenize", function(env) {
-          var pattern = RegExp(/<#--[\s\S]*?-->|<\/?[#@][a-zA-Z](?:<expr>)*?>|\$\{(?:<expr>)*?\}/.source.replace(/<expr>/g, function() {
-            return FTL_EXPR;
-          }), "gi");
-          Prism2.languages["markup-templating"].buildPlaceholders(env, "ftl", pattern);
-        });
-        Prism2.hooks.add("after-tokenize", function(env) {
-          Prism2.languages["markup-templating"].tokenizePlaceholders(env, "ftl");
-        });
-      })(Prism);
-      Prism.languages.gamemakerlanguage = Prism.languages.gml = Prism.languages.extend("clike", {
-        "keyword": /\b(?:break|case|continue|default|do|else|enum|exit|for|globalvar|if|repeat|return|switch|until|var|while)\b/,
-        "number": /(?:\b0x[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ulf]{0,4}/i,
-        "operator": /--|\+\+|[-+%/=]=?|!=|\*\*?=?|<[<=>]?|>[=>]?|&&?|\^\^?|\|\|?|~|\b(?:and|at|not|or|with|xor)\b/,
-        "constant": /\b(?:GM_build_date|GM_version|action_(?:continue|restart|reverse|stop)|all|gamespeed_(?:fps|microseconds)|global|local|noone|other|pi|pointer_(?:invalid|null)|self|timezone_(?:local|utc)|undefined|ev_(?:create|destroy|step|alarm|keyboard|mouse|collision|other|draw|draw_(?:begin|end|post|pre)|keypress|keyrelease|trigger|(?:left|middle|no|right)_button|(?:left|middle|right)_press|(?:left|middle|right)_release|mouse_(?:enter|leave|wheel_down|wheel_up)|global_(?:left|middle|right)_button|global_(?:left|middle|right)_press|global_(?:left|middle|right)_release|joystick(?:1|2)_(?:button1|button2|button3|button4|button5|button6|button7|button8|down|left|right|up)|outside|boundary|game_start|game_end|room_start|room_end|no_more_lives|animation_end|end_of_path|no_more_health|user\d|gui|gui_begin|gui_end|step_(?:begin|end|normal))|vk_(?:alt|anykey|backspace|control|delete|down|end|enter|escape|home|insert|left|nokey|pagedown|pageup|pause|printscreen|return|right|shift|space|tab|up|f\d|numpad\d|add|decimal|divide|lalt|lcontrol|lshift|multiply|ralt|rcontrol|rshift|subtract)|achievement_(?:filter_(?:all_players|favorites_only|friends_only)|friends_info|info|leaderboard_info|our_info|pic_loaded|show_(?:achievement|bank|friend_picker|leaderboard|profile|purchase_prompt|ui)|type_challenge|type_score_challenge)|asset_(?:font|object|path|room|script|shader|sound|sprite|tiles|timeline|unknown)|audio_(?:3d|falloff_(?:exponent_distance|exponent_distance_clamped|inverse_distance|inverse_distance_clamped|linear_distance|linear_distance_clamped|none)|mono|new_system|old_system|stereo)|bm_(?:add|complex|dest_alpha|dest_color|dest_colour|inv_dest_alpha|inv_dest_color|inv_dest_colour|inv_src_alpha|inv_src_color|inv_src_colour|max|normal|one|src_alpha|src_alpha_sat|src_color|src_colour|subtract|zero)|browser_(?:chrome|firefox|ie|ie_mobile|not_a_browser|opera|safari|safari_mobile|tizen|unknown|windows_store)|buffer_(?:bool|f16|f32|f64|fast|fixed|generalerror|grow|invalidtype|network|outofbounds|outofspace|s16|s32|s8|seek_end|seek_relative|seek_start|string|text|u16|u32|u64|u8|vbuffer|wrap)|c_(?:aqua|black|blue|dkgray|fuchsia|gray|green|lime|ltgray|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)|cmpfunc_(?:always|equal|greater|greaterequal|less|lessequal|never|notequal)|cr_(?:appstart|arrow|beam|cross|default|drag|handpoint|hourglass|none|size_all|size_nesw|size_ns|size_nwse|size_we|uparrow)|cull_(?:clockwise|counterclockwise|noculling)|device_(?:emulator|tablet)|device_ios_(?:ipad|ipad_retina|iphone|iphone5|iphone6|iphone6plus|iphone_retina|unknown)|display_(?:landscape|landscape_flipped|portrait|portrait_flipped)|dll_(?:cdecl|cdel|stdcall)|ds_type_(?:grid|list|map|priority|queue|stack)|ef_(?:cloud|ellipse|explosion|firework|flare|rain|ring|smoke|smokeup|snow|spark|star)|fa_(?:archive|bottom|center|directory|hidden|left|middle|readonly|right|sysfile|top|volumeid)|fb_login_(?:default|fallback_to_webview|forcing_safari|forcing_webview|no_fallback_to_webview|use_system_account)|iap_(?:available|canceled|ev_consume|ev_product|ev_purchase|ev_restore|ev_storeload|failed|purchased|refunded|status_available|status_loading|status_processing|status_restoring|status_unavailable|status_uninitialised|storeload_failed|storeload_ok|unavailable)|leaderboard_type_(?:number|time_mins_secs)|lighttype_(?:dir|point)|matrix_(?:projection|view|world)|mb_(?:any|left|middle|none|right)|network_(?:config_(?:connect_timeout|disable_reliable_udp|enable_reliable_udp|use_non_blocking_socket)|socket_(?:bluetooth|tcp|udp)|type_(?:connect|data|disconnect|non_blocking_connect))|of_challenge_(?:lose|tie|win)|os_(?:android|ios|linux|macosx|ps3|ps4|psvita|unknown|uwp|win32|win8native|windows|winphone|xboxone)|phy_debug_render_(?:aabb|collision_pairs|coms|core_shapes|joints|obb|shapes)|phy_joint_(?:anchor_1_x|anchor_1_y|anchor_2_x|anchor_2_y|angle|angle_limits|damping_ratio|frequency|length_1|length_2|lower_angle_limit|max_force|max_length|max_motor_force|max_motor_torque|max_torque|motor_force|motor_speed|motor_torque|reaction_force_x|reaction_force_y|reaction_torque|speed|translation|upper_angle_limit)|phy_particle_data_flag_(?:category|color|colour|position|typeflags|velocity)|phy_particle_flag_(?:colormixing|colourmixing|elastic|powder|spring|tensile|viscous|wall|water|zombie)|phy_particle_group_flag_(?:rigid|solid)|pr_(?:linelist|linestrip|pointlist|trianglefan|trianglelist|trianglestrip)|ps_(?:distr|shape)_(?:diamond|ellipse|gaussian|invgaussian|line|linear|rectangle)|pt_shape_(?:circle|cloud|disk|explosion|flare|line|pixel|ring|smoke|snow|spark|sphere|square|star)|ty_(?:real|string)|gp_(?:face\d|axislh|axislv|axisrh|axisrv|padd|padl|padr|padu|select|shoulderl|shoulderlb|shoulderr|shoulderrb|start|stickl|stickr)|lb_disp_(?:none|numeric|time_ms|time_sec)|lb_sort_(?:ascending|descending|none)|ov_(?:achievements|community|friends|gamegroup|players|settings)|ugc_(?:filetype_(?:community|microtrans)|list_(?:Favorited|Followed|Published|Subscribed|UsedOrPlayed|VotedDown|VotedOn|VotedUp|WillVoteLater)|match_(?:AllGuides|Artwork|Collections|ControllerBindings|IntegratedGuides|Items|Items_Mtx|Items_ReadyToUse|Screenshots|UsableInGame|Videos|WebGuides)|query_(?:AcceptedForGameRankedByAcceptanceDate|CreatedByFriendsRankedByPublicationDate|FavoritedByFriendsRankedByPublicationDate|NotYetRated)|query_RankedBy(?:NumTimesReported|PublicationDate|TextSearch|TotalVotesAsc|Trend|Vote|VotesUp)|result_success|sortorder_CreationOrder(?:Asc|Desc)|sortorder_(?:ForModeration|LastUpdatedDesc|SubscriptionDateDesc|TitleAsc|VoteScoreDesc)|visibility_(?:friends_only|private|public))|vertex_usage_(?:binormal|blendindices|blendweight|color|colour|depth|fog|normal|position|psize|sample|tangent|texcoord|textcoord)|vertex_type_(?:float\d|color|colour|ubyte4)|input_type|layerelementtype_(?:background|instance|oldtilemap|particlesystem|sprite|tile|tilemap|undefined)|se_(?:chorus|compressor|echo|equalizer|flanger|gargle|none|reverb)|text_type|tile_(?:flip|index_mask|mirror|rotate)|(?:obj|rm|scr|spr)\w+)\b/,
-        "variable": /\b(?:alarm|application_surface|async_load|background_(?:alpha|blend|color|colour|foreground|height|hspeed|htiled|index|showcolor|showcolour|visible|vspeed|vtiled|width|x|xscale|y|yscale)|bbox_(?:bottom|left|right|top)|browser_(?:height|width)|caption_(?:health|lives|score)|current_(?:day|hour|minute|month|second|time|weekday|year)|cursor_sprite|debug_mode|delta_time|direction|display_aa|error_(?:last|occurred)|event_(?:action|number|object|type)|fps|fps_real|friction|game_(?:display|project|save)_(?:id|name)|gamemaker_(?:pro|registered|version)|gravity|gravity_direction|(?:h|v)speed|health|iap_data|id|image_(?:alpha|angle|blend|depth|index|number|speed|xscale|yscale)|instance_(?:count|id)|keyboard_(?:key|lastchar|lastkey|string)|layer|lives|mask_index|mouse_(?:button|lastbutton|x|y)|object_index|os_(?:browser|device|type|version)|path_(?:endaction|index|orientation|position|positionprevious|scale|speed)|persistent|phy_(?:rotation|(?:col_normal|collision|com|linear_velocity|position|speed)_(?:x|y)|angular_(?:damping|velocity)|position_(?:x|y)previous|speed|linear_damping|bullet|fixed_rotation|active|mass|inertia|dynamic|kinematic|sleeping|collision_points)|pointer_(?:invalid|null)|room|room_(?:caption|first|height|last|persistent|speed|width)|score|secure_mode|show_(?:health|lives|score)|solid|speed|sprite_(?:height|index|width|xoffset|yoffset)|temp_directory|timeline_(?:index|loop|position|running|speed)|transition_(?:color|kind|steps)|undefined|view_(?:angle|current|enabled|(?:h|v)(?:border|speed)|(?:h|w|x|y)port|(?:h|w|x|y)view|object|surface_id|visible)|visible|webgl_enabled|working_directory|(?:x|y)(?:previous|start)|x|y|argument(?:_relitive|_count|\d)|argument|global|local|other|self)\b/
-      });
-      Prism.languages.gap = {
-        "shell": {
-          pattern: /^gap>[\s\S]*?(?=^gap>|$(?![\s\S]))/m,
-          greedy: true,
-          inside: {
-            "gap": {
-              pattern: /^(gap>).+(?:(?:\r(?:\n|(?!\n))|\n)>.*)*/,
-              lookbehind: true,
-              inside: null
-              // see below
-            },
-            "punctuation": /^gap>/
-          }
-        },
-        "comment": {
-          pattern: /#.*/,
-          greedy: true
-        },
-        "string": {
-          pattern: /(^|[^\\'"])(?:'(?:[^\r\n\\']|\\.){1,10}'|"(?:[^\r\n\\"]|\\.)*"(?!")|"""[\s\S]*?""")/,
-          lookbehind: true,
-          greedy: true,
-          inside: {
-            "continuation": {
-              pattern: /([\r\n])>/,
-              lookbehind: true,
-              alias: "punctuation"
-            }
-          }
-        },
-        "keyword": /\b(?:Assert|Info|IsBound|QUIT|TryNextMethod|Unbind|and|atomic|break|continue|do|elif|else|end|fi|for|function|if|in|local|mod|not|od|or|quit|readonly|readwrite|rec|repeat|return|then|until|while)\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "function": /\b[a-z_]\w*(?=\s*\()/i,
-        "number": {
-          pattern: /(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,
-          lookbehind: true
-        },
-        "continuation": {
-          pattern: /([\r\n])>/,
-          lookbehind: true,
-          alias: "punctuation"
-        },
-        "operator": /->|[-+*/^~=!]|<>|[<>]=?|:=|\.\./,
-        "punctuation": /[()[\]{},;.:]/
-      };
-      Prism.languages.gap.shell.inside.gap.inside = Prism.languages.gap;
-      Prism.languages.gcode = {
-        "comment": /;.*|\B\(.*?\)\B/,
-        "string": {
-          pattern: /"(?:""|[^"])*"/,
-          greedy: true
-        },
-        "keyword": /\b[GM]\d+(?:\.\d+)?\b/,
-        "property": /\b[A-Z]/,
-        "checksum": {
-          pattern: /(\*)\d+/,
-          lookbehind: true,
-          alias: "number"
-        },
-        // T0:0:0
-        "punctuation": /[:*]/
-      };
-      Prism.languages.gdscript = {
-        "comment": /#.*/,
-        "string": {
-          pattern: /@?(?:("|')(?:(?!\1)[^\n\\]|\\[\s\S])*\1(?!"|')|"""(?:[^\\]|\\[\s\S])*?""")/,
-          greedy: true
-        },
-        "class-name": {
-          // class_name Foo, extends Bar, class InnerClass
-          // export(int) var baz, export(int, 0) var i
-          // as Node
-          // const FOO: int = 9, var bar: bool = true
-          // func add(reference: Item, amount: int) -> Item:
-          pattern: /(^(?:class|class_name|extends)[ \t]+|^export\([ \t]*|\bas[ \t]+|(?:\b(?:const|var)[ \t]|[,(])[ \t]*\w+[ \t]*:[ \t]*|->[ \t]*)[a-zA-Z_]\w*/m,
-          lookbehind: true
-        },
-        "keyword": /\b(?:and|as|assert|break|breakpoint|class|class_name|const|continue|elif|else|enum|export|extends|for|func|if|in|is|master|mastersync|match|not|null|onready|or|pass|preload|puppet|puppetsync|remote|remotesync|return|self|setget|signal|static|tool|var|while|yield)\b/,
-        "function": /\b[a-z_]\w*(?=[ \t]*\()/i,
-        "variable": /\$\w+/,
-        "number": [
-          /\b0b[01_]+\b|\b0x[\da-fA-F_]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.[\d_]+)(?:e[+-]?[\d_]+)?\b/,
-          /\b(?:INF|NAN|PI|TAU)\b/
-        ],
-        "constant": /\b[A-Z][A-Z_\d]*\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "operator": /->|:=|&&|\|\||<<|>>|[-+*/%&|!<>=]=?|[~^]/,
-        "punctuation": /[.:,;()[\]{}]/
-      };
-      Prism.languages.gedcom = {
-        "line-value": {
-          // Preceded by level, optional pointer, and tag
-          pattern: /(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?\w+ ).+/m,
-          lookbehind: true,
-          inside: {
-            "pointer": {
-              pattern: /^@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@$/,
-              alias: "variable"
-            }
-          }
-        },
-        "record": {
-          // Preceded by level and optional pointer
-          pattern: /(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m,
-          lookbehind: true,
-          alias: "tag"
-        },
-        "level": {
-          pattern: /(^[\t ]*)\d+/m,
-          lookbehind: true,
-          alias: "number"
-        },
-        "pointer": {
-          pattern: /@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@/,
-          alias: "variable"
-        }
-      };
-      Prism.languages.gettext = {
-        "comment": [
-          {
-            pattern: /# .*/,
-            greedy: true,
-            alias: "translator-comment"
-          },
-          {
-            pattern: /#\..*/,
-            greedy: true,
-            alias: "extracted-comment"
-          },
-          {
-            pattern: /#:.*/,
-            greedy: true,
-            alias: "reference-comment"
-          },
-          {
-            pattern: /#,.*/,
-            greedy: true,
-            alias: "flag-comment"
-          },
-          {
-            pattern: /#\|.*/,
-            greedy: true,
-            alias: "previously-untranslated-comment"
-          },
-          {
-            pattern: /#.*/,
-            greedy: true
-          }
-        ],
-        "string": {
-          pattern: /(^|[^\\])"(?:[^"\\]|\\.)*"/,
-          lookbehind: true,
-          greedy: true
-        },
-        "keyword": /^msg(?:ctxt|id|id_plural|str)\b/m,
-        "number": /\b\d+\b/,
-        "punctuation": /[\[\]]/
-      };
-      Prism.languages.po = Prism.languages.gettext;
-      (function(Prism2) {
-        var tableRow = /(?:\r?\n|\r)[ \t]*\|.+\|(?:(?!\|).)*/.source;
-        Prism2.languages.gherkin = {
-          "pystring": {
-            pattern: /("""|''')[\s\S]+?\1/,
-            alias: "string"
-          },
-          "comment": {
-            pattern: /(^[ \t]*)#.*/m,
-            lookbehind: true
-          },
-          "tag": {
-            pattern: /(^[ \t]*)@\S*/m,
-            lookbehind: true
-          },
-          "feature": {
-            pattern: /((?:^|\r?\n|\r)[ \t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|Lastnost|Mak|Mogucnost|laH|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|Potrzeba biznesowa|perbogh|poQbogh malja'|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\r\n]+(?:\r?\n|\r|$))*/,
-            lookbehind: true,
-            inside: {
-              "important": {
-                pattern: /(:)[^\r\n]+/,
-                lookbehind: true
-              },
-              "keyword": /[^:\r\n]+:/
-            }
-          },
-          "scenario": {
-            pattern: /(^[ \t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram Senaryo|Dyagram senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|EXAMPLZ|Examples|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|Grundlage|Hannergrond|ghantoH|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut chovnatlh|lut|lutmey|Lýsing Atburðarásar|Lýsing Dæma|MISHUN SRSLY|MISHUN|Menggariskan Senario|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan Senaryo|Plan senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo Deskripsyon|Senaryo deskripsyon|Senaryo|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie Uiteensetting|Situasie|Skenario konsep|Skenario|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa hwaer swa|Swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\r\n]*/m,
-            lookbehind: true,
-            inside: {
-              "important": {
-                pattern: /(:)[^\r\n]*/,
-                lookbehind: true
-              },
-              "keyword": /[^:\r\n]+:/
-            }
-          },
-          "table-body": {
-            // Look-behind is used to skip the table head, which has the same format as any table row
-            pattern: RegExp("(" + tableRow + ")(?:" + tableRow + ")+"),
-            lookbehind: true,
-            inside: {
-              "outline": {
-                pattern: /<[^>]+>/,
-                alias: "variable"
-              },
-              "td": {
-                pattern: /\s*[^\s|][^|]*/,
-                alias: "string"
-              },
-              "punctuation": /\|/
-            }
-          },
-          "table-head": {
-            pattern: RegExp(tableRow),
-            inside: {
-              "th": {
-                pattern: /\s*[^\s|][^|]*/,
-                alias: "variable"
-              },
-              "punctuation": /\|/
-            }
-          },
-          "atrule": {
-            pattern: /(^[ \t]+)(?:'a|'ach|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cand|Cando|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|DEN|Dato|De|Den youse gotta|Dengan|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|E|En|Entonces|Epi|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kad|Kada|Kadar|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Ma|Majd|Maka|Manawa|Mas|Men|Menawa|Mutta|Nalika|Nalikaning|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Och|Og|Oletetaan|Ond|Onda|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|Quan|Quand|Quando|qaSDI'|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|Un|Und|ugeholl|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadan|Zadani|Zadano|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \t])/m,
-            lookbehind: true
-          },
-          "string": {
-            pattern: /"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,
-            inside: {
-              "outline": {
-                pattern: /<[^>]+>/,
-                alias: "variable"
-              }
-            }
-          },
-          "outline": {
-            pattern: /<[^>]+>/,
-            alias: "variable"
-          }
-        };
-      })(Prism);
-      Prism.languages.git = {
-        /*
-         * A simple one line comment like in a git status command
-         * For instance:
-         * $ git status
-         * # On branch infinite-scroll
-         * # Your branch and 'origin/sharedBranches/frontendTeam/infinite-scroll' have diverged,
-         * # and have 1 and 2 different commits each, respectively.
-         * nothing to commit (working directory clean)
-         */
-        "comment": /^#.*/m,
-        /*
-         * Regexp to match the changed lines in a git diff output. Check the example below.
-         */
-        "deleted": /^[-–].*/m,
-        "inserted": /^\+.*/m,
-        /*
-         * a string (double and simple quote)
-         */
-        "string": /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
-        /*
-         * a git command. It starts with a random prompt finishing by a $, then "git" then some other parameters
-         * For instance:
-         * $ git add file.txt
-         */
-        "command": {
-          pattern: /^.*\$ git .*$/m,
-          inside: {
-            /*
-             * A git command can contain a parameter starting by a single or a double dash followed by a string
-             * For instance:
-             * $ git diff --cached
-             * $ git log -p
-             */
-            "parameter": /\s--?\w+/
-          }
-        },
-        /*
-         * Coordinates displayed in a git diff command
-         * For instance:
-         * $ git diff
-         * diff --git file.txt file.txt
-         * index 6214953..1d54a52 100644
-         * --- file.txt
-         * +++ file.txt
-         * @@ -1 +1,2 @@
-         * -Here's my tetx file
-         * +Here's my text file
-         * +And this is the second line
-         */
-        "coord": /^@@.*@@$/m,
-        /*
-         * Match a "commit [SHA1]" line in a git log output.
-         * For instance:
-         * $ git log
-         * commit a11a14ef7e26f2ca62d4b35eac455ce636d0dc09
-         * Author: lgiraudel
-         * Date:   Mon Feb 17 11:18:34 2014 +0100
-         *
-         *     Add of a new line
-         */
-        "commit-sha1": /^commit \w{40}$/m
-      };
-      Prism.languages.glsl = Prism.languages.extend("c", {
-        "keyword": /\b(?:active|asm|atomic_uint|attribute|[ibdu]?vec[234]|bool|break|buffer|case|cast|centroid|class|coherent|common|const|continue|d?mat[234](?:x[234])?|default|discard|do|double|else|enum|extern|external|false|filter|fixed|flat|float|for|fvec[234]|goto|half|highp|hvec[234]|[iu]?sampler2DMS(?:Array)?|[iu]?sampler2DRect|[iu]?samplerBuffer|[iu]?samplerCube|[iu]?samplerCubeArray|[iu]?sampler[123]D|[iu]?sampler[12]DArray|[iu]?image2DMS(?:Array)?|[iu]?image2DRect|[iu]?imageBuffer|[iu]?imageCube|[iu]?imageCubeArray|[iu]?image[123]D|[iu]?image[12]DArray|if|in|inline|inout|input|int|interface|invariant|layout|long|lowp|mediump|namespace|noinline|noperspective|out|output|partition|patch|precise|precision|public|readonly|resource|restrict|return|sample|sampler[12]DArrayShadow|sampler[12]DShadow|sampler2DRectShadow|sampler3DRect|samplerCubeArrayShadow|samplerCubeShadow|shared|short|sizeof|smooth|static|struct|subroutine|superp|switch|template|this|true|typedef|uint|uniform|union|unsigned|using|varying|void|volatile|while|writeonly)\b/
-      });
-      Prism.languages.gn = {
-        "comment": {
-          pattern: /#.*/,
-          greedy: true
-        },
-        "string-literal": {
-          pattern: /(^|[^\\"])"(?:[^\r\n"\\]|\\.)*"/,
-          lookbehind: true,
-          greedy: true,
-          inside: {
-            "interpolation": {
-              pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:\{[\s\S]*?\}|[a-zA-Z_]\w*|0x[a-fA-F0-9]{2})/,
-              lookbehind: true,
-              inside: {
-                "number": /^\$0x[\s\S]{2}$/,
-                "variable": /^\$\w+$/,
-                "interpolation-punctuation": {
-                  pattern: /^\$\{|\}$/,
-                  alias: "punctuation"
-                },
-                "expression": {
-                  pattern: /[\s\S]+/,
-                  inside: null
-                  // see below
-                }
-              }
-            },
-            "string": /[\s\S]+/
-          }
-        },
-        "keyword": /\b(?:else|if)\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "builtin-function": {
-          // a few functions get special highlighting to improve readability
-          pattern: /\b(?:assert|defined|foreach|import|pool|print|template|tool|toolchain)(?=\s*\()/i,
-          alias: "keyword"
-        },
-        "function": /\b[a-z_]\w*(?=\s*\()/i,
-        "constant": /\b(?:current_cpu|current_os|current_toolchain|default_toolchain|host_cpu|host_os|root_build_dir|root_gen_dir|root_out_dir|target_cpu|target_gen_dir|target_os|target_out_dir)\b/,
-        "number": /-?\b\d+\b/,
-        "operator": /[-+!=<>]=?|&&|\|\|/,
-        "punctuation": /[(){}[\],.]/
-      };
-      Prism.languages.gn["string-literal"].inside["interpolation"].inside["expression"].inside = Prism.languages.gn;
-      Prism.languages.gni = Prism.languages.gn;
-      Prism.languages["linker-script"] = {
-        "comment": {
-          pattern: /(^|\s)\/\*[\s\S]*?(?:$|\*\/)/,
-          lookbehind: true,
-          greedy: true
-        },
-        "identifier": {
-          pattern: /"[^"\r\n]*"/,
-          greedy: true
-        },
-        "location-counter": {
-          pattern: /\B\.\B/,
-          alias: "important"
-        },
-        "section": {
-          pattern: /(^|[^\w*])\.\w+\b/,
-          lookbehind: true,
-          alias: "keyword"
-        },
-        "function": /\b[A-Z][A-Z_]*(?=\s*\()/,
-        "number": /\b(?:0[xX][a-fA-F0-9]+|\d+)[KM]?\b/,
-        "operator": />>=?|<<=?|->|\+\+|--|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?/,
-        "punctuation": /[(){},;]/
-      };
-      Prism.languages["ld"] = Prism.languages["linker-script"];
-      Prism.languages.go = Prism.languages.extend("clike", {
-        "string": {
-          pattern: /(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,
-          lookbehind: true,
-          greedy: true
-        },
-        "keyword": /\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,
-        "boolean": /\b(?:_|false|iota|nil|true)\b/,
-        "number": [
-          // binary and octal integers
-          /\b0(?:b[01_]+|o[0-7_]+)i?\b/i,
-          // hexadecimal integers and floats
-          /\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,
-          // decimal integers and floats
-          /(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i
-        ],
-        "operator": /[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,
-        "builtin": /\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/
-      });
-      Prism.languages.insertBefore("go", "string", {
-        "char": {
-          pattern: /'(?:\\.|[^'\\\r\n]){0,10}'/,
-          greedy: true
-        }
-      });
-      delete Prism.languages.go["class-name"];
-      Prism.languages["go-mod"] = Prism.languages["go-module"] = {
-        "comment": {
-          pattern: /\/\/.*/,
-          greedy: true
-        },
-        "version": {
-          pattern: /(^|[\s()[\],])v\d+\.\d+\.\d+(?:[+-][-+.\w]*)?(?![^\s()[\],])/,
-          lookbehind: true,
-          alias: "number"
-        },
-        "go-version": {
-          pattern: /((?:^|\s)go\s+)\d+(?:\.\d+){1,2}/,
-          lookbehind: true,
-          alias: "number"
-        },
-        "keyword": {
-          pattern: /^([ \t]*)(?:exclude|go|module|replace|require|retract)\b/m,
-          lookbehind: true
-        },
-        "operator": /=>/,
-        "punctuation": /[()[\],]/
-      };
-      (function(Prism2) {
-        var interpolation = {
-          pattern: /((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,
-          lookbehind: true,
-          inside: {
-            "interpolation-punctuation": {
-              pattern: /^\$\{?|\}$/,
-              alias: "punctuation"
-            },
-            "expression": {
-              pattern: /[\s\S]+/,
-              inside: null
-            }
-          }
-        };
-        Prism2.languages.gradle = Prism2.languages.extend("clike", {
-          "string": {
-            pattern: /'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,
-            greedy: true
-          },
-          "keyword": /\b(?:apply|def|dependencies|else|if|implementation|import|plugin|plugins|project|repositories|repository|sourceSets|tasks|val)\b/,
-          "number": /\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,
-          "operator": {
-            pattern: /(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,
-            lookbehind: true
-          },
-          "punctuation": /\.+|[{}[\];(),:$]/
-        });
-        Prism2.languages.insertBefore("gradle", "string", {
-          "shebang": {
-            pattern: /#!.+/,
-            alias: "comment",
-            greedy: true
-          },
-          "interpolation-string": {
-            pattern: /"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,
-            greedy: true,
-            inside: {
-              "interpolation": interpolation,
-              "string": /[\s\S]+/
-            }
-          }
-        });
-        Prism2.languages.insertBefore("gradle", "punctuation", {
-          "spock-block": /\b(?:and|cleanup|expect|given|setup|then|when|where):/
-        });
-        Prism2.languages.insertBefore("gradle", "function", {
-          "annotation": {
-            pattern: /(^|[^.])@\w+/,
-            lookbehind: true,
-            alias: "punctuation"
-          }
-        });
-        interpolation.inside.expression.inside = Prism2.languages.gradle;
-      })(Prism);
-      Prism.languages.graphql = {
-        "comment": /#.*/,
-        "description": {
-          pattern: /(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,
-          greedy: true,
-          alias: "string",
-          inside: {
-            "language-markdown": {
-              pattern: /(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,
-              lookbehind: true,
-              inside: Prism.languages.markdown
-            }
-          }
-        },
-        "string": {
-          pattern: /"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,
-          greedy: true
-        },
-        "number": /(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
-        "boolean": /\b(?:false|true)\b/,
-        "variable": /\$[a-z_]\w*/i,
-        "directive": {
-          pattern: /@[a-z_]\w*/i,
-          alias: "function"
-        },
-        "attr-name": {
-          pattern: /\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,
-          greedy: true
-        },
-        "atom-input": {
-          pattern: /\b[A-Z]\w*Input\b/,
-          alias: "class-name"
-        },
-        "scalar": /\b(?:Boolean|Float|ID|Int|String)\b/,
-        "constant": /\b[A-Z][A-Z_\d]*\b/,
-        "class-name": {
-          pattern: /(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,
-          lookbehind: true
-        },
-        "fragment": {
-          pattern: /(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,
-          lookbehind: true,
-          alias: "function"
-        },
-        "definition-mutation": {
-          pattern: /(\bmutation\s+)[a-zA-Z_]\w*/,
-          lookbehind: true,
-          alias: "function"
-        },
-        "definition-query": {
-          pattern: /(\bquery\s+)[a-zA-Z_]\w*/,
-          lookbehind: true,
-          alias: "function"
-        },
-        "keyword": /\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,
-        "operator": /[!=|&]|\.{3}/,
-        "property-query": /\w+(?=\s*\()/,
-        "object": /\w+(?=\s*\{)/,
-        "punctuation": /[!(){}\[\]:=,]/,
-        "property": /\w+/
-      };
-      Prism.hooks.add("after-tokenize", function afterTokenizeGraphql(env) {
-        if (env.language !== "graphql") {
-          return;
-        }
-        var validTokens = env.tokens.filter(function(token) {
-          return typeof token !== "string" && token.type !== "comment" && token.type !== "scalar";
-        });
-        var currentIndex = 0;
-        function getToken(offset2) {
-          return validTokens[currentIndex + offset2];
-        }
-        function isTokenType(types, offset2) {
-          offset2 = offset2 || 0;
-          for (var i2 = 0; i2 < types.length; i2++) {
-            var token = getToken(i2 + offset2);
-            if (!token || token.type !== types[i2]) {
-              return false;
-            }
-          }
-          return true;
-        }
-        function findClosingBracket(open, close) {
-          var stackHeight = 1;
-          for (var i2 = currentIndex; i2 < validTokens.length; i2++) {
-            var token = validTokens[i2];
-            var content = token.content;
-            if (token.type === "punctuation" && typeof content === "string") {
-              if (open.test(content)) {
-                stackHeight++;
-              } else if (close.test(content)) {
-                stackHeight--;
-                if (stackHeight === 0) {
-                  return i2;
-                }
-              }
-            }
-          }
-          return -1;
-        }
-        function addAlias(token, alias) {
-          var aliases = token.alias;
-          if (!aliases) {
-            token.alias = aliases = [];
-          } else if (!Array.isArray(aliases)) {
-            token.alias = aliases = [aliases];
-          }
-          aliases.push(alias);
-        }
-        for (; currentIndex < validTokens.length; ) {
-          var startToken = validTokens[currentIndex++];
-          if (startToken.type === "keyword" && startToken.content === "mutation") {
-            var inputVariables = [];
-            if (isTokenType(["definition-mutation", "punctuation"]) && getToken(1).content === "(") {
-              currentIndex += 2;
-              var definitionEnd = findClosingBracket(/^\($/, /^\)$/);
-              if (definitionEnd === -1) {
-                continue;
-              }
-              for (; currentIndex < definitionEnd; currentIndex++) {
-                var t = getToken(0);
-                if (t.type === "variable") {
-                  addAlias(t, "variable-input");
-                  inputVariables.push(t.content);
-                }
-              }
-              currentIndex = definitionEnd + 1;
-            }
-            if (isTokenType(["punctuation", "property-query"]) && getToken(0).content === "{") {
-              currentIndex++;
-              addAlias(getToken(0), "property-mutation");
-              if (inputVariables.length > 0) {
-                var mutationEnd = findClosingBracket(/^\{$/, /^\}$/);
-                if (mutationEnd === -1) {
-                  continue;
-                }
-                for (var i = currentIndex; i < mutationEnd; i++) {
-                  var varToken = validTokens[i];
-                  if (varToken.type === "variable" && inputVariables.indexOf(varToken.content) >= 0) {
-                    addAlias(varToken, "variable-input");
-                  }
-                }
-              }
-            }
-          }
-        }
-      });
-      (function(Prism2) {
-        var interpolation = {
-          pattern: /((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,
-          lookbehind: true,
-          inside: {
-            "interpolation-punctuation": {
-              pattern: /^\$\{?|\}$/,
-              alias: "punctuation"
-            },
-            "expression": {
-              pattern: /[\s\S]+/,
-              inside: null
-              // see below
-            }
-          }
-        };
-        Prism2.languages.groovy = Prism2.languages.extend("clike", {
-          "string": {
-            // https://groovy-lang.org/syntax.html#_dollar_slashy_string
-            pattern: /'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,
-            greedy: true
-          },
-          "keyword": /\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,
-          "number": /\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,
-          "operator": {
-            pattern: /(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,
-            lookbehind: true
-          },
-          "punctuation": /\.+|[{}[\];(),:$]/
-        });
-        Prism2.languages.insertBefore("groovy", "string", {
-          "shebang": {
-            pattern: /#!.+/,
-            alias: "comment",
-            greedy: true
-          },
-          "interpolation-string": {
-            // TODO: Slash strings (e.g. /foo/) can contain line breaks but this will cause a lot of trouble with
-            // simple division (see JS regex), so find a fix maybe?
-            pattern: /"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,
-            greedy: true,
-            inside: {
-              "interpolation": interpolation,
-              "string": /[\s\S]+/
-            }
-          }
-        });
-        Prism2.languages.insertBefore("groovy", "punctuation", {
-          "spock-block": /\b(?:and|cleanup|expect|given|setup|then|when|where):/
-        });
-        Prism2.languages.insertBefore("groovy", "function", {
-          "annotation": {
-            pattern: /(^|[^.])@\w+/,
-            lookbehind: true,
-            alias: "punctuation"
-          }
-        });
-        interpolation.inside.expression.inside = Prism2.languages.groovy;
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages.haml = {
-          // Multiline stuff should appear before the rest
-          "multiline-comment": {
-            pattern: /((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*(?:(?:\r?\n|\r)\2[\t ].+)*/,
-            lookbehind: true,
-            alias: "comment"
-          },
-          "multiline-code": [
-            {
-              pattern: /((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*(?:(?:\r?\n|\r)\2[\t ].*,[\t ]*)*(?:(?:\r?\n|\r)\2[\t ].+)/,
-              lookbehind: true,
-              inside: Prism2.languages.ruby
-            },
-            {
-              pattern: /((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*(?:(?:\r?\n|\r)\2[\t ].*\|[\t ]*)*/,
-              lookbehind: true,
-              inside: Prism2.languages.ruby
-            }
-          ],
-          // See at the end of the file for known filters
-          "filter": {
-            pattern: /((?:^|\r?\n|\r)([\t ]*)):[\w-]+(?:(?:\r?\n|\r)(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/,
-            lookbehind: true,
-            inside: {
-              "filter-name": {
-                pattern: /^:[\w-]+/,
-                alias: "symbol"
-              }
-            }
-          },
-          "markup": {
-            pattern: /((?:^|\r?\n|\r)[\t ]*)<.+/,
-            lookbehind: true,
-            inside: Prism2.languages.markup
-          },
-          "doctype": {
-            pattern: /((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,
-            lookbehind: true
-          },
-          "tag": {
-            // Allows for one nested group of braces
-            pattern: /((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w\-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^{}])+\}|\[[^\]]+\])*[\/<>]*/,
-            lookbehind: true,
-            inside: {
-              "attributes": [
-                {
-                  // Lookbehind tries to prevent interpolations from breaking it all
-                  // Allows for one nested group of braces
-                  pattern: /(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,
-                  lookbehind: true,
-                  inside: Prism2.languages.ruby
-                },
-                {
-                  pattern: /\([^)]+\)/,
-                  inside: {
-                    "attr-value": {
-                      pattern: /(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,
-                      lookbehind: true
-                    },
-                    "attr-name": /[\w:-]+(?=\s*!?=|\s*[,)])/,
-                    "punctuation": /[=(),]/
-                  }
-                },
-                {
-                  pattern: /\[[^\]]+\]/,
-                  inside: Prism2.languages.ruby
-                }
-              ],
-              "punctuation": /[<>]/
-            }
-          },
-          "code": {
-            pattern: /((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,
-            lookbehind: true,
-            inside: Prism2.languages.ruby
-          },
-          // Interpolations in plain text
-          "interpolation": {
-            pattern: /#\{[^}]+\}/,
-            inside: {
-              "delimiter": {
-                pattern: /^#\{|\}$/,
-                alias: "punctuation"
-              },
-              "ruby": {
-                pattern: /[\s\S]+/,
-                inside: Prism2.languages.ruby
-              }
-            }
-          },
-          "punctuation": {
-            pattern: /((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,
-            lookbehind: true
-          }
-        };
-        var filter_pattern = "((?:^|\\r?\\n|\\r)([\\t ]*)):{{filter_name}}(?:(?:\\r?\\n|\\r)(?:\\2[\\t ].+|\\s*?(?=\\r?\\n|\\r)))+";
-        var filters = [
-          "css",
-          { filter: "coffee", language: "coffeescript" },
-          "erb",
-          "javascript",
-          "less",
-          "markdown",
-          "ruby",
-          "scss",
-          "textile"
-        ];
-        var all_filters = {};
-        for (var i = 0, l = filters.length; i < l; i++) {
-          var filter = filters[i];
-          filter = typeof filter === "string" ? { filter, language: filter } : filter;
-          if (Prism2.languages[filter.language]) {
-            all_filters["filter-" + filter.filter] = {
-              pattern: RegExp(filter_pattern.replace("{{filter_name}}", function() {
-                return filter.filter;
-              })),
-              lookbehind: true,
-              inside: {
-                "filter-name": {
-                  pattern: /^:[\w-]+/,
-                  alias: "symbol"
-                },
-                "text": {
-                  pattern: /[\s\S]+/,
-                  alias: [filter.language, "language-" + filter.language],
-                  inside: Prism2.languages[filter.language]
-                }
-              }
-            };
-          }
-        }
-        Prism2.languages.insertBefore("haml", "filter", all_filters);
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages.handlebars = {
-          "comment": /\{\{![\s\S]*?\}\}/,
-          "delimiter": {
-            pattern: /^\{\{\{?|\}\}\}?$/,
-            alias: "punctuation"
-          },
-          "string": /(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,
-          "number": /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,
-          "boolean": /\b(?:false|true)\b/,
-          "block": {
-            pattern: /^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,
-            lookbehind: true,
-            alias: "keyword"
-          },
-          "brackets": {
-            pattern: /\[[^\]]+\]/,
-            inside: {
-              punctuation: /\[|\]/,
-              variable: /[\s\S]+/
-            }
-          },
-          "punctuation": /[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,
-          "variable": /[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/
-        };
-        Prism2.hooks.add("before-tokenize", function(env) {
-          var handlebarsPattern = /\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g;
-          Prism2.languages["markup-templating"].buildPlaceholders(env, "handlebars", handlebarsPattern);
-        });
-        Prism2.hooks.add("after-tokenize", function(env) {
-          Prism2.languages["markup-templating"].tokenizePlaceholders(env, "handlebars");
-        });
-        Prism2.languages.hbs = Prism2.languages.handlebars;
-        Prism2.languages.mustache = Prism2.languages.handlebars;
-      })(Prism);
-      Prism.languages.haskell = {
-        "comment": {
-          pattern: /(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|\{-[\s\S]*?-\})/m,
-          lookbehind: true
-        },
-        "char": {
-          pattern: /'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|ACK|BEL|BS|CAN|CR|DC1|DC2|DC3|DC4|DEL|DLE|EM|ENQ|EOT|ESC|ETB|ETX|FF|FS|GS|HT|LF|NAK|NUL|RS|SI|SO|SOH|SP|STX|SUB|SYN|US|VT|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,
-          alias: "string"
-        },
-        "string": {
-          pattern: /"(?:[^\\"]|\\(?:\S|\s+\\))*"/,
-          greedy: true
-        },
-        "keyword": /\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,
-        "import-statement": {
-          // The imported or hidden names are not included in this import
-          // statement. This is because we want to highlight those exactly like
-          // we do for the names in the program.
-          pattern: /(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,
-          lookbehind: true,
-          inside: {
-            "keyword": /\b(?:as|hiding|import|qualified)\b/,
-            "punctuation": /\./
-          }
-        },
-        // These are builtin variables only. Constructors are highlighted later as a constant.
-        "builtin": /\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,
-        // decimal integers and floating point numbers | octal integers | hexadecimal integers
-        "number": /\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,
-        "operator": [
-          {
-            // infix operator
-            pattern: /`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,
-            greedy: true
-          },
-          {
-            // function composition
-            pattern: /(\s)\.(?=\s)/,
-            lookbehind: true
-          },
-          // Most of this is needed because of the meaning of a single '.'.
-          // If it stands alone freely, it is the function composition.
-          // It may also be a separator between a module name and an identifier => no
-          // operator. If it comes together with other special characters it is an
-          // operator too.
-          //
-          // This regex means: /[-!#$%*+=?&@|~.:<>^\\\/]+/ without /\./.
-          /[-!#$%*+=?&@|~:<>^\\\/][-!#$%*+=?&@|~.:<>^\\\/]*|\.[-!#$%*+=?&@|~.:<>^\\\/]+/
-        ],
-        // In Haskell, nearly everything is a variable, do not highlight these.
-        "hvariable": {
-          pattern: /\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,
-          inside: {
-            "punctuation": /\./
-          }
-        },
-        "constant": {
-          pattern: /\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,
-          inside: {
-            "punctuation": /\./
-          }
-        },
-        "punctuation": /[{}[\];(),.:]/
-      };
-      Prism.languages.hs = Prism.languages.haskell;
-      Prism.languages.haxe = Prism.languages.extend("clike", {
-        "string": {
-          // Strings can be multi-line
-          pattern: /"(?:[^"\\]|\\[\s\S])*"/,
-          greedy: true
-        },
-        "class-name": [
-          {
-            pattern: /(\b(?:abstract|class|enum|extends|implements|interface|new|typedef)\s+)[A-Z_]\w*/,
-            lookbehind: true
-          },
-          // based on naming convention
-          /\b[A-Z]\w*/
-        ],
-        // The final look-ahead prevents highlighting of keywords if expressions such as "haxe.macro.Expr"
-        "keyword": /\bthis\b|\b(?:abstract|as|break|case|cast|catch|class|continue|default|do|dynamic|else|enum|extends|extern|final|for|from|function|if|implements|import|in|inline|interface|macro|new|null|operator|overload|override|package|private|public|return|static|super|switch|throw|to|try|typedef|untyped|using|var|while)(?!\.)\b/,
-        "function": {
-          pattern: /\b[a-z_]\w*(?=\s*(?:<[^<>]*>\s*)?\()/i,
-          greedy: true
-        },
-        "operator": /\.{3}|\+\+|--|&&|\|\||->|=>|(?:<<?|>{1,3}|[-+*/%!=&|^])=?|[?:~]/
-      });
-      Prism.languages.insertBefore("haxe", "string", {
-        "string-interpolation": {
-          pattern: /'(?:[^'\\]|\\[\s\S])*'/,
-          greedy: true,
-          inside: {
-            "interpolation": {
-              pattern: /(^|[^\\])\$(?:\w+|\{[^{}]+\})/,
-              lookbehind: true,
-              inside: {
-                "interpolation-punctuation": {
-                  pattern: /^\$\{?|\}$/,
-                  alias: "punctuation"
-                },
-                "expression": {
-                  pattern: /[\s\S]+/,
-                  inside: Prism.languages.haxe
-                }
-              }
-            },
-            "string": /[\s\S]+/
-          }
-        }
-      });
-      Prism.languages.insertBefore("haxe", "class-name", {
-        "regex": {
-          pattern: /~\/(?:[^\/\\\r\n]|\\.)+\/[a-z]*/,
-          greedy: true,
-          inside: {
-            "regex-flags": /\b[a-z]+$/,
-            "regex-source": {
-              pattern: /^(~\/)[\s\S]+(?=\/$)/,
-              lookbehind: true,
-              alias: "language-regex",
-              inside: Prism.languages.regex
-            },
-            "regex-delimiter": /^~\/|\/$/
-          }
-        }
-      });
-      Prism.languages.insertBefore("haxe", "keyword", {
-        "preprocessor": {
-          pattern: /#(?:else|elseif|end|if)\b.*/,
-          alias: "property"
-        },
-        "metadata": {
-          pattern: /@:?[\w.]+/,
-          alias: "symbol"
-        },
-        "reification": {
-          pattern: /\$(?:\w+|(?=\{))/,
-          alias: "important"
-        }
-      });
-      Prism.languages.hcl = {
-        "comment": /(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,
-        "heredoc": {
-          pattern: /<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,
-          greedy: true,
-          alias: "string"
-        },
-        "keyword": [
-          {
-            pattern: /(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,
-            inside: {
-              "type": {
-                pattern: /(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,
-                lookbehind: true,
-                alias: "variable"
-              }
-            }
-          },
-          {
-            pattern: /(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,
-            inside: {
-              "type": {
-                pattern: /(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,
-                lookbehind: true,
-                alias: "variable"
-              }
-            }
-          },
-          /[\w-]+(?=\s+\{)/
-        ],
-        "property": [
-          /[-\w\.]+(?=\s*=(?!=))/,
-          /"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/
-        ],
-        "string": {
-          pattern: /"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,
-          greedy: true,
-          inside: {
-            "interpolation": {
-              pattern: /(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,
-              lookbehind: true,
-              inside: {
-                "type": {
-                  pattern: /(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,
-                  lookbehind: true,
-                  alias: "variable"
-                },
-                "keyword": /\b(?:count|data|local|module|path|self|terraform|var)\b/i,
-                "function": /\w+(?=\()/,
-                "string": {
-                  pattern: /"(?:\\[\s\S]|[^\\"])*"/,
-                  greedy: true
-                },
-                "number": /\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,
-                "punctuation": /[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/
-              }
-            }
-          }
-        },
-        "number": /\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,
-        "boolean": /\b(?:false|true)\b/i,
-        "punctuation": /[=\[\]{}]/
-      };
-      Prism.languages.hlsl = Prism.languages.extend("c", {
-        // Regarding keywords and class names:
-        // The list of all keywords was split into 'keyword' and 'class-name' tokens based on whether they are capitalized.
-        // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-keywords
-        // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-reserved-words
-        "class-name": [
-          Prism.languages.c["class-name"],
-          /\b(?:AppendStructuredBuffer|BlendState|Buffer|ByteAddressBuffer|CompileShader|ComputeShader|ConsumeStructuredBuffer|DepthStencilState|DepthStencilView|DomainShader|GeometryShader|Hullshader|InputPatch|LineStream|OutputPatch|PixelShader|PointStream|RWBuffer|RWByteAddressBuffer|RWStructuredBuffer|RWTexture(?:1D|1DArray|2D|2DArray|3D)|RasterizerState|RenderTargetView|SamplerComparisonState|SamplerState|StructuredBuffer|Texture(?:1D|1DArray|2D|2DArray|2DMS|2DMSArray|3D|Cube|CubeArray)|TriangleStream|VertexShader)\b/
-        ],
-        "keyword": [
-          // HLSL keyword
-          /\b(?:asm|asm_fragment|auto|break|case|catch|cbuffer|centroid|char|class|column_major|compile|compile_fragment|const|const_cast|continue|default|delete|discard|do|dynamic_cast|else|enum|explicit|export|extern|for|friend|fxgroup|goto|groupshared|if|in|inline|inout|interface|line|lineadj|linear|long|matrix|mutable|namespace|new|nointerpolation|noperspective|operator|out|packoffset|pass|pixelfragment|point|precise|private|protected|public|register|reinterpret_cast|return|row_major|sample|sampler|shared|short|signed|sizeof|snorm|stateblock|stateblock_state|static|static_cast|string|struct|switch|tbuffer|technique|technique10|technique11|template|texture|this|throw|triangle|triangleadj|try|typedef|typename|uniform|union|unorm|unsigned|using|vector|vertexfragment|virtual|void|volatile|while)\b/,
-          // scalar, vector, and matrix types
-          /\b(?:bool|double|dword|float|half|int|min(?:10float|12int|16(?:float|int|uint))|uint)(?:[1-4](?:x[1-4])?)?\b/
-        ],
-        // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-grammar#floating-point-numbers
-        "number": /(?:(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?|\b0x[\da-fA-F]+)[fFhHlLuU]?\b/,
-        "boolean": /\b(?:false|true)\b/
-      });
-      Prism.languages.hoon = {
-        "comment": {
-          pattern: /::.*/,
-          greedy: true
-        },
-        "string": {
-          pattern: /"[^"]*"|'[^']*'/,
-          greedy: true
-        },
-        "constant": /%(?:\.[ny]|[\w-]+)/,
-        "class-name": /@(?:[a-z0-9-]*[a-z0-9])?|\*/i,
-        "function": /(?:\+[-+] {2})?(?:[a-z](?:[a-z0-9-]*[a-z0-9])?)/,
-        "keyword": /\.[\^\+\*=\?]|![><:\.=\?!]|=[>|:,\.\-\^<+;/~\*\?]|\?[>|:\.\-\^<\+&~=@!]|\|[\$_%:\.\-\^~\*=@\?]|\+[|\$\+\*]|:[_\-\^\+~\*]|%[_:\.\-\^\+~\*=]|\^[|:\.\-\+&~\*=\?]|\$[|_%:<>\-\^&~@=\?]|;[:<\+;\/~\*=]|~[>|\$_%<\+\/&=\?!]|--|==/
-      };
-      (function(Prism2) {
-        function headerValueOf(name) {
-          return RegExp("(^(?:" + name + "):[ 	]*(?![ 	]))[^]+", "i");
-        }
-        Prism2.languages.http = {
-          "request-line": {
-            pattern: /^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,
-            inside: {
-              // HTTP Method
-              "method": {
-                pattern: /^[A-Z]+\b/,
-                alias: "property"
-              },
-              // Request Target e.g. http://example.com, /path/to/file
-              "request-target": {
-                pattern: /^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,
-                lookbehind: true,
-                alias: "url",
-                inside: Prism2.languages.uri
-              },
-              // HTTP Version
-              "http-version": {
-                pattern: /^(\s)HTTP\/[\d.]+/,
-                lookbehind: true,
-                alias: "property"
-              }
-            }
-          },
-          "response-status": {
-            pattern: /^HTTP\/[\d.]+ \d+ .+/m,
-            inside: {
-              // HTTP Version
-              "http-version": {
-                pattern: /^HTTP\/[\d.]+/,
-                alias: "property"
-              },
-              // Status Code
-              "status-code": {
-                pattern: /^(\s)\d+(?=\s)/,
-                lookbehind: true,
-                alias: "number"
-              },
-              // Reason Phrase
-              "reason-phrase": {
-                pattern: /^(\s).+/,
-                lookbehind: true,
-                alias: "string"
-              }
-            }
-          },
-          "header": {
-            pattern: /^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,
-            inside: {
-              "header-value": [
-                {
-                  pattern: headerValueOf(/Content-Security-Policy/.source),
-                  lookbehind: true,
-                  alias: ["csp", "languages-csp"],
-                  inside: Prism2.languages.csp
-                },
-                {
-                  pattern: headerValueOf(/Public-Key-Pins(?:-Report-Only)?/.source),
-                  lookbehind: true,
-                  alias: ["hpkp", "languages-hpkp"],
-                  inside: Prism2.languages.hpkp
-                },
-                {
-                  pattern: headerValueOf(/Strict-Transport-Security/.source),
-                  lookbehind: true,
-                  alias: ["hsts", "languages-hsts"],
-                  inside: Prism2.languages.hsts
-                },
-                {
-                  pattern: headerValueOf(/[^:]+/.source),
-                  lookbehind: true
-                }
-              ],
-              "header-name": {
-                pattern: /^[^:]+/,
-                alias: "keyword"
-              },
-              "punctuation": /^:/
-            }
-          }
-        };
-        var langs = Prism2.languages;
-        var httpLanguages = {
-          "application/javascript": langs.javascript,
-          "application/json": langs.json || langs.javascript,
-          "application/xml": langs.xml,
-          "text/xml": langs.xml,
-          "text/html": langs.html,
-          "text/css": langs.css,
-          "text/plain": langs.plain
-        };
-        var suffixTypes = {
-          "application/json": true,
-          "application/xml": true
-        };
-        function getSuffixPattern(contentType2) {
-          var suffix = contentType2.replace(/^[a-z]+\//, "");
-          var suffixPattern = "\\w+/(?:[\\w.-]+\\+)+" + suffix + "(?![+\\w.-])";
-          return "(?:" + contentType2 + "|" + suffixPattern + ")";
-        }
-        var options;
-        for (var contentType in httpLanguages) {
-          if (httpLanguages[contentType]) {
-            options = options || {};
-            var pattern = suffixTypes[contentType] ? getSuffixPattern(contentType) : contentType;
-            options[contentType.replace(/\//g, "-")] = {
-              pattern: RegExp(
-                "(" + /content-type:\s*/.source + pattern + /(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source + ")" + // This is a little interesting:
-                // The HTTP format spec required 1 empty line before the body to make everything unambiguous.
-                // However, when writing code by hand (e.g. to display on a website) people can forget about this,
-                // so we want to be liberal here. We will allow the empty line to be omitted if the first line of
-                // the body does not start with a [\w-] character (as headers do).
-                /[^ \t\w-][\s\S]*/.source,
-                "i"
-              ),
-              lookbehind: true,
-              inside: httpLanguages[contentType]
-            };
-          }
-        }
-        if (options) {
-          Prism2.languages.insertBefore("http", "header", options);
-        }
-      })(Prism);
-      Prism.languages.hpkp = {
-        "directive": {
-          pattern: /\b(?:includeSubDomains|max-age|pin-sha256|preload|report-to|report-uri|strict)(?=[\s;=]|$)/i,
-          alias: "property"
-        },
-        "operator": /=/,
-        "punctuation": /;/
-      };
-      Prism.languages.hsts = {
-        "directive": {
-          pattern: /\b(?:includeSubDomains|max-age|preload)(?=[\s;=]|$)/i,
-          alias: "property"
-        },
-        "operator": /=/,
-        "punctuation": /;/
-      };
-      Prism.languages.ichigojam = {
-        "comment": /(?:\B'|REM)(?:[^\n\r]*)/i,
-        "string": {
-          pattern: /"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/,
-          greedy: true
-        },
-        "number": /\B#[0-9A-F]+|\B`[01]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
-        "keyword": /\b(?:BEEP|BPS|CASE|CLEAR|CLK|CLO|CLP|CLS|CLT|CLV|CONT|COPY|ELSE|END|FILE|FILES|FOR|GOSUB|GOTO|GSB|IF|INPUT|KBD|LED|LET|LIST|LOAD|LOCATE|LRUN|NEW|NEXT|OUT|PLAY|POKE|PRINT|PWM|REM|RENUM|RESET|RETURN|RIGHT|RTN|RUN|SAVE|SCROLL|SLEEP|SRND|STEP|STOP|SUB|TEMPO|THEN|TO|UART|VIDEO|WAIT)(?:\$|\b)/i,
-        "function": /\b(?:ABS|ANA|ASC|BIN|BTN|DEC|END|FREE|HELP|HEX|I2CR|I2CW|IN|INKEY|LEN|LINE|PEEK|RND|SCR|SOUND|STR|TICK|USR|VER|VPEEK|ZER)(?:\$|\b)/i,
-        "label": /(?:\B@\S+)/,
-        "operator": /<[=>]?|>=?|\|\||&&|[+\-*\/=|&^~!]|\b(?:AND|NOT|OR)\b/i,
-        "punctuation": /[\[,;:()\]]/
-      };
-      Prism.languages.icon = {
-        "comment": /#.*/,
-        "string": {
-          pattern: /(["'])(?:(?!\1)[^\\\r\n_]|\\.|_(?!\1)(?:\r\n|[\s\S]))*\1/,
-          greedy: true
-        },
-        "number": /\b(?:\d+r[a-z\d]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b|\.\d+\b/i,
-        "builtin-keyword": {
-          pattern: /&(?:allocated|ascii|clock|collections|cset|current|date|dateline|digits|dump|e|error(?:number|text|value)?|errout|fail|features|file|host|input|lcase|letters|level|line|main|null|output|phi|pi|pos|progname|random|regions|source|storage|subject|time|trace|ucase|version)\b/,
-          alias: "variable"
-        },
-        "directive": {
-          pattern: /\$\w+/,
-          alias: "builtin"
-        },
-        "keyword": /\b(?:break|by|case|create|default|do|else|end|every|fail|global|if|initial|invocable|link|local|next|not|of|procedure|record|repeat|return|static|suspend|then|to|until|while)\b/,
-        "function": /\b(?!\d)\w+(?=\s*[({]|\s*!\s*\[)/,
-        "operator": /[+-]:(?!=)|(?:[\/?@^%&]|\+\+?|--?|==?=?|~==?=?|\*\*?|\|\|\|?|<(?:->?|<?=?)|>>?=?)(?::=)?|:(?:=:?)?|[!.\\|~]/,
-        "punctuation": /[\[\](){},;]/
-      };
-      (function(Prism2) {
-        function nested(source, level) {
-          if (level <= 0) {
-            return /[]/.source;
-          } else {
-            return source.replace(/<SELF>/g, function() {
-              return nested(source, level - 1);
-            });
-          }
-        }
-        var stringPattern = /'[{}:=,](?:[^']|'')*'(?!')/;
-        var escape = {
-          pattern: /''/,
-          greedy: true,
-          alias: "operator"
-        };
-        var string = {
-          pattern: stringPattern,
-          greedy: true,
-          inside: {
-            "escape": escape
-          }
-        };
-        var argumentSource = nested(
-          /\{(?:[^{}']|'(?![{},'])|''|<STR>|<SELF>)*\}/.source.replace(/<STR>/g, function() {
-            return stringPattern.source;
-          }),
-          8
-        );
-        var nestedMessage = {
-          pattern: RegExp(argumentSource),
-          inside: {
-            "message": {
-              pattern: /^(\{)[\s\S]+(?=\}$)/,
-              lookbehind: true,
-              inside: null
-              // see below
-            },
-            "message-delimiter": {
-              pattern: /./,
-              alias: "punctuation"
-            }
-          }
-        };
-        Prism2.languages["icu-message-format"] = {
-          "argument": {
-            pattern: RegExp(argumentSource),
-            greedy: true,
-            inside: {
-              "content": {
-                pattern: /^(\{)[\s\S]+(?=\}$)/,
-                lookbehind: true,
-                inside: {
-                  "argument-name": {
-                    pattern: /^(\s*)[^{}:=,\s]+/,
-                    lookbehind: true
-                  },
-                  "choice-style": {
-                    // https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/classicu_1_1ChoiceFormat.html#details
-                    pattern: /^(\s*,\s*choice\s*,\s*)\S(?:[\s\S]*\S)?/,
-                    lookbehind: true,
-                    inside: {
-                      "punctuation": /\|/,
-                      "range": {
-                        pattern: /^(\s*)[+-]?(?:\d+(?:\.\d*)?|\u221e)\s*[<#\u2264]/,
-                        lookbehind: true,
-                        inside: {
-                          "operator": /[<#\u2264]/,
-                          "number": /\S+/
-                        }
-                      },
-                      rest: null
-                      // see below
-                    }
-                  },
-                  "plural-style": {
-                    // https://unicode-org.github.io/icu-docs/apidoc/released/icu4j/com/ibm/icu/text/PluralFormat.html#:~:text=Patterns%20and%20Their%20Interpretation
-                    pattern: /^(\s*,\s*(?:plural|selectordinal)\s*,\s*)\S(?:[\s\S]*\S)?/,
-                    lookbehind: true,
-                    inside: {
-                      "offset": /^offset:\s*\d+/,
-                      "nested-message": nestedMessage,
-                      "selector": {
-                        pattern: /=\d+|[^{}:=,\s]+/,
-                        inside: {
-                          "keyword": /^(?:few|many|one|other|two|zero)$/
-                        }
-                      }
-                    }
-                  },
-                  "select-style": {
-                    // https://unicode-org.github.io/icu-docs/apidoc/released/icu4j/com/ibm/icu/text/SelectFormat.html#:~:text=Patterns%20and%20Their%20Interpretation
-                    pattern: /^(\s*,\s*select\s*,\s*)\S(?:[\s\S]*\S)?/,
-                    lookbehind: true,
-                    inside: {
-                      "nested-message": nestedMessage,
-                      "selector": {
-                        pattern: /[^{}:=,\s]+/,
-                        inside: {
-                          "keyword": /^other$/
-                        }
-                      }
-                    }
-                  },
-                  "keyword": /\b(?:choice|plural|select|selectordinal)\b/,
-                  "arg-type": {
-                    pattern: /\b(?:date|duration|number|ordinal|spellout|time)\b/,
-                    alias: "keyword"
-                  },
-                  "arg-skeleton": {
-                    pattern: /(,\s*)::[^{}:=,\s]+/,
-                    lookbehind: true
-                  },
-                  "arg-style": {
-                    pattern: /(,\s*)(?:currency|full|integer|long|medium|percent|short)(?=\s*$)/,
-                    lookbehind: true
-                  },
-                  "arg-style-text": {
-                    pattern: RegExp(/(^\s*,\s*(?=\S))/.source + nested(/(?:[^{}']|'[^']*'|\{(?:<SELF>)?\})+/.source, 8) + "$"),
-                    lookbehind: true,
-                    alias: "string"
-                  },
-                  "punctuation": /,/
-                }
-              },
-              "argument-delimiter": {
-                pattern: /./,
-                alias: "operator"
-              }
-            }
-          },
-          "escape": escape,
-          "string": string
-        };
-        nestedMessage.inside.message.inside = Prism2.languages["icu-message-format"];
-        Prism2.languages["icu-message-format"].argument.inside.content.inside["choice-style"].inside.rest = Prism2.languages["icu-message-format"];
-      })(Prism);
-      Prism.languages.idris = Prism.languages.extend("haskell", {
-        "comment": {
-          pattern: /(?:(?:--|\|\|\|).*$|\{-[\s\S]*?-\})/m
-        },
-        "keyword": /\b(?:Type|case|class|codata|constructor|corecord|data|do|dsl|else|export|if|implementation|implicit|import|impossible|in|infix|infixl|infixr|instance|interface|let|module|mutual|namespace|of|parameters|partial|postulate|private|proof|public|quoteGoal|record|rewrite|syntax|then|total|using|where|with)\b/,
-        "builtin": void 0
-      });
-      Prism.languages.insertBefore("idris", "keyword", {
-        "import-statement": {
-          pattern: /(^\s*import\s+)(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*/m,
-          lookbehind: true,
-          inside: {
-            "punctuation": /\./
-          }
-        }
-      });
-      Prism.languages.idr = Prism.languages.idris;
-      (function(Prism2) {
-        Prism2.languages.ignore = {
-          // https://git-scm.com/docs/gitignore
-          "comment": /^#.*/m,
-          "entry": {
-            pattern: /\S(?:.*(?:(?:\\ )|\S))?/,
-            alias: "string",
-            inside: {
-              "operator": /^!|\*\*?|\?/,
-              "regex": {
-                pattern: /(^|[^\\])\[[^\[\]]*\]/,
-                lookbehind: true
-              },
-              "punctuation": /\//
-            }
-          }
-        };
-        Prism2.languages.gitignore = Prism2.languages.ignore;
-        Prism2.languages.hgignore = Prism2.languages.ignore;
-        Prism2.languages.npmignore = Prism2.languages.ignore;
-      })(Prism);
-      Prism.languages.inform7 = {
-        "string": {
-          pattern: /"[^"]*"/,
-          inside: {
-            "substitution": {
-              pattern: /\[[^\[\]]+\]/,
-              inside: {
-                "delimiter": {
-                  pattern: /\[|\]/,
-                  alias: "punctuation"
-                }
-                // See rest below
-              }
-            }
-          }
-        },
-        "comment": {
-          pattern: /\[[^\[\]]+\]/,
-          greedy: true
-        },
-        "title": {
-          pattern: /^[ \t]*(?:book|chapter|part(?! of)|section|table|volume)\b.+/im,
-          alias: "important"
-        },
-        "number": {
-          pattern: /(^|[^-])(?:\b\d+(?:\.\d+)?(?:\^\d+)?(?:(?!\d)\w+)?|\b(?:eight|eleven|five|four|nine|one|seven|six|ten|three|twelve|two))\b(?!-)/i,
-          lookbehind: true
-        },
-        "verb": {
-          pattern: /(^|[^-])\b(?:answering|applying to|are|asking|attacking|be(?:ing)?|burning|buying|called|carries|carry(?! out)|carrying|climbing|closing|conceal(?:ing|s)?|consulting|contain(?:ing|s)?|cutting|drinking|dropping|eating|enclos(?:es?|ing)|entering|examining|exiting|getting|giving|going|ha(?:s|ve|ving)|hold(?:ing|s)?|impl(?:ies|y)|incorporat(?:es?|ing)|inserting|is|jumping|kissing|listening|locking|looking|mean(?:ing|s)?|opening|provid(?:es?|ing)|pulling|pushing|putting|relat(?:es?|ing)|removing|searching|see(?:ing|s)?|setting|showing|singing|sleeping|smelling|squeezing|support(?:ing|s)?|swearing|switching|taking|tasting|telling|thinking|throwing|touching|turning|tying|unlock(?:ing|s)?|var(?:ies|y|ying)|waiting|waking|waving|wear(?:ing|s)?)\b(?!-)/i,
-          lookbehind: true,
-          alias: "operator"
-        },
-        "keyword": {
-          pattern: /(^|[^-])\b(?:after|before|carry out|check|continue the action|definition(?= *:)|do nothing|else|end (?:if|the story|unless)|every turn|if|include|instead(?: of)?|let|move|no|now|otherwise|repeat|report|resume the story|rule for|running through|say(?:ing)?|stop the action|test|try(?:ing)?|understand|unless|use|when|while|yes)\b(?!-)/i,
-          lookbehind: true
-        },
-        "property": {
-          pattern: /(^|[^-])\b(?:adjacent(?! to)|carried|closed|concealed|contained|dark|described|edible|empty|enclosed|enterable|even|female|fixed in place|full|handled|held|improper-named|incorporated|inedible|invisible|lighted|lit|lock(?:able|ed)|male|marked for listing|mentioned|negative|neuter|non-(?:empty|full|recurring)|odd|opaque|open(?:able)?|plural-named|portable|positive|privately-named|proper-named|provided|publically-named|pushable between rooms|recurring|related|rubbing|scenery|seen|singular-named|supported|swinging|switch(?:able|ed(?: off| on)?)|touch(?:able|ed)|transparent|unconcealed|undescribed|unlit|unlocked|unmarked for listing|unmentioned|unopenable|untouchable|unvisited|variable|visible|visited|wearable|worn)\b(?!-)/i,
-          lookbehind: true,
-          alias: "symbol"
-        },
-        "position": {
-          pattern: /(^|[^-])\b(?:above|adjacent to|back side of|below|between|down|east|everywhere|front side|here|in|inside(?: from)?|north(?:east|west)?|nowhere|on(?: top of)?|other side|outside(?: from)?|parts? of|regionally in|south(?:east|west)?|through|up|west|within)\b(?!-)/i,
-          lookbehind: true,
-          alias: "keyword"
-        },
-        "type": {
-          pattern: /(^|[^-])\b(?:actions?|activit(?:ies|y)|actors?|animals?|backdrops?|containers?|devices?|directions?|doors?|holders?|kinds?|lists?|m[ae]n|nobody|nothing|nouns?|numbers?|objects?|people|persons?|player(?:'s holdall)?|regions?|relations?|rooms?|rule(?:book)?s?|scenes?|someone|something|supporters?|tables?|texts?|things?|time|vehicles?|wom[ae]n)\b(?!-)/i,
-          lookbehind: true,
-          alias: "variable"
-        },
-        "punctuation": /[.,:;(){}]/
-      };
-      Prism.languages.inform7["string"].inside["substitution"].inside.rest = Prism.languages.inform7;
-      Prism.languages.inform7["string"].inside["substitution"].inside.rest.text = {
-        pattern: /\S(?:\s*\S)*/,
-        alias: "comment"
-      };
-      Prism.languages.ini = {
-        /**
-         * The component mimics the behavior of the Win32 API parser.
-         *
-         * @see {@link https://github.com/PrismJS/prism/issues/2775#issuecomment-787477723}
-         */
-        "comment": {
-          pattern: /(^[ \f\t\v]*)[#;][^\n\r]*/m,
-          lookbehind: true
-        },
-        "section": {
-          pattern: /(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,
-          lookbehind: true,
-          inside: {
-            "section-name": {
-              pattern: /(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,
-              lookbehind: true,
-              alias: "selector"
-            },
-            "punctuation": /\[|\]/
-          }
-        },
-        "key": {
-          pattern: /(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,
-          lookbehind: true,
-          alias: "attr-name"
-        },
-        "value": {
-          pattern: /(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,
-          lookbehind: true,
-          alias: "attr-value",
-          inside: {
-            "inner-value": {
-              pattern: /^("|').+(?=\1$)/,
-              lookbehind: true
-            }
-          }
-        },
-        "punctuation": /=/
-      };
-      Prism.languages.io = {
-        "comment": {
-          pattern: /(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*|#.*)/,
-          lookbehind: true,
-          greedy: true
-        },
-        "triple-quoted-string": {
-          pattern: /"""(?:\\[\s\S]|(?!""")[^\\])*"""/,
-          greedy: true,
-          alias: "string"
-        },
-        "string": {
-          pattern: /"(?:\\.|[^\\\r\n"])*"/,
-          greedy: true
-        },
-        "keyword": /\b(?:activate|activeCoroCount|asString|block|break|call|catch|clone|collectGarbage|compileString|continue|do|doFile|doMessage|doString|else|elseif|exit|for|foreach|forward|getEnvironmentVariable|getSlot|hasSlot|if|ifFalse|ifNil|ifNilEval|ifTrue|isActive|isNil|isResumable|list|message|method|parent|pass|pause|perform|performWithArgList|print|println|proto|raise|raiseResumable|removeSlot|resend|resume|schedulerSleepSeconds|self|sender|setSchedulerSleepSeconds|setSlot|shallowCopy|slotNames|super|system|then|thisBlock|thisContext|try|type|uniqueId|updateSlot|wait|while|write|yield)\b/,
-        "builtin": /\b(?:Array|AudioDevice|AudioMixer|BigNum|Block|Box|Buffer|CFunction|CGI|Color|Curses|DBM|DNSResolver|DOConnection|DOProxy|DOServer|Date|Directory|Duration|DynLib|Error|Exception|FFT|File|Fnmatch|Font|Future|GL|GLE|GLScissor|GLU|GLUCylinder|GLUQuadric|GLUSphere|GLUT|Host|Image|Importer|LinkList|List|Lobby|Locals|MD5|MP3Decoder|MP3Encoder|Map|Message|Movie|Notification|Number|Object|OpenGL|Point|Protos|Random|Regex|SGML|SGMLElement|SGMLParser|SQLite|Sequence|Server|ShowMessage|SleepyCat|SleepyCatCursor|Socket|SocketManager|Sound|Soup|Store|String|Tree|UDPSender|UPDReceiver|URL|User|Warning|WeakLink)\b/,
-        "boolean": /\b(?:false|nil|true)\b/,
-        "number": /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?/i,
-        "operator": /[=!*/%+\-^&|]=|>>?=?|<<?=?|:?:?=|\+\+?|--?|\*\*?|\/\/?|%|\|\|?|&&?|\b(?:and|not|or|return)\b|@@?|\?\??|\.\./,
-        "punctuation": /[{}[\];(),.:]/
-      };
-      Prism.languages.j = {
-        "comment": {
-          pattern: /\bNB\..*/,
-          greedy: true
-        },
-        "string": {
-          pattern: /'(?:''|[^'\r\n])*'/,
-          greedy: true
-        },
-        "keyword": /\b(?:(?:CR|LF|adverb|conjunction|def|define|dyad|monad|noun|verb)\b|(?:assert|break|case|catch[dt]?|continue|do|else|elseif|end|fcase|for|for_\w+|goto_\w+|if|label_\w+|return|select|throw|try|while|whilst)\.)/,
-        "verb": {
-          // Negative look-ahead prevents bad highlighting
-          // of ^: ;. =. =: !. !:
-          pattern: /(?!\^:|;\.|[=!][.:])(?:\{(?:\.|::?)?|p(?:\.\.?|:)|[=!\]]|[<>+*\-%$|,#][.:]?|[?^]\.?|[;\[]:?|[~}"i][.:]|[ACeEIjLor]\.|(?:[_\/\\qsux]|_?\d):)/,
-          alias: "keyword"
-        },
-        "number": /\b_?(?:(?!\d:)\d+(?:\.\d+)?(?:(?:ad|ar|[ejpx])_?\d+(?:\.\d+)?)*(?:b_?[\da-z]+(?:\.[\da-z]+)?)?|_\b(?!\.))/,
-        "adverb": {
-          pattern: /[~}]|[\/\\]\.?|[bfM]\.|t[.:]/,
-          alias: "builtin"
-        },
-        "operator": /[=a][.:]|_\./,
-        "conjunction": {
-          pattern: /&(?:\.:?|:)?|[.:@][.:]?|[!D][.:]|[;dHT]\.|`:?|[\^LS]:|"/,
-          alias: "variable"
-        },
-        "punctuation": /[()]/
-      };
-      (function(Prism2) {
-        var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/;
-        var classNamePrefix = /(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source;
-        var className = {
-          pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),
-          lookbehind: true,
-          inside: {
-            "namespace": {
-              pattern: /^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,
-              inside: {
-                "punctuation": /\./
-              }
-            },
-            "punctuation": /\./
-          }
-        };
-        Prism2.languages.java = Prism2.languages.extend("clike", {
-          "string": {
-            pattern: /(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,
-            lookbehind: true,
-            greedy: true
-          },
-          "class-name": [
-            className,
-            {
-              // variables, parameters, and constructor references
-              // this to support class names (or generic parameters) which do not contain a lower case letter (also works for methods)
-              pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),
-              lookbehind: true,
-              inside: className.inside
-            },
-            {
-              // class names based on keyword
-              // this to support class names (or generic parameters) which do not contain a lower case letter (also works for methods)
-              pattern: RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source + classNamePrefix + /[A-Z]\w*\b/.source),
-              lookbehind: true,
-              inside: className.inside
-            }
-          ],
-          "keyword": keywords,
-          "function": [
-            Prism2.languages.clike.function,
-            {
-              pattern: /(::\s*)[a-z_]\w*/,
-              lookbehind: true
-            }
-          ],
-          "number": /\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,
-          "operator": {
-            pattern: /(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,
-            lookbehind: true
-          }
-        });
-        Prism2.languages.insertBefore("java", "string", {
-          "triple-quoted-string": {
-            // http://openjdk.java.net/jeps/355#Description
-            pattern: /"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,
-            greedy: true,
-            alias: "string"
-          },
-          "char": {
-            pattern: /'(?:\\.|[^'\\\r\n]){1,6}'/,
-            greedy: true
-          }
-        });
-        Prism2.languages.insertBefore("java", "class-name", {
-          "annotation": {
-            pattern: /(^|[^.])@\w+(?:\s*\.\s*\w+)*/,
-            lookbehind: true,
-            alias: "punctuation"
-          },
-          "generics": {
-            pattern: /<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,
-            inside: {
-              "class-name": className,
-              "keyword": keywords,
-              "punctuation": /[<>(),.:]/,
-              "operator": /[?&|]/
-            }
-          },
-          "import": [
-            {
-              pattern: RegExp(/(\bimport\s+)/.source + classNamePrefix + /(?:[A-Z]\w*|\*)(?=\s*;)/.source),
-              lookbehind: true,
-              inside: {
-                "namespace": className.inside.namespace,
-                "punctuation": /\./,
-                "operator": /\*/,
-                "class-name": /\w+/
-              }
-            },
-            {
-              pattern: RegExp(/(\bimport\s+static\s+)/.source + classNamePrefix + /(?:\w+|\*)(?=\s*;)/.source),
-              lookbehind: true,
-              alias: "static",
-              inside: {
-                "namespace": className.inside.namespace,
-                "static": /\b\w+$/,
-                "punctuation": /\./,
-                "operator": /\*/,
-                "class-name": /\w+/
-              }
-            }
-          ],
-          "namespace": {
-            pattern: RegExp(
-              /(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(/<keyword>/g, function() {
-                return keywords.source;
-              })
-            ),
-            lookbehind: true,
-            inside: {
-              "punctuation": /\./
-            }
-          }
-        });
-      })(Prism);
-      (function(Prism2) {
-        var comment = /\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/;
-        var constant = [
-          {
-            pattern: /\b(?:false|true)\b/i,
-            alias: "boolean"
-          },
-          {
-            pattern: /(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,
-            greedy: true,
-            lookbehind: true
-          },
-          {
-            pattern: /(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,
-            greedy: true,
-            lookbehind: true
-          },
-          /\b(?:null)\b/i,
-          /\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/
-        ];
-        var number = /\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i;
-        var operator = /<?=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/;
-        var punctuation = /[{}\[\](),:;]/;
-        Prism2.languages.php = {
-          "delimiter": {
-            pattern: /\?>$|^<\?(?:php(?=\s)|=)?/i,
-            alias: "important"
-          },
-          "comment": comment,
-          "variable": /\$+(?:\w+\b|(?=\{))/,
-          "package": {
-            pattern: /(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,
-            lookbehind: true,
-            inside: {
-              "punctuation": /\\/
-            }
-          },
-          "class-name-definition": {
-            pattern: /(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,
-            lookbehind: true,
-            alias: "class-name"
-          },
-          "function-definition": {
-            pattern: /(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,
-            lookbehind: true,
-            alias: "function"
-          },
-          "keyword": [
-            {
-              pattern: /(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,
-              alias: "type-casting",
-              greedy: true,
-              lookbehind: true
-            },
-            {
-              pattern: /([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,
-              alias: "type-hint",
-              greedy: true,
-              lookbehind: true
-            },
-            {
-              pattern: /(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,
-              alias: "return-type",
-              greedy: true,
-              lookbehind: true
-            },
-            {
-              pattern: /\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,
-              alias: "type-declaration",
-              greedy: true
-            },
-            {
-              pattern: /(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,
-              alias: "type-declaration",
-              greedy: true,
-              lookbehind: true
-            },
-            {
-              pattern: /\b(?:parent|self|static)(?=\s*::)/i,
-              alias: "static-context",
-              greedy: true
-            },
-            {
-              // yield from
-              pattern: /(\byield\s+)from\b/i,
-              lookbehind: true
-            },
-            // `class` is always a keyword unlike other keywords
-            /\bclass\b/i,
-            {
-              // https://www.php.net/manual/en/reserved.keywords.php
-              //
-              // keywords cannot be preceded by "->"
-              // the complex lookbehind means `(?<!(?:->|::)\s*)`
-              pattern: /((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,
-              lookbehind: true
-            }
-          ],
-          "argument-name": {
-            pattern: /([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,
-            lookbehind: true
-          },
-          "class-name": [
-            {
-              pattern: /(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,
-              greedy: true,
-              lookbehind: true
-            },
-            {
-              pattern: /(\|\s*)\b[a-z_]\w*(?!\\)\b/i,
-              greedy: true,
-              lookbehind: true
-            },
-            {
-              pattern: /\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,
-              greedy: true
-            },
-            {
-              pattern: /(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,
-              alias: "class-name-fully-qualified",
-              greedy: true,
-              lookbehind: true,
-              inside: {
-                "punctuation": /\\/
-              }
-            },
-            {
-              pattern: /(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,
-              alias: "class-name-fully-qualified",
-              greedy: true,
-              inside: {
-                "punctuation": /\\/
-              }
-            },
-            {
-              pattern: /(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,
-              alias: "class-name-fully-qualified",
-              greedy: true,
-              lookbehind: true,
-              inside: {
-                "punctuation": /\\/
-              }
-            },
-            {
-              pattern: /\b[a-z_]\w*(?=\s*\$)/i,
-              alias: "type-declaration",
-              greedy: true
-            },
-            {
-              pattern: /(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,
-              alias: ["class-name-fully-qualified", "type-declaration"],
-              greedy: true,
-              inside: {
-                "punctuation": /\\/
-              }
-            },
-            {
-              pattern: /\b[a-z_]\w*(?=\s*::)/i,
-              alias: "static-context",
-              greedy: true
-            },
-            {
-              pattern: /(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,
-              alias: ["class-name-fully-qualified", "static-context"],
-              greedy: true,
-              inside: {
-                "punctuation": /\\/
-              }
-            },
-            {
-              pattern: /([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,
-              alias: "type-hint",
-              greedy: true,
-              lookbehind: true
-            },
-            {
-              pattern: /([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,
-              alias: ["class-name-fully-qualified", "type-hint"],
-              greedy: true,
-              lookbehind: true,
-              inside: {
-                "punctuation": /\\/
-              }
-            },
-            {
-              pattern: /(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,
-              alias: "return-type",
-              greedy: true,
-              lookbehind: true
-            },
-            {
-              pattern: /(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,
-              alias: ["class-name-fully-qualified", "return-type"],
-              greedy: true,
-              lookbehind: true,
-              inside: {
-                "punctuation": /\\/
-              }
-            }
-          ],
-          "constant": constant,
-          "function": {
-            pattern: /(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,
-            lookbehind: true,
-            inside: {
-              "punctuation": /\\/
-            }
-          },
-          "property": {
-            pattern: /(->\s*)\w+/,
-            lookbehind: true
-          },
-          "number": number,
-          "operator": operator,
-          "punctuation": punctuation
-        };
-        var string_interpolation = {
-          pattern: /\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,
-          lookbehind: true,
-          inside: Prism2.languages.php
-        };
-        var string = [
-          {
-            pattern: /<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,
-            alias: "nowdoc-string",
-            greedy: true,
-            inside: {
-              "delimiter": {
-                pattern: /^<<<'[^']+'|[a-z_]\w*;$/i,
-                alias: "symbol",
-                inside: {
-                  "punctuation": /^<<<'?|[';]$/
-                }
-              }
-            }
-          },
-          {
-            pattern: /<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,
-            alias: "heredoc-string",
-            greedy: true,
-            inside: {
-              "delimiter": {
-                pattern: /^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,
-                alias: "symbol",
-                inside: {
-                  "punctuation": /^<<<"?|[";]$/
-                }
-              },
-              "interpolation": string_interpolation
-            }
-          },
-          {
-            pattern: /`(?:\\[\s\S]|[^\\`])*`/,
-            alias: "backtick-quoted-string",
-            greedy: true
-          },
-          {
-            pattern: /'(?:\\[\s\S]|[^\\'])*'/,
-            alias: "single-quoted-string",
-            greedy: true
-          },
-          {
-            pattern: /"(?:\\[\s\S]|[^\\"])*"/,
-            alias: "double-quoted-string",
-            greedy: true,
-            inside: {
-              "interpolation": string_interpolation
-            }
-          }
-        ];
-        Prism2.languages.insertBefore("php", "variable", {
-          "string": string,
-          "attribute": {
-            pattern: /#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,
-            greedy: true,
-            inside: {
-              "attribute-content": {
-                pattern: /^(#\[)[\s\S]+(?=\]$)/,
-                lookbehind: true,
-                // inside can appear subset of php
-                inside: {
-                  "comment": comment,
-                  "string": string,
-                  "attribute-class-name": [
-                    {
-                      pattern: /([^:]|^)\b[a-z_]\w*(?!\\)\b/i,
-                      alias: "class-name",
-                      greedy: true,
-                      lookbehind: true
-                    },
-                    {
-                      pattern: /([^:]|^)(?:\\?\b[a-z_]\w*)+/i,
-                      alias: [
-                        "class-name",
-                        "class-name-fully-qualified"
-                      ],
-                      greedy: true,
-                      lookbehind: true,
-                      inside: {
-                        "punctuation": /\\/
-                      }
-                    }
-                  ],
-                  "constant": constant,
-                  "number": number,
-                  "operator": operator,
-                  "punctuation": punctuation
-                }
-              },
-              "delimiter": {
-                pattern: /^#\[|\]$/,
-                alias: "punctuation"
-              }
-            }
-          }
-        });
-        Prism2.hooks.add("before-tokenize", function(env) {
-          if (!/<\?/.test(env.code)) {
-            return;
-          }
-          var phpPattern = /<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g;
-          Prism2.languages["markup-templating"].buildPlaceholders(env, "php", phpPattern);
-        });
-        Prism2.hooks.add("after-tokenize", function(env) {
-          Prism2.languages["markup-templating"].tokenizePlaceholders(env, "php");
-        });
-      })(Prism);
-      (function(Prism2) {
-        var javaDocLike = Prism2.languages.javadoclike = {
-          "parameter": {
-            pattern: /(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,
-            lookbehind: true
-          },
-          "keyword": {
-            // keywords are the first word in a line preceded be an `@` or surrounded by curly braces.
-            // @word, {@word}
-            pattern: /(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,
-            lookbehind: true
-          },
-          "punctuation": /[{}]/
-        };
-        function docCommentSupport(lang, callback) {
-          var tokenName = "doc-comment";
-          var grammar = Prism2.languages[lang];
-          if (!grammar) {
-            return;
-          }
-          var token = grammar[tokenName];
-          if (!token) {
-            var definition = {};
-            definition[tokenName] = {
-              pattern: /(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,
-              lookbehind: true,
-              alias: "comment"
-            };
-            grammar = Prism2.languages.insertBefore(lang, "comment", definition);
-            token = grammar[tokenName];
-          }
-          if (token instanceof RegExp) {
-            token = grammar[tokenName] = { pattern: token };
-          }
-          if (Array.isArray(token)) {
-            for (var i = 0, l = token.length; i < l; i++) {
-              if (token[i] instanceof RegExp) {
-                token[i] = { pattern: token[i] };
-              }
-              callback(token[i]);
-            }
-          } else {
-            callback(token);
-          }
-        }
-        function addSupport(languages, docLanguage) {
-          if (typeof languages === "string") {
-            languages = [languages];
-          }
-          languages.forEach(function(lang) {
-            docCommentSupport(lang, function(pattern) {
-              if (!pattern.inside) {
-                pattern.inside = {};
-              }
-              pattern.inside.rest = docLanguage;
-            });
-          });
-        }
-        Object.defineProperty(javaDocLike, "addSupport", { value: addSupport });
-        javaDocLike.addSupport(["java", "javascript", "php"], javaDocLike);
-      })(Prism);
-      (function(Prism2) {
-        var codeLinePattern = /(^(?:[\t ]*(?:\*\s*)*))[^*\s].*$/m;
-        var memberReference = /#\s*\w+(?:\s*\([^()]*\))?/.source;
-        var reference2 = /(?:\b[a-zA-Z]\w+\s*\.\s*)*\b[A-Z]\w*(?:\s*<mem>)?|<mem>/.source.replace(/<mem>/g, function() {
-          return memberReference;
-        });
-        Prism2.languages.javadoc = Prism2.languages.extend("javadoclike", {});
-        Prism2.languages.insertBefore("javadoc", "keyword", {
-          "reference": {
-            pattern: RegExp(/(@(?:exception|link|linkplain|see|throws|value)\s+(?:\*\s*)?)/.source + "(?:" + reference2 + ")"),
-            lookbehind: true,
-            inside: {
-              "function": {
-                pattern: /(#\s*)\w+(?=\s*\()/,
-                lookbehind: true
-              },
-              "field": {
-                pattern: /(#\s*)\w+/,
-                lookbehind: true
-              },
-              "namespace": {
-                pattern: /\b(?:[a-z]\w*\s*\.\s*)+/,
-                inside: {
-                  "punctuation": /\./
-                }
-              },
-              "class-name": /\b[A-Z]\w*/,
-              "keyword": Prism2.languages.java.keyword,
-              "punctuation": /[#()[\],.]/
-            }
-          },
-          "class-name": {
-            // @param <T> the first generic type parameter
-            pattern: /(@param\s+)<[A-Z]\w*>/,
-            lookbehind: true,
-            inside: {
-              "punctuation": /[.<>]/
-            }
-          },
-          "code-section": [
-            {
-              pattern: /(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,
-              lookbehind: true,
-              inside: {
-                "code": {
-                  // there can't be any HTML inside of {@code} tags
-                  pattern: codeLinePattern,
-                  lookbehind: true,
-                  inside: Prism2.languages.java,
-                  alias: "language-java"
-                }
-              }
-            },
-            {
-              pattern: /(<(code|pre|tt)>(?!<code>)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,
-              lookbehind: true,
-              inside: {
-                "line": {
-                  pattern: codeLinePattern,
-                  lookbehind: true,
-                  inside: {
-                    // highlight HTML tags and entities
-                    "tag": Prism2.languages.markup.tag,
-                    "entity": Prism2.languages.markup.entity,
-                    "code": {
-                      // everything else is Java code
-                      pattern: /.+/,
-                      inside: Prism2.languages.java,
-                      alias: "language-java"
-                    }
-                  }
-                }
-              }
-            }
-          ],
-          "tag": Prism2.languages.markup.tag,
-          "entity": Prism2.languages.markup.entity
-        });
-        Prism2.languages.javadoclike.addSupport("java", Prism2.languages.javadoc);
-      })(Prism);
-      Prism.languages.javastacktrace = {
-        // java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...]
-        // Caused by: java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...]
-        // Caused by: com.example.myproject.MyProjectServletException
-        // Caused by: MidLevelException: LowLevelException
-        // Suppressed: Resource$CloseFailException: Resource ID = 0
-        "summary": {
-          pattern: /^([\t ]*)(?:(?:Caused by:|Suppressed:|Exception in thread "[^"]*")[\t ]+)?[\w$.]+(?::.*)?$/m,
-          lookbehind: true,
-          inside: {
-            "keyword": {
-              pattern: /^([\t ]*)(?:(?:Caused by|Suppressed)(?=:)|Exception in thread)/m,
-              lookbehind: true
-            },
-            // the current thread if the summary starts with 'Exception in thread'
-            "string": {
-              pattern: /^(\s*)"[^"]*"/,
-              lookbehind: true
-            },
-            "exceptions": {
-              pattern: /^(:?\s*)[\w$.]+(?=:|$)/,
-              lookbehind: true,
-              inside: {
-                "class-name": /[\w$]+$/,
-                "namespace": /\b[a-z]\w*\b/,
-                "punctuation": /\./
-              }
-            },
-            "message": {
-              pattern: /(:\s*)\S.*/,
-              lookbehind: true,
-              alias: "string"
-            },
-            "punctuation": /:/
-          }
-        },
-        // at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
-        // at org.hsqldb.jdbc.Util.throwError(Unknown Source) here could be some notes
-        // at java.base/java.lang.Class.forName0(Native Method)
-        // at Util.<init>(Unknown Source)
-        // at com.foo.loader/foo@9.0/com.foo.Main.run(Main.java:101)
-        // at com.foo.loader//com.foo.bar.App.run(App.java:12)
-        // at acme@2.1/org.acme.Lib.test(Lib.java:80)
-        // at MyClass.mash(MyClass.java:9)
-        //
-        // More information:
-        // https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/StackTraceElement.html#toString()
-        //
-        // A valid Java module name is defined as:
-        //   "A module name consists of one or more Java identifiers (§3.8) separated by "." tokens."
-        // https://docs.oracle.com/javase/specs/jls/se9/html/jls-6.html#jls-ModuleName
-        //
-        // A Java module version is defined by this class:
-        // https://docs.oracle.com/javase/9/docs/api/java/lang/module/ModuleDescriptor.Version.html
-        // This is the implementation of the `parse` method in JDK13:
-        // https://github.com/matcdac/jdk/blob/2305df71d1b7710266ae0956d73927a225132c0f/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java#L1108
-        // However, to keep this simple, a version will be matched by the pattern /@[\w$.+-]*/.
-        "stack-frame": {
-          pattern: /^([\t ]*)at (?:[\w$./]|@[\w$.+-]*\/)+(?:<init>)?\([^()]*\)/m,
-          lookbehind: true,
-          inside: {
-            "keyword": {
-              pattern: /^(\s*)at(?= )/,
-              lookbehind: true
-            },
-            "source": [
-              // (Main.java:15)
-              // (Main.scala:15)
-              {
-                pattern: /(\()\w+\.\w+:\d+(?=\))/,
-                lookbehind: true,
-                inside: {
-                  "file": /^\w+\.\w+/,
-                  "punctuation": /:/,
-                  "line-number": {
-                    pattern: /\b\d+\b/,
-                    alias: "number"
-                  }
-                }
-              },
-              // (Unknown Source)
-              // (Native Method)
-              // (...something...)
-              {
-                pattern: /(\()[^()]*(?=\))/,
-                lookbehind: true,
-                inside: {
-                  "keyword": /^(?:Native Method|Unknown Source)$/
-                }
-              }
-            ],
-            "class-name": /[\w$]+(?=\.(?:<init>|[\w$]+)\()/,
-            "function": /(?:<init>|[\w$]+)(?=\()/,
-            "class-loader": {
-              pattern: /(\s)[a-z]\w*(?:\.[a-z]\w*)*(?=\/[\w@$.]*\/)/,
-              lookbehind: true,
-              alias: "namespace",
-              inside: {
-                "punctuation": /\./
-              }
-            },
-            "module": {
-              pattern: /([\s/])[a-z]\w*(?:\.[a-z]\w*)*(?:@[\w$.+-]*)?(?=\/)/,
-              lookbehind: true,
-              inside: {
-                "version": {
-                  pattern: /(@)[\s\S]+/,
-                  lookbehind: true,
-                  alias: "number"
-                },
-                "punctuation": /[@.]/
-              }
-            },
-            "namespace": {
-              pattern: /(?:\b[a-z]\w*\.)+/,
-              inside: {
-                "punctuation": /\./
-              }
-            },
-            "punctuation": /[()/.]/
-          }
-        },
-        // ... 32 more
-        // ... 32 common frames omitted
-        "more": {
-          pattern: /^([\t ]*)\.{3} \d+ [a-z]+(?: [a-z]+)*/m,
-          lookbehind: true,
-          inside: {
-            "punctuation": /\.{3}/,
-            "number": /\d+/,
-            "keyword": /\b[a-z]+(?: [a-z]+)*\b/
-          }
-        }
-      };
-      Prism.languages.jexl = {
-        "string": /(["'])(?:\\[\s\S]|(?!\1)[^\\])*\1/,
-        "transform": {
-          pattern: /(\|\s*)[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*/,
-          alias: "function",
-          lookbehind: true
-        },
-        "function": /[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*\s*(?=\()/,
-        "number": /\b\d+(?:\.\d+)?\b|\B\.\d+\b/,
-        "operator": /[<>!]=?|-|\+|&&|==|\|\|?|\/\/?|[?:*^%]/,
-        "boolean": /\b(?:false|true)\b/,
-        "keyword": /\bin\b/,
-        "punctuation": /[{}[\](),.]/
-      };
-      Prism.languages.jolie = Prism.languages.extend("clike", {
-        "string": {
-          pattern: /(^|[^\\])"(?:\\[\s\S]|[^"\\])*"/,
-          lookbehind: true,
-          greedy: true
-        },
-        "class-name": {
-          pattern: /((?:\b(?:as|courier|embed|in|inputPort|outputPort|service)\b|@)[ \t]*)\w+/,
-          lookbehind: true
-        },
-        "keyword": /\b(?:as|cH|comp|concurrent|constants|courier|cset|csets|default|define|else|embed|embedded|execution|exit|extender|for|foreach|forward|from|global|if|import|in|include|init|inputPort|install|instanceof|interface|is_defined|linkIn|linkOut|main|new|nullProcess|outputPort|over|private|provide|public|scope|sequential|service|single|spawn|synchronized|this|throw|throws|type|undef|until|while|with)\b/,
-        "function": /\b[a-z_]\w*(?=[ \t]*[@(])/i,
-        "number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?l?/i,
-        "operator": /-[-=>]?|\+[+=]?|<[<=]?|[>=*!]=?|&&|\|\||[?\/%^@|]/,
-        "punctuation": /[()[\]{},;.:]/,
-        "builtin": /\b(?:Byte|any|bool|char|double|enum|float|int|length|long|ranges|regex|string|undefined|void)\b/
-      });
-      Prism.languages.insertBefore("jolie", "keyword", {
-        "aggregates": {
-          pattern: /(\bAggregates\s*:\s*)(?:\w+(?:\s+with\s+\w+)?\s*,\s*)*\w+(?:\s+with\s+\w+)?/,
-          lookbehind: true,
-          inside: {
-            "keyword": /\bwith\b/,
-            "class-name": /\w+/,
-            "punctuation": /,/
-          }
-        },
-        "redirects": {
-          pattern: /(\bRedirects\s*:\s*)(?:\w+\s*=>\s*\w+\s*,\s*)*(?:\w+\s*=>\s*\w+)/,
-          lookbehind: true,
-          inside: {
-            "punctuation": /,/,
-            "class-name": /\w+/,
-            "operator": /=>/
-          }
-        },
-        "property": {
-          pattern: /\b(?:Aggregates|[Ii]nterfaces|Java|Javascript|Jolie|[Ll]ocation|OneWay|[Pp]rotocol|Redirects|RequestResponse)\b(?=[ \t]*:)/
-        }
-      });
-      (function(Prism2) {
-        var interpolation = /\\\((?:[^()]|\([^()]*\))*\)/.source;
-        var string = RegExp(/(^|[^\\])"(?:[^"\r\n\\]|\\[^\r\n(]|__)*"/.source.replace(/__/g, function() {
-          return interpolation;
-        }));
-        var stringInterpolation = {
-          "interpolation": {
-            pattern: RegExp(/((?:^|[^\\])(?:\\{2})*)/.source + interpolation),
-            lookbehind: true,
-            inside: {
-              "content": {
-                pattern: /^(\\\()[\s\S]+(?=\)$)/,
-                lookbehind: true,
-                inside: null
-                // see below
-              },
-              "punctuation": /^\\\(|\)$/
-            }
-          }
-        };
-        var jq = Prism2.languages.jq = {
-          "comment": /#.*/,
-          "property": {
-            pattern: RegExp(string.source + /(?=\s*:(?!:))/.source),
-            lookbehind: true,
-            greedy: true,
-            inside: stringInterpolation
-          },
-          "string": {
-            pattern: string,
-            lookbehind: true,
-            greedy: true,
-            inside: stringInterpolation
-          },
-          "function": {
-            pattern: /(\bdef\s+)[a-z_]\w+/i,
-            lookbehind: true
-          },
-          "variable": /\B\$\w+/,
-          "property-literal": {
-            pattern: /\b[a-z_]\w*(?=\s*:(?!:))/i,
-            alias: "property"
-          },
-          "keyword": /\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,
-          "boolean": /\b(?:false|true)\b/,
-          "number": /(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,
-          "operator": [
-            {
-              pattern: /\|=?/,
-              alias: "pipe"
-            },
-            /\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|not|or)\b/
-          ],
-          "c-style-function": {
-            pattern: /\b[a-z_]\w*(?=\s*\()/i,
-            alias: "function"
-          },
-          "punctuation": /::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,
-          "dot": {
-            pattern: /\./,
-            alias: "important"
-          }
-        };
-        stringInterpolation.interpolation.inside.content.inside = jq;
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages.typescript = Prism2.languages.extend("javascript", {
-          "class-name": {
-            pattern: /(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,
-            lookbehind: true,
-            greedy: true,
-            inside: null
-            // see below
-          },
-          "builtin": /\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/
-        });
-        Prism2.languages.typescript.keyword.push(
-          /\b(?:abstract|declare|is|keyof|readonly|require)\b/,
-          // keywords that have to be followed by an identifier
-          /\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,
-          // This is for `import type *, {}`
-          /\btype\b(?=\s*(?:[\{*]|$))/
-        );
-        delete Prism2.languages.typescript["parameter"];
-        delete Prism2.languages.typescript["literal-property"];
-        var typeInside = Prism2.languages.extend("typescript", {});
-        delete typeInside["class-name"];
-        Prism2.languages.typescript["class-name"].inside = typeInside;
-        Prism2.languages.insertBefore("typescript", "function", {
-          "decorator": {
-            pattern: /@[$\w\xA0-\uFFFF]+/,
-            inside: {
-              "at": {
-                pattern: /^@/,
-                alias: "operator"
-              },
-              "function": /^[\s\S]+/
-            }
-          },
-          "generic-function": {
-            // e.g. foo<T extends "bar" | "baz">( ...
-            pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,
-            greedy: true,
-            inside: {
-              "function": /^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,
-              "generic": {
-                pattern: /<[\s\S]+/,
-                // everything after the first <
-                alias: "class-name",
-                inside: typeInside
-              }
-            }
-          }
-        });
-        Prism2.languages.ts = Prism2.languages.typescript;
-      })(Prism);
-      (function(Prism2) {
-        var javascript = Prism2.languages.javascript;
-        var type = /\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source;
-        var parameterPrefix = "(@(?:arg|argument|param|property)\\s+(?:" + type + "\\s+)?)";
-        Prism2.languages.jsdoc = Prism2.languages.extend("javadoclike", {
-          "parameter": {
-            // @param {string} foo - foo bar
-            pattern: RegExp(parameterPrefix + /(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),
-            lookbehind: true,
-            inside: {
-              "punctuation": /\./
-            }
-          }
-        });
-        Prism2.languages.insertBefore("jsdoc", "keyword", {
-          "optional-parameter": {
-            // @param {string} [baz.foo="bar"] foo bar
-            pattern: RegExp(parameterPrefix + /\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),
-            lookbehind: true,
-            inside: {
-              "parameter": {
-                pattern: /(^\[)[$\w\xA0-\uFFFF\.]+/,
-                lookbehind: true,
-                inside: {
-                  "punctuation": /\./
-                }
-              },
-              "code": {
-                pattern: /(=)[\s\S]*(?=\]$)/,
-                lookbehind: true,
-                inside: javascript,
-                alias: "language-javascript"
-              },
-              "punctuation": /[=[\]]/
-            }
-          },
-          "class-name": [
-            {
-              pattern: RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:<TYPE>\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/<TYPE>/g, function() {
-                return type;
-              })),
-              lookbehind: true,
-              inside: {
-                "punctuation": /\./
-              }
-            },
-            {
-              pattern: RegExp("(@[a-z]+\\s+)" + type),
-              lookbehind: true,
-              inside: {
-                "string": javascript.string,
-                "number": javascript.number,
-                "boolean": javascript.boolean,
-                "keyword": Prism2.languages.typescript.keyword,
-                "operator": /=>|\.\.\.|[&|?:*]/,
-                "punctuation": /[.,;=<>{}()[\]]/
-              }
-            }
-          ],
-          "example": {
-            pattern: /(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,
-            lookbehind: true,
-            inside: {
-              "code": {
-                pattern: /^([\t ]*(?:\*\s*)?)\S.*$/m,
-                lookbehind: true,
-                inside: javascript,
-                alias: "language-javascript"
-              }
-            }
-          }
-        });
-        Prism2.languages.javadoclike.addSupport("javascript", Prism2.languages.jsdoc);
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages.insertBefore("javascript", "function-variable", {
-          "method-variable": {
-            pattern: RegExp("(\\.\\s*)" + Prism2.languages.javascript["function-variable"].pattern.source),
-            lookbehind: true,
-            alias: ["function-variable", "method", "function", "property-access"]
-          }
-        });
-        Prism2.languages.insertBefore("javascript", "function", {
-          "method": {
-            pattern: RegExp("(\\.\\s*)" + Prism2.languages.javascript["function"].source),
-            lookbehind: true,
-            alias: ["function", "property-access"]
-          }
-        });
-        Prism2.languages.insertBefore("javascript", "constant", {
-          "known-class-name": [
-            {
-              // standard built-ins
-              // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects
-              pattern: /\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,
-              alias: "class-name"
-            },
-            {
-              // errors
-              pattern: /\b(?:[A-Z]\w*)Error\b/,
-              alias: "class-name"
-            }
-          ]
-        });
-        function withId(source, flags) {
-          return RegExp(
-            source.replace(/<ID>/g, function() {
-              return /(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source;
-            }),
-            flags
-          );
-        }
-        Prism2.languages.insertBefore("javascript", "keyword", {
-          "imports": {
-            // https://tc39.es/ecma262/#sec-imports
-            pattern: withId(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),
-            lookbehind: true,
-            inside: Prism2.languages.javascript
-          },
-          "exports": {
-            // https://tc39.es/ecma262/#sec-exports
-            pattern: withId(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),
-            lookbehind: true,
-            inside: Prism2.languages.javascript
-          }
-        });
-        Prism2.languages.javascript["keyword"].unshift(
-          {
-            pattern: /\b(?:as|default|export|from|import)\b/,
-            alias: "module"
-          },
-          {
-            pattern: /\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,
-            alias: "control-flow"
-          },
-          {
-            pattern: /\bnull\b/,
-            alias: ["null", "nil"]
-          },
-          {
-            pattern: /\bundefined\b/,
-            alias: "nil"
-          }
-        );
-        Prism2.languages.insertBefore("javascript", "operator", {
-          "spread": {
-            pattern: /\.{3}/,
-            alias: "operator"
-          },
-          "arrow": {
-            pattern: /=>/,
-            alias: "operator"
-          }
-        });
-        Prism2.languages.insertBefore("javascript", "punctuation", {
-          "property-access": {
-            pattern: withId(/(\.\s*)#?<ID>/.source),
-            lookbehind: true
-          },
-          "maybe-class-name": {
-            pattern: /(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,
-            lookbehind: true
-          },
-          "dom": {
-            // this contains only a few commonly used DOM variables
-            pattern: /\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,
-            alias: "variable"
-          },
-          "console": {
-            pattern: /\bconsole(?=\s*\.)/,
-            alias: "class-name"
-          }
-        });
-        var maybeClassNameTokens = ["function", "function-variable", "method", "method-variable", "property-access"];
-        for (var i = 0; i < maybeClassNameTokens.length; i++) {
-          var token = maybeClassNameTokens[i];
-          var value = Prism2.languages.javascript[token];
-          if (Prism2.util.type(value) === "RegExp") {
-            value = Prism2.languages.javascript[token] = {
-              pattern: value
-            };
-          }
-          var inside = value.inside || {};
-          value.inside = inside;
-          inside["maybe-class-name"] = /^[A-Z][\s\S]*/;
-        }
-      })(Prism);
-      Prism.languages.json = {
-        "property": {
-          pattern: /(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,
-          lookbehind: true,
-          greedy: true
-        },
-        "string": {
-          pattern: /(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,
-          lookbehind: true,
-          greedy: true
-        },
-        "comment": {
-          pattern: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
-          greedy: true
-        },
-        "number": /-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
-        "punctuation": /[{}[\],]/,
-        "operator": /:/,
-        "boolean": /\b(?:false|true)\b/,
-        "null": {
-          pattern: /\bnull\b/,
-          alias: "keyword"
-        }
-      };
-      Prism.languages.webmanifest = Prism.languages.json;
-      (function(Prism2) {
-        var string = /("|')(?:\\(?:\r\n?|\n|.)|(?!\1)[^\\\r\n])*\1/;
-        Prism2.languages.json5 = Prism2.languages.extend("json", {
-          "property": [
-            {
-              pattern: RegExp(string.source + "(?=\\s*:)"),
-              greedy: true
-            },
-            {
-              pattern: /(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/,
-              alias: "unquoted"
-            }
-          ],
-          "string": {
-            pattern: string,
-            greedy: true
-          },
-          "number": /[+-]?\b(?:NaN|Infinity|0x[a-fA-F\d]+)\b|[+-]?(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+\b)?/
-        });
-      })(Prism);
-      Prism.languages.jsonp = Prism.languages.extend("json", {
-        "punctuation": /[{}[\]();,.]/
-      });
-      Prism.languages.insertBefore("jsonp", "punctuation", {
-        "function": /(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*\()/
-      });
-      Prism.languages.jsstacktrace = {
-        "error-message": {
-          pattern: /^\S.*/m,
-          alias: "string"
-        },
-        "stack-frame": {
-          pattern: /(^[ \t]+)at[ \t].*/m,
-          lookbehind: true,
-          inside: {
-            "not-my-code": {
-              pattern: /^at[ \t]+(?!\s)(?:node\.js|<unknown>|.*(?:node_modules|\(<anonymous>\)|\(<unknown>|<anonymous>$|\(internal\/|\(node\.js)).*/m,
-              alias: "comment"
-            },
-            "filename": {
-              pattern: /(\bat\s+(?!\s)|\()(?:[a-zA-Z]:)?[^():]+(?=:)/,
-              lookbehind: true,
-              alias: "url"
-            },
-            "function": {
-              pattern: /(\bat\s+(?:new\s+)?)(?!\s)[_$a-zA-Z\xA0-\uFFFF<][.$\w\xA0-\uFFFF<>]*/,
-              lookbehind: true,
-              inside: {
-                "punctuation": /\./
-              }
-            },
-            "punctuation": /[()]/,
-            "keyword": /\b(?:at|new)\b/,
-            "alias": {
-              pattern: /\[(?:as\s+)?(?!\s)[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\]/,
-              alias: "variable"
-            },
-            "line-number": {
-              pattern: /:\d+(?::\d+)?\b/,
-              alias: "number",
-              inside: {
-                "punctuation": /:/
-              }
-            }
-          }
-        }
-      };
-      (function(Prism2) {
-        var templateString = Prism2.languages.javascript["template-string"];
-        var templateLiteralPattern = templateString.pattern.source;
-        var interpolationObject = templateString.inside["interpolation"];
-        var interpolationPunctuationObject = interpolationObject.inside["interpolation-punctuation"];
-        var interpolationPattern = interpolationObject.pattern.source;
-        function createTemplate(language, tag) {
-          if (!Prism2.languages[language]) {
-            return void 0;
-          }
-          return {
-            pattern: RegExp("((?:" + tag + ")\\s*)" + templateLiteralPattern),
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "template-punctuation": {
-                pattern: /^`|`$/,
-                alias: "string"
-              },
-              "embedded-code": {
-                pattern: /[\s\S]+/,
-                alias: language
-              }
-            }
-          };
-        }
-        Prism2.languages.javascript["template-string"] = [
-          // styled-jsx:
-          //   css`a { color: #25F; }`
-          // styled-components:
-          //   styled.h1`color: red;`
-          createTemplate("css", /\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),
-          // html`<p></p>`
-          // div.innerHTML = `<p></p>`
-          createTemplate("html", /\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),
-          // svg`<path fill="#fff" d="M55.37 ..."/>`
-          createTemplate("svg", /\bsvg/.source),
-          // md`# h1`, markdown`## h2`
-          createTemplate("markdown", /\b(?:markdown|md)/.source),
-          // gql`...`, graphql`...`, graphql.experimental`...`
-          createTemplate("graphql", /\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),
-          // sql`...`
-          createTemplate("sql", /\bsql/.source),
-          // vanilla template string
-          templateString
-        ].filter(Boolean);
-        function getPlaceholder(counter, language) {
-          return "___" + language.toUpperCase() + "_" + counter + "___";
-        }
-        function tokenizeWithHooks(code, grammar, language) {
-          var env = {
-            code,
-            grammar,
-            language
-          };
-          Prism2.hooks.run("before-tokenize", env);
-          env.tokens = Prism2.tokenize(env.code, env.grammar);
-          Prism2.hooks.run("after-tokenize", env);
-          return env.tokens;
-        }
-        function tokenizeInterpolationExpression(expression) {
-          var tempGrammar = {};
-          tempGrammar["interpolation-punctuation"] = interpolationPunctuationObject;
-          var tokens = Prism2.tokenize(expression, tempGrammar);
-          if (tokens.length === 3) {
-            var args = [1, 1];
-            args.push.apply(args, tokenizeWithHooks(tokens[1], Prism2.languages.javascript, "javascript"));
-            tokens.splice.apply(tokens, args);
-          }
-          return new Prism2.Token("interpolation", tokens, interpolationObject.alias, expression);
-        }
-        function tokenizeEmbedded(code, grammar, language) {
-          var _tokens = Prism2.tokenize(code, {
-            "interpolation": {
-              pattern: RegExp(interpolationPattern),
-              lookbehind: true
-            }
-          });
-          var placeholderCounter = 0;
-          var placeholderMap = {};
-          var embeddedCode = _tokens.map(function(token) {
-            if (typeof token === "string") {
-              return token;
-            } else {
-              var interpolationExpression = token.content;
-              var placeholder;
-              while (code.indexOf(placeholder = getPlaceholder(placeholderCounter++, language)) !== -1) {
-              }
-              placeholderMap[placeholder] = interpolationExpression;
-              return placeholder;
-            }
-          }).join("");
-          var embeddedTokens = tokenizeWithHooks(embeddedCode, grammar, language);
-          var placeholders = Object.keys(placeholderMap);
-          placeholderCounter = 0;
-          function walkTokens(tokens) {
-            for (var i = 0; i < tokens.length; i++) {
-              if (placeholderCounter >= placeholders.length) {
-                return;
-              }
-              var token = tokens[i];
-              if (typeof token === "string" || typeof token.content === "string") {
-                var placeholder = placeholders[placeholderCounter];
-                var s = typeof token === "string" ? token : (
-                  /** @type {string} */
-                  token.content
-                );
-                var index = s.indexOf(placeholder);
-                if (index !== -1) {
-                  ++placeholderCounter;
-                  var before = s.substring(0, index);
-                  var middle = tokenizeInterpolationExpression(placeholderMap[placeholder]);
-                  var after = s.substring(index + placeholder.length);
-                  var replacement = [];
-                  if (before) {
-                    replacement.push(before);
-                  }
-                  replacement.push(middle);
-                  if (after) {
-                    var afterTokens = [after];
-                    walkTokens(afterTokens);
-                    replacement.push.apply(replacement, afterTokens);
-                  }
-                  if (typeof token === "string") {
-                    tokens.splice.apply(tokens, [i, 1].concat(replacement));
-                    i += replacement.length - 1;
-                  } else {
-                    token.content = replacement;
-                  }
-                }
-              } else {
-                var content = token.content;
-                if (Array.isArray(content)) {
-                  walkTokens(content);
-                } else {
-                  walkTokens([content]);
-                }
-              }
-            }
-          }
-          walkTokens(embeddedTokens);
-          return new Prism2.Token(language, embeddedTokens, "language-" + language, code);
-        }
-        var supportedLanguages = {
-          "javascript": true,
-          "js": true,
-          "typescript": true,
-          "ts": true,
-          "jsx": true,
-          "tsx": true
-        };
-        Prism2.hooks.add("after-tokenize", function(env) {
-          if (!(env.language in supportedLanguages)) {
-            return;
-          }
-          function findTemplateStrings(tokens) {
-            for (var i = 0, l = tokens.length; i < l; i++) {
-              var token = tokens[i];
-              if (typeof token === "string") {
-                continue;
-              }
-              var content = token.content;
-              if (!Array.isArray(content)) {
-                if (typeof content !== "string") {
-                  findTemplateStrings([content]);
-                }
-                continue;
-              }
-              if (token.type === "template-string") {
-                var embedded = content[1];
-                if (content.length === 3 && typeof embedded !== "string" && embedded.type === "embedded-code") {
-                  var code = stringContent(embedded);
-                  var alias = embedded.alias;
-                  var language = Array.isArray(alias) ? alias[0] : alias;
-                  var grammar = Prism2.languages[language];
-                  if (!grammar) {
-                    continue;
-                  }
-                  content[1] = tokenizeEmbedded(code, grammar, language);
-                }
-              } else {
-                findTemplateStrings(content);
-              }
-            }
-          }
-          findTemplateStrings(env.tokens);
-        });
-        function stringContent(value) {
-          if (typeof value === "string") {
-            return value;
-          } else if (Array.isArray(value)) {
-            return value.map(stringContent).join("");
-          } else {
-            return stringContent(value.content);
-          }
-        }
-      })(Prism);
-      Prism.languages.julia = {
-        "comment": {
-          // support one level of nested comments
-          // https://github.com/JuliaLang/julia/pull/6128
-          pattern: /(^|[^\\])(?:#=(?:[^#=]|=(?!#)|#(?!=)|#=(?:[^#=]|=(?!#)|#(?!=))*=#)*=#|#.*)/,
-          lookbehind: true
-        },
-        "regex": {
-          // https://docs.julialang.org/en/v1/manual/strings/#Regular-Expressions-1
-          pattern: /r"(?:\\.|[^"\\\r\n])*"[imsx]{0,4}/,
-          greedy: true
-        },
-        "string": {
-          // https://docs.julialang.org/en/v1/manual/strings/#String-Basics-1
-          // https://docs.julialang.org/en/v1/manual/strings/#non-standard-string-literals-1
-          // https://docs.julialang.org/en/v1/manual/running-external-programs/#Running-External-Programs-1
-          pattern: /"""[\s\S]+?"""|(?:\b\w+)?"(?:\\.|[^"\\\r\n])*"|`(?:[^\\`\r\n]|\\.)*`/,
-          greedy: true
-        },
-        "char": {
-          // https://docs.julialang.org/en/v1/manual/strings/#man-characters-1
-          pattern: /(^|[^\w'])'(?:\\[^\r\n][^'\r\n]*|[^\\\r\n])'/,
-          lookbehind: true,
-          greedy: true
-        },
-        "keyword": /\b(?:abstract|baremodule|begin|bitstype|break|catch|ccall|const|continue|do|else|elseif|end|export|finally|for|function|global|if|immutable|import|importall|in|let|local|macro|module|print|println|quote|return|struct|try|type|typealias|using|while)\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "number": /(?:\b(?=\d)|\B(?=\.))(?:0[box])?(?:[\da-f]+(?:_[\da-f]+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[efp][+-]?\d+(?:_\d+)*)?j?/i,
-        // https://docs.julialang.org/en/v1/manual/mathematical-operations/
-        // https://docs.julialang.org/en/v1/manual/mathematical-operations/#Operator-Precedence-and-Associativity-1
-        "operator": /&&|\|\||[-+*^%÷⊻&$\\]=?|\/[\/=]?|!=?=?|\|[=>]?|<(?:<=?|[=:|])?|>(?:=|>>?=?)?|==?=?|[~≠≤≥'√∛]/,
-        "punctuation": /::?|[{}[\]();,.?]/,
-        // https://docs.julialang.org/en/v1/base/numbers/#Base.im
-        "constant": /\b(?:(?:Inf|NaN)(?:16|32|64)?|im|pi)\b|[πℯ]/
-      };
-      Prism.languages.keepalived = {
-        "comment": {
-          pattern: /[#!].*/,
-          greedy: true
-        },
-        "string": {
-          pattern: /(^|[^\\])(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,
-          lookbehind: true,
-          greedy: true
-        },
-        // support IPv4, IPv6, subnet mask
-        "ip": {
-          pattern: RegExp(
-            /\b(?:(?:(?:[\da-f]{1,4}:){7}[\da-f]{1,4}|(?:[\da-f]{1,4}:){6}:[\da-f]{1,4}|(?:[\da-f]{1,4}:){5}:(?:[\da-f]{1,4}:)?[\da-f]{1,4}|(?:[\da-f]{1,4}:){4}:(?:[\da-f]{1,4}:){0,2}[\da-f]{1,4}|(?:[\da-f]{1,4}:){3}:(?:[\da-f]{1,4}:){0,3}[\da-f]{1,4}|(?:[\da-f]{1,4}:){2}:(?:[\da-f]{1,4}:){0,4}[\da-f]{1,4}|(?:[\da-f]{1,4}:){6}<ipv4>|(?:[\da-f]{1,4}:){0,5}:<ipv4>|::(?:[\da-f]{1,4}:){0,5}<ipv4>|[\da-f]{1,4}::(?:[\da-f]{1,4}:){0,5}[\da-f]{1,4}|::(?:[\da-f]{1,4}:){0,6}[\da-f]{1,4}|(?:[\da-f]{1,4}:){1,7}:)(?:\/\d{1,3})?|<ipv4>(?:\/\d{1,2})?)\b/.source.replace(/<ipv4>/g, function() {
-              return /(?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d))/.source;
-            }),
-            "i"
-          ),
-          alias: "number"
-        },
-        // support *nix / Windows, directory / file
-        "path": {
-          pattern: /(\s)\/(?:[^\/\s]+\/)*[^\/\s]*|\b[a-zA-Z]:\\(?:[^\\\s]+\\)*[^\\\s]*/,
-          lookbehind: true,
-          alias: "string"
-        },
-        "variable": /\$\{?\w+\}?/,
-        "email": {
-          pattern: /[\w-]+@[\w-]+(?:\.[\w-]{2,3}){1,2}/,
-          alias: "string"
-        },
-        "conditional-configuration": {
-          pattern: /@\^?[\w-]+/,
-          alias: "variable"
-        },
-        "operator": /=/,
-        "property": /\b(?:BFD_CHECK|DNS_CHECK|FILE_CHECK|HTTP_GET|MISC_CHECK|NAME|PING_CHECK|SCRIPTS|SMTP_CHECK|SSL|SSL_GET|TCP_CHECK|UDP_CHECK|accept|advert_int|alpha|auth_pass|auth_type|authentication|bfd_cpu_affinity|bfd_instance|bfd_no_swap|bfd_priority|bfd_process_name|bfd_rlimit_rttime|bfd_rt_priority|bind_if|bind_port|bindto|ca|certificate|check_unicast_src|checker|checker_cpu_affinity|checker_log_all_failures|checker_no_swap|checker_priority|checker_rlimit_rttime|checker_rt_priority|child_wait_time|connect_ip|connect_port|connect_timeout|dbus_service_name|debug|default_interface|delay|delay_before_retry|delay_loop|digest|dont_track_primary|dynamic|dynamic_interfaces|enable_(?:dbus|script_security|sni|snmp_checker|snmp_rfc|snmp_rfcv2|snmp_rfcv3|snmp_vrrp|traps)|end|fall|fast_recovery|file|flag-[123]|fork_delay|full_command|fwmark|garp_group|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|global_defs|global_tracking|gna_interval|group|ha_suspend|hashed|helo_name|higher_prio_send_advert|hoplimit|http_protocol|hysteresis|idle_tx|include|inhibit_on_failure|init_fail|init_file|instance|interface|interfaces|interval|ip_family|ipvs_process_name|keepalived.conf|kernel_rx_buf_size|key|linkbeat_interfaces|linkbeat_use_polling|log_all_failures|log_unknown_vrids|lower_prio_no_advert|lthreshold|lvs_flush|lvs_flush_onstop|lvs_method|lvs_netlink_cmd_rcv_bufs|lvs_netlink_cmd_rcv_bufs_force|lvs_netlink_monitor_rcv_bufs|lvs_netlink_monitor_rcv_bufs_force|lvs_notify_fifo|lvs_notify_fifo_script|lvs_sched|lvs_sync_daemon|max_auto_priority|max_hops|mcast_src_ip|mh-fallback|mh-port|min_auto_priority_delay|min_rx|min_tx|misc_dynamic|misc_path|misc_timeout|multiplier|name|namespace_with_ipsets|native_ipv6|neighbor_ip|net_namespace|net_namespace_ipvs|nftables|nftables_counters|nftables_ifindex|nftables_priority|no_accept|no_checker_emails|no_email_faults|nopreempt|notification_email|notification_email_from|notify|notify_backup|notify_deleted|notify_down|notify_fault|notify_fifo|notify_fifo_script|notify_master|notify_master_rx_lower_pri|notify_priority_changes|notify_stop|notify_up|old_unicast_checksum|omega|ops|param_match|passive|password|path|persistence_engine|persistence_granularity|persistence_timeout|preempt|preempt_delay|priority|process|process_monitor_rcv_bufs|process_monitor_rcv_bufs_force|process_name|process_names|promote_secondaries|protocol|proxy_arp|proxy_arp_pvlan|quorum|quorum_down|quorum_max|quorum_up|random_seed|real_server|regex|regex_max_offset|regex_min_offset|regex_no_match|regex_options|regex_stack|reload_repeat|reload_time_file|require_reply|retry|rise|router_id|rs_init_notifies|script|script_user|sh-fallback|sh-port|shutdown_script|shutdown_script_timeout|skip_check_adv_addr|smtp_alert|smtp_alert_checker|smtp_alert_vrrp|smtp_connect_timeout|smtp_helo_name|smtp_server|snmp_socket|sorry_server|sorry_server_inhibit|sorry_server_lvs_method|source_ip|start|startup_script|startup_script_timeout|state|static_ipaddress|static_routes|static_rules|status_code|step|strict_mode|sync_group_tracking_weight|terminate_delay|timeout|track_bfd|track_file|track_group|track_interface|track_process|track_script|track_src_ip|ttl|type|umask|unicast_peer|unicast_src_ip|unicast_ttl|url|use_ipvlan|use_pid_dir|use_vmac|user|uthreshold|val[123]|version|virtual_ipaddress|virtual_ipaddress_excluded|virtual_router_id|virtual_routes|virtual_rules|virtual_server|virtual_server_group|virtualhost|vmac_xmit_base|vrrp|vrrp_(?:check_unicast_src|cpu_affinity|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|gna_interval|higher_prio_send_advert|instance|ipsets|iptables|lower_prio_no_advert|mcast_group4|mcast_group6|min_garp|netlink_cmd_rcv_bufs|netlink_cmd_rcv_bufs_force|netlink_monitor_rcv_bufs|netlink_monitor_rcv_bufs_force|no_swap|notify_fifo|notify_fifo_script|notify_priority_changes|priority|process_name|rlimit_rttime|rt_priority|rx_bufs_multiplier|rx_bufs_policy|script|skip_check_adv_addr|startup_delay|strict|sync_group|track_process|version)|warmup|weight)\b/,
-        "constant": /\b(?:A|AAAA|AH|BACKUP|CNAME|DR|MASTER|MX|NAT|NS|PASS|SCTP|SOA|TCP|TUN|TXT|UDP|dh|fo|lblc|lblcr|lc|mh|nq|ovf|rr|sed|sh|wlc|wrr)\b/,
-        "number": {
-          pattern: /(^|[^\w.-])-?\d+(?:\.\d+)?/,
-          lookbehind: true
-        },
-        "boolean": /\b(?:false|no|off|on|true|yes)\b/,
-        "punctuation": /[\{\}]/
-      };
-      Prism.languages.keyman = {
-        "comment": {
-          pattern: /\bc .*/i,
-          greedy: true
-        },
-        "string": {
-          pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
-          greedy: true
-        },
-        "virtual-key": {
-          pattern: /\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|[A-E]\d\d?|"[^"\r\n]*"|'[^'\r\n]*')\s*\]/i,
-          greedy: true,
-          alias: "function"
-          // alias for styles
-        },
-        // https://help.keyman.com/developer/language/guide/headers
-        "header-keyword": {
-          pattern: /&\w+/,
-          alias: "bold"
-          // alias for styles
-        },
-        "header-statement": {
-          pattern: /\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i,
-          alias: "bold"
-          // alias for styles
-        },
-        "rule-keyword": {
-          pattern: /\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i,
-          alias: "keyword"
-        },
-        "structural-keyword": {
-          pattern: /\b(?:ansi|begin|group|match|newcontext|nomatch|postkeystroke|readonly|unicode|using keys)\b/i,
-          alias: "keyword"
-        },
-        "compile-target": {
-          pattern: /\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,
-          alias: "property"
-        },
-        // U+####, x###, d### characters and numbers
-        "number": /\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,
-        "operator": /[+>\\$]|\.\./,
-        "punctuation": /[()=,]/
-      };
-      (function(Prism2) {
-        Prism2.languages.kotlin = Prism2.languages.extend("clike", {
-          "keyword": {
-            // The lookbehind prevents wrong highlighting of e.g. kotlin.properties.get
-            pattern: /(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,
-            lookbehind: true
-          },
-          "function": [
-            {
-              pattern: /(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,
-              greedy: true
-            },
-            {
-              pattern: /(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,
-              lookbehind: true,
-              greedy: true
-            }
-          ],
-          "number": /\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,
-          "operator": /\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/
-        });
-        delete Prism2.languages.kotlin["class-name"];
-        var interpolationInside = {
-          "interpolation-punctuation": {
-            pattern: /^\$\{?|\}$/,
-            alias: "punctuation"
-          },
-          "expression": {
-            pattern: /[\s\S]+/,
-            inside: Prism2.languages.kotlin
-          }
-        };
-        Prism2.languages.insertBefore("kotlin", "string", {
-          // https://kotlinlang.org/spec/expressions.html#string-interpolation-expressions
-          "string-literal": [
-            {
-              pattern: /"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,
-              alias: "multiline",
-              inside: {
-                "interpolation": {
-                  pattern: /\$(?:[a-z_]\w*|\{[^{}]*\})/i,
-                  inside: interpolationInside
-                },
-                "string": /[\s\S]+/
-              }
-            },
-            {
-              pattern: /"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,
-              alias: "singleline",
-              inside: {
-                "interpolation": {
-                  pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,
-                  lookbehind: true,
-                  inside: interpolationInside
-                },
-                "string": /[\s\S]+/
-              }
-            }
-          ],
-          "char": {
-            // https://kotlinlang.org/spec/expressions.html#character-literals
-            pattern: /'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,
-            greedy: true
-          }
-        });
-        delete Prism2.languages.kotlin["string"];
-        Prism2.languages.insertBefore("kotlin", "keyword", {
-          "annotation": {
-            pattern: /\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,
-            alias: "builtin"
-          }
-        });
-        Prism2.languages.insertBefore("kotlin", "function", {
-          "label": {
-            pattern: /\b\w+@|@\w+\b/,
-            alias: "symbol"
-          }
-        });
-        Prism2.languages.kt = Prism2.languages.kotlin;
-        Prism2.languages.kts = Prism2.languages.kotlin;
-      })(Prism);
-      (function(Prism2) {
-        var nonId = /\s\x00-\x1f\x22-\x2f\x3a-\x3f\x5b-\x5e\x60\x7b-\x7e/.source;
-        function wrapId(pattern, flags) {
-          return RegExp(pattern.replace(/<nonId>/g, nonId), flags);
-        }
-        Prism2.languages.kumir = {
-          "comment": {
-            pattern: /\|.*/
-          },
-          "prolog": {
-            pattern: /#.*/,
-            greedy: true
-          },
-          "string": {
-            pattern: /"[^\n\r"]*"|'[^\n\r']*'/,
-            greedy: true
-          },
-          "boolean": {
-            pattern: wrapId(/(^|[<nonId>])(?:да|нет)(?=[<nonId>]|$)/.source),
-            lookbehind: true
-          },
-          "operator-word": {
-            pattern: wrapId(/(^|[<nonId>])(?:и|или|не)(?=[<nonId>]|$)/.source),
-            lookbehind: true,
-            alias: "keyword"
-          },
-          "system-variable": {
-            pattern: wrapId(/(^|[<nonId>])знач(?=[<nonId>]|$)/.source),
-            lookbehind: true,
-            alias: "keyword"
-          },
-          "type": [
-            {
-              pattern: wrapId(/(^|[<nonId>])(?:вещ|лит|лог|сим|цел)(?:\x20*таб)?(?=[<nonId>]|$)/.source),
-              lookbehind: true,
-              alias: "builtin"
-            },
-            {
-              pattern: wrapId(/(^|[<nonId>])(?:компл|сканкод|файл|цвет)(?=[<nonId>]|$)/.source),
-              lookbehind: true,
-              alias: "important"
-            }
-          ],
-          /**
-           * Should be performed after searching for type names because of "таб".
-           * "таб" is a reserved word, but never used without a preceding type name.
-           * "НАЗНАЧИТЬ", "Фввод", and "Фвывод" are not reserved words.
-           */
-          "keyword": {
-            pattern: wrapId(/(^|[<nonId>])(?:алг|арг(?:\x20*рез)?|ввод|ВКЛЮЧИТЬ|вс[её]|выбор|вывод|выход|дано|для|до|дс|если|иначе|исп|использовать|кон(?:(?:\x20+|_)исп)?|кц(?:(?:\x20+|_)при)?|надо|нач|нс|нц|от|пауза|пока|при|раза?|рез|стоп|таб|то|утв|шаг)(?=[<nonId>]|$)/.source),
-            lookbehind: true
-          },
-          /** Should be performed after searching for reserved words. */
-          "name": {
-            // eslint-disable-next-line regexp/no-super-linear-backtracking
-            pattern: wrapId(/(^|[<nonId>])[^\d<nonId>][^<nonId>]*(?:\x20+[^<nonId>]+)*(?=[<nonId>]|$)/.source),
-            lookbehind: true
-          },
-          /** Should be performed after searching for names. */
-          "number": {
-            pattern: wrapId(/(^|[<nonId>])(?:\B\$[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?=[<nonId>]|$)/.source, "i"),
-            lookbehind: true
-          },
-          /** Should be performed after searching for words. */
-          "punctuation": /:=|[(),:;\[\]]/,
-          /**
-           * Should be performed after searching for
-           * - numeric constants (because of "+" and "-");
-           * - punctuation marks (because of ":=" and "=").
-           */
-          "operator-char": {
-            pattern: /\*\*?|<[=>]?|>=?|[-+/=]/,
-            alias: "operator"
-          }
-        };
-        Prism2.languages.kum = Prism2.languages.kumir;
-      })(Prism);
-      Prism.languages.kusto = {
-        "comment": {
-          pattern: /\/\/.*/,
-          greedy: true
-        },
-        "string": {
-          pattern: /```[\s\S]*?```|[hH]?(?:"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\.)*'|@(?:"[^\r\n"]*"|'[^\r\n']*'))/,
-          greedy: true
-        },
-        "verb": {
-          pattern: /(\|\s*)[a-z][\w-]*/i,
-          lookbehind: true,
-          alias: "keyword"
-        },
-        "command": {
-          pattern: /\.[a-z][a-z\d-]*\b/,
-          alias: "keyword"
-        },
-        "class-name": /\b(?:bool|datetime|decimal|dynamic|guid|int|long|real|string|timespan)\b/,
-        "keyword": /\b(?:access|alias|and|anti|as|asc|auto|between|by|(?:contains|(?:ends|starts)with|has(?:perfix|suffix)?)(?:_cs)?|database|declare|desc|external|from|fullouter|has_all|in|ingestion|inline|inner|innerunique|into|(?:left|right)(?:anti(?:semi)?|inner|outer|semi)?|let|like|local|not|of|on|or|pattern|print|query_parameters|range|restrict|schema|set|step|table|tables|to|view|where|with|matches\s+regex|nulls\s+(?:first|last))(?![\w-])/,
-        "boolean": /\b(?:false|null|true)\b/,
-        "function": /\b[a-z_]\w*(?=\s*\()/,
-        "datetime": [
-          {
-            // RFC 822 + RFC 850
-            pattern: /\b(?:(?:Fri|Friday|Mon|Monday|Sat|Saturday|Sun|Sunday|Thu|Thursday|Tue|Tuesday|Wed|Wednesday)\s*,\s*)?\d{1,2}(?:\s+|-)(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)(?:\s+|-)\d{2}\s+\d{2}:\d{2}(?::\d{2})?(?:\s*(?:\b(?:[A-Z]|(?:[ECMT][DS]|GM|U)T)|[+-]\d{4}))?\b/,
-            alias: "number"
-          },
-          {
-            // ISO 8601
-            pattern: /[+-]?\b(?:\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)?|\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)Z?/,
-            alias: "number"
-          }
-        ],
-        "number": /\b(?:0x[0-9A-Fa-f]+|\d+(?:\.\d+)?(?:[Ee][+-]?\d+)?)(?:(?:min|sec|[mnµ]s|[dhms]|microsecond|tick)\b)?|[+-]?\binf\b/,
-        "operator": /=>|[!=]~|[!=<>]=?|[-+*/%|]|\.\./,
-        "punctuation": /[()\[\]{},;.:]/
-      };
-      (function(Prism2) {
-        var funcPattern = /\\(?:[^a-z()[\]]|[a-z*]+)/i;
-        var insideEqu = {
-          "equation-command": {
-            pattern: funcPattern,
-            alias: "regex"
-          }
-        };
-        Prism2.languages.latex = {
-          "comment": /%.*/,
-          // the verbatim environment prints whitespace to the document
-          "cdata": {
-            pattern: /(\\begin\{((?:lstlisting|verbatim)\*?)\})[\s\S]*?(?=\\end\{\2\})/,
-            lookbehind: true
-          },
-          /*
-           * equations can be between $$ $$ or $ $ or \( \) or \[ \]
-           * (all are multiline)
-           */
-          "equation": [
-            {
-              pattern: /\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,
-              inside: insideEqu,
-              alias: "string"
-            },
-            {
-              pattern: /(\\begin\{((?:align|eqnarray|equation|gather|math|multline)\*?)\})[\s\S]*?(?=\\end\{\2\})/,
-              lookbehind: true,
-              inside: insideEqu,
-              alias: "string"
-            }
-          ],
-          /*
-           * arguments which are keywords or references are highlighted
-           * as keywords
-           */
-          "keyword": {
-            pattern: /(\\(?:begin|cite|documentclass|end|label|ref|usepackage)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,
-            lookbehind: true
-          },
-          "url": {
-            pattern: /(\\url\{)[^}]+(?=\})/,
-            lookbehind: true
-          },
-          /*
-           * section or chapter headlines are highlighted as bold so that
-           * they stand out more
-           */
-          "headline": {
-            pattern: /(\\(?:chapter|frametitle|paragraph|part|section|subparagraph|subsection|subsubparagraph|subsubsection|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,
-            lookbehind: true,
-            alias: "class-name"
-          },
-          "function": {
-            pattern: funcPattern,
-            alias: "selector"
-          },
-          "punctuation": /[[\]{}&]/
-        };
-        Prism2.languages.tex = Prism2.languages.latex;
-        Prism2.languages.context = Prism2.languages.latex;
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages.latte = {
-          "comment": /^\{\*[\s\S]*/,
-          "latte-tag": {
-            // https://latte.nette.org/en/tags
-            pattern: /(^\{(?:\/(?=[a-z]))?)(?:[=_]|[a-z]\w*\b(?!\())/i,
-            lookbehind: true,
-            alias: "important"
-          },
-          "delimiter": {
-            pattern: /^\{\/?|\}$/,
-            alias: "punctuation"
-          },
-          "php": {
-            pattern: /\S(?:[\s\S]*\S)?/,
-            alias: "language-php",
-            inside: Prism2.languages.php
-          }
-        };
-        var markupLatte = Prism2.languages.extend("markup", {});
-        Prism2.languages.insertBefore("inside", "attr-value", {
-          "n-attr": {
-            pattern: /n:[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+))?/,
-            inside: {
-              "attr-name": {
-                pattern: /^[^\s=]+/,
-                alias: "important"
-              },
-              "attr-value": {
-                pattern: /=[\s\S]+/,
-                inside: {
-                  "punctuation": [
-                    /^=/,
-                    {
-                      pattern: /^(\s*)["']|["']$/,
-                      lookbehind: true
-                    }
-                  ],
-                  "php": {
-                    pattern: /\S(?:[\s\S]*\S)?/,
-                    inside: Prism2.languages.php
-                  }
-                }
-              }
-            }
-          }
-        }, markupLatte.tag);
-        Prism2.hooks.add("before-tokenize", function(env) {
-          if (env.language !== "latte") {
-            return;
-          }
-          var lattePattern = /\{\*[\s\S]*?\*\}|\{[^'"\s{}*](?:[^"'/{}]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|\/\*(?:[^*]|\*(?!\/))*\*\/)*\}/g;
-          Prism2.languages["markup-templating"].buildPlaceholders(env, "latte", lattePattern);
-          env.grammar = markupLatte;
-        });
-        Prism2.hooks.add("after-tokenize", function(env) {
-          Prism2.languages["markup-templating"].tokenizePlaceholders(env, "latte");
-        });
-      })(Prism);
-      Prism.languages.less = Prism.languages.extend("css", {
-        "comment": [
-          /\/\*[\s\S]*?\*\//,
-          {
-            pattern: /(^|[^\\])\/\/.*/,
-            lookbehind: true
-          }
-        ],
-        "atrule": {
-          pattern: /@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,
-          inside: {
-            "punctuation": /[:()]/
-          }
-        },
-        // selectors and mixins are considered the same
-        "selector": {
-          pattern: /(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,
-          inside: {
-            // mixin parameters
-            "variable": /@+[\w-]+/
-          }
-        },
-        "property": /(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,
-        "operator": /[+\-*\/]/
-      });
-      Prism.languages.insertBefore("less", "property", {
-        "variable": [
-          // Variable declaration (the colon must be consumed!)
-          {
-            pattern: /@[\w-]+\s*:/,
-            inside: {
-              "punctuation": /:/
-            }
-          },
-          // Variable usage
-          /@@?[\w-]+/
-        ],
-        "mixin-usage": {
-          pattern: /([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,
-          lookbehind: true,
-          alias: "function"
-        }
-      });
-      (function(Prism2) {
-        Prism2.languages.scheme = {
-          // this supports "normal" single-line comments:
-          //   ; comment
-          // and (potentially nested) multiline comments:
-          //   #| comment #| nested |# still comment |#
-          // (only 1 level of nesting is supported)
-          "comment": /;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,
-          "string": {
-            pattern: /"(?:[^"\\]|\\.)*"/,
-            greedy: true
-          },
-          "symbol": {
-            pattern: /'[^()\[\]#'\s]+/,
-            greedy: true
-          },
-          "char": {
-            pattern: /#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,
-            greedy: true
-          },
-          "lambda-parameter": [
-            // https://www.cs.cmu.edu/Groups/AI/html/r4rs/r4rs_6.html#SEC30
-            {
-              pattern: /((?:^|[^'`#])[(\[]lambda\s+)(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,
-              lookbehind: true
-            },
-            {
-              pattern: /((?:^|[^'`#])[(\[]lambda\s+[(\[])[^()\[\]']+/,
-              lookbehind: true
-            }
-          ],
-          "keyword": {
-            pattern: /((?:^|[^'`#])[(\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|except|export|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\[\]\s]|$)/,
-            lookbehind: true
-          },
-          "builtin": {
-            // all functions of the base library of R7RS plus some of built-ins of R5Rs
-            pattern: /((?:^|[^'`#])[(\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()\[\]\s]|$)/,
-            lookbehind: true
-          },
-          "operator": {
-            pattern: /((?:^|[^'`#])[(\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,
-            lookbehind: true
-          },
-          "number": {
-            // The number pattern from [the R7RS spec](https://small.r7rs.org/attachment/r7rs.pdf).
-            //
-            // <number>      := <num 2>|<num 8>|<num 10>|<num 16>
-            // <num R>       := <prefix R><complex R>
-            // <complex R>   := <real R>(?:@<real R>|<imaginary R>)?|<imaginary R>
-            // <imaginary R> := [+-](?:<ureal R>|(?:inf|nan)\.0)?i
-            // <real R>      := [+-]?<ureal R>|[+-](?:inf|nan)\.0
-            // <ureal R>     := <uint R>(?:\/<uint R>)?
-            //                | <decimal R>
-            //
-            // <decimal 10>  := (?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?
-            // <uint R>      := <digit R>+
-            // <prefix R>    := <radix R>(?:#[ei])?|(?:#[ei])?<radix R>
-            // <radix 2>     := #b
-            // <radix 8>     := #o
-            // <radix 10>    := (?:#d)?
-            // <radix 16>    := #x
-            // <digit 2>     := [01]
-            // <digit 8>     := [0-7]
-            // <digit 10>    := \d
-            // <digit 16>    := [0-9a-f]
-            //
-            // The problem with this grammar is that the resulting regex is way to complex, so we simplify by grouping all
-            // non-decimal bases together. This results in a decimal (dec) and combined binary, octal, and hexadecimal (box)
-            // pattern:
-            pattern: RegExp(SortedBNF({
-              "<ureal dec>": /\d+(?:\/\d+)|(?:\d+(?:\.\d*)?|\.\d+)(?:[esfdl][+-]?\d+)?/.source,
-              "<real dec>": /[+-]?<ureal dec>|[+-](?:inf|nan)\.0/.source,
-              "<imaginary dec>": /[+-](?:<ureal dec>|(?:inf|nan)\.0)?i/.source,
-              "<complex dec>": /<real dec>(?:@<real dec>|<imaginary dec>)?|<imaginary dec>/.source,
-              "<num dec>": /(?:#d(?:#[ei])?|#[ei](?:#d)?)?<complex dec>/.source,
-              "<ureal box>": /[0-9a-f]+(?:\/[0-9a-f]+)?/.source,
-              "<real box>": /[+-]?<ureal box>|[+-](?:inf|nan)\.0/.source,
-              "<imaginary box>": /[+-](?:<ureal box>|(?:inf|nan)\.0)?i/.source,
-              "<complex box>": /<real box>(?:@<real box>|<imaginary box>)?|<imaginary box>/.source,
-              "<num box>": /#[box](?:#[ei])?|(?:#[ei])?#[box]<complex box>/.source,
-              "<number>": /(^|[()\[\]\s])(?:<num dec>|<num box>)(?=[()\[\]\s]|$)/.source
-            }), "i"),
-            lookbehind: true
-          },
-          "boolean": {
-            pattern: /(^|[()\[\]\s])#(?:[ft]|false|true)(?=[()\[\]\s]|$)/,
-            lookbehind: true
-          },
-          "function": {
-            pattern: /((?:^|[^'`#])[(\[])(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()\[\]\s]|$)/,
-            lookbehind: true
-          },
-          "identifier": {
-            pattern: /(^|[()\[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()\[\]\s]|$)/,
-            lookbehind: true,
-            greedy: true
-          },
-          "punctuation": /[()\[\]']/
-        };
-        function SortedBNF(grammar) {
-          for (var key in grammar) {
-            grammar[key] = grammar[key].replace(/<[\w\s]+>/g, function(key2) {
-              return "(?:" + grammar[key2].trim() + ")";
-            });
-          }
-          return grammar[key];
-        }
-      })(Prism);
-      (function(Prism2) {
-        var schemeExpression = /\((?:[^();"#\\]|\\[\s\S]|;.*(?!.)|"(?:[^"\\]|\\.)*"|#(?:\{(?:(?!#\})[\s\S])*#\}|[^{])|<expr>)*\)/.source;
-        var recursivenessLog2 = 5;
-        for (var i = 0; i < recursivenessLog2; i++) {
-          schemeExpression = schemeExpression.replace(/<expr>/g, function() {
-            return schemeExpression;
-          });
-        }
-        schemeExpression = schemeExpression.replace(/<expr>/g, /[^\s\S]/.source);
-        var lilypond = Prism2.languages.lilypond = {
-          "comment": /%(?:(?!\{).*|\{[\s\S]*?%\})/,
-          "embedded-scheme": {
-            pattern: RegExp(/(^|[=\s])#(?:"(?:[^"\\]|\\.)*"|[^\s()"]*(?:[^\s()]|<expr>))/.source.replace(/<expr>/g, function() {
-              return schemeExpression;
-            }), "m"),
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "scheme": {
-                pattern: /^(#)[\s\S]+$/,
-                lookbehind: true,
-                alias: "language-scheme",
-                inside: {
-                  "embedded-lilypond": {
-                    pattern: /#\{[\s\S]*?#\}/,
-                    greedy: true,
-                    inside: {
-                      "punctuation": /^#\{|#\}$/,
-                      "lilypond": {
-                        pattern: /[\s\S]+/,
-                        alias: "language-lilypond",
-                        inside: null
-                        // see below
-                      }
-                    }
-                  },
-                  rest: Prism2.languages.scheme
-                }
-              },
-              "punctuation": /#/
-            }
-          },
-          "string": {
-            pattern: /"(?:[^"\\]|\\.)*"/,
-            greedy: true
-          },
-          "class-name": {
-            pattern: /(\\new\s+)[\w-]+/,
-            lookbehind: true
-          },
-          "keyword": {
-            pattern: /\\[a-z][-\w]*/i,
-            inside: {
-              "punctuation": /^\\/
-            }
-          },
-          "operator": /[=|]|<<|>>/,
-          "punctuation": {
-            pattern: /(^|[a-z\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\d))|[_^]\.?|[.!])|[{}()[\]<>^~]|\\[()[\]<>\\!]|--|__/,
-            lookbehind: true
-          },
-          "number": /\b\d+(?:\/\d+)?\b/
-        };
-        lilypond["embedded-scheme"].inside["scheme"].inside["embedded-lilypond"].inside["lilypond"].inside = lilypond;
-        Prism2.languages.ly = lilypond;
-      })(Prism);
-      Prism.languages.liquid = {
-        "comment": {
-          pattern: /(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,
-          lookbehind: true
-        },
-        "delimiter": {
-          pattern: /^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,
-          alias: "punctuation"
-        },
-        "string": {
-          pattern: /"[^"]*"|'[^']*'/,
-          greedy: true
-        },
-        "keyword": /\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,
-        "object": /\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,
-        "function": [
-          {
-            pattern: /(\|\s*)\w+/,
-            lookbehind: true,
-            alias: "filter"
-          },
-          {
-            // array functions
-            pattern: /(\.\s*)(?:first|last|size)/,
-            lookbehind: true
-          }
-        ],
-        "boolean": /\b(?:false|nil|true)\b/,
-        "range": {
-          pattern: /\.\./,
-          alias: "operator"
-        },
-        // https://github.com/Shopify/liquid/blob/698f5e0d967423e013f6169d9111bd969bd78337/lib/liquid/lexer.rb#L21
-        "number": /\b\d+(?:\.\d+)?\b/,
-        "operator": /[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,
-        "punctuation": /[.,\[\]()]/,
-        "empty": {
-          pattern: /\bempty\b/,
-          alias: "keyword"
-        }
-      };
-      Prism.hooks.add("before-tokenize", function(env) {
-        var liquidPattern = /\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g;
-        var insideRaw = false;
-        Prism.languages["markup-templating"].buildPlaceholders(env, "liquid", liquidPattern, function(match) {
-          var tagMatch = /^\{%-?\s*(\w+)/.exec(match);
-          if (tagMatch) {
-            var tag = tagMatch[1];
-            if (tag === "raw" && !insideRaw) {
-              insideRaw = true;
-              return true;
-            } else if (tag === "endraw") {
-              insideRaw = false;
-              return true;
-            }
-          }
-          return !insideRaw;
-        });
-      });
-      Prism.hooks.add("after-tokenize", function(env) {
-        Prism.languages["markup-templating"].tokenizePlaceholders(env, "liquid");
-      });
-      (function(Prism2) {
-        function simple_form(name) {
-          return RegExp(/(\()/.source + "(?:" + name + ")" + /(?=[\s\)])/.source);
-        }
-        function primitive(pattern) {
-          return RegExp(/([\s([])/.source + "(?:" + pattern + ")" + /(?=[\s)])/.source);
-        }
-        var symbol = /(?!\d)[-+*/~!@$%^=<>{}\w]+/.source;
-        var marker = "&" + symbol;
-        var par = "(\\()";
-        var endpar = "(?=\\))";
-        var space = "(?=\\s)";
-        var nestedPar = /(?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\))*\))*\))*/.source;
-        var language = {
-          // Three or four semicolons are considered a heading.
-          // See https://www.gnu.org/software/emacs/manual/html_node/elisp/Comment-Tips.html
-          heading: {
-            pattern: /;;;.*/,
-            alias: ["comment", "title"]
-          },
-          comment: /;.*/,
-          string: {
-            pattern: /"(?:[^"\\]|\\.)*"/,
-            greedy: true,
-            inside: {
-              argument: /[-A-Z]+(?=[.,\s])/,
-              symbol: RegExp("`" + symbol + "'")
-            }
-          },
-          "quoted-symbol": {
-            pattern: RegExp("#?'" + symbol),
-            alias: ["variable", "symbol"]
-          },
-          "lisp-property": {
-            pattern: RegExp(":" + symbol),
-            alias: "property"
-          },
-          splice: {
-            pattern: RegExp(",@?" + symbol),
-            alias: ["symbol", "variable"]
-          },
-          keyword: [
-            {
-              pattern: RegExp(
-                par + "(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)" + space
-              ),
-              lookbehind: true
-            },
-            {
-              pattern: RegExp(
-                par + "(?:append|by|collect|concat|do|finally|for|in|return)" + space
-              ),
-              lookbehind: true
-            }
-          ],
-          declare: {
-            pattern: simple_form(/declare/.source),
-            lookbehind: true,
-            alias: "keyword"
-          },
-          interactive: {
-            pattern: simple_form(/interactive/.source),
-            lookbehind: true,
-            alias: "keyword"
-          },
-          boolean: {
-            pattern: primitive(/nil|t/.source),
-            lookbehind: true
-          },
-          number: {
-            pattern: primitive(/[-+]?\d+(?:\.\d*)?/.source),
-            lookbehind: true
-          },
-          defvar: {
-            pattern: RegExp(par + "def(?:const|custom|group|var)\\s+" + symbol),
-            lookbehind: true,
-            inside: {
-              keyword: /^def[a-z]+/,
-              variable: RegExp(symbol)
-            }
-          },
-          defun: {
-            pattern: RegExp(par + /(?:cl-)?(?:defmacro|defun\*?)\s+/.source + symbol + /\s+\(/.source + nestedPar + /\)/.source),
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              keyword: /^(?:cl-)?def\S+/,
-              // See below, this property needs to be defined later so that it can
-              // reference the language object.
-              arguments: null,
-              function: {
-                pattern: RegExp("(^\\s)" + symbol),
-                lookbehind: true
-              },
-              punctuation: /[()]/
-            }
-          },
-          lambda: {
-            pattern: RegExp(par + "lambda\\s+\\(\\s*(?:&?" + symbol + "(?:\\s+&?" + symbol + ")*\\s*)?\\)"),
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              keyword: /^lambda/,
-              // See below, this property needs to be defined later so that it can
-              // reference the language object.
-              arguments: null,
-              punctuation: /[()]/
-            }
-          },
-          car: {
-            pattern: RegExp(par + symbol),
-            lookbehind: true
-          },
-          punctuation: [
-            // open paren, brackets, and close paren
-            /(?:['`,]?\(|[)\[\]])/,
-            // cons
-            {
-              pattern: /(\s)\.(?=\s)/,
-              lookbehind: true
-            }
-          ]
-        };
-        var arg = {
-          "lisp-marker": RegExp(marker),
-          "varform": {
-            pattern: RegExp(/\(/.source + symbol + /\s+(?=\S)/.source + nestedPar + /\)/.source),
-            inside: language
-          },
-          "argument": {
-            pattern: RegExp(/(^|[\s(])/.source + symbol),
-            lookbehind: true,
-            alias: "variable"
-          },
-          rest: language
-        };
-        var forms = "\\S+(?:\\s+\\S+)*";
-        var arglist = {
-          pattern: RegExp(par + nestedPar + endpar),
-          lookbehind: true,
-          inside: {
-            "rest-vars": {
-              pattern: RegExp("&(?:body|rest)\\s+" + forms),
-              inside: arg
-            },
-            "other-marker-vars": {
-              pattern: RegExp("&(?:aux|optional)\\s+" + forms),
-              inside: arg
-            },
-            keys: {
-              pattern: RegExp("&key\\s+" + forms + "(?:\\s+&allow-other-keys)?"),
-              inside: arg
-            },
-            argument: {
-              pattern: RegExp(symbol),
-              alias: "variable"
-            },
-            punctuation: /[()]/
-          }
-        };
-        language["lambda"].inside.arguments = arglist;
-        language["defun"].inside.arguments = Prism2.util.clone(arglist);
-        language["defun"].inside.arguments.inside.sublist = arglist;
-        Prism2.languages.lisp = language;
-        Prism2.languages.elisp = language;
-        Prism2.languages.emacs = language;
-        Prism2.languages["emacs-lisp"] = language;
-      })(Prism);
-      Prism.languages.livescript = {
-        "comment": [
-          {
-            pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
-            lookbehind: true
-          },
-          {
-            pattern: /(^|[^\\])#.*/,
-            lookbehind: true
-          }
-        ],
-        "interpolated-string": {
-          /* Look-behind and look-ahead prevents wrong behavior of the greedy pattern
-          * forcing it to match """-quoted string when it would otherwise match "-quoted first. */
-          pattern: /(^|[^"])("""|")(?:\\[\s\S]|(?!\2)[^\\])*\2(?!")/,
-          lookbehind: true,
-          greedy: true,
-          inside: {
-            "variable": {
-              pattern: /(^|[^\\])#[a-z_](?:-?[a-z]|[\d_])*/m,
-              lookbehind: true
-            },
-            "interpolation": {
-              pattern: /(^|[^\\])#\{[^}]+\}/m,
-              lookbehind: true,
-              inside: {
-                "interpolation-punctuation": {
-                  pattern: /^#\{|\}$/,
-                  alias: "variable"
-                }
-                // See rest below
-              }
-            },
-            "string": /[\s\S]+/
-          }
-        },
-        "string": [
-          {
-            pattern: /('''|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,
-            greedy: true
-          },
-          {
-            pattern: /<\[[\s\S]*?\]>/,
-            greedy: true
-          },
-          /\\[^\s,;\])}]+/
-        ],
-        "regex": [
-          {
-            pattern: /\/\/(?:\[[^\r\n\]]*\]|\\.|(?!\/\/)[^\\\[])+\/\/[gimyu]{0,5}/,
-            greedy: true,
-            inside: {
-              "comment": {
-                pattern: /(^|[^\\])#.*/,
-                lookbehind: true
-              }
-            }
-          },
-          {
-            pattern: /\/(?:\[[^\r\n\]]*\]|\\.|[^/\\\r\n\[])+\/[gimyu]{0,5}/,
-            greedy: true
-          }
-        ],
-        "keyword": {
-          pattern: /(^|(?!-).)\b(?:break|case|catch|class|const|continue|default|do|else|extends|fallthrough|finally|for(?: ever)?|function|if|implements|it|let|loop|new|null|otherwise|own|return|super|switch|that|then|this|throw|try|unless|until|var|void|when|while|yield)(?!-)\b/m,
-          lookbehind: true
-        },
-        "keyword-operator": {
-          pattern: /(^|[^-])\b(?:(?:delete|require|typeof)!|(?:and|by|delete|export|from|import(?: all)?|in|instanceof|is(?: not|nt)?|not|of|or|til|to|typeof|with|xor)(?!-)\b)/m,
-          lookbehind: true,
-          alias: "operator"
-        },
-        "boolean": {
-          pattern: /(^|[^-])\b(?:false|no|off|on|true|yes)(?!-)\b/m,
-          lookbehind: true
-        },
-        "argument": {
-          // Don't match .&. nor &&
-          pattern: /(^|(?!\.&\.)[^&])&(?!&)\d*/m,
-          lookbehind: true,
-          alias: "variable"
-        },
-        "number": /\b(?:\d+~[\da-z]+|\d[\d_]*(?:\.\d[\d_]*)?(?:[a-z]\w*)?)/i,
-        "identifier": /[a-z_](?:-?[a-z]|[\d_])*/i,
-        "operator": [
-          // Spaced .
-          {
-            pattern: /( )\.(?= )/,
-            lookbehind: true
-          },
-          // Full list, in order:
-          // .= .~ .. ...
-          // .&. .^. .<<. .>>. .>>>.
-          // := :: ::=
-          // &&
-          // || |>
-          // < << <<< <<<<
-          // <- <-- <-! <--!
-          // <~ <~~ <~! <~~!
-          // <| <= <?
-          // > >> >= >?
-          // - -- -> -->
-          // + ++
-          // @ @@
-          // % %%
-          // * **
-          // ! != !~=
-          // !~> !~~>
-          // !-> !-->
-          // ~ ~> ~~> ~=
-          // = ==
-          // ^ ^^
-          // / ?
-          /\.(?:[=~]|\.\.?)|\.(?:[&|^]|<<|>>>?)\.|:(?:=|:=?)|&&|\|[|>]|<(?:<<?<?|--?!?|~~?!?|[|=?])?|>[>=?]?|-(?:->?|>)?|\+\+?|@@?|%%?|\*\*?|!(?:~?=|--?>|~?~>)?|~(?:~?>|=)?|==?|\^\^?|[\/?]/
-        ],
-        "punctuation": /[(){}\[\]|.,:;`]/
-      };
-      Prism.languages.livescript["interpolated-string"].inside["interpolation"].inside.rest = Prism.languages.livescript;
-      (function(Prism2) {
-        Prism2.languages.llvm = {
-          "comment": /;.*/,
-          "string": {
-            pattern: /"[^"]*"/,
-            greedy: true
-          },
-          "boolean": /\b(?:false|true)\b/,
-          "variable": /[%@!#](?:(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+|\d+)/i,
-          "label": /(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+:/i,
-          "type": {
-            pattern: /\b(?:double|float|fp128|half|i[1-9]\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\b/,
-            alias: "class-name"
-          },
-          "keyword": /\b[a-z_][a-z_0-9]*\b/,
-          "number": /[+-]?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-Fa-f]+\b|\b0xK[\dA-Fa-f]{20}\b|\b0x[ML][\dA-Fa-f]{32}\b|\b0xH[\dA-Fa-f]{4}\b/,
-          "punctuation": /[{}[\];(),.!*=<>]/
-        };
-      })(Prism);
-      Prism.languages.log = {
-        "string": {
-          // Single-quoted strings must not be confused with plain text. E.g. Can't isn't Susan's Chris' toy
-          pattern: /"(?:[^"\\\r\n]|\\.)*"|'(?![st] | \w)(?:[^'\\\r\n]|\\.)*'/,
-          greedy: true
-        },
-        "exception": {
-          pattern: /(^|[^\w.])[a-z][\w.]*(?:Error|Exception):.*(?:(?:\r\n?|\n)[ \t]*(?:at[ \t].+|\.{3}.*|Caused by:.*))+(?:(?:\r\n?|\n)[ \t]*\.\.\. .*)?/,
-          lookbehind: true,
-          greedy: true,
-          alias: ["javastacktrace", "language-javastacktrace"],
-          inside: Prism.languages["javastacktrace"] || {
-            "keyword": /\bat\b/,
-            "function": /[a-z_][\w$]*(?=\()/,
-            "punctuation": /[.:()]/
-          }
-        },
-        "level": [
-          {
-            pattern: /\b(?:ALERT|CRIT|CRITICAL|EMERG|EMERGENCY|ERR|ERROR|FAILURE|FATAL|SEVERE)\b/,
-            alias: ["error", "important"]
-          },
-          {
-            pattern: /\b(?:WARN|WARNING|WRN)\b/,
-            alias: ["warning", "important"]
-          },
-          {
-            pattern: /\b(?:DISPLAY|INF|INFO|NOTICE|STATUS)\b/,
-            alias: ["info", "keyword"]
-          },
-          {
-            pattern: /\b(?:DBG|DEBUG|FINE)\b/,
-            alias: ["debug", "keyword"]
-          },
-          {
-            pattern: /\b(?:FINER|FINEST|TRACE|TRC|VERBOSE|VRB)\b/,
-            alias: ["trace", "comment"]
-          }
-        ],
-        "property": {
-          pattern: /((?:^|[\]|])[ \t]*)[a-z_](?:[\w-]|\b\/\b)*(?:[. ]\(?\w(?:[\w-]|\b\/\b)*\)?)*:(?=\s)/im,
-          lookbehind: true
-        },
-        "separator": {
-          pattern: /(^|[^-+])-{3,}|={3,}|\*{3,}|- - /m,
-          lookbehind: true,
-          alias: "comment"
-        },
-        "url": /\b(?:file|ftp|https?):\/\/[^\s|,;'"]*[^\s|,;'">.]/,
-        "email": {
-          pattern: /(^|\s)[-\w+.]+@[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+(?=\s)/,
-          lookbehind: true,
-          alias: "url"
-        },
-        "ip-address": {
-          pattern: /\b(?:\d{1,3}(?:\.\d{1,3}){3})\b/,
-          alias: "constant"
-        },
-        "mac-address": {
-          pattern: /\b[a-f0-9]{2}(?::[a-f0-9]{2}){5}\b/i,
-          alias: "constant"
-        },
-        "domain": {
-          pattern: /(^|\s)[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*\.[a-z][a-z0-9-]+(?=\s)/,
-          lookbehind: true,
-          alias: "constant"
-        },
-        "uuid": {
-          pattern: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,
-          alias: "constant"
-        },
-        "hash": {
-          pattern: /\b(?:[a-f0-9]{32}){1,2}\b/i,
-          alias: "constant"
-        },
-        "file-path": {
-          pattern: /\b[a-z]:[\\/][^\s|,;:(){}\[\]"']+|(^|[\s:\[\](>|])\.{0,2}\/\w[^\s|,;:(){}\[\]"']*/i,
-          lookbehind: true,
-          greedy: true,
-          alias: "string"
-        },
-        "date": {
-          pattern: RegExp(
-            /\b\d{4}[-/]\d{2}[-/]\d{2}(?:T(?=\d{1,2}:)|(?=\s\d{1,2}:))/.source + "|" + /\b\d{1,4}[-/ ](?:\d{1,2}|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)[-/ ]\d{2,4}T?\b/.source + "|" + /\b(?:(?:Fri|Mon|Sat|Sun|Thu|Tue|Wed)(?:\s{1,2}(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep))?|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)\s{1,2}\d{1,2}\b/.source,
-            "i"
-          ),
-          alias: "number"
-        },
-        "time": {
-          pattern: /\b\d{1,2}:\d{1,2}:\d{1,2}(?:[.,:]\d+)?(?:\s?[+-]\d{2}:?\d{2}|Z)?\b/,
-          alias: "number"
-        },
-        "boolean": /\b(?:false|null|true)\b/i,
-        "number": {
-          pattern: /(^|[^.\w])(?:0x[a-f0-9]+|0o[0-7]+|0b[01]+|v?\d[\da-f]*(?:\.\d+)*(?:e[+-]?\d+)?[a-z]{0,3}\b)\b(?!\.\w)/i,
-          lookbehind: true
-        },
-        "operator": /[;:?<=>~/@!$%&+\-|^(){}*#]/,
-        "punctuation": /[\[\].,]/
-      };
-      Prism.languages.lolcode = {
-        "comment": [
-          /\bOBTW\s[\s\S]*?\sTLDR\b/,
-          /\bBTW.+/
-        ],
-        "string": {
-          pattern: /"(?::.|[^":])*"/,
-          inside: {
-            "variable": /:\{[^}]+\}/,
-            "symbol": [
-              /:\([a-f\d]+\)/i,
-              /:\[[^\]]+\]/,
-              /:[)>o":]/
-            ]
-          },
-          greedy: true
-        },
-        "number": /(?:\B-)?(?:\b\d+(?:\.\d*)?|\B\.\d+)/,
-        "symbol": {
-          pattern: /(^|\s)(?:A )?(?:BUKKIT|NOOB|NUMBAR|NUMBR|TROOF|YARN)(?=\s|,|$)/,
-          lookbehind: true,
-          inside: {
-            "keyword": /A(?=\s)/
-          }
-        },
-        "label": {
-          pattern: /((?:^|\s)(?:IM IN YR|IM OUTTA YR) )[a-zA-Z]\w*/,
-          lookbehind: true,
-          alias: "string"
-        },
-        "function": {
-          pattern: /((?:^|\s)(?:HOW IZ I|I IZ|IZ) )[a-zA-Z]\w*/,
-          lookbehind: true
-        },
-        "keyword": [
-          {
-            pattern: /(^|\s)(?:AN|FOUND YR|GIMMEH|GTFO|HAI|HAS A|HOW IZ I|I HAS A|I IZ|IF U SAY SO|IM IN YR|IM OUTTA YR|IS NOW(?: A)?|ITZ(?: A)?|IZ|KTHX|KTHXBYE|LIEK(?: A)?|MAEK|MEBBE|MKAY|NERFIN|NO WAI|O HAI IM|O RLY\?|OIC|OMG|OMGWTF|R|SMOOSH|SRS|TIL|UPPIN|VISIBLE|WILE|WTF\?|YA RLY|YR)(?=\s|,|$)/,
-            lookbehind: true
-          },
-          /'Z(?=\s|,|$)/
-        ],
-        "boolean": {
-          pattern: /(^|\s)(?:FAIL|WIN)(?=\s|,|$)/,
-          lookbehind: true
-        },
-        "variable": {
-          pattern: /(^|\s)IT(?=\s|,|$)/,
-          lookbehind: true
-        },
-        "operator": {
-          pattern: /(^|\s)(?:NOT|BOTH SAEM|DIFFRINT|(?:ALL|ANY|BIGGR|BOTH|DIFF|EITHER|MOD|PRODUKT|QUOSHUNT|SMALLR|SUM|WON) OF)(?=\s|,|$)/,
-          lookbehind: true
-        },
-        "punctuation": /\.{3}|…|,|!/
-      };
-      Prism.languages.magma = {
-        "output": {
-          pattern: /^(>.*(?:\r(?:\n|(?!\n))|\n))(?!>)(?:.+|(?:\r(?:\n|(?!\n))|\n)(?!>).*)(?:(?:\r(?:\n|(?!\n))|\n)(?!>).*)*/m,
-          lookbehind: true,
-          greedy: true
-        },
-        "comment": {
-          pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
-          greedy: true
-        },
-        "string": {
-          pattern: /(^|[^\\"])"(?:[^\r\n\\"]|\\.)*"/,
-          lookbehind: true,
-          greedy: true
-        },
-        // http://magma.maths.usyd.edu.au/magma/handbook/text/82
-        "keyword": /\b(?:_|adj|and|assert|assert2|assert3|assigned|break|by|case|cat|catch|clear|cmpeq|cmpne|continue|declare|default|delete|diff|div|do|elif|else|end|eq|error|eval|exists|exit|for|forall|forward|fprintf|freeze|function|ge|gt|if|iload|import|in|intrinsic|is|join|le|load|local|lt|meet|mod|ne|not|notadj|notin|notsubset|or|print|printf|procedure|quit|random|read|readi|repeat|require|requirege|requirerange|restore|return|save|sdiff|select|subset|then|time|to|try|until|vprint|vprintf|vtime|when|where|while|xor)\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "generator": {
-          pattern: /\b[a-z_]\w*(?=\s*<)/i,
-          alias: "class-name"
-        },
-        "function": /\b[a-z_]\w*(?=\s*\()/i,
-        "number": {
-          pattern: /(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,
-          lookbehind: true
-        },
-        "operator": /->|[-+*/^~!|#=]|:=|\.\./,
-        "punctuation": /[()[\]{}<>,;.:]/
-      };
-      Prism.languages.makefile = {
-        "comment": {
-          pattern: /(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,
-          lookbehind: true
-        },
-        "string": {
-          pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
-          greedy: true
-        },
-        "builtin-target": {
-          pattern: /\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,
-          alias: "builtin"
-        },
-        "target": {
-          pattern: /^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,
-          alias: "symbol",
-          inside: {
-            "variable": /\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/
-          }
-        },
-        "variable": /\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,
-        // Directives
-        "keyword": /-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,
-        "function": {
-          pattern: /(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,
-          lookbehind: true
-        },
-        "operator": /(?:::|[?:+!])?=|[|@]/,
-        "punctuation": /[:;(){}]/
-      };
-      (function(Prism2) {
-        var inner = /(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;
-        function createInline(pattern) {
-          pattern = pattern.replace(/<inner>/g, function() {
-            return inner;
-          });
-          return RegExp(/((?:^|[^\\])(?:\\{2})*)/.source + "(?:" + pattern + ")");
-        }
-        var tableCell = /(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source;
-        var tableRow = /\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g, function() {
-          return tableCell;
-        });
-        var tableLine = /\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;
-        Prism2.languages.markdown = Prism2.languages.extend("markup", {});
-        Prism2.languages.insertBefore("markdown", "prolog", {
-          "front-matter-block": {
-            pattern: /(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "punctuation": /^---|---$/,
-              "front-matter": {
-                pattern: /\S+(?:\s+\S+)*/,
-                alias: ["yaml", "language-yaml"],
-                inside: Prism2.languages.yaml
-              }
-            }
-          },
-          "blockquote": {
-            // > ...
-            pattern: /^>(?:[\t ]*>)*/m,
-            alias: "punctuation"
-          },
-          "table": {
-            pattern: RegExp("^" + tableRow + tableLine + "(?:" + tableRow + ")*", "m"),
-            inside: {
-              "table-data-rows": {
-                pattern: RegExp("^(" + tableRow + tableLine + ")(?:" + tableRow + ")*$"),
-                lookbehind: true,
-                inside: {
-                  "table-data": {
-                    pattern: RegExp(tableCell),
-                    inside: Prism2.languages.markdown
-                  },
-                  "punctuation": /\|/
-                }
-              },
-              "table-line": {
-                pattern: RegExp("^(" + tableRow + ")" + tableLine + "$"),
-                lookbehind: true,
-                inside: {
-                  "punctuation": /\||:?-{3,}:?/
-                }
-              },
-              "table-header-row": {
-                pattern: RegExp("^" + tableRow + "$"),
-                inside: {
-                  "table-header": {
-                    pattern: RegExp(tableCell),
-                    alias: "important",
-                    inside: Prism2.languages.markdown
-                  },
-                  "punctuation": /\|/
-                }
-              }
-            }
-          },
-          "code": [
-            {
-              // Prefixed by 4 spaces or 1 tab and preceded by an empty line
-              pattern: /((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,
-              lookbehind: true,
-              alias: "keyword"
-            },
-            {
-              // ```optional language
-              // code block
-              // ```
-              pattern: /^```[\s\S]*?^```$/m,
-              greedy: true,
-              inside: {
-                "code-block": {
-                  pattern: /^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,
-                  lookbehind: true
-                },
-                "code-language": {
-                  pattern: /^(```).+/,
-                  lookbehind: true
-                },
-                "punctuation": /```/
-              }
-            }
-          ],
-          "title": [
-            {
-              // title 1
-              // =======
-              // title 2
-              // -------
-              pattern: /\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,
-              alias: "important",
-              inside: {
-                punctuation: /==+$|--+$/
-              }
-            },
-            {
-              // # title 1
-              // ###### title 6
-              pattern: /(^\s*)#.+/m,
-              lookbehind: true,
-              alias: "important",
-              inside: {
-                punctuation: /^#+|#+$/
-              }
-            }
-          ],
-          "hr": {
-            // ***
-            // ---
-            // * * *
-            // -----------
-            pattern: /(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,
-            lookbehind: true,
-            alias: "punctuation"
-          },
-          "list": {
-            // * item
-            // + item
-            // - item
-            // 1. item
-            pattern: /(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,
-            lookbehind: true,
-            alias: "punctuation"
-          },
-          "url-reference": {
-            // [id]: http://example.com "Optional title"
-            // [id]: http://example.com 'Optional title'
-            // [id]: http://example.com (Optional title)
-            // [id]: <http://example.com> "Optional title"
-            pattern: /!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,
-            inside: {
-              "variable": {
-                pattern: /^(!?\[)[^\]]+/,
-                lookbehind: true
-              },
-              "string": /(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,
-              "punctuation": /^[\[\]!:]|[<>]/
-            },
-            alias: "url"
-          },
-          "bold": {
-            // **strong**
-            // __strong__
-            // allow one nested instance of italic text using the same delimiter
-            pattern: createInline(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "content": {
-                pattern: /(^..)[\s\S]+(?=..$)/,
-                lookbehind: true,
-                inside: {}
-                // see below
-              },
-              "punctuation": /\*\*|__/
-            }
-          },
-          "italic": {
-            // *em*
-            // _em_
-            // allow one nested instance of bold text using the same delimiter
-            pattern: createInline(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "content": {
-                pattern: /(^.)[\s\S]+(?=.$)/,
-                lookbehind: true,
-                inside: {}
-                // see below
-              },
-              "punctuation": /[*_]/
-            }
-          },
-          "strike": {
-            // ~~strike through~~
-            // ~strike~
-            // eslint-disable-next-line regexp/strict
-            pattern: createInline(/(~~?)(?:(?!~)<inner>)+\2/.source),
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "content": {
-                pattern: /(^~~?)[\s\S]+(?=\1$)/,
-                lookbehind: true,
-                inside: {}
-                // see below
-              },
-              "punctuation": /~~?/
-            }
-          },
-          "code-snippet": {
-            // `code`
-            // ``code``
-            pattern: /(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,
-            lookbehind: true,
-            greedy: true,
-            alias: ["code", "keyword"]
-          },
-          "url": {
-            // [example](http://example.com "Optional title")
-            // [example][id]
-            // [example] [id]
-            pattern: createInline(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "operator": /^!/,
-              "content": {
-                pattern: /(^\[)[^\]]+(?=\])/,
-                lookbehind: true,
-                inside: {}
-                // see below
-              },
-              "variable": {
-                pattern: /(^\][ \t]?\[)[^\]]+(?=\]$)/,
-                lookbehind: true
-              },
-              "url": {
-                pattern: /(^\]\()[^\s)]+/,
-                lookbehind: true
-              },
-              "string": {
-                pattern: /(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,
-                lookbehind: true
-              }
-            }
-          }
-        });
-        ["url", "bold", "italic", "strike"].forEach(function(token) {
-          ["url", "bold", "italic", "strike", "code-snippet"].forEach(function(inside) {
-            if (token !== inside) {
-              Prism2.languages.markdown[token].inside.content.inside[inside] = Prism2.languages.markdown[inside];
-            }
-          });
-        });
-        Prism2.hooks.add("after-tokenize", function(env) {
-          if (env.language !== "markdown" && env.language !== "md") {
-            return;
-          }
-          function walkTokens(tokens) {
-            if (!tokens || typeof tokens === "string") {
-              return;
-            }
-            for (var i = 0, l = tokens.length; i < l; i++) {
-              var token = tokens[i];
-              if (token.type !== "code") {
-                walkTokens(token.content);
-                continue;
-              }
-              var codeLang = token.content[1];
-              var codeBlock = token.content[3];
-              if (codeLang && codeBlock && codeLang.type === "code-language" && codeBlock.type === "code-block" && typeof codeLang.content === "string") {
-                var lang = codeLang.content.replace(/\b#/g, "sharp").replace(/\b\+\+/g, "pp");
-                lang = (/[a-z][\w-]*/i.exec(lang) || [""])[0].toLowerCase();
-                var alias = "language-" + lang;
-                if (!codeBlock.alias) {
-                  codeBlock.alias = [alias];
-                } else if (typeof codeBlock.alias === "string") {
-                  codeBlock.alias = [codeBlock.alias, alias];
-                } else {
-                  codeBlock.alias.push(alias);
-                }
-              }
-            }
-          }
-          walkTokens(env.tokens);
-        });
-        Prism2.hooks.add("wrap", function(env) {
-          if (env.type !== "code-block") {
-            return;
-          }
-          var codeLang = "";
-          for (var i = 0, l = env.classes.length; i < l; i++) {
-            var cls = env.classes[i];
-            var match = /language-(.+)/.exec(cls);
-            if (match) {
-              codeLang = match[1];
-              break;
-            }
-          }
-          var grammar = Prism2.languages[codeLang];
-          if (!grammar) {
-            if (codeLang && codeLang !== "none" && Prism2.plugins.autoloader) {
-              var id = "md-" + (/* @__PURE__ */ new Date()).valueOf() + "-" + Math.floor(Math.random() * 1e16);
-              env.attributes["id"] = id;
-              Prism2.plugins.autoloader.loadLanguages(codeLang, function() {
-                var ele = document.getElementById(id);
-                if (ele) {
-                  ele.innerHTML = Prism2.highlight(ele.textContent, Prism2.languages[codeLang], codeLang);
-                }
-              });
-            }
-          } else {
-            env.content = Prism2.highlight(textContent(env.content), grammar, codeLang);
-          }
-        });
-        var tagPattern = RegExp(Prism2.languages.markup.tag.pattern.source, "gi");
-        var KNOWN_ENTITY_NAMES = {
-          "amp": "&",
-          "lt": "<",
-          "gt": ">",
-          "quot": '"'
-        };
-        var fromCodePoint = String.fromCodePoint || String.fromCharCode;
-        function textContent(html) {
-          var text = html.replace(tagPattern, "");
-          text = text.replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi, function(m, code) {
-            code = code.toLowerCase();
-            if (code[0] === "#") {
-              var value;
-              if (code[1] === "x") {
-                value = parseInt(code.slice(2), 16);
-              } else {
-                value = Number(code.slice(1));
-              }
-              return fromCodePoint(value);
-            } else {
-              var known = KNOWN_ENTITY_NAMES[code];
-              if (known) {
-                return known;
-              }
-              return m;
-            }
-          });
-          return text;
-        }
-        Prism2.languages.md = Prism2.languages.markdown;
-      })(Prism);
-      (function(Prism2) {
-        var orgType = /\b(?:(?:col|row)?vector|matrix|scalar)\b/.source;
-        var type = /\bvoid\b|<org>|\b(?:complex|numeric|pointer(?:\s*\([^()]*\))?|real|string|(?:class|struct)\s+\w+|transmorphic)(?:\s*<org>)?/.source.replace(/<org>/g, orgType);
-        Prism2.languages.mata = {
-          "comment": {
-            pattern: /\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,
-            greedy: true
-          },
-          "string": {
-            pattern: /"[^"\r\n]*"|[‘`']".*?"[’`']/,
-            greedy: true
-          },
-          "class-name": {
-            pattern: /(\b(?:class|extends|struct)\s+)\w+(?=\s*(?:\{|\bextends\b))/,
-            lookbehind: true
-          },
-          "type": {
-            pattern: RegExp(type),
-            alias: "class-name",
-            inside: {
-              "punctuation": /[()]/,
-              "keyword": /\b(?:class|function|struct|void)\b/
-            }
-          },
-          "keyword": /\b(?:break|class|continue|do|else|end|extends|external|final|for|function|goto|if|pragma|private|protected|public|return|static|struct|unset|unused|version|virtual|while)\b/,
-          "constant": /\bNULL\b/,
-          "number": {
-            pattern: /(^|[^\w.])(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|\d[a-f0-9]*(?:\.[a-f0-9]+)?x[+-]?\d+)i?(?![\w.])/i,
-            lookbehind: true
-          },
-          "missing": {
-            pattern: /(^|[^\w.])(?:\.[a-z]?)(?![\w.])/,
-            lookbehind: true,
-            alias: "symbol"
-          },
-          "function": /\b[a-z_]\w*(?=\s*\()/i,
-          "operator": /\.\.|\+\+|--|&&|\|\||:?(?:[!=<>]=|[+\-*/^<>&|:])|[!?=\\#’`']/,
-          "punctuation": /[()[\]{},;.]/
-        };
-      })(Prism);
-      Prism.languages.matlab = {
-        "comment": [
-          /%\{[\s\S]*?\}%/,
-          /%.+/
-        ],
-        "string": {
-          pattern: /\B'(?:''|[^'\r\n])*'/,
-          greedy: true
-        },
-        // FIXME We could handle imaginary numbers as a whole
-        "number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?(?:[ij])?|\b[ij]\b/,
-        "keyword": /\b(?:NaN|break|case|catch|continue|else|elseif|end|for|function|if|inf|otherwise|parfor|pause|pi|return|switch|try|while)\b/,
-        "function": /\b(?!\d)\w+(?=\s*\()/,
-        "operator": /\.?[*^\/\\']|[+\-:@]|[<>=~]=?|&&?|\|\|?/,
-        "punctuation": /\.{3}|[.,;\[\](){}!]/
-      };
-      (function(Prism2) {
-        var keywords = /\b(?:about|and|animate|as|at|attributes|by|case|catch|collect|continue|coordsys|do|else|exit|fn|for|from|function|global|if|in|local|macroscript|mapped|max|not|of|off|on|or|parameters|persistent|plugin|rcmenu|return|rollout|set|struct|then|throw|to|tool|try|undo|utility|when|where|while|with)\b/i;
-        Prism2.languages.maxscript = {
-          "comment": {
-            pattern: /\/\*[\s\S]*?(?:\*\/|$)|--.*/,
-            greedy: true
-          },
-          "string": {
-            pattern: /(^|[^"\\@])(?:"(?:[^"\\]|\\[\s\S])*"|@"[^"]*")/,
-            lookbehind: true,
-            greedy: true
-          },
-          "path": {
-            pattern: /\$(?:[\w/\\.*?]|'[^']*')*/,
-            greedy: true,
-            alias: "string"
-          },
-          "function-call": {
-            pattern: RegExp(
-              "((?:" + // start of line
-              (/^/.source + "|" + // operators and other language constructs
-              /[;=<>+\-*/^({\[]/.source + "|" + // keywords as part of statements
-              /\b(?:and|by|case|catch|collect|do|else|if|in|not|or|return|then|to|try|where|while|with)\b/.source) + ")[ 	]*)(?!" + keywords.source + ")" + /[a-z_]\w*\b/.source + "(?=[ 	]*(?:" + // variable
-              ("(?!" + keywords.source + ")" + /[a-z_]/.source + "|" + // number
-              /\d|-\.?\d/.source + "|" + // other expressions or literals
-              /[({'"$@#?]/.source) + "))",
-              "im"
-            ),
-            lookbehind: true,
-            greedy: true,
-            alias: "function"
-          },
-          "function-definition": {
-            pattern: /(\b(?:fn|function)\s+)\w+\b/i,
-            lookbehind: true,
-            alias: "function"
-          },
-          "argument": {
-            pattern: /\b[a-z_]\w*(?=:)/i,
-            alias: "attr-name"
-          },
-          "keyword": keywords,
-          "boolean": /\b(?:false|true)\b/,
-          "time": {
-            pattern: /(^|[^\w.])(?:(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?[msft])+|\d+:\d+(?:\.\d*)?)(?![\w.:])/,
-            lookbehind: true,
-            alias: "number"
-          },
-          "number": [
-            {
-              pattern: /(^|[^\w.])(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?|0x[a-fA-F0-9]+)(?![\w.:])/,
-              lookbehind: true
-            },
-            /\b(?:e|pi)\b/
-          ],
-          "constant": /\b(?:dontcollect|ok|silentValue|undefined|unsupplied)\b/,
-          "color": {
-            pattern: /\b(?:black|blue|brown|gray|green|orange|red|white|yellow)\b/i,
-            alias: "constant"
-          },
-          "operator": /[-+*/<>=!]=?|[&^?]|#(?!\()/,
-          "punctuation": /[()\[\]{}.:,;]|#(?=\()|\\$/m
-        };
-      })(Prism);
-      Prism.languages.mel = {
-        "comment": {
-          pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
-          greedy: true
-        },
-        "code": {
-          pattern: /`(?:\\.|[^\\`])*`/,
-          greedy: true,
-          alias: "italic",
-          inside: {
-            "delimiter": {
-              pattern: /^`|`$/,
-              alias: "punctuation"
-            },
-            "statement": {
-              pattern: /[\s\S]+/,
-              inside: null
-              // see below
-            }
-          }
-        },
-        "string": {
-          pattern: /"(?:\\.|[^\\"\r\n])*"/,
-          greedy: true
-        },
-        "variable": /\$\w+/,
-        "number": /\b0x[\da-fA-F]+\b|\b\d+(?:\.\d*)?|\B\.\d+/,
-        "flag": {
-          pattern: /-[^\d\W]\w*/,
-          alias: "operator"
-        },
-        "keyword": /\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/,
-        "function": {
-          pattern: /((?:^|[{;])[ \t]*)[a-z_]\w*\b(?!\s*(?:\.(?!\.)|[[{=]))|\b[a-z_]\w*(?=[ \t]*\()/im,
-          lookbehind: true,
-          greedy: true
-        },
-        "tensor-punctuation": {
-          pattern: /<<|>>/,
-          alias: "punctuation"
-        },
-        "operator": /\+[+=]?|-[-=]?|&&|\|\||[<>]=?|[*\/!=]=?|[%^]/,
-        "punctuation": /[.,:;?\[\](){}]/
-      };
-      Prism.languages.mel["code"].inside["statement"].inside = Prism.languages.mel;
-      Prism.languages.mermaid = {
-        "comment": {
-          pattern: /%%.*/,
-          greedy: true
-        },
-        "style": {
-          pattern: /^([ \t]*(?:classDef|linkStyle|style)[ \t]+[\w$-]+[ \t]+)\w.*[^\s;]/m,
-          lookbehind: true,
-          inside: {
-            "property": /\b\w[\w-]*(?=[ \t]*:)/,
-            "operator": /:/,
-            "punctuation": /,/
-          }
-        },
-        "inter-arrow-label": {
-          pattern: /([^<>ox.=-])(?:-[-.]|==)(?![<>ox.=-])[ \t]*(?:"[^"\r\n]*"|[^\s".=-](?:[^\r\n.=-]*[^\s.=-])?)[ \t]*(?:\.+->?|--+[->]|==+[=>])(?![<>ox.=-])/,
-          lookbehind: true,
-          greedy: true,
-          inside: {
-            "arrow": {
-              pattern: /(?:\.+->?|--+[->]|==+[=>])$/,
-              alias: "operator"
-            },
-            "label": {
-              pattern: /^([\s\S]{2}[ \t]*)\S(?:[\s\S]*\S)?/,
-              lookbehind: true,
-              alias: "property"
-            },
-            "arrow-head": {
-              pattern: /^\S+/,
-              alias: ["arrow", "operator"]
-            }
-          }
-        },
-        "arrow": [
-          // This might look complex but it really isn't.
-          // There are many possible arrows (see tests) and it's impossible to fit all of them into one pattern. The
-          // problem is that we only have one lookbehind per pattern. However, we cannot disallow too many arrow
-          // characters in the one lookbehind because that would create too many false negatives. So we have to split the
-          // arrows into different patterns.
-          {
-            // ER diagram
-            pattern: /(^|[^{}|o.-])[|}][|o](?:--|\.\.)[|o][|{](?![{}|o.-])/,
-            lookbehind: true,
-            alias: "operator"
-          },
-          {
-            // flow chart
-            // (?:==+|--+|-\.*-)
-            pattern: /(^|[^<>ox.=-])(?:[<ox](?:==+|--+|-\.*-)[>ox]?|(?:==+|--+|-\.*-)[>ox]|===+|---+|-\.+-)(?![<>ox.=-])/,
-            lookbehind: true,
-            alias: "operator"
-          },
-          {
-            // sequence diagram
-            pattern: /(^|[^<>()x-])(?:--?(?:>>|[x>)])(?![<>()x])|(?:<<|[x<(])--?(?!-))/,
-            lookbehind: true,
-            alias: "operator"
-          },
-          {
-            // class diagram
-            pattern: /(^|[^<>|*o.-])(?:[*o]--|--[*o]|<\|?(?:--|\.\.)|(?:--|\.\.)\|?>|--|\.\.)(?![<>|*o.-])/,
-            lookbehind: true,
-            alias: "operator"
-          }
-        ],
-        "label": {
-          pattern: /(^|[^|<])\|(?:[^\r\n"|]|"[^"\r\n]*")+\|/,
-          lookbehind: true,
-          greedy: true,
-          alias: "property"
-        },
-        "text": {
-          pattern: /(?:[(\[{]+|\b>)(?:[^\r\n"()\[\]{}]|"[^"\r\n]*")+(?:[)\]}]+|>)/,
-          alias: "string"
-        },
-        "string": {
-          pattern: /"[^"\r\n]*"/,
-          greedy: true
-        },
-        "annotation": {
-          pattern: /<<(?:abstract|choice|enumeration|fork|interface|join|service)>>|\[\[(?:choice|fork|join)\]\]/i,
-          alias: "important"
-        },
-        "keyword": [
-          // This language has both case-sensitive and case-insensitive keywords
-          {
-            pattern: /(^[ \t]*)(?:action|callback|class|classDef|classDiagram|click|direction|erDiagram|flowchart|gantt|gitGraph|graph|journey|link|linkStyle|pie|requirementDiagram|sequenceDiagram|stateDiagram|stateDiagram-v2|style|subgraph)(?![\w$-])/m,
-            lookbehind: true,
-            greedy: true
-          },
-          {
-            pattern: /(^[ \t]*)(?:activate|alt|and|as|autonumber|deactivate|else|end(?:[ \t]+note)?|loop|opt|par|participant|rect|state|note[ \t]+(?:over|(?:left|right)[ \t]+of))(?![\w$-])/im,
-            lookbehind: true,
-            greedy: true
-          }
-        ],
-        "entity": /#[a-z0-9]+;/,
-        "operator": {
-          pattern: /(\w[ \t]*)&(?=[ \t]*\w)|:::|:/,
-          lookbehind: true
-        },
-        "punctuation": /[(){};]/
-      };
-      Prism.languages.mizar = {
-        "comment": /::.+/,
-        "keyword": /@proof\b|\b(?:according|aggregate|all|and|antonym|are|as|associativity|assume|asymmetry|attr|be|begin|being|by|canceled|case|cases|clusters?|coherence|commutativity|compatibility|connectedness|consider|consistency|constructors|contradiction|correctness|def|deffunc|define|definitions?|defpred|do|does|end|environ|equals|ex|exactly|existence|for|from|func|given|hence|hereby|holds|idempotence|identity|iff?|implies|involutiveness|irreflexivity|is|it|let|means|mode|non|not|notations?|now|of|or|otherwise|over|per|pred|prefix|projectivity|proof|provided|qua|reconsider|redefine|reduce|reducibility|reflexivity|registrations?|requirements|reserve|sch|schemes?|section|selector|set|sethood|st|struct|such|suppose|symmetry|synonym|take|that|the|then|theorems?|thesis|thus|to|transitivity|uniqueness|vocabular(?:ies|y)|when|where|with|wrt)\b/,
-        "parameter": {
-          pattern: /\$(?:10|\d)/,
-          alias: "variable"
-        },
-        "variable": /\b\w+(?=:)/,
-        "number": /(?:\b|-)\d+\b/,
-        "operator": /\.\.\.|->|&|\.?=/,
-        "punctuation": /\(#|#\)|[,:;\[\](){}]/
-      };
-      (function(Prism2) {
-        var operators = [
-          // query and projection
-          "$eq",
-          "$gt",
-          "$gte",
-          "$in",
-          "$lt",
-          "$lte",
-          "$ne",
-          "$nin",
-          "$and",
-          "$not",
-          "$nor",
-          "$or",
-          "$exists",
-          "$type",
-          "$expr",
-          "$jsonSchema",
-          "$mod",
-          "$regex",
-          "$text",
-          "$where",
-          "$geoIntersects",
-          "$geoWithin",
-          "$near",
-          "$nearSphere",
-          "$all",
-          "$elemMatch",
-          "$size",
-          "$bitsAllClear",
-          "$bitsAllSet",
-          "$bitsAnyClear",
-          "$bitsAnySet",
-          "$comment",
-          "$elemMatch",
-          "$meta",
-          "$slice",
-          // update
-          "$currentDate",
-          "$inc",
-          "$min",
-          "$max",
-          "$mul",
-          "$rename",
-          "$set",
-          "$setOnInsert",
-          "$unset",
-          "$addToSet",
-          "$pop",
-          "$pull",
-          "$push",
-          "$pullAll",
-          "$each",
-          "$position",
-          "$slice",
-          "$sort",
-          "$bit",
-          // aggregation pipeline stages
-          "$addFields",
-          "$bucket",
-          "$bucketAuto",
-          "$collStats",
-          "$count",
-          "$currentOp",
-          "$facet",
-          "$geoNear",
-          "$graphLookup",
-          "$group",
-          "$indexStats",
-          "$limit",
-          "$listLocalSessions",
-          "$listSessions",
-          "$lookup",
-          "$match",
-          "$merge",
-          "$out",
-          "$planCacheStats",
-          "$project",
-          "$redact",
-          "$replaceRoot",
-          "$replaceWith",
-          "$sample",
-          "$set",
-          "$skip",
-          "$sort",
-          "$sortByCount",
-          "$unionWith",
-          "$unset",
-          "$unwind",
-          "$setWindowFields",
-          // aggregation pipeline operators
-          "$abs",
-          "$accumulator",
-          "$acos",
-          "$acosh",
-          "$add",
-          "$addToSet",
-          "$allElementsTrue",
-          "$and",
-          "$anyElementTrue",
-          "$arrayElemAt",
-          "$arrayToObject",
-          "$asin",
-          "$asinh",
-          "$atan",
-          "$atan2",
-          "$atanh",
-          "$avg",
-          "$binarySize",
-          "$bsonSize",
-          "$ceil",
-          "$cmp",
-          "$concat",
-          "$concatArrays",
-          "$cond",
-          "$convert",
-          "$cos",
-          "$dateFromParts",
-          "$dateToParts",
-          "$dateFromString",
-          "$dateToString",
-          "$dayOfMonth",
-          "$dayOfWeek",
-          "$dayOfYear",
-          "$degreesToRadians",
-          "$divide",
-          "$eq",
-          "$exp",
-          "$filter",
-          "$first",
-          "$floor",
-          "$function",
-          "$gt",
-          "$gte",
-          "$hour",
-          "$ifNull",
-          "$in",
-          "$indexOfArray",
-          "$indexOfBytes",
-          "$indexOfCP",
-          "$isArray",
-          "$isNumber",
-          "$isoDayOfWeek",
-          "$isoWeek",
-          "$isoWeekYear",
-          "$last",
-          "$last",
-          "$let",
-          "$literal",
-          "$ln",
-          "$log",
-          "$log10",
-          "$lt",
-          "$lte",
-          "$ltrim",
-          "$map",
-          "$max",
-          "$mergeObjects",
-          "$meta",
-          "$min",
-          "$millisecond",
-          "$minute",
-          "$mod",
-          "$month",
-          "$multiply",
-          "$ne",
-          "$not",
-          "$objectToArray",
-          "$or",
-          "$pow",
-          "$push",
-          "$radiansToDegrees",
-          "$range",
-          "$reduce",
-          "$regexFind",
-          "$regexFindAll",
-          "$regexMatch",
-          "$replaceOne",
-          "$replaceAll",
-          "$reverseArray",
-          "$round",
-          "$rtrim",
-          "$second",
-          "$setDifference",
-          "$setEquals",
-          "$setIntersection",
-          "$setIsSubset",
-          "$setUnion",
-          "$size",
-          "$sin",
-          "$slice",
-          "$split",
-          "$sqrt",
-          "$stdDevPop",
-          "$stdDevSamp",
-          "$strcasecmp",
-          "$strLenBytes",
-          "$strLenCP",
-          "$substr",
-          "$substrBytes",
-          "$substrCP",
-          "$subtract",
-          "$sum",
-          "$switch",
-          "$tan",
-          "$toBool",
-          "$toDate",
-          "$toDecimal",
-          "$toDouble",
-          "$toInt",
-          "$toLong",
-          "$toObjectId",
-          "$toString",
-          "$toLower",
-          "$toUpper",
-          "$trim",
-          "$trunc",
-          "$type",
-          "$week",
-          "$year",
-          "$zip",
-          "$count",
-          "$dateAdd",
-          "$dateDiff",
-          "$dateSubtract",
-          "$dateTrunc",
-          "$getField",
-          "$rand",
-          "$sampleRate",
-          "$setField",
-          "$unsetField",
-          // aggregation pipeline query modifiers
-          "$comment",
-          "$explain",
-          "$hint",
-          "$max",
-          "$maxTimeMS",
-          "$min",
-          "$orderby",
-          "$query",
-          "$returnKey",
-          "$showDiskLoc",
-          "$natural"
-        ];
-        var builtinFunctions = [
-          "ObjectId",
-          "Code",
-          "BinData",
-          "DBRef",
-          "Timestamp",
-          "NumberLong",
-          "NumberDecimal",
-          "MaxKey",
-          "MinKey",
-          "RegExp",
-          "ISODate",
-          "UUID"
-        ];
-        operators = operators.map(function(operator) {
-          return operator.replace("$", "\\$");
-        });
-        var operatorsSource = "(?:" + operators.join("|") + ")\\b";
-        Prism2.languages.mongodb = Prism2.languages.extend("javascript", {});
-        Prism2.languages.insertBefore("mongodb", "string", {
-          "property": {
-            pattern: /(?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)(?=\s*:)/,
-            greedy: true,
-            inside: {
-              "keyword": RegExp(`^(['"])?` + operatorsSource + "(?:\\1)?$")
-            }
-          }
-        });
-        Prism2.languages.mongodb.string.inside = {
-          url: {
-            // url pattern
-            pattern: /https?:\/\/[-\w@:%.+~#=]{1,256}\.[a-z0-9()]{1,6}\b[-\w()@:%+.~#?&/=]*/i,
-            greedy: true
-          },
-          entity: {
-            // ipv4
-            pattern: /\b(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d\d?|2[0-4]\d|25[0-5])\b/,
-            greedy: true
-          }
-        };
-        Prism2.languages.insertBefore("mongodb", "constant", {
-          "builtin": {
-            pattern: RegExp("\\b(?:" + builtinFunctions.join("|") + ")\\b"),
-            alias: "keyword"
-          }
-        });
-      })(Prism);
-      Prism.languages.monkey = {
-        "comment": {
-          pattern: /^#Rem\s[\s\S]*?^#End|'.+/im,
-          greedy: true
-        },
-        "string": {
-          pattern: /"[^"\r\n]*"/,
-          greedy: true
-        },
-        "preprocessor": {
-          pattern: /(^[ \t]*)#.+/m,
-          lookbehind: true,
-          greedy: true,
-          alias: "property"
-        },
-        "function": /\b\w+(?=\()/,
-        "type-char": {
-          pattern: /\b[?%#$]/,
-          alias: "class-name"
-        },
-        "number": {
-          pattern: /((?:\.\.)?)(?:(?:\b|\B-\.?|\B\.)\d+(?:(?!\.\.)\.\d*)?|\$[\da-f]+)/i,
-          lookbehind: true
-        },
-        "keyword": /\b(?:Abstract|Array|Bool|Case|Catch|Class|Const|Continue|Default|Eachin|Else|ElseIf|End|EndIf|Exit|Extends|Extern|False|Field|Final|Float|For|Forever|Function|Global|If|Implements|Import|Inline|Int|Interface|Local|Method|Module|New|Next|Null|Object|Private|Property|Public|Repeat|Return|Select|Self|Step|Strict|String|Super|Then|Throw|To|True|Try|Until|Void|Wend|While)\b/i,
-        "operator": /\.\.|<[=>]?|>=?|:?=|(?:[+\-*\/&~|]|\b(?:Mod|Shl|Shr)\b)=?|\b(?:And|Not|Or)\b/i,
-        "punctuation": /[.,:;()\[\]]/
-      };
-      Prism.languages.moonscript = {
-        "comment": /--.*/,
-        "string": [
-          {
-            pattern: /'[^']*'|\[(=*)\[[\s\S]*?\]\1\]/,
-            greedy: true
-          },
-          {
-            pattern: /"[^"]*"/,
-            greedy: true,
-            inside: {
-              "interpolation": {
-                pattern: /#\{[^{}]*\}/,
-                inside: {
-                  "moonscript": {
-                    pattern: /(^#\{)[\s\S]+(?=\})/,
-                    lookbehind: true,
-                    inside: null
-                    // see beow
-                  },
-                  "interpolation-punctuation": {
-                    pattern: /#\{|\}/,
-                    alias: "punctuation"
-                  }
-                }
-              }
-            }
-          }
-        ],
-        "class-name": [
-          {
-            pattern: /(\b(?:class|extends)[ \t]+)\w+/,
-            lookbehind: true
-          },
-          // class-like names start with a capital letter
-          /\b[A-Z]\w*/
-        ],
-        "keyword": /\b(?:class|continue|do|else|elseif|export|extends|for|from|if|import|in|local|nil|return|self|super|switch|then|unless|using|when|while|with)\b/,
-        "variable": /@@?\w*/,
-        "property": {
-          pattern: /\b(?!\d)\w+(?=:)|(:)(?!\d)\w+/,
-          lookbehind: true
-        },
-        "function": {
-          pattern: /\b(?:_G|_VERSION|assert|collectgarbage|coroutine\.(?:create|resume|running|status|wrap|yield)|debug\.(?:debug|getfenv|gethook|getinfo|getlocal|getmetatable|getregistry|getupvalue|setfenv|sethook|setlocal|setmetatable|setupvalue|traceback)|dofile|error|getfenv|getmetatable|io\.(?:close|flush|input|lines|open|output|popen|read|stderr|stdin|stdout|tmpfile|type|write)|ipairs|load|loadfile|loadstring|math\.(?:abs|acos|asin|atan|atan2|ceil|cos|cosh|deg|exp|floor|fmod|frexp|ldexp|log|log10|max|min|modf|pi|pow|rad|random|randomseed|sin|sinh|sqrt|tan|tanh)|module|next|os\.(?:clock|date|difftime|execute|exit|getenv|remove|rename|setlocale|time|tmpname)|package\.(?:cpath|loaded|loadlib|path|preload|seeall)|pairs|pcall|print|rawequal|rawget|rawset|require|select|setfenv|setmetatable|string\.(?:byte|char|dump|find|format|gmatch|gsub|len|lower|match|rep|reverse|sub|upper)|table\.(?:concat|insert|maxn|remove|sort)|tonumber|tostring|type|unpack|xpcall)\b/,
-          inside: {
-            "punctuation": /\./
-          }
-        },
-        "boolean": /\b(?:false|true)\b/,
-        "number": /(?:\B\.\d+|\b\d+\.\d+|\b\d+(?=[eE]))(?:[eE][-+]?\d+)?\b|\b(?:0x[a-fA-F\d]+|\d+)(?:U?LL)?\b/,
-        "operator": /\.{3}|[-=]>|~=|(?:[-+*/%<>!=]|\.\.)=?|[:#^]|\b(?:and|or)\b=?|\b(?:not)\b/,
-        "punctuation": /[.,()[\]{}\\]/
-      };
-      Prism.languages.moonscript.string[1].inside.interpolation.inside.moonscript.inside = Prism.languages.moonscript;
-      Prism.languages.moon = Prism.languages.moonscript;
-      Prism.languages.n1ql = {
-        "comment": {
-          pattern: /\/\*[\s\S]*?(?:$|\*\/)|--.*/,
-          greedy: true
-        },
-        "string": {
-          pattern: /(["'])(?:\\[\s\S]|(?!\1)[^\\]|\1\1)*\1/,
-          greedy: true
-        },
-        "identifier": {
-          pattern: /`(?:\\[\s\S]|[^\\`]|``)*`/,
-          greedy: true
-        },
-        "parameter": /\$[\w.]+/,
-        // https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/reservedwords.html#n1ql-reserved-words
-        "keyword": /\b(?:ADVISE|ALL|ALTER|ANALYZE|AS|ASC|AT|BEGIN|BINARY|BOOLEAN|BREAK|BUCKET|BUILD|BY|CALL|CAST|CLUSTER|COLLATE|COLLECTION|COMMIT|COMMITTED|CONNECT|CONTINUE|CORRELATE|CORRELATED|COVER|CREATE|CURRENT|DATABASE|DATASET|DATASTORE|DECLARE|DECREMENT|DELETE|DERIVED|DESC|DESCRIBE|DISTINCT|DO|DROP|EACH|ELEMENT|EXCEPT|EXCLUDE|EXECUTE|EXPLAIN|FETCH|FILTER|FLATTEN|FLUSH|FOLLOWING|FOR|FORCE|FROM|FTS|FUNCTION|GOLANG|GRANT|GROUP|GROUPS|GSI|HASH|HAVING|IF|IGNORE|ILIKE|INCLUDE|INCREMENT|INDEX|INFER|INLINE|INNER|INSERT|INTERSECT|INTO|IS|ISOLATION|JAVASCRIPT|JOIN|KEY|KEYS|KEYSPACE|KNOWN|LANGUAGE|LAST|LEFT|LET|LETTING|LEVEL|LIMIT|LSM|MAP|MAPPING|MATCHED|MATERIALIZED|MERGE|MINUS|MISSING|NAMESPACE|NEST|NL|NO|NTH_VALUE|NULL|NULLS|NUMBER|OBJECT|OFFSET|ON|OPTION|OPTIONS|ORDER|OTHERS|OUTER|OVER|PARSE|PARTITION|PASSWORD|PATH|POOL|PRECEDING|PREPARE|PRIMARY|PRIVATE|PRIVILEGE|PROBE|PROCEDURE|PUBLIC|RANGE|RAW|REALM|REDUCE|RENAME|RESPECT|RETURN|RETURNING|REVOKE|RIGHT|ROLE|ROLLBACK|ROW|ROWS|SATISFIES|SAVEPOINT|SCHEMA|SCOPE|SELECT|SELF|SEMI|SET|SHOW|SOME|START|STATISTICS|STRING|SYSTEM|TIES|TO|TRAN|TRANSACTION|TRIGGER|TRUNCATE|UNBOUNDED|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNSET|UPDATE|UPSERT|USE|USER|USING|VALIDATE|VALUE|VALUES|VIA|VIEW|WHERE|WHILE|WINDOW|WITH|WORK|XOR)\b/i,
-        "function": /\b[a-z_]\w*(?=\s*\()/i,
-        "boolean": /\b(?:FALSE|TRUE)\b/i,
-        "number": /(?:\b\d+\.|\B\.)\d+e[+\-]?\d+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,
-        "operator": /[-+*\/%]|!=|==?|\|\||<[>=]?|>=?|\b(?:AND|ANY|ARRAY|BETWEEN|CASE|ELSE|END|EVERY|EXISTS|FIRST|IN|LIKE|NOT|OR|THEN|VALUED|WHEN|WITHIN)\b/i,
-        "punctuation": /[;[\](),.{}:]/
-      };
-      Prism.languages.n4js = Prism.languages.extend("javascript", {
-        // Keywords from N4JS language spec: https://numberfour.github.io/n4js/spec/N4JSSpec.html
-        "keyword": /\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/
-      });
-      Prism.languages.insertBefore("n4js", "constant", {
-        // Annotations in N4JS spec: https://numberfour.github.io/n4js/spec/N4JSSpec.html#_annotations
-        "annotation": {
-          pattern: /@+\w+/,
-          alias: "operator"
-        }
-      });
-      Prism.languages.n4jsd = Prism.languages.n4js;
-      Prism.languages["nand2tetris-hdl"] = {
-        "comment": /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
-        "keyword": /\b(?:BUILTIN|CHIP|CLOCKED|IN|OUT|PARTS)\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "function": /\b[A-Za-z][A-Za-z0-9]*(?=\()/,
-        "number": /\b\d+\b/,
-        "operator": /=|\.\./,
-        "punctuation": /[{}[\];(),:]/
-      };
-      (function(Prism2) {
-        var expressionDef = /\{[^\r\n\[\]{}]*\}/;
-        var params = {
-          "quoted-string": {
-            pattern: /"(?:[^"\\]|\\.)*"/,
-            alias: "operator"
-          },
-          "command-param-id": {
-            pattern: /(\s)\w+:/,
-            lookbehind: true,
-            alias: "property"
-          },
-          "command-param-value": [
-            {
-              pattern: expressionDef,
-              alias: "selector"
-            },
-            {
-              pattern: /([\t ])\S+/,
-              lookbehind: true,
-              greedy: true,
-              alias: "operator"
-            },
-            {
-              pattern: /\S(?:.*\S)?/,
-              alias: "operator"
-            }
-          ]
-        };
-        Prism2.languages.naniscript = {
-          // ; ...
-          "comment": {
-            pattern: /^([\t ]*);.*/m,
-            lookbehind: true
-          },
-          // > ...
-          // Define is a control line starting with '>' followed by a word, a space and a text.
-          "define": {
-            pattern: /^>.+/m,
-            alias: "tag",
-            inside: {
-              "value": {
-                pattern: /(^>\w+[\t ]+)(?!\s)[^{}\r\n]+/,
-                lookbehind: true,
-                alias: "operator"
-              },
-              "key": {
-                pattern: /(^>)\w+/,
-                lookbehind: true
-              }
-            }
-          },
-          // # ...
-          "label": {
-            pattern: /^([\t ]*)#[\t ]*\w+[\t ]*$/m,
-            lookbehind: true,
-            alias: "regex"
-          },
-          "command": {
-            pattern: /^([\t ]*)@\w+(?=[\t ]|$).*/m,
-            lookbehind: true,
-            alias: "function",
-            inside: {
-              "command-name": /^@\w+/,
-              "expression": {
-                pattern: expressionDef,
-                greedy: true,
-                alias: "selector"
-              },
-              "command-params": {
-                pattern: /\s*\S[\s\S]*/,
-                inside: params
-              }
-            }
-          },
-          // Generic is any line that doesn't start with operators: ;>#@
-          "generic-text": {
-            pattern: /(^[ \t]*)[^#@>;\s].*/m,
-            lookbehind: true,
-            alias: "punctuation",
-            inside: {
-              // \{ ... \} ... \[ ... \] ... \"
-              "escaped-char": /\\[{}\[\]"]/,
-              "expression": {
-                pattern: expressionDef,
-                greedy: true,
-                alias: "selector"
-              },
-              "inline-command": {
-                pattern: /\[[\t ]*\w[^\r\n\[\]]*\]/,
-                greedy: true,
-                alias: "function",
-                inside: {
-                  "command-params": {
-                    pattern: /(^\[[\t ]*\w+\b)[\s\S]+(?=\]$)/,
-                    lookbehind: true,
-                    inside: params
-                  },
-                  "command-param-name": {
-                    pattern: /^(\[[\t ]*)\w+/,
-                    lookbehind: true,
-                    alias: "name"
-                  },
-                  "start-stop-char": /[\[\]]/
-                }
-              }
-            }
-          }
-        };
-        Prism2.languages.nani = Prism2.languages["naniscript"];
-        Prism2.hooks.add("after-tokenize", function(env) {
-          var tokens = env.tokens;
-          tokens.forEach(function(token) {
-            if (typeof token !== "string" && token.type === "generic-text") {
-              var content = getTextContent(token);
-              if (!isBracketsBalanced(content)) {
-                token.type = "bad-line";
-                token.content = content;
-              }
-            }
-          });
-        });
-        function isBracketsBalanced(input) {
-          var brackets = "[]{}";
-          var stack = [];
-          for (var i = 0; i < input.length; i++) {
-            var bracket = input[i];
-            var bracketsIndex = brackets.indexOf(bracket);
-            if (bracketsIndex !== -1) {
-              if (bracketsIndex % 2 === 0) {
-                stack.push(bracketsIndex + 1);
-              } else if (stack.pop() !== bracketsIndex) {
-                return false;
-              }
-            }
-          }
-          return stack.length === 0;
-        }
-        function getTextContent(token) {
-          if (typeof token === "string") {
-            return token;
-          } else if (Array.isArray(token)) {
-            return token.map(getTextContent).join("");
-          } else {
-            return getTextContent(token.content);
-          }
-        }
-      })(Prism);
-      Prism.languages.nasm = {
-        "comment": /;.*$/m,
-        "string": /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
-        "label": {
-          pattern: /(^\s*)[A-Za-z._?$][\w.?$@~#]*:/m,
-          lookbehind: true,
-          alias: "function"
-        },
-        "keyword": [
-          /\[?BITS (?:16|32|64)\]?/,
-          {
-            pattern: /(^\s*)section\s*[a-z.]+:?/im,
-            lookbehind: true
-          },
-          /(?:extern|global)[^;\r\n]*/i,
-          /(?:CPU|DEFAULT|FLOAT).*$/m
-        ],
-        "register": {
-          pattern: /\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s)\b/i,
-          alias: "variable"
-        },
-        "number": /(?:\b|(?=\$))(?:0[hx](?:\.[\da-f]+|[\da-f]+(?:\.[\da-f]+)?)(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,
-        "operator": /[\[\]*+\-\/%<>=&|$!]/
-      };
-      Prism.languages.neon = {
-        "comment": {
-          pattern: /#.*/,
-          greedy: true
-        },
-        "datetime": {
-          pattern: /(^|[[{(=:,\s])\d\d\d\d-\d\d?-\d\d?(?:(?:[Tt]| +)\d\d?:\d\d:\d\d(?:\.\d*)? *(?:Z|[-+]\d\d?(?::?\d\d)?)?)?(?=$|[\]}),\s])/,
-          lookbehind: true,
-          alias: "number"
-        },
-        "key": {
-          pattern: /(^|[[{(,\s])[^,:=[\]{}()'"\s]+(?=\s*:(?:$|[\]}),\s])|\s*=)/,
-          lookbehind: true,
-          alias: "property"
-        },
-        "number": {
-          pattern: /(^|[[{(=:,\s])[+-]?(?:0x[\da-fA-F]+|0o[0-7]+|0b[01]+|(?:\d+(?:\.\d*)?|\.?\d+)(?:[eE][+-]?\d+)?)(?=$|[\]}),:=\s])/,
-          lookbehind: true
-        },
-        "boolean": {
-          pattern: /(^|[[{(=:,\s])(?:false|no|true|yes)(?=$|[\]}),:=\s])/i,
-          lookbehind: true
-        },
-        "null": {
-          pattern: /(^|[[{(=:,\s])(?:null)(?=$|[\]}),:=\s])/i,
-          lookbehind: true,
-          alias: "keyword"
-        },
-        "string": {
-          pattern: /(^|[[{(=:,\s])(?:('''|""")\r?\n(?:(?:[^\r\n]|\r?\n(?![\t ]*\2))*\r?\n)?[\t ]*\2|'[^'\r\n]*'|"(?:\\.|[^\\"\r\n])*")/,
-          lookbehind: true,
-          greedy: true
-        },
-        "literal": {
-          pattern: /(^|[[{(=:,\s])(?:[^#"',:=[\]{}()\s`-]|[:-][^"',=[\]{}()\s])(?:[^,:=\]})(\s]|:(?![\s,\]})]|$)|[ \t]+[^#,:=\]})(\s])*/,
-          lookbehind: true,
-          alias: "string"
-        },
-        "punctuation": /[,:=[\]{}()-]/
-      };
-      Prism.languages.nevod = {
-        "comment": /\/\/.*|(?:\/\*[\s\S]*?(?:\*\/|$))/,
-        "string": {
-          pattern: /(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))!?\*?/,
-          greedy: true,
-          inside: {
-            "string-attrs": /!$|!\*$|\*$/
-          }
-        },
-        "namespace": {
-          pattern: /(@namespace\s+)[a-zA-Z0-9\-.]+(?=\s*\{)/,
-          lookbehind: true
-        },
-        "pattern": {
-          pattern: /(@pattern\s+)?#?[a-zA-Z0-9\-.]+(?:\s*\(\s*(?:~\s*)?[a-zA-Z0-9\-.]+\s*(?:,\s*(?:~\s*)?[a-zA-Z0-9\-.]*)*\))?(?=\s*=)/,
-          lookbehind: true,
-          inside: {
-            "pattern-name": {
-              pattern: /^#?[a-zA-Z0-9\-.]+/,
-              alias: "class-name"
-            },
-            "fields": {
-              pattern: /\(.*\)/,
-              inside: {
-                "field-name": {
-                  pattern: /[a-zA-Z0-9\-.]+/,
-                  alias: "variable"
-                },
-                "punctuation": /[,()]/,
-                "operator": {
-                  pattern: /~/,
-                  alias: "field-hidden-mark"
-                }
-              }
-            }
-          }
-        },
-        "search": {
-          pattern: /(@search\s+|#)[a-zA-Z0-9\-.]+(?:\.\*)?(?=\s*;)/,
-          alias: "function",
-          lookbehind: true
-        },
-        "keyword": /@(?:having|inside|namespace|outside|pattern|require|search|where)\b/,
-        "standard-pattern": {
-          pattern: /\b(?:Alpha|AlphaNum|Any|Blank|End|LineBreak|Num|NumAlpha|Punct|Space|Start|Symbol|Word|WordBreak)\b(?:\([a-zA-Z0-9\-.,\s+]*\))?/,
-          inside: {
-            "standard-pattern-name": {
-              pattern: /^[a-zA-Z0-9\-.]+/,
-              alias: "builtin"
-            },
-            "quantifier": {
-              pattern: /\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,
-              alias: "number"
-            },
-            "standard-pattern-attr": {
-              pattern: /[a-zA-Z0-9\-.]+/,
-              alias: "builtin"
-            },
-            "punctuation": /[,()]/
-          }
-        },
-        "quantifier": {
-          pattern: /\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,
-          alias: "number"
-        },
-        "operator": [
-          {
-            pattern: /=/,
-            alias: "pattern-def"
-          },
-          {
-            pattern: /&/,
-            alias: "conjunction"
-          },
-          {
-            pattern: /~/,
-            alias: "exception"
-          },
-          {
-            pattern: /\?/,
-            alias: "optionality"
-          },
-          {
-            pattern: /[[\]]/,
-            alias: "repetition"
-          },
-          {
-            pattern: /[{}]/,
-            alias: "variation"
-          },
-          {
-            pattern: /[+_]/,
-            alias: "sequence"
-          },
-          {
-            pattern: /\.{2,3}/,
-            alias: "span"
-          }
-        ],
-        "field-capture": [
-          {
-            pattern: /([a-zA-Z0-9\-.]+\s*\()\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+(?:\s*,\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+)*(?=\s*\))/,
-            lookbehind: true,
-            inside: {
-              "field-name": {
-                pattern: /[a-zA-Z0-9\-.]+/,
-                alias: "variable"
-              },
-              "colon": /:/
-            }
-          },
-          {
-            pattern: /[a-zA-Z0-9\-.]+\s*:/,
-            inside: {
-              "field-name": {
-                pattern: /[a-zA-Z0-9\-.]+/,
-                alias: "variable"
-              },
-              "colon": /:/
-            }
-          }
-        ],
-        "punctuation": /[:;,()]/,
-        "name": /[a-zA-Z0-9\-.]+/
-      };
-      (function(Prism2) {
-        var variable = /\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;
-        Prism2.languages.nginx = {
-          "comment": {
-            pattern: /(^|[\s{};])#.*/,
-            lookbehind: true,
-            greedy: true
-          },
-          "directive": {
-            pattern: /(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "string": {
-                pattern: /((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,
-                lookbehind: true,
-                greedy: true,
-                inside: {
-                  "escape": {
-                    pattern: /\\["'\\nrt]/,
-                    alias: "entity"
-                  },
-                  "variable": variable
-                }
-              },
-              "comment": {
-                pattern: /(\s)#.*/,
-                lookbehind: true,
-                greedy: true
-              },
-              "keyword": {
-                pattern: /^\S+/,
-                greedy: true
-              },
-              // other patterns
-              "boolean": {
-                pattern: /(\s)(?:off|on)(?!\S)/,
-                lookbehind: true
-              },
-              "number": {
-                pattern: /(\s)\d+[a-z]*(?!\S)/i,
-                lookbehind: true
-              },
-              "variable": variable
-            }
-          },
-          "punctuation": /[{};]/
-        };
-      })(Prism);
-      Prism.languages.nim = {
-        "comment": {
-          pattern: /#.*/,
-          greedy: true
-        },
-        "string": {
-          // Double-quoted strings can be prefixed by an identifier (Generalized raw string literals)
-          pattern: /(?:\b(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+)?(?:"""[\s\S]*?"""(?!")|"(?:\\[\s\S]|""|[^"\\])*")/,
-          greedy: true
-        },
-        "char": {
-          // Character literals are handled specifically to prevent issues with numeric type suffixes
-          pattern: /'(?:\\(?:\d+|x[\da-fA-F]{0,2}|.)|[^'])'/,
-          greedy: true
-        },
-        "function": {
-          pattern: /(?:(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+|`[^`\r\n]+`)\*?(?:\[[^\]]+\])?(?=\s*\()/,
-          greedy: true,
-          inside: {
-            "operator": /\*$/
-          }
-        },
-        // We don't want to highlight operators (and anything really) inside backticks
-        "identifier": {
-          pattern: /`[^`\r\n]+`/,
-          greedy: true,
-          inside: {
-            "punctuation": /`/
-          }
-        },
-        // The negative look ahead prevents wrong highlighting of the .. operator
-        "number": /\b(?:0[xXoObB][\da-fA-F_]+|\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:[eE][+-]?\d[\d_]*)?)(?:'?[iuf]\d*)?/,
-        "keyword": /\b(?:addr|as|asm|atomic|bind|block|break|case|cast|concept|const|continue|converter|defer|discard|distinct|do|elif|else|end|enum|except|export|finally|for|from|func|generic|if|import|include|interface|iterator|let|macro|method|mixin|nil|object|out|proc|ptr|raise|ref|return|static|template|try|tuple|type|using|var|when|while|with|without|yield)\b/,
-        "operator": {
-          // Look behind and look ahead prevent wrong highlighting of punctuations [. .] {. .} (. .)
-          // but allow the slice operator .. to take precedence over them
-          // One can define his own operators in Nim so all combination of operators might be an operator.
-          pattern: /(^|[({\[](?=\.\.)|(?![({\[]\.).)(?:(?:[=+\-*\/<>@$~&%|!?^:\\]|\.\.|\.(?![)}\]]))+|\b(?:and|div|in|is|isnot|mod|not|notin|of|or|shl|shr|xor)\b)/m,
-          lookbehind: true
-        },
-        "punctuation": /[({\[]\.|\.[)}\]]|[`(){}\[\],:]/
-      };
-      Prism.languages.nix = {
-        "comment": {
-          pattern: /\/\*[\s\S]*?\*\/|#.*/,
-          greedy: true
-        },
-        "string": {
-          pattern: /"(?:[^"\\]|\\[\s\S])*"|''(?:(?!'')[\s\S]|''(?:'|\\|\$\{))*''/,
-          greedy: true,
-          inside: {
-            "interpolation": {
-              // The lookbehind ensures the ${} is not preceded by \ or ''
-              pattern: /(^|(?:^|(?!'').)[^\\])\$\{(?:[^{}]|\{[^}]*\})*\}/,
-              lookbehind: true,
-              inside: null
-              // see below
-            }
-          }
-        },
-        "url": [
-          /\b(?:[a-z]{3,7}:\/\/)[\w\-+%~\/.:#=?&]+/,
-          {
-            pattern: /([^\/])(?:[\w\-+%~.:#=?&]*(?!\/\/)[\w\-+%~\/.:#=?&])?(?!\/\/)\/[\w\-+%~\/.:#=?&]*/,
-            lookbehind: true
-          }
-        ],
-        "antiquotation": {
-          pattern: /\$(?=\{)/,
-          alias: "important"
-        },
-        "number": /\b\d+\b/,
-        "keyword": /\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\b/,
-        "function": /\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:Tarball|url)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\b|\bfoldl'\B/,
-        "boolean": /\b(?:false|true)\b/,
-        "operator": /[=!<>]=?|\+\+?|\|\||&&|\/\/|->?|[?@]/,
-        "punctuation": /[{}()[\].,:;]/
-      };
-      Prism.languages.nix.string.inside.interpolation.inside = Prism.languages.nix;
-      Prism.languages.nsis = {
-        "comment": {
-          pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|[#;].*)/,
-          lookbehind: true,
-          greedy: true
-        },
-        "string": {
-          pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
-          greedy: true
-        },
-        "keyword": {
-          pattern: /(^[\t ]*)(?:Abort|Add(?:BrandingImage|Size)|AdvSplash|Allow(?:RootDirInstall|SkipFiles)|AutoCloseWindow|BG(?:Font|Gradient|Image)|Banner|BrandingText|BringToFront|CRCCheck|Call(?:InstDLL)?|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|Create(?:Directory|Font|ShortCut)|Delete(?:INISec|INIStr|RegKey|RegValue)?|Detail(?:Print|sButtonText)|Dialer|Dir(?:Text|Var|Verify)|EnableWindow|Enum(?:RegKey|RegValue)|Exch|Exec(?:Shell(?:Wait)?|Wait)?|ExpandEnvStrings|File(?:BufSize|Close|ErrorText|Open|Read|ReadByte|ReadUTF16LE|ReadWord|Seek|Write|WriteByte|WriteUTF16LE|WriteWord)?|Find(?:Close|First|Next|Window)|FlushINI|Get(?:CurInstType|CurrentAddress|DLLVersion(?:Local)?|DlgItem|ErrorLevel|FileTime(?:Local)?|FullPathName|Function(?:Address|End)?|InstDirError|LabelAddress|TempFileName)|Goto|HideWindow|Icon|If(?:Abort|Errors|FileExists|RebootFlag|Silent)|InitPluginsDir|InstProgressFlags|Inst(?:Type(?:GetText|SetText)?)|Install(?:ButtonText|Colors|Dir(?:RegKey)?)|Int(?:64|Ptr)?CmpU?|Int(?:64)?Fmt|Int(?:Ptr)?Op|IsWindow|Lang(?:DLL|String)|License(?:BkColor|Data|ForceSelection|LangString|Text)|LoadLanguageFile|LockWindow|Log(?:Set|Text)|Manifest(?:DPIAware|SupportedOS)|Math|MessageBox|MiscButtonText|NSISdl|Name|Nop|OutFile|PE(?:DllCharacteristics|SubsysVer)|Page(?:Callbacks)?|Pop|Push|Quit|RMDir|Read(?:EnvStr|INIStr|RegDWORD|RegStr)|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|SearchPath|Section(?:End|GetFlags|GetInstTypes|GetSize|GetText|Group|In|SetFlags|SetInstTypes|SetSize|SetText)?|SendMessage|Set(?:AutoClose|BrandingImage|Compress|Compressor(?:DictSize)?|CtlColors|CurInstType|DatablockOptimize|DateSave|Details(?:Print|View)|ErrorLevel|Errors|FileAttributes|Font|OutPath|Overwrite|PluginUnload|RebootFlag|RegView|ShellVarContext|Silent)|Show(?:InstDetails|UninstDetails|Window)|Silent(?:Install|UnInstall)|Sleep|SpaceTexts|Splash|StartMenu|Str(?:CmpS?|Cpy|Len)|SubCaption|System|UnRegDLL|Unicode|UninstPage|Uninstall(?:ButtonText|Caption|Icon|SubCaption|Text)|UserInfo|VI(?:AddVersionKey|FileVersion|ProductVersion)|VPatch|Var|WindowIcon|Write(?:INIStr|Reg(?:Bin|DWORD|ExpandStr|MultiStr|None|Str)|Uninstaller)|XPStyle|ns(?:Dialogs|Exec))\b/m,
-          lookbehind: true
-        },
-        "property": /\b(?:ARCHIVE|FILE_(?:ATTRIBUTE_ARCHIVE|ATTRIBUTE_NORMAL|ATTRIBUTE_OFFLINE|ATTRIBUTE_READONLY|ATTRIBUTE_SYSTEM|ATTRIBUTE_TEMPORARY)|HK(?:(?:CR|CU|LM)(?:32|64)?|DD|PD|U)|HKEY_(?:CLASSES_ROOT|CURRENT_CONFIG|CURRENT_USER|DYN_DATA|LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|ID(?:ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|MB_(?:ABORTRETRYIGNORE|DEFBUTTON1|DEFBUTTON2|DEFBUTTON3|DEFBUTTON4|ICONEXCLAMATION|ICONINFORMATION|ICONQUESTION|ICONSTOP|OK|OKCANCEL|RETRYCANCEL|RIGHT|RTLREADING|SETFOREGROUND|TOPMOST|USERICON|YESNO)|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY|admin|all|auto|both|colored|false|force|hide|highest|lastused|leave|listonly|none|normal|notset|off|on|open|print|show|silent|silentlog|smooth|textonly|true|user)\b/,
-        "constant": /\$\{[!\w\.:\^-]+\}|\$\([!\w\.:\^-]+\)/,
-        "variable": /\$\w[\w\.]*/,
-        "number": /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,
-        "operator": /--?|\+\+?|<=?|>=?|==?=?|&&?|\|\|?|[?*\/~^%]/,
-        "punctuation": /[{}[\];(),.:]/,
-        "important": {
-          pattern: /(^[\t ]*)!(?:addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversion|gettlbversion|if|ifdef|ifmacrodef|ifmacrondef|ifndef|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|verbose|warning)\b/im,
-          lookbehind: true
-        }
-      };
-      Prism.languages.objectivec = Prism.languages.extend("c", {
-        "string": {
-          pattern: /@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
-          greedy: true
-        },
-        "keyword": /\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,
-        "operator": /-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/
-      });
-      delete Prism.languages.objectivec["class-name"];
-      Prism.languages.objc = Prism.languages.objectivec;
-      Prism.languages.ocaml = {
-        "comment": {
-          pattern: /\(\*[\s\S]*?\*\)/,
-          greedy: true
-        },
-        "char": {
-          pattern: /'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,
-          greedy: true
-        },
-        "string": [
-          {
-            pattern: /"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,
-            greedy: true
-          },
-          {
-            pattern: /\{([a-z_]*)\|[\s\S]*?\|\1\}/,
-            greedy: true
-          }
-        ],
-        "number": [
-          // binary and octal
-          /\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,
-          // hexadecimal
-          /\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,
-          // decimal
-          /\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i
-        ],
-        "directive": {
-          pattern: /\B#\w+/,
-          alias: "property"
-        },
-        "label": {
-          pattern: /\B~\w+/,
-          alias: "property"
-        },
-        "type-variable": {
-          pattern: /\B'\w+/,
-          alias: "function"
-        },
-        "variant": {
-          pattern: /`\w+/,
-          alias: "symbol"
-        },
-        // For the list of keywords and operators,
-        // see: http://caml.inria.fr/pub/docs/manual-ocaml/lex.html#sec84
-        "keyword": /\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "operator-like-punctuation": {
-          pattern: /\[[<>|]|[>|]\]|\{<|>\}/,
-          alias: "punctuation"
-        },
-        // Custom operators are allowed
-        "operator": /\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,
-        "punctuation": /;;|::|[(){}\[\].,:;#]|\b_\b/
-      };
-      (function(Prism2) {
-        var escapes = /\\(?:["'\\abefnrtv]|0[0-7]{2}|U[\dA-Fa-f]{6}|u[\dA-Fa-f]{4}|x[\dA-Fa-f]{2})/;
-        Prism2.languages.odin = {
-          /**
-           * The current implementation supports only 1 level of nesting.
-           *
-           * @author Michael Schmidt
-           * @author edukisto
-           */
-          "comment": [
-            {
-              pattern: /\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,
-              greedy: true
-            },
-            {
-              pattern: /#![^\n\r]*/,
-              greedy: true
-            },
-            {
-              pattern: /\/\/[^\n\r]*/,
-              greedy: true
-            }
-          ],
-          /**
-           * Should be found before strings because of '"'"- and '`'`-like sequences.
-           */
-          "char": {
-            pattern: /'(?:\\(?:.|[0Uux][0-9A-Fa-f]{1,6})|[^\n\r'\\])'/,
-            greedy: true,
-            inside: {
-              "symbol": escapes
-            }
-          },
-          "string": [
-            {
-              pattern: /`[^`]*`/,
-              greedy: true
-            },
-            {
-              pattern: /"(?:\\.|[^\n\r"\\])*"/,
-              greedy: true,
-              inside: {
-                "symbol": escapes
-              }
-            }
-          ],
-          "directive": {
-            pattern: /#\w+/,
-            alias: "property"
-          },
-          "number": /\b0(?:b[01_]+|d[\d_]+|h_*(?:(?:(?:[\dA-Fa-f]_*){8}){1,2}|(?:[\dA-Fa-f]_*){4})|o[0-7_]+|x[\dA-F_a-f]+|z[\dAB_ab]+)\b|(?:\b\d+(?:\.(?!\.)\d*)?|\B\.\d+)(?:[Ee][+-]?\d*)?[ijk]?(?!\w)/,
-          "discard": {
-            pattern: /\b_\b/,
-            alias: "keyword"
-          },
-          "procedure-definition": {
-            pattern: /\b\w+(?=[ \t]*(?::\s*){2}proc\b)/,
-            alias: "function"
-          },
-          "keyword": /\b(?:asm|auto_cast|bit_set|break|case|cast|context|continue|defer|distinct|do|dynamic|else|enum|fallthrough|for|foreign|if|import|in|map|matrix|not_in|or_else|or_return|package|proc|return|struct|switch|transmute|typeid|union|using|when|where)\b/,
-          /**
-           * false, nil, true can be used as procedure names. "_" and keywords can't.
-           */
-          "procedure-name": {
-            pattern: /\b\w+(?=[ \t]*\()/,
-            alias: "function"
-          },
-          "boolean": /\b(?:false|nil|true)\b/,
-          "constant-parameter-sign": {
-            pattern: /\$/,
-            alias: "important"
-          },
-          "undefined": {
-            pattern: /---/,
-            alias: "operator"
-          },
-          "arrow": {
-            pattern: /->/,
-            alias: "punctuation"
-          },
-          "operator": /\+\+|--|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/,
-          "punctuation": /[(),.:;@\[\]{}]/
-        };
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages.opencl = Prism2.languages.extend("c", {
-          // Extracted from the official specs (2.0) and http://streamcomputing.eu/downloads/?opencl.lang (opencl-keywords, opencl-types) and http://sourceforge.net/tracker/?func=detail&aid=2957794&group_id=95717&atid=612384 (Words2, partly Words3)
-          "keyword": /\b(?:(?:__)?(?:constant|global|kernel|local|private|read_only|read_write|write_only)|__attribute__|auto|(?:bool|u?(?:char|int|long|short)|half|quad)(?:2|3|4|8|16)?|break|case|complex|const|continue|(?:double|float)(?:16(?:x(?:1|2|4|8|16))?|1x(?:1|2|4|8|16)|2(?:x(?:1|2|4|8|16))?|3|4(?:x(?:1|2|4|8|16))?|8(?:x(?:1|2|4|8|16))?)?|default|do|else|enum|extern|for|goto|if|imaginary|inline|packed|pipe|register|restrict|return|signed|sizeof|static|struct|switch|typedef|uniform|union|unsigned|void|volatile|while)\b/,
-          // Extracted from http://streamcomputing.eu/downloads/?opencl.lang (opencl-const)
-          // Math Constants: https://www.khronos.org/registry/OpenCL/sdk/2.1/docs/man/xhtml/mathConstants.html
-          // Macros and Limits: https://www.khronos.org/registry/OpenCL/sdk/2.1/docs/man/xhtml/macroLimits.html
-          "number": /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[fuhl]{0,4}/i,
-          "boolean": /\b(?:false|true)\b/,
-          "constant-opencl-kernel": {
-            pattern: /\b(?:CHAR_(?:BIT|MAX|MIN)|CLK_(?:ADDRESS_(?:CLAMP(?:_TO_EDGE)?|NONE|REPEAT)|FILTER_(?:LINEAR|NEAREST)|(?:GLOBAL|LOCAL)_MEM_FENCE|NORMALIZED_COORDS_(?:FALSE|TRUE))|CL_(?:BGRA|(?:HALF_)?FLOAT|INTENSITY|LUMINANCE|A?R?G?B?[Ax]?|(?:(?:UN)?SIGNED|[US]NORM)_(?:INT(?:8|16|32))|UNORM_(?:INT_101010|SHORT_(?:555|565)))|(?:DBL|FLT|HALF)_(?:DIG|EPSILON|(?:MAX|MIN)(?:(?:_10)?_EXP)?|MANT_DIG)|FLT_RADIX|HUGE_VALF?|(?:INT|LONG|SCHAR|SHRT)_(?:MAX|MIN)|INFINITY|MAXFLOAT|M_(?:[12]_PI|2_SQRTPI|E|LN(?:2|10)|LOG(?:2|10)E?|PI(?:_[24])?|SQRT(?:1_2|2))(?:_F|_H)?|NAN|(?:UCHAR|UINT|ULONG|USHRT)_MAX)\b/,
-            alias: "constant"
-          }
-        });
-        Prism2.languages.insertBefore("opencl", "class-name", {
-          // https://www.khronos.org/registry/OpenCL/sdk/2.1/docs/man/xhtml/scalarDataTypes.html
-          // https://www.khronos.org/registry/OpenCL/sdk/2.1/docs/man/xhtml/otherDataTypes.html
-          "builtin-type": {
-            pattern: /\b(?:_cl_(?:command_queue|context|device_id|event|kernel|mem|platform_id|program|sampler)|cl_(?:image_format|mem_fence_flags)|clk_event_t|event_t|image(?:1d_(?:array_|buffer_)?t|2d_(?:array_(?:depth_|msaa_depth_|msaa_)?|depth_|msaa_depth_|msaa_)?t|3d_t)|intptr_t|ndrange_t|ptrdiff_t|queue_t|reserve_id_t|sampler_t|size_t|uintptr_t)\b/,
-            alias: "keyword"
-          }
-        });
-        var attributes = {
-          // Extracted from http://streamcomputing.eu/downloads/?opencl_host.lang (opencl-types and opencl-host)
-          "type-opencl-host": {
-            pattern: /\b(?:cl_(?:GLenum|GLint|GLuin|addressing_mode|bitfield|bool|buffer_create_type|build_status|channel_(?:order|type)|(?:u?(?:char|int|long|short)|double|float)(?:2|3|4|8|16)?|command_(?:queue(?:_info|_properties)?|type)|context(?:_info|_properties)?|device_(?:exec_capabilities|fp_config|id|info|local_mem_type|mem_cache_type|type)|(?:event|sampler)(?:_info)?|filter_mode|half|image_info|kernel(?:_info|_work_group_info)?|map_flags|mem(?:_flags|_info|_object_type)?|platform_(?:id|info)|profiling_info|program(?:_build_info|_info)?))\b/,
-            alias: "keyword"
-          },
-          "boolean-opencl-host": {
-            pattern: /\bCL_(?:FALSE|TRUE)\b/,
-            alias: "boolean"
-          },
-          // Extracted from cl.h (2.0) and http://streamcomputing.eu/downloads/?opencl_host.lang (opencl-const)
-          "constant-opencl-host": {
-            pattern: /\bCL_(?:A|ABGR|ADDRESS_(?:CLAMP(?:_TO_EDGE)?|MIRRORED_REPEAT|NONE|REPEAT)|ARGB|BGRA|BLOCKING|BUFFER_CREATE_TYPE_REGION|BUILD_(?:ERROR|IN_PROGRESS|NONE|PROGRAM_FAILURE|SUCCESS)|COMMAND_(?:ACQUIRE_GL_OBJECTS|BARRIER|COPY_(?:BUFFER(?:_RECT|_TO_IMAGE)?|IMAGE(?:_TO_BUFFER)?)|FILL_(?:BUFFER|IMAGE)|MAP(?:_BUFFER|_IMAGE)|MARKER|MIGRATE(?:_SVM)?_MEM_OBJECTS|NATIVE_KERNEL|NDRANGE_KERNEL|READ_(?:BUFFER(?:_RECT)?|IMAGE)|RELEASE_GL_OBJECTS|SVM_(?:FREE|MAP|MEMCPY|MEMFILL|UNMAP)|TASK|UNMAP_MEM_OBJECT|USER|WRITE_(?:BUFFER(?:_RECT)?|IMAGE))|COMPILER_NOT_AVAILABLE|COMPILE_PROGRAM_FAILURE|COMPLETE|CONTEXT_(?:DEVICES|INTEROP_USER_SYNC|NUM_DEVICES|PLATFORM|PROPERTIES|REFERENCE_COUNT)|DEPTH(?:_STENCIL)?|DEVICE_(?:ADDRESS_BITS|AFFINITY_DOMAIN_(?:L[1-4]_CACHE|NEXT_PARTITIONABLE|NUMA)|AVAILABLE|BUILT_IN_KERNELS|COMPILER_AVAILABLE|DOUBLE_FP_CONFIG|ENDIAN_LITTLE|ERROR_CORRECTION_SUPPORT|EXECUTION_CAPABILITIES|EXTENSIONS|GLOBAL_(?:MEM_(?:CACHELINE_SIZE|CACHE_SIZE|CACHE_TYPE|SIZE)|VARIABLE_PREFERRED_TOTAL_SIZE)|HOST_UNIFIED_MEMORY|IL_VERSION|IMAGE(?:2D_MAX_(?:HEIGHT|WIDTH)|3D_MAX_(?:DEPTH|HEIGHT|WIDTH)|_BASE_ADDRESS_ALIGNMENT|_MAX_ARRAY_SIZE|_MAX_BUFFER_SIZE|_PITCH_ALIGNMENT|_SUPPORT)|LINKER_AVAILABLE|LOCAL_MEM_SIZE|LOCAL_MEM_TYPE|MAX_(?:CLOCK_FREQUENCY|COMPUTE_UNITS|CONSTANT_ARGS|CONSTANT_BUFFER_SIZE|GLOBAL_VARIABLE_SIZE|MEM_ALLOC_SIZE|NUM_SUB_GROUPS|ON_DEVICE_(?:EVENTS|QUEUES)|PARAMETER_SIZE|PIPE_ARGS|READ_IMAGE_ARGS|READ_WRITE_IMAGE_ARGS|SAMPLERS|WORK_GROUP_SIZE|WORK_ITEM_DIMENSIONS|WORK_ITEM_SIZES|WRITE_IMAGE_ARGS)|MEM_BASE_ADDR_ALIGN|MIN_DATA_TYPE_ALIGN_SIZE|NAME|NATIVE_VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT)|NOT_(?:AVAILABLE|FOUND)|OPENCL_C_VERSION|PARENT_DEVICE|PARTITION_(?:AFFINITY_DOMAIN|BY_AFFINITY_DOMAIN|BY_COUNTS|BY_COUNTS_LIST_END|EQUALLY|FAILED|MAX_SUB_DEVICES|PROPERTIES|TYPE)|PIPE_MAX_(?:ACTIVE_RESERVATIONS|PACKET_SIZE)|PLATFORM|PREFERRED_(?:GLOBAL_ATOMIC_ALIGNMENT|INTEROP_USER_SYNC|LOCAL_ATOMIC_ALIGNMENT|PLATFORM_ATOMIC_ALIGNMENT|VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT))|PRINTF_BUFFER_SIZE|PROFILE|PROFILING_TIMER_RESOLUTION|QUEUE_(?:ON_(?:DEVICE_(?:MAX_SIZE|PREFERRED_SIZE|PROPERTIES)|HOST_PROPERTIES)|PROPERTIES)|REFERENCE_COUNT|SINGLE_FP_CONFIG|SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS|SVM_(?:ATOMICS|CAPABILITIES|COARSE_GRAIN_BUFFER|FINE_GRAIN_BUFFER|FINE_GRAIN_SYSTEM)|TYPE(?:_ACCELERATOR|_ALL|_CPU|_CUSTOM|_DEFAULT|_GPU)?|VENDOR(?:_ID)?|VERSION)|DRIVER_VERSION|EVENT_(?:COMMAND_(?:EXECUTION_STATUS|QUEUE|TYPE)|CONTEXT|REFERENCE_COUNT)|EXEC_(?:KERNEL|NATIVE_KERNEL|STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST)|FILTER_(?:LINEAR|NEAREST)|FLOAT|FP_(?:CORRECTLY_ROUNDED_DIVIDE_SQRT|DENORM|FMA|INF_NAN|ROUND_TO_INF|ROUND_TO_NEAREST|ROUND_TO_ZERO|SOFT_FLOAT)|GLOBAL|HALF_FLOAT|IMAGE_(?:ARRAY_SIZE|BUFFER|DEPTH|ELEMENT_SIZE|FORMAT|FORMAT_MISMATCH|FORMAT_NOT_SUPPORTED|HEIGHT|NUM_MIP_LEVELS|NUM_SAMPLES|ROW_PITCH|SLICE_PITCH|WIDTH)|INTENSITY|INVALID_(?:ARG_INDEX|ARG_SIZE|ARG_VALUE|BINARY|BUFFER_SIZE|BUILD_OPTIONS|COMMAND_QUEUE|COMPILER_OPTIONS|CONTEXT|DEVICE|DEVICE_PARTITION_COUNT|DEVICE_QUEUE|DEVICE_TYPE|EVENT|EVENT_WAIT_LIST|GLOBAL_OFFSET|GLOBAL_WORK_SIZE|GL_OBJECT|HOST_PTR|IMAGE_DESCRIPTOR|IMAGE_FORMAT_DESCRIPTOR|IMAGE_SIZE|KERNEL|KERNEL_ARGS|KERNEL_DEFINITION|KERNEL_NAME|LINKER_OPTIONS|MEM_OBJECT|MIP_LEVEL|OPERATION|PIPE_SIZE|PLATFORM|PROGRAM|PROGRAM_EXECUTABLE|PROPERTY|QUEUE_PROPERTIES|SAMPLER|VALUE|WORK_DIMENSION|WORK_GROUP_SIZE|WORK_ITEM_SIZE)|KERNEL_(?:ARG_(?:ACCESS_(?:NONE|QUALIFIER|READ_ONLY|READ_WRITE|WRITE_ONLY)|ADDRESS_(?:CONSTANT|GLOBAL|LOCAL|PRIVATE|QUALIFIER)|INFO_NOT_AVAILABLE|NAME|TYPE_(?:CONST|NAME|NONE|PIPE|QUALIFIER|RESTRICT|VOLATILE))|ATTRIBUTES|COMPILE_NUM_SUB_GROUPS|COMPILE_WORK_GROUP_SIZE|CONTEXT|EXEC_INFO_SVM_FINE_GRAIN_SYSTEM|EXEC_INFO_SVM_PTRS|FUNCTION_NAME|GLOBAL_WORK_SIZE|LOCAL_MEM_SIZE|LOCAL_SIZE_FOR_SUB_GROUP_COUNT|MAX_NUM_SUB_GROUPS|MAX_SUB_GROUP_SIZE_FOR_NDRANGE|NUM_ARGS|PREFERRED_WORK_GROUP_SIZE_MULTIPLE|PRIVATE_MEM_SIZE|PROGRAM|REFERENCE_COUNT|SUB_GROUP_COUNT_FOR_NDRANGE|WORK_GROUP_SIZE)|LINKER_NOT_AVAILABLE|LINK_PROGRAM_FAILURE|LOCAL|LUMINANCE|MAP_(?:FAILURE|READ|WRITE|WRITE_INVALIDATE_REGION)|MEM_(?:ALLOC_HOST_PTR|ASSOCIATED_MEMOBJECT|CONTEXT|COPY_HOST_PTR|COPY_OVERLAP|FLAGS|HOST_NO_ACCESS|HOST_PTR|HOST_READ_ONLY|HOST_WRITE_ONLY|KERNEL_READ_AND_WRITE|MAP_COUNT|OBJECT_(?:ALLOCATION_FAILURE|BUFFER|IMAGE1D|IMAGE1D_ARRAY|IMAGE1D_BUFFER|IMAGE2D|IMAGE2D_ARRAY|IMAGE3D|PIPE)|OFFSET|READ_ONLY|READ_WRITE|REFERENCE_COUNT|SIZE|SVM_ATOMICS|SVM_FINE_GRAIN_BUFFER|TYPE|USES_SVM_POINTER|USE_HOST_PTR|WRITE_ONLY)|MIGRATE_MEM_OBJECT_(?:CONTENT_UNDEFINED|HOST)|MISALIGNED_SUB_BUFFER_OFFSET|NONE|NON_BLOCKING|OUT_OF_(?:HOST_MEMORY|RESOURCES)|PIPE_(?:MAX_PACKETS|PACKET_SIZE)|PLATFORM_(?:EXTENSIONS|HOST_TIMER_RESOLUTION|NAME|PROFILE|VENDOR|VERSION)|PROFILING_(?:COMMAND_(?:COMPLETE|END|QUEUED|START|SUBMIT)|INFO_NOT_AVAILABLE)|PROGRAM_(?:BINARIES|BINARY_SIZES|BINARY_TYPE(?:_COMPILED_OBJECT|_EXECUTABLE|_LIBRARY|_NONE)?|BUILD_(?:GLOBAL_VARIABLE_TOTAL_SIZE|LOG|OPTIONS|STATUS)|CONTEXT|DEVICES|IL|KERNEL_NAMES|NUM_DEVICES|NUM_KERNELS|REFERENCE_COUNT|SOURCE)|QUEUED|QUEUE_(?:CONTEXT|DEVICE|DEVICE_DEFAULT|ON_DEVICE|ON_DEVICE_DEFAULT|OUT_OF_ORDER_EXEC_MODE_ENABLE|PROFILING_ENABLE|PROPERTIES|REFERENCE_COUNT|SIZE)|R|RA|READ_(?:ONLY|WRITE)_CACHE|RG|RGB|RGBA|RGBx|RGx|RUNNING|Rx|SAMPLER_(?:ADDRESSING_MODE|CONTEXT|FILTER_MODE|LOD_MAX|LOD_MIN|MIP_FILTER_MODE|NORMALIZED_COORDS|REFERENCE_COUNT)|(?:UN)?SIGNED_INT(?:8|16|32)|SNORM_INT(?:8|16)|SUBMITTED|SUCCESS|UNORM_INT(?:8|16|24|_101010|_101010_2)|UNORM_SHORT_(?:555|565)|VERSION_(?:1_0|1_1|1_2|2_0|2_1)|sBGRA|sRGB|sRGBA|sRGBx)\b/,
-            alias: "constant"
-          },
-          // Extracted from cl.h (2.0) and http://streamcomputing.eu/downloads/?opencl_host.lang (opencl-host)
-          "function-opencl-host": {
-            pattern: /\bcl(?:BuildProgram|CloneKernel|CompileProgram|Create(?:Buffer|CommandQueue(?:WithProperties)?|Context|ContextFromType|Image|Image2D|Image3D|Kernel|KernelsInProgram|Pipe|ProgramWith(?:Binary|BuiltInKernels|IL|Source)|Sampler|SamplerWithProperties|SubBuffer|SubDevices|UserEvent)|Enqueue(?:(?:Barrier|Marker)(?:WithWaitList)?|Copy(?:Buffer(?:Rect|ToImage)?|Image(?:ToBuffer)?)|(?:Fill|Map)(?:Buffer|Image)|MigrateMemObjects|NDRangeKernel|NativeKernel|(?:Read|Write)(?:Buffer(?:Rect)?|Image)|SVM(?:Free|Map|MemFill|Memcpy|MigrateMem|Unmap)|Task|UnmapMemObject|WaitForEvents)|Finish|Flush|Get(?:CommandQueueInfo|ContextInfo|Device(?:AndHostTimer|IDs|Info)|Event(?:Profiling)?Info|ExtensionFunctionAddress(?:ForPlatform)?|HostTimer|ImageInfo|Kernel(?:ArgInfo|Info|SubGroupInfo|WorkGroupInfo)|MemObjectInfo|PipeInfo|Platform(?:IDs|Info)|Program(?:Build)?Info|SamplerInfo|SupportedImageFormats)|LinkProgram|(?:Release|Retain)(?:CommandQueue|Context|Device|Event|Kernel|MemObject|Program|Sampler)|SVM(?:Alloc|Free)|Set(?:CommandQueueProperty|DefaultDeviceCommandQueue|EventCallback|Kernel|Kernel(?:Arg(?:SVMPointer)?|ExecInfo)|MemObjectDestructorCallback|UserEventStatus)|Unload(?:Platform)?Compiler|WaitForEvents)\b/,
-            alias: "function"
-          }
-        };
-        Prism2.languages.insertBefore("c", "keyword", attributes);
-        if (Prism2.languages.cpp) {
-          attributes["type-opencl-host-cpp"] = {
-            pattern: /\b(?:Buffer|BufferGL|BufferRenderGL|CommandQueue|Context|Device|DeviceCommandQueue|EnqueueArgs|Event|Image|Image1D|Image1DArray|Image1DBuffer|Image2D|Image2DArray|Image2DGL|Image3D|Image3DGL|ImageFormat|ImageGL|Kernel|KernelFunctor|LocalSpaceArg|Memory|NDRange|Pipe|Platform|Program|SVMAllocator|SVMTraitAtomic|SVMTraitCoarse|SVMTraitFine|SVMTraitReadOnly|SVMTraitReadWrite|SVMTraitWriteOnly|Sampler|UserEvent)\b/,
-            alias: "keyword"
-          };
-          Prism2.languages.insertBefore("cpp", "keyword", attributes);
-        }
-      })(Prism);
-      Prism.languages.openqasm = {
-        "comment": /\/\*[\s\S]*?\*\/|\/\/.*/,
-        "string": {
-          pattern: /"[^"\r\n\t]*"|'[^'\r\n\t]*'/,
-          greedy: true
-        },
-        "keyword": /\b(?:CX|OPENQASM|U|barrier|boxas|boxto|break|const|continue|ctrl|def|defcal|defcalgrammar|delay|else|end|for|gate|gphase|if|in|include|inv|kernel|lengthof|let|measure|pow|reset|return|rotary|stretchinf|while)\b|#pragma\b/,
-        "class-name": /\b(?:angle|bit|bool|creg|fixed|float|int|length|qreg|qubit|stretch|uint)\b/,
-        "function": /\b(?:cos|exp|ln|popcount|rotl|rotr|sin|sqrt|tan)\b(?=\s*\()/,
-        "constant": /\b(?:euler|pi|tau)\b|π|𝜏|ℇ/,
-        "number": {
-          pattern: /(^|[^.\w$])(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?(?:dt|ns|us|µs|ms|s)?/i,
-          lookbehind: true
-        },
-        "operator": /->|>>=?|<<=?|&&|\|\||\+\+|--|[!=<>&|~^+\-*/%]=?|@/,
-        "punctuation": /[(){}\[\];,:.]/
-      };
-      Prism.languages.qasm = Prism.languages.openqasm;
-      Prism.languages.oz = {
-        "comment": {
-          pattern: /\/\*[\s\S]*?\*\/|%.*/,
-          greedy: true
-        },
-        "string": {
-          pattern: /"(?:[^"\\]|\\[\s\S])*"/,
-          greedy: true
-        },
-        "atom": {
-          pattern: /'(?:[^'\\]|\\[\s\S])*'/,
-          greedy: true,
-          alias: "builtin"
-        },
-        "keyword": /\$|\[\]|\b(?:_|at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\b/,
-        "function": [
-          /\b[a-z][A-Za-z\d]*(?=\()/,
-          {
-            pattern: /(\{)[A-Z][A-Za-z\d]*\b/,
-            lookbehind: true
-          }
-        ],
-        "number": /\b(?:0[bx][\da-f]+|\d+(?:\.\d*)?(?:e~?\d+)?)\b|&(?:[^\\]|\\(?:\d{3}|.))/i,
-        "variable": /`(?:[^`\\]|\\.)+`/,
-        "attr-name": /\b\w+(?=[ \t]*:(?![:=]))/,
-        "operator": /:(?:=|::?)|<[-:=]?|=(?:=|<?:?)|>=?:?|\\=:?|!!?|[|#+\-*\/,~^@]|\b(?:andthen|div|mod|orelse)\b/,
-        "punctuation": /[\[\](){}.:;?]/
-      };
-      Prism.languages.parigp = {
-        "comment": /\/\*[\s\S]*?\*\/|\\\\.*/,
-        "string": {
-          pattern: /"(?:[^"\\\r\n]|\\.)*"/,
-          greedy: true
-        },
-        // PARI/GP does not care about white spaces at all
-        // so let's process the keywords to build an appropriate regexp
-        // (e.g. "b *r *e *a *k", etc.)
-        "keyword": function() {
-          var keywords = [
-            "breakpoint",
-            "break",
-            "dbg_down",
-            "dbg_err",
-            "dbg_up",
-            "dbg_x",
-            "forcomposite",
-            "fordiv",
-            "forell",
-            "forpart",
-            "forprime",
-            "forstep",
-            "forsubgroup",
-            "forvec",
-            "for",
-            "iferr",
-            "if",
-            "local",
-            "my",
-            "next",
-            "return",
-            "until",
-            "while"
-          ];
-          keywords = keywords.map(function(keyword) {
-            return keyword.split("").join(" *");
-          }).join("|");
-          return RegExp("\\b(?:" + keywords + ")\\b");
-        }(),
-        "function": /\b\w(?:[\w ]*\w)?(?= *\()/,
-        "number": {
-          // The lookbehind and the negative lookahead prevent from breaking the .. operator
-          pattern: /((?:\. *\. *)?)(?:\b\d(?: *\d)*(?: *(?!\. *\.)\.(?: *\d)*)?|\. *\d(?: *\d)*)(?: *e *(?:[+-] *)?\d(?: *\d)*)?/i,
-          lookbehind: true
-        },
-        "operator": /\. *\.|[*\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\(?: *\/)?(?: *=)?|&(?: *&)?|\| *\||['#~^]/,
-        "punctuation": /[\[\]{}().,:;|]/
-      };
-      (function(Prism2) {
-        var parser = Prism2.languages.parser = Prism2.languages.extend("markup", {
-          "keyword": {
-            pattern: /(^|[^^])(?:\^(?:case|eval|for|if|switch|throw)\b|@(?:BASE|CLASS|GET(?:_DEFAULT)?|OPTIONS|SET_DEFAULT|USE)\b)/,
-            lookbehind: true
-          },
-          "variable": {
-            pattern: /(^|[^^])\B\$(?:\w+|(?=[.{]))(?:(?:\.|::?)\w+)*(?:\.|::?)?/,
-            lookbehind: true,
-            inside: {
-              "punctuation": /\.|:+/
-            }
-          },
-          "function": {
-            pattern: /(^|[^^])\B[@^]\w+(?:(?:\.|::?)\w+)*(?:\.|::?)?/,
-            lookbehind: true,
-            inside: {
-              "keyword": {
-                pattern: /(^@)(?:GET_|SET_)/,
-                lookbehind: true
-              },
-              "punctuation": /\.|:+/
-            }
-          },
-          "escape": {
-            pattern: /\^(?:[$^;@()\[\]{}"':]|#[a-f\d]*)/i,
-            alias: "builtin"
-          },
-          "punctuation": /[\[\](){};]/
-        });
-        parser = Prism2.languages.insertBefore("parser", "keyword", {
-          "parser-comment": {
-            pattern: /(\s)#.*/,
-            lookbehind: true,
-            alias: "comment"
-          },
-          "expression": {
-            // Allow for 3 levels of depth
-            pattern: /(^|[^^])\((?:[^()]|\((?:[^()]|\((?:[^()])*\))*\))*\)/,
-            greedy: true,
-            lookbehind: true,
-            inside: {
-              "string": {
-                pattern: /(^|[^^])(["'])(?:(?!\2)[^^]|\^[\s\S])*\2/,
-                lookbehind: true
-              },
-              "keyword": parser.keyword,
-              "variable": parser.variable,
-              "function": parser.function,
-              "boolean": /\b(?:false|true)\b/,
-              "number": /\b(?:0x[a-f\d]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?)\b/i,
-              "escape": parser.escape,
-              "operator": /[~+*\/\\%]|!(?:\|\|?|=)?|&&?|\|\|?|==|<[<=]?|>[>=]?|-[fd]?|\b(?:def|eq|ge|gt|in|is|le|lt|ne)\b/,
-              "punctuation": parser.punctuation
-            }
-          }
-        });
-        Prism2.languages.insertBefore("inside", "punctuation", {
-          "expression": parser.expression,
-          "keyword": parser.keyword,
-          "variable": parser.variable,
-          "function": parser.function,
-          "escape": parser.escape,
-          "parser-punctuation": {
-            pattern: parser.punctuation,
-            alias: "punctuation"
-          }
-        }, parser["tag"].inside["attr-value"]);
-      })(Prism);
-      Prism.languages.pascal = {
-        "directive": {
-          pattern: /\{\$[\s\S]*?\}/,
-          greedy: true,
-          alias: ["marco", "property"]
-        },
-        "comment": {
-          pattern: /\(\*[\s\S]*?\*\)|\{[\s\S]*?\}|\/\/.*/,
-          greedy: true
-        },
-        "string": {
-          pattern: /(?:'(?:''|[^'\r\n])*'(?!')|#[&$%]?[a-f\d]+)+|\^[a-z]/i,
-          greedy: true
-        },
-        "asm": {
-          pattern: /(\basm\b)[\s\S]+?(?=\bend\s*[;[])/i,
-          lookbehind: true,
-          greedy: true,
-          inside: null
-          // see below
-        },
-        "keyword": [
-          {
-            // Turbo Pascal
-            pattern: /(^|[^&])\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\b/i,
-            lookbehind: true
-          },
-          {
-            // Free Pascal
-            pattern: /(^|[^&])\b(?:dispose|exit|false|new|true)\b/i,
-            lookbehind: true
-          },
-          {
-            // Object Pascal
-            pattern: /(^|[^&])\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\b/i,
-            lookbehind: true
-          },
-          {
-            // Modifiers
-            pattern: /(^|[^&])\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\b/i,
-            lookbehind: true
-          }
-        ],
-        "number": [
-          // Hexadecimal, octal and binary
-          /(?:[&%]\d+|\$[a-f\d]+)/i,
-          // Decimal
-          /\b\d+(?:\.\d+)?(?:e[+-]?\d+)?/i
-        ],
-        "operator": [
-          /\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=]/,
-          {
-            pattern: /(^|[^&])\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\b/,
-            lookbehind: true
-          }
-        ],
-        "punctuation": /\(\.|\.\)|[()\[\]:;,.]/
-      };
-      Prism.languages.pascal.asm.inside = Prism.languages.extend("pascal", {
-        "asm": void 0,
-        "keyword": void 0,
-        "operator": void 0
-      });
-      Prism.languages.objectpascal = Prism.languages.pascal;
-      (function(Prism2) {
-        var braces = /\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\)/.source;
-        var type = /(?:\b\w+(?:<braces>)?|<braces>)/.source.replace(/<braces>/g, function() {
-          return braces;
-        });
-        var pascaligo = Prism2.languages.pascaligo = {
-          "comment": /\(\*[\s\S]+?\*\)|\/\/.*/,
-          "string": {
-            pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,
-            greedy: true
-          },
-          "class-name": [
-            {
-              pattern: RegExp(/(\btype\s+\w+\s+is\s+)<type>/.source.replace(/<type>/g, function() {
-                return type;
-              }), "i"),
-              lookbehind: true,
-              inside: null
-              // see below
-            },
-            {
-              pattern: RegExp(/<type>(?=\s+is\b)/.source.replace(/<type>/g, function() {
-                return type;
-              }), "i"),
-              inside: null
-              // see below
-            },
-            {
-              pattern: RegExp(/(:\s*)<type>/.source.replace(/<type>/g, function() {
-                return type;
-              })),
-              lookbehind: true,
-              inside: null
-              // see below
-            }
-          ],
-          "keyword": {
-            pattern: /(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,
-            lookbehind: true
-          },
-          "boolean": {
-            pattern: /(^|[^&])\b(?:False|True)\b/i,
-            lookbehind: true
-          },
-          "builtin": {
-            pattern: /(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,
-            lookbehind: true
-          },
-          "function": /\b\w+(?=\s*\()/,
-          "number": [
-            // Hexadecimal, octal and binary
-            /%[01]+|&[0-7]+|\$[a-f\d]+/i,
-            // Decimal
-            /\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i
-          ],
-          "operator": /->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,
-          "punctuation": /\(\.|\.\)|[()\[\]:;,.{}]/
-        };
-        var classNameInside = ["comment", "keyword", "builtin", "operator", "punctuation"].reduce(function(accum, key) {
-          accum[key] = pascaligo[key];
-          return accum;
-        }, {});
-        pascaligo["class-name"].forEach(function(p) {
-          p.inside = classNameInside;
-        });
-      })(Prism);
-      Prism.languages.psl = {
-        "comment": {
-          pattern: /#.*/,
-          greedy: true
-        },
-        "string": {
-          pattern: /"(?:\\.|[^\\"])*"/,
-          greedy: true,
-          inside: {
-            "symbol": /\\[ntrbA-Z"\\]/
-          }
-        },
-        "heredoc-string": {
-          pattern: /<<<([a-zA-Z_]\w*)[\r\n](?:.*[\r\n])*?\1\b/,
-          alias: "string",
-          greedy: true
-        },
-        "keyword": /\b(?:__multi|__single|case|default|do|else|elsif|exit|export|for|foreach|function|if|last|line|local|next|requires|return|switch|until|while|word)\b/,
-        "constant": /\b(?:ALARM|CHART_ADD_GRAPH|CHART_DELETE_GRAPH|CHART_DESTROY|CHART_LOAD|CHART_PRINT|EOF|OFFLINE|OK|PSL_PROF_LOG|R_CHECK_HORIZ|R_CHECK_VERT|R_CLICKER|R_COLUMN|R_FRAME|R_ICON|R_LABEL|R_LABEL_CENTER|R_LIST_MULTIPLE|R_LIST_MULTIPLE_ND|R_LIST_SINGLE|R_LIST_SINGLE_ND|R_MENU|R_POPUP|R_POPUP_SCROLLED|R_RADIO_HORIZ|R_RADIO_VERT|R_ROW|R_SCALE_HORIZ|R_SCALE_VERT|R_SEP_HORIZ|R_SEP_VERT|R_SPINNER|R_TEXT_FIELD|R_TEXT_FIELD_LABEL|R_TOGGLE|TRIM_LEADING|TRIM_LEADING_AND_TRAILING|TRIM_REDUNDANT|TRIM_TRAILING|VOID|WARN)\b/,
-        "boolean": /\b(?:FALSE|False|NO|No|TRUE|True|YES|Yes|false|no|true|yes)\b/,
-        "variable": /\b(?:PslDebug|errno|exit_status)\b/,
-        "builtin": {
-          pattern: /\b(?:PslExecute|PslFunctionCall|PslFunctionExists|PslSetOptions|_snmp_debug|acos|add_diary|annotate|annotate_get|ascii_to_ebcdic|asctime|asin|atan|atexit|batch_set|blackout|cat|ceil|chan_exists|change_state|close|code_cvt|cond_signal|cond_wait|console_type|convert_base|convert_date|convert_locale_date|cos|cosh|create|date|dcget_text|destroy|destroy_lock|dget_text|difference|dump_hist|ebcdic_to_ascii|encrypt|event_archive|event_catalog_get|event_check|event_query|event_range_manage|event_range_query|event_report|event_schedule|event_trigger|event_trigger2|execute|exists|exp|fabs|file|floor|fmod|fopen|fseek|ftell|full_discovery|get|get_chan_info|get_ranges|get_text|get_vars|getenv|gethostinfo|getpid|getpname|grep|history|history_get_retention|in_transition|index|int|internal|intersection|is_var|isnumber|join|kill|length|lines|lock|lock_info|log|log10|loge|matchline|msg_check|msg_get_format|msg_get_severity|msg_printf|msg_sprintf|ntharg|nthargf|nthline|nthlinef|num_bytes|num_consoles|pconfig|popen|poplines|pow|print|printf|proc_exists|process|random|read|readln|refresh_parameters|remote_check|remote_close|remote_event_query|remote_event_trigger|remote_file_send|remote_open|remove|replace|rindex|sec_check_priv|sec_store_get|sec_store_set|set|set_alarm_ranges|set_locale|share|sin|sinh|sleep|snmp_agent_config|snmp_agent_start|snmp_agent_stop|snmp_close|snmp_config|snmp_get|snmp_get_next|snmp_h_get|snmp_h_get_next|snmp_h_set|snmp_open|snmp_set|snmp_trap_ignore|snmp_trap_listen|snmp_trap_raise_std_trap|snmp_trap_receive|snmp_trap_register_im|snmp_trap_send|snmp_walk|sopen|sort|splitline|sprintf|sqrt|srandom|str_repeat|strcasecmp|subset|substr|system|tail|tan|tanh|text_domain|time|tmpnam|tolower|toupper|trace_psl_process|trim|union|unique|unlock|unset|va_arg|va_start|write)\b/,
-          alias: "builtin-function"
-        },
-        "foreach-variable": {
-          pattern: /(\bforeach\s+(?:(?:\w+\b|"(?:\\.|[^\\"])*")\s+){0,2})[_a-zA-Z]\w*(?=\s*\()/,
-          lookbehind: true,
-          greedy: true
-        },
-        "function": /\b[_a-z]\w*\b(?=\s*\()/i,
-        "number": /\b(?:0x[0-9a-f]+|\d+(?:\.\d+)?)\b/i,
-        "operator": /--|\+\+|&&=?|\|\|=?|<<=?|>>=?|[=!]~|[-+*/%&|^!=<>]=?|\.|[:?]/,
-        "punctuation": /[(){}\[\];,]/
-      };
-      Prism.languages.pcaxis = {
-        "string": /"[^"]*"/,
-        "keyword": {
-          pattern: /((?:^|;)\s*)[-A-Z\d]+(?:\s*\[[-\w]+\])?(?:\s*\("[^"]*"(?:,\s*"[^"]*")*\))?(?=\s*=)/,
-          lookbehind: true,
-          greedy: true,
-          inside: {
-            "keyword": /^[-A-Z\d]+/,
-            "language": {
-              pattern: /^(\s*)\[[-\w]+\]/,
-              lookbehind: true,
-              inside: {
-                "punctuation": /^\[|\]$/,
-                "property": /[-\w]+/
-              }
-            },
-            "sub-key": {
-              pattern: /^(\s*)\S[\s\S]*/,
-              lookbehind: true,
-              inside: {
-                "parameter": {
-                  pattern: /"[^"]*"/,
-                  alias: "property"
-                },
-                "punctuation": /^\(|\)$|,/
-              }
-            }
-          }
-        },
-        "operator": /=/,
-        "tlist": {
-          pattern: /TLIST\s*\(\s*\w+(?:(?:\s*,\s*"[^"]*")+|\s*,\s*"[^"]*"-"[^"]*")?\s*\)/,
-          greedy: true,
-          inside: {
-            "function": /^TLIST/,
-            "property": {
-              pattern: /^(\s*\(\s*)\w+/,
-              lookbehind: true
-            },
-            "string": /"[^"]*"/,
-            "punctuation": /[(),]/,
-            "operator": /-/
-          }
-        },
-        "punctuation": /[;,]/,
-        "number": {
-          pattern: /(^|\s)\d+(?:\.\d+)?(?!\S)/,
-          lookbehind: true
-        },
-        "boolean": /NO|YES/
-      };
-      Prism.languages.px = Prism.languages.pcaxis;
-      Prism.languages.peoplecode = {
-        "comment": RegExp([
-          // C-style multiline comments
-          /\/\*[\s\S]*?\*\//.source,
-          // REM comments
-          /\bREM[^;]*;/.source,
-          // Nested <* *> comments
-          /<\*(?:[^<*]|\*(?!>)|<(?!\*)|<\*(?:(?!\*>)[\s\S])*\*>)*\*>/.source,
-          // /+ +/ comments
-          /\/\+[\s\S]*?\+\//.source
-        ].join("|")),
-        "string": {
-          pattern: /'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,
-          greedy: true
-        },
-        "variable": /%\w+/,
-        "function-definition": {
-          pattern: /((?:^|[^\w-])(?:function|method)\s+)\w+/i,
-          lookbehind: true,
-          alias: "function"
-        },
-        "class-name": {
-          pattern: /((?:^|[^-\w])(?:as|catch|class|component|create|extends|global|implements|instance|local|of|property|returns)\s+)\w+(?::\w+)*/i,
-          lookbehind: true,
-          inside: {
-            "punctuation": /:/
-          }
-        },
-        "keyword": /\b(?:abstract|alias|as|catch|class|component|constant|create|declare|else|end-(?:class|evaluate|for|function|get|if|method|set|try|while)|evaluate|extends|for|function|get|global|if|implements|import|instance|library|local|method|null|of|out|peopleCode|private|program|property|protected|readonly|ref|repeat|returns?|set|step|then|throw|to|try|until|value|when(?:-other)?|while)\b/i,
-        "operator-keyword": {
-          pattern: /\b(?:and|not|or)\b/i,
-          alias: "operator"
-        },
-        "function": /[_a-z]\w*(?=\s*\()/i,
-        "boolean": /\b(?:false|true)\b/i,
-        "number": /\b\d+(?:\.\d+)?\b/,
-        "operator": /<>|[<>]=?|!=|\*\*|[-+*/|=@]/,
-        "punctuation": /[:.;,()[\]]/
-      };
-      Prism.languages.pcode = Prism.languages.peoplecode;
-      (function(Prism2) {
-        var brackets = /(?:\((?:[^()\\]|\\[\s\S])*\)|\{(?:[^{}\\]|\\[\s\S])*\}|\[(?:[^[\]\\]|\\[\s\S])*\]|<(?:[^<>\\]|\\[\s\S])*>)/.source;
-        Prism2.languages.perl = {
-          "comment": [
-            {
-              // POD
-              pattern: /(^\s*)=\w[\s\S]*?=cut.*/m,
-              lookbehind: true,
-              greedy: true
-            },
-            {
-              pattern: /(^|[^\\$])#.*/,
-              lookbehind: true,
-              greedy: true
-            }
-          ],
-          // TODO Could be nice to handle Heredoc too.
-          "string": [
-            {
-              pattern: RegExp(
-                /\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\s*/.source + "(?:" + [
-                  // q/.../
-                  /([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,
-                  // q a...a
-                  // eslint-disable-next-line regexp/strict
-                  /([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,
-                  // q(...)
-                  // q{...}
-                  // q[...]
-                  // q<...>
-                  brackets
-                ].join("|") + ")"
-              ),
-              greedy: true
-            },
-            // "...", `...`
-            {
-              pattern: /("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,
-              greedy: true
-            },
-            // '...'
-            // FIXME Multi-line single-quoted strings are not supported as they would break variables containing '
-            {
-              pattern: /'(?:[^'\\\r\n]|\\.)*'/,
-              greedy: true
-            }
-          ],
-          "regex": [
-            {
-              pattern: RegExp(
-                /\b(?:m|qr)(?![a-zA-Z0-9])\s*/.source + "(?:" + [
-                  // m/.../
-                  /([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,
-                  // m a...a
-                  // eslint-disable-next-line regexp/strict
-                  /([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,
-                  // m(...)
-                  // m{...}
-                  // m[...]
-                  // m<...>
-                  brackets
-                ].join("|") + ")" + /[msixpodualngc]*/.source
-              ),
-              greedy: true
-            },
-            // The lookbehinds prevent -s from breaking
-            {
-              pattern: RegExp(
-                /(^|[^-])\b(?:s|tr|y)(?![a-zA-Z0-9])\s*/.source + "(?:" + [
-                  // s/.../.../
-                  // eslint-disable-next-line regexp/strict
-                  /([^a-zA-Z0-9\s{(\[<])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,
-                  // s a...a...a
-                  // eslint-disable-next-line regexp/strict
-                  /([a-zA-Z0-9])(?:(?!\3)[^\\]|\\[\s\S])*\3(?:(?!\3)[^\\]|\\[\s\S])*\3/.source,
-                  // s(...)(...)
-                  // s{...}{...}
-                  // s[...][...]
-                  // s<...><...>
-                  // s(...)[...]
-                  brackets + /\s*/.source + brackets
-                ].join("|") + ")" + /[msixpodualngcer]*/.source
-              ),
-              lookbehind: true,
-              greedy: true
-            },
-            // /.../
-            // The look-ahead tries to prevent two divisions on
-            // the same line from being highlighted as regex.
-            // This does not support multi-line regex.
-            {
-              pattern: /\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,
-              greedy: true
-            }
-          ],
-          // FIXME Not sure about the handling of ::, ', and #
-          "variable": [
-            // ${^POSTMATCH}
-            /[&*$@%]\{\^[A-Z]+\}/,
-            // $^V
-            /[&*$@%]\^[A-Z_]/,
-            // ${...}
-            /[&*$@%]#?(?=\{)/,
-            // $foo
-            /[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,
-            // $1
-            /[&*$@%]\d+/,
-            // $_, @_, %!
-            // The negative lookahead prevents from breaking the %= operator
-            /(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/
-          ],
-          "filehandle": {
-            // <>, <FOO>, _
-            pattern: /<(?![<=])\S*?>|\b_\b/,
-            alias: "symbol"
-          },
-          "v-string": {
-            // v1.2, 1.2.3
-            pattern: /v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,
-            alias: "string"
-          },
-          "function": {
-            pattern: /(\bsub[ \t]+)\w+/,
-            lookbehind: true
-          },
-          "keyword": /\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,
-          "number": /\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,
-          "operator": /-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,
-          "punctuation": /[{}[\];(),:]/
-        };
-      })(Prism);
-      (function(Prism2) {
-        var typeExpression = /(?:\b[a-zA-Z]\w*|[|\\[\]])+/.source;
-        Prism2.languages.phpdoc = Prism2.languages.extend("javadoclike", {
-          "parameter": {
-            pattern: RegExp("(@(?:global|param|property(?:-read|-write)?|var)\\s+(?:" + typeExpression + "\\s+)?)\\$\\w+"),
-            lookbehind: true
-          }
-        });
-        Prism2.languages.insertBefore("phpdoc", "keyword", {
-          "class-name": [
-            {
-              pattern: RegExp("(@(?:global|package|param|property(?:-read|-write)?|return|subpackage|throws|var)\\s+)" + typeExpression),
-              lookbehind: true,
-              inside: {
-                "keyword": /\b(?:array|bool|boolean|callback|double|false|float|int|integer|mixed|null|object|resource|self|string|true|void)\b/,
-                "punctuation": /[|\\[\]()]/
-              }
-            }
-          ]
-        });
-        Prism2.languages.javadoclike.addSupport("php", Prism2.languages.phpdoc);
-      })(Prism);
-      Prism.languages.insertBefore("php", "variable", {
-        "this": {
-          pattern: /\$this\b/,
-          alias: "keyword"
-        },
-        "global": /\$(?:GLOBALS|HTTP_RAW_POST_DATA|_(?:COOKIE|ENV|FILES|GET|POST|REQUEST|SERVER|SESSION)|argc|argv|http_response_header|php_errormsg)\b/,
-        "scope": {
-          pattern: /\b[\w\\]+::/,
-          inside: {
-            "keyword": /\b(?:parent|self|static)\b/,
-            "punctuation": /::|\\/
-          }
-        }
-      });
-      (function(Prism2) {
-        var variable = /\$\w+|%[a-z]+%/;
-        var arrowAttr = /\[[^[\]]*\]/.source;
-        var arrowDirection = /(?:[drlu]|do|down|le|left|ri|right|up)/.source;
-        var arrowBody = "(?:-+" + arrowDirection + "-+|\\.+" + arrowDirection + "\\.+|-+(?:" + arrowAttr + "-*)?|" + arrowAttr + "-+|\\.+(?:" + arrowAttr + "\\.*)?|" + arrowAttr + "\\.+)";
-        var arrowLeft = /(?:<{1,2}|\/{1,2}|\\{1,2}|<\||[#*^+}xo])/.source;
-        var arrowRight = /(?:>{1,2}|\/{1,2}|\\{1,2}|\|>|[#*^+{xo])/.source;
-        var arrowPrefix = /[[?]?[ox]?/.source;
-        var arrowSuffix = /[ox]?[\]?]?/.source;
-        var arrow2 = arrowPrefix + "(?:" + arrowBody + arrowRight + "|" + arrowLeft + arrowBody + "(?:" + arrowRight + ")?)" + arrowSuffix;
-        Prism2.languages["plant-uml"] = {
-          "comment": {
-            pattern: /(^[ \t]*)(?:'.*|\/'[\s\S]*?'\/)/m,
-            lookbehind: true,
-            greedy: true
-          },
-          "preprocessor": {
-            pattern: /(^[ \t]*)!.*/m,
-            lookbehind: true,
-            greedy: true,
-            alias: "property",
-            inside: {
-              "variable": variable
-            }
-          },
-          "delimiter": {
-            pattern: /(^[ \t]*)@(?:end|start)uml\b/m,
-            lookbehind: true,
-            greedy: true,
-            alias: "punctuation"
-          },
-          "arrow": {
-            pattern: RegExp(/(^|[^-.<>?|\\[\]ox])/.source + arrow2 + /(?![-.<>?|\\\]ox])/.source),
-            lookbehind: true,
-            greedy: true,
-            alias: "operator",
-            inside: {
-              "expression": {
-                pattern: /(\[)[^[\]]+(?=\])/,
-                lookbehind: true,
-                inside: null
-                // see below
-              },
-              "punctuation": /\[(?=$|\])|^\]/
-            }
-          },
-          "string": {
-            pattern: /"[^"]*"/,
-            greedy: true
-          },
-          "text": {
-            pattern: /(\[[ \t]*[\r\n]+(?![\r\n]))[^\]]*(?=\])/,
-            lookbehind: true,
-            greedy: true,
-            alias: "string"
-          },
-          "keyword": [
-            {
-              pattern: /^([ \t]*)(?:abstract\s+class|end\s+(?:box|fork|group|merge|note|ref|split|title)|(?:fork|split)(?:\s+again)?|activate|actor|agent|alt|annotation|artifact|autoactivate|autonumber|backward|binary|boundary|box|break|caption|card|case|circle|class|clock|cloud|collections|component|concise|control|create|critical|database|deactivate|destroy|detach|diamond|else|elseif|end|end[hr]note|endif|endswitch|endwhile|entity|enum|file|folder|footer|frame|group|[hr]?note|header|hexagon|hide|if|interface|label|legend|loop|map|namespace|network|newpage|node|nwdiag|object|opt|package|page|par|participant|person|queue|rectangle|ref|remove|repeat|restore|return|robust|scale|set|show|skinparam|stack|start|state|stop|storage|switch|title|together|usecase|usecase\/|while)(?=\s|$)/m,
-              lookbehind: true,
-              greedy: true
-            },
-            /\b(?:elseif|equals|not|while)(?=\s*\()/,
-            /\b(?:as|is|then)\b/
-          ],
-          "divider": {
-            pattern: /^==.+==$/m,
-            greedy: true,
-            alias: "important"
-          },
-          "time": {
-            pattern: /@(?:\d+(?:[:/]\d+){2}|[+-]?\d+|:[a-z]\w*(?:[+-]\d+)?)\b/i,
-            greedy: true,
-            alias: "number"
-          },
-          "color": {
-            pattern: /#(?:[a-z_]+|[a-fA-F0-9]+)\b/,
-            alias: "symbol"
-          },
-          "variable": variable,
-          "punctuation": /[:,;()[\]{}]|\.{3}/
-        };
-        Prism2.languages["plant-uml"].arrow.inside.expression.inside = Prism2.languages["plant-uml"];
-        Prism2.languages["plantuml"] = Prism2.languages["plant-uml"];
-      })(Prism);
-      Prism.languages.plsql = Prism.languages.extend("sql", {
-        "comment": {
-          pattern: /\/\*[\s\S]*?\*\/|--.*/,
-          greedy: true
-        },
-        // https://docs.oracle.com/en/database/oracle/oracle-database/21/lnpls/plsql-reserved-words-keywords.html
-        "keyword": /\b(?:A|ACCESSIBLE|ADD|AGENT|AGGREGATE|ALL|ALTER|AND|ANY|ARRAY|AS|ASC|AT|ATTRIBUTE|AUTHID|AVG|BEGIN|BETWEEN|BFILE_BASE|BINARY|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BULK|BY|BYTE|C|CALL|CALLING|CASCADE|CASE|CHAR|CHARACTER|CHARSET|CHARSETFORM|CHARSETID|CHAR_BASE|CHECK|CLOB_BASE|CLONE|CLOSE|CLUSTER|CLUSTERS|COLAUTH|COLLECT|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPILED|COMPRESS|CONNECT|CONSTANT|CONSTRUCTOR|CONTEXT|CONTINUE|CONVERT|COUNT|CRASH|CREATE|CREDENTIAL|CURRENT|CURSOR|CUSTOMDATUM|DANGLING|DATA|DATE|DATE_BASE|DAY|DECLARE|DEFAULT|DEFINE|DELETE|DESC|DETERMINISTIC|DIRECTORY|DISTINCT|DOUBLE|DROP|DURATION|ELEMENT|ELSE|ELSIF|EMPTY|END|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXECUTE|EXISTS|EXIT|EXTERNAL|FETCH|FINAL|FIRST|FIXED|FLOAT|FOR|FORALL|FORCE|FROM|FUNCTION|GENERAL|GOTO|GRANT|GROUP|HASH|HAVING|HEAP|HIDDEN|HOUR|IDENTIFIED|IF|IMMEDIATE|IMMUTABLE|IN|INCLUDING|INDEX|INDEXES|INDICATOR|INDICES|INFINITE|INSERT|INSTANTIABLE|INT|INTERFACE|INTERSECT|INTERVAL|INTO|INVALIDATE|IS|ISOLATION|JAVA|LANGUAGE|LARGE|LEADING|LENGTH|LEVEL|LIBRARY|LIKE|LIKE2|LIKE4|LIKEC|LIMIT|LIMITED|LOCAL|LOCK|LONG|LOOP|MAP|MAX|MAXLEN|MEMBER|MERGE|MIN|MINUS|MINUTE|MOD|MODE|MODIFY|MONTH|MULTISET|MUTABLE|NAME|NAN|NATIONAL|NATIVE|NCHAR|NEW|NOCOMPRESS|NOCOPY|NOT|NOWAIT|NULL|NUMBER_BASE|OBJECT|OCICOLL|OCIDATE|OCIDATETIME|OCIDURATION|OCIINTERVAL|OCILOBLOCATOR|OCINUMBER|OCIRAW|OCIREF|OCIREFCURSOR|OCIROWID|OCISTRING|OCITYPE|OF|OLD|ON|ONLY|OPAQUE|OPEN|OPERATOR|OPTION|OR|ORACLE|ORADATA|ORDER|ORGANIZATION|ORLANY|ORLVARY|OTHERS|OUT|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETER|PARAMETERS|PARENT|PARTITION|PASCAL|PERSISTABLE|PIPE|PIPELINED|PLUGGABLE|POLYMORPHIC|PRAGMA|PRECISION|PRIOR|PRIVATE|PROCEDURE|PUBLIC|RAISE|RANGE|RAW|READ|RECORD|REF|REFERENCE|RELIES_ON|REM|REMAINDER|RENAME|RESOURCE|RESULT|RESULT_CACHE|RETURN|RETURNING|REVERSE|REVOKE|ROLLBACK|ROW|SAMPLE|SAVE|SAVEPOINT|SB1|SB2|SB4|SECOND|SEGMENT|SELECT|SELF|SEPARATE|SEQUENCE|SERIALIZABLE|SET|SHARE|SHORT|SIZE|SIZE_T|SOME|SPARSE|SQL|SQLCODE|SQLDATA|SQLNAME|SQLSTATE|STANDARD|START|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUM|SYNONYM|TABAUTH|TABLE|TDO|THE|THEN|TIME|TIMESTAMP|TIMEZONE_ABBR|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TO|TRAILING|TRANSACTION|TRANSACTIONAL|TRUSTED|TYPE|UB1|UB2|UB4|UNDER|UNION|UNIQUE|UNPLUG|UNSIGNED|UNTRUSTED|UPDATE|USE|USING|VALIST|VALUE|VALUES|VARIABLE|VARIANCE|VARRAY|VARYING|VIEW|VIEWS|VOID|WHEN|WHERE|WHILE|WITH|WORK|WRAPPED|WRITE|YEAR|ZONE)\b/i,
-        // https://docs.oracle.com/en/database/oracle/oracle-database/21/lnpls/plsql-language-fundamentals.html#GUID-96A42F7C-7A71-4B90-8255-CA9C8BD9722E
-        "operator": /:=?|=>|[<>^~!]=|\.\.|\|\||\*\*|[-+*/%<>=@]/
-      });
-      Prism.languages.insertBefore("plsql", "operator", {
-        "label": {
-          pattern: /<<\s*\w+\s*>>/,
-          alias: "symbol"
-        }
-      });
-      Prism.languages.powerquery = {
-        "comment": {
-          pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
-          lookbehind: true,
-          greedy: true
-        },
-        "quoted-identifier": {
-          pattern: /#"(?:[^"\r\n]|"")*"(?!")/,
-          greedy: true
-        },
-        "string": {
-          pattern: /(?:#!)?"(?:[^"\r\n]|"")*"(?!")/,
-          greedy: true
-        },
-        "constant": [
-          /\bDay\.(?:Friday|Monday|Saturday|Sunday|Thursday|Tuesday|Wednesday)\b/,
-          /\bTraceLevel\.(?:Critical|Error|Information|Verbose|Warning)\b/,
-          /\bOccurrence\.(?:All|First|Last)\b/,
-          /\bOrder\.(?:Ascending|Descending)\b/,
-          /\bRoundingMode\.(?:AwayFromZero|Down|ToEven|TowardZero|Up)\b/,
-          /\bMissingField\.(?:Error|Ignore|UseNull)\b/,
-          /\bQuoteStyle\.(?:Csv|None)\b/,
-          /\bJoinKind\.(?:FullOuter|Inner|LeftAnti|LeftOuter|RightAnti|RightOuter)\b/,
-          /\bGroupKind\.(?:Global|Local)\b/,
-          /\bExtraValues\.(?:Error|Ignore|List)\b/,
-          /\bJoinAlgorithm\.(?:Dynamic|LeftHash|LeftIndex|PairwiseHash|RightHash|RightIndex|SortMerge)\b/,
-          /\bJoinSide\.(?:Left|Right)\b/,
-          /\bPrecision\.(?:Decimal|Double)\b/,
-          /\bRelativePosition\.From(?:End|Start)\b/,
-          /\bTextEncoding\.(?:Ascii|BigEndianUnicode|Unicode|Utf16|Utf8|Windows)\b/,
-          /\b(?:Any|Binary|Date|DateTime|DateTimeZone|Duration|Function|Int16|Int32|Int64|Int8|List|Logical|None|Number|Record|Table|Text|Time)\.Type\b/,
-          /\bnull\b/
-        ],
-        "boolean": /\b(?:false|true)\b/,
-        "keyword": /\b(?:and|as|each|else|error|if|in|is|let|meta|not|nullable|optional|or|otherwise|section|shared|then|try|type)\b|#(?:binary|date|datetime|datetimezone|duration|infinity|nan|sections|shared|table|time)\b/,
-        "function": {
-          pattern: /(^|[^#\w.])[a-z_][\w.]*(?=\s*\()/i,
-          lookbehind: true
-        },
-        "data-type": {
-          pattern: /\b(?:any|anynonnull|binary|date|datetime|datetimezone|duration|function|list|logical|none|number|record|table|text|time)\b/,
-          alias: "class-name"
-        },
-        "number": {
-          pattern: /\b0x[\da-f]+\b|(?:[+-]?(?:\b\d+\.)?\b\d+|[+-]\.\d+|(^|[^.])\B\.\d+)(?:e[+-]?\d+)?\b/i,
-          lookbehind: true
-        },
-        "operator": /[-+*\/&?@^]|<(?:=>?|>)?|>=?|=>?|\.\.\.?/,
-        "punctuation": /[,;\[\](){}]/
-      };
-      Prism.languages.pq = Prism.languages["powerquery"];
-      Prism.languages.mscript = Prism.languages["powerquery"];
-      (function(Prism2) {
-        var powershell = Prism2.languages.powershell = {
-          "comment": [
-            {
-              pattern: /(^|[^`])<#[\s\S]*?#>/,
-              lookbehind: true
-            },
-            {
-              pattern: /(^|[^`])#.*/,
-              lookbehind: true
-            }
-          ],
-          "string": [
-            {
-              pattern: /"(?:`[\s\S]|[^`"])*"/,
-              greedy: true,
-              inside: null
-              // see below
-            },
-            {
-              pattern: /'(?:[^']|'')*'/,
-              greedy: true
-            }
-          ],
-          // Matches name spaces as well as casts, attribute decorators. Force starting with letter to avoid matching array indices
-          // Supports two levels of nested brackets (e.g. `[OutputType([System.Collections.Generic.List[int]])]`)
-          "namespace": /\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,
-          "boolean": /\$(?:false|true)\b/i,
-          "variable": /\$\w+\b/,
-          // Cmdlets and aliases. Aliases should come last, otherwise "write" gets preferred over "write-host" for example
-          // Get-Command | ?{ $_.ModuleName -match "Microsoft.PowerShell.(Util|Core|Management)" }
-          // Get-Alias | ?{ $_.ReferencedCommand.Module.Name -match "Microsoft.PowerShell.(Util|Core|Management)" }
-          "function": [
-            /\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,
-            /\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i
-          ],
-          // per http://technet.microsoft.com/en-us/library/hh847744.aspx
-          "keyword": /\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,
-          "operator": {
-            pattern: /(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,
-            lookbehind: true
-          },
-          "punctuation": /[|{}[\];(),.]/
-        };
-        powershell.string[0].inside = {
-          "function": {
-            // Allow for one level of nesting
-            pattern: /(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,
-            lookbehind: true,
-            inside: powershell
-          },
-          "boolean": powershell.boolean,
-          "variable": powershell.variable
-        };
-      })(Prism);
-      Prism.languages.processing = Prism.languages.extend("clike", {
-        "keyword": /\b(?:break|case|catch|class|continue|default|else|extends|final|for|if|implements|import|new|null|private|public|return|static|super|switch|this|try|void|while)\b/,
-        // Spaces are allowed between function name and parenthesis
-        "function": /\b\w+(?=\s*\()/,
-        "operator": /<[<=]?|>[>=]?|&&?|\|\|?|[%?]|[!=+\-*\/]=?/
-      });
-      Prism.languages.insertBefore("processing", "number", {
-        // Special case: XML is a type
-        "constant": /\b(?!XML\b)[A-Z][A-Z\d_]+\b/,
-        "type": {
-          pattern: /\b(?:boolean|byte|char|color|double|float|int|[A-Z]\w*)\b/,
-          alias: "class-name"
-        }
-      });
-      Prism.languages.prolog = {
-        // Syntax depends on the implementation
-        "comment": {
-          pattern: /\/\*[\s\S]*?\*\/|%.*/,
-          greedy: true
-        },
-        // Depending on the implementation, strings may allow escaped newlines and quote-escape
-        "string": {
-          pattern: /(["'])(?:\1\1|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1(?!\1)/,
-          greedy: true
-        },
-        "builtin": /\b(?:fx|fy|xf[xy]?|yfx?)\b/,
-        // FIXME: Should we list all null-ary predicates (not followed by a parenthesis) like halt, trace, etc.?
-        "function": /\b[a-z]\w*(?:(?=\()|\/\d+)/,
-        "number": /\b\d+(?:\.\d*)?/,
-        // Custom operators are allowed
-        "operator": /[:\\=><\-?*@\/;+^|!$.]+|\b(?:is|mod|not|xor)\b/,
-        "punctuation": /[(){}\[\],]/
-      };
-      (function(Prism2) {
-        var aggregations = [
-          "sum",
-          "min",
-          "max",
-          "avg",
-          "group",
-          "stddev",
-          "stdvar",
-          "count",
-          "count_values",
-          "bottomk",
-          "topk",
-          "quantile"
-        ];
-        var vectorMatching = [
-          "on",
-          "ignoring",
-          "group_right",
-          "group_left",
-          "by",
-          "without"
-        ];
-        var offsetModifier = ["offset"];
-        var keywords = aggregations.concat(vectorMatching, offsetModifier);
-        Prism2.languages.promql = {
-          "comment": {
-            pattern: /(^[ \t]*)#.*/m,
-            lookbehind: true
-          },
-          "vector-match": {
-            // Match the comma-separated label lists inside vector matching:
-            pattern: new RegExp("((?:" + vectorMatching.join("|") + ")\\s*)\\([^)]*\\)"),
-            lookbehind: true,
-            inside: {
-              "label-key": {
-                pattern: /\b[^,]+\b/,
-                alias: "attr-name"
-              },
-              "punctuation": /[(),]/
-            }
-          },
-          "context-labels": {
-            pattern: /\{[^{}]*\}/,
-            inside: {
-              "label-key": {
-                pattern: /\b[a-z_]\w*(?=\s*(?:=|![=~]))/,
-                alias: "attr-name"
-              },
-              "label-value": {
-                pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,
-                greedy: true,
-                alias: "attr-value"
-              },
-              "punctuation": /\{|\}|=~?|![=~]|,/
-            }
-          },
-          "context-range": [
-            {
-              pattern: /\[[\w\s:]+\]/,
-              // [1m]
-              inside: {
-                "punctuation": /\[|\]|:/,
-                "range-duration": {
-                  pattern: /\b(?:\d+(?:[smhdwy]|ms))+\b/i,
-                  alias: "number"
-                }
-              }
-            },
-            {
-              pattern: /(\boffset\s+)\w+/,
-              // offset 1m
-              lookbehind: true,
-              inside: {
-                "range-duration": {
-                  pattern: /\b(?:\d+(?:[smhdwy]|ms))+\b/i,
-                  alias: "number"
-                }
-              }
-            }
-          ],
-          "keyword": new RegExp("\\b(?:" + keywords.join("|") + ")\\b", "i"),
-          "function": /\b[a-z_]\w*(?=\s*\()/i,
-          "number": /[-+]?(?:(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[-+]?\d+)?\b|\b(?:0x[0-9a-f]+|nan|inf)\b)/i,
-          "operator": /[\^*/%+-]|==|!=|<=|<|>=|>|\b(?:and|or|unless)\b/i,
-          "punctuation": /[{};()`,.[\]]/
-        };
-      })(Prism);
-      Prism.languages.properties = {
-        "comment": /^[ \t]*[#!].*$/m,
-        "value": {
-          pattern: /(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,
-          lookbehind: true,
-          alias: "attr-value"
-        },
-        "key": {
-          pattern: /^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,
-          alias: "attr-name"
-        },
-        "punctuation": /[=:]/
-      };
-      (function(Prism2) {
-        var builtinTypes = /\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;
-        Prism2.languages.protobuf = Prism2.languages.extend("clike", {
-          "class-name": [
-            {
-              pattern: /(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,
-              lookbehind: true
-            },
-            {
-              pattern: /(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,
-              lookbehind: true
-            }
-          ],
-          "keyword": /\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,
-          "function": /\b[a-z_]\w*(?=\s*\()/i
-        });
-        Prism2.languages.insertBefore("protobuf", "operator", {
-          "map": {
-            pattern: /\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,
-            alias: "class-name",
-            inside: {
-              "punctuation": /[<>.,]/,
-              "builtin": builtinTypes
-            }
-          },
-          "builtin": builtinTypes,
-          "positional-class-name": {
-            pattern: /(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,
-            alias: "class-name",
-            inside: {
-              "punctuation": /\./
-            }
-          },
-          "annotation": {
-            pattern: /(\[\s*)[a-z_]\w*(?=\s*=)/i,
-            lookbehind: true
-          }
-        });
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages.pug = {
-          // Multiline stuff should appear before the rest
-          // This handles both single-line and multi-line comments
-          "comment": {
-            pattern: /(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,
-            lookbehind: true
-          },
-          // All the tag-related part is in lookbehind
-          // so that it can be highlighted by the "tag" pattern
-          "multiline-script": {
-            pattern: /(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,
-            lookbehind: true,
-            inside: Prism2.languages.javascript
-          },
-          // See at the end of the file for known filters
-          "filter": {
-            pattern: /(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,
-            lookbehind: true,
-            inside: {
-              "filter-name": {
-                pattern: /^:[\w-]+/,
-                alias: "variable"
-              },
-              "text": /\S[\s\S]*/
-            }
-          },
-          "multiline-plain-text": {
-            pattern: /(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,
-            lookbehind: true
-          },
-          "markup": {
-            pattern: /(^[\t ]*)<.+/m,
-            lookbehind: true,
-            inside: Prism2.languages.markup
-          },
-          "doctype": {
-            pattern: /((?:^|\n)[\t ]*)doctype(?: .+)?/,
-            lookbehind: true
-          },
-          // This handle all conditional and loop keywords
-          "flow-control": {
-            pattern: /(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m,
-            lookbehind: true,
-            inside: {
-              "each": {
-                pattern: /^each .+? in\b/,
-                inside: {
-                  "keyword": /\b(?:each|in)\b/,
-                  "punctuation": /,/
-                }
-              },
-              "branch": {
-                pattern: /^(?:case|default|else|if|unless|when|while)\b/,
-                alias: "keyword"
-              },
-              rest: Prism2.languages.javascript
-            }
-          },
-          "keyword": {
-            pattern: /(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m,
-            lookbehind: true
-          },
-          "mixin": [
-            // Declaration
-            {
-              pattern: /(^[\t ]*)mixin .+/m,
-              lookbehind: true,
-              inside: {
-                "keyword": /^mixin/,
-                "function": /\w+(?=\s*\(|\s*$)/,
-                "punctuation": /[(),.]/
-              }
-            },
-            // Usage
-            {
-              pattern: /(^[\t ]*)\+.+/m,
-              lookbehind: true,
-              inside: {
-                "name": {
-                  pattern: /^\+\w+/,
-                  alias: "function"
-                },
-                rest: Prism2.languages.javascript
-              }
-            }
-          ],
-          "script": {
-            pattern: /(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,
-            lookbehind: true,
-            inside: Prism2.languages.javascript
-          },
-          "plain-text": {
-            pattern: /(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,
-            lookbehind: true
-          },
-          "tag": {
-            pattern: /(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,
-            lookbehind: true,
-            inside: {
-              "attributes": [
-                {
-                  pattern: /&[^(]+\([^)]+\)/,
-                  inside: Prism2.languages.javascript
-                },
-                {
-                  pattern: /\([^)]+\)/,
-                  inside: {
-                    "attr-value": {
-                      pattern: /(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,
-                      lookbehind: true,
-                      inside: Prism2.languages.javascript
-                    },
-                    "attr-name": /[\w-]+(?=\s*!?=|\s*[,)])/,
-                    "punctuation": /[!=(),]+/
-                  }
-                }
-              ],
-              "punctuation": /:/,
-              "attr-id": /#[\w\-]+/,
-              "attr-class": /\.[\w\-]+/
-            }
-          },
-          "code": [
-            {
-              pattern: /(^[\t ]*(?:-|!?=)).+/m,
-              lookbehind: true,
-              inside: Prism2.languages.javascript
-            }
-          ],
-          "punctuation": /[.\-!=|]+/
-        };
-        var filter_pattern = /(^([\t ]*)):<filter_name>(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/.source;
-        var filters = [
-          { filter: "atpl", language: "twig" },
-          { filter: "coffee", language: "coffeescript" },
-          "ejs",
-          "handlebars",
-          "less",
-          "livescript",
-          "markdown",
-          { filter: "sass", language: "scss" },
-          "stylus"
-        ];
-        var all_filters = {};
-        for (var i = 0, l = filters.length; i < l; i++) {
-          var filter = filters[i];
-          filter = typeof filter === "string" ? { filter, language: filter } : filter;
-          if (Prism2.languages[filter.language]) {
-            all_filters["filter-" + filter.filter] = {
-              pattern: RegExp(filter_pattern.replace("<filter_name>", function() {
-                return filter.filter;
-              }), "m"),
-              lookbehind: true,
-              inside: {
-                "filter-name": {
-                  pattern: /^:[\w-]+/,
-                  alias: "variable"
-                },
-                "text": {
-                  pattern: /\S[\s\S]*/,
-                  alias: [filter.language, "language-" + filter.language],
-                  inside: Prism2.languages[filter.language]
-                }
-              }
-            };
-          }
-        }
-        Prism2.languages.insertBefore("pug", "filter", all_filters);
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages.puppet = {
-          "heredoc": [
-            // Matches the content of a quoted heredoc string (subject to interpolation)
-            {
-              pattern: /(@\("([^"\r\n\/):]+)"(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,
-              lookbehind: true,
-              alias: "string",
-              inside: {
-                // Matches the end tag
-                "punctuation": /(?=\S).*\S(?= *$)/
-                // See interpolation below
-              }
-            },
-            // Matches the content of an unquoted heredoc string (no interpolation)
-            {
-              pattern: /(@\(([^"\r\n\/):]+)(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,
-              lookbehind: true,
-              greedy: true,
-              alias: "string",
-              inside: {
-                // Matches the end tag
-                "punctuation": /(?=\S).*\S(?= *$)/
-              }
-            },
-            // Matches the start tag of heredoc strings
-            {
-              pattern: /@\("?(?:[^"\r\n\/):]+)"?(?:\/[nrts$uL]*)?\)/,
-              alias: "string",
-              inside: {
-                "punctuation": {
-                  pattern: /(\().+?(?=\))/,
-                  lookbehind: true
-                }
-              }
-            }
-          ],
-          "multiline-comment": {
-            pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
-            lookbehind: true,
-            greedy: true,
-            alias: "comment"
-          },
-          "regex": {
-            // Must be prefixed with the keyword "node" or a non-word char
-            pattern: /((?:\bnode\s+|[~=\(\[\{,]\s*|[=+]>\s*|^\s*))\/(?:[^\/\\]|\\[\s\S])+\/(?:[imx]+\b|\B)/,
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              // Extended regexes must have the x flag. They can contain single-line comments.
-              "extended-regex": {
-                pattern: /^\/(?:[^\/\\]|\\[\s\S])+\/[im]*x[im]*$/,
-                inside: {
-                  "comment": /#.*/
-                }
-              }
-            }
-          },
-          "comment": {
-            pattern: /(^|[^\\])#.*/,
-            lookbehind: true,
-            greedy: true
-          },
-          "string": {
-            // Allow for one nested level of double quotes inside interpolation
-            pattern: /(["'])(?:\$\{(?:[^'"}]|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}|\$(?!\{)|(?!\1)[^\\$]|\\[\s\S])*\1/,
-            greedy: true,
-            inside: {
-              "double-quoted": {
-                pattern: /^"[\s\S]*"$/,
-                inside: {
-                  // See interpolation below
-                }
-              }
-            }
-          },
-          "variable": {
-            pattern: /\$(?:::)?\w+(?:::\w+)*/,
-            inside: {
-              "punctuation": /::/
-            }
-          },
-          "attr-name": /(?:\b\w+|\*)(?=\s*=>)/,
-          "function": [
-            {
-              pattern: /(\.)(?!\d)\w+/,
-              lookbehind: true
-            },
-            /\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\b|\b(?!\d)\w+(?=\()/
-          ],
-          "number": /\b(?:0x[a-f\d]+|\d+(?:\.\d+)?(?:e-?\d+)?)\b/i,
-          "boolean": /\b(?:false|true)\b/,
-          // Includes words reserved for future use
-          "keyword": /\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\b/,
-          "datatype": {
-            pattern: /\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\b/,
-            alias: "symbol"
-          },
-          "operator": /=[=~>]?|![=~]?|<(?:<\|?|[=~|-])?|>[>=]?|->?|~>|\|>?>?|[*\/%+?]|\b(?:and|in|or)\b/,
-          "punctuation": /[\[\]{}().,;]|:+/
-        };
-        var interpolation = [
-          {
-            // Allow for one nested level of braces inside interpolation
-            pattern: /(^|[^\\])\$\{(?:[^'"{}]|\{[^}]*\}|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}/,
-            lookbehind: true,
-            inside: {
-              "short-variable": {
-                // Negative look-ahead prevent wrong highlighting of functions
-                pattern: /(^\$\{)(?!\w+\()(?:::)?\w+(?:::\w+)*/,
-                lookbehind: true,
-                alias: "variable",
-                inside: {
-                  "punctuation": /::/
-                }
-              },
-              "delimiter": {
-                pattern: /^\$/,
-                alias: "variable"
-              },
-              rest: Prism2.languages.puppet
-            }
-          },
-          {
-            pattern: /(^|[^\\])\$(?:::)?\w+(?:::\w+)*/,
-            lookbehind: true,
-            alias: "variable",
-            inside: {
-              "punctuation": /::/
-            }
-          }
-        ];
-        Prism2.languages.puppet["heredoc"][0].inside.interpolation = interpolation;
-        Prism2.languages.puppet["string"].inside["double-quoted"].inside.interpolation = interpolation;
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages.pure = {
-          "comment": [
-            {
-              pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
-              lookbehind: true
-            },
-            {
-              pattern: /(^|[^\\:])\/\/.*/,
-              lookbehind: true
-            },
-            /#!.+/
-          ],
-          "inline-lang": {
-            pattern: /%<[\s\S]+?%>/,
-            greedy: true,
-            inside: {
-              "lang": {
-                pattern: /(^%< *)-\*-.+?-\*-/,
-                lookbehind: true,
-                alias: "comment"
-              },
-              "delimiter": {
-                pattern: /^%<.*|%>$/,
-                alias: "punctuation"
-              }
-            }
-          },
-          "string": {
-            pattern: /"(?:\\.|[^"\\\r\n])*"/,
-            greedy: true
-          },
-          "number": {
-            // The look-behind prevents wrong highlighting of the .. operator
-            pattern: /((?:\.\.)?)(?:\b(?:inf|nan)\b|\b0x[\da-f]+|(?:\b(?:0b)?\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?L?)/i,
-            lookbehind: true
-          },
-          "keyword": /\b(?:NULL|ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\b/,
-          "function": /\b(?:abs|add_(?:addr|constdef|(?:fundef|interface|macdef|typedef)(?:_at)?|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_c?string(?:_pointer)?|byte_(?:matrix|pointer)|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|sentry|short|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\b/,
-          "special": {
-            pattern: /\b__[a-z]+__\b/i,
-            alias: "builtin"
-          },
-          // Any combination of operator chars can be an operator
-          // eslint-disable-next-line no-misleading-character-class
-          "operator": /(?:[!"#$%&'*+,\-.\/:<=>?@\\^`|~\u00a1-\u00bf\u00d7-\u00f7\u20d0-\u2bff]|\b_+\b)+|\b(?:and|div|mod|not|or)\b/,
-          // FIXME: How can we prevent | and , to be highlighted as operator when they are used alone?
-          "punctuation": /[(){}\[\];,|]/
-        };
-        var inlineLanguages = [
-          "c",
-          { lang: "c++", alias: "cpp" },
-          "fortran"
-        ];
-        var inlineLanguageRe = /%< *-\*- *<lang>\d* *-\*-[\s\S]+?%>/.source;
-        inlineLanguages.forEach(function(lang) {
-          var alias = lang;
-          if (typeof lang !== "string") {
-            alias = lang.alias;
-            lang = lang.lang;
-          }
-          if (Prism2.languages[alias]) {
-            var o = {};
-            o["inline-lang-" + alias] = {
-              pattern: RegExp(inlineLanguageRe.replace("<lang>", lang.replace(/([.+*?\/\\(){}\[\]])/g, "\\$1")), "i"),
-              inside: Prism2.util.clone(Prism2.languages.pure["inline-lang"].inside)
-            };
-            o["inline-lang-" + alias].inside.rest = Prism2.util.clone(Prism2.languages[alias]);
-            Prism2.languages.insertBefore("pure", "inline-lang", o);
-          }
-        });
-        if (Prism2.languages.c) {
-          Prism2.languages.pure["inline-lang"].inside.rest = Prism2.util.clone(Prism2.languages.c);
-        }
-      })(Prism);
-      Prism.languages.purebasic = Prism.languages.extend("clike", {
-        "comment": /;.*/,
-        "keyword": /\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\b/i,
-        "function": /\b\w+(?:\.\w+)?\s*(?=\()/,
-        "number": /(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i,
-        "operator": /(?:@\*?|\?|\*)\w+\$?|-[>-]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|?\||[~^%?*/@]/
-      });
-      Prism.languages.insertBefore("purebasic", "keyword", {
-        "tag": /#\w+\$?/,
-        "asm": {
-          pattern: /(^[\t ]*)!.*/m,
-          lookbehind: true,
-          alias: "tag",
-          inside: {
-            "comment": /;.*/,
-            "string": {
-              pattern: /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
-              greedy: true
-            },
-            // Anonymous label references, i.e.: jmp @b
-            "label-reference-anonymous": {
-              pattern: /(!\s*j[a-z]+\s+)@[fb]/i,
-              lookbehind: true,
-              alias: "fasm-label"
-            },
-            // Named label reference, i.e.: jne label1
-            "label-reference-addressed": {
-              pattern: /(!\s*j[a-z]+\s+)[A-Z._?$@][\w.?$@~#]*/i,
-              lookbehind: true,
-              alias: "fasm-label"
-            },
-            "keyword": [
-              /\b(?:extern|global)\b[^;\r\n]*/i,
-              /\b(?:CPU|DEFAULT|FLOAT)\b.*/
-            ],
-            "function": {
-              pattern: /^([\t ]*!\s*)[\da-z]+(?=\s|$)/im,
-              lookbehind: true
-            },
-            "function-inline": {
-              pattern: /(:\s*)[\da-z]+(?=\s)/i,
-              lookbehind: true,
-              alias: "function"
-            },
-            "label": {
-              pattern: /^([\t ]*!\s*)[A-Za-z._?$@][\w.?$@~#]*(?=:)/m,
-              lookbehind: true,
-              alias: "fasm-label"
-            },
-            "register": /\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s|mm\d+)\b/i,
-            "number": /(?:\b|-|(?=\$))(?:0[hx](?:[\da-f]*\.)?[\da-f]+(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,
-            "operator": /[\[\]*+\-/%<>=&|$!,.:]/
-          }
-        }
-      });
-      delete Prism.languages.purebasic["class-name"];
-      delete Prism.languages.purebasic["boolean"];
-      Prism.languages.pbfasm = Prism.languages["purebasic"];
-      Prism.languages.purescript = Prism.languages.extend("haskell", {
-        "keyword": /\b(?:ado|case|class|data|derive|do|else|forall|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b|∀/,
-        "import-statement": {
-          // The imported or hidden names are not included in this import
-          // statement. This is because we want to highlight those exactly like
-          // we do for the names in the program.
-          pattern: /(^[\t ]*)import\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*(?:\s+as\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,
-          lookbehind: true,
-          inside: {
-            "keyword": /\b(?:as|hiding|import)\b/,
-            "punctuation": /\./
-          }
-        },
-        // These are builtin functions only. Constructors are highlighted later as a constant.
-        "builtin": /\b(?:absurd|add|ap|append|apply|between|bind|bottom|clamp|compare|comparing|compose|conj|const|degree|discard|disj|div|eq|flap|flip|gcd|identity|ifM|join|lcm|liftA1|liftM1|map|max|mempty|min|mod|mul|negate|not|notEq|one|otherwise|recip|show|sub|top|unit|unless|unlessM|void|when|whenM|zero)\b/,
-        "operator": [
-          // Infix operators
-          Prism.languages.haskell.operator[0],
-          // ASCII operators
-          Prism.languages.haskell.operator[2],
-          // All UTF16 Unicode operator symbols
-          // This regex is equivalent to /(?=[\x80-\uFFFF])[\p{gc=Math_Symbol}\p{gc=Currency_Symbol}\p{Modifier_Symbol}\p{Other_Symbol}]/u
-          // See https://github.com/PrismJS/prism/issues/3006 for more details.
-          /[\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u07fe\u07ff\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u166d\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20bf\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b97-\u2bff\u2ce5-\u2cea\u2e50\u2e51\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\uab6a\uab6b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd]/
-        ]
-      });
-      Prism.languages.purs = Prism.languages.purescript;
-      Prism.languages.python = {
-        "comment": {
-          pattern: /(^|[^\\])#.*/,
-          lookbehind: true,
-          greedy: true
-        },
-        "string-interpolation": {
-          pattern: /(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,
-          greedy: true,
-          inside: {
-            "interpolation": {
-              // "{" <expression> <optional "!s", "!r", or "!a"> <optional ":" format specifier> "}"
-              pattern: /((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,
-              lookbehind: true,
-              inside: {
-                "format-spec": {
-                  pattern: /(:)[^:(){}]+(?=\}$)/,
-                  lookbehind: true
-                },
-                "conversion-option": {
-                  pattern: /![sra](?=[:}]$)/,
-                  alias: "punctuation"
-                },
-                rest: null
-              }
-            },
-            "string": /[\s\S]+/
-          }
-        },
-        "triple-quoted-string": {
-          pattern: /(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,
-          greedy: true,
-          alias: "string"
-        },
-        "string": {
-          pattern: /(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,
-          greedy: true
-        },
-        "function": {
-          pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,
-          lookbehind: true
-        },
-        "class-name": {
-          pattern: /(\bclass\s+)\w+/i,
-          lookbehind: true
-        },
-        "decorator": {
-          pattern: /(^[\t ]*)@\w+(?:\.\w+)*/m,
-          lookbehind: true,
-          alias: ["annotation", "punctuation"],
-          inside: {
-            "punctuation": /\./
-          }
-        },
-        "keyword": /\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,
-        "builtin": /\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,
-        "boolean": /\b(?:False|None|True)\b/,
-        "number": /\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,
-        "operator": /[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,
-        "punctuation": /[{}[\];(),.:]/
-      };
-      Prism.languages.python["string-interpolation"].inside["interpolation"].inside.rest = Prism.languages.python;
-      Prism.languages.py = Prism.languages.python;
-      (function(Prism2) {
-        function replace(pattern, replacements) {
-          return pattern.replace(/<<(\d+)>>/g, function(m, index) {
-            return "(?:" + replacements[+index] + ")";
-          });
-        }
-        function re(pattern, replacements, flags) {
-          return RegExp(replace(pattern, replacements), flags || "");
-        }
-        function nested(pattern, depthLog2) {
-          for (var i = 0; i < depthLog2; i++) {
-            pattern = pattern.replace(/<<self>>/g, function() {
-              return "(?:" + pattern + ")";
-            });
-          }
-          return pattern.replace(/<<self>>/g, "[^\\s\\S]");
-        }
-        var keywordKinds = {
-          // keywords which represent a return or variable type
-          type: "Adj BigInt Bool Ctl Double false Int One Pauli PauliI PauliX PauliY PauliZ Qubit Range Result String true Unit Zero",
-          // all other keywords
-          other: "Adjoint adjoint apply as auto body borrow borrowing Controlled controlled distribute elif else fail fixup for function if in internal intrinsic invert is let mutable namespace new newtype open operation repeat return self set until use using while within"
-        };
-        function keywordsToPattern(words) {
-          return "\\b(?:" + words.trim().replace(/ /g, "|") + ")\\b";
-        }
-        var keywords = RegExp(keywordsToPattern(keywordKinds.type + " " + keywordKinds.other));
-        var identifier = /\b[A-Za-z_]\w*\b/.source;
-        var qualifiedName = replace(/<<0>>(?:\s*\.\s*<<0>>)*/.source, [identifier]);
-        var typeInside = {
-          "keyword": keywords,
-          "punctuation": /[<>()?,.:[\]]/
-        };
-        var regularString = /"(?:\\.|[^\\"])*"/.source;
-        Prism2.languages.qsharp = Prism2.languages.extend("clike", {
-          "comment": /\/\/.*/,
-          "string": [
-            {
-              pattern: re(/(^|[^$\\])<<0>>/.source, [regularString]),
-              lookbehind: true,
-              greedy: true
-            }
-          ],
-          "class-name": [
-            {
-              // open Microsoft.Quantum.Canon;
-              // open Microsoft.Quantum.Canon as CN;
-              pattern: re(/(\b(?:as|open)\s+)<<0>>(?=\s*(?:;|as\b))/.source, [qualifiedName]),
-              lookbehind: true,
-              inside: typeInside
-            },
-            {
-              // namespace Quantum.App1;
-              pattern: re(/(\bnamespace\s+)<<0>>(?=\s*\{)/.source, [qualifiedName]),
-              lookbehind: true,
-              inside: typeInside
-            }
-          ],
-          "keyword": keywords,
-          "number": /(?:\b0(?:x[\da-f]+|b[01]+|o[0-7]+)|(?:\B\.\d+|\b\d+(?:\.\d*)?)(?:e[-+]?\d+)?)l?\b/i,
-          "operator": /\band=|\bor=|\band\b|\bnot\b|\bor\b|<[-=]|[-=]>|>>>=?|<<<=?|\^\^\^=?|\|\|\|=?|&&&=?|w\/=?|~~~|[*\/+\-^=!%]=?/,
-          "punctuation": /::|[{}[\];(),.:]/
-        });
-        Prism2.languages.insertBefore("qsharp", "number", {
-          "range": {
-            pattern: /\.\./,
-            alias: "operator"
-          }
-        });
-        var interpolationExpr = nested(replace(/\{(?:[^"{}]|<<0>>|<<self>>)*\}/.source, [regularString]), 2);
-        Prism2.languages.insertBefore("qsharp", "string", {
-          "interpolation-string": {
-            pattern: re(/\$"(?:\\.|<<0>>|[^\\"{])*"/.source, [interpolationExpr]),
-            greedy: true,
-            inside: {
-              "interpolation": {
-                pattern: re(/((?:^|[^\\])(?:\\\\)*)<<0>>/.source, [interpolationExpr]),
-                lookbehind: true,
-                inside: {
-                  "punctuation": /^\{|\}$/,
-                  "expression": {
-                    pattern: /[\s\S]+/,
-                    alias: "language-qsharp",
-                    inside: Prism2.languages.qsharp
-                  }
-                }
-              },
-              "string": /[\s\S]+/
-            }
-          }
-        });
-      })(Prism);
-      Prism.languages.qs = Prism.languages.qsharp;
-      Prism.languages.q = {
-        "string": /"(?:\\.|[^"\\\r\n])*"/,
-        "comment": [
-          // From http://code.kx.com/wiki/Reference/Slash:
-          // When / is following a space (or a right parenthesis, bracket, or brace), it is ignored with the rest of the line.
-          {
-            pattern: /([\t )\]}])\/.*/,
-            lookbehind: true,
-            greedy: true
-          },
-          // From http://code.kx.com/wiki/Reference/Slash:
-          // A line which has / as its first character and contains at least one other non-whitespace character is a whole-line comment and is ignored entirely.
-          // A / on a line by itself begins a multiline comment which is terminated by the next \ on a line by itself.
-          // If a / is not matched by a \, the multiline comment is unterminated and continues to end of file.
-          // The / and \ must be the first char on the line, but may be followed by any amount of whitespace.
-          {
-            pattern: /(^|\r?\n|\r)\/[\t ]*(?:(?:\r?\n|\r)(?:.*(?:\r?\n|\r(?!\n)))*?(?:\\(?=[\t ]*(?:\r?\n|\r))|$)|\S.*)/,
-            lookbehind: true,
-            greedy: true
-          },
-          // From http://code.kx.com/wiki/Reference/Slash:
-          // A \ on a line by itself with no preceding matching / will comment to end of file.
-          {
-            pattern: /^\\[\t ]*(?:\r?\n|\r)[\s\S]+/m,
-            greedy: true
-          },
-          {
-            pattern: /^#!.+/m,
-            greedy: true
-          }
-        ],
-        "symbol": /`(?::\S+|[\w.]*)/,
-        "datetime": {
-          pattern: /0N[mdzuvt]|0W[dtz]|\d{4}\.\d\d(?:m|\.\d\d(?:T(?:\d\d(?::\d\d(?::\d\d(?:[.:]\d\d\d)?)?)?)?)?[dz]?)|\d\d:\d\d(?::\d\d(?:[.:]\d\d\d)?)?[uvt]?/,
-          alias: "number"
-        },
-        // The negative look-ahead prevents bad highlighting
-        // of verbs 0: and 1:
-        "number": /\b(?![01]:)(?:0N[hje]?|0W[hj]?|0[wn]|0x[\da-fA-F]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?[hjfeb]?)/,
-        "keyword": /\\\w+\b|\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\b/,
-        "adverb": {
-          pattern: /['\/\\]:?|\beach\b/,
-          alias: "function"
-        },
-        "verb": {
-          pattern: /(?:\B\.\B|\b[01]:|<[=>]?|>=?|[:+\-*%,!?~=|$&#@^]):?|\b_\b:?/,
-          alias: "operator"
-        },
-        "punctuation": /[(){}\[\];.]/
-      };
-      (function(Prism2) {
-        var jsString = /"(?:\\.|[^\\"\r\n])*"|'(?:\\.|[^\\'\r\n])*'/.source;
-        var jsComment = /\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))*\*\//.source;
-        var jsExpr = /(?:[^\\()[\]{}"'/]|<string>|\/(?![*/])|<comment>|\(<expr>*\)|\[<expr>*\]|\{<expr>*\}|\\[\s\S])/.source.replace(/<string>/g, function() {
-          return jsString;
-        }).replace(/<comment>/g, function() {
-          return jsComment;
-        });
-        for (var i = 0; i < 2; i++) {
-          jsExpr = jsExpr.replace(/<expr>/g, function() {
-            return jsExpr;
-          });
-        }
-        jsExpr = jsExpr.replace(/<expr>/g, "[^\\s\\S]");
-        Prism2.languages.qml = {
-          "comment": {
-            pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
-            greedy: true
-          },
-          "javascript-function": {
-            pattern: RegExp(/((?:^|;)[ \t]*)function\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*\(<js>*\)\s*\{<js>*\}/.source.replace(/<js>/g, function() {
-              return jsExpr;
-            }), "m"),
-            lookbehind: true,
-            greedy: true,
-            alias: "language-javascript",
-            inside: Prism2.languages.javascript
-          },
-          "class-name": {
-            pattern: /((?:^|[:;])[ \t]*)(?!\d)\w+(?=[ \t]*\{|[ \t]+on\b)/m,
-            lookbehind: true
-          },
-          "property": [
-            {
-              pattern: /((?:^|[;{])[ \t]*)(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,
-              lookbehind: true
-            },
-            {
-              pattern: /((?:^|[;{])[ \t]*)property[ \t]+(?!\d)\w+(?:\.\w+)*[ \t]+(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,
-              lookbehind: true,
-              inside: {
-                "keyword": /^property/,
-                "property": /\w+(?:\.\w+)*/
-              }
-            }
-          ],
-          "javascript-expression": {
-            pattern: RegExp(/(:[ \t]*)(?![\s;}[])(?:(?!$|[;}])<js>)+/.source.replace(/<js>/g, function() {
-              return jsExpr;
-            }), "m"),
-            lookbehind: true,
-            greedy: true,
-            alias: "language-javascript",
-            inside: Prism2.languages.javascript
-          },
-          "string": {
-            pattern: /"(?:\\.|[^\\"\r\n])*"/,
-            greedy: true
-          },
-          "keyword": /\b(?:as|import|on)\b/,
-          "punctuation": /[{}[\]:;,]/
-        };
-      })(Prism);
-      Prism.languages.qore = Prism.languages.extend("clike", {
-        "comment": {
-          pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:\/\/|#).*)/,
-          lookbehind: true
-        },
-        // Overridden to allow unescaped multi-line strings
-        "string": {
-          pattern: /("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,
-          greedy: true
-        },
-        "keyword": /\b(?:abstract|any|assert|binary|bool|boolean|break|byte|case|catch|char|class|code|const|continue|data|default|do|double|else|enum|extends|final|finally|float|for|goto|hash|if|implements|import|inherits|instanceof|int|interface|long|my|native|new|nothing|null|object|our|own|private|reference|rethrow|return|short|soft(?:bool|date|float|int|list|number|string)|static|strictfp|string|sub|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\b/,
-        "boolean": /\b(?:false|true)\b/i,
-        "function": /\$?\b(?!\d)\w+(?=\()/,
-        "number": /\b(?:0b[01]+|0x(?:[\da-f]*\.)?[\da-fp\-]+|(?:\d+(?:\.\d+)?|\.\d+)(?:e\d+)?[df]|(?:\d+(?:\.\d+)?|\.\d+))\b/i,
-        "operator": {
-          pattern: /(^|[^.])(?:\+[+=]?|-[-=]?|[!=](?:==?|~)?|>>?=?|<(?:=>?|<=?)?|&[&=]?|\|[|=]?|[*\/%^]=?|[~?])/,
-          lookbehind: true
-        },
-        "variable": /\$(?!\d)\w+\b/
-      });
-      Prism.languages.r = {
-        "comment": /#.*/,
-        "string": {
-          pattern: /(['"])(?:\\.|(?!\1)[^\\\r\n])*\1/,
-          greedy: true
-        },
-        "percent-operator": {
-          // Includes user-defined operators
-          // and %%, %*%, %/%, %in%, %o%, %x%
-          pattern: /%[^%\s]*%/,
-          alias: "operator"
-        },
-        "boolean": /\b(?:FALSE|TRUE)\b/,
-        "ellipsis": /\.\.(?:\.|\d+)/,
-        "number": [
-          /\b(?:Inf|NaN)\b/,
-          /(?:\b0x[\dA-Fa-f]+(?:\.\d*)?|\b\d+(?:\.\d*)?|\B\.\d+)(?:[EePp][+-]?\d+)?[iL]?/
-        ],
-        "keyword": /\b(?:NA|NA_character_|NA_complex_|NA_integer_|NA_real_|NULL|break|else|for|function|if|in|next|repeat|while)\b/,
-        "operator": /->?>?|<(?:=|<?-)?|[>=!]=?|::?|&&?|\|\|?|[+*\/^$@~]/,
-        "punctuation": /[(){}\[\],;]/
-      };
-      Prism.languages.racket = Prism.languages.extend("scheme", {
-        "lambda-parameter": {
-          // the racket lambda syntax is a lot more complex, so we won't even attempt to capture it.
-          // this will just prevent false positives of the `function` pattern
-          pattern: /([(\[]lambda\s+[(\[])[^()\[\]'\s]+/,
-          lookbehind: true
-        }
-      });
-      Prism.languages.insertBefore("racket", "string", {
-        "lang": {
-          pattern: /^#lang.+/m,
-          greedy: true,
-          alias: "keyword"
-        }
-      });
-      Prism.languages.rkt = Prism.languages.racket;
-      (function(Prism2) {
-        var commentLike = /\/(?![/*])|\/\/.*[\r\n]|\/\*[^*]*(?:\*(?!\/)[^*]*)*\*\//.source;
-        var stringLike = /@(?!")|"(?:[^\r\n\\"]|\\.)*"|@"(?:[^\\"]|""|\\[\s\S])*"(?!")/.source + "|" + /'(?:(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'|(?=[^\\](?!')))/.source;
-        function nested(pattern, depthLog2) {
-          for (var i = 0; i < depthLog2; i++) {
-            pattern = pattern.replace(/<self>/g, function() {
-              return "(?:" + pattern + ")";
-            });
-          }
-          return pattern.replace(/<self>/g, "[^\\s\\S]").replace(/<str>/g, "(?:" + stringLike + ")").replace(/<comment>/g, "(?:" + commentLike + ")");
-        }
-        var round2 = nested(/\((?:[^()'"@/]|<str>|<comment>|<self>)*\)/.source, 2);
-        var square = nested(/\[(?:[^\[\]'"@/]|<str>|<comment>|<self>)*\]/.source, 1);
-        var curly = nested(/\{(?:[^{}'"@/]|<str>|<comment>|<self>)*\}/.source, 2);
-        var angle = nested(/<(?:[^<>'"@/]|<comment>|<self>)*>/.source, 1);
-        var inlineCs = /@/.source + /(?:await\b\s*)?/.source + "(?:" + /(?!await\b)\w+\b/.source + "|" + round2 + ")(?:" + /[?!]?\.\w+\b/.source + "|(?:" + angle + ")?" + round2 + "|" + square + ")*" + /(?![?!\.(\[]|<(?!\/))/.source;
-        var tagAttrInlineCs = /@(?![\w()])/.source + "|" + inlineCs;
-        var tagAttrValue = "(?:" + /"[^"@]*"|'[^'@]*'|[^\s'"@>=]+(?=[\s>])/.source + `|["'][^"'@]*(?:(?:` + tagAttrInlineCs + `)[^"'@]*)+["'])`;
-        var tagAttrs = /(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*<tagAttrValue>|(?=[\s/>])))+)?/.source.replace(/<tagAttrValue>/, tagAttrValue);
-        var tagContent = /(?!\d)[^\s>\/=$<%]+/.source + tagAttrs + /\s*\/?>/.source;
-        var tagRegion = /\B@?/.source + "(?:" + /<([a-zA-Z][\w:]*)/.source + tagAttrs + /\s*>/.source + "(?:" + (/[^<]/.source + "|" + // all tags that are not the start tag
-        // eslint-disable-next-line regexp/strict
-        /<\/?(?!\1\b)/.source + tagContent + "|" + // nested start tag
-        nested(
-          // eslint-disable-next-line regexp/strict
-          /<\1/.source + tagAttrs + /\s*>/.source + "(?:" + (/[^<]/.source + "|" + // all tags that are not the start tag
-          // eslint-disable-next-line regexp/strict
-          /<\/?(?!\1\b)/.source + tagContent + "|<self>") + ")*" + // eslint-disable-next-line regexp/strict
-          /<\/\1\s*>/.source,
-          2
-        )) + ")*" + // eslint-disable-next-line regexp/strict
-        /<\/\1\s*>/.source + "|" + /</.source + tagContent + ")";
-        Prism2.languages.cshtml = Prism2.languages.extend("markup", {});
-        var csharpWithHtml = Prism2.languages.insertBefore("csharp", "string", {
-          "html": {
-            pattern: RegExp(tagRegion),
-            greedy: true,
-            inside: Prism2.languages.cshtml
-          }
-        }, { csharp: Prism2.languages.extend("csharp", {}) });
-        var cs = {
-          pattern: /\S[\s\S]*/,
-          alias: "language-csharp",
-          inside: csharpWithHtml
-        };
-        var inlineValue = {
-          pattern: RegExp(/(^|[^@])/.source + inlineCs),
-          lookbehind: true,
-          greedy: true,
-          alias: "variable",
-          inside: {
-            "keyword": /^@/,
-            "csharp": cs
-          }
-        };
-        Prism2.languages.cshtml.tag.pattern = RegExp(/<\/?/.source + tagContent);
-        Prism2.languages.cshtml.tag.inside["attr-value"].pattern = RegExp(/=\s*/.source + tagAttrValue);
-        Prism2.languages.insertBefore("inside", "punctuation", { "value": inlineValue }, Prism2.languages.cshtml.tag.inside["attr-value"]);
-        Prism2.languages.insertBefore("cshtml", "prolog", {
-          "razor-comment": {
-            pattern: /@\*[\s\S]*?\*@/,
-            greedy: true,
-            alias: "comment"
-          },
-          "block": {
-            pattern: RegExp(
-              /(^|[^@])@/.source + "(?:" + [
-                // @{ ... }
-                curly,
-                // @code{ ... }
-                /(?:code|functions)\s*/.source + curly,
-                // @for (...) { ... }
-                /(?:for|foreach|lock|switch|using|while)\s*/.source + round2 + /\s*/.source + curly,
-                // @do { ... } while (...);
-                /do\s*/.source + curly + /\s*while\s*/.source + round2 + /(?:\s*;)?/.source,
-                // @try { ... } catch (...) { ... } finally { ... }
-                /try\s*/.source + curly + /\s*catch\s*/.source + round2 + /\s*/.source + curly + /\s*finally\s*/.source + curly,
-                // @if (...) {...} else if (...) {...} else {...}
-                /if\s*/.source + round2 + /\s*/.source + curly + "(?:" + /\s*else/.source + "(?:" + /\s+if\s*/.source + round2 + ")?" + /\s*/.source + curly + ")*",
-                // @helper Ident(params) { ... }
-                /helper\s+\w+\s*/.source + round2 + /\s*/.source + curly
-              ].join("|") + ")"
-            ),
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "keyword": /^@\w*/,
-              "csharp": cs
-            }
-          },
-          "directive": {
-            pattern: /^([ \t]*)@(?:addTagHelper|attribute|implements|inherits|inject|layout|model|namespace|page|preservewhitespace|removeTagHelper|section|tagHelperPrefix|using)(?=\s).*/m,
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "keyword": /^@\w+/,
-              "csharp": cs
-            }
-          },
-          "value": inlineValue,
-          "delegate-operator": {
-            pattern: /(^|[^@])@(?=<)/,
-            lookbehind: true,
-            alias: "operator"
-          }
-        });
-        Prism2.languages.razor = Prism2.languages.cshtml;
-      })(Prism);
-      (function(Prism2) {
-        var javascript = Prism2.util.clone(Prism2.languages.javascript);
-        var space = /(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source;
-        var braces = /(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source;
-        var spread = /(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;
-        function re(source, flags) {
-          source = source.replace(/<S>/g, function() {
-            return space;
-          }).replace(/<BRACES>/g, function() {
-            return braces;
-          }).replace(/<SPREAD>/g, function() {
-            return spread;
-          });
-          return RegExp(source, flags);
-        }
-        spread = re(spread).source;
-        Prism2.languages.jsx = Prism2.languages.extend("markup", javascript);
-        Prism2.languages.jsx.tag.pattern = re(
-          /<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source
-        );
-        Prism2.languages.jsx.tag.inside["tag"].pattern = /^<\/?[^\s>\/]*/;
-        Prism2.languages.jsx.tag.inside["attr-value"].pattern = /=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/;
-        Prism2.languages.jsx.tag.inside["tag"].inside["class-name"] = /^[A-Z]\w*(?:\.[A-Z]\w*)*$/;
-        Prism2.languages.jsx.tag.inside["comment"] = javascript["comment"];
-        Prism2.languages.insertBefore("inside", "attr-name", {
-          "spread": {
-            pattern: re(/<SPREAD>/.source),
-            inside: Prism2.languages.jsx
-          }
-        }, Prism2.languages.jsx.tag);
-        Prism2.languages.insertBefore("inside", "special-attr", {
-          "script": {
-            // Allow for two levels of nesting
-            pattern: re(/=<BRACES>/.source),
-            alias: "language-javascript",
-            inside: {
-              "script-punctuation": {
-                pattern: /^=(?=\{)/,
-                alias: "punctuation"
-              },
-              rest: Prism2.languages.jsx
-            }
-          }
-        }, Prism2.languages.jsx.tag);
-        var stringifyToken = function(token) {
-          if (!token) {
-            return "";
-          }
-          if (typeof token === "string") {
-            return token;
-          }
-          if (typeof token.content === "string") {
-            return token.content;
-          }
-          return token.content.map(stringifyToken).join("");
-        };
-        var walkTokens = function(tokens) {
-          var openedTags = [];
-          for (var i = 0; i < tokens.length; i++) {
-            var token = tokens[i];
-            var notTagNorBrace = false;
-            if (typeof token !== "string") {
-              if (token.type === "tag" && token.content[0] && token.content[0].type === "tag") {
-                if (token.content[0].content[0].content === "</") {
-                  if (openedTags.length > 0 && openedTags[openedTags.length - 1].tagName === stringifyToken(token.content[0].content[1])) {
-                    openedTags.pop();
-                  }
-                } else {
-                  if (token.content[token.content.length - 1].content === "/>") {
-                  } else {
-                    openedTags.push({
-                      tagName: stringifyToken(token.content[0].content[1]),
-                      openedBraces: 0
-                    });
-                  }
-                }
-              } else if (openedTags.length > 0 && token.type === "punctuation" && token.content === "{") {
-                openedTags[openedTags.length - 1].openedBraces++;
-              } else if (openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces > 0 && token.type === "punctuation" && token.content === "}") {
-                openedTags[openedTags.length - 1].openedBraces--;
-              } else {
-                notTagNorBrace = true;
-              }
-            }
-            if (notTagNorBrace || typeof token === "string") {
-              if (openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces === 0) {
-                var plainText = stringifyToken(token);
-                if (i < tokens.length - 1 && (typeof tokens[i + 1] === "string" || tokens[i + 1].type === "plain-text")) {
-                  plainText += stringifyToken(tokens[i + 1]);
-                  tokens.splice(i + 1, 1);
-                }
-                if (i > 0 && (typeof tokens[i - 1] === "string" || tokens[i - 1].type === "plain-text")) {
-                  plainText = stringifyToken(tokens[i - 1]) + plainText;
-                  tokens.splice(i - 1, 1);
-                  i--;
-                }
-                tokens[i] = new Prism2.Token("plain-text", plainText, null, plainText);
-              }
-            }
-            if (token.content && typeof token.content !== "string") {
-              walkTokens(token.content);
-            }
-          }
-        };
-        Prism2.hooks.add("after-tokenize", function(env) {
-          if (env.language !== "jsx" && env.language !== "tsx") {
-            return;
-          }
-          walkTokens(env.tokens);
-        });
-      })(Prism);
-      (function(Prism2) {
-        var typescript = Prism2.util.clone(Prism2.languages.typescript);
-        Prism2.languages.tsx = Prism2.languages.extend("jsx", typescript);
-        delete Prism2.languages.tsx["parameter"];
-        delete Prism2.languages.tsx["literal-property"];
-        var tag = Prism2.languages.tsx.tag;
-        tag.pattern = RegExp(/(^|[^\w$]|(?=<\/))/.source + "(?:" + tag.pattern.source + ")", tag.pattern.flags);
-        tag.lookbehind = true;
-      })(Prism);
-      Prism.languages.reason = Prism.languages.extend("clike", {
-        "string": {
-          pattern: /"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,
-          greedy: true
-        },
-        // 'class-name' must be matched *after* 'constructor' defined below
-        "class-name": /\b[A-Z]\w*/,
-        "keyword": /\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,
-        "operator": /\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/
-      });
-      Prism.languages.insertBefore("reason", "class-name", {
-        "char": {
-          pattern: /'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,
-          greedy: true
-        },
-        // Negative look-ahead prevents from matching things like String.capitalize
-        "constructor": /\b[A-Z]\w*\b(?!\s*\.)/,
-        "label": {
-          pattern: /\b[a-z]\w*(?=::)/,
-          alias: "symbol"
-        }
-      });
-      delete Prism.languages.reason.function;
-      (function(Prism2) {
-        var specialEscape = {
-          pattern: /\\[\\(){}[\]^$+*?|.]/,
-          alias: "escape"
-        };
-        var escape = /\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/;
-        var charSet = {
-          pattern: /\.|\\[wsd]|\\p\{[^{}]+\}/i,
-          alias: "class-name"
-        };
-        var charSetWithoutDot = {
-          pattern: /\\[wsd]|\\p\{[^{}]+\}/i,
-          alias: "class-name"
-        };
-        var rangeChar = "(?:[^\\\\-]|" + escape.source + ")";
-        var range2 = RegExp(rangeChar + "-" + rangeChar);
-        var groupName = {
-          pattern: /(<|')[^<>']+(?=[>']$)/,
-          lookbehind: true,
-          alias: "variable"
-        };
-        Prism2.languages.regex = {
-          "char-class": {
-            pattern: /((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,
-            lookbehind: true,
-            inside: {
-              "char-class-negation": {
-                pattern: /(^\[)\^/,
-                lookbehind: true,
-                alias: "operator"
-              },
-              "char-class-punctuation": {
-                pattern: /^\[|\]$/,
-                alias: "punctuation"
-              },
-              "range": {
-                pattern: range2,
-                inside: {
-                  "escape": escape,
-                  "range-punctuation": {
-                    pattern: /-/,
-                    alias: "operator"
-                  }
-                }
-              },
-              "special-escape": specialEscape,
-              "char-set": charSetWithoutDot,
-              "escape": escape
-            }
-          },
-          "special-escape": specialEscape,
-          "char-set": charSet,
-          "backreference": [
-            {
-              // a backreference which is not an octal escape
-              pattern: /\\(?![123][0-7]{2})[1-9]/,
-              alias: "keyword"
-            },
-            {
-              pattern: /\\k<[^<>']+>/,
-              alias: "keyword",
-              inside: {
-                "group-name": groupName
-              }
-            }
-          ],
-          "anchor": {
-            pattern: /[$^]|\\[ABbGZz]/,
-            alias: "function"
-          },
-          "escape": escape,
-          "group": [
-            {
-              // https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html
-              // https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference?view=netframework-4.7.2#grouping-constructs
-              // (), (?<name>), (?'name'), (?>), (?:), (?=), (?!), (?<=), (?<!), (?is-m), (?i-m:)
-              pattern: /\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,
-              alias: "punctuation",
-              inside: {
-                "group-name": groupName
-              }
-            },
-            {
-              pattern: /\)/,
-              alias: "punctuation"
-            }
-          ],
-          "quantifier": {
-            pattern: /(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,
-            alias: "number"
-          },
-          "alternation": {
-            pattern: /\|/,
-            alias: "keyword"
-          }
-        };
-      })(Prism);
-      Prism.languages.rego = {
-        "comment": /#.*/,
-        "property": {
-          pattern: /(^|[^\\.])(?:"(?:\\.|[^\\"\r\n])*"|`[^`]*`|\b[a-z_]\w*\b)(?=\s*:(?!=))/i,
-          lookbehind: true,
-          greedy: true
-        },
-        "string": {
-          pattern: /(^|[^\\])"(?:\\.|[^\\"\r\n])*"|`[^`]*`/,
-          lookbehind: true,
-          greedy: true
-        },
-        "keyword": /\b(?:as|default|else|import|not|null|package|set(?=\s*\()|some|with)\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "function": {
-          pattern: /\b[a-z_]\w*\b(?:\s*\.\s*\b[a-z_]\w*\b)*(?=\s*\()/i,
-          inside: {
-            "namespace": /\b\w+\b(?=\s*\.)/,
-            "punctuation": /\./
-          }
-        },
-        "number": /-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
-        "operator": /[-+*/%|&]|[<>:=]=?|!=|\b_\b/,
-        "punctuation": /[,;.\[\]{}()]/
-      };
-      Prism.languages.renpy = {
-        "comment": {
-          pattern: /(^|[^\\])#.+/,
-          lookbehind: true
-        },
-        "string": {
-          pattern: /("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\])*\2|(?:^#?(?:(?:[0-9a-fA-F]){3}|[0-9a-fA-F]{6})$)/m,
-          greedy: true
-        },
-        "function": /\b[a-z_]\w*(?=\()/i,
-        "property": /\b(?:Update|UpdateVersion|action|activate_sound|adv_nvl_transition|after_load_transition|align|alpha|alt|anchor|antialias|area|auto|background|bar_invert|bar_resizing|bar_vertical|black_color|bold|bottom_bar|bottom_gutter|bottom_margin|bottom_padding|box_reverse|box_wrap|can_update|caret|child|color|crop|default_afm_enable|default_afm_time|default_fullscreen|default_text_cps|developer|directory_name|drag_handle|drag_joined|drag_name|drag_raise|draggable|dragged|drop_shadow|drop_shadow_color|droppable|dropped|easein|easeout|edgescroll|end_game_transition|end_splash_transition|enter_replay_transition|enter_sound|enter_transition|enter_yesno_transition|executable_name|exit_replay_transition|exit_sound|exit_transition|exit_yesno_transition|fadein|fadeout|first_indent|first_spacing|fit_first|focus|focus_mask|font|foreground|game_main_transition|get_installed_packages|google_play_key|google_play_salt|ground|has_music|has_sound|has_voice|height|help|hinting|hover|hover_background|hover_color|hover_sound|hovered|hyperlink_functions|idle|idle_color|image_style|include_update|insensitive|insensitive_background|insensitive_color|inside|intra_transition|italic|justify|kerning|keyboard_focus|language|layer_clipping|layers|layout|left_bar|left_gutter|left_margin|left_padding|length|line_leading|line_overlap_split|line_spacing|linear|main_game_transition|main_menu_music|maximum|min_width|minimum|minwidth|modal|mouse|mousewheel|name|narrator_menu|newline_indent|nvl_adv_transition|offset|order_reverse|outlines|overlay_functions|pos|position|prefix|radius|range|rest_indent|right_bar|right_gutter|right_margin|right_padding|rotate|rotate_pad|ruby_style|sample_sound|save_directory|say_attribute_transition|screen_height|screen_width|scrollbars|selected_hover|selected_hover_color|selected_idle|selected_idle_color|selected_insensitive|show_side_image|show_two_window|side_spacing|side_xpos|side_ypos|size|size_group|slow_cps|slow_cps_multiplier|spacing|strikethrough|subpixel|text_align|text_style|text_xpos|text_y_fudge|text_ypos|thumb|thumb_offset|thumb_shadow|thumbnail_height|thumbnail_width|time|top_bar|top_gutter|top_margin|top_padding|translations|underline|unscrollable|update|value|version|version_name|version_tuple|vertical|width|window_hide_transition|window_icon|window_left_padding|window_show_transition|window_title|windows_icon|xadjustment|xalign|xanchor|xanchoraround|xaround|xcenter|xfill|xinitial|xmargin|xmaximum|xminimum|xoffset|xofsset|xpadding|xpos|xsize|xzoom|yadjustment|yalign|yanchor|yanchoraround|yaround|ycenter|yfill|yinitial|ymargin|ymaximum|yminimum|yoffset|ypadding|ypos|ysize|ysizexysize|yzoom|zoom|zorder)\b/,
-        "tag": /\b(?:bar|block|button|buttoscreenn|drag|draggroup|fixed|frame|grid|[hv]box|hotbar|hotspot|image|imagebutton|imagemap|input|key|label|menu|mm_menu_frame|mousearea|nvl|parallel|screen|self|side|tag|text|textbutton|timer|vbar|viewport|window)\b|\$/,
-        "keyword": /\b(?:None|add|adjustment|alignaround|allow|angle|animation|around|as|assert|behind|box_layout|break|build|cache|call|center|changed|child_size|choice|circles|class|clear|clicked|clipping|clockwise|config|contains|continue|corner1|corner2|counterclockwise|def|default|define|del|delay|disabled|disabled_text|dissolve|elif|else|event|except|exclude|exec|expression|fade|finally|for|from|function|global|gm_root|has|hide|id|if|import|in|init|is|jump|knot|lambda|left|less_rounded|mm_root|movie|music|null|on|onlayer|pass|pause|persistent|play|print|python|queue|raise|random|renpy|repeat|return|right|rounded_window|scene|scope|set|show|slow|slow_abortable|slow_done|sound|stop|store|style|style_group|substitute|suffix|theme|transform|transform_anchor|transpose|try|ui|unhovered|updater|use|voice|while|widget|widget_hover|widget_selected|widget_text|yield)\b/,
-        "boolean": /\b(?:[Ff]alse|[Tt]rue)\b/,
-        "number": /(?:\b(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?)|\B\.\d+)(?:e[+-]?\d+)?j?/i,
-        "operator": /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:and|at|not|or|with)\b/,
-        "punctuation": /[{}[\];(),.:]/
-      };
-      Prism.languages.rpy = Prism.languages.renpy;
-      Prism.languages.rescript = {
-        "comment": {
-          pattern: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
-          greedy: true
-        },
-        "char": { pattern: /'(?:[^\r\n\\]|\\(?:.|\w+))'/, greedy: true },
-        "string": {
-          pattern: /"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,
-          greedy: true
-        },
-        "class-name": /\b[A-Z]\w*|@[a-z.]*|#[A-Za-z]\w*|#\d/,
-        "function": {
-          pattern: /[a-zA-Z]\w*(?=\()|(\.)[a-z]\w*/,
-          lookbehind: true
-        },
-        "number": /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,
-        "boolean": /\b(?:false|true)\b/,
-        "attr-value": /[A-Za-z]\w*(?==)/,
-        "constant": {
-          pattern: /(\btype\s+)[a-z]\w*/,
-          lookbehind: true
-        },
-        "tag": {
-          pattern: /(<)[a-z]\w*|(?:<\/)[a-z]\w*/,
-          lookbehind: true,
-          inside: {
-            "operator": /<|>|\//
-          }
-        },
-        "keyword": /\b(?:and|as|assert|begin|bool|class|constraint|do|done|downto|else|end|exception|external|float|for|fun|function|if|in|include|inherit|initializer|int|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|string|switch|then|to|try|type|when|while|with)\b/,
-        "operator": /\.{3}|:[:=]?|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/,
-        "punctuation": /[(){}[\],;.]/
-      };
-      Prism.languages.insertBefore("rescript", "string", {
-        "template-string": {
-          pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,
-          greedy: true,
-          inside: {
-            "template-punctuation": {
-              pattern: /^`|`$/,
-              alias: "string"
-            },
-            "interpolation": {
-              pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
-              lookbehind: true,
-              inside: {
-                "interpolation-punctuation": {
-                  pattern: /^\$\{|\}$/,
-                  alias: "tag"
-                },
-                rest: Prism.languages.rescript
-              }
-            },
-            "string": /[\s\S]+/
-          }
-        }
-      });
-      Prism.languages.res = Prism.languages.rescript;
-      Prism.languages.rest = {
-        "table": [
-          {
-            pattern: /(^[\t ]*)(?:\+[=-]+)+\+(?:\r?\n|\r)(?:\1[+|].+[+|](?:\r?\n|\r))+\1(?:\+[=-]+)+\+/m,
-            lookbehind: true,
-            inside: {
-              "punctuation": /\||(?:\+[=-]+)+\+/
-            }
-          },
-          {
-            pattern: /(^[\t ]*)=+ [ =]*=(?:(?:\r?\n|\r)\1.+)+(?:\r?\n|\r)\1=+ [ =]*=(?=(?:\r?\n|\r){2}|\s*$)/m,
-            lookbehind: true,
-            inside: {
-              "punctuation": /[=-]+/
-            }
-          }
-        ],
-        // Directive-like patterns
-        "substitution-def": {
-          pattern: /(^[\t ]*\.\. )\|(?:[^|\s](?:[^|]*[^|\s])?)\| [^:]+::/m,
-          lookbehind: true,
-          inside: {
-            "substitution": {
-              pattern: /^\|(?:[^|\s]|[^|\s][^|]*[^|\s])\|/,
-              alias: "attr-value",
-              inside: {
-                "punctuation": /^\||\|$/
-              }
-            },
-            "directive": {
-              pattern: /( )(?! )[^:]+::/,
-              lookbehind: true,
-              alias: "function",
-              inside: {
-                "punctuation": /::$/
-              }
-            }
-          }
-        },
-        "link-target": [
-          {
-            pattern: /(^[\t ]*\.\. )\[[^\]]+\]/m,
-            lookbehind: true,
-            alias: "string",
-            inside: {
-              "punctuation": /^\[|\]$/
-            }
-          },
-          {
-            pattern: /(^[\t ]*\.\. )_(?:`[^`]+`|(?:[^:\\]|\\.)+):/m,
-            lookbehind: true,
-            alias: "string",
-            inside: {
-              "punctuation": /^_|:$/
-            }
-          }
-        ],
-        "directive": {
-          pattern: /(^[\t ]*\.\. )[^:]+::/m,
-          lookbehind: true,
-          alias: "function",
-          inside: {
-            "punctuation": /::$/
-          }
-        },
-        "comment": {
-          // The two alternatives try to prevent highlighting of blank comments
-          pattern: /(^[\t ]*\.\.)(?:(?: .+)?(?:(?:\r?\n|\r).+)+| .+)(?=(?:\r?\n|\r){2}|$)/m,
-          lookbehind: true
-        },
-        "title": [
-          // Overlined and underlined
-          {
-            pattern: /^(([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+)(?:\r?\n|\r).+(?:\r?\n|\r)\1$/m,
-            inside: {
-              "punctuation": /^[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+|[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,
-              "important": /.+/
-            }
-          },
-          // Underlined only
-          {
-            pattern: /(^|(?:\r?\n|\r){2}).+(?:\r?\n|\r)([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+(?=\r?\n|\r|$)/,
-            lookbehind: true,
-            inside: {
-              "punctuation": /[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,
-              "important": /.+/
-            }
-          }
-        ],
-        "hr": {
-          pattern: /((?:\r?\n|\r){2})([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2{3,}(?=(?:\r?\n|\r){2})/,
-          lookbehind: true,
-          alias: "punctuation"
-        },
-        "field": {
-          pattern: /(^[\t ]*):[^:\r\n]+:(?= )/m,
-          lookbehind: true,
-          alias: "attr-name"
-        },
-        "command-line-option": {
-          pattern: /(^[\t ]*)(?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?(?:, (?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?)*(?=(?:\r?\n|\r)? {2,}\S)/im,
-          lookbehind: true,
-          alias: "symbol"
-        },
-        "literal-block": {
-          pattern: /::(?:\r?\n|\r){2}([ \t]+)(?![ \t]).+(?:(?:\r?\n|\r)\1.+)*/,
-          inside: {
-            "literal-block-punctuation": {
-              pattern: /^::/,
-              alias: "punctuation"
-            }
-          }
-        },
-        "quoted-literal-block": {
-          pattern: /::(?:\r?\n|\r){2}([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]).*(?:(?:\r?\n|\r)\1.*)*/,
-          inside: {
-            "literal-block-punctuation": {
-              pattern: /^(?:::|([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\1*)/m,
-              alias: "punctuation"
-            }
-          }
-        },
-        "list-bullet": {
-          pattern: /(^[\t ]*)(?:[*+\-•‣⁃]|\(?(?:\d+|[a-z]|[ivxdclm]+)\)|(?:\d+|[a-z]|[ivxdclm]+)\.)(?= )/im,
-          lookbehind: true,
-          alias: "punctuation"
-        },
-        "doctest-block": {
-          pattern: /(^[\t ]*)>>> .+(?:(?:\r?\n|\r).+)*/m,
-          lookbehind: true,
-          inside: {
-            "punctuation": /^>>>/
-          }
-        },
-        "inline": [
-          {
-            pattern: /(^|[\s\-:\/'"<(\[{])(?::[^:]+:`.*?`|`.*?`:[^:]+:|(\*\*?|``?|\|)(?!\s)(?:(?!\2).)*\S\2(?=[\s\-.,:;!?\\\/'")\]}]|$))/m,
-            lookbehind: true,
-            inside: {
-              "bold": {
-                pattern: /(^\*\*).+(?=\*\*$)/,
-                lookbehind: true
-              },
-              "italic": {
-                pattern: /(^\*).+(?=\*$)/,
-                lookbehind: true
-              },
-              "inline-literal": {
-                pattern: /(^``).+(?=``$)/,
-                lookbehind: true,
-                alias: "symbol"
-              },
-              "role": {
-                pattern: /^:[^:]+:|:[^:]+:$/,
-                alias: "function",
-                inside: {
-                  "punctuation": /^:|:$/
-                }
-              },
-              "interpreted-text": {
-                pattern: /(^`).+(?=`$)/,
-                lookbehind: true,
-                alias: "attr-value"
-              },
-              "substitution": {
-                pattern: /(^\|).+(?=\|$)/,
-                lookbehind: true,
-                alias: "attr-value"
-              },
-              "punctuation": /\*\*?|``?|\|/
-            }
-          }
-        ],
-        "link": [
-          {
-            pattern: /\[[^\[\]]+\]_(?=[\s\-.,:;!?\\\/'")\]}]|$)/,
-            alias: "string",
-            inside: {
-              "punctuation": /^\[|\]_$/
-            }
-          },
-          {
-            pattern: /(?:\b[a-z\d]+(?:[_.:+][a-z\d]+)*_?_|`[^`]+`_?_|_`[^`]+`)(?=[\s\-.,:;!?\\\/'")\]}]|$)/i,
-            alias: "string",
-            inside: {
-              "punctuation": /^_?`|`$|`?_?_$/
-            }
-          }
-        ],
-        // Line block start,
-        // quote attribution,
-        // explicit markup start,
-        // and anonymous hyperlink target shortcut (__)
-        "punctuation": {
-          pattern: /(^[\t ]*)(?:\|(?= |$)|(?:---?|—|\.\.|__)(?= )|\.\.$)/m,
-          lookbehind: true
-        }
-      };
-      Prism.languages.rip = {
-        "comment": {
-          pattern: /#.*/,
-          greedy: true
-        },
-        "char": {
-          pattern: /\B`[^\s`'",.:;#\/\\()<>\[\]{}]\b/,
-          greedy: true
-        },
-        "string": {
-          pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
-          greedy: true
-        },
-        "regex": {
-          pattern: /(^|[^/])\/(?!\/)(?:\[[^\n\r\]]*\]|\\.|[^/\\\r\n\[])+\/(?=\s*(?:$|[\r\n,.;})]))/,
-          lookbehind: true,
-          greedy: true
-        },
-        "keyword": /(?:=>|->)|\b(?:case|catch|class|else|exit|finally|if|raise|return|switch|try)\b/,
-        "builtin": /@|\bSystem\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "date": /\b\d{4}-\d{2}-\d{2}\b/,
-        "time": /\b\d{2}:\d{2}:\d{2}\b/,
-        "datetime": /\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\b/,
-        "symbol": /:[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/,
-        "number": /[+-]?\b(?:\d+\.\d+|\d+)\b/,
-        "punctuation": /(?:\.{2,3})|[`,.:;=\/\\()<>\[\]{}]/,
-        "reference": /[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/
-      };
-      Prism.languages.roboconf = {
-        "comment": /#.*/,
-        "keyword": {
-          "pattern": /(^|\s)(?:(?:external|import)\b|(?:facet|instance of)(?=[ \t]+[\w-]+[ \t]*\{))/,
-          lookbehind: true
-        },
-        "component": {
-          pattern: /[\w-]+(?=[ \t]*\{)/,
-          alias: "variable"
-        },
-        "property": /[\w.-]+(?=[ \t]*:)/,
-        "value": {
-          pattern: /(=[ \t]*(?![ \t]))[^,;]+/,
-          lookbehind: true,
-          alias: "attr-value"
-        },
-        "optional": {
-          pattern: /\(optional\)/,
-          alias: "builtin"
-        },
-        "wildcard": {
-          pattern: /(\.)\*/,
-          lookbehind: true,
-          alias: "operator"
-        },
-        "punctuation": /[{},.;:=]/
-      };
-      (function(Prism2) {
-        var comment = {
-          pattern: /(^[ \t]*| {2}|\t)#.*/m,
-          lookbehind: true,
-          greedy: true
-        };
-        var variable = {
-          pattern: /((?:^|[^\\])(?:\\{2})*)[$@&%]\{(?:[^{}\r\n]|\{[^{}\r\n]*\})*\}/,
-          lookbehind: true,
-          inside: {
-            "punctuation": /^[$@&%]\{|\}$/
-          }
-        };
-        function createSection(name, inside) {
-          var extendecInside = {};
-          extendecInside["section-header"] = {
-            pattern: /^ ?\*{3}.+?\*{3}/,
-            alias: "keyword"
-          };
-          for (var token in inside) {
-            extendecInside[token] = inside[token];
-          }
-          extendecInside["tag"] = {
-            pattern: /([\r\n](?: {2}|\t)[ \t]*)\[[-\w]+\]/,
-            lookbehind: true,
-            inside: {
-              "punctuation": /\[|\]/
-            }
-          };
-          extendecInside["variable"] = variable;
-          extendecInside["comment"] = comment;
-          return {
-            pattern: RegExp(/^ ?\*{3}[ \t]*<name>[ \t]*\*{3}(?:.|[\r\n](?!\*{3}))*/.source.replace(/<name>/g, function() {
-              return name;
-            }), "im"),
-            alias: "section",
-            inside: extendecInside
-          };
-        }
-        var docTag = {
-          pattern: /(\[Documentation\](?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,
-          lookbehind: true,
-          alias: "string"
-        };
-        var testNameLike = {
-          pattern: /([\r\n] ?)(?!#)(?:\S(?:[ \t]\S)*)+/,
-          lookbehind: true,
-          alias: "function",
-          inside: {
-            "variable": variable
-          }
-        };
-        var testPropertyLike = {
-          pattern: /([\r\n](?: {2}|\t)[ \t]*)(?!\[|\.{3}|#)(?:\S(?:[ \t]\S)*)+/,
-          lookbehind: true,
-          inside: {
-            "variable": variable
-          }
-        };
-        Prism2.languages["robotframework"] = {
-          "settings": createSection("Settings", {
-            "documentation": {
-              pattern: /([\r\n] ?Documentation(?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,
-              lookbehind: true,
-              alias: "string"
-            },
-            "property": {
-              pattern: /([\r\n] ?)(?!\.{3}|#)(?:\S(?:[ \t]\S)*)+/,
-              lookbehind: true
-            }
-          }),
-          "variables": createSection("Variables"),
-          "test-cases": createSection("Test Cases", {
-            "test-name": testNameLike,
-            "documentation": docTag,
-            "property": testPropertyLike
-          }),
-          "keywords": createSection("Keywords", {
-            "keyword-name": testNameLike,
-            "documentation": docTag,
-            "property": testPropertyLike
-          }),
-          "tasks": createSection("Tasks", {
-            "task-name": testNameLike,
-            "documentation": docTag,
-            "property": testPropertyLike
-          }),
-          "comment": comment
-        };
-        Prism2.languages.robot = Prism2.languages["robotframework"];
-      })(Prism);
-      (function(Prism2) {
-        var multilineComment = /\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source;
-        for (var i = 0; i < 2; i++) {
-          multilineComment = multilineComment.replace(/<self>/g, function() {
-            return multilineComment;
-          });
-        }
-        multilineComment = multilineComment.replace(/<self>/g, function() {
-          return /[^\s\S]/.source;
-        });
-        Prism2.languages.rust = {
-          "comment": [
-            {
-              pattern: RegExp(/(^|[^\\])/.source + multilineComment),
-              lookbehind: true,
-              greedy: true
-            },
-            {
-              pattern: /(^|[^\\:])\/\/.*/,
-              lookbehind: true,
-              greedy: true
-            }
-          ],
-          "string": {
-            pattern: /b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,
-            greedy: true
-          },
-          "char": {
-            pattern: /b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,
-            greedy: true
-          },
-          "attribute": {
-            pattern: /#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,
-            greedy: true,
-            alias: "attr-name",
-            inside: {
-              "string": null
-              // see below
-            }
-          },
-          // Closure params should not be confused with bitwise OR |
-          "closure-params": {
-            pattern: /([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "closure-punctuation": {
-                pattern: /^\||\|$/,
-                alias: "punctuation"
-              },
-              rest: null
-              // see below
-            }
-          },
-          "lifetime-annotation": {
-            pattern: /'\w+/,
-            alias: "symbol"
-          },
-          "fragment-specifier": {
-            pattern: /(\$\w+:)[a-z]+/,
-            lookbehind: true,
-            alias: "punctuation"
-          },
-          "variable": /\$\w+/,
-          "function-definition": {
-            pattern: /(\bfn\s+)\w+/,
-            lookbehind: true,
-            alias: "function"
-          },
-          "type-definition": {
-            pattern: /(\b(?:enum|struct|trait|type|union)\s+)\w+/,
-            lookbehind: true,
-            alias: "class-name"
-          },
-          "module-declaration": [
-            {
-              pattern: /(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,
-              lookbehind: true,
-              alias: "namespace"
-            },
-            {
-              pattern: /(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,
-              lookbehind: true,
-              alias: "namespace",
-              inside: {
-                "punctuation": /::/
-              }
-            }
-          ],
-          "keyword": [
-            // https://github.com/rust-lang/reference/blob/master/src/keywords.md
-            /\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,
-            // primitives and str
-            // https://doc.rust-lang.org/stable/rust-by-example/primitives.html
-            /\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/
-          ],
-          // functions can technically start with an upper-case letter, but this will introduce a lot of false positives
-          // and Rust's naming conventions recommend snake_case anyway.
-          // https://doc.rust-lang.org/1.0.0/style/style/naming/README.html
-          "function": /\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,
-          "macro": {
-            pattern: /\b\w+!/,
-            alias: "property"
-          },
-          "constant": /\b[A-Z_][A-Z_\d]+\b/,
-          "class-name": /\b[A-Z]\w*\b/,
-          "namespace": {
-            pattern: /(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,
-            inside: {
-              "punctuation": /::/
-            }
-          },
-          // Hex, oct, bin, dec numbers with visual separators and type suffix
-          "number": /\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,
-          "boolean": /\b(?:false|true)\b/,
-          "punctuation": /->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,
-          "operator": /[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/
-        };
-        Prism2.languages.rust["closure-params"].inside.rest = Prism2.languages.rust;
-        Prism2.languages.rust["attribute"].inside["string"] = Prism2.languages.rust["string"];
-      })(Prism);
-      (function(Prism2) {
-        var stringPattern = /(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))/.source;
-        var number = /\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i;
-        var numericConstant = {
-          pattern: RegExp(stringPattern + "[bx]"),
-          alias: "number"
-        };
-        var macroVariable = {
-          pattern: /&[a-z_]\w*/i
-        };
-        var macroKeyword = {
-          pattern: /((?:^|\s|=|\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMEXIST|SYMGLOBL|SYMLOCAL|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,
-          lookbehind: true,
-          alias: "keyword"
-        };
-        var step = {
-          pattern: /(^|\s)(?:proc\s+\w+|data(?!=)|quit|run)\b/i,
-          alias: "keyword",
-          lookbehind: true
-        };
-        var comment = [
-          /\/\*[\s\S]*?\*\//,
-          {
-            pattern: /(^[ \t]*|;\s*)\*[^;]*;/m,
-            lookbehind: true
-          }
-        ];
-        var string = {
-          pattern: RegExp(stringPattern),
-          greedy: true
-        };
-        var punctuation = /[$%@.(){}\[\];,\\]/;
-        var func = {
-          pattern: /%?\b\w+(?=\()/,
-          alias: "keyword"
-        };
-        var args = {
-          "function": func,
-          "arg-value": {
-            pattern: /(=\s*)[A-Z\.]+/i,
-            lookbehind: true
-          },
-          "operator": /=/,
-          "macro-variable": macroVariable,
-          "arg": {
-            pattern: /[A-Z]+/i,
-            alias: "keyword"
-          },
-          "number": number,
-          "numeric-constant": numericConstant,
-          "punctuation": punctuation,
-          "string": string
-        };
-        var format = {
-          pattern: /\b(?:format|put)\b=?[\w'$.]+/i,
-          inside: {
-            "keyword": /^(?:format|put)(?==)/i,
-            "equals": /=/,
-            "format": {
-              pattern: /(?:\w|\$\d)+\.\d?/,
-              alias: "number"
-            }
-          }
-        };
-        var altformat = {
-          pattern: /\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,
-          inside: {
-            "keyword": /^(?:format|put)/i,
-            "format": {
-              pattern: /[\w$]+\.\d?/,
-              alias: "number"
-            }
-          }
-        };
-        var globalStatements = {
-          pattern: /((?:^|\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,
-          lookbehind: true,
-          alias: "keyword"
-        };
-        var submitStatement = {
-          pattern: /(^|\s)(?:submit(?:\s+(?:load|norun|parseonly))?|endsubmit)\b/i,
-          lookbehind: true,
-          alias: "keyword"
-        };
-        var actionSets = /aStore|accessControl|aggregation|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|cdm|clustering|conditionalRandomFields|configuration|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deduplication|deepLearn|deepNeural|deepRnn|ds2|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gVarCluster|gam|gleam|graphSemiSupLearn|hiddenMarkovModel|hyperGroup|ica|image|iml|kernalPca|langModel|ldaTopic|loadStreams|mbc|mixed|mlTools|modelPublishing|network|neuralNet|nmf|nonParametricBayes|nonlinear|optNetwork|optimization|panel|pca|percentile|phreg|pls|qkb|qlim|quantreg|recommend|regression|reinforcementLearn|robustPca|ruleMining|sampling|sandwich|sccasl|search(?:Analytics)?|sentimentAnalysis|sequence|session(?:Prop)?|severity|simSystem|simple|smartData|sparkEmbeddedProcess|sparseML|spatialreg|spc|stabilityMonitoring|svDataDescription|svm|table|text(?:Filters|Frequency|Mining|Parse|Rule(?:Develop|Score)|Topic|Util)|timeData|transpose|tsInfo|tsReconcile|uniTimeSeries|varReduce/.source;
-        var casActions = {
-          pattern: RegExp(/(^|\s)(?:action\s+)?(?:<act>)\.[a-z]+\b[^;]+/.source.replace(/<act>/g, function() {
-            return actionSets;
-          }), "i"),
-          lookbehind: true,
-          inside: {
-            "keyword": RegExp(/(?:<act>)\.[a-z]+\b/.source.replace(/<act>/g, function() {
-              return actionSets;
-            }), "i"),
-            "action": {
-              pattern: /(?:action)/i,
-              alias: "keyword"
-            },
-            "comment": comment,
-            "function": func,
-            "arg-value": args["arg-value"],
-            "operator": args.operator,
-            "argument": args.arg,
-            "number": number,
-            "numeric-constant": numericConstant,
-            "punctuation": punctuation,
-            "string": string
-          }
-        };
-        var keywords = {
-          pattern: /((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\s+over|do|dol|drop|dul|else|end(?:comp|source)?|entryTitle|eval(?:uate)?|exec(?:ute)?|exit|file(?:name)?|fill(?:attrs)?|flist|fnc|function(?:list)?|global|goto|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|_?null_|name|noobs|nowd|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|print|put|raise|ranexp|rannor|rbreak|retain|return|select|session|sessref|set|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|y2axisopts|yaxisopts)\b/i,
-          lookbehind: true
-        };
-        Prism2.languages.sas = {
-          "datalines": {
-            pattern: /^([ \t]*)(?:cards|(?:data)?lines);[\s\S]+?^[ \t]*;/im,
-            lookbehind: true,
-            alias: "string",
-            inside: {
-              "keyword": {
-                pattern: /^(?:cards|(?:data)?lines)/i
-              },
-              "punctuation": /;/
-            }
-          },
-          "proc-sql": {
-            pattern: /(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,
-            lookbehind: true,
-            inside: {
-              "sql": {
-                pattern: RegExp(/^[ \t]*(?:select|alter\s+table|(?:create|describe|drop)\s+(?:index|table(?:\s+constraints)?|view)|create\s+unique\s+index|insert\s+into|update)(?:<str>|[^;"'])+;/.source.replace(/<str>/g, function() {
-                  return stringPattern;
-                }), "im"),
-                alias: "language-sql",
-                inside: Prism2.languages.sql
-              },
-              "global-statements": globalStatements,
-              "sql-statements": {
-                pattern: /(^|\s)(?:disconnect\s+from|begin|commit|exec(?:ute)?|reset|rollback|validate)\b/i,
-                lookbehind: true,
-                alias: "keyword"
-              },
-              "number": number,
-              "numeric-constant": numericConstant,
-              "punctuation": punctuation,
-              "string": string
-            }
-          },
-          "proc-groovy": {
-            pattern: /(^proc\s+groovy(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,
-            lookbehind: true,
-            inside: {
-              "comment": comment,
-              "groovy": {
-                pattern: RegExp(/(^[ \t]*submit(?:\s+(?:load|norun|parseonly))?)(?:<str>|[^"'])+?(?=endsubmit;)/.source.replace(/<str>/g, function() {
-                  return stringPattern;
-                }), "im"),
-                lookbehind: true,
-                alias: "language-groovy",
-                inside: Prism2.languages.groovy
-              },
-              "keyword": keywords,
-              "submit-statement": submitStatement,
-              "global-statements": globalStatements,
-              "number": number,
-              "numeric-constant": numericConstant,
-              "punctuation": punctuation,
-              "string": string
-            }
-          },
-          "proc-lua": {
-            pattern: /(^proc\s+lua(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,
-            lookbehind: true,
-            inside: {
-              "comment": comment,
-              "lua": {
-                pattern: RegExp(/(^[ \t]*submit(?:\s+(?:load|norun|parseonly))?)(?:<str>|[^"'])+?(?=endsubmit;)/.source.replace(/<str>/g, function() {
-                  return stringPattern;
-                }), "im"),
-                lookbehind: true,
-                alias: "language-lua",
-                inside: Prism2.languages.lua
-              },
-              "keyword": keywords,
-              "submit-statement": submitStatement,
-              "global-statements": globalStatements,
-              "number": number,
-              "numeric-constant": numericConstant,
-              "punctuation": punctuation,
-              "string": string
-            }
-          },
-          "proc-cas": {
-            pattern: /(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,
-            lookbehind: true,
-            inside: {
-              "comment": comment,
-              "statement-var": {
-                pattern: /((?:^|\s)=?)saveresult\s[^;]+/im,
-                lookbehind: true,
-                inside: {
-                  "statement": {
-                    pattern: /^saveresult\s+\S+/i,
-                    inside: {
-                      keyword: /^(?:saveresult)/i
-                    }
-                  },
-                  rest: args
-                }
-              },
-              "cas-actions": casActions,
-              "statement": {
-                pattern: /((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,
-                lookbehind: true,
-                inside: args
-              },
-              "step": step,
-              "keyword": keywords,
-              "function": func,
-              "format": format,
-              "altformat": altformat,
-              "global-statements": globalStatements,
-              "number": number,
-              "numeric-constant": numericConstant,
-              "punctuation": punctuation,
-              "string": string
-            }
-          },
-          "proc-args": {
-            pattern: RegExp(/(^proc\s+\w+\s+)(?!\s)(?:[^;"']|<str>)+;/.source.replace(/<str>/g, function() {
-              return stringPattern;
-            }), "im"),
-            lookbehind: true,
-            inside: args
-          },
-          /*Special keywords within macros*/
-          "macro-keyword": macroKeyword,
-          "macro-variable": macroVariable,
-          "macro-string-functions": {
-            pattern: /((?:^|\s|=))%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)\(.*?(?:[^%]\))/i,
-            lookbehind: true,
-            inside: {
-              "function": {
-                pattern: /%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)/i,
-                alias: "keyword"
-              },
-              "macro-keyword": macroKeyword,
-              "macro-variable": macroVariable,
-              "escaped-char": {
-                pattern: /%['"()<>=¬^~;,#]/
-              },
-              "punctuation": punctuation
-            }
-          },
-          "macro-declaration": {
-            pattern: /^%macro[^;]+(?=;)/im,
-            inside: {
-              "keyword": /%macro/i
-            }
-          },
-          "macro-end": {
-            pattern: /^%mend[^;]+(?=;)/im,
-            inside: {
-              "keyword": /%mend/i
-            }
-          },
-          /*%_zscore(headcir, _lhc, _mhc, _shc, headcz, headcpct, _Fheadcz); */
-          "macro": {
-            pattern: /%_\w+(?=\()/,
-            alias: "keyword"
-          },
-          "input": {
-            pattern: /\binput\s[-\w\s/*.$&]+;/i,
-            inside: {
-              "input": {
-                alias: "keyword",
-                pattern: /^input/i
-              },
-              "comment": comment,
-              "number": number,
-              "numeric-constant": numericConstant
-            }
-          },
-          "options-args": {
-            pattern: /(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,
-            lookbehind: true,
-            inside: args
-          },
-          "cas-actions": casActions,
-          "comment": comment,
-          "function": func,
-          "format": format,
-          "altformat": altformat,
-          "numeric-constant": numericConstant,
-          "datetime": {
-            // '1jan2013'd, '9:25:19pm't, '18jan2003:9:27:05am'dt
-            pattern: RegExp(stringPattern + "(?:dt?|t)"),
-            alias: "number"
-          },
-          "string": string,
-          "step": step,
-          "keyword": keywords,
-          // In SAS Studio syntax highlighting, these operators are styled like keywords
-          "operator-keyword": {
-            pattern: /\b(?:eq|ge|gt|in|le|lt|ne|not)\b/i,
-            alias: "operator"
-          },
-          // Decimal (1.2e23), hexadecimal (0c1x)
-          "number": number,
-          "operator": /\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/,
-          "punctuation": punctuation
-        };
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages.sass = Prism2.languages.extend("css", {
-          // Sass comments don't need to be closed, only indented
-          "comment": {
-            pattern: /^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,
-            lookbehind: true,
-            greedy: true
-          }
-        });
-        Prism2.languages.insertBefore("sass", "atrule", {
-          // We want to consume the whole line
-          "atrule-line": {
-            // Includes support for = and + shortcuts
-            pattern: /^(?:[ \t]*)[@+=].+/m,
-            greedy: true,
-            inside: {
-              "atrule": /(?:@[\w-]+|[+=])/
-            }
-          }
-        });
-        delete Prism2.languages.sass.atrule;
-        var variable = /\$[-\w]+|#\{\$[-\w]+\}/;
-        var operator = [
-          /[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,
-          {
-            pattern: /(\s)-(?=\s)/,
-            lookbehind: true
-          }
-        ];
-        Prism2.languages.insertBefore("sass", "property", {
-          // We want to consume the whole line
-          "variable-line": {
-            pattern: /^[ \t]*\$.+/m,
-            greedy: true,
-            inside: {
-              "punctuation": /:/,
-              "variable": variable,
-              "operator": operator
-            }
-          },
-          // We want to consume the whole line
-          "property-line": {
-            pattern: /^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,
-            greedy: true,
-            inside: {
-              "property": [
-                /[^:\s]+(?=\s*:)/,
-                {
-                  pattern: /(:)[^:\s]+/,
-                  lookbehind: true
-                }
-              ],
-              "punctuation": /:/,
-              "variable": variable,
-              "operator": operator,
-              "important": Prism2.languages.sass.important
-            }
-          }
-        });
-        delete Prism2.languages.sass.property;
-        delete Prism2.languages.sass.important;
-        Prism2.languages.insertBefore("sass", "punctuation", {
-          "selector": {
-            pattern: /^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,
-            lookbehind: true,
-            greedy: true
-          }
-        });
-      })(Prism);
-      Prism.languages.scss = Prism.languages.extend("css", {
-        "comment": {
-          pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
-          lookbehind: true
-        },
-        "atrule": {
-          pattern: /@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,
-          inside: {
-            "rule": /@[\w-]+/
-            // See rest below
-          }
-        },
-        // url, compassified
-        "url": /(?:[-a-z]+-)?url(?=\()/i,
-        // CSS selector regex is not appropriate for Sass
-        // since there can be lot more things (var, @ directive, nesting..)
-        // a selector must start at the end of a property or after a brace (end of other rules or nesting)
-        // it can contain some characters that aren't used for defining rules or end of selector, & (parent selector), or interpolated variable
-        // the end of a selector is found when there is no rules in it ( {} or {\s}) or if there is a property (because an interpolated var
-        // can "pass" as a selector- e.g: proper#{$erty})
-        // this one was hard to do, so please be careful if you edit this one :)
-        "selector": {
-          // Initial look-ahead is used to prevent matching of blank selectors
-          pattern: /(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,
-          inside: {
-            "parent": {
-              pattern: /&/,
-              alias: "important"
-            },
-            "placeholder": /%[-\w]+/,
-            "variable": /\$[-\w]+|#\{\$[-\w]+\}/
-          }
-        },
-        "property": {
-          pattern: /(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,
-          inside: {
-            "variable": /\$[-\w]+|#\{\$[-\w]+\}/
-          }
-        }
-      });
-      Prism.languages.insertBefore("scss", "atrule", {
-        "keyword": [
-          /@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,
-          {
-            pattern: /( )(?:from|through)(?= )/,
-            lookbehind: true
-          }
-        ]
-      });
-      Prism.languages.insertBefore("scss", "important", {
-        // var and interpolated vars
-        "variable": /\$[-\w]+|#\{\$[-\w]+\}/
-      });
-      Prism.languages.insertBefore("scss", "function", {
-        "module-modifier": {
-          pattern: /\b(?:as|hide|show|with)\b/i,
-          alias: "keyword"
-        },
-        "placeholder": {
-          pattern: /%[-\w]+/,
-          alias: "selector"
-        },
-        "statement": {
-          pattern: /\B!(?:default|optional)\b/i,
-          alias: "keyword"
-        },
-        "boolean": /\b(?:false|true)\b/,
-        "null": {
-          pattern: /\bnull\b/,
-          alias: "keyword"
-        },
-        "operator": {
-          pattern: /(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,
-          lookbehind: true
-        }
-      });
-      Prism.languages.scss["atrule"].inside.rest = Prism.languages.scss;
-      Prism.languages.scala = Prism.languages.extend("java", {
-        "triple-quoted-string": {
-          pattern: /"""[\s\S]*?"""/,
-          greedy: true,
-          alias: "string"
-        },
-        "string": {
-          pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
-          greedy: true
-        },
-        "keyword": /<-|=>|\b(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\b/,
-        "number": /\b0x(?:[\da-f]*\.)?[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e\d+)?[dfl]?/i,
-        "builtin": /\b(?:Any|AnyRef|AnyVal|Boolean|Byte|Char|Double|Float|Int|Long|Nothing|Short|String|Unit)\b/,
-        "symbol": /'[^\d\s\\]\w*/
-      });
-      Prism.languages.insertBefore("scala", "triple-quoted-string", {
-        "string-interpolation": {
-          pattern: /\b[a-z]\w*(?:"""(?:[^$]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*?"""|"(?:[^$"\r\n]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*")/i,
-          greedy: true,
-          inside: {
-            "id": {
-              pattern: /^\w+/,
-              greedy: true,
-              alias: "function"
-            },
-            "escape": {
-              pattern: /\\\$"|\$[$"]/,
-              greedy: true,
-              alias: "symbol"
-            },
-            "interpolation": {
-              pattern: /\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,
-              greedy: true,
-              inside: {
-                "punctuation": /^\$\{?|\}$/,
-                "expression": {
-                  pattern: /[\s\S]+/,
-                  inside: Prism.languages.scala
-                }
-              }
-            },
-            "string": /[\s\S]+/
-          }
-        }
-      });
-      delete Prism.languages.scala["class-name"];
-      delete Prism.languages.scala["function"];
-      (function(Prism2) {
-        var strings = [
-          // normal string
-          /"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/.source,
-          /'[^']*'/.source,
-          /\$'(?:[^'\\]|\\[\s\S])*'/.source,
-          // here doc
-          // 2 capturing groups
-          /<<-?\s*(["']?)(\w+)\1\s[\s\S]*?[\r\n]\2/.source
-        ].join("|");
-        Prism2.languages["shell-session"] = {
-          "command": {
-            pattern: RegExp(
-              // user info
-              /^/.source + "(?:" + // <user> ":" ( <path> )?
-              (/[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+(?::[^\0-\x1F$#%*?"<>:;|]+)?/.source + "|" + // <path>
-              // Since the path pattern is quite general, we will require it to start with a special character to
-              // prevent false positives.
-              /[/~.][^\0-\x1F$#%*?"<>@:;|]*/.source) + ")?" + // shell symbol
-              /[$#%](?=\s)/.source + // bash command
-              /(?:[^\\\r\n \t'"<$]|[ \t](?:(?!#)|#.*$)|\\(?:[^\r]|\r\n?)|\$(?!')|<(?!<)|<<str>>)+/.source.replace(/<<str>>/g, function() {
-                return strings;
-              }),
-              "m"
-            ),
-            greedy: true,
-            inside: {
-              "info": {
-                // foo@bar:~/files$ exit
-                // foo@bar$ exit
-                // ~/files$ exit
-                pattern: /^[^#$%]+/,
-                alias: "punctuation",
-                inside: {
-                  "user": /^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,
-                  "punctuation": /:/,
-                  "path": /[\s\S]+/
-                }
-              },
-              "bash": {
-                pattern: /(^[$#%]\s*)\S[\s\S]*/,
-                lookbehind: true,
-                alias: "language-bash",
-                inside: Prism2.languages.bash
-              },
-              "shell-symbol": {
-                pattern: /^[$#%]/,
-                alias: "important"
-              }
-            }
-          },
-          "output": /.(?:.*(?:[\r\n]|.$))*/
-        };
-        Prism2.languages["sh-session"] = Prism2.languages["shellsession"] = Prism2.languages["shell-session"];
-      })(Prism);
-      Prism.languages.smali = {
-        "comment": /#.*/,
-        "string": {
-          pattern: /"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\(?:.|u[\da-fA-F]{4}))'/,
-          greedy: true
-        },
-        "class-name": {
-          pattern: /(^|[^L])L(?:(?:\w+|`[^`\r\n]*`)\/)*(?:[\w$]+|`[^`\r\n]*`)(?=\s*;)/,
-          lookbehind: true,
-          inside: {
-            "class-name": {
-              pattern: /(^L|\/)(?:[\w$]+|`[^`\r\n]*`)$/,
-              lookbehind: true
-            },
-            "namespace": {
-              pattern: /^(L)(?:(?:\w+|`[^`\r\n]*`)\/)+/,
-              lookbehind: true,
-              inside: {
-                "punctuation": /\//
-              }
-            },
-            "builtin": /^L/
-          }
-        },
-        "builtin": [
-          {
-            // Reference: https://github.com/JesusFreke/smali/wiki/TypesMethodsAndFields#types
-            pattern: /([();\[])[BCDFIJSVZ]+/,
-            lookbehind: true
-          },
-          {
-            // e.g. .field mWifiOnUid:I
-            pattern: /([\w$>]:)[BCDFIJSVZ]/,
-            lookbehind: true
-          }
-        ],
-        "keyword": [
-          {
-            pattern: /(\.end\s+)[\w-]+/,
-            lookbehind: true
-          },
-          {
-            pattern: /(^|[^\w.-])\.(?!\d)[\w-]+/,
-            lookbehind: true
-          },
-          {
-            pattern: /(^|[^\w.-])(?:abstract|annotation|bridge|constructor|enum|final|interface|private|protected|public|runtime|static|synthetic|system|transient)(?![\w.-])/,
-            lookbehind: true
-          }
-        ],
-        "function": {
-          pattern: /(^|[^\w.-])(?:\w+|<[\w$-]+>)(?=\()/,
-          lookbehind: true
-        },
-        "field": {
-          pattern: /[\w$]+(?=:)/,
-          alias: "variable"
-        },
-        "register": {
-          pattern: /(^|[^\w.-])[vp]\d(?![\w.-])/,
-          lookbehind: true,
-          alias: "variable"
-        },
-        "boolean": {
-          pattern: /(^|[^\w.-])(?:false|true)(?![\w.-])/,
-          lookbehind: true
-        },
-        "number": {
-          pattern: /(^|[^/\w.-])-?(?:NAN|INFINITY|0x(?:[\dA-F]+(?:\.[\dA-F]*)?|\.[\dA-F]+)(?:p[+-]?[\dA-F]+)?|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)[dflst]?(?![\w.-])/i,
-          lookbehind: true
-        },
-        "label": {
-          pattern: /(:)\w+/,
-          lookbehind: true,
-          alias: "property"
-        },
-        "operator": /->|\.\.|[\[=]/,
-        "punctuation": /[{}(),;:]/
-      };
-      Prism.languages.smalltalk = {
-        "comment": {
-          pattern: /"(?:""|[^"])*"/,
-          greedy: true
-        },
-        "char": {
-          pattern: /\$./,
-          greedy: true
-        },
-        "string": {
-          pattern: /'(?:''|[^'])*'/,
-          greedy: true
-        },
-        "symbol": /#[\da-z]+|#(?:-|([+\/\\*~<>=@%|&?!])\1?)|#(?=\()/i,
-        "block-arguments": {
-          pattern: /(\[\s*):[^\[|]*\|/,
-          lookbehind: true,
-          inside: {
-            "variable": /:[\da-z]+/i,
-            "punctuation": /\|/
-          }
-        },
-        "temporary-variables": {
-          pattern: /\|[^|]+\|/,
-          inside: {
-            "variable": /[\da-z]+/i,
-            "punctuation": /\|/
-          }
-        },
-        "keyword": /\b(?:new|nil|self|super)\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "number": [
-          /\d+r-?[\dA-Z]+(?:\.[\dA-Z]+)?(?:e-?\d+)?/,
-          /\b\d+(?:\.\d+)?(?:e-?\d+)?/
-        ],
-        "operator": /[<=]=?|:=|~[~=]|\/\/?|\\\\|>[>=]?|[!^+\-*&|,@]/,
-        "punctuation": /[.;:?\[\](){}]/
-      };
-      (function(Prism2) {
-        Prism2.languages.smarty = {
-          "comment": {
-            pattern: /^\{\*[\s\S]*?\*\}/,
-            greedy: true
-          },
-          "embedded-php": {
-            pattern: /^\{php\}[\s\S]*?\{\/php\}/,
-            greedy: true,
-            inside: {
-              "smarty": {
-                pattern: /^\{php\}|\{\/php\}$/,
-                inside: null
-                // see below
-              },
-              "php": {
-                pattern: /[\s\S]+/,
-                alias: "language-php",
-                inside: Prism2.languages.php
-              }
-            }
-          },
-          "string": [
-            {
-              pattern: /"(?:\\.|[^"\\\r\n])*"/,
-              greedy: true,
-              inside: {
-                "interpolation": {
-                  pattern: /\{[^{}]*\}|`[^`]*`/,
-                  inside: {
-                    "interpolation-punctuation": {
-                      pattern: /^[{`]|[`}]$/,
-                      alias: "punctuation"
-                    },
-                    "expression": {
-                      pattern: /[\s\S]+/,
-                      inside: null
-                      // see below
-                    }
-                  }
-                },
-                "variable": /\$\w+/
-              }
-            },
-            {
-              pattern: /'(?:\\.|[^'\\\r\n])*'/,
-              greedy: true
-            }
-          ],
-          "keyword": {
-            pattern: /(^\{\/?)[a-z_]\w*\b(?!\()/i,
-            lookbehind: true,
-            greedy: true
-          },
-          "delimiter": {
-            pattern: /^\{\/?|\}$/,
-            greedy: true,
-            alias: "punctuation"
-          },
-          "number": /\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,
-          "variable": [
-            /\$(?!\d)\w+/,
-            /#(?!\d)\w+#/,
-            {
-              pattern: /(\.|->|\w\s*=)(?!\d)\w+\b(?!\()/,
-              lookbehind: true
-            },
-            {
-              pattern: /(\[)(?!\d)\w+(?=\])/,
-              lookbehind: true
-            }
-          ],
-          "function": {
-            pattern: /(\|\s*)@?[a-z_]\w*|\b[a-z_]\w*(?=\()/i,
-            lookbehind: true
-          },
-          "attr-name": /\b[a-z_]\w*(?=\s*=)/i,
-          "boolean": /\b(?:false|no|off|on|true|yes)\b/,
-          "punctuation": /[\[\](){}.,:`]|->/,
-          "operator": [
-            /[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/,
-            /\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/,
-            /\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\b/
-          ]
-        };
-        Prism2.languages.smarty["embedded-php"].inside.smarty.inside = Prism2.languages.smarty;
-        Prism2.languages.smarty.string[0].inside.interpolation.inside.expression.inside = Prism2.languages.smarty;
-        var string = /"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/;
-        var smartyPattern = RegExp(
-          // comments
-          /\{\*[\s\S]*?\*\}/.source + "|" + // php tags
-          /\{php\}[\s\S]*?\{\/php\}/.source + "|" + // smarty blocks
-          /\{(?:[^{}"']|<str>|\{(?:[^{}"']|<str>|\{(?:[^{}"']|<str>)*\})*\})*\}/.source.replace(/<str>/g, function() {
-            return string.source;
-          }),
-          "g"
-        );
-        Prism2.hooks.add("before-tokenize", function(env) {
-          var smartyLiteralStart = "{literal}";
-          var smartyLiteralEnd = "{/literal}";
-          var smartyLiteralMode = false;
-          Prism2.languages["markup-templating"].buildPlaceholders(env, "smarty", smartyPattern, function(match) {
-            if (match === smartyLiteralEnd) {
-              smartyLiteralMode = false;
-            }
-            if (!smartyLiteralMode) {
-              if (match === smartyLiteralStart) {
-                smartyLiteralMode = true;
-              }
-              return true;
-            }
-            return false;
-          });
-        });
-        Prism2.hooks.add("after-tokenize", function(env) {
-          Prism2.languages["markup-templating"].tokenizePlaceholders(env, "smarty");
-        });
-      })(Prism);
-      (function(Prism2) {
-        var keywords = /\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\b/i;
-        Prism2.languages.sml = {
-          // allow one level of nesting
-          "comment": /\(\*(?:[^*(]|\*(?!\))|\((?!\*)|\(\*(?:[^*(]|\*(?!\))|\((?!\*))*\*\))*\*\)/,
-          "string": {
-            pattern: /#?"(?:[^"\\]|\\.)*"/,
-            greedy: true
-          },
-          "class-name": [
-            {
-              // This is only an approximation since the real grammar is context-free
-              //
-              // Why the main loop so complex?
-              // The main loop is approximately the same as /(?:\s*(?:[*,]|->)\s*<TERMINAL>)*/ which is, obviously, a lot
-              // simpler. The difference is that if a comma is the last iteration of the loop, then the terminal must be
-              // followed by a long identifier.
-              pattern: RegExp(
-                /((?:^|[^:]):\s*)<TERMINAL>(?:\s*(?:(?:\*|->)\s*<TERMINAL>|,\s*<TERMINAL>(?:(?=<NOT-LAST>)|(?!<NOT-LAST>)\s+<LONG-ID>)))*/.source.replace(/<NOT-LAST>/g, function() {
-                  return /\s*(?:[*,]|->)/.source;
-                }).replace(/<TERMINAL>/g, function() {
-                  return /(?:'[\w']*|<LONG-ID>|\((?:[^()]|\([^()]*\))*\)|\{(?:[^{}]|\{[^{}]*\})*\})(?:\s+<LONG-ID>)*/.source;
-                }).replace(/<LONG-ID>/g, function() {
-                  return /(?!<KEYWORD>)[a-z\d_][\w'.]*/.source;
-                }).replace(/<KEYWORD>/g, function() {
-                  return keywords.source;
-                }),
-                "i"
-              ),
-              lookbehind: true,
-              greedy: true,
-              inside: null
-              // see below
-            },
-            {
-              pattern: /((?:^|[^\w'])(?:datatype|exception|functor|signature|structure|type)\s+)[a-z_][\w'.]*/i,
-              lookbehind: true
-            }
-          ],
-          "function": {
-            pattern: /((?:^|[^\w'])fun\s+)[a-z_][\w'.]*/i,
-            lookbehind: true
-          },
-          "keyword": keywords,
-          "variable": {
-            pattern: /(^|[^\w'])'[\w']*/,
-            lookbehind: true
-          },
-          "number": /~?\b(?:\d+(?:\.\d+)?(?:e~?\d+)?|0x[\da-f]+)\b/i,
-          "word": {
-            pattern: /\b0w(?:\d+|x[\da-f]+)\b/i,
-            alias: "constant"
-          },
-          "boolean": /\b(?:false|true)\b/i,
-          "operator": /\.\.\.|:[>=:]|=>?|->|[<>]=?|[!+\-*/^#|@~]/,
-          "punctuation": /[(){}\[\].:,;]/
-        };
-        Prism2.languages.sml["class-name"][0].inside = Prism2.languages.sml;
-        Prism2.languages.smlnj = Prism2.languages.sml;
-      })(Prism);
-      Prism.languages.solidity = Prism.languages.extend("clike", {
-        "class-name": {
-          pattern: /(\b(?:contract|enum|interface|library|new|struct|using)\s+)(?!\d)[\w$]+/,
-          lookbehind: true
-        },
-        "keyword": /\b(?:_|anonymous|as|assembly|assert|break|calldata|case|constant|constructor|continue|contract|default|delete|do|else|emit|enum|event|external|for|from|function|if|import|indexed|inherited|interface|internal|is|let|library|mapping|memory|modifier|new|payable|pragma|private|public|pure|require|returns?|revert|selfdestruct|solidity|storage|struct|suicide|switch|this|throw|using|var|view|while)\b/,
-        "operator": /=>|->|:=|=:|\*\*|\+\+|--|\|\||&&|<<=?|>>=?|[-+*/%^&|<>!=]=?|[~?]/
-      });
-      Prism.languages.insertBefore("solidity", "keyword", {
-        "builtin": /\b(?:address|bool|byte|u?int(?:8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?|string|bytes(?:[1-9]|[12]\d|3[0-2])?)\b/
-      });
-      Prism.languages.insertBefore("solidity", "number", {
-        "version": {
-          pattern: /([<>]=?|\^)\d+\.\d+\.\d+\b/,
-          lookbehind: true,
-          alias: "number"
-        }
-      });
-      Prism.languages.sol = Prism.languages.solidity;
-      (function(Prism2) {
-        var guid = {
-          // https://en.wikipedia.org/wiki/Universally_unique_identifier#Format
-          pattern: /\{[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}\}/i,
-          alias: "constant",
-          inside: {
-            "punctuation": /[{}]/
-          }
-        };
-        Prism2.languages["solution-file"] = {
-          "comment": {
-            pattern: /#.*/,
-            greedy: true
-          },
-          "string": {
-            pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
-            greedy: true,
-            inside: {
-              "guid": guid
-            }
-          },
-          "object": {
-            // Foo
-            //   Bar("abs") = 9
-            //   EndBar
-            //   Prop = TRUE
-            // EndFoo
-            pattern: /^([ \t]*)(?:([A-Z]\w*)\b(?=.*(?:\r\n?|\n)(?:\1[ \t].*(?:\r\n?|\n))*\1End\2(?=[ \t]*$))|End[A-Z]\w*(?=[ \t]*$))/m,
-            lookbehind: true,
-            greedy: true,
-            alias: "keyword"
-          },
-          "property": {
-            pattern: /^([ \t]*)(?!\s)[^\r\n"#=()]*[^\s"#=()](?=\s*=)/m,
-            lookbehind: true,
-            inside: {
-              "guid": guid
-            }
-          },
-          "guid": guid,
-          "number": /\b\d+(?:\.\d+)*\b/,
-          "boolean": /\b(?:FALSE|TRUE)\b/,
-          "operator": /=/,
-          "punctuation": /[(),]/
-        };
-        Prism2.languages["sln"] = Prism2.languages["solution-file"];
-      })(Prism);
-      (function(Prism2) {
-        var stringPattern = /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;
-        var numberPattern = /\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;
-        Prism2.languages.soy = {
-          "comment": [
-            /\/\*[\s\S]*?\*\//,
-            {
-              pattern: /(\s)\/\/.*/,
-              lookbehind: true,
-              greedy: true
-            }
-          ],
-          "command-arg": {
-            pattern: /(\{+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,
-            lookbehind: true,
-            alias: "string",
-            inside: {
-              "punctuation": /\./
-            }
-          },
-          "parameter": {
-            pattern: /(\{+\/?\s*@?param\??\s+)\.?[\w.]+/,
-            lookbehind: true,
-            alias: "variable"
-          },
-          "keyword": [
-            {
-              pattern: /(\{+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,
-              lookbehind: true
-            },
-            /\b(?:any|as|attributes|bool|css|float|html|in|int|js|list|map|null|number|string|uri)\b/
-          ],
-          "delimiter": {
-            pattern: /^\{+\/?|\/?\}+$/,
-            alias: "punctuation"
-          },
-          "property": /\w+(?==)/,
-          "variable": {
-            pattern: /\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+\]))*/,
-            inside: {
-              "string": {
-                pattern: stringPattern,
-                greedy: true
-              },
-              "number": numberPattern,
-              "punctuation": /[\[\].?]/
-            }
-          },
-          "string": {
-            pattern: stringPattern,
-            greedy: true
-          },
-          "function": [
-            /\w+(?=\()/,
-            {
-              pattern: /(\|[^\S\r\n]*)\w+/,
-              lookbehind: true
-            }
-          ],
-          "boolean": /\b(?:false|true)\b/,
-          "number": numberPattern,
-          "operator": /\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,
-          "punctuation": /[{}()\[\]|.,:]/
-        };
-        Prism2.hooks.add("before-tokenize", function(env) {
-          var soyPattern = /\{\{.+?\}\}|\{.+?\}|\s\/\/.*|\/\*[\s\S]*?\*\//g;
-          var soyLitteralStart = "{literal}";
-          var soyLitteralEnd = "{/literal}";
-          var soyLitteralMode = false;
-          Prism2.languages["markup-templating"].buildPlaceholders(env, "soy", soyPattern, function(match) {
-            if (match === soyLitteralEnd) {
-              soyLitteralMode = false;
-            }
-            if (!soyLitteralMode) {
-              if (match === soyLitteralStart) {
-                soyLitteralMode = true;
-              }
-              return true;
-            }
-            return false;
-          });
-        });
-        Prism2.hooks.add("after-tokenize", function(env) {
-          Prism2.languages["markup-templating"].tokenizePlaceholders(env, "soy");
-        });
-      })(Prism);
-      Prism.languages.turtle = {
-        "comment": {
-          pattern: /#.*/,
-          greedy: true
-        },
-        "multiline-string": {
-          pattern: /"""(?:(?:""?)?(?:[^"\\]|\\.))*"""|'''(?:(?:''?)?(?:[^'\\]|\\.))*'''/,
-          greedy: true,
-          alias: "string",
-          inside: {
-            "comment": /#.*/
-          }
-        },
-        "string": {
-          pattern: /"(?:[^\\"\r\n]|\\.)*"|'(?:[^\\'\r\n]|\\.)*'/,
-          greedy: true
-        },
-        "url": {
-          pattern: /<(?:[^\x00-\x20<>"{}|^`\\]|\\(?:u[\da-fA-F]{4}|U[\da-fA-F]{8}))*>/,
-          greedy: true,
-          inside: {
-            "punctuation": /[<>]/
-          }
-        },
-        "function": {
-          pattern: /(?:(?![-.\d\xB7])[-.\w\xB7\xC0-\uFFFD]+)?:(?:(?![-.])(?:[-.:\w\xC0-\uFFFD]|%[\da-f]{2}|\\.)+)?/i,
-          inside: {
-            "local-name": {
-              pattern: /([^:]*:)[\s\S]+/,
-              lookbehind: true
-            },
-            "prefix": {
-              pattern: /[\s\S]+/,
-              inside: {
-                "punctuation": /:/
-              }
-            }
-          }
-        },
-        "number": /[+-]?\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,
-        "punctuation": /[{}.,;()[\]]|\^\^/,
-        "boolean": /\b(?:false|true)\b/,
-        "keyword": [
-          /(?:\ba|@prefix|@base)\b|=/,
-          /\b(?:base|graph|prefix)\b/i
-        ],
-        "tag": {
-          pattern: /@[a-z]+(?:-[a-z\d]+)*/i,
-          inside: {
-            "punctuation": /@/
-          }
-        }
-      };
-      Prism.languages.trig = Prism.languages["turtle"];
-      Prism.languages.sparql = Prism.languages.extend(
-        "turtle",
-        {
-          "boolean": /\b(?:false|true)\b/i,
-          "variable": {
-            pattern: /[?$]\w+/,
-            greedy: true
-          }
-        }
-      );
-      Prism.languages.insertBefore("sparql", "punctuation", {
-        "keyword": [
-          /\b(?:A|ADD|ALL|AS|ASC|ASK|BNODE|BY|CLEAR|CONSTRUCT|COPY|CREATE|DATA|DEFAULT|DELETE|DESC|DESCRIBE|DISTINCT|DROP|EXISTS|FILTER|FROM|GROUP|HAVING|INSERT|INTO|LIMIT|LOAD|MINUS|MOVE|NAMED|NOT|NOW|OFFSET|OPTIONAL|ORDER|RAND|REDUCED|SELECT|SEPARATOR|SERVICE|SILENT|STRUUID|UNION|USING|UUID|VALUES|WHERE)\b/i,
-          /\b(?:ABS|AVG|BIND|BOUND|CEIL|COALESCE|CONCAT|CONTAINS|COUNT|DATATYPE|DAY|ENCODE_FOR_URI|FLOOR|GROUP_CONCAT|HOURS|IF|IRI|isBLANK|isIRI|isLITERAL|isNUMERIC|isURI|LANG|LANGMATCHES|LCASE|MAX|MD5|MIN|MINUTES|MONTH|REGEX|REPLACE|ROUND|sameTerm|SAMPLE|SECONDS|SHA1|SHA256|SHA384|SHA512|STR|STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|SUBSTR|SUM|TIMEZONE|TZ|UCASE|URI|YEAR)\b(?=\s*\()/i,
-          /\b(?:BASE|GRAPH|PREFIX)\b/i
-        ]
-      });
-      Prism.languages.rq = Prism.languages.sparql;
-      Prism.languages["splunk-spl"] = {
-        "comment": /`comment\("(?:\\.|[^\\"])*"\)`/,
-        "string": {
-          pattern: /"(?:\\.|[^\\"])*"/,
-          greedy: true
-        },
-        // https://docs.splunk.com/Documentation/Splunk/7.3.0/SearchReference/ListOfSearchCommands
-        "keyword": /\b(?:abstract|accum|addcoltotals|addinfo|addtotals|analyzefields|anomalies|anomalousvalue|anomalydetection|append|appendcols|appendcsv|appendlookup|appendpipe|arules|associate|audit|autoregress|bin|bucket|bucketdir|chart|cluster|cofilter|collect|concurrency|contingency|convert|correlate|datamodel|dbinspect|dedup|delete|delta|diff|erex|eval|eventcount|eventstats|extract|fieldformat|fields|fieldsummary|filldown|fillnull|findtypes|folderize|foreach|format|from|gauge|gentimes|geom|geomfilter|geostats|head|highlight|history|iconify|input|inputcsv|inputlookup|iplocation|join|kmeans|kv|kvform|loadjob|localize|localop|lookup|makecontinuous|makemv|makeresults|map|mcollect|metadata|metasearch|meventcollect|mstats|multikv|multisearch|mvcombine|mvexpand|nomv|outlier|outputcsv|outputlookup|outputtext|overlap|pivot|predict|rangemap|rare|regex|relevancy|reltime|rename|replace|rest|return|reverse|rex|rtorder|run|savedsearch|script|scrub|search|searchtxn|selfjoin|sendemail|set|setfields|sichart|sirare|sistats|sitimechart|sitop|sort|spath|stats|strcat|streamstats|table|tags|tail|timechart|timewrap|top|transaction|transpose|trendline|tscollect|tstats|typeahead|typelearner|typer|union|uniq|untable|where|x11|xmlkv|xmlunescape|xpath|xyseries)\b/i,
-        "operator-word": {
-          pattern: /\b(?:and|as|by|not|or|xor)\b/i,
-          alias: "operator"
-        },
-        "function": /\b\w+(?=\s*\()/,
-        "property": /\b\w+(?=\s*=(?!=))/,
-        "date": {
-          // MM/DD/YYYY(:HH:MM:SS)?
-          pattern: /\b\d{1,2}\/\d{1,2}\/\d{1,4}(?:(?::\d{1,2}){3})?\b/,
-          alias: "number"
-        },
-        "number": /\b\d+(?:\.\d+)?\b/,
-        "boolean": /\b(?:f|false|t|true)\b/i,
-        "operator": /[<>=]=?|[-+*/%|]/,
-        "punctuation": /[()[\],]/
-      };
-      Prism.languages.sqf = Prism.languages.extend("clike", {
-        "string": {
-          pattern: /"(?:(?:"")?[^"])*"(?!")|'(?:[^'])*'/,
-          greedy: true
-        },
-        "keyword": /\b(?:breakOut|breakTo|call|case|catch|default|do|echo|else|execFSM|execVM|exitWith|for|forEach|forEachMember|forEachMemberAgent|forEachMemberTeam|from|goto|if|nil|preprocessFile|preprocessFileLineNumbers|private|scopeName|spawn|step|switch|then|throw|to|try|while|with)\b/i,
-        "boolean": /\b(?:false|true)\b/i,
-        "function": /\b(?:abs|accTime|acos|action|actionIDs|actionKeys|actionKeysImages|actionKeysNames|actionKeysNamesArray|actionName|actionParams|activateAddons|activatedAddons|activateKey|add3DENConnection|add3DENEventHandler|add3DENLayer|addAction|addBackpack|addBackpackCargo|addBackpackCargoGlobal|addBackpackGlobal|addCamShake|addCuratorAddons|addCuratorCameraArea|addCuratorEditableObjects|addCuratorEditingArea|addCuratorPoints|addEditorObject|addEventHandler|addForce|addForceGeneratorRTD|addGoggles|addGroupIcon|addHandgunItem|addHeadgear|addItem|addItemCargo|addItemCargoGlobal|addItemPool|addItemToBackpack|addItemToUniform|addItemToVest|addLiveStats|addMagazine|addMagazineAmmoCargo|addMagazineCargo|addMagazineCargoGlobal|addMagazineGlobal|addMagazinePool|addMagazines|addMagazineTurret|addMenu|addMenuItem|addMissionEventHandler|addMPEventHandler|addMusicEventHandler|addOwnedMine|addPlayerScores|addPrimaryWeaponItem|addPublicVariableEventHandler|addRating|addResources|addScore|addScoreSide|addSecondaryWeaponItem|addSwitchableUnit|addTeamMember|addToRemainsCollector|addTorque|addUniform|addVehicle|addVest|addWaypoint|addWeapon|addWeaponCargo|addWeaponCargoGlobal|addWeaponGlobal|addWeaponItem|addWeaponPool|addWeaponTurret|admin|agent|agents|AGLToASL|aimedAtTarget|aimPos|airDensityCurveRTD|airDensityRTD|airplaneThrottle|airportSide|AISFinishHeal|alive|all3DENEntities|allAirports|allControls|allCurators|allCutLayers|allDead|allDeadMen|allDisplays|allGroups|allMapMarkers|allMines|allMissionObjects|allow3DMode|allowCrewInImmobile|allowCuratorLogicIgnoreAreas|allowDamage|allowDammage|allowFileOperations|allowFleeing|allowGetIn|allowSprint|allPlayers|allSimpleObjects|allSites|allTurrets|allUnits|allUnitsUAV|allVariables|ammo|ammoOnPylon|animate|animateBay|animateDoor|animatePylon|animateSource|animationNames|animationPhase|animationSourcePhase|animationState|append|apply|armoryPoints|arrayIntersect|asin|ASLToAGL|ASLToATL|assert|assignAsCargo|assignAsCargoIndex|assignAsCommander|assignAsDriver|assignAsGunner|assignAsTurret|assignCurator|assignedCargo|assignedCommander|assignedDriver|assignedGunner|assignedItems|assignedTarget|assignedTeam|assignedVehicle|assignedVehicleRole|assignItem|assignTeam|assignToAirport|atan|atan2|atg|ATLToASL|attachedObject|attachedObjects|attachedTo|attachObject|attachTo|attackEnabled|backpack|backpackCargo|backpackContainer|backpackItems|backpackMagazines|backpackSpaceFor|behaviour|benchmark|binocular|blufor|boundingBox|boundingBoxReal|boundingCenter|briefingName|buildingExit|buildingPos|buldozer_EnableRoadDiag|buldozer_IsEnabledRoadDiag|buldozer_LoadNewRoads|buldozer_reloadOperMap|buttonAction|buttonSetAction|cadetMode|callExtension|camCommand|camCommit|camCommitPrepared|camCommitted|camConstuctionSetParams|camCreate|camDestroy|cameraEffect|cameraEffectEnableHUD|cameraInterest|cameraOn|cameraView|campaignConfigFile|camPreload|camPreloaded|camPrepareBank|camPrepareDir|camPrepareDive|camPrepareFocus|camPrepareFov|camPrepareFovRange|camPreparePos|camPrepareRelPos|camPrepareTarget|camSetBank|camSetDir|camSetDive|camSetFocus|camSetFov|camSetFovRange|camSetPos|camSetRelPos|camSetTarget|camTarget|camUseNVG|canAdd|canAddItemToBackpack|canAddItemToUniform|canAddItemToVest|cancelSimpleTaskDestination|canFire|canMove|canSlingLoad|canStand|canSuspend|canTriggerDynamicSimulation|canUnloadInCombat|canVehicleCargo|captive|captiveNum|cbChecked|cbSetChecked|ceil|channelEnabled|cheatsEnabled|checkAIFeature|checkVisibility|civilian|className|clear3DENAttribute|clear3DENInventory|clearAllItemsFromBackpack|clearBackpackCargo|clearBackpackCargoGlobal|clearForcesRTD|clearGroupIcons|clearItemCargo|clearItemCargoGlobal|clearItemPool|clearMagazineCargo|clearMagazineCargoGlobal|clearMagazinePool|clearOverlay|clearRadio|clearVehicleInit|clearWeaponCargo|clearWeaponCargoGlobal|clearWeaponPool|clientOwner|closeDialog|closeDisplay|closeOverlay|collapseObjectTree|collect3DENHistory|collectiveRTD|combatMode|commandArtilleryFire|commandChat|commander|commandFire|commandFollow|commandFSM|commandGetOut|commandingMenu|commandMove|commandRadio|commandStop|commandSuppressiveFire|commandTarget|commandWatch|comment|commitOverlay|compile|compileFinal|completedFSM|composeText|configClasses|configFile|configHierarchy|configName|configNull|configProperties|configSourceAddonList|configSourceMod|configSourceModList|confirmSensorTarget|connectTerminalToUAV|controlNull|controlsGroupCtrl|copyFromClipboard|copyToClipboard|copyWaypoints|cos|count|countEnemy|countFriendly|countSide|countType|countUnknown|create3DENComposition|create3DENEntity|createAgent|createCenter|createDialog|createDiaryLink|createDiaryRecord|createDiarySubject|createDisplay|createGearDialog|createGroup|createGuardedPoint|createLocation|createMarker|createMarkerLocal|createMenu|createMine|createMissionDisplay|createMPCampaignDisplay|createSimpleObject|createSimpleTask|createSite|createSoundSource|createTask|createTeam|createTrigger|createUnit|createVehicle|createVehicleCrew|createVehicleLocal|crew|ctAddHeader|ctAddRow|ctClear|ctCurSel|ctData|ctFindHeaderRows|ctFindRowHeader|ctHeaderControls|ctHeaderCount|ctRemoveHeaders|ctRemoveRows|ctrlActivate|ctrlAddEventHandler|ctrlAngle|ctrlAutoScrollDelay|ctrlAutoScrollRewind|ctrlAutoScrollSpeed|ctrlChecked|ctrlClassName|ctrlCommit|ctrlCommitted|ctrlCreate|ctrlDelete|ctrlEnable|ctrlEnabled|ctrlFade|ctrlHTMLLoaded|ctrlIDC|ctrlIDD|ctrlMapAnimAdd|ctrlMapAnimClear|ctrlMapAnimCommit|ctrlMapAnimDone|ctrlMapCursor|ctrlMapMouseOver|ctrlMapScale|ctrlMapScreenToWorld|ctrlMapWorldToScreen|ctrlModel|ctrlModelDirAndUp|ctrlModelScale|ctrlParent|ctrlParentControlsGroup|ctrlPosition|ctrlRemoveAllEventHandlers|ctrlRemoveEventHandler|ctrlScale|ctrlSetActiveColor|ctrlSetAngle|ctrlSetAutoScrollDelay|ctrlSetAutoScrollRewind|ctrlSetAutoScrollSpeed|ctrlSetBackgroundColor|ctrlSetChecked|ctrlSetDisabledColor|ctrlSetEventHandler|ctrlSetFade|ctrlSetFocus|ctrlSetFont|ctrlSetFontH1|ctrlSetFontH1B|ctrlSetFontH2|ctrlSetFontH2B|ctrlSetFontH3|ctrlSetFontH3B|ctrlSetFontH4|ctrlSetFontH4B|ctrlSetFontH5|ctrlSetFontH5B|ctrlSetFontH6|ctrlSetFontH6B|ctrlSetFontHeight|ctrlSetFontHeightH1|ctrlSetFontHeightH2|ctrlSetFontHeightH3|ctrlSetFontHeightH4|ctrlSetFontHeightH5|ctrlSetFontHeightH6|ctrlSetFontHeightSecondary|ctrlSetFontP|ctrlSetFontPB|ctrlSetFontSecondary|ctrlSetForegroundColor|ctrlSetModel|ctrlSetModelDirAndUp|ctrlSetModelScale|ctrlSetPixelPrecision|ctrlSetPosition|ctrlSetScale|ctrlSetStructuredText|ctrlSetText|ctrlSetTextColor|ctrlSetTextColorSecondary|ctrlSetTextSecondary|ctrlSetTooltip|ctrlSetTooltipColorBox|ctrlSetTooltipColorShade|ctrlSetTooltipColorText|ctrlShow|ctrlShown|ctrlText|ctrlTextHeight|ctrlTextSecondary|ctrlTextWidth|ctrlType|ctrlVisible|ctRowControls|ctRowCount|ctSetCurSel|ctSetData|ctSetHeaderTemplate|ctSetRowTemplate|ctSetValue|ctValue|curatorAddons|curatorCamera|curatorCameraArea|curatorCameraAreaCeiling|curatorCoef|curatorEditableObjects|curatorEditingArea|curatorEditingAreaType|curatorMouseOver|curatorPoints|curatorRegisteredObjects|curatorSelected|curatorWaypointCost|current3DENOperation|currentChannel|currentCommand|currentMagazine|currentMagazineDetail|currentMagazineDetailTurret|currentMagazineTurret|currentMuzzle|currentNamespace|currentTask|currentTasks|currentThrowable|currentVisionMode|currentWaypoint|currentWeapon|currentWeaponMode|currentWeaponTurret|currentZeroing|cursorObject|cursorTarget|customChat|customRadio|cutFadeOut|cutObj|cutRsc|cutText|damage|date|dateToNumber|daytime|deActivateKey|debriefingText|debugFSM|debugLog|deg|delete3DENEntities|deleteAt|deleteCenter|deleteCollection|deleteEditorObject|deleteGroup|deleteGroupWhenEmpty|deleteIdentity|deleteLocation|deleteMarker|deleteMarkerLocal|deleteRange|deleteResources|deleteSite|deleteStatus|deleteTeam|deleteVehicle|deleteVehicleCrew|deleteWaypoint|detach|detectedMines|diag_activeMissionFSMs|diag_activeScripts|diag_activeSQFScripts|diag_activeSQSScripts|diag_captureFrame|diag_captureFrameToFile|diag_captureSlowFrame|diag_codePerformance|diag_drawMode|diag_dynamicSimulationEnd|diag_enable|diag_enabled|diag_fps|diag_fpsMin|diag_frameNo|diag_lightNewLoad|diag_list|diag_log|diag_logSlowFrame|diag_mergeConfigFile|diag_recordTurretLimits|diag_setLightNew|diag_tickTime|diag_toggle|dialog|diarySubjectExists|didJIP|didJIPOwner|difficulty|difficultyEnabled|difficultyEnabledRTD|difficultyOption|direction|directSay|disableAI|disableCollisionWith|disableConversation|disableDebriefingStats|disableMapIndicators|disableNVGEquipment|disableRemoteSensors|disableSerialization|disableTIEquipment|disableUAVConnectability|disableUserInput|displayAddEventHandler|displayCtrl|displayNull|displayParent|displayRemoveAllEventHandlers|displayRemoveEventHandler|displaySetEventHandler|dissolveTeam|distance|distance2D|distanceSqr|distributionRegion|do3DENAction|doArtilleryFire|doFire|doFollow|doFSM|doGetOut|doMove|doorPhase|doStop|doSuppressiveFire|doTarget|doWatch|drawArrow|drawEllipse|drawIcon|drawIcon3D|drawLine|drawLine3D|drawLink|drawLocation|drawPolygon|drawRectangle|drawTriangle|driver|drop|dynamicSimulationDistance|dynamicSimulationDistanceCoef|dynamicSimulationEnabled|dynamicSimulationSystemEnabled|east|edit3DENMissionAttributes|editObject|editorSetEventHandler|effectiveCommander|emptyPositions|enableAI|enableAIFeature|enableAimPrecision|enableAttack|enableAudioFeature|enableAutoStartUpRTD|enableAutoTrimRTD|enableCamShake|enableCaustics|enableChannel|enableCollisionWith|enableCopilot|enableDebriefingStats|enableDiagLegend|enableDynamicSimulation|enableDynamicSimulationSystem|enableEndDialog|enableEngineArtillery|enableEnvironment|enableFatigue|enableGunLights|enableInfoPanelComponent|enableIRLasers|enableMimics|enablePersonTurret|enableRadio|enableReload|enableRopeAttach|enableSatNormalOnDetail|enableSaving|enableSentences|enableSimulation|enableSimulationGlobal|enableStamina|enableStressDamage|enableTeamSwitch|enableTraffic|enableUAVConnectability|enableUAVWaypoints|enableVehicleCargo|enableVehicleSensor|enableWeaponDisassembly|endl|endLoadingScreen|endMission|engineOn|enginesIsOnRTD|enginesPowerRTD|enginesRpmRTD|enginesTorqueRTD|entities|environmentEnabled|estimatedEndServerTime|estimatedTimeLeft|evalObjectArgument|everyBackpack|everyContainer|exec|execEditorScript|exp|expectedDestination|exportJIPMessages|eyeDirection|eyePos|face|faction|fadeMusic|fadeRadio|fadeSound|fadeSpeech|failMission|fillWeaponsFromPool|find|findCover|findDisplay|findEditorObject|findEmptyPosition|findEmptyPositionReady|findIf|findNearestEnemy|finishMissionInit|finite|fire|fireAtTarget|firstBackpack|flag|flagAnimationPhase|flagOwner|flagSide|flagTexture|fleeing|floor|flyInHeight|flyInHeightASL|fog|fogForecast|fogParams|forceAddUniform|forceAtPositionRTD|forcedMap|forceEnd|forceFlagTexture|forceFollowRoad|forceGeneratorRTD|forceMap|forceRespawn|forceSpeed|forceWalk|forceWeaponFire|forceWeatherChange|forgetTarget|format|formation|formationDirection|formationLeader|formationMembers|formationPosition|formationTask|formatText|formLeader|freeLook|fromEditor|fuel|fullCrew|gearIDCAmmoCount|gearSlotAmmoCount|gearSlotData|get3DENActionState|get3DENAttribute|get3DENCamera|get3DENConnections|get3DENEntity|get3DENEntityID|get3DENGrid|get3DENIconsVisible|get3DENLayerEntities|get3DENLinesVisible|get3DENMissionAttribute|get3DENMouseOver|get3DENSelected|getAimingCoef|getAllEnvSoundControllers|getAllHitPointsDamage|getAllOwnedMines|getAllSoundControllers|getAmmoCargo|getAnimAimPrecision|getAnimSpeedCoef|getArray|getArtilleryAmmo|getArtilleryComputerSettings|getArtilleryETA|getAssignedCuratorLogic|getAssignedCuratorUnit|getBackpackCargo|getBleedingRemaining|getBurningValue|getCameraViewDirection|getCargoIndex|getCenterOfMass|getClientState|getClientStateNumber|getCompatiblePylonMagazines|getConnectedUAV|getContainerMaxLoad|getCursorObjectParams|getCustomAimCoef|getDammage|getDescription|getDir|getDirVisual|getDLCAssetsUsage|getDLCAssetsUsageByName|getDLCs|getDLCUsageTime|getEditorCamera|getEditorMode|getEditorObjectScope|getElevationOffset|getEngineTargetRpmRTD|getEnvSoundController|getFatigue|getFieldManualStartPage|getForcedFlagTexture|getFriend|getFSMVariable|getFuelCargo|getGroupIcon|getGroupIconParams|getGroupIcons|getHideFrom|getHit|getHitIndex|getHitPointDamage|getItemCargo|getMagazineCargo|getMarkerColor|getMarkerPos|getMarkerSize|getMarkerType|getMass|getMissionConfig|getMissionConfigValue|getMissionDLCs|getMissionLayerEntities|getMissionLayers|getModelInfo|getMousePosition|getMusicPlayedTime|getNumber|getObjectArgument|getObjectChildren|getObjectDLC|getObjectMaterials|getObjectProxy|getObjectTextures|getObjectType|getObjectViewDistance|getOxygenRemaining|getPersonUsedDLCs|getPilotCameraDirection|getPilotCameraPosition|getPilotCameraRotation|getPilotCameraTarget|getPlateNumber|getPlayerChannel|getPlayerScores|getPlayerUID|getPlayerUIDOld|getPos|getPosASL|getPosASLVisual|getPosASLW|getPosATL|getPosATLVisual|getPosVisual|getPosWorld|getPylonMagazines|getRelDir|getRelPos|getRemoteSensorsDisabled|getRepairCargo|getResolution|getRotorBrakeRTD|getShadowDistance|getShotParents|getSlingLoad|getSoundController|getSoundControllerResult|getSpeed|getStamina|getStatValue|getSuppression|getTerrainGrid|getTerrainHeightASL|getText|getTotalDLCUsageTime|getTrimOffsetRTD|getUnitLoadout|getUnitTrait|getUserMFDText|getUserMFDValue|getVariable|getVehicleCargo|getWeaponCargo|getWeaponSway|getWingsOrientationRTD|getWingsPositionRTD|getWPPos|glanceAt|globalChat|globalRadio|goggles|group|groupChat|groupFromNetId|groupIconSelectable|groupIconsVisible|groupId|groupOwner|groupRadio|groupSelectedUnits|groupSelectUnit|grpNull|gunner|gusts|halt|handgunItems|handgunMagazine|handgunWeapon|handsHit|hasInterface|hasPilotCamera|hasWeapon|hcAllGroups|hcGroupParams|hcLeader|hcRemoveAllGroups|hcRemoveGroup|hcSelected|hcSelectGroup|hcSetGroup|hcShowBar|hcShownBar|headgear|hideBody|hideObject|hideObjectGlobal|hideSelection|hint|hintC|hintCadet|hintSilent|hmd|hostMission|htmlLoad|HUDMovementLevels|humidity|image|importAllGroups|importance|in|inArea|inAreaArray|incapacitatedState|independent|inflame|inflamed|infoPanel|infoPanelComponentEnabled|infoPanelComponents|infoPanels|inGameUISetEventHandler|inheritsFrom|initAmbientLife|inPolygon|inputAction|inRangeOfArtillery|insertEditorObject|intersect|is3DEN|is3DENMultiplayer|isAbleToBreathe|isAgent|isAimPrecisionEnabled|isArray|isAutoHoverOn|isAutonomous|isAutoStartUpEnabledRTD|isAutotest|isAutoTrimOnRTD|isBleeding|isBurning|isClass|isCollisionLightOn|isCopilotEnabled|isDamageAllowed|isDedicated|isDLCAvailable|isEngineOn|isEqualTo|isEqualType|isEqualTypeAll|isEqualTypeAny|isEqualTypeArray|isEqualTypeParams|isFilePatchingEnabled|isFlashlightOn|isFlatEmpty|isForcedWalk|isFormationLeader|isGroupDeletedWhenEmpty|isHidden|isInRemainsCollector|isInstructorFigureEnabled|isIRLaserOn|isKeyActive|isKindOf|isLaserOn|isLightOn|isLocalized|isManualFire|isMarkedForCollection|isMultiplayer|isMultiplayerSolo|isNil|isNull|isNumber|isObjectHidden|isObjectRTD|isOnRoad|isPipEnabled|isPlayer|isRealTime|isRemoteExecuted|isRemoteExecutedJIP|isServer|isShowing3DIcons|isSimpleObject|isSprintAllowed|isStaminaEnabled|isSteamMission|isStreamFriendlyUIEnabled|isStressDamageEnabled|isText|isTouchingGround|isTurnedOut|isTutHintsEnabled|isUAVConnectable|isUAVConnected|isUIContext|isUniformAllowed|isVehicleCargo|isVehicleRadarOn|isVehicleSensorEnabled|isWalking|isWeaponDeployed|isWeaponRested|itemCargo|items|itemsWithMagazines|join|joinAs|joinAsSilent|joinSilent|joinString|kbAddDatabase|kbAddDatabaseTargets|kbAddTopic|kbHasTopic|kbReact|kbRemoveTopic|kbTell|kbWasSaid|keyImage|keyName|knowsAbout|land|landAt|landResult|language|laserTarget|lbAdd|lbClear|lbColor|lbColorRight|lbCurSel|lbData|lbDelete|lbIsSelected|lbPicture|lbPictureRight|lbSelection|lbSetColor|lbSetColorRight|lbSetCurSel|lbSetData|lbSetPicture|lbSetPictureColor|lbSetPictureColorDisabled|lbSetPictureColorSelected|lbSetPictureRight|lbSetPictureRightColor|lbSetPictureRightColorDisabled|lbSetPictureRightColorSelected|lbSetSelectColor|lbSetSelectColorRight|lbSetSelected|lbSetText|lbSetTextRight|lbSetTooltip|lbSetValue|lbSize|lbSort|lbSortByValue|lbText|lbTextRight|lbValue|leader|leaderboardDeInit|leaderboardGetRows|leaderboardInit|leaderboardRequestRowsFriends|leaderboardRequestRowsGlobal|leaderboardRequestRowsGlobalAroundUser|leaderboardsRequestUploadScore|leaderboardsRequestUploadScoreKeepBest|leaderboardState|leaveVehicle|libraryCredits|libraryDisclaimers|lifeState|lightAttachObject|lightDetachObject|lightIsOn|lightnings|limitSpeed|linearConversion|lineBreak|lineIntersects|lineIntersectsObjs|lineIntersectsSurfaces|lineIntersectsWith|linkItem|list|listObjects|listRemoteTargets|listVehicleSensors|ln|lnbAddArray|lnbAddColumn|lnbAddRow|lnbClear|lnbColor|lnbColorRight|lnbCurSelRow|lnbData|lnbDeleteColumn|lnbDeleteRow|lnbGetColumnsPosition|lnbPicture|lnbPictureRight|lnbSetColor|lnbSetColorRight|lnbSetColumnsPos|lnbSetCurSelRow|lnbSetData|lnbSetPicture|lnbSetPictureColor|lnbSetPictureColorRight|lnbSetPictureColorSelected|lnbSetPictureColorSelectedRight|lnbSetPictureRight|lnbSetText|lnbSetTextRight|lnbSetValue|lnbSize|lnbSort|lnbSortByValue|lnbText|lnbTextRight|lnbValue|load|loadAbs|loadBackpack|loadFile|loadGame|loadIdentity|loadMagazine|loadOverlay|loadStatus|loadUniform|loadVest|local|localize|locationNull|locationPosition|lock|lockCameraTo|lockCargo|lockDriver|locked|lockedCargo|lockedDriver|lockedTurret|lockIdentity|lockTurret|lockWP|log|logEntities|logNetwork|logNetworkTerminate|lookAt|lookAtPos|magazineCargo|magazines|magazinesAllTurrets|magazinesAmmo|magazinesAmmoCargo|magazinesAmmoFull|magazinesDetail|magazinesDetailBackpack|magazinesDetailUniform|magazinesDetailVest|magazinesTurret|magazineTurretAmmo|mapAnimAdd|mapAnimClear|mapAnimCommit|mapAnimDone|mapCenterOnCamera|mapGridPosition|markAsFinishedOnSteam|markerAlpha|markerBrush|markerColor|markerDir|markerPos|markerShape|markerSize|markerText|markerType|max|members|menuAction|menuAdd|menuChecked|menuClear|menuCollapse|menuData|menuDelete|menuEnable|menuEnabled|menuExpand|menuHover|menuPicture|menuSetAction|menuSetCheck|menuSetData|menuSetPicture|menuSetValue|menuShortcut|menuShortcutText|menuSize|menuSort|menuText|menuURL|menuValue|min|mineActive|mineDetectedBy|missionConfigFile|missionDifficulty|missionName|missionNamespace|missionStart|missionVersion|modelToWorld|modelToWorldVisual|modelToWorldVisualWorld|modelToWorldWorld|modParams|moonIntensity|moonPhase|morale|move|move3DENCamera|moveInAny|moveInCargo|moveInCommander|moveInDriver|moveInGunner|moveInTurret|moveObjectToEnd|moveOut|moveTime|moveTo|moveToCompleted|moveToFailed|musicVolume|name|nameSound|nearEntities|nearestBuilding|nearestLocation|nearestLocations|nearestLocationWithDubbing|nearestObject|nearestObjects|nearestTerrainObjects|nearObjects|nearObjectsReady|nearRoads|nearSupplies|nearTargets|needReload|netId|netObjNull|newOverlay|nextMenuItemIndex|nextWeatherChange|nMenuItems|numberOfEnginesRTD|numberToDate|objectCurators|objectFromNetId|objectParent|objNull|objStatus|onBriefingGear|onBriefingGroup|onBriefingNotes|onBriefingPlan|onBriefingTeamSwitch|onCommandModeChanged|onDoubleClick|onEachFrame|onGroupIconClick|onGroupIconOverEnter|onGroupIconOverLeave|onHCGroupSelectionChanged|onMapSingleClick|onPlayerConnected|onPlayerDisconnected|onPreloadFinished|onPreloadStarted|onShowNewObject|onTeamSwitch|openCuratorInterface|openDLCPage|openDSInterface|openMap|openSteamApp|openYoutubeVideo|opfor|orderGetIn|overcast|overcastForecast|owner|param|params|parseNumber|parseSimpleArray|parseText|parsingNamespace|particlesQuality|pi|pickWeaponPool|pitch|pixelGrid|pixelGridBase|pixelGridNoUIScale|pixelH|pixelW|playableSlotsNumber|playableUnits|playAction|playActionNow|player|playerRespawnTime|playerSide|playersNumber|playGesture|playMission|playMove|playMoveNow|playMusic|playScriptedMission|playSound|playSound3D|position|positionCameraToWorld|posScreenToWorld|posWorldToScreen|ppEffectAdjust|ppEffectCommit|ppEffectCommitted|ppEffectCreate|ppEffectDestroy|ppEffectEnable|ppEffectEnabled|ppEffectForceInNVG|precision|preloadCamera|preloadObject|preloadSound|preloadTitleObj|preloadTitleRsc|primaryWeapon|primaryWeaponItems|primaryWeaponMagazine|priority|processDiaryLink|processInitCommands|productVersion|profileName|profileNamespace|profileNameSteam|progressLoadingScreen|progressPosition|progressSetPosition|publicVariable|publicVariableClient|publicVariableServer|pushBack|pushBackUnique|putWeaponPool|queryItemsPool|queryMagazinePool|queryWeaponPool|rad|radioChannelAdd|radioChannelCreate|radioChannelRemove|radioChannelSetCallSign|radioChannelSetLabel|radioVolume|rain|rainbow|random|rank|rankId|rating|rectangular|registeredTasks|registerTask|reload|reloadEnabled|remoteControl|remoteExec|remoteExecCall|remoteExecutedOwner|remove3DENConnection|remove3DENEventHandler|remove3DENLayer|removeAction|removeAll3DENEventHandlers|removeAllActions|removeAllAssignedItems|removeAllContainers|removeAllCuratorAddons|removeAllCuratorCameraAreas|removeAllCuratorEditingAreas|removeAllEventHandlers|removeAllHandgunItems|removeAllItems|removeAllItemsWithMagazines|removeAllMissionEventHandlers|removeAllMPEventHandlers|removeAllMusicEventHandlers|removeAllOwnedMines|removeAllPrimaryWeaponItems|removeAllWeapons|removeBackpack|removeBackpackGlobal|removeCuratorAddons|removeCuratorCameraArea|removeCuratorEditableObjects|removeCuratorEditingArea|removeDrawIcon|removeDrawLinks|removeEventHandler|removeFromRemainsCollector|removeGoggles|removeGroupIcon|removeHandgunItem|removeHeadgear|removeItem|removeItemFromBackpack|removeItemFromUniform|removeItemFromVest|removeItems|removeMagazine|removeMagazineGlobal|removeMagazines|removeMagazinesTurret|removeMagazineTurret|removeMenuItem|removeMissionEventHandler|removeMPEventHandler|removeMusicEventHandler|removeOwnedMine|removePrimaryWeaponItem|removeSecondaryWeaponItem|removeSimpleTask|removeSwitchableUnit|removeTeamMember|removeUniform|removeVest|removeWeapon|removeWeaponAttachmentCargo|removeWeaponCargo|removeWeaponGlobal|removeWeaponTurret|reportRemoteTarget|requiredVersion|resetCamShake|resetSubgroupDirection|resistance|resize|resources|respawnVehicle|restartEditorCamera|reveal|revealMine|reverse|reversedMouseY|roadAt|roadsConnectedTo|roleDescription|ropeAttachedObjects|ropeAttachedTo|ropeAttachEnabled|ropeAttachTo|ropeCreate|ropeCut|ropeDestroy|ropeDetach|ropeEndPosition|ropeLength|ropes|ropeUnwind|ropeUnwound|rotorsForcesRTD|rotorsRpmRTD|round|runInitScript|safeZoneH|safeZoneW|safeZoneWAbs|safeZoneX|safeZoneXAbs|safeZoneY|save3DENInventory|saveGame|saveIdentity|saveJoysticks|saveOverlay|saveProfileNamespace|saveStatus|saveVar|savingEnabled|say|say2D|say3D|score|scoreSide|screenshot|screenToWorld|scriptDone|scriptName|scriptNull|scudState|secondaryWeapon|secondaryWeaponItems|secondaryWeaponMagazine|select|selectBestPlaces|selectDiarySubject|selectedEditorObjects|selectEditorObject|selectionNames|selectionPosition|selectLeader|selectMax|selectMin|selectNoPlayer|selectPlayer|selectRandom|selectRandomWeighted|selectWeapon|selectWeaponTurret|sendAUMessage|sendSimpleCommand|sendTask|sendTaskResult|sendUDPMessage|serverCommand|serverCommandAvailable|serverCommandExecutable|serverName|serverTime|set|set3DENAttribute|set3DENAttributes|set3DENGrid|set3DENIconsVisible|set3DENLayer|set3DENLinesVisible|set3DENLogicType|set3DENMissionAttribute|set3DENMissionAttributes|set3DENModelsVisible|set3DENObjectType|set3DENSelected|setAccTime|setActualCollectiveRTD|setAirplaneThrottle|setAirportSide|setAmmo|setAmmoCargo|setAmmoOnPylon|setAnimSpeedCoef|setAperture|setApertureNew|setArmoryPoints|setAttributes|setAutonomous|setBehaviour|setBleedingRemaining|setBrakesRTD|setCameraInterest|setCamShakeDefParams|setCamShakeParams|setCamUseTI|setCaptive|setCenterOfMass|setCollisionLight|setCombatMode|setCompassOscillation|setConvoySeparation|setCuratorCameraAreaCeiling|setCuratorCoef|setCuratorEditingAreaType|setCuratorWaypointCost|setCurrentChannel|setCurrentTask|setCurrentWaypoint|setCustomAimCoef|setCustomWeightRTD|setDamage|setDammage|setDate|setDebriefingText|setDefaultCamera|setDestination|setDetailMapBlendPars|setDir|setDirection|setDrawIcon|setDriveOnPath|setDropInterval|setDynamicSimulationDistance|setDynamicSimulationDistanceCoef|setEditorMode|setEditorObjectScope|setEffectCondition|setEngineRpmRTD|setFace|setFaceAnimation|setFatigue|setFeatureType|setFlagAnimationPhase|setFlagOwner|setFlagSide|setFlagTexture|setFog|setForceGeneratorRTD|setFormation|setFormationTask|setFormDir|setFriend|setFromEditor|setFSMVariable|setFuel|setFuelCargo|setGroupIcon|setGroupIconParams|setGroupIconsSelectable|setGroupIconsVisible|setGroupId|setGroupIdGlobal|setGroupOwner|setGusts|setHideBehind|setHit|setHitIndex|setHitPointDamage|setHorizonParallaxCoef|setHUDMovementLevels|setIdentity|setImportance|setInfoPanel|setLeader|setLightAmbient|setLightAttenuation|setLightBrightness|setLightColor|setLightDayLight|setLightFlareMaxDistance|setLightFlareSize|setLightIntensity|setLightnings|setLightUseFlare|setLocalWindParams|setMagazineTurretAmmo|setMarkerAlpha|setMarkerAlphaLocal|setMarkerBrush|setMarkerBrushLocal|setMarkerColor|setMarkerColorLocal|setMarkerDir|setMarkerDirLocal|setMarkerPos|setMarkerPosLocal|setMarkerShape|setMarkerShapeLocal|setMarkerSize|setMarkerSizeLocal|setMarkerText|setMarkerTextLocal|setMarkerType|setMarkerTypeLocal|setMass|setMimic|setMousePosition|setMusicEffect|setMusicEventHandler|setName|setNameSound|setObjectArguments|setObjectMaterial|setObjectMaterialGlobal|setObjectProxy|setObjectTexture|setObjectTextureGlobal|setObjectViewDistance|setOvercast|setOwner|setOxygenRemaining|setParticleCircle|setParticleClass|setParticleFire|setParticleParams|setParticleRandom|setPilotCameraDirection|setPilotCameraRotation|setPilotCameraTarget|setPilotLight|setPiPEffect|setPitch|setPlateNumber|setPlayable|setPlayerRespawnTime|setPos|setPosASL|setPosASL2|setPosASLW|setPosATL|setPosition|setPosWorld|setPylonLoadOut|setPylonsPriority|setRadioMsg|setRain|setRainbow|setRandomLip|setRank|setRectangular|setRepairCargo|setRotorBrakeRTD|setShadowDistance|setShotParents|setSide|setSimpleTaskAlwaysVisible|setSimpleTaskCustomData|setSimpleTaskDescription|setSimpleTaskDestination|setSimpleTaskTarget|setSimpleTaskType|setSimulWeatherLayers|setSize|setSkill|setSlingLoad|setSoundEffect|setSpeaker|setSpeech|setSpeedMode|setStamina|setStaminaScheme|setStatValue|setSuppression|setSystemOfUnits|setTargetAge|setTaskMarkerOffset|setTaskResult|setTaskState|setTerrainGrid|setText|setTimeMultiplier|setTitleEffect|setToneMapping|setToneMappingParams|setTrafficDensity|setTrafficDistance|setTrafficGap|setTrafficSpeed|setTriggerActivation|setTriggerArea|setTriggerStatements|setTriggerText|setTriggerTimeout|setTriggerType|setType|setUnconscious|setUnitAbility|setUnitLoadout|setUnitPos|setUnitPosWeak|setUnitRank|setUnitRecoilCoefficient|setUnitTrait|setUnloadInCombat|setUserActionText|setUserMFDText|setUserMFDValue|setVariable|setVectorDir|setVectorDirAndUp|setVectorUp|setVehicleAmmo|setVehicleAmmoDef|setVehicleArmor|setVehicleCargo|setVehicleId|setVehicleInit|setVehicleLock|setVehiclePosition|setVehicleRadar|setVehicleReceiveRemoteTargets|setVehicleReportOwnPosition|setVehicleReportRemoteTargets|setVehicleTIPars|setVehicleVarName|setVelocity|setVelocityModelSpace|setVelocityTransformation|setViewDistance|setVisibleIfTreeCollapsed|setWantedRpmRTD|setWaves|setWaypointBehaviour|setWaypointCombatMode|setWaypointCompletionRadius|setWaypointDescription|setWaypointForceBehaviour|setWaypointFormation|setWaypointHousePosition|setWaypointLoiterRadius|setWaypointLoiterType|setWaypointName|setWaypointPosition|setWaypointScript|setWaypointSpeed|setWaypointStatements|setWaypointTimeout|setWaypointType|setWaypointVisible|setWeaponReloadingTime|setWind|setWindDir|setWindForce|setWindStr|setWingForceScaleRTD|setWPPos|show3DIcons|showChat|showCinemaBorder|showCommandingMenu|showCompass|showCuratorCompass|showGPS|showHUD|showLegend|showMap|shownArtilleryComputer|shownChat|shownCompass|shownCuratorCompass|showNewEditorObject|shownGPS|shownHUD|shownMap|shownPad|shownRadio|shownScoretable|shownUAVFeed|shownWarrant|shownWatch|showPad|showRadio|showScoretable|showSubtitles|showUAVFeed|showWarrant|showWatch|showWaypoint|showWaypoints|side|sideAmbientLife|sideChat|sideEmpty|sideEnemy|sideFriendly|sideLogic|sideRadio|sideUnknown|simpleTasks|simulationEnabled|simulCloudDensity|simulCloudOcclusion|simulInClouds|simulWeatherSync|sin|size|sizeOf|skill|skillFinal|skipTime|sleep|sliderPosition|sliderRange|sliderSetPosition|sliderSetRange|sliderSetSpeed|sliderSpeed|slingLoadAssistantShown|soldierMagazines|someAmmo|sort|soundVolume|speaker|speed|speedMode|splitString|sqrt|squadParams|stance|startLoadingScreen|stop|stopEngineRTD|stopped|str|sunOrMoon|supportInfo|suppressFor|surfaceIsWater|surfaceNormal|surfaceType|swimInDepth|switchableUnits|switchAction|switchCamera|switchGesture|switchLight|switchMove|synchronizedObjects|synchronizedTriggers|synchronizedWaypoints|synchronizeObjectsAdd|synchronizeObjectsRemove|synchronizeTrigger|synchronizeWaypoint|systemChat|systemOfUnits|tan|targetKnowledge|targets|targetsAggregate|targetsQuery|taskAlwaysVisible|taskChildren|taskCompleted|taskCustomData|taskDescription|taskDestination|taskHint|taskMarkerOffset|taskNull|taskParent|taskResult|taskState|taskType|teamMember|teamMemberNull|teamName|teams|teamSwitch|teamSwitchEnabled|teamType|terminate|terrainIntersect|terrainIntersectASL|terrainIntersectAtASL|text|textLog|textLogFormat|tg|time|timeMultiplier|titleCut|titleFadeOut|titleObj|titleRsc|titleText|toArray|toFixed|toLower|toString|toUpper|triggerActivated|triggerActivation|triggerArea|triggerAttachedVehicle|triggerAttachObject|triggerAttachVehicle|triggerDynamicSimulation|triggerStatements|triggerText|triggerTimeout|triggerTimeoutCurrent|triggerType|turretLocal|turretOwner|turretUnit|tvAdd|tvClear|tvCollapse|tvCollapseAll|tvCount|tvCurSel|tvData|tvDelete|tvExpand|tvExpandAll|tvPicture|tvPictureRight|tvSetColor|tvSetCurSel|tvSetData|tvSetPicture|tvSetPictureColor|tvSetPictureColorDisabled|tvSetPictureColorSelected|tvSetPictureRight|tvSetPictureRightColor|tvSetPictureRightColorDisabled|tvSetPictureRightColorSelected|tvSetSelectColor|tvSetText|tvSetTooltip|tvSetValue|tvSort|tvSortByValue|tvText|tvTooltip|tvValue|type|typeName|typeOf|UAVControl|uiNamespace|uiSleep|unassignCurator|unassignItem|unassignTeam|unassignVehicle|underwater|uniform|uniformContainer|uniformItems|uniformMagazines|unitAddons|unitAimPosition|unitAimPositionVisual|unitBackpack|unitIsUAV|unitPos|unitReady|unitRecoilCoefficient|units|unitsBelowHeight|unlinkItem|unlockAchievement|unregisterTask|updateDrawIcon|updateMenuItem|updateObjectTree|useAIOperMapObstructionTest|useAISteeringComponent|useAudioTimeForMoves|userInputDisabled|vectorAdd|vectorCos|vectorCrossProduct|vectorDiff|vectorDir|vectorDirVisual|vectorDistance|vectorDistanceSqr|vectorDotProduct|vectorFromTo|vectorMagnitude|vectorMagnitudeSqr|vectorModelToWorld|vectorModelToWorldVisual|vectorMultiply|vectorNormalized|vectorUp|vectorUpVisual|vectorWorldToModel|vectorWorldToModelVisual|vehicle|vehicleCargoEnabled|vehicleChat|vehicleRadio|vehicleReceiveRemoteTargets|vehicleReportOwnPosition|vehicleReportRemoteTargets|vehicles|vehicleVarName|velocity|velocityModelSpace|verifySignature|vest|vestContainer|vestItems|vestMagazines|viewDistance|visibleCompass|visibleGPS|visibleMap|visiblePosition|visiblePositionASL|visibleScoretable|visibleWatch|waitUntil|waves|waypointAttachedObject|waypointAttachedVehicle|waypointAttachObject|waypointAttachVehicle|waypointBehaviour|waypointCombatMode|waypointCompletionRadius|waypointDescription|waypointForceBehaviour|waypointFormation|waypointHousePosition|waypointLoiterRadius|waypointLoiterType|waypointName|waypointPosition|waypoints|waypointScript|waypointsEnabledUAV|waypointShow|waypointSpeed|waypointStatements|waypointTimeout|waypointTimeoutCurrent|waypointType|waypointVisible|weaponAccessories|weaponAccessoriesCargo|weaponCargo|weaponDirection|weaponInertia|weaponLowered|weapons|weaponsItems|weaponsItemsCargo|weaponState|weaponsTurret|weightRTD|west|WFSideText|wind|windDir|windRTD|windStr|wingsForcesRTD|worldName|worldSize|worldToModel|worldToModelVisual|worldToScreen)\b/i,
-        "number": /(?:\$|\b0x)[\da-f]+\b|(?:\B\.\d+|\b\d+(?:\.\d+)?)(?:e[+-]?\d+)?\b/i,
-        "operator": /##|>>|&&|\|\||[!=<>]=?|[-+*/%#^]|\b(?:and|mod|not|or)\b/i,
-        "magic-variable": {
-          pattern: /\b(?:this|thisList|thisTrigger|_exception|_fnc_scriptName|_fnc_scriptNameParent|_forEachIndex|_this|_thisEventHandler|_thisFSM|_thisScript|_x)\b/i,
-          alias: "keyword"
-        },
-        "constant": /\bDIK(?:_[a-z\d]+)+\b/i
-      });
-      Prism.languages.insertBefore("sqf", "string", {
-        "macro": {
-          pattern: /(^[ \t]*)#[a-z](?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,
-          lookbehind: true,
-          greedy: true,
-          alias: "property",
-          inside: {
-            "directive": {
-              pattern: /#[a-z]+\b/i,
-              alias: "keyword"
-            },
-            "comment": Prism.languages.sqf.comment
-          }
-        }
-      });
-      delete Prism.languages.sqf["class-name"];
-      Prism.languages.squirrel = Prism.languages.extend("clike", {
-        "comment": [
-          Prism.languages.clike["comment"][0],
-          {
-            pattern: /(^|[^\\:])(?:\/\/|#).*/,
-            lookbehind: true,
-            greedy: true
-          }
-        ],
-        "string": {
-          pattern: /(^|[^\\"'@])(?:@"(?:[^"]|"")*"(?!")|"(?:[^\\\r\n"]|\\.)*")/,
-          lookbehind: true,
-          greedy: true
-        },
-        "class-name": {
-          pattern: /(\b(?:class|enum|extends|instanceof)\s+)\w+(?:\.\w+)*/,
-          lookbehind: true,
-          inside: {
-            "punctuation": /\./
-          }
-        },
-        "keyword": /\b(?:__FILE__|__LINE__|base|break|case|catch|class|clone|const|constructor|continue|default|delete|else|enum|extends|for|foreach|function|if|in|instanceof|local|null|resume|return|static|switch|this|throw|try|typeof|while|yield)\b/,
-        "number": /\b(?:0x[0-9a-fA-F]+|\d+(?:\.(?:\d+|[eE][+-]?\d+))?)\b/,
-        "operator": /\+\+|--|<=>|<[-<]|>>>?|&&?|\|\|?|[-+*/%!=<>]=?|[~^]|::?/,
-        "punctuation": /[(){}\[\],;.]/
-      });
-      Prism.languages.insertBefore("squirrel", "string", {
-        "char": {
-          pattern: /(^|[^\\"'])'(?:[^\\']|\\(?:[xuU][0-9a-fA-F]{0,8}|[\s\S]))'/,
-          lookbehind: true,
-          greedy: true
-        }
-      });
-      Prism.languages.insertBefore("squirrel", "operator", {
-        "attribute-punctuation": {
-          pattern: /<\/|\/>/,
-          alias: "important"
-        },
-        "lambda": {
-          pattern: /@(?=\()/,
-          alias: "operator"
-        }
-      });
-      (function(Prism2) {
-        var higherOrderFunctions = /\b(?:algebra_solver|algebra_solver_newton|integrate_1d|integrate_ode|integrate_ode_bdf|integrate_ode_rk45|map_rect|ode_(?:adams|bdf|ckrk|rk45)(?:_tol)?|ode_adjoint_tol_ctl|reduce_sum|reduce_sum_static)\b/;
-        Prism2.languages.stan = {
-          "comment": /\/\/.*|\/\*[\s\S]*?\*\/|#(?!include).*/,
-          "string": {
-            // String literals can contain spaces and any printable ASCII characters except for " and \
-            // https://mc-stan.org/docs/2_24/reference-manual/print-statements-section.html#string-literals
-            pattern: /"[\x20\x21\x23-\x5B\x5D-\x7E]*"/,
-            greedy: true
-          },
-          "directive": {
-            pattern: /^([ \t]*)#include\b.*/m,
-            lookbehind: true,
-            alias: "property"
-          },
-          "function-arg": {
-            pattern: RegExp(
-              "(" + higherOrderFunctions.source + /\s*\(\s*/.source + ")" + /[a-zA-Z]\w*/.source
-            ),
-            lookbehind: true,
-            alias: "function"
-          },
-          "constraint": {
-            pattern: /(\b(?:int|matrix|real|row_vector|vector)\s*)<[^<>]*>/,
-            lookbehind: true,
-            inside: {
-              "expression": {
-                pattern: /(=\s*)\S(?:\S|\s+(?!\s))*?(?=\s*(?:>$|,\s*\w+\s*=))/,
-                lookbehind: true,
-                inside: null
-                // see below
-              },
-              "property": /\b[a-z]\w*(?=\s*=)/i,
-              "operator": /=/,
-              "punctuation": /^<|>$|,/
-            }
-          },
-          "keyword": [
-            {
-              pattern: /\bdata(?=\s*\{)|\b(?:functions|generated|model|parameters|quantities|transformed)\b/,
-              alias: "program-block"
-            },
-            /\b(?:array|break|cholesky_factor_corr|cholesky_factor_cov|complex|continue|corr_matrix|cov_matrix|data|else|for|if|in|increment_log_prob|int|matrix|ordered|positive_ordered|print|real|reject|return|row_vector|simplex|target|unit_vector|vector|void|while)\b/,
-            // these are functions that are known to take another function as their first argument.
-            higherOrderFunctions
-          ],
-          "function": /\b[a-z]\w*(?=\s*\()/i,
-          "number": /(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:E[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,
-          "boolean": /\b(?:false|true)\b/,
-          "operator": /<-|\.[*/]=?|\|\|?|&&|[!=<>+\-*/]=?|['^%~?:]/,
-          "punctuation": /[()\[\]{},;]/
-        };
-        Prism2.languages.stan.constraint.inside.expression.inside = Prism2.languages.stan;
-      })(Prism);
-      Prism.languages.stata = {
-        "comment": [
-          {
-            pattern: /(^[ \t]*)\*.*/m,
-            lookbehind: true,
-            greedy: true
-          },
-          {
-            pattern: /(^|\s)\/\/.*|\/\*[\s\S]*?\*\//,
-            lookbehind: true,
-            greedy: true
-          }
-        ],
-        "string-literal": {
-          pattern: /"[^"\r\n]*"|[‘`']".*?"[’`']/,
-          greedy: true,
-          inside: {
-            "interpolation": {
-              pattern: /\$\{[^{}]*\}|[‘`']\w[^’`'\r\n]*[’`']/,
-              inside: {
-                "punctuation": /^\$\{|\}$/,
-                "expression": {
-                  pattern: /[\s\S]+/,
-                  inside: null
-                  // see below
-                }
-              }
-            },
-            "string": /[\s\S]+/
-          }
-        },
-        "mata": {
-          pattern: /(^[ \t]*mata[ \t]*:)[\s\S]+?(?=^end\b)/m,
-          lookbehind: true,
-          greedy: true,
-          alias: "language-mata",
-          inside: Prism.languages.mata
-        },
-        "java": {
-          pattern: /(^[ \t]*java[ \t]*:)[\s\S]+?(?=^end\b)/m,
-          lookbehind: true,
-          greedy: true,
-          alias: "language-java",
-          inside: Prism.languages.java
-        },
-        "python": {
-          pattern: /(^[ \t]*python[ \t]*:)[\s\S]+?(?=^end\b)/m,
-          lookbehind: true,
-          greedy: true,
-          alias: "language-python",
-          inside: Prism.languages.python
-        },
-        "command": {
-          pattern: /(^[ \t]*(?:\.[ \t]+)?(?:(?:bayes|bootstrap|by|bysort|capture|collect|fmm|fp|frame|jackknife|mfp|mi|nestreg|noisily|permute|quietly|rolling|simulate|statsby|stepwise|svy|version|xi)\b[^:\r\n]*:[ \t]*|(?:capture|noisily|quietly|version)[ \t]+)?)[a-zA-Z]\w*/m,
-          lookbehind: true,
-          greedy: true,
-          alias: "keyword"
-        },
-        "variable": /\$\w+|[‘`']\w[^’`'\r\n]*[’`']/,
-        "keyword": /\b(?:bayes|bootstrap|by|bysort|capture|clear|collect|fmm|fp|frame|if|in|jackknife|mi[ \t]+estimate|mfp|nestreg|noisily|of|permute|quietly|rolling|simulate|sort|statsby|stepwise|svy|varlist|version|xi)\b/,
-        "boolean": /\b(?:off|on)\b/,
-        "number": /\b\d+(?:\.\d+)?\b|\B\.\d+/,
-        "function": /\b[a-z_]\w*(?=\()/i,
-        "operator": /\+\+|--|##?|[<>!=~]=?|[+\-*^&|/]/,
-        "punctuation": /[(){}[\],:]/
-      };
-      Prism.languages.stata["string-literal"].inside.interpolation.inside.expression.inside = Prism.languages.stata;
-      Prism.languages.iecst = {
-        "comment": [
-          {
-            pattern: /(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\(\*[\s\S]*?(?:\*\)|$)|\{[\s\S]*?(?:\}|$))/,
-            lookbehind: true,
-            greedy: true
-          },
-          {
-            pattern: /(^|[^\\:])\/\/.*/,
-            lookbehind: true,
-            greedy: true
-          }
-        ],
-        "string": {
-          pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
-          greedy: true
-        },
-        "keyword": [
-          /\b(?:END_)?(?:PROGRAM|CONFIGURATION|INTERFACE|FUNCTION_BLOCK|FUNCTION|ACTION|TRANSITION|TYPE|STRUCT|(?:INITIAL_)?STEP|NAMESPACE|LIBRARY|CHANNEL|FOLDER|RESOURCE|VAR_(?:ACCESS|CONFIG|EXTERNAL|GLOBAL|INPUT|IN_OUT|OUTPUT|TEMP)|VAR|METHOD|PROPERTY)\b/i,
-          /\b(?:AT|BY|(?:END_)?(?:CASE|FOR|IF|REPEAT|WHILE)|CONSTANT|CONTINUE|DO|ELSE|ELSIF|EXIT|EXTENDS|FROM|GET|GOTO|IMPLEMENTS|JMP|NON_RETAIN|OF|PRIVATE|PROTECTED|PUBLIC|RETAIN|RETURN|SET|TASK|THEN|TO|UNTIL|USING|WITH|__CATCH|__ENDTRY|__FINALLY|__TRY)\b/
-        ],
-        "class-name": /\b(?:ANY|ARRAY|BOOL|BYTE|U?(?:D|L|S)?INT|(?:D|L)?WORD|DATE(?:_AND_TIME)?|DT|L?REAL|POINTER|STRING|TIME(?:_OF_DAY)?|TOD)\b/,
-        "address": {
-          pattern: /%[IQM][XBWDL][\d.]*|%[IQ][\d.]*/,
-          alias: "symbol"
-        },
-        "number": /\b(?:16#[\da-f]+|2#[01_]+|0x[\da-f]+)\b|\b(?:D|DT|T|TOD)#[\d_shmd:]*|\b[A-Z]*#[\d.,_]*|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
-        "boolean": /\b(?:FALSE|NULL|TRUE)\b/,
-        "operator": /S?R?:?=>?|&&?|\*\*?|<[=>]?|>=?|[-:^/+#]|\b(?:AND|EQ|EXPT|GE|GT|LE|LT|MOD|NE|NOT|OR|XOR)\b/,
-        "function": /\b[a-z_]\w*(?=\s*\()/i,
-        "punctuation": /[()[\].,;]/
-      };
-      (function(Prism2) {
-        var unit = {
-          pattern: /(\b\d+)(?:%|[a-z]+)/,
-          lookbehind: true
-        };
-        var number = {
-          pattern: /(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,
-          lookbehind: true
-        };
-        var inside = {
-          "comment": {
-            pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
-            lookbehind: true
-          },
-          "url": {
-            pattern: /\burl\((["']?).*?\1\)/i,
-            greedy: true
-          },
-          "string": {
-            pattern: /("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,
-            greedy: true
-          },
-          "interpolation": null,
-          // See below
-          "func": null,
-          // See below
-          "important": /\B!(?:important|optional)\b/i,
-          "keyword": {
-            pattern: /(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,
-            lookbehind: true
-          },
-          "hexcode": /#[\da-f]{3,6}/i,
-          "color": [
-            /\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,
-            {
-              pattern: /\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,
-              inside: {
-                "unit": unit,
-                "number": number,
-                "function": /[\w-]+(?=\()/,
-                "punctuation": /[(),]/
-              }
-            }
-          ],
-          "entity": /\\[\da-f]{1,8}/i,
-          "unit": unit,
-          "boolean": /\b(?:false|true)\b/,
-          "operator": [
-            // We want non-word chars around "-" because it is
-            // accepted in property names.
-            /~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/
-          ],
-          "number": number,
-          "punctuation": /[{}()\[\];:,]/
-        };
-        inside["interpolation"] = {
-          pattern: /\{[^\r\n}:]+\}/,
-          alias: "variable",
-          inside: {
-            "delimiter": {
-              pattern: /^\{|\}$/,
-              alias: "punctuation"
-            },
-            rest: inside
-          }
-        };
-        inside["func"] = {
-          pattern: /[\w-]+\([^)]*\).*/,
-          inside: {
-            "function": /^[^(]+/,
-            rest: inside
-          }
-        };
-        Prism2.languages.stylus = {
-          "atrule-declaration": {
-            pattern: /(^[ \t]*)@.+/m,
-            lookbehind: true,
-            inside: {
-              "atrule": /^@[\w-]+/,
-              rest: inside
-            }
-          },
-          "variable-declaration": {
-            pattern: /(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,
-            lookbehind: true,
-            inside: {
-              "variable": /^\S+/,
-              rest: inside
-            }
-          },
-          "statement": {
-            pattern: /(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,
-            lookbehind: true,
-            inside: {
-              "keyword": /^\S+/,
-              rest: inside
-            }
-          },
-          // A property/value pair cannot end with a comma or a brace
-          // It cannot have indented content unless it ended with a semicolon
-          "property-declaration": {
-            pattern: /((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,
-            lookbehind: true,
-            inside: {
-              "property": {
-                pattern: /^[^\s:]+/,
-                inside: {
-                  "interpolation": inside.interpolation
-                }
-              },
-              rest: inside
-            }
-          },
-          // A selector can contain parentheses only as part of a pseudo-element
-          // It can span multiple lines.
-          // It must end with a comma or an accolade or have indented content.
-          "selector": {
-            pattern: /(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,
-            lookbehind: true,
-            inside: {
-              "interpolation": inside.interpolation,
-              "comment": inside.comment,
-              "punctuation": /[{},]/
-            }
-          },
-          "func": inside.func,
-          "string": inside.string,
-          "comment": {
-            pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
-            lookbehind: true,
-            greedy: true
-          },
-          "interpolation": inside.interpolation,
-          "punctuation": /[{}()\[\];:.]/
-        };
-      })(Prism);
-      Prism.languages.supercollider = {
-        "comment": {
-          pattern: /\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,
-          greedy: true
-        },
-        "string": {
-          pattern: /(^|[^\\])"(?:[^"\\]|\\[\s\S])*"/,
-          lookbehind: true,
-          greedy: true
-        },
-        "char": {
-          pattern: /\$(?:[^\\\r\n]|\\.)/,
-          greedy: true
-        },
-        "symbol": {
-          pattern: /(^|[^\\])'(?:[^'\\]|\\[\s\S])*'|\\\w+/,
-          lookbehind: true,
-          greedy: true
-        },
-        "keyword": /\b(?:_|arg|classvar|const|nil|var|while)\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "label": {
-          pattern: /\b[a-z_]\w*(?=\s*:)/,
-          alias: "property"
-        },
-        "number": /\b(?:inf|pi|0x[0-9a-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?(?:pi)?|\d+r[0-9a-zA-Z]+(?:\.[0-9a-zA-Z]+)?|\d+[sb]{1,4}\d*)\b/,
-        "class-name": /\b[A-Z]\w*\b/,
-        "operator": /\.{2,3}|#(?![[{])|&&|[!=]==?|\+>>|\+{1,3}|-[->]|=>|>>|\?\?|@\|?@|\|(?:@|[!=]=)?\||!\?|<[!=>]|\*{1,2}|<{2,3}\*?|[-!%&/<>?@|=`]/,
-        "punctuation": /[{}()[\].:,;]|#[[{]/
-      };
-      Prism.languages.sclang = Prism.languages.supercollider;
-      Prism.languages.swift = {
-        "comment": {
-          // Nested comments are supported up to 2 levels
-          pattern: /(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,
-          lookbehind: true,
-          greedy: true
-        },
-        "string-literal": [
-          // https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html
-          {
-            pattern: RegExp(
-              /(^|[^"#])/.source + "(?:" + /"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source + "|" + /"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source + ")" + /(?!["#])/.source
-            ),
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "interpolation": {
-                pattern: /(\\\()(?:[^()]|\([^()]*\))*(?=\))/,
-                lookbehind: true,
-                inside: null
-                // see below
-              },
-              "interpolation-punctuation": {
-                pattern: /^\)|\\\($/,
-                alias: "punctuation"
-              },
-              "punctuation": /\\(?=[\r\n])/,
-              "string": /[\s\S]+/
-            }
-          },
-          {
-            pattern: RegExp(
-              /(^|[^"#])(#+)/.source + "(?:" + /"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source + "|" + /"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source + ")\\2"
-            ),
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "interpolation": {
-                pattern: /(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,
-                lookbehind: true,
-                inside: null
-                // see below
-              },
-              "interpolation-punctuation": {
-                pattern: /^\)|\\#+\($/,
-                alias: "punctuation"
-              },
-              "string": /[\s\S]+/
-            }
-          }
-        ],
-        "directive": {
-          // directives with conditions
-          pattern: RegExp(
-            /#/.source + "(?:" + (/(?:elseif|if)\b/.source + "(?:[ 	]*" + /(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source + ")+") + "|" + /(?:else|endif)\b/.source + ")"
-          ),
-          alias: "property",
-          inside: {
-            "directive-name": /^#\w+/,
-            "boolean": /\b(?:false|true)\b/,
-            "number": /\b\d+(?:\.\d+)*\b/,
-            "operator": /!|&&|\|\||[<>]=?/,
-            "punctuation": /[(),]/
-          }
-        },
-        "literal": {
-          pattern: /#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,
-          alias: "constant"
-        },
-        "other-directive": {
-          pattern: /#\w+\b/,
-          alias: "property"
-        },
-        "attribute": {
-          pattern: /@\w+/,
-          alias: "atrule"
-        },
-        "function-definition": {
-          pattern: /(\bfunc\s+)\w+/,
-          lookbehind: true,
-          alias: "function"
-        },
-        "label": {
-          // https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html#ID141
-          pattern: /\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,
-          lookbehind: true,
-          alias: "important"
-        },
-        "keyword": /\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "nil": {
-          pattern: /\bnil\b/,
-          alias: "constant"
-        },
-        "short-argument": /\$\d+\b/,
-        "omit": {
-          pattern: /\b_\b/,
-          alias: "keyword"
-        },
-        "number": /\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,
-        // A class name must start with an upper-case letter and be either 1 letter long or contain a lower-case letter.
-        "class-name": /\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,
-        "function": /\b[a-z_]\w*(?=\s*\()/i,
-        "constant": /\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,
-        // Operators are generic in Swift. Developers can even create new operators (e.g. +++).
-        // https://docs.swift.org/swift-book/ReferenceManual/zzSummaryOfTheGrammar.html#ID481
-        // This regex only supports ASCII operators.
-        "operator": /[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,
-        "punctuation": /[{}[\]();,.:\\]/
-      };
-      Prism.languages.swift["string-literal"].forEach(function(rule) {
-        rule.inside["interpolation"].inside = Prism.languages.swift;
-      });
-      (function(Prism2) {
-        var comment = {
-          pattern: /^[;#].*/m,
-          greedy: true
-        };
-        var quotesSource = /"(?:[^\r\n"\\]|\\(?:[^\r]|\r\n?))*"(?!\S)/.source;
-        Prism2.languages.systemd = {
-          "comment": comment,
-          "section": {
-            pattern: /^\[[^\n\r\[\]]*\](?=[ \t]*$)/m,
-            greedy: true,
-            inside: {
-              "punctuation": /^\[|\]$/,
-              "section-name": {
-                pattern: /[\s\S]+/,
-                alias: "selector"
-              }
-            }
-          },
-          "key": {
-            pattern: /^[^\s=]+(?=[ \t]*=)/m,
-            greedy: true,
-            alias: "attr-name"
-          },
-          "value": {
-            // This pattern is quite complex because of two properties:
-            //  1) Quotes (strings) must be preceded by a space. Since we can't use lookbehinds, we have to "resolve"
-            //     the lookbehind. You will see this in the main loop where spaces are handled separately.
-            //  2) Line continuations.
-            //     After line continuations, empty lines and comments are ignored so we have to consume them.
-            pattern: RegExp(
-              /(=[ \t]*(?!\s))/.source + // the value either starts with quotes or not
-              "(?:" + quotesSource + '|(?=[^"\r\n]))(?:' + (/[^\s\\]/.source + // handle spaces separately because of quotes
-              '|[ 	]+(?:(?![ 	"])|' + quotesSource + ")|" + /\\[\r\n]+(?:[#;].*[\r\n]+)*(?![#;])/.source) + ")*"
-            ),
-            lookbehind: true,
-            greedy: true,
-            alias: "attr-value",
-            inside: {
-              "comment": comment,
-              "quoted": {
-                pattern: RegExp(/(^|\s)/.source + quotesSource),
-                lookbehind: true,
-                greedy: true
-              },
-              "punctuation": /\\$/m,
-              "boolean": {
-                pattern: /^(?:false|no|off|on|true|yes)$/,
-                greedy: true
-              }
-            }
-          },
-          "punctuation": /=/
-        };
-      })(Prism);
-      (function(Prism2) {
-        function createBlock(prefix, inside, contentAlias) {
-          return {
-            pattern: RegExp("<#" + prefix + "[\\s\\S]*?#>"),
-            alias: "block",
-            inside: {
-              "delimiter": {
-                pattern: RegExp("^<#" + prefix + "|#>$"),
-                alias: "important"
-              },
-              "content": {
-                pattern: /[\s\S]+/,
-                inside,
-                alias: contentAlias
-              }
-            }
-          };
-        }
-        function createT4(insideLang) {
-          var grammar = Prism2.languages[insideLang];
-          var className = "language-" + insideLang;
-          return {
-            "block": {
-              pattern: /<#[\s\S]+?#>/,
-              inside: {
-                "directive": createBlock("@", {
-                  "attr-value": {
-                    pattern: /=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,
-                    inside: {
-                      "punctuation": /^=|^["']|["']$/
-                    }
-                  },
-                  "keyword": /\b\w+(?=\s)/,
-                  "attr-name": /\b\w+/
-                }),
-                "expression": createBlock("=", grammar, className),
-                "class-feature": createBlock("\\+", grammar, className),
-                "standard": createBlock("", grammar, className)
-              }
-            }
-          };
-        }
-        Prism2.languages["t4-templating"] = Object.defineProperty({}, "createT4", { value: createT4 });
-      })(Prism);
-      Prism.languages.t4 = Prism.languages["t4-cs"] = Prism.languages["t4-templating"].createT4("csharp");
-      Prism.languages.vbnet = Prism.languages.extend("basic", {
-        "comment": [
-          {
-            pattern: /(?:!|REM\b).+/i,
-            inside: {
-              "keyword": /^REM/i
-            }
-          },
-          {
-            pattern: /(^|[^\\:])'.*/,
-            lookbehind: true,
-            greedy: true
-          }
-        ],
-        "string": {
-          pattern: /(^|[^"])"(?:""|[^"])*"(?!")/,
-          lookbehind: true,
-          greedy: true
-        },
-        "keyword": /(?:\b(?:ADDHANDLER|ADDRESSOF|ALIAS|AND|ANDALSO|AS|BEEP|BLOAD|BOOLEAN|BSAVE|BYREF|BYTE|BYVAL|CALL(?: ABSOLUTE)?|CASE|CATCH|CBOOL|CBYTE|CCHAR|CDATE|CDBL|CDEC|CHAIN|CHAR|CHDIR|CINT|CLASS|CLEAR|CLNG|CLOSE|CLS|COBJ|COM|COMMON|CONST|CONTINUE|CSBYTE|CSHORT|CSNG|CSTR|CTYPE|CUINT|CULNG|CUSHORT|DATA|DATE|DECIMAL|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DEFAULT|DELEGATE|DIM|DIRECTCAST|DO|DOUBLE|ELSE|ELSEIF|END|ENUM|ENVIRON|ERASE|ERROR|EVENT|EXIT|FALSE|FIELD|FILES|FINALLY|FOR(?: EACH)?|FRIEND|FUNCTION|GET|GETTYPE|GETXMLNAMESPACE|GLOBAL|GOSUB|GOTO|HANDLES|IF|IMPLEMENTS|IMPORTS|IN|INHERITS|INPUT|INTEGER|INTERFACE|IOCTL|IS|ISNOT|KEY|KILL|LET|LIB|LIKE|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|ME|MKDIR|MOD|MODULE|MUSTINHERIT|MUSTOVERRIDE|MYBASE|MYCLASS|NAME|NAMESPACE|NARROWING|NEW|NEXT|NOT|NOTHING|NOTINHERITABLE|NOTOVERRIDABLE|OBJECT|OF|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPERATOR|OPTION(?: BASE)?|OPTIONAL|OR|ORELSE|OUT|OVERLOADS|OVERRIDABLE|OVERRIDES|PARAMARRAY|PARTIAL|POKE|PRIVATE|PROPERTY|PROTECTED|PUBLIC|PUT|RAISEEVENT|READ|READONLY|REDIM|REM|REMOVEHANDLER|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SBYTE|SELECT(?: CASE)?|SET|SHADOWS|SHARED|SHELL|SHORT|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|STRUCTURE|SUB|SWAP|SYNCLOCK|SYSTEM|THEN|THROW|TIMER|TO|TROFF|TRON|TRUE|TRY|TRYCAST|TYPE|TYPEOF|UINTEGER|ULONG|UNLOCK|UNTIL|USHORT|USING|VIEW PRINT|WAIT|WEND|WHEN|WHILE|WIDENING|WITH|WITHEVENTS|WRITE|WRITEONLY|XOR)|\B(?:#CONST|#ELSE|#ELSEIF|#END|#IF))(?:\$|\b)/i,
-        "punctuation": /[,;:(){}]/
-      });
-      Prism.languages["t4-vb"] = Prism.languages["t4-templating"].createT4("vbnet");
-      (function(Prism2) {
-        var anchorOrAlias = /[*&][^\s[\]{},]+/;
-        var tag = /!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/;
-        var properties = "(?:" + tag.source + "(?:[ 	]+" + anchorOrAlias.source + ")?|" + anchorOrAlias.source + "(?:[ 	]+" + tag.source + ")?)";
-        var plainKey = /(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g, function() {
-          return /[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source;
-        });
-        var string = /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;
-        function createValuePattern(value, flags) {
-          flags = (flags || "").replace(/m/g, "") + "m";
-          var pattern = /([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g, function() {
-            return properties;
-          }).replace(/<<value>>/g, function() {
-            return value;
-          });
-          return RegExp(pattern, flags);
-        }
-        Prism2.languages.yaml = {
-          "scalar": {
-            pattern: RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g, function() {
-              return properties;
-            })),
-            lookbehind: true,
-            alias: "string"
-          },
-          "comment": /#.*/,
-          "key": {
-            pattern: RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g, function() {
-              return properties;
-            }).replace(/<<key>>/g, function() {
-              return "(?:" + plainKey + "|" + string + ")";
-            })),
-            lookbehind: true,
-            greedy: true,
-            alias: "atrule"
-          },
-          "directive": {
-            pattern: /(^[ \t]*)%.+/m,
-            lookbehind: true,
-            alias: "important"
-          },
-          "datetime": {
-            pattern: createValuePattern(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),
-            lookbehind: true,
-            alias: "number"
-          },
-          "boolean": {
-            pattern: createValuePattern(/false|true/.source, "i"),
-            lookbehind: true,
-            alias: "important"
-          },
-          "null": {
-            pattern: createValuePattern(/null|~/.source, "i"),
-            lookbehind: true,
-            alias: "important"
-          },
-          "string": {
-            pattern: createValuePattern(string),
-            lookbehind: true,
-            greedy: true
-          },
-          "number": {
-            pattern: createValuePattern(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source, "i"),
-            lookbehind: true
-          },
-          "tag": tag,
-          "important": anchorOrAlias,
-          "punctuation": /---|[:[\]{}\-,|>?]|\.\.\./
-        };
-        Prism2.languages.yml = Prism2.languages.yaml;
-      })(Prism);
-      Prism.languages.tap = {
-        "fail": /not ok[^#{\n\r]*/,
-        "pass": /ok[^#{\n\r]*/,
-        "pragma": /pragma [+-][a-z]+/,
-        "bailout": /bail out!.*/i,
-        "version": /TAP version \d+/i,
-        "plan": /\b\d+\.\.\d+(?: +#.*)?/,
-        "subtest": {
-          pattern: /# Subtest(?:: .*)?/,
-          greedy: true
-        },
-        "punctuation": /[{}]/,
-        "directive": /#.*/,
-        "yamlish": {
-          pattern: /(^[ \t]*)---[\s\S]*?[\r\n][ \t]*\.\.\.$/m,
-          lookbehind: true,
-          inside: Prism.languages.yaml,
-          alias: "language-yaml"
-        }
-      };
-      Prism.languages.tcl = {
-        "comment": {
-          pattern: /(^|[^\\])#.*/,
-          lookbehind: true
-        },
-        "string": {
-          pattern: /"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"/,
-          greedy: true
-        },
-        "variable": [
-          {
-            pattern: /(\$)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/,
-            lookbehind: true
-          },
-          {
-            pattern: /(\$)\{[^}]+\}/,
-            lookbehind: true
-          },
-          {
-            pattern: /(^[\t ]*set[ \t]+)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/m,
-            lookbehind: true
-          }
-        ],
-        "function": {
-          pattern: /(^[\t ]*proc[ \t]+)\S+/m,
-          lookbehind: true
-        },
-        "builtin": [
-          {
-            pattern: /(^[\t ]*)(?:break|class|continue|error|eval|exit|for|foreach|if|proc|return|switch|while)\b/m,
-            lookbehind: true
-          },
-          /\b(?:else|elseif)\b/
-        ],
-        "scope": {
-          pattern: /(^[\t ]*)(?:global|upvar|variable)\b/m,
-          lookbehind: true,
-          alias: "constant"
-        },
-        "keyword": {
-          pattern: /(^[\t ]*|\[)(?:Safe_Base|Tcl|after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|scan|seek|set|socket|source|split|string|subst|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|test|vars|wordBreak(?:After|Before))|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\b/m,
-          lookbehind: true
-        },
-        "operator": /!=?|\*\*?|==|&&?|\|\|?|<[=<]?|>[=>]?|[-+~\/%?^]|\b(?:eq|in|ne|ni)\b/,
-        "punctuation": /[{}()\[\]]/
-      };
-      (function(Prism2) {
-        Prism2.languages.tt2 = Prism2.languages.extend("clike", {
-          "comment": /#.*|\[%#[\s\S]*?%\]/,
-          "keyword": /\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|SWITCH|TAGS|THROW|TRY|UNLESS|USE|WHILE|WRAPPER)\b/,
-          "punctuation": /[[\]{},()]/
-        });
-        Prism2.languages.insertBefore("tt2", "number", {
-          "operator": /=[>=]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|not|or)\b/,
-          "variable": {
-            pattern: /\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i
-          }
-        });
-        Prism2.languages.insertBefore("tt2", "keyword", {
-          "delimiter": {
-            pattern: /^(?:\[%|%%)-?|-?%\]$/,
-            alias: "punctuation"
-          }
-        });
-        Prism2.languages.insertBefore("tt2", "string", {
-          "single-quoted-string": {
-            pattern: /'[^\\']*(?:\\[\s\S][^\\']*)*'/,
-            greedy: true,
-            alias: "string"
-          },
-          "double-quoted-string": {
-            pattern: /"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,
-            greedy: true,
-            alias: "string",
-            inside: {
-              "variable": {
-                pattern: /\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i
-              }
-            }
-          }
-        });
-        delete Prism2.languages.tt2.string;
-        Prism2.hooks.add("before-tokenize", function(env) {
-          var tt2Pattern = /\[%[\s\S]+?%\]/g;
-          Prism2.languages["markup-templating"].buildPlaceholders(env, "tt2", tt2Pattern);
-        });
-        Prism2.hooks.add("after-tokenize", function(env) {
-          Prism2.languages["markup-templating"].tokenizePlaceholders(env, "tt2");
-        });
-      })(Prism);
-      (function(Prism2) {
-        var modifierRegex = /\([^|()\n]+\)|\[[^\]\n]+\]|\{[^}\n]+\}/.source;
-        var parenthesesRegex = /\)|\((?![^|()\n]+\))/.source;
-        function withModifier(source, flags) {
-          return RegExp(
-            source.replace(/<MOD>/g, function() {
-              return "(?:" + modifierRegex + ")";
-            }).replace(/<PAR>/g, function() {
-              return "(?:" + parenthesesRegex + ")";
-            }),
-            flags || ""
-          );
-        }
-        var modifierTokens = {
-          "css": {
-            pattern: /\{[^{}]+\}/,
-            inside: {
-              rest: Prism2.languages.css
-            }
-          },
-          "class-id": {
-            pattern: /(\()[^()]+(?=\))/,
-            lookbehind: true,
-            alias: "attr-value"
-          },
-          "lang": {
-            pattern: /(\[)[^\[\]]+(?=\])/,
-            lookbehind: true,
-            alias: "attr-value"
-          },
-          // Anything else is punctuation (the first pattern is for row/col spans inside tables)
-          "punctuation": /[\\\/]\d+|\S/
-        };
-        var textile = Prism2.languages.textile = Prism2.languages.extend("markup", {
-          "phrase": {
-            pattern: /(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,
-            lookbehind: true,
-            inside: {
-              // h1. Header 1
-              "block-tag": {
-                pattern: withModifier(/^[a-z]\w*(?:<MOD>|<PAR>|[<>=])*\./.source),
-                inside: {
-                  "modifier": {
-                    pattern: withModifier(/(^[a-z]\w*)(?:<MOD>|<PAR>|[<>=])+(?=\.)/.source),
-                    lookbehind: true,
-                    inside: modifierTokens
-                  },
-                  "tag": /^[a-z]\w*/,
-                  "punctuation": /\.$/
-                }
-              },
-              // # List item
-              // * List item
-              "list": {
-                pattern: withModifier(/^[*#]+<MOD>*\s+\S.*/.source, "m"),
-                inside: {
-                  "modifier": {
-                    pattern: withModifier(/(^[*#]+)<MOD>+/.source),
-                    lookbehind: true,
-                    inside: modifierTokens
-                  },
-                  "punctuation": /^[*#]+/
-                }
-              },
-              // | cell | cell | cell |
-              "table": {
-                // Modifiers can be applied to the row: {color:red}.|1|2|3|
-                // or the cell: |{color:red}.1|2|3|
-                pattern: withModifier(/^(?:(?:<MOD>|<PAR>|[<>=^~])+\.\s*)?(?:\|(?:(?:<MOD>|<PAR>|[<>=^~_]|[\\/]\d+)+\.|(?!(?:<MOD>|<PAR>|[<>=^~_]|[\\/]\d+)+\.))[^|]*)+\|/.source, "m"),
-                inside: {
-                  "modifier": {
-                    // Modifiers for rows after the first one are
-                    // preceded by a pipe and a line feed
-                    pattern: withModifier(/(^|\|(?:\r?\n|\r)?)(?:<MOD>|<PAR>|[<>=^~_]|[\\/]\d+)+(?=\.)/.source),
-                    lookbehind: true,
-                    inside: modifierTokens
-                  },
-                  "punctuation": /\||^\./
-                }
-              },
-              "inline": {
-                // eslint-disable-next-line regexp/no-super-linear-backtracking
-                pattern: withModifier(/(^|[^a-zA-Z\d])(\*\*|__|\?\?|[*_%@+\-^~])<MOD>*.+?\2(?![a-zA-Z\d])/.source),
-                lookbehind: true,
-                inside: {
-                  // Note: superscripts and subscripts are not handled specifically
-                  // *bold*, **bold**
-                  "bold": {
-                    // eslint-disable-next-line regexp/no-super-linear-backtracking
-                    pattern: withModifier(/(^(\*\*?)<MOD>*).+?(?=\2)/.source),
-                    lookbehind: true
-                  },
-                  // _italic_, __italic__
-                  "italic": {
-                    // eslint-disable-next-line regexp/no-super-linear-backtracking
-                    pattern: withModifier(/(^(__?)<MOD>*).+?(?=\2)/.source),
-                    lookbehind: true
-                  },
-                  // ??cite??
-                  "cite": {
-                    // eslint-disable-next-line regexp/no-super-linear-backtracking
-                    pattern: withModifier(/(^\?\?<MOD>*).+?(?=\?\?)/.source),
-                    lookbehind: true,
-                    alias: "string"
-                  },
-                  // @code@
-                  "code": {
-                    // eslint-disable-next-line regexp/no-super-linear-backtracking
-                    pattern: withModifier(/(^@<MOD>*).+?(?=@)/.source),
-                    lookbehind: true,
-                    alias: "keyword"
-                  },
-                  // +inserted+
-                  "inserted": {
-                    // eslint-disable-next-line regexp/no-super-linear-backtracking
-                    pattern: withModifier(/(^\+<MOD>*).+?(?=\+)/.source),
-                    lookbehind: true
-                  },
-                  // -deleted-
-                  "deleted": {
-                    // eslint-disable-next-line regexp/no-super-linear-backtracking
-                    pattern: withModifier(/(^-<MOD>*).+?(?=-)/.source),
-                    lookbehind: true
-                  },
-                  // %span%
-                  "span": {
-                    // eslint-disable-next-line regexp/no-super-linear-backtracking
-                    pattern: withModifier(/(^%<MOD>*).+?(?=%)/.source),
-                    lookbehind: true
-                  },
-                  "modifier": {
-                    pattern: withModifier(/(^\*\*|__|\?\?|[*_%@+\-^~])<MOD>+/.source),
-                    lookbehind: true,
-                    inside: modifierTokens
-                  },
-                  "punctuation": /[*_%?@+\-^~]+/
-                }
-              },
-              // [alias]http://example.com
-              "link-ref": {
-                pattern: /^\[[^\]]+\]\S+$/m,
-                inside: {
-                  "string": {
-                    pattern: /(^\[)[^\]]+(?=\])/,
-                    lookbehind: true
-                  },
-                  "url": {
-                    pattern: /(^\])\S+$/,
-                    lookbehind: true
-                  },
-                  "punctuation": /[\[\]]/
-                }
-              },
-              // "text":http://example.com
-              // "text":link-ref
-              "link": {
-                // eslint-disable-next-line regexp/no-super-linear-backtracking
-                pattern: withModifier(/"<MOD>*[^"]+":.+?(?=[^\w/]?(?:\s|$))/.source),
-                inside: {
-                  "text": {
-                    // eslint-disable-next-line regexp/no-super-linear-backtracking
-                    pattern: withModifier(/(^"<MOD>*)[^"]+(?=")/.source),
-                    lookbehind: true
-                  },
-                  "modifier": {
-                    pattern: withModifier(/(^")<MOD>+/.source),
-                    lookbehind: true,
-                    inside: modifierTokens
-                  },
-                  "url": {
-                    pattern: /(:).+/,
-                    lookbehind: true
-                  },
-                  "punctuation": /[":]/
-                }
-              },
-              // !image.jpg!
-              // !image.jpg(Title)!:http://example.com
-              "image": {
-                pattern: withModifier(/!(?:<MOD>|<PAR>|[<>=])*(?![<>=])[^!\s()]+(?:\([^)]+\))?!(?::.+?(?=[^\w/]?(?:\s|$)))?/.source),
-                inside: {
-                  "source": {
-                    pattern: withModifier(/(^!(?:<MOD>|<PAR>|[<>=])*)(?![<>=])[^!\s()]+(?:\([^)]+\))?(?=!)/.source),
-                    lookbehind: true,
-                    alias: "url"
-                  },
-                  "modifier": {
-                    pattern: withModifier(/(^!)(?:<MOD>|<PAR>|[<>=])+/.source),
-                    lookbehind: true,
-                    inside: modifierTokens
-                  },
-                  "url": {
-                    pattern: /(:).+/,
-                    lookbehind: true
-                  },
-                  "punctuation": /[!:]/
-                }
-              },
-              // Footnote[1]
-              "footnote": {
-                pattern: /\b\[\d+\]/,
-                alias: "comment",
-                inside: {
-                  "punctuation": /\[|\]/
-                }
-              },
-              // CSS(Cascading Style Sheet)
-              "acronym": {
-                pattern: /\b[A-Z\d]+\([^)]+\)/,
-                inside: {
-                  "comment": {
-                    pattern: /(\()[^()]+(?=\))/,
-                    lookbehind: true
-                  },
-                  "punctuation": /[()]/
-                }
-              },
-              // Prism(C)
-              "mark": {
-                pattern: /\b\((?:C|R|TM)\)/,
-                alias: "comment",
-                inside: {
-                  "punctuation": /[()]/
-                }
-              }
-            }
-          }
-        });
-        var phraseInside = textile["phrase"].inside;
-        var nestedPatterns = {
-          "inline": phraseInside["inline"],
-          "link": phraseInside["link"],
-          "image": phraseInside["image"],
-          "footnote": phraseInside["footnote"],
-          "acronym": phraseInside["acronym"],
-          "mark": phraseInside["mark"]
-        };
-        textile.tag.pattern = /<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;
-        var phraseInlineInside = phraseInside["inline"].inside;
-        phraseInlineInside["bold"].inside = nestedPatterns;
-        phraseInlineInside["italic"].inside = nestedPatterns;
-        phraseInlineInside["inserted"].inside = nestedPatterns;
-        phraseInlineInside["deleted"].inside = nestedPatterns;
-        phraseInlineInside["span"].inside = nestedPatterns;
-        var phraseTableInside = phraseInside["table"].inside;
-        phraseTableInside["inline"] = nestedPatterns["inline"];
-        phraseTableInside["link"] = nestedPatterns["link"];
-        phraseTableInside["image"] = nestedPatterns["image"];
-        phraseTableInside["footnote"] = nestedPatterns["footnote"];
-        phraseTableInside["acronym"] = nestedPatterns["acronym"];
-        phraseTableInside["mark"] = nestedPatterns["mark"];
-      })(Prism);
-      (function(Prism2) {
-        var key = /(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;
-        function insertKey(pattern) {
-          return pattern.replace(/__/g, function() {
-            return key;
-          });
-        }
-        Prism2.languages.toml = {
-          "comment": {
-            pattern: /#.*/,
-            greedy: true
-          },
-          "table": {
-            pattern: RegExp(insertKey(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source), "m"),
-            lookbehind: true,
-            greedy: true,
-            alias: "class-name"
-          },
-          "key": {
-            pattern: RegExp(insertKey(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source), "m"),
-            lookbehind: true,
-            greedy: true,
-            alias: "property"
-          },
-          "string": {
-            pattern: /"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,
-            greedy: true
-          },
-          "date": [
-            {
-              // Offset Date-Time, Local Date-Time, Local Date
-              pattern: /\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,
-              alias: "number"
-            },
-            {
-              // Local Time
-              pattern: /\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,
-              alias: "number"
-            }
-          ],
-          "number": /(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,
-          "boolean": /\b(?:false|true)\b/,
-          "punctuation": /[.,=[\]{}]/
-        };
-      })(Prism);
-      (function(Prism2) {
-        Prism2.languages.tremor = {
-          "comment": {
-            pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,
-            lookbehind: true
-          },
-          "interpolated-string": null,
-          // see below
-          "extractor": {
-            pattern: /\b[a-z_]\w*\|(?:[^\r\n\\|]|\\(?:\r\n|[\s\S]))*\|/i,
-            greedy: true,
-            inside: {
-              "regex": {
-                pattern: /(^re)\|[\s\S]+/,
-                lookbehind: true
-              },
-              "function": /^\w+/,
-              "value": /\|[\s\S]+/
-            }
-          },
-          "identifier": {
-            pattern: /`[^`]*`/,
-            greedy: true
-          },
-          "function": /\b[a-z_]\w*(?=\s*(?:::\s*<|\())\b/,
-          "keyword": /\b(?:args|as|by|case|config|connect|connector|const|copy|create|default|define|deploy|drop|each|emit|end|erase|event|flow|fn|for|from|group|having|insert|into|intrinsic|let|links|match|merge|mod|move|of|operator|patch|pipeline|recur|script|select|set|sliding|state|stream|to|tumbling|update|use|when|where|window|with)\b/,
-          "boolean": /\b(?:false|null|true)\b/i,
-          "number": /\b(?:0b[01_]*|0x[0-9a-fA-F_]*|\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee][+-]?[\d_]+)?)\b/,
-          "pattern-punctuation": {
-            pattern: /%(?=[({[])/,
-            alias: "punctuation"
-          },
-          "operator": /[-+*\/%~!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?>?=?|(?:absent|and|not|or|present|xor)\b/,
-          "punctuation": /::|[;\[\]()\{\},.:]/
-        };
-        var interpolationPattern = /#\{(?:[^"{}]|\{[^{}]*\}|"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*")*\}/.source;
-        Prism2.languages.tremor["interpolated-string"] = {
-          pattern: RegExp(
-            /(^|[^\\])/.source + '(?:"""(?:' + /[^"\\#]|\\[\s\S]|"(?!"")|#(?!\{)/.source + "|" + interpolationPattern + ')*"""|"(?:' + /[^"\\\r\n#]|\\(?:\r\n|[\s\S])|#(?!\{)/.source + "|" + interpolationPattern + ')*")'
-          ),
-          lookbehind: true,
-          greedy: true,
-          inside: {
-            "interpolation": {
-              pattern: RegExp(interpolationPattern),
-              inside: {
-                "punctuation": /^#\{|\}$/,
-                "expression": {
-                  pattern: /[\s\S]+/,
-                  inside: Prism2.languages.tremor
-                }
-              }
-            },
-            "string": /[\s\S]+/
-          }
-        };
-        Prism2.languages.troy = Prism2.languages["tremor"];
-        Prism2.languages.trickle = Prism2.languages["tremor"];
-      })(Prism);
-      Prism.languages.twig = {
-        "comment": /^\{#[\s\S]*?#\}$/,
-        "tag-name": {
-          pattern: /(^\{%-?\s*)\w+/,
-          lookbehind: true,
-          alias: "keyword"
-        },
-        "delimiter": {
-          pattern: /^\{[{%]-?|-?[%}]\}$/,
-          alias: "punctuation"
-        },
-        "string": {
-          pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
-          inside: {
-            "punctuation": /^['"]|['"]$/
-          }
-        },
-        "keyword": /\b(?:even|if|odd)\b/,
-        "boolean": /\b(?:false|null|true)\b/,
-        "number": /\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,
-        "operator": [
-          {
-            pattern: /(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,
-            lookbehind: true
-          },
-          /[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/
-        ],
-        "punctuation": /[()\[\]{}:.,]/
-      };
-      Prism.hooks.add("before-tokenize", function(env) {
-        if (env.language !== "twig") {
-          return;
-        }
-        var pattern = /\{(?:#[\s\S]*?#|%[\s\S]*?%|\{[\s\S]*?\})\}/g;
-        Prism.languages["markup-templating"].buildPlaceholders(env, "twig", pattern);
-      });
-      Prism.hooks.add("after-tokenize", function(env) {
-        Prism.languages["markup-templating"].tokenizePlaceholders(env, "twig");
-      });
-      (function(Prism2) {
-        var keywords = /\b(?:ACT|ACTIFSUB|CARRAY|CASE|CLEARGIF|COA|COA_INT|CONSTANTS|CONTENT|CUR|EDITPANEL|EFFECT|EXT|FILE|FLUIDTEMPLATE|FORM|FRAME|FRAMESET|GIFBUILDER|GMENU|GMENU_FOLDOUT|GMENU_LAYERS|GP|HMENU|HRULER|HTML|IENV|IFSUB|IMAGE|IMGMENU|IMGMENUITEM|IMGTEXT|IMG_RESOURCE|INCLUDE_TYPOSCRIPT|JSMENU|JSMENUITEM|LLL|LOAD_REGISTER|NO|PAGE|RECORDS|RESTORE_REGISTER|TEMPLATE|TEXT|TMENU|TMENUITEM|TMENU_LAYERS|USER|USER_INT|_GIFBUILDER|global|globalString|globalVar)\b/;
-        Prism2.languages.typoscript = {
-          "comment": [
-            {
-              // multiline comments /* */
-              pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
-              lookbehind: true
-            },
-            {
-              // double-slash comments - ignored when backslashes or colon is found in front
-              // also ignored whenever directly after an equal-sign, because it would probably be an url without protocol
-              pattern: /(^|[^\\:= \t]|(?:^|[^= \t])[ \t]+)\/\/.*/,
-              lookbehind: true,
-              greedy: true
-            },
-            {
-              // hash comments - ignored when leading quote is found for hex colors in strings
-              pattern: /(^|[^"'])#.*/,
-              lookbehind: true,
-              greedy: true
-            }
-          ],
-          "function": [
-            {
-              // old include style
-              pattern: /<INCLUDE_TYPOSCRIPT:\s*source\s*=\s*(?:"[^"\r\n]*"|'[^'\r\n]*')\s*>/,
-              inside: {
-                "string": {
-                  pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
-                  inside: {
-                    "keyword": keywords
-                  }
-                },
-                "keyword": {
-                  pattern: /INCLUDE_TYPOSCRIPT/
-                }
-              }
-            },
-            {
-              // new include style
-              pattern: /@import\s*(?:"[^"\r\n]*"|'[^'\r\n]*')/,
-              inside: {
-                "string": /"[^"\r\n]*"|'[^'\r\n]*'/
-              }
-            }
-          ],
-          "string": {
-            pattern: /^([^=]*=[< ]?)(?:(?!\]\n).)*/,
-            lookbehind: true,
-            inside: {
-              "function": /\{\$.*\}/,
-              // constants include
-              "keyword": keywords,
-              "number": /^\d+$/,
-              "punctuation": /[,|:]/
-            }
-          },
-          "keyword": keywords,
-          "number": {
-            // special highlighting for indexes of arrays in tags
-            pattern: /\b\d+\s*[.{=]/,
-            inside: {
-              "operator": /[.{=]/
-            }
-          },
-          "tag": {
-            pattern: /\.?[-\w\\]+\.?/,
-            inside: {
-              "punctuation": /\./
-            }
-          },
-          "punctuation": /[{}[\];(),.:|]/,
-          "operator": /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/
-        };
-        Prism2.languages.tsconfig = Prism2.languages.typoscript;
-      })(Prism);
-      Prism.languages.unrealscript = {
-        "comment": /\/\/.*|\/\*[\s\S]*?\*\//,
-        "string": {
-          pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
-          greedy: true
-        },
-        "category": {
-          pattern: /(\b(?:(?:autoexpand|hide|show)categories|var)\s*\()[^()]+(?=\))/,
-          lookbehind: true,
-          greedy: true,
-          alias: "property"
-        },
-        "metadata": {
-          pattern: /(\w\s*)<\s*\w+\s*=[^<>|=\r\n]+(?:\|\s*\w+\s*=[^<>|=\r\n]+)*>/,
-          lookbehind: true,
-          greedy: true,
-          inside: {
-            "property": /\b\w+(?=\s*=)/,
-            "operator": /=/,
-            "punctuation": /[<>|]/
-          }
-        },
-        "macro": {
-          pattern: /`\w+/,
-          alias: "property"
-        },
-        "class-name": {
-          pattern: /(\b(?:class|enum|extends|interface|state(?:\(\))?|struct|within)\s+)\w+/,
-          lookbehind: true
-        },
-        "keyword": /\b(?:abstract|actor|array|auto|autoexpandcategories|bool|break|byte|case|class|classgroup|client|coerce|collapsecategories|config|const|continue|default|defaultproperties|delegate|dependson|deprecated|do|dontcollapsecategories|editconst|editinlinenew|else|enum|event|exec|export|extends|final|float|for|forcescriptorder|foreach|function|goto|guid|hidecategories|hidedropdown|if|ignores|implements|inherits|input|int|interface|iterator|latent|local|material|name|native|nativereplication|noexport|nontransient|noteditinlinenew|notplaceable|operator|optional|out|pawn|perobjectconfig|perobjectlocalized|placeable|postoperator|preoperator|private|protected|reliable|replication|return|server|showcategories|simulated|singular|state|static|string|struct|structdefault|structdefaultproperties|switch|texture|transient|travel|unreliable|until|var|vector|while|within)\b/,
-        "function": /\b[a-z_]\w*(?=\s*\()/i,
-        "boolean": /\b(?:false|true)\b/,
-        "number": /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
-        // https://docs.unrealengine.com/udk/Three/UnrealScriptExpressions.html
-        "operator": />>|<<|--|\+\+|\*\*|[-+*/~!=<>$@]=?|&&?|\|\|?|\^\^?|[?:%]|\b(?:ClockwiseFrom|Cross|Dot)\b/,
-        "punctuation": /[()[\]{};,.]/
-      };
-      Prism.languages.uc = Prism.languages.uscript = Prism.languages.unrealscript;
-      Prism.languages.uorazor = {
-        "comment-hash": {
-          pattern: /#.*/,
-          alias: "comment",
-          greedy: true
-        },
-        "comment-slash": {
-          pattern: /\/\/.*/,
-          alias: "comment",
-          greedy: true
-        },
-        "string": {
-          pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
-          inside: {
-            "punctuation": /^['"]|['"]$/
-          },
-          greedy: true
-        },
-        "source-layers": {
-          pattern: /\b(?:arms|backpack|blue|bracelet|cancel|clear|cloak|criminal|earrings|enemy|facialhair|friend|friendly|gloves|gray|grey|ground|hair|head|innerlegs|innertorso|innocent|lefthand|middletorso|murderer|neck|nonfriendly|onehandedsecondary|outerlegs|outertorso|pants|red|righthand|ring|self|shirt|shoes|talisman|waist)\b/i,
-          alias: "function"
-        },
-        "source-commands": {
-          pattern: /\b(?:alliance|attack|cast|clearall|clearignore|clearjournal|clearlist|clearsysmsg|createlist|createtimer|dclick|dclicktype|dclickvar|dress|dressconfig|drop|droprelloc|emote|getlabel|guild|gumpclose|gumpresponse|hotkey|ignore|lasttarget|lift|lifttype|menu|menuresponse|msg|org|organize|organizer|overhead|pause|poplist|potion|promptresponse|pushlist|removelist|removetimer|rename|restock|say|scav|scavenger|script|setability|setlasttarget|setskill|settimer|setvar|sysmsg|target|targetloc|targetrelloc|targettype|undress|unignore|unsetvar|useobject|useonce|useskill|usetype|virtue|wait|waitforgump|waitformenu|waitforprompt|waitforstat|waitforsysmsg|waitfortarget|walk|wfsysmsg|wft|whisper|yell)\b/,
-          alias: "function"
-        },
-        "tag-name": {
-          pattern: /(^\{%-?\s*)\w+/,
-          lookbehind: true,
-          alias: "keyword"
-        },
-        "delimiter": {
-          pattern: /^\{[{%]-?|-?[%}]\}$/,
-          alias: "punctuation"
-        },
-        "function": /\b(?:atlist|close|closest|count|counter|counttype|dead|dex|diffhits|diffmana|diffstam|diffweight|find|findbuff|finddebuff|findlayer|findtype|findtypelist|followers|gumpexists|hidden|hits|hp|hue|human|humanoid|ingump|inlist|insysmessage|insysmsg|int|invul|lhandempty|list|listexists|mana|maxhits|maxhp|maxmana|maxstam|maxweight|monster|mounted|name|next|noto|paralyzed|poisoned|position|prev|previous|queued|rand|random|rhandempty|skill|stam|str|targetexists|timer|timerexists|varexist|warmode|weight)\b/,
-        "keyword": /\b(?:and|as|break|continue|else|elseif|endfor|endif|endwhile|for|if|loop|not|or|replay|stop|while)\b/,
-        "boolean": /\b(?:false|null|true)\b/,
-        "number": /\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,
-        "operator": [
-          {
-            pattern: /(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,
-            lookbehind: true
-          },
-          /[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/
-        ],
-        "punctuation": /[()\[\]{}:.,]/
-      };
-      Prism.languages.uri = {
-        "scheme": {
-          pattern: /^[a-z][a-z0-9+.-]*:/im,
-          greedy: true,
-          inside: {
-            "scheme-delimiter": /:$/
-          }
-        },
-        "fragment": {
-          pattern: /#[\w\-.~!$&'()*+,;=%:@/?]*/,
-          inside: {
-            "fragment-delimiter": /^#/
-          }
-        },
-        "query": {
-          pattern: /\?[\w\-.~!$&'()*+,;=%:@/?]*/,
-          inside: {
-            "query-delimiter": {
-              pattern: /^\?/,
-              greedy: true
-            },
-            "pair-delimiter": /[&;]/,
-            "pair": {
-              pattern: /^[^=][\s\S]*/,
-              inside: {
-                "key": /^[^=]+/,
-                "value": {
-                  pattern: /(^=)[\s\S]+/,
-                  lookbehind: true
-                }
-              }
-            }
-          }
-        },
-        "authority": {
-          pattern: RegExp(
-            /^\/\//.source + /(?:[\w\-.~!$&'()*+,;=%:]*@)?/.source + ("(?:" + /\[(?:[0-9a-fA-F:.]{2,48}|v[0-9a-fA-F]+\.[\w\-.~!$&'()*+,;=]+)\]/.source + "|" + /[\w\-.~!$&'()*+,;=%]*/.source + ")") + /(?::\d*)?/.source,
-            "m"
-          ),
-          inside: {
-            "authority-delimiter": /^\/\//,
-            "user-info-segment": {
-              pattern: /^[\w\-.~!$&'()*+,;=%:]*@/,
-              inside: {
-                "user-info-delimiter": /@$/,
-                "user-info": /^[\w\-.~!$&'()*+,;=%:]+/
-              }
-            },
-            "port-segment": {
-              pattern: /:\d*$/,
-              inside: {
-                "port-delimiter": /^:/,
-                "port": /^\d+/
-              }
-            },
-            "host": {
-              pattern: /[\s\S]+/,
-              inside: {
-                "ip-literal": {
-                  pattern: /^\[[\s\S]+\]$/,
-                  inside: {
-                    "ip-literal-delimiter": /^\[|\]$/,
-                    "ipv-future": /^v[\s\S]+/,
-                    "ipv6-address": /^[\s\S]+/
-                  }
-                },
-                "ipv4-address": /^(?:(?:[03-9]\d?|[12]\d{0,2})\.){3}(?:[03-9]\d?|[12]\d{0,2})$/
-              }
-            }
-          }
-        },
-        "path": {
-          pattern: /^[\w\-.~!$&'()*+,;=%:@/]+/m,
-          inside: {
-            "path-separator": /\//
-          }
-        }
-      };
-      Prism.languages.url = Prism.languages.uri;
-      (function(Prism2) {
-        var interpolationExpr = {
-          pattern: /[\s\S]+/,
-          inside: null
-        };
-        Prism2.languages.v = Prism2.languages.extend("clike", {
-          "string": {
-            pattern: /r?(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
-            alias: "quoted-string",
-            greedy: true,
-            inside: {
-              "interpolation": {
-                pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:\{[^{}]*\}|\w+(?:\.\w+(?:\([^\(\)]*\))?|\[[^\[\]]+\])*)/,
-                lookbehind: true,
-                inside: {
-                  "interpolation-variable": {
-                    pattern: /^\$\w[\s\S]*$/,
-                    alias: "variable"
-                  },
-                  "interpolation-punctuation": {
-                    pattern: /^\$\{|\}$/,
-                    alias: "punctuation"
-                  },
-                  "interpolation-expression": interpolationExpr
-                }
-              }
-            }
-          },
-          "class-name": {
-            pattern: /(\b(?:enum|interface|struct|type)\s+)(?:C\.)?\w+/,
-            lookbehind: true
-          },
-          "keyword": /(?:\b(?:__global|as|asm|assert|atomic|break|chan|const|continue|defer|else|embed|enum|fn|for|go(?:to)?|if|import|in|interface|is|lock|match|module|mut|none|or|pub|return|rlock|select|shared|sizeof|static|struct|type(?:of)?|union|unsafe)|\$(?:else|for|if)|#(?:flag|include))\b/,
-          "number": /\b(?:0x[a-f\d]+(?:_[a-f\d]+)*|0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?)\b/i,
-          "operator": /~|\?|[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\.?/,
-          "builtin": /\b(?:any(?:_float|_int)?|bool|byte(?:ptr)?|charptr|f(?:32|64)|i(?:8|16|64|128|nt)|rune|size_t|string|u(?:16|32|64|128)|voidptr)\b/
-        });
-        interpolationExpr.inside = Prism2.languages.v;
-        Prism2.languages.insertBefore("v", "string", {
-          "char": {
-            pattern: /`(?:\\`|\\?[^`]{1,2})`/,
-            // using {1,2} instead of `u` flag for compatibility
-            alias: "rune"
-          }
-        });
-        Prism2.languages.insertBefore("v", "operator", {
-          "attribute": {
-            pattern: /(^[\t ]*)\[(?:deprecated|direct_array_access|flag|inline|live|ref_only|typedef|unsafe_fn|windows_stdcall)\]/m,
-            lookbehind: true,
-            alias: "annotation",
-            inside: {
-              "punctuation": /[\[\]]/,
-              "keyword": /\w+/
-            }
-          },
-          "generic": {
-            pattern: /<\w+>(?=\s*[\)\{])/,
-            inside: {
-              "punctuation": /[<>]/,
-              "class-name": /\w+/
-            }
-          }
-        });
-        Prism2.languages.insertBefore("v", "function", {
-          "generic-function": {
-            // e.g. foo<T>( ...
-            pattern: /\b\w+\s*<\w+>(?=\()/,
-            inside: {
-              "function": /^\w+/,
-              "generic": {
-                pattern: /<\w+>/,
-                inside: Prism2.languages.v.generic.inside
-              }
-            }
-          }
-        });
-      })(Prism);
-      Prism.languages.vala = Prism.languages.extend("clike", {
-        // Classes copied from prism-csharp
-        "class-name": [
-          {
-            // (Foo bar, Bar baz)
-            pattern: /\b[A-Z]\w*(?:\.\w+)*\b(?=(?:\?\s+|\*?\s+\*?)\w)/,
-            inside: {
-              punctuation: /\./
-            }
-          },
-          {
-            // [Foo]
-            pattern: /(\[)[A-Z]\w*(?:\.\w+)*\b/,
-            lookbehind: true,
-            inside: {
-              punctuation: /\./
-            }
-          },
-          {
-            // class Foo : Bar
-            pattern: /(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,
-            lookbehind: true,
-            inside: {
-              punctuation: /\./
-            }
-          },
-          {
-            // class Foo
-            pattern: /((?:\b(?:class|enum|interface|new|struct)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,
-            lookbehind: true,
-            inside: {
-              punctuation: /\./
-            }
-          }
-        ],
-        "keyword": /\b(?:abstract|as|assert|async|base|bool|break|case|catch|char|class|const|construct|continue|default|delegate|delete|do|double|dynamic|else|ensures|enum|errordomain|extern|finally|float|for|foreach|get|if|in|inline|int|int16|int32|int64|int8|interface|internal|is|lock|long|namespace|new|null|out|override|owned|params|private|protected|public|ref|requires|return|set|short|signal|sizeof|size_t|ssize_t|static|string|struct|switch|this|throw|throws|try|typeof|uchar|uint|uint16|uint32|uint64|uint8|ulong|unichar|unowned|ushort|using|value|var|virtual|void|volatile|weak|while|yield)\b/i,
-        "function": /\b\w+(?=\s*\()/,
-        "number": /(?:\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?:f|u?l?)?/i,
-        "operator": /\+\+|--|&&|\|\||<<=?|>>=?|=>|->|~|[+\-*\/%&^|=!<>]=?|\?\??|\.\.\./,
-        "punctuation": /[{}[\];(),.:]/,
-        "constant": /\b[A-Z0-9_]+\b/
-      });
-      Prism.languages.insertBefore("vala", "string", {
-        "raw-string": {
-          pattern: /"""[\s\S]*?"""/,
-          greedy: true,
-          alias: "string"
-        },
-        "template-string": {
-          pattern: /@"[\s\S]*?"/,
-          greedy: true,
-          inside: {
-            "interpolation": {
-              pattern: /\$(?:\([^)]*\)|[a-zA-Z]\w*)/,
-              inside: {
-                "delimiter": {
-                  pattern: /^\$\(?|\)$/,
-                  alias: "punctuation"
-                },
-                rest: Prism.languages.vala
-              }
-            },
-            "string": /[\s\S]+/
-          }
-        }
-      });
-      Prism.languages.insertBefore("vala", "keyword", {
-        "regex": {
-          pattern: /\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[imsx]{0,4}(?=\s*(?:$|[\r\n,.;})\]]))/,
-          greedy: true,
-          inside: {
-            "regex-source": {
-              pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/,
-              lookbehind: true,
-              alias: "language-regex",
-              inside: Prism.languages.regex
-            },
-            "regex-delimiter": /^\//,
-            "regex-flags": /^[a-z]+$/
-          }
-        }
-      });
-      (function(Prism2) {
-        Prism2.languages.velocity = Prism2.languages.extend("markup", {});
-        var velocity = {
-          "variable": {
-            pattern: /(^|[^\\](?:\\\\)*)\$!?(?:[a-z][\w-]*(?:\([^)]*\))?(?:\.[a-z][\w-]*(?:\([^)]*\))?|\[[^\]]+\])*|\{[^}]+\})/i,
-            lookbehind: true,
-            inside: {}
-            // See below
-          },
-          "string": {
-            pattern: /"[^"]*"|'[^']*'/,
-            greedy: true
-          },
-          "number": /\b\d+\b/,
-          "boolean": /\b(?:false|true)\b/,
-          "operator": /[=!<>]=?|[+*/%-]|&&|\|\||\.\.|\b(?:eq|g[et]|l[et]|n(?:e|ot))\b/,
-          "punctuation": /[(){}[\]:,.]/
-        };
-        velocity.variable.inside = {
-          "string": velocity["string"],
-          "function": {
-            pattern: /([^\w-])[a-z][\w-]*(?=\()/,
-            lookbehind: true
-          },
-          "number": velocity["number"],
-          "boolean": velocity["boolean"],
-          "punctuation": velocity["punctuation"]
-        };
-        Prism2.languages.insertBefore("velocity", "comment", {
-          "unparsed": {
-            pattern: /(^|[^\\])#\[\[[\s\S]*?\]\]#/,
-            lookbehind: true,
-            greedy: true,
-            inside: {
-              "punctuation": /^#\[\[|\]\]#$/
-            }
-          },
-          "velocity-comment": [
-            {
-              pattern: /(^|[^\\])#\*[\s\S]*?\*#/,
-              lookbehind: true,
-              greedy: true,
-              alias: "comment"
-            },
-            {
-              pattern: /(^|[^\\])##.*/,
-              lookbehind: true,
-              greedy: true,
-              alias: "comment"
-            }
-          ],
-          "directive": {
-            pattern: /(^|[^\\](?:\\\\)*)#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})(?:\s*\((?:[^()]|\([^()]*\))*\))?/i,
-            lookbehind: true,
-            inside: {
-              "keyword": {
-                pattern: /^#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})|\bin\b/,
-                inside: {
-                  "punctuation": /[{}]/
-                }
-              },
-              rest: velocity
-            }
-          },
-          "variable": velocity["variable"]
-        });
-        Prism2.languages.velocity["tag"].inside["attr-value"].inside.rest = Prism2.languages.velocity;
-      })(Prism);
-      Prism.languages.verilog = {
-        "comment": {
-          pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
-          greedy: true
-        },
-        "string": {
-          pattern: /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
-          greedy: true
-        },
-        "kernel-function": {
-          // support for any kernel function (ex: $display())
-          pattern: /\B\$\w+\b/,
-          alias: "property"
-        },
-        // support for user defined constants (ex: `define)
-        "constant": /\B`\w+\b/,
-        "function": /\b\w+(?=\()/,
-        // support for verilog and system verilog keywords
-        "keyword": /\b(?:alias|and|assert|assign|assume|automatic|before|begin|bind|bins|binsof|bit|break|buf|bufif0|bufif1|byte|case|casex|casez|cell|chandle|class|clocking|cmos|config|const|constraint|context|continue|cover|covergroup|coverpoint|cross|deassign|default|defparam|design|disable|dist|do|edge|else|end|endcase|endclass|endclocking|endconfig|endfunction|endgenerate|endgroup|endinterface|endmodule|endpackage|endprimitive|endprogram|endproperty|endsequence|endspecify|endtable|endtask|enum|event|expect|export|extends|extern|final|first_match|for|force|foreach|forever|fork|forkjoin|function|generate|genvar|highz0|highz1|if|iff|ifnone|ignore_bins|illegal_bins|import|incdir|include|initial|inout|input|inside|instance|int|integer|interface|intersect|join|join_any|join_none|large|liblist|library|local|localparam|logic|longint|macromodule|matches|medium|modport|module|nand|negedge|new|nmos|nor|noshowcancelled|not|notif0|notif1|null|or|output|package|packed|parameter|pmos|posedge|primitive|priority|program|property|protected|pull0|pull1|pulldown|pullup|pulsestyle_ondetect|pulsestyle_onevent|pure|rand|randc|randcase|randsequence|rcmos|real|realtime|ref|reg|release|repeat|return|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|sequence|shortint|shortreal|showcancelled|signed|small|solve|specify|specparam|static|string|strong0|strong1|struct|super|supply0|supply1|table|tagged|task|this|throughout|time|timeprecision|timeunit|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|type|typedef|union|unique|unsigned|use|uwire|var|vectored|virtual|void|wait|wait_order|wand|weak0|weak1|while|wildcard|wire|with|within|wor|xnor|xor)\b/,
-        // bold highlighting for all verilog and system verilog logic blocks
-        "important": /\b(?:always|always_comb|always_ff|always_latch)\b(?: *@)?/,
-        // support for time ticks, vectors, and real numbers
-        "number": /\B##?\d+|(?:\b\d+)?'[odbh] ?[\da-fzx_?]+|\b(?:\d*[._])?\d+(?:e[-+]?\d+)?/i,
-        "operator": /[-+{}^~%*\/?=!<>&|]+/,
-        "punctuation": /[[\];(),.:]/
-      };
-      Prism.languages.vhdl = {
-        "comment": /--.+/,
-        // support for all logic vectors
-        "vhdl-vectors": {
-          "pattern": /\b[oxb]"[\da-f_]+"|"[01uxzwlh-]+"/i,
-          "alias": "number"
-        },
-        // support for operator overloading included
-        "quoted-function": {
-          pattern: /"\S+?"(?=\()/,
-          alias: "function"
-        },
-        "string": /"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/,
-        "attribute": {
-          pattern: /\b'\w+/,
-          alias: "attr-name"
-        },
-        // support for predefined attributes included
-        "keyword": /\b(?:access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|private|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|view|wait|when|while|with)\b/i,
-        "boolean": /\b(?:false|true)\b/i,
-        "function": /\w+(?=\()/,
-        // decimal, based, physical, and exponential numbers supported
-        "number": /'[01uxzwlh-]'|\b(?:\d+#[\da-f_.]+#|\d[\d_.]*)(?:e[-+]?\d+)?/i,
-        "operator": /[<>]=?|:=|[-+*/&=]|\b(?:abs|and|mod|nand|nor|not|or|rem|rol|ror|sla|sll|sra|srl|xnor|xor)\b/i,
-        "punctuation": /[{}[\];(),.:]/
-      };
-      Prism.languages.vim = {
-        "string": /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\r\n]|'')*'/,
-        "comment": /".*/,
-        "function": /\b\w+(?=\()/,
-        "keyword": /\b(?:N|Next|P|Print|X|XMLent|XMLns|ab|abbreviate|abc|abclear|abo|aboveleft|al|all|ar|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|args|argu|argument|as|ascii|b|bN|bNext|ba|bad|badd|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bo|botright|bp|bprevious|br|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|brewind|bro|browse|bufdo|buffer|buffers|bun|bunload|bw|bwipeout|c|cN|cNext|cNfcNfile|ca|cabbrev|cabc|cabclear|cad|caddb|caddbuffer|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cg|cgetb|cgetbuffer|cgete|cgetexpr|cgetfile|change|changes|chd|chdir|che|checkpath|checkt|checktime|cl|cla|clast|clist|clo|close|cmapc|cmapclear|cn|cnew|cnewer|cnext|cnf|cnfile|cnorea|cnoreabbrev|co|col|colder|colo|colorscheme|comc|comclear|comp|compiler|con|conf|confirm|continue|cope|copen|copy|cp|cpf|cpfile|cprevious|cq|cquit|cr|crewind|cu|cuna|cunabbrev|cunmap|cw|cwindow|d|debugg|debuggreedy|delc|delcommand|delete|delf|delfunction|delm|delmarks|di|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|e|earlier|echoe|echoerr|echom|echomsg|echon|edit|el|else|elsei|elseif|em|emenu|en|endf|endfo|endfor|endfun|endfunction|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fin|fina|finally|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|foldd|folddoc|folddoclosed|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|h|ha|hardcopy|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iu|iuna|iunabbrev|iunmap|j|join|ju|jumps|k|kee|keepalt|keepj|keepjumps|keepmarks|l|lN|lNext|lNf|lNfile|la|lad|laddb|laddbuffer|laddexpr|laddf|laddfile|lan|language|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|left|lefta|leftabove|let|lex|lexpr|lf|lfile|lfir|lfirst|lg|lgetb|lgetbuffer|lgete|lgetexpr|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|list|ll|lla|llast|lli|llist|lm|lmak|lmake|lmap|lmapc|lmapclear|ln|lne|lnew|lnewer|lnext|lnf|lnfile|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lp|lpf|lpfile|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|m|ma|mak|make|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkv|mkvie|mkview|mkvimrc|mod|mode|move|mz|mzf|mzfile|mzscheme|n|nbkey|new|next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|o|omapc|omapclear|on|only|open|opt|options|ou|ounmap|p|pc|pclose|pe|ped|pedit|perl|perld|perldo|po|pop|popu|popup|pp|ppop|pre|preserve|prev|previous|print|prof|profd|profdel|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|ptN|ptNext|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|py|pyf|pyfile|python|q|qa|qall|quit|quita|quitall|r|read|rec|recover|red|redi|redir|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|ru|rub|ruby|rubyd|rubydo|rubyf|rubyfile|runtime|rv|rviminfo|sN|sNext|sa|sal|sall|san|sandbox|sargument|sav|saveas|sb|sbN|sbNext|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbp|sbprevious|sbr|sbrewind|sbuffer|scrip|scripte|scriptencoding|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sl|sla|slast|sleep|sm|smagic|smap|smapc|smapclear|sme|smenu|sn|snext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|so|sor|sort|source|sp|spe|spelld|spelldump|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|split|spr|sprevious|sre|srewind|st|sta|stag|star|startg|startgreplace|startinsert|startr|startreplace|stj|stjump|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tN|tNext|ta|tab|tabN|tabNext|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabn|tabnew|tabnext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tmenu|tn|tnext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tunmenu|u|una|unabbreviate|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|ve|verb|verbose|version|vert|vertical|vi|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|w|wN|wNext|wa|wall|wh|while|win|winc|wincmd|windo|winp|winpos|winsize|wn|wnext|wp|wprevious|wq|wqa|wqall|write|ws|wsverb|wv|wviminfo|x|xa|xall|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\b/,
-        "builtin": /\b(?:acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autocmd|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|t_AB|t_AF|t_AL|t_CS|t_CV|t_Ce|t_Co|t_Cs|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_IE|t_IS|t_K1|t_K3|t_K4|t_K5|t_K6|t_K7|t_K8|t_K9|t_KA|t_KB|t_KC|t_KD|t_KE|t_KF|t_KG|t_KH|t_KI|t_KJ|t_KK|t_KL|t_RI|t_RV|t_SI|t_Sb|t_Sf|t_WP|t_WS|t_ZH|t_ZR|t_al|t_bc|t_cd|t_ce|t_cl|t_cm|t_cs|t_da|t_db|t_dl|t_fs|t_k1|t_k2|t_k3|t_k4|t_k5|t_k6|t_k7|t_k8|t_k9|t_kB|t_kD|t_kI|t_kN|t_kP|t_kb|t_kd|t_ke|t_kh|t_kl|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_se|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_xs|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww)\b/,
-        "number": /\b(?:0x[\da-f]+|\d+(?:\.\d+)?)\b/i,
-        "operator": /\|\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\/%?]|\b(?:is(?:not)?)\b/,
-        "punctuation": /[{}[\](),;:]/
-      };
-      Prism.languages["visual-basic"] = {
-        "comment": {
-          pattern: /(?:['‘’]|REM\b)(?:[^\r\n_]|_(?:\r\n?|\n)?)*/i,
-          inside: {
-            "keyword": /^REM/i
-          }
-        },
-        "directive": {
-          pattern: /#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:\b_[ \t]*(?:\r\n?|\n)|.)+/i,
-          alias: "property",
-          greedy: true
-        },
-        "string": {
-          pattern: /\$?["“”](?:["“”]{2}|[^"“”])*["“”]C?/i,
-          greedy: true
-        },
-        "date": {
-          pattern: /#[ \t]*(?:\d+([/-])\d+\1\d+(?:[ \t]+(?:\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?))?|\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?)[ \t]*#/i,
-          alias: "number"
-        },
-        "number": /(?:(?:\b\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?|&[HO][\dA-F]+)(?:[FRD]|U?[ILS])?/i,
-        "boolean": /\b(?:False|Nothing|True)\b/i,
-        "keyword": /\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Until|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Xor)\b/i,
-        "operator": /[+\-*/\\^<=>&#@$%!]|\b_(?=[ \t]*[\r\n])/,
-        "punctuation": /[{}().,:?]/
-      };
-      Prism.languages.vb = Prism.languages["visual-basic"];
-      Prism.languages.vba = Prism.languages["visual-basic"];
-      Prism.languages.warpscript = {
-        "comment": /#.*|\/\/.*|\/\*[\s\S]*?\*\//,
-        "string": {
-          pattern: /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'|<'(?:[^\\']|'(?!>)|\\.)*'>/,
-          greedy: true
-        },
-        "variable": /\$\S+/,
-        "macro": {
-          pattern: /@\S+/,
-          alias: "property"
-        },
-        // WarpScript doesn't have any keywords, these are all functions under the control category
-        // https://www.warp10.io/tags/control
-        "keyword": /\b(?:BREAK|CHECKMACRO|CONTINUE|CUDF|DEFINED|DEFINEDMACRO|EVAL|FAIL|FOR|FOREACH|FORSTEP|IFT|IFTE|MSGFAIL|NRETURN|RETHROW|RETURN|SWITCH|TRY|UDF|UNTIL|WHILE)\b/,
-        "number": /[+-]?\b(?:NaN|Infinity|\d+(?:\.\d*)?(?:[Ee][+-]?\d+)?|0x[\da-fA-F]+|0b[01]+)\b/,
-        "boolean": /\b(?:F|T|false|true)\b/,
-        "punctuation": /<%|%>|[{}[\]()]/,
-        // Some operators from the "operators" category
-        // https://www.warp10.io/tags/operators
-        "operator": /==|&&?|\|\|?|\*\*?|>>>?|<<|[<>!~]=?|[-/%^]|\+!?|\b(?:AND|NOT|OR)\b/
-      };
-      Prism.languages.wasm = {
-        "comment": [
-          /\(;[\s\S]*?;\)/,
-          {
-            pattern: /;;.*/,
-            greedy: true
-          }
-        ],
-        "string": {
-          pattern: /"(?:\\[\s\S]|[^"\\])*"/,
-          greedy: true
-        },
-        "keyword": [
-          {
-            pattern: /\b(?:align|offset)=/,
-            inside: {
-              "operator": /=/
-            }
-          },
-          {
-            pattern: /\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,
-            inside: {
-              "punctuation": /\./
-            }
-          },
-          /\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/
-        ],
-        "variable": /\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,
-        "number": /[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,
-        "punctuation": /[()]/
-      };
-      (function(Prism2) {
-        var id = /(?:\B-|\b_|\b)[A-Za-z][\w-]*(?![\w-])/.source;
-        var type = "(?:" + /\b(?:unsigned\s+)?long\s+long(?![\w-])/.source + "|" + /\b(?:unrestricted|unsigned)\s+[a-z]+(?![\w-])/.source + "|" + /(?!(?:unrestricted|unsigned)\b)/.source + id + /(?:\s*<(?:[^<>]|<[^<>]*>)*>)?/.source + ")" + /(?:\s*\?)?/.source;
-        var typeInside = {};
-        Prism2.languages["web-idl"] = {
-          "comment": {
-            pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
-            greedy: true
-          },
-          "string": {
-            pattern: /"[^"]*"/,
-            greedy: true
-          },
-          "namespace": {
-            pattern: RegExp(/(\bnamespace\s+)/.source + id),
-            lookbehind: true
-          },
-          "class-name": [
-            {
-              pattern: /(^|[^\w-])(?:iterable|maplike|setlike)\s*<(?:[^<>]|<[^<>]*>)*>/,
-              lookbehind: true,
-              inside: typeInside
-            },
-            {
-              pattern: RegExp(/(\b(?:attribute|const|deleter|getter|optional|setter)\s+)/.source + type),
-              lookbehind: true,
-              inside: typeInside
-            },
-            {
-              // callback return type
-              pattern: RegExp("(" + /\bcallback\s+/.source + id + /\s*=\s*/.source + ")" + type),
-              lookbehind: true,
-              inside: typeInside
-            },
-            {
-              // typedef
-              pattern: RegExp(/(\btypedef\b\s*)/.source + type),
-              lookbehind: true,
-              inside: typeInside
-            },
-            {
-              pattern: RegExp(/(\b(?:callback|dictionary|enum|interface(?:\s+mixin)?)\s+)(?!(?:interface|mixin)\b)/.source + id),
-              lookbehind: true
-            },
-            {
-              // inheritance
-              pattern: RegExp(/(:\s*)/.source + id),
-              lookbehind: true
-            },
-            // includes and implements
-            RegExp(id + /(?=\s+(?:implements|includes)\b)/.source),
-            {
-              pattern: RegExp(/(\b(?:implements|includes)\s+)/.source + id),
-              lookbehind: true
-            },
-            {
-              // function return type, parameter types, and dictionary members
-              pattern: RegExp(type + "(?=" + /\s*(?:\.{3}\s*)?/.source + id + /\s*[(),;=]/.source + ")"),
-              inside: typeInside
-            }
-          ],
-          "builtin": /\b(?:ArrayBuffer|BigInt64Array|BigUint64Array|ByteString|DOMString|DataView|Float32Array|Float64Array|FrozenArray|Int16Array|Int32Array|Int8Array|ObservableArray|Promise|USVString|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray)\b/,
-          "keyword": [
-            /\b(?:async|attribute|callback|const|constructor|deleter|dictionary|enum|getter|implements|includes|inherit|interface|mixin|namespace|null|optional|or|partial|readonly|required|setter|static|stringifier|typedef|unrestricted)\b/,
-            // type keywords
-            /\b(?:any|bigint|boolean|byte|double|float|iterable|long|maplike|object|octet|record|sequence|setlike|short|symbol|undefined|unsigned|void)\b/
-          ],
-          "boolean": /\b(?:false|true)\b/,
-          "number": {
-            pattern: /(^|[^\w-])-?(?:0x[0-9a-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|NaN|Infinity)(?![\w-])/i,
-            lookbehind: true
-          },
-          "operator": /\.{3}|[=:?<>-]/,
-          "punctuation": /[(){}[\].,;]/
-        };
-        for (var key in Prism2.languages["web-idl"]) {
-          if (key !== "class-name") {
-            typeInside[key] = Prism2.languages["web-idl"][key];
-          }
-        }
-        Prism2.languages["webidl"] = Prism2.languages["web-idl"];
-      })(Prism);
-      Prism.languages.wgsl = {
-        "comment": {
-          pattern: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
-          greedy: true
-        },
-        "builtin-attribute": {
-          pattern: /(@)builtin\(.*?\)/,
-          lookbehind: true,
-          inside: {
-            "attribute": {
-              pattern: /^builtin/,
-              alias: "attr-name"
-            },
-            "punctuation": /[(),]/,
-            "built-in-values": {
-              pattern: /\b(?:frag_depth|front_facing|global_invocation_id|instance_index|local_invocation_id|local_invocation_index|num_workgroups|position|sample_index|sample_mask|vertex_index|workgroup_id)\b/,
-              alias: "attr-value"
-            }
-          }
-        },
-        "attributes": {
-          pattern: /(@)(?:align|binding|compute|const|fragment|group|id|interpolate|invariant|location|size|vertex|workgroup_size)/i,
-          lookbehind: true,
-          alias: "attr-name"
-        },
-        "functions": {
-          pattern: /\b(fn\s+)[_a-zA-Z]\w*(?=[(<])/,
-          lookbehind: true,
-          alias: "function"
-        },
-        "keyword": /\b(?:bitcast|break|case|const|continue|continuing|default|discard|else|enable|fallthrough|fn|for|function|if|let|loop|private|return|storage|struct|switch|type|uniform|var|while|workgroup)\b/,
-        "builtin": /\b(?:abs|acos|acosh|all|any|array|asin|asinh|atan|atan2|atanh|atomic|atomicAdd|atomicAnd|atomicCompareExchangeWeak|atomicExchange|atomicLoad|atomicMax|atomicMin|atomicOr|atomicStore|atomicSub|atomicXor|bool|ceil|clamp|cos|cosh|countLeadingZeros|countOneBits|countTrailingZeros|cross|degrees|determinant|distance|dot|dpdx|dpdxCoarse|dpdxFine|dpdy|dpdyCoarse|dpdyFine|exp|exp2|extractBits|f32|f64|faceForward|firstLeadingBit|floor|fma|fract|frexp|fwidth|fwidthCoarse|fwidthFine|i32|i64|insertBits|inverseSqrt|ldexp|length|log|log2|mat[2-4]x[2-4]|max|min|mix|modf|normalize|override|pack2x16float|pack2x16snorm|pack2x16unorm|pack4x8snorm|pack4x8unorm|pow|ptr|quantizeToF16|radians|reflect|refract|reverseBits|round|sampler|sampler_comparison|select|shiftLeft|shiftRight|sign|sin|sinh|smoothstep|sqrt|staticAssert|step|storageBarrier|tan|tanh|textureDimensions|textureGather|textureGatherCompare|textureLoad|textureNumLayers|textureNumLevels|textureNumSamples|textureSample|textureSampleBias|textureSampleCompare|textureSampleCompareLevel|textureSampleGrad|textureSampleLevel|textureStore|texture_1d|texture_2d|texture_2d_array|texture_3d|texture_cube|texture_cube_array|texture_depth_2d|texture_depth_2d_array|texture_depth_cube|texture_depth_cube_array|texture_depth_multisampled_2d|texture_multisampled_2d|texture_storage_1d|texture_storage_2d|texture_storage_2d_array|texture_storage_3d|transpose|trunc|u32|u64|unpack2x16float|unpack2x16snorm|unpack2x16unorm|unpack4x8snorm|unpack4x8unorm|vec[2-4]|workgroupBarrier)\b/,
-        "function-calls": {
-          pattern: /\b[_a-z]\w*(?=\()/i,
-          alias: "function"
-        },
-        "class-name": /\b(?:[A-Z][A-Za-z0-9]*)\b/,
-        "bool-literal": {
-          pattern: /\b(?:false|true)\b/,
-          alias: "boolean"
-        },
-        "hex-int-literal": {
-          pattern: /\b0[xX][0-9a-fA-F]+[iu]?\b(?![.pP])/,
-          alias: "number"
-        },
-        "hex-float-literal": {
-          pattern: /\b0[xX][0-9a-fA-F]*(?:\.[0-9a-fA-F]*)?(?:[pP][+-]?\d+[fh]?)?/,
-          alias: "number"
-        },
-        "decimal-float-literal": [
-          { pattern: /\d*\.\d+(?:[eE](?:\+|-)?\d+)?[fh]?/, alias: "number" },
-          { pattern: /\d+\.\d*(?:[eE](?:\+|-)?\d+)?[fh]?/, alias: "number" },
-          { pattern: /\d+[eE](?:\+|-)?\d+[fh]?/, alias: "number" },
-          { pattern: /\b\d+[fh]\b/, alias: "number" }
-        ],
-        "int-literal": {
-          pattern: /\b\d+[iu]?\b/,
-          alias: "number"
-        },
-        "operator": [
-          { pattern: /(?:\^|~|\|(?!\|)|\|\||&&|<<|>>|!)(?!=)/ },
-          { pattern: /&(?![&=])/ },
-          { pattern: /(?:\+=|-=|\*=|\/=|%=|\^=|&=|\|=|<<=|>>=)/ },
-          { pattern: /(^|[^<>=!])=(?![=>])/, lookbehind: true },
-          { pattern: /(?:==|!=|<=|\+\+|--|(^|[^=])>=)/, lookbehind: true },
-          { pattern: /(?:(?:[+%]|(?:\*(?!\w)))(?!=))|(?:-(?!>))|(?:\/(?!\/))/ },
-          { pattern: /->/ }
-        ],
-        "punctuation": /[@(){}[\],;<>:.]/
-      };
-      Prism.languages.wiki = Prism.languages.extend("markup", {
-        "block-comment": {
-          pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
-          lookbehind: true,
-          alias: "comment"
-        },
-        "heading": {
-          pattern: /^(=+)[^=\r\n].*?\1/m,
-          inside: {
-            "punctuation": /^=+|=+$/,
-            "important": /.+/
-          }
-        },
-        "emphasis": {
-          // TODO Multi-line
-          pattern: /('{2,5}).+?\1/,
-          inside: {
-            "bold-italic": {
-              pattern: /(''''').+?(?=\1)/,
-              lookbehind: true,
-              alias: ["bold", "italic"]
-            },
-            "bold": {
-              pattern: /(''')[^'](?:.*?[^'])?(?=\1)/,
-              lookbehind: true
-            },
-            "italic": {
-              pattern: /('')[^'](?:.*?[^'])?(?=\1)/,
-              lookbehind: true
-            },
-            "punctuation": /^''+|''+$/
-          }
-        },
-        "hr": {
-          pattern: /^-{4,}/m,
-          alias: "punctuation"
-        },
-        "url": [
-          /ISBN +(?:97[89][ -]?)?(?:\d[ -]?){9}[\dx]\b|(?:PMID|RFC) +\d+/i,
-          /\[\[.+?\]\]|\[.+?\]/
-        ],
-        "variable": [
-          /__[A-Z]+__/,
-          // FIXME Nested structures should be handled
-          // {{formatnum:{{#expr:{{{3}}}}}}}
-          /\{{3}.+?\}{3}/,
-          /\{\{.+?\}\}/
-        ],
-        "symbol": [
-          /^#redirect/im,
-          /~{3,5}/
-        ],
-        // Handle table attrs:
-        // {|
-        // ! style="text-align:left;"| Item
-        // |}
-        "table-tag": {
-          pattern: /((?:^|[|!])[|!])[^|\r\n]+\|(?!\|)/m,
-          lookbehind: true,
-          inside: {
-            "table-bar": {
-              pattern: /\|$/,
-              alias: "punctuation"
-            },
-            rest: Prism.languages.markup["tag"].inside
-          }
-        },
-        "punctuation": /^(?:\{\||\|\}|\|-|[*#:;!|])|\|\||!!/m
-      });
-      Prism.languages.insertBefore("wiki", "tag", {
-        // Prevent highlighting inside <nowiki>, <source> and <pre> tags
-        "nowiki": {
-          pattern: /<(nowiki|pre|source)\b[^>]*>[\s\S]*?<\/\1>/i,
-          inside: {
-            "tag": {
-              pattern: /<(?:nowiki|pre|source)\b[^>]*>|<\/(?:nowiki|pre|source)>/i,
-              inside: Prism.languages.markup["tag"].inside
-            }
-          }
-        }
-      });
-      Prism.languages.wolfram = {
-        "comment": (
-          // Allow one level of nesting - note: regex taken from applescipt
-          /\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/
-        ),
-        "string": {
-          pattern: /"(?:\\.|[^"\\\r\n])*"/,
-          greedy: true
-        },
-        "keyword": /\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\b/,
-        "context": {
-          pattern: /\b\w+`+\w*/,
-          alias: "class-name"
-        },
-        "blank": {
-          pattern: /\b\w+_\b/,
-          alias: "regex"
-        },
-        "global-variable": {
-          pattern: /\$\w+/,
-          alias: "variable"
-        },
-        "boolean": /\b(?:False|True)\b/,
-        "number": /(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,
-        "operator": /\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,
-        "punctuation": /[{}[\];(),.:]/
-      };
-      Prism.languages.mathematica = Prism.languages.wolfram;
-      Prism.languages.wl = Prism.languages.wolfram;
-      Prism.languages.nb = Prism.languages.wolfram;
-      Prism.languages.wren = {
-        // Multiline comments in Wren can have nested multiline comments
-        // Comments: // and /* */
-        "comment": [
-          {
-            // support 3 levels of nesting
-            // regex: \/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\/
-            pattern: /\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*))*\*\/)*\*\/)*\*\//,
-            greedy: true
-          },
-          {
-            pattern: /(^|[^\\:])\/\/.*/,
-            lookbehind: true,
-            greedy: true
-          }
-        ],
-        // Triple quoted strings are multiline but cannot have interpolation (raw strings)
-        // Based on prism-python.js
-        "triple-quoted-string": {
-          pattern: /"""[\s\S]*?"""/,
-          greedy: true,
-          alias: "string"
-        },
-        // see below
-        "string-literal": null,
-        // #!/usr/bin/env wren on the first line
-        "hashbang": {
-          pattern: /^#!\/.+/,
-          greedy: true,
-          alias: "comment"
-        },
-        // Attributes are special keywords to add meta data to classes
-        "attribute": {
-          // #! attributes are stored in class properties
-          // #!myvar = true
-          // #attributes are not stored and dismissed at compilation
-          pattern: /#!?[ \t\u3000]*\w+/,
-          alias: "keyword"
-        },
-        "class-name": [
-          {
-            // class definition
-            // class Meta {}
-            pattern: /(\bclass\s+)\w+/,
-            lookbehind: true
-          },
-          // A class must always start with an uppercase.
-          // File.read
-          /\b[A-Z][a-z\d_]*\b/
-        ],
-        // A constant can be a variable, class, property or method. Just named in all uppercase letters
-        "constant": /\b[A-Z][A-Z\d_]*\b/,
-        "null": {
-          pattern: /\bnull\b/,
-          alias: "keyword"
-        },
-        "keyword": /\b(?:as|break|class|construct|continue|else|for|foreign|if|import|in|is|return|static|super|this|var|while)\b/,
-        "boolean": /\b(?:false|true)\b/,
-        "number": /\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,
-        // Functions can be Class.method()
-        "function": /\b[a-z_]\w*(?=\s*[({])/i,
-        "operator": /<<|>>|[=!<>]=?|&&|\|\||[-+*/%~^&|?:]|\.{2,3}/,
-        "punctuation": /[\[\](){}.,;]/
-      };
-      Prism.languages.wren["string-literal"] = {
-        // A single quote string is multiline and can have interpolation (similar to JS backticks ``)
-        pattern: /(^|[^\\"])"(?:[^\\"%]|\\[\s\S]|%(?!\()|%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\))*"/,
-        lookbehind: true,
-        greedy: true,
-        inside: {
-          "interpolation": {
-            // "%(interpolation)"
-            pattern: /((?:^|[^\\])(?:\\{2})*)%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\)/,
-            lookbehind: true,
-            inside: {
-              "expression": {
-                pattern: /^(%\()[\s\S]+(?=\)$)/,
-                lookbehind: true,
-                inside: Prism.languages.wren
-              },
-              "interpolation-punctuation": {
-                pattern: /^%\(|\)$/,
-                alias: "punctuation"
-              }
-            }
-          },
-          "string": /[\s\S]+/
-        }
-      };
-      (function(Prism2) {
-        Prism2.languages.xeora = Prism2.languages.extend("markup", {
-          "constant": {
-            pattern: /\$(?:DomainContents|PageRenderDuration)\$/,
-            inside: {
-              "punctuation": {
-                pattern: /\$/
-              }
-            }
-          },
-          "variable": {
-            pattern: /\$@?(?:#+|[-+*~=^])?[\w.]+\$/,
-            inside: {
-              "punctuation": {
-                pattern: /[$.]/
-              },
-              "operator": {
-                pattern: /#+|[-+*~=^@]/
-              }
-            }
-          },
-          "function-inline": {
-            pattern: /\$F:[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\$/,
-            inside: {
-              "variable": {
-                pattern: /(?:[,|])@?(?:#+|[-+*~=^])?[\w.]+/,
-                inside: {
-                  "punctuation": {
-                    pattern: /[,.|]/
-                  },
-                  "operator": {
-                    pattern: /#+|[-+*~=^@]/
-                  }
-                }
-              },
-              "punctuation": {
-                pattern: /\$\w:|[$:?.,|]/
-              }
-            },
-            alias: "function"
-          },
-          "function-block": {
-            pattern: /\$XF:\{[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\}:XF\$/,
-            inside: {
-              "punctuation": {
-                pattern: /[$:{}?.,|]/
-              }
-            },
-            alias: "function"
-          },
-          "directive-inline": {
-            pattern: /\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\/\w.]+\$/,
-            inside: {
-              "punctuation": {
-                pattern: /\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,
-                inside: {
-                  "tag": {
-                    pattern: /#\d/
-                  }
-                }
-              }
-            },
-            alias: "function"
-          },
-          "directive-block-open": {
-            pattern: /\$\w+:\{|\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\w.]+:\{(?:![A-Z]+)?/,
-            inside: {
-              "punctuation": {
-                pattern: /\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,
-                inside: {
-                  "tag": {
-                    pattern: /#\d/
-                  }
-                }
-              },
-              "attribute": {
-                pattern: /![A-Z]+$/,
-                inside: {
-                  "punctuation": {
-                    pattern: /!/
-                  }
-                },
-                alias: "keyword"
-              }
-            },
-            alias: "function"
-          },
-          "directive-block-separator": {
-            pattern: /\}:[-\w.]+:\{/,
-            inside: {
-              "punctuation": {
-                pattern: /[:{}]/
-              }
-            },
-            alias: "function"
-          },
-          "directive-block-close": {
-            pattern: /\}:[-\w.]+\$/,
-            inside: {
-              "punctuation": {
-                pattern: /[:{}$]/
-              }
-            },
-            alias: "function"
-          }
-        });
-        Prism2.languages.insertBefore("inside", "punctuation", {
-          "variable": Prism2.languages.xeora["function-inline"].inside["variable"]
-        }, Prism2.languages.xeora["function-block"]);
-        Prism2.languages.xeoracube = Prism2.languages.xeora;
-      })(Prism);
-      (function(Prism2) {
-        function insertDocComment(lang, docComment) {
-          if (Prism2.languages[lang]) {
-            Prism2.languages.insertBefore(lang, "comment", {
-              "doc-comment": docComment
-            });
-          }
-        }
-        var tag = Prism2.languages.markup.tag;
-        var slashDocComment = {
-          pattern: /\/\/\/.*/,
-          greedy: true,
-          alias: "comment",
-          inside: {
-            "tag": tag
-          }
-        };
-        var tickDocComment = {
-          pattern: /'''.*/,
-          greedy: true,
-          alias: "comment",
-          inside: {
-            "tag": tag
-          }
-        };
-        insertDocComment("csharp", slashDocComment);
-        insertDocComment("fsharp", slashDocComment);
-        insertDocComment("vbnet", tickDocComment);
-      })(Prism);
-      Prism.languages.xojo = {
-        "comment": {
-          pattern: /(?:'|\/\/|Rem\b).+/i,
-          greedy: true
-        },
-        "string": {
-          pattern: /"(?:""|[^"])*"/,
-          greedy: true
-        },
-        "number": [
-          /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
-          /&[bchou][a-z\d]+/i
-        ],
-        "directive": {
-          pattern: /#(?:Else|ElseIf|Endif|If|Pragma)\b/i,
-          alias: "property"
-        },
-        "keyword": /\b(?:AddHandler|App|Array|As(?:signs)?|Auto|Boolean|Break|By(?:Ref|Val)|Byte|Call|Case|Catch|CFStringRef|CGFloat|Class|Color|Const|Continue|CString|Currency|CurrentMethodName|Declare|Delegate|Dim|Do(?:uble|wnTo)?|Each|Else(?:If)?|End|Enumeration|Event|Exception|Exit|Extends|False|Finally|For|Function|Get|GetTypeInfo|Global|GOTO|If|Implements|In|Inherits|Int(?:8|16|32|64|eger|erface)?|Lib|Loop|Me|Module|Next|Nil|Object|Optional|OSType|ParamArray|Private|Property|Protected|PString|Ptr|Raise(?:Event)?|ReDim|RemoveHandler|Return|Select(?:or)?|Self|Set|Shared|Short|Single|Soft|Static|Step|String|Sub|Super|Text|Then|To|True|Try|Ubound|UInt(?:8|16|32|64|eger)?|Until|Using|Var(?:iant)?|Wend|While|WindowPtr|WString)\b/i,
-        "operator": /<[=>]?|>=?|[+\-*\/\\^=]|\b(?:AddressOf|And|Ctype|IsA?|Mod|New|Not|Or|WeakAddressOf|Xor)\b/i,
-        "punctuation": /[.,;:()]/
-      };
-      (function(Prism2) {
-        Prism2.languages.xquery = Prism2.languages.extend("markup", {
-          "xquery-comment": {
-            pattern: /\(:[\s\S]*?:\)/,
-            greedy: true,
-            alias: "comment"
-          },
-          "string": {
-            pattern: /(["'])(?:\1\1|(?!\1)[\s\S])*\1/,
-            greedy: true
-          },
-          "extension": {
-            pattern: /\(#.+?#\)/,
-            alias: "symbol"
-          },
-          "variable": /\$[-\w:]+/,
-          "axis": {
-            pattern: /(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,
-            lookbehind: true,
-            alias: "operator"
-          },
-          "keyword-operator": {
-            pattern: /(^|[^:-])\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\b(?=$|[^:-])/,
-            lookbehind: true,
-            alias: "operator"
-          },
-          "keyword": {
-            pattern: /(^|[^:-])\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\b(?=$|[^:-])/,
-            lookbehind: true
-          },
-          "function": /[\w-]+(?::[\w-]+)*(?=\s*\()/,
-          "xquery-element": {
-            pattern: /(element\s+)[\w-]+(?::[\w-]+)*/,
-            lookbehind: true,
-            alias: "tag"
-          },
-          "xquery-attribute": {
-            pattern: /(attribute\s+)[\w-]+(?::[\w-]+)*/,
-            lookbehind: true,
-            alias: "attr-name"
-          },
-          "builtin": {
-            pattern: /(^|[^:-])\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:ENTITIES|ENTITY|ID|IDREFS?|NCName|NMTOKENS?|NOTATION|Name|QName|anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|int|integer|language|long|negativeInteger|nonNegativeInteger|nonPositiveInteger|normalizedString|positiveInteger|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\b(?=$|[^:-])/,
-            lookbehind: true
-          },
-          "number": /\b\d+(?:\.\d+)?(?:E[+-]?\d+)?/,
-          "operator": [
-            /[+*=?|@]|\.\.?|:=|!=|<[=<]?|>[=>]?/,
-            {
-              pattern: /(\s)-(?=\s)/,
-              lookbehind: true
-            }
-          ],
-          "punctuation": /[[\](){},;:/]/
-        });
-        Prism2.languages.xquery.tag.pattern = /<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/;
-        Prism2.languages.xquery["tag"].inside["attr-value"].pattern = /=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/;
-        Prism2.languages.xquery["tag"].inside["attr-value"].inside["punctuation"] = /^="|"$/;
-        Prism2.languages.xquery["tag"].inside["attr-value"].inside["expression"] = {
-          // Allow for two levels of nesting
-          pattern: /\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,
-          inside: Prism2.languages.xquery,
-          alias: "language-xquery"
-        };
-        var stringifyToken = function(token) {
-          if (typeof token === "string") {
-            return token;
-          }
-          if (typeof token.content === "string") {
-            return token.content;
-          }
-          return token.content.map(stringifyToken).join("");
-        };
-        var walkTokens = function(tokens) {
-          var openedTags = [];
-          for (var i = 0; i < tokens.length; i++) {
-            var token = tokens[i];
-            var notTagNorBrace = false;
-            if (typeof token !== "string") {
-              if (token.type === "tag" && token.content[0] && token.content[0].type === "tag") {
-                if (token.content[0].content[0].content === "</") {
-                  if (openedTags.length > 0 && openedTags[openedTags.length - 1].tagName === stringifyToken(token.content[0].content[1])) {
-                    openedTags.pop();
-                  }
-                } else {
-                  if (token.content[token.content.length - 1].content === "/>") {
-                  } else {
-                    openedTags.push({
-                      tagName: stringifyToken(token.content[0].content[1]),
-                      openedBraces: 0
-                    });
-                  }
-                }
-              } else if (openedTags.length > 0 && token.type === "punctuation" && token.content === "{" && // Ignore `{{`
-              (!tokens[i + 1] || tokens[i + 1].type !== "punctuation" || tokens[i + 1].content !== "{") && (!tokens[i - 1] || tokens[i - 1].type !== "plain-text" || tokens[i - 1].content !== "{")) {
-                openedTags[openedTags.length - 1].openedBraces++;
-              } else if (openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces > 0 && token.type === "punctuation" && token.content === "}") {
-                openedTags[openedTags.length - 1].openedBraces--;
-              } else if (token.type !== "comment") {
-                notTagNorBrace = true;
-              }
-            }
-            if (notTagNorBrace || typeof token === "string") {
-              if (openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces === 0) {
-                var plainText = stringifyToken(token);
-                if (i < tokens.length - 1 && (typeof tokens[i + 1] === "string" || tokens[i + 1].type === "plain-text")) {
-                  plainText += stringifyToken(tokens[i + 1]);
-                  tokens.splice(i + 1, 1);
-                }
-                if (i > 0 && (typeof tokens[i - 1] === "string" || tokens[i - 1].type === "plain-text")) {
-                  plainText = stringifyToken(tokens[i - 1]) + plainText;
-                  tokens.splice(i - 1, 1);
-                  i--;
-                }
-                if (/^\s+$/.test(plainText)) {
-                  tokens[i] = plainText;
-                } else {
-                  tokens[i] = new Prism2.Token("plain-text", plainText, null, plainText);
-                }
-              }
-            }
-            if (token.content && typeof token.content !== "string") {
-              walkTokens(token.content);
-            }
-          }
-        };
-        Prism2.hooks.add("after-tokenize", function(env) {
-          if (env.language !== "xquery") {
-            return;
-          }
-          walkTokens(env.tokens);
-        });
-      })(Prism);
-      Prism.languages.yang = {
-        // https://tools.ietf.org/html/rfc6020#page-34
-        // http://www.yang-central.org/twiki/bin/view/Main/YangExamples
-        "comment": /\/\*[\s\S]*?\*\/|\/\/.*/,
-        "string": {
-          pattern: /"(?:[^\\"]|\\.)*"|'[^']*'/,
-          greedy: true
-        },
-        "keyword": {
-          pattern: /(^|[{};\r\n][ \t]*)[a-z_][\w.-]*/i,
-          lookbehind: true
-        },
-        "namespace": {
-          pattern: /(\s)[a-z_][\w.-]*(?=:)/i,
-          lookbehind: true
-        },
-        "boolean": /\b(?:false|true)\b/,
-        "operator": /\+/,
-        "punctuation": /[{};:]/
-      };
-      (function(Prism2) {
-        function literal(str) {
-          return function() {
-            return str;
-          };
-        }
-        var keyword = /\b(?:align|allowzero|and|anyframe|anytype|asm|async|await|break|cancel|catch|comptime|const|continue|defer|else|enum|errdefer|error|export|extern|fn|for|if|inline|linksection|nakedcc|noalias|nosuspend|null|or|orelse|packed|promise|pub|resume|return|stdcallcc|struct|suspend|switch|test|threadlocal|try|undefined|union|unreachable|usingnamespace|var|volatile|while)\b/;
-        var IDENTIFIER = "\\b(?!" + keyword.source + ")(?!\\d)\\w+\\b";
-        var ALIGN = /align\s*\((?:[^()]|\([^()]*\))*\)/.source;
-        var PREFIX_TYPE_OP = /(?:\?|\bpromise->|(?:\[[^[\]]*\]|\*(?!\*)|\*\*)(?:\s*<ALIGN>|\s*const\b|\s*volatile\b|\s*allowzero\b)*)/.source.replace(/<ALIGN>/g, literal(ALIGN));
-        var SUFFIX_EXPR = /(?:\bpromise\b|(?:\berror\.)?<ID>(?:\.<ID>)*(?!\s+<ID>))/.source.replace(/<ID>/g, literal(IDENTIFIER));
-        var TYPE = "(?!\\s)(?:!?\\s*(?:" + PREFIX_TYPE_OP + "\\s*)*" + SUFFIX_EXPR + ")+";
-        Prism2.languages.zig = {
-          "comment": [
-            {
-              pattern: /\/\/[/!].*/,
-              alias: "doc-comment"
-            },
-            /\/{2}.*/
-          ],
-          "string": [
-            {
-              // "string" and c"string"
-              pattern: /(^|[^\\@])c?"(?:[^"\\\r\n]|\\.)*"/,
-              lookbehind: true,
-              greedy: true
-            },
-            {
-              // multiline strings and c-strings
-              pattern: /([\r\n])([ \t]+c?\\{2}).*(?:(?:\r\n?|\n)\2.*)*/,
-              lookbehind: true,
-              greedy: true
-            }
-          ],
-          "char": {
-            // characters 'a', '\n', '\xFF', '\u{10FFFF}'
-            pattern: /(^|[^\\])'(?:[^'\\\r\n]|[\uD800-\uDFFF]{2}|\\(?:.|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'/,
-            lookbehind: true,
-            greedy: true
-          },
-          "builtin": /\B@(?!\d)\w+(?=\s*\()/,
-          "label": {
-            pattern: /(\b(?:break|continue)\s*:\s*)\w+\b|\b(?!\d)\w+\b(?=\s*:\s*(?:\{|while\b))/,
-            lookbehind: true
-          },
-          "class-name": [
-            // const Foo = struct {};
-            /\b(?!\d)\w+(?=\s*=\s*(?:(?:extern|packed)\s+)?(?:enum|struct|union)\s*[({])/,
-            {
-              // const x: i32 = 9;
-              // var x: Bar;
-              // fn foo(x: bool, y: f32) void {}
-              pattern: RegExp(/(:\s*)<TYPE>(?=\s*(?:<ALIGN>\s*)?[=;,)])|<TYPE>(?=\s*(?:<ALIGN>\s*)?\{)/.source.replace(/<TYPE>/g, literal(TYPE)).replace(/<ALIGN>/g, literal(ALIGN))),
-              lookbehind: true,
-              inside: null
-              // see below
-            },
-            {
-              // extern fn foo(x: f64) f64; (optional alignment)
-              pattern: RegExp(/(\)\s*)<TYPE>(?=\s*(?:<ALIGN>\s*)?;)/.source.replace(/<TYPE>/g, literal(TYPE)).replace(/<ALIGN>/g, literal(ALIGN))),
-              lookbehind: true,
-              inside: null
-              // see below
-            }
-          ],
-          "builtin-type": {
-            pattern: /\b(?:anyerror|bool|c_u?(?:int|long|longlong|short)|c_longdouble|c_void|comptime_(?:float|int)|f(?:16|32|64|128)|[iu](?:8|16|32|64|128|size)|noreturn|type|void)\b/,
-            alias: "keyword"
-          },
-          "keyword": keyword,
-          "function": /\b(?!\d)\w+(?=\s*\()/,
-          "number": /\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\d]+(?:\.[a-fA-F\d]*)?(?:[pP][+-]?[a-fA-F\d]+)?|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)\b/,
-          "boolean": /\b(?:false|true)\b/,
-          "operator": /\.[*?]|\.{2,3}|[-=]>|\*\*|\+\+|\|\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,
-          "punctuation": /[.:,;(){}[\]]/
-        };
-        Prism2.languages.zig["class-name"].forEach(function(obj) {
-          if (obj.inside === null) {
-            obj.inside = Prism2.languages.zig;
-          }
-        });
-      })(Prism);
-      (function() {
-        if (typeof Prism === "undefined" || typeof document === "undefined") {
-          return;
-        }
-        var PLUGIN_NAME = "line-numbers";
-        var NEW_LINE_EXP = /\n(?!$)/g;
-        var config = Prism.plugins.lineNumbers = {
-          /**
-           * Get node for provided line number
-           *
-           * @param {Element} element pre element
-           * @param {number} number line number
-           * @returns {Element|undefined}
-           */
-          getLine: function(element, number) {
-            if (element.tagName !== "PRE" || !element.classList.contains(PLUGIN_NAME)) {
-              return;
-            }
-            var lineNumberRows = element.querySelector(".line-numbers-rows");
-            if (!lineNumberRows) {
-              return;
-            }
-            var lineNumberStart = parseInt(element.getAttribute("data-start"), 10) || 1;
-            var lineNumberEnd = lineNumberStart + (lineNumberRows.children.length - 1);
-            if (number < lineNumberStart) {
-              number = lineNumberStart;
-            }
-            if (number > lineNumberEnd) {
-              number = lineNumberEnd;
-            }
-            var lineIndex = number - lineNumberStart;
-            return lineNumberRows.children[lineIndex];
-          },
-          /**
-           * Resizes the line numbers of the given element.
-           *
-           * This function will not add line numbers. It will only resize existing ones.
-           *
-           * @param {HTMLElement} element A `<pre>` element with line numbers.
-           * @returns {void}
-           */
-          resize: function(element) {
-            resizeElements([element]);
-          },
-          /**
-           * Whether the plugin can assume that the units font sizes and margins are not depended on the size of
-           * the current viewport.
-           *
-           * Setting this to `true` will allow the plugin to do certain optimizations for better performance.
-           *
-           * Set this to `false` if you use any of the following CSS units: `vh`, `vw`, `vmin`, `vmax`.
-           *
-           * @type {boolean}
-           */
-          assumeViewportIndependence: true
-        };
-        function resizeElements(elements) {
-          elements = elements.filter(function(e) {
-            var codeStyles = getStyles(e);
-            var whiteSpace = codeStyles["white-space"];
-            return whiteSpace === "pre-wrap" || whiteSpace === "pre-line";
-          });
-          if (elements.length == 0) {
-            return;
-          }
-          var infos = elements.map(function(element) {
-            var codeElement = element.querySelector("code");
-            var lineNumbersWrapper = element.querySelector(".line-numbers-rows");
-            if (!codeElement || !lineNumbersWrapper) {
-              return void 0;
-            }
-            var lineNumberSizer = element.querySelector(".line-numbers-sizer");
-            var codeLines = codeElement.textContent.split(NEW_LINE_EXP);
-            if (!lineNumberSizer) {
-              lineNumberSizer = document.createElement("span");
-              lineNumberSizer.className = "line-numbers-sizer";
-              codeElement.appendChild(lineNumberSizer);
-            }
-            lineNumberSizer.innerHTML = "0";
-            lineNumberSizer.style.display = "block";
-            var oneLinerHeight = lineNumberSizer.getBoundingClientRect().height;
-            lineNumberSizer.innerHTML = "";
-            return {
-              element,
-              lines: codeLines,
-              lineHeights: [],
-              oneLinerHeight,
-              sizer: lineNumberSizer
-            };
-          }).filter(Boolean);
-          infos.forEach(function(info) {
-            var lineNumberSizer = info.sizer;
-            var lines = info.lines;
-            var lineHeights = info.lineHeights;
-            var oneLinerHeight = info.oneLinerHeight;
-            lineHeights[lines.length - 1] = void 0;
-            lines.forEach(function(line, index) {
-              if (line && line.length > 1) {
-                var e = lineNumberSizer.appendChild(document.createElement("span"));
-                e.style.display = "block";
-                e.textContent = line;
-              } else {
-                lineHeights[index] = oneLinerHeight;
-              }
-            });
-          });
-          infos.forEach(function(info) {
-            var lineNumberSizer = info.sizer;
-            var lineHeights = info.lineHeights;
-            var childIndex = 0;
-            for (var i = 0; i < lineHeights.length; i++) {
-              if (lineHeights[i] === void 0) {
-                lineHeights[i] = lineNumberSizer.children[childIndex++].getBoundingClientRect().height;
-              }
-            }
-          });
-          infos.forEach(function(info) {
-            var lineNumberSizer = info.sizer;
-            var wrapper = info.element.querySelector(".line-numbers-rows");
-            lineNumberSizer.style.display = "none";
-            lineNumberSizer.innerHTML = "";
-            info.lineHeights.forEach(function(height, lineNumber) {
-              wrapper.children[lineNumber].style.height = height + "px";
-            });
-          });
-        }
-        function getStyles(element) {
-          if (!element) {
-            return null;
-          }
-          return window.getComputedStyle ? getComputedStyle(element) : element.currentStyle || null;
-        }
-        var lastWidth = void 0;
-        window.addEventListener("resize", function() {
-          if (config.assumeViewportIndependence && lastWidth === window.innerWidth) {
-            return;
-          }
-          lastWidth = window.innerWidth;
-          resizeElements(Array.prototype.slice.call(document.querySelectorAll("pre." + PLUGIN_NAME)));
-        });
-        Prism.hooks.add("complete", function(env) {
-          if (!env.code) {
-            return;
-          }
-          var code = (
-            /** @type {Element} */
-            env.element
-          );
-          var pre = (
-            /** @type {HTMLElement} */
-            code.parentNode
-          );
-          if (!pre || !/pre/i.test(pre.nodeName)) {
-            return;
-          }
-          if (code.querySelector(".line-numbers-rows")) {
-            return;
-          }
-          if (!Prism.util.isActive(code, PLUGIN_NAME)) {
-            return;
-          }
-          code.classList.remove(PLUGIN_NAME);
-          pre.classList.add(PLUGIN_NAME);
-          var match = env.code.match(NEW_LINE_EXP);
-          var linesNum = match ? match.length + 1 : 1;
-          var lineNumbersWrapper;
-          var lines = new Array(linesNum + 1).join("<span></span>");
-          lineNumbersWrapper = document.createElement("span");
-          lineNumbersWrapper.setAttribute("aria-hidden", "true");
-          lineNumbersWrapper.className = "line-numbers-rows";
-          lineNumbersWrapper.innerHTML = lines;
-          if (pre.hasAttribute("data-start")) {
-            pre.style.counterReset = "linenumber " + (parseInt(pre.getAttribute("data-start"), 10) - 1);
-          }
-          env.element.appendChild(lineNumbersWrapper);
-          resizeElements([pre]);
-          Prism.hooks.run("line-numbers", env);
-        });
-        Prism.hooks.add("line-numbers", function(env) {
-          env.plugins = env.plugins || {};
-          env.plugins.lineNumbers = true;
-        });
-      })();
-      (function() {
-        if (typeof Prism === "undefined" || typeof document === "undefined") {
-          return;
-        }
-        if (!Element.prototype.matches) {
-          Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
-        }
-        var LOADING_MESSAGE = "Loading\u2026";
-        var FAILURE_MESSAGE = function(status, message) {
-          return "\u2716 Error " + status + " while fetching file: " + message;
-        };
-        var FAILURE_EMPTY_MESSAGE = "\u2716 Error: File does not exist or is empty";
-        var EXTENSIONS = {
-          "js": "javascript",
-          "py": "python",
-          "rb": "ruby",
-          "ps1": "powershell",
-          "psm1": "powershell",
-          "sh": "bash",
-          "bat": "batch",
-          "h": "c",
-          "tex": "latex"
-        };
-        var STATUS_ATTR = "data-src-status";
-        var STATUS_LOADING = "loading";
-        var STATUS_LOADED = "loaded";
-        var STATUS_FAILED = "failed";
-        var SELECTOR = "pre[data-src]:not([" + STATUS_ATTR + '="' + STATUS_LOADED + '"]):not([' + STATUS_ATTR + '="' + STATUS_LOADING + '"])';
-        function loadFile(src, success, error) {
-          var xhr = new XMLHttpRequest();
-          xhr.open("GET", src, true);
-          xhr.onreadystatechange = function() {
-            if (xhr.readyState == 4) {
-              if (xhr.status < 400 && xhr.responseText) {
-                success(xhr.responseText);
-              } else {
-                if (xhr.status >= 400) {
-                  error(FAILURE_MESSAGE(xhr.status, xhr.statusText));
-                } else {
-                  error(FAILURE_EMPTY_MESSAGE);
-                }
-              }
-            }
-          };
-          xhr.send(null);
-        }
-        function parseRange(range2) {
-          var m = /^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(range2 || "");
-          if (m) {
-            var start2 = Number(m[1]);
-            var comma = m[2];
-            var end2 = m[3];
-            if (!comma) {
-              return [start2, start2];
-            }
-            if (!end2) {
-              return [start2, void 0];
-            }
-            return [start2, Number(end2)];
-          }
-          return void 0;
-        }
-        Prism.hooks.add("before-highlightall", function(env) {
-          env.selector += ", " + SELECTOR;
-        });
-        Prism.hooks.add("before-sanity-check", function(env) {
-          var pre = (
-            /** @type {HTMLPreElement} */
-            env.element
-          );
-          if (pre.matches(SELECTOR)) {
-            env.code = "";
-            pre.setAttribute(STATUS_ATTR, STATUS_LOADING);
-            var code = pre.appendChild(document.createElement("CODE"));
-            code.textContent = LOADING_MESSAGE;
-            var src = pre.getAttribute("data-src");
-            var language = env.language;
-            if (language === "none") {
-              var extension = (/\.(\w+)$/.exec(src) || [, "none"])[1];
-              language = EXTENSIONS[extension] || extension;
-            }
-            Prism.util.setLanguage(code, language);
-            Prism.util.setLanguage(pre, language);
-            var autoloader = Prism.plugins.autoloader;
-            if (autoloader) {
-              autoloader.loadLanguages(language);
-            }
-            loadFile(
-              src,
-              function(text) {
-                pre.setAttribute(STATUS_ATTR, STATUS_LOADED);
-                var range2 = parseRange(pre.getAttribute("data-range"));
-                if (range2) {
-                  var lines = text.split(/\r\n?|\n/g);
-                  var start2 = range2[0];
-                  var end2 = range2[1] == null ? lines.length : range2[1];
-                  if (start2 < 0) {
-                    start2 += lines.length;
-                  }
-                  start2 = Math.max(0, Math.min(start2 - 1, lines.length));
-                  if (end2 < 0) {
-                    end2 += lines.length;
-                  }
-                  end2 = Math.max(0, Math.min(end2, lines.length));
-                  text = lines.slice(start2, end2).join("\n");
-                  if (!pre.hasAttribute("data-start")) {
-                    pre.setAttribute("data-start", String(start2 + 1));
-                  }
-                }
-                code.textContent = text;
-                Prism.highlightElement(code);
-              },
-              function(error) {
-                pre.setAttribute(STATUS_ATTR, STATUS_FAILED);
-                code.textContent = error;
-              }
-            );
-          }
-        });
-        Prism.plugins.fileHighlight = {
-          /**
-           * Executes the File Highlight plugin for all matching `pre` elements under the given container.
-           *
-           * Note: Elements which are already loaded or currently loading will not be touched by this method.
-           *
-           * @param {ParentNode} [container=document]
-           */
-          highlight: function highlight(container) {
-            var elements = (container || document).querySelectorAll(SELECTOR);
-            for (var i = 0, element; element = elements[i++]; ) {
-              Prism.highlightElement(element);
-            }
-          }
-        };
-        var logged = false;
-        Prism.fileHighlight = function() {
-          if (!logged) {
-            console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead.");
-            logged = true;
-          }
-          Prism.plugins.fileHighlight.highlight.apply(this, arguments);
-        };
-      })();
-    }
-  });
+`),i.push(s))}),i.forEach(s=>s.remove())}},replaceRootContainer(t,e,i){let s=new Set(["id",li,qn,Do,Kn]);if(t.tagName.toLowerCase()===e.toLowerCase())return Array.from(t.attributes).filter(o=>!s.has(o.name.toLowerCase())).forEach(o=>t.removeAttribute(o.name)),Object.keys(i).filter(o=>!s.has(o.toLowerCase())).forEach(o=>t.setAttribute(o,i[o])),t;{let o=document.createElement(e);return Object.keys(i).forEach(c=>o.setAttribute(c,i[c])),s.forEach(c=>o.setAttribute(c,t.getAttribute(c))),o.innerHTML=t.innerHTML,t.replaceWith(o),o}},getSticky(t,e,i){let s=(Et.private(t,"sticky")||[]).find(([o])=>e===o);if(s){let[o,c,d]=s;return d}else return typeof i=="function"?i():i},deleteSticky(t,e){this.updatePrivate(t,"sticky",[],i=>i.filter(([s,o])=>s!==e))},putSticky(t,e,i){let s=i(t);this.updatePrivate(t,"sticky",[],o=>{let c=o.findIndex(([d])=>e===d);return c>=0?o[c]=[e,i,s]:o.push([e,i,s]),o})},applyStickyOperations(t){let e=Et.private(t,"sticky");e&&e.forEach(([i,s,o])=>this.putSticky(t,i,s))}},j=Et,Eo=class{static isActive(t,e){let i=e._phxRef===void 0,o=t.getAttribute(To).split(",").indexOf(Ve.genFileRef(e))>=0;return e.size>0&&(i||o)}static isPreflighted(t,e){return t.getAttribute(Oo).split(",").indexOf(Ve.genFileRef(e))>=0&&this.isActive(t,e)}constructor(t,e,i){this.ref=Ve.genFileRef(e),this.fileEl=t,this.file=e,this.view=i,this.meta=null,this._isCancelled=!1,this._isDone=!1,this._progress=0,this._lastProgressSent=-1,this._onDone=function(){},this._onElUpdated=this.onElUpdated.bind(this),this.fileEl.addEventListener(wo,this._onElUpdated)}metadata(){return this.meta}progress(t){this._progress=Math.floor(t),this._progress>this._lastProgressSent&&(this._progress>=100?(this._progress=100,this._lastProgressSent=100,this._isDone=!0,this.view.pushFileProgress(this.fileEl,this.ref,100,()=>{Ve.untrackFile(this.fileEl,this.file),this._onDone()})):(this._lastProgressSent=this._progress,this.view.pushFileProgress(this.fileEl,this.ref,this._progress)))}cancel(){this._isCancelled=!0,this._isDone=!0,this._onDone()}isDone(){return this._isDone}error(t="failed"){this.view.pushFileProgress(this.fileEl,this.ref,{error:t}),Ve.clearFiles(this.fileEl)}onDone(t){this._onDone=()=>{this.fileEl.removeEventListener(wo,this._onElUpdated),t()}}onElUpdated(){this.fileEl.getAttribute(To).split(",").indexOf(this.ref)===-1&&this.cancel()}toPreflightPayload(){return{last_modified:this.file.lastModified,name:this.file.name,size:this.file.size,type:this.file.type,ref:this.ref}}uploader(t){if(this.meta.uploader){let e=t[this.meta.uploader]||We(`no uploader configured for ${this.meta.uploader}`);return{name:this.meta.uploader,callback:e}}else return{name:"channel",callback:Sg}}zipPostFlight(t){this.meta=t.entries[this.ref],this.meta||We(`no preflight upload response returned with ref ${this.ref}`,{input:this.fileEl,response:t})}},kg=0,Ve=class{static genFileRef(t){let e=t._phxRef;return e!==void 0?e:(t._phxRef=(kg++).toString(),t._phxRef)}static getEntryDataURL(t,e,i){let s=this.activeFiles(t).find(o=>this.genFileRef(o)===e);i(URL.createObjectURL(s))}static hasUploadsInProgress(t){let e=0;return j.findUploadInputs(t).forEach(i=>{i.getAttribute(Oo)!==i.getAttribute(cg)&&e++}),e>0}static serializeUploads(t){let e=this.activeFiles(t),i={};return e.forEach(s=>{let o={path:t.name},c=t.getAttribute(Ni);i[c]=i[c]||[],o.ref=this.genFileRef(s),o.name=s.name||o.ref,o.type=s.type,o.size=s.size,i[c].push(o)}),i}static clearFiles(t){t.value=null,t.removeAttribute(Ni),j.putPrivate(t,"files",[])}static untrackFile(t,e){j.putPrivate(t,"files",j.private(t,"files").filter(i=>!Object.is(i,e)))}static trackFiles(t,e){if(t.getAttribute("multiple")!==null){let i=e.filter(s=>!this.activeFiles(t).find(o=>Object.is(o,s)));j.putPrivate(t,"files",this.activeFiles(t).concat(i)),t.value=null}else j.putPrivate(t,"files",e)}static activeFileInputs(t){let e=j.findUploadInputs(t);return Array.from(e).filter(i=>i.files&&this.activeFiles(i).length>0)}static activeFiles(t){return(j.private(t,"files")||[]).filter(e=>Eo.isActive(t,e))}static inputsAwaitingPreflight(t){let e=j.findUploadInputs(t);return Array.from(e).filter(i=>this.filesAwaitingPreflight(i).length>0)}static filesAwaitingPreflight(t){return this.activeFiles(t).filter(e=>!Eo.isPreflighted(t,e))}constructor(t,e,i){this.view=e,this.onComplete=i,this._entries=Array.from(Ve.filesAwaitingPreflight(t)||[]).map(s=>new Eo(t,s,e)),this.numEntriesInProgress=this._entries.length}entries(){return this._entries}initAdapterUpload(t,e,i){this._entries=this._entries.map(o=>(o.zipPostFlight(t),o.onDone(()=>{this.numEntriesInProgress--,this.numEntriesInProgress===0&&this.onComplete()}),o));let s=this._entries.reduce((o,c)=>{let{name:d,callback:g}=c.uploader(i.uploaders);return o[d]=o[d]||{callback:g,entries:[]},o[d].entries.push(c),o},{});for(let o in s){let{callback:c,entries:d}=s[o];c(d,e,t,i)}}},Og={LiveFileUpload:{activeRefs(){return this.el.getAttribute(To)},preflightedRefs(){return this.el.getAttribute(Oo)},mounted(){this.preflightedWas=this.preflightedRefs()},updated(){let t=this.preflightedRefs();this.preflightedWas!==t&&(this.preflightedWas=t,t===""&&this.__view.cancelSubmit(this.el.form)),this.activeRefs()===""&&(this.el.value=null),this.el.dispatchEvent(new CustomEvent(wo))}},LiveImgPreview:{mounted(){this.ref=this.el.getAttribute("data-phx-entry-ref"),this.inputEl=document.getElementById(this.el.getAttribute(Ni)),Ve.getEntryDataURL(this.inputEl,this.ref,t=>{this.url=t,this.el.src=t})},destroyed(){URL.revokeObjectURL(this.url)}}},Dg=Og,Lg=class{constructor(t,e,i){let s=new Set,o=new Set([...e.children].map(d=>d.id)),c=[];Array.from(t.children).forEach(d=>{if(d.id&&(s.add(d.id),o.has(d.id))){let g=d.previousElementSibling&&d.previousElementSibling.id;c.push({elementId:d.id,previousElementId:g})}}),this.containerId=e.id,this.updateType=i,this.elementsToModify=c,this.elementIdsToAdd=[...o].filter(d=>!s.has(d))}perform(){let t=j.byId(this.containerId);this.elementsToModify.forEach(e=>{e.previousElementId?qt(document.getElementById(e.previousElementId),i=>{qt(document.getElementById(e.elementId),s=>{s.previousElementSibling&&s.previousElementSibling.id==i.id||i.insertAdjacentElement("afterend",s)})}):qt(document.getElementById(e.elementId),i=>{i.previousElementSibling==null||t.insertAdjacentElement("afterbegin",i)})}),this.updateType=="prepend"&&this.elementIdsToAdd.reverse().forEach(e=>{qt(document.getElementById(e),i=>t.insertAdjacentElement("afterbegin",i))})}},Jl=11;function Ng(t,e){var i=e.attributes,s,o,c,d,g;if(!(e.nodeType===Jl||t.nodeType===Jl)){for(var v=i.length-1;v>=0;v--)s=i[v],o=s.name,c=s.namespaceURI,d=s.value,c?(o=s.localName||o,g=t.getAttributeNS(c,o),g!==d&&(s.prefix==="xmlns"&&(o=s.name),t.setAttributeNS(c,o,d))):(g=t.getAttribute(o),g!==d&&t.setAttribute(o,d));for(var C=t.attributes,x=C.length-1;x>=0;x--)s=C[x],o=s.name,c=s.namespaceURI,c?(o=s.localName||o,e.hasAttributeNS(c,o)||t.removeAttributeNS(c,o)):e.hasAttribute(o)||t.removeAttribute(o)}}var Kr,Pg="http://www.w3.org/1999/xhtml",tt=typeof document>"u"?void 0:document,Ig=!!tt&&"content"in tt.createElement("template"),Rg=!!tt&&tt.createRange&&"createContextualFragment"in tt.createRange();function $g(t){var e=tt.createElement("template");return e.innerHTML=t,e.content.childNodes[0]}function Mg(t){Kr||(Kr=tt.createRange(),Kr.selectNode(tt.body));var e=Kr.createContextualFragment(t);return e.childNodes[0]}function Hg(t){var e=tt.createElement("body");return e.innerHTML=t,e.childNodes[0]}function Fg(t){return t=t.trim(),Ig?$g(t):Rg?Mg(t):Hg(t)}function Xr(t,e){var i=t.nodeName,s=e.nodeName,o,c;return i===s?!0:(o=i.charCodeAt(0),c=s.charCodeAt(0),o<=90&&c>=97?i===s.toUpperCase():c<=90&&o>=97?s===i.toUpperCase():!1)}function jg(t,e){return!e||e===Pg?tt.createElement(t):tt.createElementNS(e,t)}function Bg(t,e){for(var i=t.firstChild;i;){var s=i.nextSibling;e.appendChild(i),i=s}return e}function Ao(t,e,i){t[i]!==e[i]&&(t[i]=e[i],t[i]?t.setAttribute(i,""):t.removeAttribute(i))}var Ql={OPTION:function(t,e){var i=t.parentNode;if(i){var s=i.nodeName.toUpperCase();s==="OPTGROUP"&&(i=i.parentNode,s=i&&i.nodeName.toUpperCase()),s==="SELECT"&&!i.hasAttribute("multiple")&&(t.hasAttribute("selected")&&!e.selected&&(t.setAttribute("selected","selected"),t.removeAttribute("selected")),i.selectedIndex=-1)}Ao(t,e,"selected")},INPUT:function(t,e){Ao(t,e,"checked"),Ao(t,e,"disabled"),t.value!==e.value&&(t.value=e.value),e.hasAttribute("value")||t.removeAttribute("value")},TEXTAREA:function(t,e){var i=e.value;t.value!==i&&(t.value=i);var s=t.firstChild;if(s){var o=s.nodeValue;if(o==i||!i&&o==t.placeholder)return;s.nodeValue=i}},SELECT:function(t,e){if(!e.hasAttribute("multiple")){for(var i=-1,s=0,o=t.firstChild,c,d;o;)if(d=o.nodeName&&o.nodeName.toUpperCase(),d==="OPTGROUP")c=o,o=c.firstChild;else{if(d==="OPTION"){if(o.hasAttribute("selected")){i=s;break}s++}o=o.nextSibling,!o&&c&&(o=c.nextSibling,c=null)}t.selectedIndex=i}}},Vn=1,Ug=11,Zl=3,eu=8;function Di(){}function Vg(t){if(t)return t.getAttribute&&t.getAttribute("id")||t.id}function Wg(t){return function(i,s,o){if(o||(o={}),typeof s=="string")if(i.nodeName==="#document"||i.nodeName==="HTML"||i.nodeName==="BODY"){var c=s;s=tt.createElement("html"),s.innerHTML=c}else s=Fg(s);var d=o.getNodeKey||Vg,g=o.onBeforeNodeAdded||Di,v=o.onNodeAdded||Di,C=o.onBeforeElUpdated||Di,x=o.onElUpdated||Di,I=o.onBeforeNodeDiscarded||Di,D=o.onNodeDiscarded||Di,S=o.onBeforeElChildrenUpdated||Di,N=o.childrenOnly===!0,A=Object.create(null),_=[];function R(Y){_.push(Y)}function F(Y,W){if(Y.nodeType===Vn)for(var X=Y.firstChild;X;){var oe=void 0;W&&(oe=d(X))?R(oe):(D(X),X.firstChild&&F(X,W)),X=X.nextSibling}}function T(Y,W,X){I(Y)!==!1&&(W&&W.removeChild(Y),D(Y),F(Y,X))}function H(Y){if(Y.nodeType===Vn||Y.nodeType===Ug)for(var W=Y.firstChild;W;){var X=d(W);X&&(A[X]=W),H(W),W=W.nextSibling}}H(i);function K(Y){v(Y);for(var W=Y.firstChild;W;){var X=W.nextSibling,oe=d(W);if(oe){var de=A[oe];de&&Xr(W,de)?(W.parentNode.replaceChild(de,W),ee(de,W)):K(W)}else K(W);W=X}}function l(Y,W,X){for(;W;){var oe=W.nextSibling;(X=d(W))?R(X):T(W,Y,!0),W=oe}}function ee(Y,W,X){var oe=d(W);oe&&delete A[oe],!(!X&&(C(Y,W)===!1||(t(Y,W),x(Y),S(Y,W)===!1)))&&(Y.nodeName!=="TEXTAREA"?G(Y,W):Ql.TEXTAREA(Y,W))}function G(Y,W){var X=W.firstChild,oe=Y.firstChild,de,Pe,we,Oe,Se;e:for(;X;){for(Oe=X.nextSibling,de=d(X);oe;){if(we=oe.nextSibling,X.isSameNode&&X.isSameNode(oe)){X=Oe,oe=we;continue e}Pe=d(oe);var Ie=oe.nodeType,Ae=void 0;if(Ie===X.nodeType&&(Ie===Vn?(de?de!==Pe&&((Se=A[de])?we===Se?Ae=!1:(Y.insertBefore(Se,oe),Pe?R(Pe):T(oe,Y,!0),oe=Se):Ae=!1):Pe&&(Ae=!1),Ae=Ae!==!1&&Xr(oe,X),Ae&&ee(oe,X)):(Ie===Zl||Ie==eu)&&(Ae=!0,oe.nodeValue!==X.nodeValue&&(oe.nodeValue=X.nodeValue))),Ae){X=Oe,oe=we;continue e}Pe?R(Pe):T(oe,Y,!0),oe=we}if(de&&(Se=A[de])&&Xr(Se,X))Y.appendChild(Se),ee(Se,X);else{var Ge=g(X);Ge!==!1&&(Ge&&(X=Ge),X.actualize&&(X=X.actualize(Y.ownerDocument||tt)),Y.appendChild(X),K(X))}X=Oe,oe=we}l(Y,oe,Pe);var it=Ql[Y.nodeName];it&&it(Y,W)}var re=i,me=re.nodeType,_e=s.nodeType;if(!N){if(me===Vn)_e===Vn?Xr(i,s)||(D(i),re=Bg(i,jg(s.nodeName,s.namespaceURI))):re=s;else if(me===Zl||me===eu){if(_e===me)return re.nodeValue!==s.nodeValue&&(re.nodeValue=s.nodeValue),re;re=s}}if(re===s)D(i);else{if(s.isSameNode&&s.isSameNode(re))return;if(ee(re,s,N),_)for(var se=0,ye=_.length;se<ye;se++){var je=A[_[se]];je&&T(je,je.parentNode,!1)}}return!N&&re!==i&&i.parentNode&&(re.actualize&&(re=re.actualize(i.ownerDocument||tt)),i.parentNode.replaceChild(re,i)),re}}var qg=Wg(Ng),tu=qg,Yr=class{static patchEl(t,e,i){tu(t,e,{childrenOnly:!1,onBeforeElUpdated:(s,o)=>{if(i&&i.isSameNode(s)&&j.isFormInput(s))return j.mergeFocusedInput(s,o),!1}})}constructor(t,e,i,s,o){this.view=t,this.liveSocket=t.liveSocket,this.container=e,this.id=i,this.rootID=t.root.id,this.html=s,this.targetCID=o,this.cidPatch=ai(this.targetCID),this.callbacks={beforeadded:[],beforeupdated:[],beforephxChildAdded:[],afteradded:[],afterupdated:[],afterdiscarded:[],afterphxChildAdded:[],aftertransitionsDiscarded:[]}}before(t,e){this.callbacks[`before${t}`].push(e)}after(t,e){this.callbacks[`after${t}`].push(e)}trackBefore(t,...e){this.callbacks[`before${t}`].forEach(i=>i(...e))}trackAfter(t,...e){this.callbacks[`after${t}`].forEach(i=>i(...e))}markPrunableContentForRemoval(){j.all(this.container,"[phx-update=append] > *, [phx-update=prepend] > *",t=>{t.setAttribute(Hl,"")})}perform(){let{view:t,liveSocket:e,container:i,html:s}=this,o=this.isCIDPatch()?this.targetCIDContainer(s):i;if(this.isCIDPatch()&&!o)return;let c=e.getActiveElement(),{selectionStart:d,selectionEnd:g}=c&&j.hasSelectionRange(c)?c:{},v=e.binding(ko),C=e.binding(Co),x=e.binding(So),I=e.binding(fg),D=e.binding("remove"),S=[],N=[],A=[],_=[],R=null,F=e.time("premorph container prep",()=>this.buildDiffHTML(i,s,v,o));return this.trackBefore("added",i),this.trackBefore("updated",i,i),e.time("morphdom",()=>{tu(o,F,{childrenOnly:o.getAttribute(ot)===null,getNodeKey:T=>j.isPhxDestroyed(T)?null:T.id,onBeforeNodeAdded:T=>(this.trackBefore("added",T),T),onNodeAdded:T=>{T instanceof HTMLImageElement&&T.srcset?T.srcset=T.srcset:T instanceof HTMLVideoElement&&T.autoplay&&T.play(),j.isNowTriggerFormExternal(T,I)&&(R=T),j.discardError(o,T,C),(j.isPhxChild(T)&&t.ownsElement(T)||j.isPhxSticky(T)&&t.ownsElement(T.parentNode))&&this.trackAfter("phxChildAdded",T),S.push(T)},onNodeDiscarded:T=>{(j.isPhxChild(T)||j.isPhxSticky(T))&&e.destroyViewByEl(T),this.trackAfter("discarded",T)},onBeforeNodeDiscarded:T=>T.getAttribute&&T.getAttribute(Hl)!==null?!0:T.parentNode!==null&&j.isPhxUpdate(T.parentNode,v,["append","prepend"])&&T.id?!1:T.getAttribute&&T.getAttribute(D)?(_.push(T),!1):!this.skipCIDSibling(T),onElUpdated:T=>{j.isNowTriggerFormExternal(T,I)&&(R=T),N.push(T)},onBeforeElUpdated:(T,H)=>{if(j.cleanChildNodes(H,v),this.skipCIDSibling(H)||j.isPhxSticky(T))return!1;if(j.isIgnored(T,v))return this.trackBefore("updated",T,H),j.mergeAttrs(T,H,{isIgnored:!0}),N.push(T),j.applyStickyOperations(T),!1;if(T.type==="number"&&T.validity&&T.validity.badInput)return!1;if(!j.syncPendingRef(T,H,x))return j.isUploadInput(T)&&(this.trackBefore("updated",T,H),N.push(T)),j.applyStickyOperations(T),!1;if(j.isPhxChild(H)){let l=T.getAttribute(li);return j.mergeAttrs(T,H,{exclude:[qn]}),l!==""&&T.setAttribute(li,l),T.setAttribute(Kn,this.rootID),j.applyStickyOperations(T),!1}return j.copyPrivates(H,T),j.discardError(o,H,C),c&&T.isSameNode(c)&&j.isFormInput(T)?(this.trackBefore("updated",T,H),j.mergeFocusedInput(T,H),j.syncAttrsToProps(T),N.push(T),j.applyStickyOperations(T),!1):(j.isPhxUpdate(H,v,["append","prepend"])&&A.push(new Lg(T,H,H.getAttribute(v))),j.syncAttrsToProps(H),j.applyStickyOperations(H),this.trackBefore("updated",T,H),!0)}})}),e.isDebugEnabled()&&wg(),A.length>0&&e.time("post-morph append/prepend restoration",()=>{A.forEach(T=>T.perform())}),e.silenceEvents(()=>j.restoreFocus(c,d,g)),j.dispatchEvent(document,"phx:update"),S.forEach(T=>this.trackAfter("added",T)),N.forEach(T=>this.trackAfter("updated",T)),_.length>0&&(e.transitionRemoves(_),e.requestDOMUpdate(()=>{_.forEach(T=>{let H=j.firstPhxChild(T);H&&e.destroyViewByEl(H),T.remove()}),this.trackAfter("transitionsDiscarded",_)})),R&&(e.disconnect(),R.submit()),!0}isCIDPatch(){return this.cidPatch}skipCIDSibling(t){return t.nodeType===Node.ELEMENT_NODE&&t.getAttribute(xo)!==null}targetCIDContainer(t){if(!this.isCIDPatch())return;let[e,...i]=j.findComponentNodeList(this.container,this.targetCID);return i.length===0&&j.childNodeLength(t)===1?e:e&&e.parentNode}buildDiffHTML(t,e,i,s){let o=this.isCIDPatch(),c=o&&s.getAttribute(ot)===this.targetCID.toString();if(!o||c)return e;{let d=null,g=document.createElement("template");d=j.cloneNode(s);let[v,...C]=j.findComponentNodeList(d,this.targetCID);return g.innerHTML=e,C.forEach(x=>x.remove()),Array.from(d.childNodes).forEach(x=>{x.id&&x.nodeType===Node.ELEMENT_NODE&&x.getAttribute(ot)!==this.targetCID.toString()&&(x.setAttribute(xo,""),x.innerHTML="")}),Array.from(g.content.childNodes).forEach(x=>d.insertBefore(x,v)),v.remove(),d.outerHTML}}},iu=class{static extract(t){let{[Xl]:e,[Kl]:i,[Yl]:s}=t;return delete t[Xl],delete t[Kl],delete t[Yl],{diff:t,title:s,reply:e||null,events:i||[]}}constructor(t,e){this.viewId=t,this.rendered={},this.mergeDiff(e)}parentViewId(){return this.viewId}toString(t){return this.recursiveToString(this.rendered,this.rendered[st],t)}recursiveToString(t,e=t[st],i){i=i?new Set(i):null;let s={buffer:"",components:e,onlyCids:i};return this.toOutputBuffer(t,null,s),s.buffer}componentCIDs(t){return Object.keys(t[st]||{}).map(e=>parseInt(e))}isComponentOnlyDiff(t){return t[st]?Object.keys(t).length===1:!1}getComponent(t,e){return t[st][e]}mergeDiff(t){let e=t[st],i={};if(delete t[st],this.rendered=this.mutableMerge(this.rendered,t),this.rendered[st]=this.rendered[st]||{},e){let s=this.rendered[st];for(let o in e)e[o]=this.cachedFindComponent(o,e[o],s,e,i);for(let o in e)s[o]=e[o];t[st]=e}}cachedFindComponent(t,e,i,s,o){if(o[t])return o[t];{let c,d,g=e[Lt];if(ai(g)){let v;g>0?v=this.cachedFindComponent(g,s[g],i,s,o):v=i[-g],d=v[Lt],c=this.cloneMerge(v,e),c[Lt]=d}else c=e[Lt]!==void 0?e:this.cloneMerge(i[t]||{},e);return o[t]=c,c}}mutableMerge(t,e){return e[Lt]!==void 0?e:(this.doMutableMerge(t,e),t)}doMutableMerge(t,e){for(let i in e){let s=e[i],o=t[i];Un(s)&&s[Lt]===void 0&&Un(o)?this.doMutableMerge(o,s):t[i]=s}}cloneMerge(t,e){let i={...t,...e};for(let s in i){let o=e[s],c=t[s];Un(o)&&o[Lt]===void 0&&Un(c)&&(i[s]=this.cloneMerge(c,o))}return i}componentToString(t){return this.recursiveCIDToString(this.rendered[st],t)}pruneCIDs(t){t.forEach(e=>delete this.rendered[st][e])}get(){return this.rendered}isNewFingerprint(t={}){return!!t[Lt]}templateStatic(t,e){return typeof t=="number"?e[t]:t}toOutputBuffer(t,e,i){if(t[zl])return this.comprehensionToBuffer(t,e,i);let{[Lt]:s}=t;s=this.templateStatic(s,e),i.buffer+=s[0];for(let o=1;o<s.length;o++)this.dynamicToBuffer(t[o-1],e,i),i.buffer+=s[o]}comprehensionToBuffer(t,e,i){let{[zl]:s,[Lt]:o}=t;o=this.templateStatic(o,e);let c=e||t[Ag];for(let d=0;d<s.length;d++){let g=s[d];i.buffer+=o[0];for(let v=1;v<o.length;v++)this.dynamicToBuffer(g[v-1],c,i),i.buffer+=o[v]}}dynamicToBuffer(t,e,i){typeof t=="number"?i.buffer+=this.recursiveCIDToString(i.components,t,i.onlyCids):Un(t)?this.toOutputBuffer(t,e,i):i.buffer+=t}recursiveCIDToString(t,e,i){let s=t[e]||We(`no component for CID ${e}`,t),o=document.createElement("template");o.innerHTML=this.recursiveToString(s,t,i);let c=o.content,d=i&&!i.has(e),[g,v]=Array.from(c.childNodes).reduce(([C,x],I,D)=>I.nodeType===Node.ELEMENT_NODE?I.getAttribute(ot)?[C,!0]:(I.setAttribute(ot,e),I.id||(I.id=`${this.parentViewId()}-${e}-${D}`),d&&(I.setAttribute(xo,""),I.innerHTML=""),[!0,x]):I.nodeValue.trim()!==""?(We(`only HTML element tags are allowed at the root of components.
 
-  // vendor/topbar.js
-  var require_topbar = __commonJS({
-    "vendor/topbar.js"(exports, module) {
-      (function(window2, document2) {
-        "use strict";
-        (function() {
-          var lastTime = 0;
-          var vendors = ["ms", "moz", "webkit", "o"];
-          for (var x = 0; x < vendors.length && !window2.requestAnimationFrame; ++x) {
-            window2.requestAnimationFrame = window2[vendors[x] + "RequestAnimationFrame"];
-            window2.cancelAnimationFrame = window2[vendors[x] + "CancelAnimationFrame"] || window2[vendors[x] + "CancelRequestAnimationFrame"];
-          }
-          if (!window2.requestAnimationFrame)
-            window2.requestAnimationFrame = function(callback, element) {
-              var currTime = (/* @__PURE__ */ new Date()).getTime();
-              var timeToCall = Math.max(0, 16 - (currTime - lastTime));
-              var id = window2.setTimeout(function() {
-                callback(currTime + timeToCall);
-              }, timeToCall);
-              lastTime = currTime + timeToCall;
-              return id;
-            };
-          if (!window2.cancelAnimationFrame)
-            window2.cancelAnimationFrame = function(id) {
-              clearTimeout(id);
-            };
-        })();
-        var canvas, progressTimerId, fadeTimerId, currentProgress, showing, addEvent = function(elem, type, handler) {
-          if (elem.addEventListener)
-            elem.addEventListener(type, handler, false);
-          else if (elem.attachEvent)
-            elem.attachEvent("on" + type, handler);
-          else
-            elem["on" + type] = handler;
-        }, options = {
-          autoRun: true,
-          barThickness: 3,
-          barColors: {
-            0: "rgba(26,  188, 156, .9)",
-            ".25": "rgba(52,  152, 219, .9)",
-            ".50": "rgba(241, 196, 15,  .9)",
-            ".75": "rgba(230, 126, 34,  .9)",
-            "1.0": "rgba(211, 84,  0,   .9)"
-          },
-          shadowBlur: 10,
-          shadowColor: "rgba(0,   0,   0,   .6)",
-          className: null
-        }, repaint = function() {
-          canvas.width = window2.innerWidth;
-          canvas.height = options.barThickness * 5;
-          var ctx = canvas.getContext("2d");
-          ctx.shadowBlur = options.shadowBlur;
-          ctx.shadowColor = options.shadowColor;
-          var lineGradient = ctx.createLinearGradient(0, 0, canvas.width, 0);
-          for (var stop in options.barColors)
-            lineGradient.addColorStop(stop, options.barColors[stop]);
-          ctx.lineWidth = options.barThickness;
-          ctx.beginPath();
-          ctx.moveTo(0, options.barThickness / 2);
-          ctx.lineTo(
-            Math.ceil(currentProgress * canvas.width),
-            options.barThickness / 2
-          );
-          ctx.strokeStyle = lineGradient;
-          ctx.stroke();
-        }, createCanvas = function() {
-          canvas = document2.createElement("canvas");
-          var style = canvas.style;
-          style.position = "fixed";
-          style.top = style.left = style.right = style.margin = style.padding = 0;
-          style.zIndex = 100001;
-          style.display = "none";
-          if (options.className)
-            canvas.classList.add(options.className);
-          document2.body.appendChild(canvas);
-          addEvent(window2, "resize", repaint);
-        }, topbar2 = {
-          config: function(opts) {
-            for (var key in opts)
-              if (options.hasOwnProperty(key))
-                options[key] = opts[key];
-          },
-          show: function() {
-            if (showing)
-              return;
-            showing = true;
-            if (fadeTimerId !== null)
-              window2.cancelAnimationFrame(fadeTimerId);
-            if (!canvas)
-              createCanvas();
-            canvas.style.opacity = 1;
-            canvas.style.display = "block";
-            topbar2.progress(0);
-            if (options.autoRun) {
-              (function loop() {
-                progressTimerId = window2.requestAnimationFrame(loop);
-                topbar2.progress(
-                  "+" + 0.05 * Math.pow(1 - Math.sqrt(currentProgress), 2)
-                );
-              })();
-            }
-          },
-          progress: function(to) {
-            if (typeof to === "undefined")
-              return currentProgress;
-            if (typeof to === "string") {
-              to = (to.indexOf("+") >= 0 || to.indexOf("-") >= 0 ? currentProgress : 0) + parseFloat(to);
-            }
-            currentProgress = to > 1 ? 1 : to;
-            repaint();
-            return currentProgress;
-          },
-          hide: function() {
-            if (!showing)
-              return;
-            showing = false;
-            if (progressTimerId != null) {
-              window2.cancelAnimationFrame(progressTimerId);
-              progressTimerId = null;
-            }
-            (function loop() {
-              if (topbar2.progress("+.1") >= 1) {
-                canvas.style.opacity -= 0.05;
-                if (canvas.style.opacity <= 0.05) {
-                  canvas.style.display = "none";
-                  fadeTimerId = null;
-                  return;
-                }
-              }
-              fadeTimerId = window2.requestAnimationFrame(loop);
-            })();
-          }
-        };
-        if (typeof module === "object" && typeof module.exports === "object") {
-          module.exports = topbar2;
-        } else if (typeof define === "function" && define.amd) {
-          define(function() {
-            return topbar2;
-          });
-        } else {
-          this.topbar = topbar2;
-        }
-      }).call(exports, window, document);
-    }
-  });
-
-  // js/app.js
-  var import_jquery3 = __toESM(require_jquery());
-
-  // node_modules/@popperjs/core/lib/index.js
-  var lib_exports = {};
-  __export(lib_exports, {
-    afterMain: () => afterMain,
-    afterRead: () => afterRead,
-    afterWrite: () => afterWrite,
-    applyStyles: () => applyStyles_default,
-    arrow: () => arrow_default,
-    auto: () => auto,
-    basePlacements: () => basePlacements,
-    beforeMain: () => beforeMain,
-    beforeRead: () => beforeRead,
-    beforeWrite: () => beforeWrite,
-    bottom: () => bottom,
-    clippingParents: () => clippingParents,
-    computeStyles: () => computeStyles_default,
-    createPopper: () => createPopper3,
-    createPopperBase: () => createPopper,
-    createPopperLite: () => createPopper2,
-    detectOverflow: () => detectOverflow,
-    end: () => end,
-    eventListeners: () => eventListeners_default,
-    flip: () => flip_default,
-    hide: () => hide_default,
-    left: () => left,
-    main: () => main,
-    modifierPhases: () => modifierPhases,
-    offset: () => offset_default,
-    placements: () => placements,
-    popper: () => popper,
-    popperGenerator: () => popperGenerator,
-    popperOffsets: () => popperOffsets_default,
-    preventOverflow: () => preventOverflow_default,
-    read: () => read,
-    reference: () => reference,
-    right: () => right,
-    start: () => start,
-    top: () => top,
-    variationPlacements: () => variationPlacements,
-    viewport: () => viewport,
-    write: () => write
-  });
-
-  // node_modules/@popperjs/core/lib/enums.js
-  var top = "top";
-  var bottom = "bottom";
-  var right = "right";
-  var left = "left";
-  var auto = "auto";
-  var basePlacements = [top, bottom, right, left];
-  var start = "start";
-  var end = "end";
-  var clippingParents = "clippingParents";
-  var viewport = "viewport";
-  var popper = "popper";
-  var reference = "reference";
-  var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) {
-    return acc.concat([placement + "-" + start, placement + "-" + end]);
-  }, []);
-  var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) {
-    return acc.concat([placement, placement + "-" + start, placement + "-" + end]);
-  }, []);
-  var beforeRead = "beforeRead";
-  var read = "read";
-  var afterRead = "afterRead";
-  var beforeMain = "beforeMain";
-  var main = "main";
-  var afterMain = "afterMain";
-  var beforeWrite = "beforeWrite";
-  var write = "write";
-  var afterWrite = "afterWrite";
-  var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];
-
-  // node_modules/@popperjs/core/lib/dom-utils/getNodeName.js
-  function getNodeName(element) {
-    return element ? (element.nodeName || "").toLowerCase() : null;
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/getWindow.js
-  function getWindow(node) {
-    if (node == null) {
-      return window;
-    }
-    if (node.toString() !== "[object Window]") {
-      var ownerDocument = node.ownerDocument;
-      return ownerDocument ? ownerDocument.defaultView || window : window;
-    }
-    return node;
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/instanceOf.js
-  function isElement(node) {
-    var OwnElement = getWindow(node).Element;
-    return node instanceof OwnElement || node instanceof Element;
-  }
-  function isHTMLElement(node) {
-    var OwnElement = getWindow(node).HTMLElement;
-    return node instanceof OwnElement || node instanceof HTMLElement;
-  }
-  function isShadowRoot(node) {
-    if (typeof ShadowRoot === "undefined") {
-      return false;
-    }
-    var OwnElement = getWindow(node).ShadowRoot;
-    return node instanceof OwnElement || node instanceof ShadowRoot;
-  }
-
-  // node_modules/@popperjs/core/lib/modifiers/applyStyles.js
-  function applyStyles(_ref) {
-    var state = _ref.state;
-    Object.keys(state.elements).forEach(function(name) {
-      var style = state.styles[name] || {};
-      var attributes = state.attributes[name] || {};
-      var element = state.elements[name];
-      if (!isHTMLElement(element) || !getNodeName(element)) {
-        return;
-      }
-      Object.assign(element.style, style);
-      Object.keys(attributes).forEach(function(name2) {
-        var value = attributes[name2];
-        if (value === false) {
-          element.removeAttribute(name2);
-        } else {
-          element.setAttribute(name2, value === true ? "" : value);
-        }
-      });
-    });
-  }
-  function effect(_ref2) {
-    var state = _ref2.state;
-    var initialStyles = {
-      popper: {
-        position: state.options.strategy,
-        left: "0",
-        top: "0",
-        margin: "0"
-      },
-      arrow: {
-        position: "absolute"
-      },
-      reference: {}
-    };
-    Object.assign(state.elements.popper.style, initialStyles.popper);
-    state.styles = initialStyles;
-    if (state.elements.arrow) {
-      Object.assign(state.elements.arrow.style, initialStyles.arrow);
-    }
-    return function() {
-      Object.keys(state.elements).forEach(function(name) {
-        var element = state.elements[name];
-        var attributes = state.attributes[name] || {};
-        var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]);
-        var style = styleProperties.reduce(function(style2, property) {
-          style2[property] = "";
-          return style2;
-        }, {});
-        if (!isHTMLElement(element) || !getNodeName(element)) {
-          return;
-        }
-        Object.assign(element.style, style);
-        Object.keys(attributes).forEach(function(attribute) {
-          element.removeAttribute(attribute);
-        });
-      });
-    };
-  }
-  var applyStyles_default = {
-    name: "applyStyles",
-    enabled: true,
-    phase: "write",
-    fn: applyStyles,
-    effect,
-    requires: ["computeStyles"]
-  };
-
-  // node_modules/@popperjs/core/lib/utils/getBasePlacement.js
-  function getBasePlacement(placement) {
-    return placement.split("-")[0];
-  }
-
-  // node_modules/@popperjs/core/lib/utils/math.js
-  var max = Math.max;
-  var min = Math.min;
-  var round = Math.round;
-
-  // node_modules/@popperjs/core/lib/utils/userAgent.js
-  function getUAString() {
-    var uaData = navigator.userAgentData;
-    if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {
-      return uaData.brands.map(function(item) {
-        return item.brand + "/" + item.version;
-      }).join(" ");
-    }
-    return navigator.userAgent;
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js
-  function isLayoutViewport() {
-    return !/^((?!chrome|android).)*safari/i.test(getUAString());
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js
-  function getBoundingClientRect(element, includeScale, isFixedStrategy) {
-    if (includeScale === void 0) {
-      includeScale = false;
-    }
-    if (isFixedStrategy === void 0) {
-      isFixedStrategy = false;
-    }
-    var clientRect = element.getBoundingClientRect();
-    var scaleX = 1;
-    var scaleY = 1;
-    if (includeScale && isHTMLElement(element)) {
-      scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;
-      scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;
-    }
-    var _ref = isElement(element) ? getWindow(element) : window, visualViewport = _ref.visualViewport;
-    var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;
-    var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;
-    var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;
-    var width = clientRect.width / scaleX;
-    var height = clientRect.height / scaleY;
-    return {
-      width,
-      height,
-      top: y,
-      right: x + width,
-      bottom: y + height,
-      left: x,
-      x,
-      y
-    };
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js
-  function getLayoutRect(element) {
-    var clientRect = getBoundingClientRect(element);
-    var width = element.offsetWidth;
-    var height = element.offsetHeight;
-    if (Math.abs(clientRect.width - width) <= 1) {
-      width = clientRect.width;
-    }
-    if (Math.abs(clientRect.height - height) <= 1) {
-      height = clientRect.height;
-    }
-    return {
-      x: element.offsetLeft,
-      y: element.offsetTop,
-      width,
-      height
-    };
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/contains.js
-  function contains(parent, child) {
-    var rootNode = child.getRootNode && child.getRootNode();
-    if (parent.contains(child)) {
-      return true;
-    } else if (rootNode && isShadowRoot(rootNode)) {
-      var next = child;
-      do {
-        if (next && parent.isSameNode(next)) {
-          return true;
-        }
-        next = next.parentNode || next.host;
-      } while (next);
-    }
-    return false;
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js
-  function getComputedStyle2(element) {
-    return getWindow(element).getComputedStyle(element);
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/isTableElement.js
-  function isTableElement(element) {
-    return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0;
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js
-  function getDocumentElement(element) {
-    return ((isElement(element) ? element.ownerDocument : (
-      // $FlowFixMe[prop-missing]
-      element.document
-    )) || window.document).documentElement;
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/getParentNode.js
-  function getParentNode(element) {
-    if (getNodeName(element) === "html") {
-      return element;
-    }
-    return (
-      // this is a quicker (but less type safe) way to save quite some bytes from the bundle
-      // $FlowFixMe[incompatible-return]
-      // $FlowFixMe[prop-missing]
-      element.assignedSlot || // step into the shadow DOM of the parent of a slotted node
-      element.parentNode || // DOM Element detected
-      (isShadowRoot(element) ? element.host : null) || // ShadowRoot detected
-      // $FlowFixMe[incompatible-call]: HTMLElement is a Node
-      getDocumentElement(element)
-    );
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js
-  function getTrueOffsetParent(element) {
-    if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837
-    getComputedStyle2(element).position === "fixed") {
-      return null;
-    }
-    return element.offsetParent;
-  }
-  function getContainingBlock(element) {
-    var isFirefox = /firefox/i.test(getUAString());
-    var isIE = /Trident/i.test(getUAString());
-    if (isIE && isHTMLElement(element)) {
-      var elementCss = getComputedStyle2(element);
-      if (elementCss.position === "fixed") {
-        return null;
-      }
-    }
-    var currentNode = getParentNode(element);
-    if (isShadowRoot(currentNode)) {
-      currentNode = currentNode.host;
-    }
-    while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) {
-      var css = getComputedStyle2(currentNode);
-      if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") {
-        return currentNode;
-      } else {
-        currentNode = currentNode.parentNode;
-      }
-    }
-    return null;
-  }
-  function getOffsetParent(element) {
-    var window2 = getWindow(element);
-    var offsetParent = getTrueOffsetParent(element);
-    while (offsetParent && isTableElement(offsetParent) && getComputedStyle2(offsetParent).position === "static") {
-      offsetParent = getTrueOffsetParent(offsetParent);
-    }
-    if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle2(offsetParent).position === "static")) {
-      return window2;
-    }
-    return offsetParent || getContainingBlock(element) || window2;
-  }
-
-  // node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js
-  function getMainAxisFromPlacement(placement) {
-    return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y";
-  }
-
-  // node_modules/@popperjs/core/lib/utils/within.js
-  function within(min2, value, max2) {
-    return max(min2, min(value, max2));
-  }
-  function withinMaxClamp(min2, value, max2) {
-    var v = within(min2, value, max2);
-    return v > max2 ? max2 : v;
-  }
-
-  // node_modules/@popperjs/core/lib/utils/getFreshSideObject.js
-  function getFreshSideObject() {
-    return {
-      top: 0,
-      right: 0,
-      bottom: 0,
-      left: 0
-    };
-  }
-
-  // node_modules/@popperjs/core/lib/utils/mergePaddingObject.js
-  function mergePaddingObject(paddingObject) {
-    return Object.assign({}, getFreshSideObject(), paddingObject);
-  }
-
-  // node_modules/@popperjs/core/lib/utils/expandToHashMap.js
-  function expandToHashMap(value, keys) {
-    return keys.reduce(function(hashMap, key) {
-      hashMap[key] = value;
-      return hashMap;
-    }, {});
-  }
-
-  // node_modules/@popperjs/core/lib/modifiers/arrow.js
-  var toPaddingObject = function toPaddingObject2(padding, state) {
-    padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, {
-      placement: state.placement
-    })) : padding;
-    return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
-  };
-  function arrow(_ref) {
-    var _state$modifiersData$;
-    var state = _ref.state, name = _ref.name, options = _ref.options;
-    var arrowElement = state.elements.arrow;
-    var popperOffsets2 = state.modifiersData.popperOffsets;
-    var basePlacement = getBasePlacement(state.placement);
-    var axis = getMainAxisFromPlacement(basePlacement);
-    var isVertical = [left, right].indexOf(basePlacement) >= 0;
-    var len = isVertical ? "height" : "width";
-    if (!arrowElement || !popperOffsets2) {
-      return;
-    }
-    var paddingObject = toPaddingObject(options.padding, state);
-    var arrowRect = getLayoutRect(arrowElement);
-    var minProp = axis === "y" ? top : left;
-    var maxProp = axis === "y" ? bottom : right;
-    var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len];
-    var startDiff = popperOffsets2[axis] - state.rects.reference[axis];
-    var arrowOffsetParent = getOffsetParent(arrowElement);
-    var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;
-    var centerToReference = endDiff / 2 - startDiff / 2;
-    var min2 = paddingObject[minProp];
-    var max2 = clientSize - arrowRect[len] - paddingObject[maxProp];
-    var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;
-    var offset2 = within(min2, center, max2);
-    var axisProp = axis;
-    state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$);
-  }
-  function effect2(_ref2) {
-    var state = _ref2.state, options = _ref2.options;
-    var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element;
-    if (arrowElement == null) {
-      return;
-    }
-    if (typeof arrowElement === "string") {
-      arrowElement = state.elements.popper.querySelector(arrowElement);
-      if (!arrowElement) {
-        return;
-      }
-    }
-    if (!contains(state.elements.popper, arrowElement)) {
-      return;
-    }
-    state.elements.arrow = arrowElement;
-  }
-  var arrow_default = {
-    name: "arrow",
-    enabled: true,
-    phase: "main",
-    fn: arrow,
-    effect: effect2,
-    requires: ["popperOffsets"],
-    requiresIfExists: ["preventOverflow"]
-  };
-
-  // node_modules/@popperjs/core/lib/utils/getVariation.js
-  function getVariation(placement) {
-    return placement.split("-")[1];
-  }
-
-  // node_modules/@popperjs/core/lib/modifiers/computeStyles.js
-  var unsetSides = {
-    top: "auto",
-    right: "auto",
-    bottom: "auto",
-    left: "auto"
-  };
-  function roundOffsetsByDPR(_ref, win) {
-    var x = _ref.x, y = _ref.y;
-    var dpr = win.devicePixelRatio || 1;
-    return {
-      x: round(x * dpr) / dpr || 0,
-      y: round(y * dpr) / dpr || 0
-    };
-  }
-  function mapToStyles(_ref2) {
-    var _Object$assign2;
-    var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed;
-    var _offsets$x = offsets.x, x = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y = _offsets$y === void 0 ? 0 : _offsets$y;
-    var _ref3 = typeof roundOffsets === "function" ? roundOffsets({
-      x,
-      y
-    }) : {
-      x,
-      y
-    };
-    x = _ref3.x;
-    y = _ref3.y;
-    var hasX = offsets.hasOwnProperty("x");
-    var hasY = offsets.hasOwnProperty("y");
-    var sideX = left;
-    var sideY = top;
-    var win = window;
-    if (adaptive) {
-      var offsetParent = getOffsetParent(popper2);
-      var heightProp = "clientHeight";
-      var widthProp = "clientWidth";
-      if (offsetParent === getWindow(popper2)) {
-        offsetParent = getDocumentElement(popper2);
-        if (getComputedStyle2(offsetParent).position !== "static" && position === "absolute") {
-          heightProp = "scrollHeight";
-          widthProp = "scrollWidth";
-        }
-      }
-      offsetParent = offsetParent;
-      if (placement === top || (placement === left || placement === right) && variation === end) {
-        sideY = bottom;
-        var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : (
-          // $FlowFixMe[prop-missing]
-          offsetParent[heightProp]
-        );
-        y -= offsetY - popperRect.height;
-        y *= gpuAcceleration ? 1 : -1;
-      }
-      if (placement === left || (placement === top || placement === bottom) && variation === end) {
-        sideX = right;
-        var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : (
-          // $FlowFixMe[prop-missing]
-          offsetParent[widthProp]
-        );
-        x -= offsetX - popperRect.width;
-        x *= gpuAcceleration ? 1 : -1;
-      }
-    }
-    var commonStyles = Object.assign({
-      position
-    }, adaptive && unsetSides);
-    var _ref4 = roundOffsets === true ? roundOffsetsByDPR({
-      x,
-      y
-    }, getWindow(popper2)) : {
-      x,
-      y
-    };
-    x = _ref4.x;
-    y = _ref4.y;
-    if (gpuAcceleration) {
-      var _Object$assign;
-      return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign));
-    }
-    return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : "", _Object$assign2[sideX] = hasX ? x + "px" : "", _Object$assign2.transform = "", _Object$assign2));
-  }
-  function computeStyles(_ref5) {
-    var state = _ref5.state, options = _ref5.options;
-    var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;
-    var commonStyles = {
-      placement: getBasePlacement(state.placement),
-      variation: getVariation(state.placement),
-      popper: state.elements.popper,
-      popperRect: state.rects.popper,
-      gpuAcceleration,
-      isFixed: state.options.strategy === "fixed"
-    };
-    if (state.modifiersData.popperOffsets != null) {
-      state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {
-        offsets: state.modifiersData.popperOffsets,
-        position: state.options.strategy,
-        adaptive,
-        roundOffsets
-      })));
-    }
-    if (state.modifiersData.arrow != null) {
-      state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {
-        offsets: state.modifiersData.arrow,
-        position: "absolute",
-        adaptive: false,
-        roundOffsets
-      })));
-    }
-    state.attributes.popper = Object.assign({}, state.attributes.popper, {
-      "data-popper-placement": state.placement
-    });
-  }
-  var computeStyles_default = {
-    name: "computeStyles",
-    enabled: true,
-    phase: "beforeWrite",
-    fn: computeStyles,
-    data: {}
-  };
-
-  // node_modules/@popperjs/core/lib/modifiers/eventListeners.js
-  var passive = {
-    passive: true
-  };
-  function effect3(_ref) {
-    var state = _ref.state, instance = _ref.instance, options = _ref.options;
-    var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize;
-    var window2 = getWindow(state.elements.popper);
-    var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);
-    if (scroll) {
-      scrollParents.forEach(function(scrollParent) {
-        scrollParent.addEventListener("scroll", instance.update, passive);
-      });
-    }
-    if (resize) {
-      window2.addEventListener("resize", instance.update, passive);
-    }
-    return function() {
-      if (scroll) {
-        scrollParents.forEach(function(scrollParent) {
-          scrollParent.removeEventListener("scroll", instance.update, passive);
-        });
-      }
-      if (resize) {
-        window2.removeEventListener("resize", instance.update, passive);
-      }
-    };
-  }
-  var eventListeners_default = {
-    name: "eventListeners",
-    enabled: true,
-    phase: "write",
-    fn: function fn() {
-    },
-    effect: effect3,
-    data: {}
-  };
-
-  // node_modules/@popperjs/core/lib/utils/getOppositePlacement.js
-  var hash = {
-    left: "right",
-    right: "left",
-    bottom: "top",
-    top: "bottom"
-  };
-  function getOppositePlacement(placement) {
-    return placement.replace(/left|right|bottom|top/g, function(matched) {
-      return hash[matched];
-    });
-  }
-
-  // node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js
-  var hash2 = {
-    start: "end",
-    end: "start"
-  };
-  function getOppositeVariationPlacement(placement) {
-    return placement.replace(/start|end/g, function(matched) {
-      return hash2[matched];
-    });
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js
-  function getWindowScroll(node) {
-    var win = getWindow(node);
-    var scrollLeft = win.pageXOffset;
-    var scrollTop = win.pageYOffset;
-    return {
-      scrollLeft,
-      scrollTop
-    };
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js
-  function getWindowScrollBarX(element) {
-    return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js
-  function getViewportRect(element, strategy) {
-    var win = getWindow(element);
-    var html = getDocumentElement(element);
-    var visualViewport = win.visualViewport;
-    var width = html.clientWidth;
-    var height = html.clientHeight;
-    var x = 0;
-    var y = 0;
-    if (visualViewport) {
-      width = visualViewport.width;
-      height = visualViewport.height;
-      var layoutViewport = isLayoutViewport();
-      if (layoutViewport || !layoutViewport && strategy === "fixed") {
-        x = visualViewport.offsetLeft;
-        y = visualViewport.offsetTop;
-      }
-    }
-    return {
-      width,
-      height,
-      x: x + getWindowScrollBarX(element),
-      y
-    };
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js
-  function getDocumentRect(element) {
-    var _element$ownerDocumen;
-    var html = getDocumentElement(element);
-    var winScroll = getWindowScroll(element);
-    var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;
-    var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);
-    var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);
-    var x = -winScroll.scrollLeft + getWindowScrollBarX(element);
-    var y = -winScroll.scrollTop;
-    if (getComputedStyle2(body || html).direction === "rtl") {
-      x += max(html.clientWidth, body ? body.clientWidth : 0) - width;
-    }
-    return {
-      width,
-      height,
-      x,
-      y
-    };
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js
-  function isScrollParent(element) {
-    var _getComputedStyle = getComputedStyle2(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY;
-    return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js
-  function getScrollParent(node) {
-    if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) {
-      return node.ownerDocument.body;
-    }
-    if (isHTMLElement(node) && isScrollParent(node)) {
-      return node;
-    }
-    return getScrollParent(getParentNode(node));
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js
-  function listScrollParents(element, list) {
-    var _element$ownerDocumen;
-    if (list === void 0) {
-      list = [];
-    }
-    var scrollParent = getScrollParent(element);
-    var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);
-    var win = getWindow(scrollParent);
-    var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;
-    var updatedList = list.concat(target);
-    return isBody ? updatedList : (
-      // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here
-      updatedList.concat(listScrollParents(getParentNode(target)))
-    );
-  }
-
-  // node_modules/@popperjs/core/lib/utils/rectToClientRect.js
-  function rectToClientRect(rect) {
-    return Object.assign({}, rect, {
-      left: rect.x,
-      top: rect.y,
-      right: rect.x + rect.width,
-      bottom: rect.y + rect.height
-    });
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js
-  function getInnerBoundingClientRect(element, strategy) {
-    var rect = getBoundingClientRect(element, false, strategy === "fixed");
-    rect.top = rect.top + element.clientTop;
-    rect.left = rect.left + element.clientLeft;
-    rect.bottom = rect.top + element.clientHeight;
-    rect.right = rect.left + element.clientWidth;
-    rect.width = element.clientWidth;
-    rect.height = element.clientHeight;
-    rect.x = rect.left;
-    rect.y = rect.top;
-    return rect;
-  }
-  function getClientRectFromMixedType(element, clippingParent, strategy) {
-    return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
-  }
-  function getClippingParents(element) {
-    var clippingParents2 = listScrollParents(getParentNode(element));
-    var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle2(element).position) >= 0;
-    var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;
-    if (!isElement(clipperElement)) {
-      return [];
-    }
-    return clippingParents2.filter(function(clippingParent) {
-      return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body";
-    });
-  }
-  function getClippingRect(element, boundary, rootBoundary, strategy) {
-    var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary);
-    var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]);
-    var firstClippingParent = clippingParents2[0];
-    var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) {
-      var rect = getClientRectFromMixedType(element, clippingParent, strategy);
-      accRect.top = max(rect.top, accRect.top);
-      accRect.right = min(rect.right, accRect.right);
-      accRect.bottom = min(rect.bottom, accRect.bottom);
-      accRect.left = max(rect.left, accRect.left);
-      return accRect;
-    }, getClientRectFromMixedType(element, firstClippingParent, strategy));
-    clippingRect.width = clippingRect.right - clippingRect.left;
-    clippingRect.height = clippingRect.bottom - clippingRect.top;
-    clippingRect.x = clippingRect.left;
-    clippingRect.y = clippingRect.top;
-    return clippingRect;
-  }
-
-  // node_modules/@popperjs/core/lib/utils/computeOffsets.js
-  function computeOffsets(_ref) {
-    var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement;
-    var basePlacement = placement ? getBasePlacement(placement) : null;
-    var variation = placement ? getVariation(placement) : null;
-    var commonX = reference2.x + reference2.width / 2 - element.width / 2;
-    var commonY = reference2.y + reference2.height / 2 - element.height / 2;
-    var offsets;
-    switch (basePlacement) {
-      case top:
-        offsets = {
-          x: commonX,
-          y: reference2.y - element.height
-        };
-        break;
-      case bottom:
-        offsets = {
-          x: commonX,
-          y: reference2.y + reference2.height
-        };
-        break;
-      case right:
-        offsets = {
-          x: reference2.x + reference2.width,
-          y: commonY
-        };
-        break;
-      case left:
-        offsets = {
-          x: reference2.x - element.width,
-          y: commonY
-        };
-        break;
-      default:
-        offsets = {
-          x: reference2.x,
-          y: reference2.y
-        };
-    }
-    var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;
-    if (mainAxis != null) {
-      var len = mainAxis === "y" ? "height" : "width";
-      switch (variation) {
-        case start:
-          offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2);
-          break;
-        case end:
-          offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2);
-          break;
-        default:
-      }
-    }
-    return offsets;
-  }
-
-  // node_modules/@popperjs/core/lib/utils/detectOverflow.js
-  function detectOverflow(state, options) {
-    if (options === void 0) {
-      options = {};
-    }
-    var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$strategy = _options.strategy, strategy = _options$strategy === void 0 ? state.strategy : _options$strategy, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding;
-    var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
-    var altContext = elementContext === popper ? reference : popper;
-    var popperRect = state.rects.popper;
-    var element = state.elements[altBoundary ? altContext : elementContext];
-    var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);
-    var referenceClientRect = getBoundingClientRect(state.elements.reference);
-    var popperOffsets2 = computeOffsets({
-      reference: referenceClientRect,
-      element: popperRect,
-      strategy: "absolute",
-      placement
-    });
-    var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2));
-    var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect;
-    var overflowOffsets = {
-      top: clippingClientRect.top - elementClientRect.top + paddingObject.top,
-      bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,
-      left: clippingClientRect.left - elementClientRect.left + paddingObject.left,
-      right: elementClientRect.right - clippingClientRect.right + paddingObject.right
-    };
-    var offsetData = state.modifiersData.offset;
-    if (elementContext === popper && offsetData) {
-      var offset2 = offsetData[placement];
-      Object.keys(overflowOffsets).forEach(function(key) {
-        var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;
-        var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x";
-        overflowOffsets[key] += offset2[axis] * multiply;
-      });
-    }
-    return overflowOffsets;
-  }
-
-  // node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js
-  function computeAutoPlacement(state, options) {
-    if (options === void 0) {
-      options = {};
-    }
-    var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;
-    var variation = getVariation(placement);
-    var placements2 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) {
-      return getVariation(placement2) === variation;
-    }) : basePlacements;
-    var allowedPlacements = placements2.filter(function(placement2) {
-      return allowedAutoPlacements.indexOf(placement2) >= 0;
-    });
-    if (allowedPlacements.length === 0) {
-      allowedPlacements = placements2;
-    }
-    var overflows = allowedPlacements.reduce(function(acc, placement2) {
-      acc[placement2] = detectOverflow(state, {
-        placement: placement2,
-        boundary,
-        rootBoundary,
-        padding
-      })[getBasePlacement(placement2)];
-      return acc;
-    }, {});
-    return Object.keys(overflows).sort(function(a, b) {
-      return overflows[a] - overflows[b];
-    });
-  }
-
-  // node_modules/@popperjs/core/lib/modifiers/flip.js
-  function getExpandedFallbackPlacements(placement) {
-    if (getBasePlacement(placement) === auto) {
-      return [];
-    }
-    var oppositePlacement = getOppositePlacement(placement);
-    return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];
-  }
-  function flip(_ref) {
-    var state = _ref.state, options = _ref.options, name = _ref.name;
-    if (state.modifiersData[name]._skip) {
-      return;
-    }
-    var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements;
-    var preferredPlacement = state.options.placement;
-    var basePlacement = getBasePlacement(preferredPlacement);
-    var isBasePlacement = basePlacement === preferredPlacement;
-    var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));
-    var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) {
-      return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, {
-        placement: placement2,
-        boundary,
-        rootBoundary,
-        padding,
-        flipVariations,
-        allowedAutoPlacements
-      }) : placement2);
-    }, []);
-    var referenceRect = state.rects.reference;
-    var popperRect = state.rects.popper;
-    var checksMap = /* @__PURE__ */ new Map();
-    var makeFallbackChecks = true;
-    var firstFittingPlacement = placements2[0];
-    for (var i = 0; i < placements2.length; i++) {
-      var placement = placements2[i];
-      var _basePlacement = getBasePlacement(placement);
-      var isStartVariation = getVariation(placement) === start;
-      var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;
-      var len = isVertical ? "width" : "height";
-      var overflow = detectOverflow(state, {
-        placement,
-        boundary,
-        rootBoundary,
-        altBoundary,
-        padding
-      });
-      var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;
-      if (referenceRect[len] > popperRect[len]) {
-        mainVariationSide = getOppositePlacement(mainVariationSide);
-      }
-      var altVariationSide = getOppositePlacement(mainVariationSide);
-      var checks = [];
-      if (checkMainAxis) {
-        checks.push(overflow[_basePlacement] <= 0);
-      }
-      if (checkAltAxis) {
-        checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);
-      }
-      if (checks.every(function(check) {
-        return check;
-      })) {
-        firstFittingPlacement = placement;
-        makeFallbackChecks = false;
-        break;
-      }
-      checksMap.set(placement, checks);
-    }
-    if (makeFallbackChecks) {
-      var numberOfChecks = flipVariations ? 3 : 1;
-      var _loop = function _loop2(_i2) {
-        var fittingPlacement = placements2.find(function(placement2) {
-          var checks2 = checksMap.get(placement2);
-          if (checks2) {
-            return checks2.slice(0, _i2).every(function(check) {
-              return check;
-            });
-          }
-        });
-        if (fittingPlacement) {
-          firstFittingPlacement = fittingPlacement;
-          return "break";
-        }
-      };
-      for (var _i = numberOfChecks; _i > 0; _i--) {
-        var _ret = _loop(_i);
-        if (_ret === "break")
-          break;
-      }
-    }
-    if (state.placement !== firstFittingPlacement) {
-      state.modifiersData[name]._skip = true;
-      state.placement = firstFittingPlacement;
-      state.reset = true;
-    }
-  }
-  var flip_default = {
-    name: "flip",
-    enabled: true,
-    phase: "main",
-    fn: flip,
-    requiresIfExists: ["offset"],
-    data: {
-      _skip: false
-    }
-  };
-
-  // node_modules/@popperjs/core/lib/modifiers/hide.js
-  function getSideOffsets(overflow, rect, preventedOffsets) {
-    if (preventedOffsets === void 0) {
-      preventedOffsets = {
-        x: 0,
-        y: 0
-      };
-    }
-    return {
-      top: overflow.top - rect.height - preventedOffsets.y,
-      right: overflow.right - rect.width + preventedOffsets.x,
-      bottom: overflow.bottom - rect.height + preventedOffsets.y,
-      left: overflow.left - rect.width - preventedOffsets.x
-    };
-  }
-  function isAnySideFullyClipped(overflow) {
-    return [top, right, bottom, left].some(function(side) {
-      return overflow[side] >= 0;
-    });
-  }
-  function hide(_ref) {
-    var state = _ref.state, name = _ref.name;
-    var referenceRect = state.rects.reference;
-    var popperRect = state.rects.popper;
-    var preventedOffsets = state.modifiersData.preventOverflow;
-    var referenceOverflow = detectOverflow(state, {
-      elementContext: "reference"
-    });
-    var popperAltOverflow = detectOverflow(state, {
-      altBoundary: true
-    });
-    var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);
-    var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);
-    var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);
-    var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);
-    state.modifiersData[name] = {
-      referenceClippingOffsets,
-      popperEscapeOffsets,
-      isReferenceHidden,
-      hasPopperEscaped
-    };
-    state.attributes.popper = Object.assign({}, state.attributes.popper, {
-      "data-popper-reference-hidden": isReferenceHidden,
-      "data-popper-escaped": hasPopperEscaped
-    });
-  }
-  var hide_default = {
-    name: "hide",
-    enabled: true,
-    phase: "main",
-    requiresIfExists: ["preventOverflow"],
-    fn: hide
-  };
-
-  // node_modules/@popperjs/core/lib/modifiers/offset.js
-  function distanceAndSkiddingToXY(placement, rects, offset2) {
-    var basePlacement = getBasePlacement(placement);
-    var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;
-    var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, {
-      placement
-    })) : offset2, skidding = _ref[0], distance = _ref[1];
-    skidding = skidding || 0;
-    distance = (distance || 0) * invertDistance;
-    return [left, right].indexOf(basePlacement) >= 0 ? {
-      x: distance,
-      y: skidding
-    } : {
-      x: skidding,
-      y: distance
-    };
-  }
-  function offset(_ref2) {
-    var state = _ref2.state, options = _ref2.options, name = _ref2.name;
-    var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset;
-    var data = placements.reduce(function(acc, placement) {
-      acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2);
-      return acc;
-    }, {});
-    var _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y;
-    if (state.modifiersData.popperOffsets != null) {
-      state.modifiersData.popperOffsets.x += x;
-      state.modifiersData.popperOffsets.y += y;
-    }
-    state.modifiersData[name] = data;
-  }
-  var offset_default = {
-    name: "offset",
-    enabled: true,
-    phase: "main",
-    requires: ["popperOffsets"],
-    fn: offset
-  };
-
-  // node_modules/@popperjs/core/lib/modifiers/popperOffsets.js
-  function popperOffsets(_ref) {
-    var state = _ref.state, name = _ref.name;
-    state.modifiersData[name] = computeOffsets({
-      reference: state.rects.reference,
-      element: state.rects.popper,
-      strategy: "absolute",
-      placement: state.placement
-    });
-  }
-  var popperOffsets_default = {
-    name: "popperOffsets",
-    enabled: true,
-    phase: "read",
-    fn: popperOffsets,
-    data: {}
-  };
-
-  // node_modules/@popperjs/core/lib/utils/getAltAxis.js
-  function getAltAxis(axis) {
-    return axis === "x" ? "y" : "x";
-  }
-
-  // node_modules/@popperjs/core/lib/modifiers/preventOverflow.js
-  function preventOverflow(_ref) {
-    var state = _ref.state, options = _ref.options, name = _ref.name;
-    var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;
-    var overflow = detectOverflow(state, {
-      boundary,
-      rootBoundary,
-      padding,
-      altBoundary
-    });
-    var basePlacement = getBasePlacement(state.placement);
-    var variation = getVariation(state.placement);
-    var isBasePlacement = !variation;
-    var mainAxis = getMainAxisFromPlacement(basePlacement);
-    var altAxis = getAltAxis(mainAxis);
-    var popperOffsets2 = state.modifiersData.popperOffsets;
-    var referenceRect = state.rects.reference;
-    var popperRect = state.rects.popper;
-    var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, {
-      placement: state.placement
-    })) : tetherOffset;
-    var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? {
-      mainAxis: tetherOffsetValue,
-      altAxis: tetherOffsetValue
-    } : Object.assign({
-      mainAxis: 0,
-      altAxis: 0
-    }, tetherOffsetValue);
-    var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;
-    var data = {
-      x: 0,
-      y: 0
-    };
-    if (!popperOffsets2) {
-      return;
-    }
-    if (checkMainAxis) {
-      var _offsetModifierState$;
-      var mainSide = mainAxis === "y" ? top : left;
-      var altSide = mainAxis === "y" ? bottom : right;
-      var len = mainAxis === "y" ? "height" : "width";
-      var offset2 = popperOffsets2[mainAxis];
-      var min2 = offset2 + overflow[mainSide];
-      var max2 = offset2 - overflow[altSide];
-      var additive = tether ? -popperRect[len] / 2 : 0;
-      var minLen = variation === start ? referenceRect[len] : popperRect[len];
-      var maxLen = variation === start ? -popperRect[len] : -referenceRect[len];
-      var arrowElement = state.elements.arrow;
-      var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {
-        width: 0,
-        height: 0
-      };
-      var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject();
-      var arrowPaddingMin = arrowPaddingObject[mainSide];
-      var arrowPaddingMax = arrowPaddingObject[altSide];
-      var arrowLen = within(0, referenceRect[len], arrowRect[len]);
-      var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;
-      var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;
-      var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);
-      var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;
-      var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;
-      var tetherMin = offset2 + minOffset - offsetModifierValue - clientOffset;
-      var tetherMax = offset2 + maxOffset - offsetModifierValue;
-      var preventedOffset = within(tether ? min(min2, tetherMin) : min2, offset2, tether ? max(max2, tetherMax) : max2);
-      popperOffsets2[mainAxis] = preventedOffset;
-      data[mainAxis] = preventedOffset - offset2;
-    }
-    if (checkAltAxis) {
-      var _offsetModifierState$2;
-      var _mainSide = mainAxis === "x" ? top : left;
-      var _altSide = mainAxis === "x" ? bottom : right;
-      var _offset = popperOffsets2[altAxis];
-      var _len = altAxis === "y" ? "height" : "width";
-      var _min = _offset + overflow[_mainSide];
-      var _max = _offset - overflow[_altSide];
-      var isOriginSide = [top, left].indexOf(basePlacement) !== -1;
-      var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;
-      var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;
-      var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;
-      var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);
-      popperOffsets2[altAxis] = _preventedOffset;
-      data[altAxis] = _preventedOffset - _offset;
-    }
-    state.modifiersData[name] = data;
-  }
-  var preventOverflow_default = {
-    name: "preventOverflow",
-    enabled: true,
-    phase: "main",
-    fn: preventOverflow,
-    requiresIfExists: ["offset"]
-  };
-
-  // node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js
-  function getHTMLElementScroll(element) {
-    return {
-      scrollLeft: element.scrollLeft,
-      scrollTop: element.scrollTop
-    };
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js
-  function getNodeScroll(node) {
-    if (node === getWindow(node) || !isHTMLElement(node)) {
-      return getWindowScroll(node);
-    } else {
-      return getHTMLElementScroll(node);
-    }
-  }
-
-  // node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js
-  function isElementScaled(element) {
-    var rect = element.getBoundingClientRect();
-    var scaleX = round(rect.width) / element.offsetWidth || 1;
-    var scaleY = round(rect.height) / element.offsetHeight || 1;
-    return scaleX !== 1 || scaleY !== 1;
-  }
-  function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
-    if (isFixed === void 0) {
-      isFixed = false;
-    }
-    var isOffsetParentAnElement = isHTMLElement(offsetParent);
-    var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);
-    var documentElement = getDocumentElement(offsetParent);
-    var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);
-    var scroll = {
-      scrollLeft: 0,
-      scrollTop: 0
-    };
-    var offsets = {
-      x: 0,
-      y: 0
-    };
-    if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
-      if (getNodeName(offsetParent) !== "body" || // https://github.com/popperjs/popper-core/issues/1078
-      isScrollParent(documentElement)) {
-        scroll = getNodeScroll(offsetParent);
-      }
-      if (isHTMLElement(offsetParent)) {
-        offsets = getBoundingClientRect(offsetParent, true);
-        offsets.x += offsetParent.clientLeft;
-        offsets.y += offsetParent.clientTop;
-      } else if (documentElement) {
-        offsets.x = getWindowScrollBarX(documentElement);
-      }
-    }
-    return {
-      x: rect.left + scroll.scrollLeft - offsets.x,
-      y: rect.top + scroll.scrollTop - offsets.y,
-      width: rect.width,
-      height: rect.height
-    };
-  }
-
-  // node_modules/@popperjs/core/lib/utils/orderModifiers.js
-  function order(modifiers) {
-    var map = /* @__PURE__ */ new Map();
-    var visited = /* @__PURE__ */ new Set();
-    var result = [];
-    modifiers.forEach(function(modifier) {
-      map.set(modifier.name, modifier);
-    });
-    function sort(modifier) {
-      visited.add(modifier.name);
-      var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);
-      requires.forEach(function(dep) {
-        if (!visited.has(dep)) {
-          var depModifier = map.get(dep);
-          if (depModifier) {
-            sort(depModifier);
-          }
-        }
-      });
-      result.push(modifier);
-    }
-    modifiers.forEach(function(modifier) {
-      if (!visited.has(modifier.name)) {
-        sort(modifier);
-      }
-    });
-    return result;
-  }
-  function orderModifiers(modifiers) {
-    var orderedModifiers = order(modifiers);
-    return modifierPhases.reduce(function(acc, phase) {
-      return acc.concat(orderedModifiers.filter(function(modifier) {
-        return modifier.phase === phase;
-      }));
-    }, []);
-  }
-
-  // node_modules/@popperjs/core/lib/utils/debounce.js
-  function debounce(fn2) {
-    var pending;
-    return function() {
-      if (!pending) {
-        pending = new Promise(function(resolve) {
-          Promise.resolve().then(function() {
-            pending = void 0;
-            resolve(fn2());
-          });
-        });
-      }
-      return pending;
-    };
-  }
-
-  // node_modules/@popperjs/core/lib/utils/mergeByName.js
-  function mergeByName(modifiers) {
-    var merged = modifiers.reduce(function(merged2, current) {
-      var existing = merged2[current.name];
-      merged2[current.name] = existing ? Object.assign({}, existing, current, {
-        options: Object.assign({}, existing.options, current.options),
-        data: Object.assign({}, existing.data, current.data)
-      }) : current;
-      return merged2;
-    }, {});
-    return Object.keys(merged).map(function(key) {
-      return merged[key];
-    });
-  }
-
-  // node_modules/@popperjs/core/lib/createPopper.js
-  var DEFAULT_OPTIONS = {
-    placement: "bottom",
-    modifiers: [],
-    strategy: "absolute"
-  };
-  function areValidElements() {
-    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
-      args[_key] = arguments[_key];
-    }
-    return !args.some(function(element) {
-      return !(element && typeof element.getBoundingClientRect === "function");
-    });
-  }
-  function popperGenerator(generatorOptions) {
-    if (generatorOptions === void 0) {
-      generatorOptions = {};
-    }
-    var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers3 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;
-    return function createPopper4(reference2, popper2, options) {
-      if (options === void 0) {
-        options = defaultOptions;
-      }
-      var state = {
-        placement: "bottom",
-        orderedModifiers: [],
-        options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),
-        modifiersData: {},
-        elements: {
-          reference: reference2,
-          popper: popper2
-        },
-        attributes: {},
-        styles: {}
-      };
-      var effectCleanupFns = [];
-      var isDestroyed = false;
-      var instance = {
-        state,
-        setOptions: function setOptions(setOptionsAction) {
-          var options2 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction;
-          cleanupModifierEffects();
-          state.options = Object.assign({}, defaultOptions, state.options, options2);
-          state.scrollParents = {
-            reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [],
-            popper: listScrollParents(popper2)
-          };
-          var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers3, state.options.modifiers)));
-          state.orderedModifiers = orderedModifiers.filter(function(m) {
-            return m.enabled;
-          });
-          runModifierEffects();
-          return instance.update();
-        },
-        // Sync update – it will always be executed, even if not necessary. This
-        // is useful for low frequency updates where sync behavior simplifies the
-        // logic.
-        // For high frequency updates (e.g. `resize` and `scroll` events), always
-        // prefer the async Popper#update method
-        forceUpdate: function forceUpdate() {
-          if (isDestroyed) {
-            return;
-          }
-          var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper;
-          if (!areValidElements(reference3, popper3)) {
-            return;
-          }
-          state.rects = {
-            reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"),
-            popper: getLayoutRect(popper3)
-          };
-          state.reset = false;
-          state.placement = state.options.placement;
-          state.orderedModifiers.forEach(function(modifier) {
-            return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);
-          });
-          for (var index = 0; index < state.orderedModifiers.length; index++) {
-            if (state.reset === true) {
-              state.reset = false;
-              index = -1;
-              continue;
-            }
-            var _state$orderedModifie = state.orderedModifiers[index], fn2 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name;
-            if (typeof fn2 === "function") {
-              state = fn2({
-                state,
-                options: _options,
-                name,
-                instance
-              }) || state;
-            }
-          }
-        },
-        // Async and optimistically optimized update – it will not be executed if
-        // not necessary (debounced to run at most once-per-tick)
-        update: debounce(function() {
-          return new Promise(function(resolve) {
-            instance.forceUpdate();
-            resolve(state);
-          });
-        }),
-        destroy: function destroy() {
-          cleanupModifierEffects();
-          isDestroyed = true;
-        }
-      };
-      if (!areValidElements(reference2, popper2)) {
-        return instance;
-      }
-      instance.setOptions(options).then(function(state2) {
-        if (!isDestroyed && options.onFirstUpdate) {
-          options.onFirstUpdate(state2);
-        }
-      });
-      function runModifierEffects() {
-        state.orderedModifiers.forEach(function(_ref) {
-          var name = _ref.name, _ref$options = _ref.options, options2 = _ref$options === void 0 ? {} : _ref$options, effect4 = _ref.effect;
-          if (typeof effect4 === "function") {
-            var cleanupFn = effect4({
-              state,
-              name,
-              instance,
-              options: options2
-            });
-            var noopFn = function noopFn2() {
-            };
-            effectCleanupFns.push(cleanupFn || noopFn);
-          }
-        });
-      }
-      function cleanupModifierEffects() {
-        effectCleanupFns.forEach(function(fn2) {
-          return fn2();
-        });
-        effectCleanupFns = [];
-      }
-      return instance;
-    };
-  }
-  var createPopper = /* @__PURE__ */ popperGenerator();
-
-  // node_modules/@popperjs/core/lib/popper-lite.js
-  var defaultModifiers = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default];
-  var createPopper2 = /* @__PURE__ */ popperGenerator({
-    defaultModifiers
-  });
-
-  // node_modules/@popperjs/core/lib/popper.js
-  var defaultModifiers2 = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default, offset_default, flip_default, preventOverflow_default, arrow_default, hide_default];
-  var createPopper3 = /* @__PURE__ */ popperGenerator({
-    defaultModifiers: defaultModifiers2
-  });
-
-  // node_modules/bootstrap/dist/js/bootstrap.esm.js
-  var elementMap = /* @__PURE__ */ new Map();
-  var Data = {
-    set(element, key, instance) {
-      if (!elementMap.has(element)) {
-        elementMap.set(element, /* @__PURE__ */ new Map());
-      }
-      const instanceMap = elementMap.get(element);
-      if (!instanceMap.has(key) && instanceMap.size !== 0) {
-        console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
-        return;
-      }
-      instanceMap.set(key, instance);
-    },
-    get(element, key) {
-      if (elementMap.has(element)) {
-        return elementMap.get(element).get(key) || null;
-      }
-      return null;
-    },
-    remove(element, key) {
-      if (!elementMap.has(element)) {
-        return;
-      }
-      const instanceMap = elementMap.get(element);
-      instanceMap.delete(key);
-      if (instanceMap.size === 0) {
-        elementMap.delete(element);
-      }
-    }
-  };
-  var MAX_UID = 1e6;
-  var MILLISECONDS_MULTIPLIER = 1e3;
-  var TRANSITION_END = "transitionend";
-  var parseSelector = (selector) => {
-    if (selector && window.CSS && window.CSS.escape) {
-      selector = selector.replace(/#([^\s"#']+)/g, (match, id) => `#${CSS.escape(id)}`);
-    }
-    return selector;
-  };
-  var toType = (object) => {
-    if (object === null || object === void 0) {
-      return `${object}`;
-    }
-    return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase();
-  };
-  var getUID = (prefix) => {
-    do {
-      prefix += Math.floor(Math.random() * MAX_UID);
-    } while (document.getElementById(prefix));
-    return prefix;
-  };
-  var getTransitionDurationFromElement = (element) => {
-    if (!element) {
-      return 0;
-    }
-    let {
-      transitionDuration,
-      transitionDelay
-    } = window.getComputedStyle(element);
-    const floatTransitionDuration = Number.parseFloat(transitionDuration);
-    const floatTransitionDelay = Number.parseFloat(transitionDelay);
-    if (!floatTransitionDuration && !floatTransitionDelay) {
-      return 0;
-    }
-    transitionDuration = transitionDuration.split(",")[0];
-    transitionDelay = transitionDelay.split(",")[0];
-    return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
-  };
-  var triggerTransitionEnd = (element) => {
-    element.dispatchEvent(new Event(TRANSITION_END));
-  };
-  var isElement2 = (object) => {
-    if (!object || typeof object !== "object") {
-      return false;
-    }
-    if (typeof object.jquery !== "undefined") {
-      object = object[0];
-    }
-    return typeof object.nodeType !== "undefined";
-  };
-  var getElement = (object) => {
-    if (isElement2(object)) {
-      return object.jquery ? object[0] : object;
-    }
-    if (typeof object === "string" && object.length > 0) {
-      return document.querySelector(parseSelector(object));
-    }
-    return null;
-  };
-  var isVisible = (element) => {
-    if (!isElement2(element) || element.getClientRects().length === 0) {
-      return false;
-    }
-    const elementIsVisible = getComputedStyle(element).getPropertyValue("visibility") === "visible";
-    const closedDetails = element.closest("details:not([open])");
-    if (!closedDetails) {
-      return elementIsVisible;
-    }
-    if (closedDetails !== element) {
-      const summary = element.closest("summary");
-      if (summary && summary.parentNode !== closedDetails) {
-        return false;
-      }
-      if (summary === null) {
-        return false;
-      }
-    }
-    return elementIsVisible;
-  };
-  var isDisabled = (element) => {
-    if (!element || element.nodeType !== Node.ELEMENT_NODE) {
-      return true;
-    }
-    if (element.classList.contains("disabled")) {
-      return true;
-    }
-    if (typeof element.disabled !== "undefined") {
-      return element.disabled;
-    }
-    return element.hasAttribute("disabled") && element.getAttribute("disabled") !== "false";
-  };
-  var findShadowRoot = (element) => {
-    if (!document.documentElement.attachShadow) {
-      return null;
-    }
-    if (typeof element.getRootNode === "function") {
-      const root = element.getRootNode();
-      return root instanceof ShadowRoot ? root : null;
-    }
-    if (element instanceof ShadowRoot) {
-      return element;
-    }
-    if (!element.parentNode) {
-      return null;
-    }
-    return findShadowRoot(element.parentNode);
-  };
-  var noop = () => {
-  };
-  var reflow = (element) => {
-    element.offsetHeight;
-  };
-  var getjQuery = () => {
-    if (window.jQuery && !document.body.hasAttribute("data-bs-no-jquery")) {
-      return window.jQuery;
-    }
-    return null;
-  };
-  var DOMContentLoadedCallbacks = [];
-  var onDOMContentLoaded = (callback) => {
-    if (document.readyState === "loading") {
-      if (!DOMContentLoadedCallbacks.length) {
-        document.addEventListener("DOMContentLoaded", () => {
-          for (const callback2 of DOMContentLoadedCallbacks) {
-            callback2();
-          }
-        });
-      }
-      DOMContentLoadedCallbacks.push(callback);
-    } else {
-      callback();
-    }
-  };
-  var isRTL = () => document.documentElement.dir === "rtl";
-  var defineJQueryPlugin = (plugin) => {
-    onDOMContentLoaded(() => {
-      const $4 = getjQuery();
-      if ($4) {
-        const name = plugin.NAME;
-        const JQUERY_NO_CONFLICT = $4.fn[name];
-        $4.fn[name] = plugin.jQueryInterface;
-        $4.fn[name].Constructor = plugin;
-        $4.fn[name].noConflict = () => {
-          $4.fn[name] = JQUERY_NO_CONFLICT;
-          return plugin.jQueryInterface;
-        };
-      }
-    });
-  };
-  var execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {
-    return typeof possibleCallback === "function" ? possibleCallback(...args) : defaultValue;
-  };
-  var executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
-    if (!waitForTransition) {
-      execute(callback);
-      return;
-    }
-    const durationPadding = 5;
-    const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
-    let called = false;
-    const handler = ({
-      target
-    }) => {
-      if (target !== transitionElement) {
-        return;
-      }
-      called = true;
-      transitionElement.removeEventListener(TRANSITION_END, handler);
-      execute(callback);
-    };
-    transitionElement.addEventListener(TRANSITION_END, handler);
-    setTimeout(() => {
-      if (!called) {
-        triggerTransitionEnd(transitionElement);
-      }
-    }, emulatedDuration);
-  };
-  var getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
-    const listLength = list.length;
-    let index = list.indexOf(activeElement);
-    if (index === -1) {
-      return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];
-    }
-    index += shouldGetNext ? 1 : -1;
-    if (isCycleAllowed) {
-      index = (index + listLength) % listLength;
-    }
-    return list[Math.max(0, Math.min(index, listLength - 1))];
-  };
-  var namespaceRegex = /[^.]*(?=\..*)\.|.*/;
-  var stripNameRegex = /\..*/;
-  var stripUidRegex = /::\d+$/;
-  var eventRegistry = {};
-  var uidEvent = 1;
-  var customEvents = {
-    mouseenter: "mouseover",
-    mouseleave: "mouseout"
-  };
-  var nativeEvents = /* @__PURE__ */ new Set(["click", "dblclick", "mouseup", "mousedown", "contextmenu", "mousewheel", "DOMMouseScroll", "mouseover", "mouseout", "mousemove", "selectstart", "selectend", "keydown", "keypress", "keyup", "orientationchange", "touchstart", "touchmove", "touchend", "touchcancel", "pointerdown", "pointermove", "pointerup", "pointerleave", "pointercancel", "gesturestart", "gesturechange", "gestureend", "focus", "blur", "change", "reset", "select", "submit", "focusin", "focusout", "load", "unload", "beforeunload", "resize", "move", "DOMContentLoaded", "readystatechange", "error", "abort", "scroll"]);
-  function makeEventUid(element, uid) {
-    return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
-  }
-  function getElementEvents(element) {
-    const uid = makeEventUid(element);
-    element.uidEvent = uid;
-    eventRegistry[uid] = eventRegistry[uid] || {};
-    return eventRegistry[uid];
-  }
-  function bootstrapHandler(element, fn2) {
-    return function handler(event) {
-      hydrateObj(event, {
-        delegateTarget: element
-      });
-      if (handler.oneOff) {
-        EventHandler.off(element, event.type, fn2);
-      }
-      return fn2.apply(element, [event]);
-    };
-  }
-  function bootstrapDelegationHandler(element, selector, fn2) {
-    return function handler(event) {
-      const domElements = element.querySelectorAll(selector);
-      for (let {
-        target
-      } = event; target && target !== this; target = target.parentNode) {
-        for (const domElement of domElements) {
-          if (domElement !== target) {
-            continue;
-          }
-          hydrateObj(event, {
-            delegateTarget: target
-          });
-          if (handler.oneOff) {
-            EventHandler.off(element, event.type, selector, fn2);
-          }
-          return fn2.apply(target, [event]);
-        }
-      }
-    };
-  }
-  function findHandler(events, callable, delegationSelector = null) {
-    return Object.values(events).find((event) => event.callable === callable && event.delegationSelector === delegationSelector);
-  }
-  function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
-    const isDelegated = typeof handler === "string";
-    const callable = isDelegated ? delegationFunction : handler || delegationFunction;
-    let typeEvent = getTypeEvent(originalTypeEvent);
-    if (!nativeEvents.has(typeEvent)) {
-      typeEvent = originalTypeEvent;
-    }
-    return [isDelegated, callable, typeEvent];
-  }
-  function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {
-    if (typeof originalTypeEvent !== "string" || !element) {
-      return;
-    }
-    let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
-    if (originalTypeEvent in customEvents) {
-      const wrapFunction = (fn3) => {
-        return function(event) {
-          if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
-            return fn3.call(this, event);
-          }
-        };
-      };
-      callable = wrapFunction(callable);
-    }
-    const events = getElementEvents(element);
-    const handlers = events[typeEvent] || (events[typeEvent] = {});
-    const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);
-    if (previousFunction) {
-      previousFunction.oneOff = previousFunction.oneOff && oneOff;
-      return;
-    }
-    const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ""));
-    const fn2 = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);
-    fn2.delegationSelector = isDelegated ? handler : null;
-    fn2.callable = callable;
-    fn2.oneOff = oneOff;
-    fn2.uidEvent = uid;
-    handlers[uid] = fn2;
-    element.addEventListener(typeEvent, fn2, isDelegated);
-  }
-  function removeHandler(element, events, typeEvent, handler, delegationSelector) {
-    const fn2 = findHandler(events[typeEvent], handler, delegationSelector);
-    if (!fn2) {
-      return;
-    }
-    element.removeEventListener(typeEvent, fn2, Boolean(delegationSelector));
-    delete events[typeEvent][fn2.uidEvent];
-  }
-  function removeNamespacedHandlers(element, events, typeEvent, namespace) {
-    const storeElementEvent = events[typeEvent] || {};
-    for (const [handlerKey, event] of Object.entries(storeElementEvent)) {
-      if (handlerKey.includes(namespace)) {
-        removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
-      }
-    }
-  }
-  function getTypeEvent(event) {
-    event = event.replace(stripNameRegex, "");
-    return customEvents[event] || event;
-  }
-  var EventHandler = {
-    on(element, event, handler, delegationFunction) {
-      addHandler(element, event, handler, delegationFunction, false);
-    },
-    one(element, event, handler, delegationFunction) {
-      addHandler(element, event, handler, delegationFunction, true);
-    },
-    off(element, originalTypeEvent, handler, delegationFunction) {
-      if (typeof originalTypeEvent !== "string" || !element) {
-        return;
-      }
-      const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
-      const inNamespace = typeEvent !== originalTypeEvent;
-      const events = getElementEvents(element);
-      const storeElementEvent = events[typeEvent] || {};
-      const isNamespace = originalTypeEvent.startsWith(".");
-      if (typeof callable !== "undefined") {
-        if (!Object.keys(storeElementEvent).length) {
-          return;
-        }
-        removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);
-        return;
-      }
-      if (isNamespace) {
-        for (const elementEvent of Object.keys(events)) {
-          removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
-        }
-      }
-      for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {
-        const handlerKey = keyHandlers.replace(stripUidRegex, "");
-        if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
-          removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
-        }
-      }
-    },
-    trigger(element, event, args) {
-      if (typeof event !== "string" || !element) {
-        return null;
-      }
-      const $4 = getjQuery();
-      const typeEvent = getTypeEvent(event);
-      const inNamespace = event !== typeEvent;
-      let jQueryEvent = null;
-      let bubbles = true;
-      let nativeDispatch = true;
-      let defaultPrevented = false;
-      if (inNamespace && $4) {
-        jQueryEvent = $4.Event(event, args);
-        $4(element).trigger(jQueryEvent);
-        bubbles = !jQueryEvent.isPropagationStopped();
-        nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
-        defaultPrevented = jQueryEvent.isDefaultPrevented();
-      }
-      const evt = hydrateObj(new Event(event, {
-        bubbles,
-        cancelable: true
-      }), args);
-      if (defaultPrevented) {
-        evt.preventDefault();
-      }
-      if (nativeDispatch) {
-        element.dispatchEvent(evt);
-      }
-      if (evt.defaultPrevented && jQueryEvent) {
-        jQueryEvent.preventDefault();
-      }
-      return evt;
-    }
-  };
-  function hydrateObj(obj, meta = {}) {
-    for (const [key, value] of Object.entries(meta)) {
-      try {
-        obj[key] = value;
-      } catch (_unused) {
-        Object.defineProperty(obj, key, {
-          configurable: true,
-          get() {
-            return value;
-          }
-        });
-      }
-    }
-    return obj;
-  }
-  function normalizeData(value) {
-    if (value === "true") {
-      return true;
-    }
-    if (value === "false") {
-      return false;
-    }
-    if (value === Number(value).toString()) {
-      return Number(value);
-    }
-    if (value === "" || value === "null") {
-      return null;
-    }
-    if (typeof value !== "string") {
-      return value;
-    }
-    try {
-      return JSON.parse(decodeURIComponent(value));
-    } catch (_unused) {
-      return value;
-    }
-  }
-  function normalizeDataKey(key) {
-    return key.replace(/[A-Z]/g, (chr) => `-${chr.toLowerCase()}`);
-  }
-  var Manipulator = {
-    setDataAttribute(element, key, value) {
-      element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
-    },
-    removeDataAttribute(element, key) {
-      element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
-    },
-    getDataAttributes(element) {
-      if (!element) {
-        return {};
-      }
-      const attributes = {};
-      const bsKeys = Object.keys(element.dataset).filter((key) => key.startsWith("bs") && !key.startsWith("bsConfig"));
-      for (const key of bsKeys) {
-        let pureKey = key.replace(/^bs/, "");
-        pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
-        attributes[pureKey] = normalizeData(element.dataset[key]);
-      }
-      return attributes;
-    },
-    getDataAttribute(element, key) {
-      return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
-    }
-  };
-  var Config = class {
-    // Getters
-    static get Default() {
-      return {};
-    }
-    static get DefaultType() {
-      return {};
-    }
-    static get NAME() {
-      throw new Error('You have to implement the static method "NAME", for each component!');
-    }
-    _getConfig(config) {
-      config = this._mergeConfigObj(config);
-      config = this._configAfterMerge(config);
-      this._typeCheckConfig(config);
-      return config;
-    }
-    _configAfterMerge(config) {
-      return config;
-    }
-    _mergeConfigObj(config, element) {
-      const jsonConfig = isElement2(element) ? Manipulator.getDataAttribute(element, "config") : {};
-      return __spreadValues(__spreadValues(__spreadValues(__spreadValues({}, this.constructor.Default), typeof jsonConfig === "object" ? jsonConfig : {}), isElement2(element) ? Manipulator.getDataAttributes(element) : {}), typeof config === "object" ? config : {});
-    }
-    _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
-      for (const [property, expectedTypes] of Object.entries(configTypes)) {
-        const value = config[property];
-        const valueType = isElement2(value) ? "element" : toType(value);
-        if (!new RegExp(expectedTypes).test(valueType)) {
-          throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
-        }
-      }
-    }
-  };
-  var VERSION = "5.3.3";
-  var BaseComponent = class extends Config {
-    constructor(element, config) {
-      super();
-      element = getElement(element);
-      if (!element) {
-        return;
-      }
-      this._element = element;
-      this._config = this._getConfig(config);
-      Data.set(this._element, this.constructor.DATA_KEY, this);
-    }
-    // Public
-    dispose() {
-      Data.remove(this._element, this.constructor.DATA_KEY);
-      EventHandler.off(this._element, this.constructor.EVENT_KEY);
-      for (const propertyName of Object.getOwnPropertyNames(this)) {
-        this[propertyName] = null;
-      }
-    }
-    _queueCallback(callback, element, isAnimated = true) {
-      executeAfterTransition(callback, element, isAnimated);
-    }
-    _getConfig(config) {
-      config = this._mergeConfigObj(config, this._element);
-      config = this._configAfterMerge(config);
-      this._typeCheckConfig(config);
-      return config;
-    }
-    // Static
-    static getInstance(element) {
-      return Data.get(getElement(element), this.DATA_KEY);
-    }
-    static getOrCreateInstance(element, config = {}) {
-      return this.getInstance(element) || new this(element, typeof config === "object" ? config : null);
-    }
-    static get VERSION() {
-      return VERSION;
-    }
-    static get DATA_KEY() {
-      return `bs.${this.NAME}`;
-    }
-    static get EVENT_KEY() {
-      return `.${this.DATA_KEY}`;
-    }
-    static eventName(name) {
-      return `${name}${this.EVENT_KEY}`;
-    }
-  };
-  var getSelector = (element) => {
-    let selector = element.getAttribute("data-bs-target");
-    if (!selector || selector === "#") {
-      let hrefAttribute = element.getAttribute("href");
-      if (!hrefAttribute || !hrefAttribute.includes("#") && !hrefAttribute.startsWith(".")) {
-        return null;
-      }
-      if (hrefAttribute.includes("#") && !hrefAttribute.startsWith("#")) {
-        hrefAttribute = `#${hrefAttribute.split("#")[1]}`;
-      }
-      selector = hrefAttribute && hrefAttribute !== "#" ? hrefAttribute.trim() : null;
-    }
-    return selector ? selector.split(",").map((sel) => parseSelector(sel)).join(",") : null;
-  };
-  var SelectorEngine = {
-    find(selector, element = document.documentElement) {
-      return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
-    },
-    findOne(selector, element = document.documentElement) {
-      return Element.prototype.querySelector.call(element, selector);
-    },
-    children(element, selector) {
-      return [].concat(...element.children).filter((child) => child.matches(selector));
-    },
-    parents(element, selector) {
-      const parents = [];
-      let ancestor = element.parentNode.closest(selector);
-      while (ancestor) {
-        parents.push(ancestor);
-        ancestor = ancestor.parentNode.closest(selector);
-      }
-      return parents;
-    },
-    prev(element, selector) {
-      let previous = element.previousElementSibling;
-      while (previous) {
-        if (previous.matches(selector)) {
-          return [previous];
-        }
-        previous = previous.previousElementSibling;
-      }
-      return [];
-    },
-    // TODO: this is now unused; remove later along with prev()
-    next(element, selector) {
-      let next = element.nextElementSibling;
-      while (next) {
-        if (next.matches(selector)) {
-          return [next];
-        }
-        next = next.nextElementSibling;
-      }
-      return [];
-    },
-    focusableChildren(element) {
-      const focusables = ["a", "button", "input", "textarea", "select", "details", "[tabindex]", '[contenteditable="true"]'].map((selector) => `${selector}:not([tabindex^="-"])`).join(",");
-      return this.find(focusables, element).filter((el) => !isDisabled(el) && isVisible(el));
-    },
-    getSelectorFromElement(element) {
-      const selector = getSelector(element);
-      if (selector) {
-        return SelectorEngine.findOne(selector) ? selector : null;
-      }
-      return null;
-    },
-    getElementFromSelector(element) {
-      const selector = getSelector(element);
-      return selector ? SelectorEngine.findOne(selector) : null;
-    },
-    getMultipleElementsFromSelector(element) {
-      const selector = getSelector(element);
-      return selector ? SelectorEngine.find(selector) : [];
-    }
-  };
-  var enableDismissTrigger = (component, method = "hide") => {
-    const clickEvent = `click.dismiss${component.EVENT_KEY}`;
-    const name = component.NAME;
-    EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function(event) {
-      if (["A", "AREA"].includes(this.tagName)) {
-        event.preventDefault();
-      }
-      if (isDisabled(this)) {
-        return;
-      }
-      const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);
-      const instance = component.getOrCreateInstance(target);
-      instance[method]();
-    });
-  };
-  var NAME$f = "alert";
-  var DATA_KEY$a = "bs.alert";
-  var EVENT_KEY$b = `.${DATA_KEY$a}`;
-  var EVENT_CLOSE = `close${EVENT_KEY$b}`;
-  var EVENT_CLOSED = `closed${EVENT_KEY$b}`;
-  var CLASS_NAME_FADE$5 = "fade";
-  var CLASS_NAME_SHOW$8 = "show";
-  var Alert = class _Alert extends BaseComponent {
-    // Getters
-    static get NAME() {
-      return NAME$f;
-    }
-    // Public
-    close() {
-      const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);
-      if (closeEvent.defaultPrevented) {
-        return;
-      }
-      this._element.classList.remove(CLASS_NAME_SHOW$8);
-      const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);
-      this._queueCallback(() => this._destroyElement(), this._element, isAnimated);
-    }
-    // Private
-    _destroyElement() {
-      this._element.remove();
-      EventHandler.trigger(this._element, EVENT_CLOSED);
-      this.dispose();
-    }
-    // Static
-    static jQueryInterface(config) {
-      return this.each(function() {
-        const data = _Alert.getOrCreateInstance(this);
-        if (typeof config !== "string") {
-          return;
-        }
-        if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
-          throw new TypeError(`No method named "${config}"`);
-        }
-        data[config](this);
-      });
-    }
-  };
-  enableDismissTrigger(Alert, "close");
-  defineJQueryPlugin(Alert);
-  var NAME$e = "button";
-  var DATA_KEY$9 = "bs.button";
-  var EVENT_KEY$a = `.${DATA_KEY$9}`;
-  var DATA_API_KEY$6 = ".data-api";
-  var CLASS_NAME_ACTIVE$3 = "active";
-  var SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]';
-  var EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;
-  var Button = class _Button extends BaseComponent {
-    // Getters
-    static get NAME() {
-      return NAME$e;
-    }
-    // Public
-    toggle() {
-      this._element.setAttribute("aria-pressed", this._element.classList.toggle(CLASS_NAME_ACTIVE$3));
-    }
-    // Static
-    static jQueryInterface(config) {
-      return this.each(function() {
-        const data = _Button.getOrCreateInstance(this);
-        if (config === "toggle") {
-          data[config]();
-        }
-      });
-    }
-  };
-  EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, (event) => {
-    event.preventDefault();
-    const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);
-    const data = Button.getOrCreateInstance(button);
-    data.toggle();
-  });
-  defineJQueryPlugin(Button);
-  var NAME$d = "swipe";
-  var EVENT_KEY$9 = ".bs.swipe";
-  var EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;
-  var EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;
-  var EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;
-  var EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;
-  var EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;
-  var POINTER_TYPE_TOUCH = "touch";
-  var POINTER_TYPE_PEN = "pen";
-  var CLASS_NAME_POINTER_EVENT = "pointer-event";
-  var SWIPE_THRESHOLD = 40;
-  var Default$c = {
-    endCallback: null,
-    leftCallback: null,
-    rightCallback: null
-  };
-  var DefaultType$c = {
-    endCallback: "(function|null)",
-    leftCallback: "(function|null)",
-    rightCallback: "(function|null)"
-  };
-  var Swipe = class _Swipe extends Config {
-    constructor(element, config) {
-      super();
-      this._element = element;
-      if (!element || !_Swipe.isSupported()) {
-        return;
-      }
-      this._config = this._getConfig(config);
-      this._deltaX = 0;
-      this._supportPointerEvents = Boolean(window.PointerEvent);
-      this._initEvents();
-    }
-    // Getters
-    static get Default() {
-      return Default$c;
-    }
-    static get DefaultType() {
-      return DefaultType$c;
-    }
-    static get NAME() {
-      return NAME$d;
-    }
-    // Public
-    dispose() {
-      EventHandler.off(this._element, EVENT_KEY$9);
-    }
-    // Private
-    _start(event) {
-      if (!this._supportPointerEvents) {
-        this._deltaX = event.touches[0].clientX;
-        return;
-      }
-      if (this._eventIsPointerPenTouch(event)) {
-        this._deltaX = event.clientX;
-      }
-    }
-    _end(event) {
-      if (this._eventIsPointerPenTouch(event)) {
-        this._deltaX = event.clientX - this._deltaX;
-      }
-      this._handleSwipe();
-      execute(this._config.endCallback);
-    }
-    _move(event) {
-      this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;
-    }
-    _handleSwipe() {
-      const absDeltaX = Math.abs(this._deltaX);
-      if (absDeltaX <= SWIPE_THRESHOLD) {
-        return;
-      }
-      const direction = absDeltaX / this._deltaX;
-      this._deltaX = 0;
-      if (!direction) {
-        return;
-      }
-      execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);
-    }
-    _initEvents() {
-      if (this._supportPointerEvents) {
-        EventHandler.on(this._element, EVENT_POINTERDOWN, (event) => this._start(event));
-        EventHandler.on(this._element, EVENT_POINTERUP, (event) => this._end(event));
-        this._element.classList.add(CLASS_NAME_POINTER_EVENT);
-      } else {
-        EventHandler.on(this._element, EVENT_TOUCHSTART, (event) => this._start(event));
-        EventHandler.on(this._element, EVENT_TOUCHMOVE, (event) => this._move(event));
-        EventHandler.on(this._element, EVENT_TOUCHEND, (event) => this._end(event));
-      }
-    }
-    _eventIsPointerPenTouch(event) {
-      return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);
-    }
-    // Static
-    static isSupported() {
-      return "ontouchstart" in document.documentElement || navigator.maxTouchPoints > 0;
-    }
-  };
-  var NAME$c = "carousel";
-  var DATA_KEY$8 = "bs.carousel";
-  var EVENT_KEY$8 = `.${DATA_KEY$8}`;
-  var DATA_API_KEY$5 = ".data-api";
-  var ARROW_LEFT_KEY$1 = "ArrowLeft";
-  var ARROW_RIGHT_KEY$1 = "ArrowRight";
-  var TOUCHEVENT_COMPAT_WAIT = 500;
-  var ORDER_NEXT = "next";
-  var ORDER_PREV = "prev";
-  var DIRECTION_LEFT = "left";
-  var DIRECTION_RIGHT = "right";
-  var EVENT_SLIDE = `slide${EVENT_KEY$8}`;
-  var EVENT_SLID = `slid${EVENT_KEY$8}`;
-  var EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;
-  var EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;
-  var EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;
-  var EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;
-  var EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;
-  var EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;
-  var CLASS_NAME_CAROUSEL = "carousel";
-  var CLASS_NAME_ACTIVE$2 = "active";
-  var CLASS_NAME_SLIDE = "slide";
-  var CLASS_NAME_END = "carousel-item-end";
-  var CLASS_NAME_START = "carousel-item-start";
-  var CLASS_NAME_NEXT = "carousel-item-next";
-  var CLASS_NAME_PREV = "carousel-item-prev";
-  var SELECTOR_ACTIVE = ".active";
-  var SELECTOR_ITEM = ".carousel-item";
-  var SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;
-  var SELECTOR_ITEM_IMG = ".carousel-item img";
-  var SELECTOR_INDICATORS = ".carousel-indicators";
-  var SELECTOR_DATA_SLIDE = "[data-bs-slide], [data-bs-slide-to]";
-  var SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]';
-  var KEY_TO_DIRECTION = {
-    [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,
-    [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT
-  };
-  var Default$b = {
-    interval: 5e3,
-    keyboard: true,
-    pause: "hover",
-    ride: false,
-    touch: true,
-    wrap: true
-  };
-  var DefaultType$b = {
-    interval: "(number|boolean)",
-    // TODO:v6 remove boolean support
-    keyboard: "boolean",
-    pause: "(string|boolean)",
-    ride: "(boolean|string)",
-    touch: "boolean",
-    wrap: "boolean"
-  };
-  var Carousel = class _Carousel extends BaseComponent {
-    constructor(element, config) {
-      super(element, config);
-      this._interval = null;
-      this._activeElement = null;
-      this._isSliding = false;
-      this.touchTimeout = null;
-      this._swipeHelper = null;
-      this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);
-      this._addEventListeners();
-      if (this._config.ride === CLASS_NAME_CAROUSEL) {
-        this.cycle();
-      }
-    }
-    // Getters
-    static get Default() {
-      return Default$b;
-    }
-    static get DefaultType() {
-      return DefaultType$b;
-    }
-    static get NAME() {
-      return NAME$c;
-    }
-    // Public
-    next() {
-      this._slide(ORDER_NEXT);
-    }
-    nextWhenVisible() {
-      if (!document.hidden && isVisible(this._element)) {
-        this.next();
-      }
-    }
-    prev() {
-      this._slide(ORDER_PREV);
-    }
-    pause() {
-      if (this._isSliding) {
-        triggerTransitionEnd(this._element);
-      }
-      this._clearInterval();
-    }
-    cycle() {
-      this._clearInterval();
-      this._updateInterval();
-      this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);
-    }
-    _maybeEnableCycle() {
-      if (!this._config.ride) {
-        return;
-      }
-      if (this._isSliding) {
-        EventHandler.one(this._element, EVENT_SLID, () => this.cycle());
-        return;
-      }
-      this.cycle();
-    }
-    to(index) {
-      const items = this._getItems();
-      if (index > items.length - 1 || index < 0) {
-        return;
-      }
-      if (this._isSliding) {
-        EventHandler.one(this._element, EVENT_SLID, () => this.to(index));
-        return;
-      }
-      const activeIndex = this._getItemIndex(this._getActive());
-      if (activeIndex === index) {
-        return;
-      }
-      const order2 = index > activeIndex ? ORDER_NEXT : ORDER_PREV;
-      this._slide(order2, items[index]);
-    }
-    dispose() {
-      if (this._swipeHelper) {
-        this._swipeHelper.dispose();
-      }
-      super.dispose();
-    }
-    // Private
-    _configAfterMerge(config) {
-      config.defaultInterval = config.interval;
-      return config;
-    }
-    _addEventListeners() {
-      if (this._config.keyboard) {
-        EventHandler.on(this._element, EVENT_KEYDOWN$1, (event) => this._keydown(event));
-      }
-      if (this._config.pause === "hover") {
-        EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());
-        EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());
-      }
-      if (this._config.touch && Swipe.isSupported()) {
-        this._addTouchEventListeners();
-      }
-    }
-    _addTouchEventListeners() {
-      for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {
-        EventHandler.on(img, EVENT_DRAG_START, (event) => event.preventDefault());
-      }
-      const endCallBack = () => {
-        if (this._config.pause !== "hover") {
-          return;
-        }
-        this.pause();
-        if (this.touchTimeout) {
-          clearTimeout(this.touchTimeout);
-        }
-        this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);
-      };
-      const swipeConfig = {
-        leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),
-        rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),
-        endCallback: endCallBack
-      };
-      this._swipeHelper = new Swipe(this._element, swipeConfig);
-    }
-    _keydown(event) {
-      if (/input|textarea/i.test(event.target.tagName)) {
-        return;
-      }
-      const direction = KEY_TO_DIRECTION[event.key];
-      if (direction) {
-        event.preventDefault();
-        this._slide(this._directionToOrder(direction));
-      }
-    }
-    _getItemIndex(element) {
-      return this._getItems().indexOf(element);
-    }
-    _setActiveIndicatorElement(index) {
-      if (!this._indicatorsElement) {
-        return;
-      }
-      const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);
-      activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);
-      activeIndicator.removeAttribute("aria-current");
-      const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to="${index}"]`, this._indicatorsElement);
-      if (newActiveIndicator) {
-        newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);
-        newActiveIndicator.setAttribute("aria-current", "true");
-      }
-    }
-    _updateInterval() {
-      const element = this._activeElement || this._getActive();
-      if (!element) {
-        return;
-      }
-      const elementInterval = Number.parseInt(element.getAttribute("data-bs-interval"), 10);
-      this._config.interval = elementInterval || this._config.defaultInterval;
-    }
-    _slide(order2, element = null) {
-      if (this._isSliding) {
-        return;
-      }
-      const activeElement = this._getActive();
-      const isNext = order2 === ORDER_NEXT;
-      const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);
-      if (nextElement === activeElement) {
-        return;
-      }
-      const nextElementIndex = this._getItemIndex(nextElement);
-      const triggerEvent = (eventName) => {
-        return EventHandler.trigger(this._element, eventName, {
-          relatedTarget: nextElement,
-          direction: this._orderToDirection(order2),
-          from: this._getItemIndex(activeElement),
-          to: nextElementIndex
-        });
-      };
-      const slideEvent = triggerEvent(EVENT_SLIDE);
-      if (slideEvent.defaultPrevented) {
-        return;
-      }
-      if (!activeElement || !nextElement) {
-        return;
-      }
-      const isCycling = Boolean(this._interval);
-      this.pause();
-      this._isSliding = true;
-      this._setActiveIndicatorElement(nextElementIndex);
-      this._activeElement = nextElement;
-      const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;
-      const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;
-      nextElement.classList.add(orderClassName);
-      reflow(nextElement);
-      activeElement.classList.add(directionalClassName);
-      nextElement.classList.add(directionalClassName);
-      const completeCallBack = () => {
-        nextElement.classList.remove(directionalClassName, orderClassName);
-        nextElement.classList.add(CLASS_NAME_ACTIVE$2);
-        activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);
-        this._isSliding = false;
-        triggerEvent(EVENT_SLID);
-      };
-      this._queueCallback(completeCallBack, activeElement, this._isAnimated());
-      if (isCycling) {
-        this.cycle();
-      }
-    }
-    _isAnimated() {
-      return this._element.classList.contains(CLASS_NAME_SLIDE);
-    }
-    _getActive() {
-      return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
-    }
-    _getItems() {
-      return SelectorEngine.find(SELECTOR_ITEM, this._element);
-    }
-    _clearInterval() {
-      if (this._interval) {
-        clearInterval(this._interval);
-        this._interval = null;
-      }
-    }
-    _directionToOrder(direction) {
-      if (isRTL()) {
-        return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;
-      }
-      return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;
-    }
-    _orderToDirection(order2) {
-      if (isRTL()) {
-        return order2 === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;
-      }
-      return order2 === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;
-    }
-    // Static
-    static jQueryInterface(config) {
-      return this.each(function() {
-        const data = _Carousel.getOrCreateInstance(this, config);
-        if (typeof config === "number") {
-          data.to(config);
-          return;
-        }
-        if (typeof config === "string") {
-          if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
-            throw new TypeError(`No method named "${config}"`);
-          }
-          data[config]();
-        }
-      });
-    }
-  };
-  EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function(event) {
-    const target = SelectorEngine.getElementFromSelector(this);
-    if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
-      return;
-    }
-    event.preventDefault();
-    const carousel = Carousel.getOrCreateInstance(target);
-    const slideIndex = this.getAttribute("data-bs-slide-to");
-    if (slideIndex) {
-      carousel.to(slideIndex);
-      carousel._maybeEnableCycle();
-      return;
-    }
-    if (Manipulator.getDataAttribute(this, "slide") === "next") {
-      carousel.next();
-      carousel._maybeEnableCycle();
-      return;
-    }
-    carousel.prev();
-    carousel._maybeEnableCycle();
-  });
-  EventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {
-    const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
-    for (const carousel of carousels) {
-      Carousel.getOrCreateInstance(carousel);
-    }
-  });
-  defineJQueryPlugin(Carousel);
-  var NAME$b = "collapse";
-  var DATA_KEY$7 = "bs.collapse";
-  var EVENT_KEY$7 = `.${DATA_KEY$7}`;
-  var DATA_API_KEY$4 = ".data-api";
-  var EVENT_SHOW$6 = `show${EVENT_KEY$7}`;
-  var EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;
-  var EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;
-  var EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;
-  var EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;
-  var CLASS_NAME_SHOW$7 = "show";
-  var CLASS_NAME_COLLAPSE = "collapse";
-  var CLASS_NAME_COLLAPSING = "collapsing";
-  var CLASS_NAME_COLLAPSED = "collapsed";
-  var CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;
-  var CLASS_NAME_HORIZONTAL = "collapse-horizontal";
-  var WIDTH = "width";
-  var HEIGHT = "height";
-  var SELECTOR_ACTIVES = ".collapse.show, .collapse.collapsing";
-  var SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]';
-  var Default$a = {
-    parent: null,
-    toggle: true
-  };
-  var DefaultType$a = {
-    parent: "(null|element)",
-    toggle: "boolean"
-  };
-  var Collapse = class _Collapse extends BaseComponent {
-    constructor(element, config) {
-      super(element, config);
-      this._isTransitioning = false;
-      this._triggerArray = [];
-      const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);
-      for (const elem of toggleList) {
-        const selector = SelectorEngine.getSelectorFromElement(elem);
-        const filterElement = SelectorEngine.find(selector).filter((foundElement) => foundElement === this._element);
-        if (selector !== null && filterElement.length) {
-          this._triggerArray.push(elem);
-        }
-      }
-      this._initializeChildren();
-      if (!this._config.parent) {
-        this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
-      }
-      if (this._config.toggle) {
-        this.toggle();
-      }
-    }
-    // Getters
-    static get Default() {
-      return Default$a;
-    }
-    static get DefaultType() {
-      return DefaultType$a;
-    }
-    static get NAME() {
-      return NAME$b;
-    }
-    // Public
-    toggle() {
-      if (this._isShown()) {
-        this.hide();
-      } else {
-        this.show();
-      }
-    }
-    show() {
-      if (this._isTransitioning || this._isShown()) {
-        return;
-      }
-      let activeChildren = [];
-      if (this._config.parent) {
-        activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter((element) => element !== this._element).map((element) => _Collapse.getOrCreateInstance(element, {
-          toggle: false
-        }));
-      }
-      if (activeChildren.length && activeChildren[0]._isTransitioning) {
-        return;
-      }
-      const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);
-      if (startEvent.defaultPrevented) {
-        return;
-      }
-      for (const activeInstance of activeChildren) {
-        activeInstance.hide();
-      }
-      const dimension = this._getDimension();
-      this._element.classList.remove(CLASS_NAME_COLLAPSE);
-      this._element.classList.add(CLASS_NAME_COLLAPSING);
-      this._element.style[dimension] = 0;
-      this._addAriaAndCollapsedClass(this._triggerArray, true);
-      this._isTransitioning = true;
-      const complete = () => {
-        this._isTransitioning = false;
-        this._element.classList.remove(CLASS_NAME_COLLAPSING);
-        this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
-        this._element.style[dimension] = "";
-        EventHandler.trigger(this._element, EVENT_SHOWN$6);
-      };
-      const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
-      const scrollSize = `scroll${capitalizedDimension}`;
-      this._queueCallback(complete, this._element, true);
-      this._element.style[dimension] = `${this._element[scrollSize]}px`;
-    }
-    hide() {
-      if (this._isTransitioning || !this._isShown()) {
-        return;
-      }
-      const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);
-      if (startEvent.defaultPrevented) {
-        return;
-      }
-      const dimension = this._getDimension();
-      this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
-      reflow(this._element);
-      this._element.classList.add(CLASS_NAME_COLLAPSING);
-      this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
-      for (const trigger of this._triggerArray) {
-        const element = SelectorEngine.getElementFromSelector(trigger);
-        if (element && !this._isShown(element)) {
-          this._addAriaAndCollapsedClass([trigger], false);
-        }
-      }
-      this._isTransitioning = true;
-      const complete = () => {
-        this._isTransitioning = false;
-        this._element.classList.remove(CLASS_NAME_COLLAPSING);
-        this._element.classList.add(CLASS_NAME_COLLAPSE);
-        EventHandler.trigger(this._element, EVENT_HIDDEN$6);
-      };
-      this._element.style[dimension] = "";
-      this._queueCallback(complete, this._element, true);
-    }
-    _isShown(element = this._element) {
-      return element.classList.contains(CLASS_NAME_SHOW$7);
-    }
-    // Private
-    _configAfterMerge(config) {
-      config.toggle = Boolean(config.toggle);
-      config.parent = getElement(config.parent);
-      return config;
-    }
-    _getDimension() {
-      return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
-    }
-    _initializeChildren() {
-      if (!this._config.parent) {
-        return;
-      }
-      const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);
-      for (const element of children) {
-        const selected = SelectorEngine.getElementFromSelector(element);
-        if (selected) {
-          this._addAriaAndCollapsedClass([element], this._isShown(selected));
-        }
-      }
-    }
-    _getFirstLevelChildren(selector) {
-      const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
-      return SelectorEngine.find(selector, this._config.parent).filter((element) => !children.includes(element));
-    }
-    _addAriaAndCollapsedClass(triggerArray, isOpen) {
-      if (!triggerArray.length) {
-        return;
-      }
-      for (const element of triggerArray) {
-        element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);
-        element.setAttribute("aria-expanded", isOpen);
-      }
-    }
-    // Static
-    static jQueryInterface(config) {
-      const _config = {};
-      if (typeof config === "string" && /show|hide/.test(config)) {
-        _config.toggle = false;
-      }
-      return this.each(function() {
-        const data = _Collapse.getOrCreateInstance(this, _config);
-        if (typeof config === "string") {
-          if (typeof data[config] === "undefined") {
-            throw new TypeError(`No method named "${config}"`);
-          }
-          data[config]();
-        }
-      });
-    }
-  };
-  EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function(event) {
-    if (event.target.tagName === "A" || event.delegateTarget && event.delegateTarget.tagName === "A") {
-      event.preventDefault();
-    }
-    for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {
-      Collapse.getOrCreateInstance(element, {
-        toggle: false
-      }).toggle();
-    }
-  });
-  defineJQueryPlugin(Collapse);
-  var NAME$a = "dropdown";
-  var DATA_KEY$6 = "bs.dropdown";
-  var EVENT_KEY$6 = `.${DATA_KEY$6}`;
-  var DATA_API_KEY$3 = ".data-api";
-  var ESCAPE_KEY$2 = "Escape";
-  var TAB_KEY$1 = "Tab";
-  var ARROW_UP_KEY$1 = "ArrowUp";
-  var ARROW_DOWN_KEY$1 = "ArrowDown";
-  var RIGHT_MOUSE_BUTTON = 2;
-  var EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;
-  var EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;
-  var EVENT_SHOW$5 = `show${EVENT_KEY$6}`;
-  var EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;
-  var EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;
-  var EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;
-  var EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;
-  var CLASS_NAME_SHOW$6 = "show";
-  var CLASS_NAME_DROPUP = "dropup";
-  var CLASS_NAME_DROPEND = "dropend";
-  var CLASS_NAME_DROPSTART = "dropstart";
-  var CLASS_NAME_DROPUP_CENTER = "dropup-center";
-  var CLASS_NAME_DROPDOWN_CENTER = "dropdown-center";
-  var SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)';
-  var SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;
-  var SELECTOR_MENU = ".dropdown-menu";
-  var SELECTOR_NAVBAR = ".navbar";
-  var SELECTOR_NAVBAR_NAV = ".navbar-nav";
-  var SELECTOR_VISIBLE_ITEMS = ".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)";
-  var PLACEMENT_TOP = isRTL() ? "top-end" : "top-start";
-  var PLACEMENT_TOPEND = isRTL() ? "top-start" : "top-end";
-  var PLACEMENT_BOTTOM = isRTL() ? "bottom-end" : "bottom-start";
-  var PLACEMENT_BOTTOMEND = isRTL() ? "bottom-start" : "bottom-end";
-  var PLACEMENT_RIGHT = isRTL() ? "left-start" : "right-start";
-  var PLACEMENT_LEFT = isRTL() ? "right-start" : "left-start";
-  var PLACEMENT_TOPCENTER = "top";
-  var PLACEMENT_BOTTOMCENTER = "bottom";
-  var Default$9 = {
-    autoClose: true,
-    boundary: "clippingParents",
-    display: "dynamic",
-    offset: [0, 2],
-    popperConfig: null,
-    reference: "toggle"
-  };
-  var DefaultType$9 = {
-    autoClose: "(boolean|string)",
-    boundary: "(string|element)",
-    display: "string",
-    offset: "(array|string|function)",
-    popperConfig: "(null|object|function)",
-    reference: "(string|element|object)"
-  };
-  var Dropdown = class _Dropdown extends BaseComponent {
-    constructor(element, config) {
-      super(element, config);
-      this._popper = null;
-      this._parent = this._element.parentNode;
-      this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);
-      this._inNavbar = this._detectNavbar();
-    }
-    // Getters
-    static get Default() {
-      return Default$9;
-    }
-    static get DefaultType() {
-      return DefaultType$9;
-    }
-    static get NAME() {
-      return NAME$a;
-    }
-    // Public
-    toggle() {
-      return this._isShown() ? this.hide() : this.show();
-    }
-    show() {
-      if (isDisabled(this._element) || this._isShown()) {
-        return;
-      }
-      const relatedTarget = {
-        relatedTarget: this._element
-      };
-      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);
-      if (showEvent.defaultPrevented) {
-        return;
-      }
-      this._createPopper();
-      if ("ontouchstart" in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {
-        for (const element of [].concat(...document.body.children)) {
-          EventHandler.on(element, "mouseover", noop);
-        }
-      }
-      this._element.focus();
-      this._element.setAttribute("aria-expanded", true);
-      this._menu.classList.add(CLASS_NAME_SHOW$6);
-      this._element.classList.add(CLASS_NAME_SHOW$6);
-      EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);
-    }
-    hide() {
-      if (isDisabled(this._element) || !this._isShown()) {
-        return;
-      }
-      const relatedTarget = {
-        relatedTarget: this._element
-      };
-      this._completeHide(relatedTarget);
-    }
-    dispose() {
-      if (this._popper) {
-        this._popper.destroy();
-      }
-      super.dispose();
-    }
-    update() {
-      this._inNavbar = this._detectNavbar();
-      if (this._popper) {
-        this._popper.update();
-      }
-    }
-    // Private
-    _completeHide(relatedTarget) {
-      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);
-      if (hideEvent.defaultPrevented) {
-        return;
-      }
-      if ("ontouchstart" in document.documentElement) {
-        for (const element of [].concat(...document.body.children)) {
-          EventHandler.off(element, "mouseover", noop);
-        }
-      }
-      if (this._popper) {
-        this._popper.destroy();
-      }
-      this._menu.classList.remove(CLASS_NAME_SHOW$6);
-      this._element.classList.remove(CLASS_NAME_SHOW$6);
-      this._element.setAttribute("aria-expanded", "false");
-      Manipulator.removeDataAttribute(this._menu, "popper");
-      EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);
-    }
-    _getConfig(config) {
-      config = super._getConfig(config);
-      if (typeof config.reference === "object" && !isElement2(config.reference) && typeof config.reference.getBoundingClientRect !== "function") {
-        throw new TypeError(`${NAME$a.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
-      }
-      return config;
-    }
-    _createPopper() {
-      if (typeof lib_exports === "undefined") {
-        throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");
-      }
-      let referenceElement = this._element;
-      if (this._config.reference === "parent") {
-        referenceElement = this._parent;
-      } else if (isElement2(this._config.reference)) {
-        referenceElement = getElement(this._config.reference);
-      } else if (typeof this._config.reference === "object") {
-        referenceElement = this._config.reference;
-      }
-      const popperConfig = this._getPopperConfig();
-      this._popper = createPopper3(referenceElement, this._menu, popperConfig);
-    }
-    _isShown() {
-      return this._menu.classList.contains(CLASS_NAME_SHOW$6);
-    }
-    _getPlacement() {
-      const parentDropdown = this._parent;
-      if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
-        return PLACEMENT_RIGHT;
-      }
-      if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
-        return PLACEMENT_LEFT;
-      }
-      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {
-        return PLACEMENT_TOPCENTER;
-      }
-      if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {
-        return PLACEMENT_BOTTOMCENTER;
-      }
-      const isEnd = getComputedStyle(this._menu).getPropertyValue("--bs-position").trim() === "end";
-      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
-        return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
-      }
-      return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
-    }
-    _detectNavbar() {
-      return this._element.closest(SELECTOR_NAVBAR) !== null;
-    }
-    _getOffset() {
-      const {
-        offset: offset2
-      } = this._config;
-      if (typeof offset2 === "string") {
-        return offset2.split(",").map((value) => Number.parseInt(value, 10));
-      }
-      if (typeof offset2 === "function") {
-        return (popperData) => offset2(popperData, this._element);
-      }
-      return offset2;
-    }
-    _getPopperConfig() {
-      const defaultBsPopperConfig = {
-        placement: this._getPlacement(),
-        modifiers: [{
-          name: "preventOverflow",
-          options: {
-            boundary: this._config.boundary
-          }
-        }, {
-          name: "offset",
-          options: {
-            offset: this._getOffset()
-          }
-        }]
-      };
-      if (this._inNavbar || this._config.display === "static") {
-        Manipulator.setDataAttribute(this._menu, "popper", "static");
-        defaultBsPopperConfig.modifiers = [{
-          name: "applyStyles",
-          enabled: false
-        }];
-      }
-      return __spreadValues(__spreadValues({}, defaultBsPopperConfig), execute(this._config.popperConfig, [defaultBsPopperConfig]));
-    }
-    _selectMenuItem({
-      key,
-      target
-    }) {
-      const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter((element) => isVisible(element));
-      if (!items.length) {
-        return;
-      }
-      getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();
-    }
-    // Static
-    static jQueryInterface(config) {
-      return this.each(function() {
-        const data = _Dropdown.getOrCreateInstance(this, config);
-        if (typeof config !== "string") {
-          return;
-        }
-        if (typeof data[config] === "undefined") {
-          throw new TypeError(`No method named "${config}"`);
-        }
-        data[config]();
-      });
-    }
-    static clearMenus(event) {
-      if (event.button === RIGHT_MOUSE_BUTTON || event.type === "keyup" && event.key !== TAB_KEY$1) {
-        return;
-      }
-      const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);
-      for (const toggle of openToggles) {
-        const context = _Dropdown.getInstance(toggle);
-        if (!context || context._config.autoClose === false) {
-          continue;
-        }
-        const composedPath = event.composedPath();
-        const isMenuTarget = composedPath.includes(context._menu);
-        if (composedPath.includes(context._element) || context._config.autoClose === "inside" && !isMenuTarget || context._config.autoClose === "outside" && isMenuTarget) {
-          continue;
-        }
-        if (context._menu.contains(event.target) && (event.type === "keyup" && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {
-          continue;
-        }
-        const relatedTarget = {
-          relatedTarget: context._element
-        };
-        if (event.type === "click") {
-          relatedTarget.clickEvent = event;
-        }
-        context._completeHide(relatedTarget);
-      }
-    }
-    static dataApiKeydownHandler(event) {
-      const isInput = /input|textarea/i.test(event.target.tagName);
-      const isEscapeEvent = event.key === ESCAPE_KEY$2;
-      const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);
-      if (!isUpOrDownEvent && !isEscapeEvent) {
-        return;
-      }
-      if (isInput && !isEscapeEvent) {
-        return;
-      }
-      event.preventDefault();
-      const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);
-      const instance = _Dropdown.getOrCreateInstance(getToggleButton);
-      if (isUpOrDownEvent) {
-        event.stopPropagation();
-        instance.show();
-        instance._selectMenuItem(event);
-        return;
-      }
-      if (instance._isShown()) {
-        event.stopPropagation();
-        instance.hide();
-        getToggleButton.focus();
-      }
-    }
-  };
-  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);
-  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
-  EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);
-  EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
-  EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function(event) {
-    event.preventDefault();
-    Dropdown.getOrCreateInstance(this).toggle();
-  });
-  defineJQueryPlugin(Dropdown);
-  var NAME$9 = "backdrop";
-  var CLASS_NAME_FADE$4 = "fade";
-  var CLASS_NAME_SHOW$5 = "show";
-  var EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;
-  var Default$8 = {
-    className: "modal-backdrop",
-    clickCallback: null,
-    isAnimated: false,
-    isVisible: true,
-    // if false, we use the backdrop helper without adding any element to the dom
-    rootElement: "body"
-    // give the choice to place backdrop under different elements
-  };
-  var DefaultType$8 = {
-    className: "string",
-    clickCallback: "(function|null)",
-    isAnimated: "boolean",
-    isVisible: "boolean",
-    rootElement: "(element|string)"
-  };
-  var Backdrop = class extends Config {
-    constructor(config) {
-      super();
-      this._config = this._getConfig(config);
-      this._isAppended = false;
-      this._element = null;
-    }
-    // Getters
-    static get Default() {
-      return Default$8;
-    }
-    static get DefaultType() {
-      return DefaultType$8;
-    }
-    static get NAME() {
-      return NAME$9;
-    }
-    // Public
-    show(callback) {
-      if (!this._config.isVisible) {
-        execute(callback);
-        return;
-      }
-      this._append();
-      const element = this._getElement();
-      if (this._config.isAnimated) {
-        reflow(element);
-      }
-      element.classList.add(CLASS_NAME_SHOW$5);
-      this._emulateAnimation(() => {
-        execute(callback);
-      });
-    }
-    hide(callback) {
-      if (!this._config.isVisible) {
-        execute(callback);
-        return;
-      }
-      this._getElement().classList.remove(CLASS_NAME_SHOW$5);
-      this._emulateAnimation(() => {
-        this.dispose();
-        execute(callback);
-      });
-    }
-    dispose() {
-      if (!this._isAppended) {
-        return;
-      }
-      EventHandler.off(this._element, EVENT_MOUSEDOWN);
-      this._element.remove();
-      this._isAppended = false;
-    }
-    // Private
-    _getElement() {
-      if (!this._element) {
-        const backdrop = document.createElement("div");
-        backdrop.className = this._config.className;
-        if (this._config.isAnimated) {
-          backdrop.classList.add(CLASS_NAME_FADE$4);
-        }
-        this._element = backdrop;
-      }
-      return this._element;
-    }
-    _configAfterMerge(config) {
-      config.rootElement = getElement(config.rootElement);
-      return config;
-    }
-    _append() {
-      if (this._isAppended) {
-        return;
-      }
-      const element = this._getElement();
-      this._config.rootElement.append(element);
-      EventHandler.on(element, EVENT_MOUSEDOWN, () => {
-        execute(this._config.clickCallback);
-      });
-      this._isAppended = true;
-    }
-    _emulateAnimation(callback) {
-      executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
-    }
-  };
-  var NAME$8 = "focustrap";
-  var DATA_KEY$5 = "bs.focustrap";
-  var EVENT_KEY$5 = `.${DATA_KEY$5}`;
-  var EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;
-  var EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;
-  var TAB_KEY = "Tab";
-  var TAB_NAV_FORWARD = "forward";
-  var TAB_NAV_BACKWARD = "backward";
-  var Default$7 = {
-    autofocus: true,
-    trapElement: null
-    // The element to trap focus inside of
-  };
-  var DefaultType$7 = {
-    autofocus: "boolean",
-    trapElement: "element"
-  };
-  var FocusTrap = class extends Config {
-    constructor(config) {
-      super();
-      this._config = this._getConfig(config);
-      this._isActive = false;
-      this._lastTabNavDirection = null;
-    }
-    // Getters
-    static get Default() {
-      return Default$7;
-    }
-    static get DefaultType() {
-      return DefaultType$7;
-    }
-    static get NAME() {
-      return NAME$8;
-    }
-    // Public
-    activate() {
-      if (this._isActive) {
-        return;
-      }
-      if (this._config.autofocus) {
-        this._config.trapElement.focus();
-      }
-      EventHandler.off(document, EVENT_KEY$5);
-      EventHandler.on(document, EVENT_FOCUSIN$2, (event) => this._handleFocusin(event));
-      EventHandler.on(document, EVENT_KEYDOWN_TAB, (event) => this._handleKeydown(event));
-      this._isActive = true;
-    }
-    deactivate() {
-      if (!this._isActive) {
-        return;
-      }
-      this._isActive = false;
-      EventHandler.off(document, EVENT_KEY$5);
-    }
-    // Private
-    _handleFocusin(event) {
-      const {
-        trapElement
-      } = this._config;
-      if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {
-        return;
-      }
-      const elements = SelectorEngine.focusableChildren(trapElement);
-      if (elements.length === 0) {
-        trapElement.focus();
-      } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
-        elements[elements.length - 1].focus();
-      } else {
-        elements[0].focus();
-      }
-    }
-    _handleKeydown(event) {
-      if (event.key !== TAB_KEY) {
-        return;
-      }
-      this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
-    }
-  };
-  var SELECTOR_FIXED_CONTENT = ".fixed-top, .fixed-bottom, .is-fixed, .sticky-top";
-  var SELECTOR_STICKY_CONTENT = ".sticky-top";
-  var PROPERTY_PADDING = "padding-right";
-  var PROPERTY_MARGIN = "margin-right";
-  var ScrollBarHelper = class {
-    constructor() {
-      this._element = document.body;
-    }
-    // Public
-    getWidth() {
-      const documentWidth = document.documentElement.clientWidth;
-      return Math.abs(window.innerWidth - documentWidth);
-    }
-    hide() {
-      const width = this.getWidth();
-      this._disableOverFlow();
-      this._setElementAttributes(this._element, PROPERTY_PADDING, (calculatedValue) => calculatedValue + width);
-      this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, (calculatedValue) => calculatedValue + width);
-      this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, (calculatedValue) => calculatedValue - width);
-    }
-    reset() {
-      this._resetElementAttributes(this._element, "overflow");
-      this._resetElementAttributes(this._element, PROPERTY_PADDING);
-      this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);
-      this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);
-    }
-    isOverflowing() {
-      return this.getWidth() > 0;
-    }
-    // Private
-    _disableOverFlow() {
-      this._saveInitialAttribute(this._element, "overflow");
-      this._element.style.overflow = "hidden";
-    }
-    _setElementAttributes(selector, styleProperty, callback) {
-      const scrollbarWidth = this.getWidth();
-      const manipulationCallBack = (element) => {
-        if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
-          return;
-        }
-        this._saveInitialAttribute(element, styleProperty);
-        const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);
-        element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);
-      };
-      this._applyManipulationCallback(selector, manipulationCallBack);
-    }
-    _saveInitialAttribute(element, styleProperty) {
-      const actualValue = element.style.getPropertyValue(styleProperty);
-      if (actualValue) {
-        Manipulator.setDataAttribute(element, styleProperty, actualValue);
-      }
-    }
-    _resetElementAttributes(selector, styleProperty) {
-      const manipulationCallBack = (element) => {
-        const value = Manipulator.getDataAttribute(element, styleProperty);
-        if (value === null) {
-          element.style.removeProperty(styleProperty);
-          return;
-        }
-        Manipulator.removeDataAttribute(element, styleProperty);
-        element.style.setProperty(styleProperty, value);
-      };
-      this._applyManipulationCallback(selector, manipulationCallBack);
-    }
-    _applyManipulationCallback(selector, callBack) {
-      if (isElement2(selector)) {
-        callBack(selector);
-        return;
-      }
-      for (const sel of SelectorEngine.find(selector, this._element)) {
-        callBack(sel);
-      }
-    }
-  };
-  var NAME$7 = "modal";
-  var DATA_KEY$4 = "bs.modal";
-  var EVENT_KEY$4 = `.${DATA_KEY$4}`;
-  var DATA_API_KEY$2 = ".data-api";
-  var ESCAPE_KEY$1 = "Escape";
-  var EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;
-  var EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;
-  var EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;
-  var EVENT_SHOW$4 = `show${EVENT_KEY$4}`;
-  var EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;
-  var EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;
-  var EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;
-  var EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;
-  var EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;
-  var EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;
-  var CLASS_NAME_OPEN = "modal-open";
-  var CLASS_NAME_FADE$3 = "fade";
-  var CLASS_NAME_SHOW$4 = "show";
-  var CLASS_NAME_STATIC = "modal-static";
-  var OPEN_SELECTOR$1 = ".modal.show";
-  var SELECTOR_DIALOG = ".modal-dialog";
-  var SELECTOR_MODAL_BODY = ".modal-body";
-  var SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]';
-  var Default$6 = {
-    backdrop: true,
-    focus: true,
-    keyboard: true
-  };
-  var DefaultType$6 = {
-    backdrop: "(boolean|string)",
-    focus: "boolean",
-    keyboard: "boolean"
-  };
-  var Modal = class _Modal extends BaseComponent {
-    constructor(element, config) {
-      super(element, config);
-      this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
-      this._backdrop = this._initializeBackDrop();
-      this._focustrap = this._initializeFocusTrap();
-      this._isShown = false;
-      this._isTransitioning = false;
-      this._scrollBar = new ScrollBarHelper();
-      this._addEventListeners();
-    }
-    // Getters
-    static get Default() {
-      return Default$6;
-    }
-    static get DefaultType() {
-      return DefaultType$6;
-    }
-    static get NAME() {
-      return NAME$7;
-    }
-    // Public
-    toggle(relatedTarget) {
-      return this._isShown ? this.hide() : this.show(relatedTarget);
-    }
-    show(relatedTarget) {
-      if (this._isShown || this._isTransitioning) {
-        return;
-      }
-      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {
-        relatedTarget
-      });
-      if (showEvent.defaultPrevented) {
-        return;
-      }
-      this._isShown = true;
-      this._isTransitioning = true;
-      this._scrollBar.hide();
-      document.body.classList.add(CLASS_NAME_OPEN);
-      this._adjustDialog();
-      this._backdrop.show(() => this._showElement(relatedTarget));
-    }
-    hide() {
-      if (!this._isShown || this._isTransitioning) {
-        return;
-      }
-      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);
-      if (hideEvent.defaultPrevented) {
-        return;
-      }
-      this._isShown = false;
-      this._isTransitioning = true;
-      this._focustrap.deactivate();
-      this._element.classList.remove(CLASS_NAME_SHOW$4);
-      this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());
-    }
-    dispose() {
-      EventHandler.off(window, EVENT_KEY$4);
-      EventHandler.off(this._dialog, EVENT_KEY$4);
-      this._backdrop.dispose();
-      this._focustrap.deactivate();
-      super.dispose();
-    }
-    handleUpdate() {
-      this._adjustDialog();
-    }
-    // Private
-    _initializeBackDrop() {
-      return new Backdrop({
-        isVisible: Boolean(this._config.backdrop),
-        // 'static' option will be translated to true, and booleans will keep their value,
-        isAnimated: this._isAnimated()
-      });
-    }
-    _initializeFocusTrap() {
-      return new FocusTrap({
-        trapElement: this._element
-      });
-    }
-    _showElement(relatedTarget) {
-      if (!document.body.contains(this._element)) {
-        document.body.append(this._element);
-      }
-      this._element.style.display = "block";
-      this._element.removeAttribute("aria-hidden");
-      this._element.setAttribute("aria-modal", true);
-      this._element.setAttribute("role", "dialog");
-      this._element.scrollTop = 0;
-      const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
-      if (modalBody) {
-        modalBody.scrollTop = 0;
-      }
-      reflow(this._element);
-      this._element.classList.add(CLASS_NAME_SHOW$4);
-      const transitionComplete = () => {
-        if (this._config.focus) {
-          this._focustrap.activate();
-        }
-        this._isTransitioning = false;
-        EventHandler.trigger(this._element, EVENT_SHOWN$4, {
-          relatedTarget
-        });
-      };
-      this._queueCallback(transitionComplete, this._dialog, this._isAnimated());
-    }
-    _addEventListeners() {
-      EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, (event) => {
-        if (event.key !== ESCAPE_KEY$1) {
-          return;
-        }
-        if (this._config.keyboard) {
-          this.hide();
-          return;
-        }
-        this._triggerBackdropTransition();
-      });
-      EventHandler.on(window, EVENT_RESIZE$1, () => {
-        if (this._isShown && !this._isTransitioning) {
-          this._adjustDialog();
-        }
-      });
-      EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, (event) => {
-        EventHandler.one(this._element, EVENT_CLICK_DISMISS, (event2) => {
-          if (this._element !== event.target || this._element !== event2.target) {
-            return;
-          }
-          if (this._config.backdrop === "static") {
-            this._triggerBackdropTransition();
-            return;
-          }
-          if (this._config.backdrop) {
-            this.hide();
-          }
-        });
-      });
-    }
-    _hideModal() {
-      this._element.style.display = "none";
-      this._element.setAttribute("aria-hidden", true);
-      this._element.removeAttribute("aria-modal");
-      this._element.removeAttribute("role");
-      this._isTransitioning = false;
-      this._backdrop.hide(() => {
-        document.body.classList.remove(CLASS_NAME_OPEN);
-        this._resetAdjustments();
-        this._scrollBar.reset();
-        EventHandler.trigger(this._element, EVENT_HIDDEN$4);
-      });
-    }
-    _isAnimated() {
-      return this._element.classList.contains(CLASS_NAME_FADE$3);
-    }
-    _triggerBackdropTransition() {
-      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);
-      if (hideEvent.defaultPrevented) {
-        return;
-      }
-      const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
-      const initialOverflowY = this._element.style.overflowY;
-      if (initialOverflowY === "hidden" || this._element.classList.contains(CLASS_NAME_STATIC)) {
-        return;
-      }
-      if (!isModalOverflowing) {
-        this._element.style.overflowY = "hidden";
-      }
-      this._element.classList.add(CLASS_NAME_STATIC);
-      this._queueCallback(() => {
-        this._element.classList.remove(CLASS_NAME_STATIC);
-        this._queueCallback(() => {
-          this._element.style.overflowY = initialOverflowY;
-        }, this._dialog);
-      }, this._dialog);
-      this._element.focus();
-    }
-    /**
-     * The following methods are used to handle overflowing modals
-     */
-    _adjustDialog() {
-      const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
-      const scrollbarWidth = this._scrollBar.getWidth();
-      const isBodyOverflowing = scrollbarWidth > 0;
-      if (isBodyOverflowing && !isModalOverflowing) {
-        const property = isRTL() ? "paddingLeft" : "paddingRight";
-        this._element.style[property] = `${scrollbarWidth}px`;
-      }
-      if (!isBodyOverflowing && isModalOverflowing) {
-        const property = isRTL() ? "paddingRight" : "paddingLeft";
-        this._element.style[property] = `${scrollbarWidth}px`;
-      }
-    }
-    _resetAdjustments() {
-      this._element.style.paddingLeft = "";
-      this._element.style.paddingRight = "";
-    }
-    // Static
-    static jQueryInterface(config, relatedTarget) {
-      return this.each(function() {
-        const data = _Modal.getOrCreateInstance(this, config);
-        if (typeof config !== "string") {
-          return;
-        }
-        if (typeof data[config] === "undefined") {
-          throw new TypeError(`No method named "${config}"`);
-        }
-        data[config](relatedTarget);
-      });
-    }
-  };
-  EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function(event) {
-    const target = SelectorEngine.getElementFromSelector(this);
-    if (["A", "AREA"].includes(this.tagName)) {
-      event.preventDefault();
-    }
-    EventHandler.one(target, EVENT_SHOW$4, (showEvent) => {
-      if (showEvent.defaultPrevented) {
-        return;
-      }
-      EventHandler.one(target, EVENT_HIDDEN$4, () => {
-        if (isVisible(this)) {
-          this.focus();
-        }
-      });
-    });
-    const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);
-    if (alreadyOpen) {
-      Modal.getInstance(alreadyOpen).hide();
-    }
-    const data = Modal.getOrCreateInstance(target);
-    data.toggle(this);
-  });
-  enableDismissTrigger(Modal);
-  defineJQueryPlugin(Modal);
-  var NAME$6 = "offcanvas";
-  var DATA_KEY$3 = "bs.offcanvas";
-  var EVENT_KEY$3 = `.${DATA_KEY$3}`;
-  var DATA_API_KEY$1 = ".data-api";
-  var EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;
-  var ESCAPE_KEY = "Escape";
-  var CLASS_NAME_SHOW$3 = "show";
-  var CLASS_NAME_SHOWING$1 = "showing";
-  var CLASS_NAME_HIDING = "hiding";
-  var CLASS_NAME_BACKDROP = "offcanvas-backdrop";
-  var OPEN_SELECTOR = ".offcanvas.show";
-  var EVENT_SHOW$3 = `show${EVENT_KEY$3}`;
-  var EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;
-  var EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;
-  var EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;
-  var EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;
-  var EVENT_RESIZE = `resize${EVENT_KEY$3}`;
-  var EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;
-  var EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;
-  var SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]';
-  var Default$5 = {
-    backdrop: true,
-    keyboard: true,
-    scroll: false
-  };
-  var DefaultType$5 = {
-    backdrop: "(boolean|string)",
-    keyboard: "boolean",
-    scroll: "boolean"
-  };
-  var Offcanvas = class _Offcanvas extends BaseComponent {
-    constructor(element, config) {
-      super(element, config);
-      this._isShown = false;
-      this._backdrop = this._initializeBackDrop();
-      this._focustrap = this._initializeFocusTrap();
-      this._addEventListeners();
-    }
-    // Getters
-    static get Default() {
-      return Default$5;
-    }
-    static get DefaultType() {
-      return DefaultType$5;
-    }
-    static get NAME() {
-      return NAME$6;
-    }
-    // Public
-    toggle(relatedTarget) {
-      return this._isShown ? this.hide() : this.show(relatedTarget);
-    }
-    show(relatedTarget) {
-      if (this._isShown) {
-        return;
-      }
-      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {
-        relatedTarget
-      });
-      if (showEvent.defaultPrevented) {
-        return;
-      }
-      this._isShown = true;
-      this._backdrop.show();
-      if (!this._config.scroll) {
-        new ScrollBarHelper().hide();
-      }
-      this._element.setAttribute("aria-modal", true);
-      this._element.setAttribute("role", "dialog");
-      this._element.classList.add(CLASS_NAME_SHOWING$1);
-      const completeCallBack = () => {
-        if (!this._config.scroll || this._config.backdrop) {
-          this._focustrap.activate();
-        }
-        this._element.classList.add(CLASS_NAME_SHOW$3);
-        this._element.classList.remove(CLASS_NAME_SHOWING$1);
-        EventHandler.trigger(this._element, EVENT_SHOWN$3, {
-          relatedTarget
-        });
-      };
-      this._queueCallback(completeCallBack, this._element, true);
-    }
-    hide() {
-      if (!this._isShown) {
-        return;
-      }
-      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);
-      if (hideEvent.defaultPrevented) {
-        return;
-      }
-      this._focustrap.deactivate();
-      this._element.blur();
-      this._isShown = false;
-      this._element.classList.add(CLASS_NAME_HIDING);
-      this._backdrop.hide();
-      const completeCallback = () => {
-        this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);
-        this._element.removeAttribute("aria-modal");
-        this._element.removeAttribute("role");
-        if (!this._config.scroll) {
-          new ScrollBarHelper().reset();
-        }
-        EventHandler.trigger(this._element, EVENT_HIDDEN$3);
-      };
-      this._queueCallback(completeCallback, this._element, true);
-    }
-    dispose() {
-      this._backdrop.dispose();
-      this._focustrap.deactivate();
-      super.dispose();
-    }
-    // Private
-    _initializeBackDrop() {
-      const clickCallback = () => {
-        if (this._config.backdrop === "static") {
-          EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
-          return;
-        }
-        this.hide();
-      };
-      const isVisible2 = Boolean(this._config.backdrop);
-      return new Backdrop({
-        className: CLASS_NAME_BACKDROP,
-        isVisible: isVisible2,
-        isAnimated: true,
-        rootElement: this._element.parentNode,
-        clickCallback: isVisible2 ? clickCallback : null
-      });
-    }
-    _initializeFocusTrap() {
-      return new FocusTrap({
-        trapElement: this._element
-      });
-    }
-    _addEventListeners() {
-      EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, (event) => {
-        if (event.key !== ESCAPE_KEY) {
-          return;
-        }
-        if (this._config.keyboard) {
-          this.hide();
-          return;
-        }
-        EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
-      });
-    }
-    // Static
-    static jQueryInterface(config) {
-      return this.each(function() {
-        const data = _Offcanvas.getOrCreateInstance(this, config);
-        if (typeof config !== "string") {
-          return;
-        }
-        if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
-          throw new TypeError(`No method named "${config}"`);
-        }
-        data[config](this);
-      });
-    }
-  };
-  EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function(event) {
-    const target = SelectorEngine.getElementFromSelector(this);
-    if (["A", "AREA"].includes(this.tagName)) {
-      event.preventDefault();
-    }
-    if (isDisabled(this)) {
-      return;
-    }
-    EventHandler.one(target, EVENT_HIDDEN$3, () => {
-      if (isVisible(this)) {
-        this.focus();
-      }
-    });
-    const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
-    if (alreadyOpen && alreadyOpen !== target) {
-      Offcanvas.getInstance(alreadyOpen).hide();
-    }
-    const data = Offcanvas.getOrCreateInstance(target);
-    data.toggle(this);
-  });
-  EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {
-    for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {
-      Offcanvas.getOrCreateInstance(selector).show();
-    }
-  });
-  EventHandler.on(window, EVENT_RESIZE, () => {
-    for (const element of SelectorEngine.find("[aria-modal][class*=show][class*=offcanvas-]")) {
-      if (getComputedStyle(element).position !== "fixed") {
-        Offcanvas.getOrCreateInstance(element).hide();
-      }
-    }
-  });
-  enableDismissTrigger(Offcanvas);
-  defineJQueryPlugin(Offcanvas);
-  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
-  var DefaultAllowlist = {
-    // Global attributes allowed on any supplied element below.
-    "*": ["class", "dir", "id", "lang", "role", ARIA_ATTRIBUTE_PATTERN],
-    a: ["target", "href", "title", "rel"],
-    area: [],
-    b: [],
-    br: [],
-    col: [],
-    code: [],
-    dd: [],
-    div: [],
-    dl: [],
-    dt: [],
-    em: [],
-    hr: [],
-    h1: [],
-    h2: [],
-    h3: [],
-    h4: [],
-    h5: [],
-    h6: [],
-    i: [],
-    img: ["src", "srcset", "alt", "title", "width", "height"],
-    li: [],
-    ol: [],
-    p: [],
-    pre: [],
-    s: [],
-    small: [],
-    span: [],
-    sub: [],
-    sup: [],
-    strong: [],
-    u: [],
-    ul: []
-  };
-  var uriAttributes = /* @__PURE__ */ new Set(["background", "cite", "href", "itemtype", "longdesc", "poster", "src", "xlink:href"]);
-  var SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;
-  var allowedAttribute = (attribute, allowedAttributeList) => {
-    const attributeName = attribute.nodeName.toLowerCase();
-    if (allowedAttributeList.includes(attributeName)) {
-      if (uriAttributes.has(attributeName)) {
-        return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));
-      }
-      return true;
-    }
-    return allowedAttributeList.filter((attributeRegex) => attributeRegex instanceof RegExp).some((regex) => regex.test(attributeName));
-  };
-  function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
-    if (!unsafeHtml.length) {
-      return unsafeHtml;
-    }
-    if (sanitizeFunction && typeof sanitizeFunction === "function") {
-      return sanitizeFunction(unsafeHtml);
-    }
-    const domParser = new window.DOMParser();
-    const createdDocument = domParser.parseFromString(unsafeHtml, "text/html");
-    const elements = [].concat(...createdDocument.body.querySelectorAll("*"));
-    for (const element of elements) {
-      const elementName = element.nodeName.toLowerCase();
-      if (!Object.keys(allowList).includes(elementName)) {
-        element.remove();
-        continue;
-      }
-      const attributeList = [].concat(...element.attributes);
-      const allowedAttributes = [].concat(allowList["*"] || [], allowList[elementName] || []);
-      for (const attribute of attributeList) {
-        if (!allowedAttribute(attribute, allowedAttributes)) {
-          element.removeAttribute(attribute.nodeName);
-        }
-      }
-    }
-    return createdDocument.body.innerHTML;
-  }
-  var NAME$5 = "TemplateFactory";
-  var Default$4 = {
-    allowList: DefaultAllowlist,
-    content: {},
-    // { selector : text ,  selector2 : text2 , }
-    extraClass: "",
-    html: false,
-    sanitize: true,
-    sanitizeFn: null,
-    template: "<div></div>"
-  };
-  var DefaultType$4 = {
-    allowList: "object",
-    content: "object",
-    extraClass: "(string|function)",
-    html: "boolean",
-    sanitize: "boolean",
-    sanitizeFn: "(null|function)",
-    template: "string"
-  };
-  var DefaultContentType = {
-    entry: "(string|element|function|null)",
-    selector: "(string|element)"
-  };
-  var TemplateFactory = class extends Config {
-    constructor(config) {
-      super();
-      this._config = this._getConfig(config);
-    }
-    // Getters
-    static get Default() {
-      return Default$4;
-    }
-    static get DefaultType() {
-      return DefaultType$4;
-    }
-    static get NAME() {
-      return NAME$5;
-    }
-    // Public
-    getContent() {
-      return Object.values(this._config.content).map((config) => this._resolvePossibleFunction(config)).filter(Boolean);
-    }
-    hasContent() {
-      return this.getContent().length > 0;
-    }
-    changeContent(content) {
-      this._checkContent(content);
-      this._config.content = __spreadValues(__spreadValues({}, this._config.content), content);
-      return this;
-    }
-    toHtml() {
-      const templateWrapper = document.createElement("div");
-      templateWrapper.innerHTML = this._maybeSanitize(this._config.template);
-      for (const [selector, text] of Object.entries(this._config.content)) {
-        this._setContent(templateWrapper, text, selector);
-      }
-      const template = templateWrapper.children[0];
-      const extraClass = this._resolvePossibleFunction(this._config.extraClass);
-      if (extraClass) {
-        template.classList.add(...extraClass.split(" "));
-      }
-      return template;
-    }
-    // Private
-    _typeCheckConfig(config) {
-      super._typeCheckConfig(config);
-      this._checkContent(config.content);
-    }
-    _checkContent(arg) {
-      for (const [selector, content] of Object.entries(arg)) {
-        super._typeCheckConfig({
-          selector,
-          entry: content
-        }, DefaultContentType);
-      }
-    }
-    _setContent(template, content, selector) {
-      const templateElement = SelectorEngine.findOne(selector, template);
-      if (!templateElement) {
-        return;
-      }
-      content = this._resolvePossibleFunction(content);
-      if (!content) {
-        templateElement.remove();
-        return;
-      }
-      if (isElement2(content)) {
-        this._putElementInTemplate(getElement(content), templateElement);
-        return;
-      }
-      if (this._config.html) {
-        templateElement.innerHTML = this._maybeSanitize(content);
-        return;
-      }
-      templateElement.textContent = content;
-    }
-    _maybeSanitize(arg) {
-      return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;
-    }
-    _resolvePossibleFunction(arg) {
-      return execute(arg, [this]);
-    }
-    _putElementInTemplate(element, templateElement) {
-      if (this._config.html) {
-        templateElement.innerHTML = "";
-        templateElement.append(element);
-        return;
-      }
-      templateElement.textContent = element.textContent;
-    }
-  };
-  var NAME$4 = "tooltip";
-  var DISALLOWED_ATTRIBUTES = /* @__PURE__ */ new Set(["sanitize", "allowList", "sanitizeFn"]);
-  var CLASS_NAME_FADE$2 = "fade";
-  var CLASS_NAME_MODAL = "modal";
-  var CLASS_NAME_SHOW$2 = "show";
-  var SELECTOR_TOOLTIP_INNER = ".tooltip-inner";
-  var SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
-  var EVENT_MODAL_HIDE = "hide.bs.modal";
-  var TRIGGER_HOVER = "hover";
-  var TRIGGER_FOCUS = "focus";
-  var TRIGGER_CLICK = "click";
-  var TRIGGER_MANUAL = "manual";
-  var EVENT_HIDE$2 = "hide";
-  var EVENT_HIDDEN$2 = "hidden";
-  var EVENT_SHOW$2 = "show";
-  var EVENT_SHOWN$2 = "shown";
-  var EVENT_INSERTED = "inserted";
-  var EVENT_CLICK$1 = "click";
-  var EVENT_FOCUSIN$1 = "focusin";
-  var EVENT_FOCUSOUT$1 = "focusout";
-  var EVENT_MOUSEENTER = "mouseenter";
-  var EVENT_MOUSELEAVE = "mouseleave";
-  var AttachmentMap = {
-    AUTO: "auto",
-    TOP: "top",
-    RIGHT: isRTL() ? "left" : "right",
-    BOTTOM: "bottom",
-    LEFT: isRTL() ? "right" : "left"
-  };
-  var Default$3 = {
-    allowList: DefaultAllowlist,
-    animation: true,
-    boundary: "clippingParents",
-    container: false,
-    customClass: "",
-    delay: 0,
-    fallbackPlacements: ["top", "right", "bottom", "left"],
-    html: false,
-    offset: [0, 6],
-    placement: "top",
-    popperConfig: null,
-    sanitize: true,
-    sanitizeFn: null,
-    selector: false,
-    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
-    title: "",
-    trigger: "hover focus"
-  };
-  var DefaultType$3 = {
-    allowList: "object",
-    animation: "boolean",
-    boundary: "(string|element)",
-    container: "(string|element|boolean)",
-    customClass: "(string|function)",
-    delay: "(number|object)",
-    fallbackPlacements: "array",
-    html: "boolean",
-    offset: "(array|string|function)",
-    placement: "(string|function)",
-    popperConfig: "(null|object|function)",
-    sanitize: "boolean",
-    sanitizeFn: "(null|function)",
-    selector: "(string|boolean)",
-    template: "string",
-    title: "(string|element|function)",
-    trigger: "string"
-  };
-  var Tooltip = class _Tooltip extends BaseComponent {
-    constructor(element, config) {
-      if (typeof lib_exports === "undefined") {
-        throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");
-      }
-      super(element, config);
-      this._isEnabled = true;
-      this._timeout = 0;
-      this._isHovered = null;
-      this._activeTrigger = {};
-      this._popper = null;
-      this._templateFactory = null;
-      this._newContent = null;
-      this.tip = null;
-      this._setListeners();
-      if (!this._config.selector) {
-        this._fixTitle();
-      }
-    }
-    // Getters
-    static get Default() {
-      return Default$3;
-    }
-    static get DefaultType() {
-      return DefaultType$3;
-    }
-    static get NAME() {
-      return NAME$4;
-    }
-    // Public
-    enable() {
-      this._isEnabled = true;
-    }
-    disable() {
-      this._isEnabled = false;
-    }
-    toggleEnabled() {
-      this._isEnabled = !this._isEnabled;
-    }
-    toggle() {
-      if (!this._isEnabled) {
-        return;
-      }
-      this._activeTrigger.click = !this._activeTrigger.click;
-      if (this._isShown()) {
-        this._leave();
-        return;
-      }
-      this._enter();
-    }
-    dispose() {
-      clearTimeout(this._timeout);
-      EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
-      if (this._element.getAttribute("data-bs-original-title")) {
-        this._element.setAttribute("title", this._element.getAttribute("data-bs-original-title"));
-      }
-      this._disposePopper();
-      super.dispose();
-    }
-    show() {
-      if (this._element.style.display === "none") {
-        throw new Error("Please use show on visible elements");
-      }
-      if (!(this._isWithContent() && this._isEnabled)) {
-        return;
-      }
-      const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));
-      const shadowRoot = findShadowRoot(this._element);
-      const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);
-      if (showEvent.defaultPrevented || !isInTheDom) {
-        return;
-      }
-      this._disposePopper();
-      const tip = this._getTipElement();
-      this._element.setAttribute("aria-describedby", tip.getAttribute("id"));
-      const {
-        container
-      } = this._config;
-      if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
-        container.append(tip);
-        EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));
-      }
-      this._popper = this._createPopper(tip);
-      tip.classList.add(CLASS_NAME_SHOW$2);
-      if ("ontouchstart" in document.documentElement) {
-        for (const element of [].concat(...document.body.children)) {
-          EventHandler.on(element, "mouseover", noop);
-        }
-      }
-      const complete = () => {
-        EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));
-        if (this._isHovered === false) {
-          this._leave();
-        }
-        this._isHovered = false;
-      };
-      this._queueCallback(complete, this.tip, this._isAnimated());
-    }
-    hide() {
-      if (!this._isShown()) {
-        return;
-      }
-      const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));
-      if (hideEvent.defaultPrevented) {
-        return;
-      }
-      const tip = this._getTipElement();
-      tip.classList.remove(CLASS_NAME_SHOW$2);
-      if ("ontouchstart" in document.documentElement) {
-        for (const element of [].concat(...document.body.children)) {
-          EventHandler.off(element, "mouseover", noop);
-        }
-      }
-      this._activeTrigger[TRIGGER_CLICK] = false;
-      this._activeTrigger[TRIGGER_FOCUS] = false;
-      this._activeTrigger[TRIGGER_HOVER] = false;
-      this._isHovered = null;
-      const complete = () => {
-        if (this._isWithActiveTrigger()) {
-          return;
-        }
-        if (!this._isHovered) {
-          this._disposePopper();
-        }
-        this._element.removeAttribute("aria-describedby");
-        EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));
-      };
-      this._queueCallback(complete, this.tip, this._isAnimated());
-    }
-    update() {
-      if (this._popper) {
-        this._popper.update();
-      }
-    }
-    // Protected
-    _isWithContent() {
-      return Boolean(this._getTitle());
-    }
-    _getTipElement() {
-      if (!this.tip) {
-        this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());
-      }
-      return this.tip;
-    }
-    _createTipElement(content) {
-      const tip = this._getTemplateFactory(content).toHtml();
-      if (!tip) {
-        return null;
-      }
-      tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);
-      tip.classList.add(`bs-${this.constructor.NAME}-auto`);
-      const tipId = getUID(this.constructor.NAME).toString();
-      tip.setAttribute("id", tipId);
-      if (this._isAnimated()) {
-        tip.classList.add(CLASS_NAME_FADE$2);
-      }
-      return tip;
-    }
-    setContent(content) {
-      this._newContent = content;
-      if (this._isShown()) {
-        this._disposePopper();
-        this.show();
-      }
-    }
-    _getTemplateFactory(content) {
-      if (this._templateFactory) {
-        this._templateFactory.changeContent(content);
-      } else {
-        this._templateFactory = new TemplateFactory(__spreadProps(__spreadValues({}, this._config), {
-          // the `content` var has to be after `this._config`
-          // to override config.content in case of popover
-          content,
-          extraClass: this._resolvePossibleFunction(this._config.customClass)
-        }));
-      }
-      return this._templateFactory;
-    }
-    _getContentForTemplate() {
-      return {
-        [SELECTOR_TOOLTIP_INNER]: this._getTitle()
-      };
-    }
-    _getTitle() {
-      return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute("data-bs-original-title");
-    }
-    // Private
-    _initializeOnDelegatedTarget(event) {
-      return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
-    }
-    _isAnimated() {
-      return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);
-    }
-    _isShown() {
-      return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);
-    }
-    _createPopper(tip) {
-      const placement = execute(this._config.placement, [this, tip, this._element]);
-      const attachment = AttachmentMap[placement.toUpperCase()];
-      return createPopper3(this._element, tip, this._getPopperConfig(attachment));
-    }
-    _getOffset() {
-      const {
-        offset: offset2
-      } = this._config;
-      if (typeof offset2 === "string") {
-        return offset2.split(",").map((value) => Number.parseInt(value, 10));
-      }
-      if (typeof offset2 === "function") {
-        return (popperData) => offset2(popperData, this._element);
-      }
-      return offset2;
-    }
-    _resolvePossibleFunction(arg) {
-      return execute(arg, [this._element]);
-    }
-    _getPopperConfig(attachment) {
-      const defaultBsPopperConfig = {
-        placement: attachment,
-        modifiers: [{
-          name: "flip",
-          options: {
-            fallbackPlacements: this._config.fallbackPlacements
-          }
-        }, {
-          name: "offset",
-          options: {
-            offset: this._getOffset()
-          }
-        }, {
-          name: "preventOverflow",
-          options: {
-            boundary: this._config.boundary
-          }
-        }, {
-          name: "arrow",
-          options: {
-            element: `.${this.constructor.NAME}-arrow`
-          }
-        }, {
-          name: "preSetPlacement",
-          enabled: true,
-          phase: "beforeMain",
-          fn: (data) => {
-            this._getTipElement().setAttribute("data-popper-placement", data.state.placement);
-          }
-        }]
-      };
-      return __spreadValues(__spreadValues({}, defaultBsPopperConfig), execute(this._config.popperConfig, [defaultBsPopperConfig]));
-    }
-    _setListeners() {
-      const triggers = this._config.trigger.split(" ");
-      for (const trigger of triggers) {
-        if (trigger === "click") {
-          EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, (event) => {
-            const context = this._initializeOnDelegatedTarget(event);
-            context.toggle();
-          });
-        } else if (trigger !== TRIGGER_MANUAL) {
-          const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);
-          const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);
-          EventHandler.on(this._element, eventIn, this._config.selector, (event) => {
-            const context = this._initializeOnDelegatedTarget(event);
-            context._activeTrigger[event.type === "focusin" ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
-            context._enter();
-          });
-          EventHandler.on(this._element, eventOut, this._config.selector, (event) => {
-            const context = this._initializeOnDelegatedTarget(event);
-            context._activeTrigger[event.type === "focusout" ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
-            context._leave();
-          });
-        }
-      }
-      this._hideModalHandler = () => {
-        if (this._element) {
-          this.hide();
-        }
-      };
-      EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
-    }
-    _fixTitle() {
-      const title = this._element.getAttribute("title");
-      if (!title) {
-        return;
-      }
-      if (!this._element.getAttribute("aria-label") && !this._element.textContent.trim()) {
-        this._element.setAttribute("aria-label", title);
-      }
-      this._element.setAttribute("data-bs-original-title", title);
-      this._element.removeAttribute("title");
-    }
-    _enter() {
-      if (this._isShown() || this._isHovered) {
-        this._isHovered = true;
-        return;
-      }
-      this._isHovered = true;
-      this._setTimeout(() => {
-        if (this._isHovered) {
-          this.show();
-        }
-      }, this._config.delay.show);
-    }
-    _leave() {
-      if (this._isWithActiveTrigger()) {
-        return;
-      }
-      this._isHovered = false;
-      this._setTimeout(() => {
-        if (!this._isHovered) {
-          this.hide();
-        }
-      }, this._config.delay.hide);
-    }
-    _setTimeout(handler, timeout) {
-      clearTimeout(this._timeout);
-      this._timeout = setTimeout(handler, timeout);
-    }
-    _isWithActiveTrigger() {
-      return Object.values(this._activeTrigger).includes(true);
-    }
-    _getConfig(config) {
-      const dataAttributes = Manipulator.getDataAttributes(this._element);
-      for (const dataAttribute of Object.keys(dataAttributes)) {
-        if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {
-          delete dataAttributes[dataAttribute];
-        }
-      }
-      config = __spreadValues(__spreadValues({}, dataAttributes), typeof config === "object" && config ? config : {});
-      config = this._mergeConfigObj(config);
-      config = this._configAfterMerge(config);
-      this._typeCheckConfig(config);
-      return config;
-    }
-    _configAfterMerge(config) {
-      config.container = config.container === false ? document.body : getElement(config.container);
-      if (typeof config.delay === "number") {
-        config.delay = {
-          show: config.delay,
-          hide: config.delay
-        };
-      }
-      if (typeof config.title === "number") {
-        config.title = config.title.toString();
-      }
-      if (typeof config.content === "number") {
-        config.content = config.content.toString();
-      }
-      return config;
-    }
-    _getDelegateConfig() {
-      const config = {};
-      for (const [key, value] of Object.entries(this._config)) {
-        if (this.constructor.Default[key] !== value) {
-          config[key] = value;
-        }
-      }
-      config.selector = false;
-      config.trigger = "manual";
-      return config;
-    }
-    _disposePopper() {
-      if (this._popper) {
-        this._popper.destroy();
-        this._popper = null;
-      }
-      if (this.tip) {
-        this.tip.remove();
-        this.tip = null;
-      }
-    }
-    // Static
-    static jQueryInterface(config) {
-      return this.each(function() {
-        const data = _Tooltip.getOrCreateInstance(this, config);
-        if (typeof config !== "string") {
-          return;
-        }
-        if (typeof data[config] === "undefined") {
-          throw new TypeError(`No method named "${config}"`);
-        }
-        data[config]();
-      });
-    }
-  };
-  defineJQueryPlugin(Tooltip);
-  var NAME$3 = "popover";
-  var SELECTOR_TITLE = ".popover-header";
-  var SELECTOR_CONTENT = ".popover-body";
-  var Default$2 = __spreadProps(__spreadValues({}, Tooltip.Default), {
-    content: "",
-    offset: [0, 8],
-    placement: "right",
-    template: '<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',
-    trigger: "click"
-  });
-  var DefaultType$2 = __spreadProps(__spreadValues({}, Tooltip.DefaultType), {
-    content: "(null|string|element|function)"
-  });
-  var Popover = class _Popover extends Tooltip {
-    // Getters
-    static get Default() {
-      return Default$2;
-    }
-    static get DefaultType() {
-      return DefaultType$2;
-    }
-    static get NAME() {
-      return NAME$3;
-    }
-    // Overrides
-    _isWithContent() {
-      return this._getTitle() || this._getContent();
-    }
-    // Private
-    _getContentForTemplate() {
-      return {
-        [SELECTOR_TITLE]: this._getTitle(),
-        [SELECTOR_CONTENT]: this._getContent()
-      };
-    }
-    _getContent() {
-      return this._resolvePossibleFunction(this._config.content);
-    }
-    // Static
-    static jQueryInterface(config) {
-      return this.each(function() {
-        const data = _Popover.getOrCreateInstance(this, config);
-        if (typeof config !== "string") {
-          return;
-        }
-        if (typeof data[config] === "undefined") {
-          throw new TypeError(`No method named "${config}"`);
-        }
-        data[config]();
-      });
-    }
-  };
-  defineJQueryPlugin(Popover);
-  var NAME$2 = "scrollspy";
-  var DATA_KEY$2 = "bs.scrollspy";
-  var EVENT_KEY$2 = `.${DATA_KEY$2}`;
-  var DATA_API_KEY = ".data-api";
-  var EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;
-  var EVENT_CLICK = `click${EVENT_KEY$2}`;
-  var EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;
-  var CLASS_NAME_DROPDOWN_ITEM = "dropdown-item";
-  var CLASS_NAME_ACTIVE$1 = "active";
-  var SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
-  var SELECTOR_TARGET_LINKS = "[href]";
-  var SELECTOR_NAV_LIST_GROUP = ".nav, .list-group";
-  var SELECTOR_NAV_LINKS = ".nav-link";
-  var SELECTOR_NAV_ITEMS = ".nav-item";
-  var SELECTOR_LIST_ITEMS = ".list-group-item";
-  var SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;
-  var SELECTOR_DROPDOWN = ".dropdown";
-  var SELECTOR_DROPDOWN_TOGGLE$1 = ".dropdown-toggle";
-  var Default$1 = {
-    offset: null,
-    // TODO: v6 @deprecated, keep it for backwards compatibility reasons
-    rootMargin: "0px 0px -25%",
-    smoothScroll: false,
-    target: null,
-    threshold: [0.1, 0.5, 1]
-  };
-  var DefaultType$1 = {
-    offset: "(number|null)",
-    // TODO v6 @deprecated, keep it for backwards compatibility reasons
-    rootMargin: "string",
-    smoothScroll: "boolean",
-    target: "element",
-    threshold: "array"
-  };
-  var ScrollSpy = class _ScrollSpy extends BaseComponent {
-    constructor(element, config) {
-      super(element, config);
-      this._targetLinks = /* @__PURE__ */ new Map();
-      this._observableSections = /* @__PURE__ */ new Map();
-      this._rootElement = getComputedStyle(this._element).overflowY === "visible" ? null : this._element;
-      this._activeTarget = null;
-      this._observer = null;
-      this._previousScrollData = {
-        visibleEntryTop: 0,
-        parentScrollTop: 0
-      };
-      this.refresh();
-    }
-    // Getters
-    static get Default() {
-      return Default$1;
-    }
-    static get DefaultType() {
-      return DefaultType$1;
-    }
-    static get NAME() {
-      return NAME$2;
-    }
-    // Public
-    refresh() {
-      this._initializeTargetsAndObservables();
-      this._maybeEnableSmoothScroll();
-      if (this._observer) {
-        this._observer.disconnect();
-      } else {
-        this._observer = this._getNewObserver();
-      }
-      for (const section of this._observableSections.values()) {
-        this._observer.observe(section);
-      }
-    }
-    dispose() {
-      this._observer.disconnect();
-      super.dispose();
-    }
-    // Private
-    _configAfterMerge(config) {
-      config.target = getElement(config.target) || document.body;
-      config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;
-      if (typeof config.threshold === "string") {
-        config.threshold = config.threshold.split(",").map((value) => Number.parseFloat(value));
-      }
-      return config;
-    }
-    _maybeEnableSmoothScroll() {
-      if (!this._config.smoothScroll) {
-        return;
-      }
-      EventHandler.off(this._config.target, EVENT_CLICK);
-      EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, (event) => {
-        const observableSection = this._observableSections.get(event.target.hash);
-        if (observableSection) {
-          event.preventDefault();
-          const root = this._rootElement || window;
-          const height = observableSection.offsetTop - this._element.offsetTop;
-          if (root.scrollTo) {
-            root.scrollTo({
-              top: height,
-              behavior: "smooth"
-            });
-            return;
-          }
-          root.scrollTop = height;
-        }
-      });
-    }
-    _getNewObserver() {
-      const options = {
-        root: this._rootElement,
-        threshold: this._config.threshold,
-        rootMargin: this._config.rootMargin
-      };
-      return new IntersectionObserver((entries) => this._observerCallback(entries), options);
-    }
-    // The logic of selection
-    _observerCallback(entries) {
-      const targetElement = (entry) => this._targetLinks.get(`#${entry.target.id}`);
-      const activate = (entry) => {
-        this._previousScrollData.visibleEntryTop = entry.target.offsetTop;
-        this._process(targetElement(entry));
-      };
-      const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;
-      const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;
-      this._previousScrollData.parentScrollTop = parentScrollTop;
-      for (const entry of entries) {
-        if (!entry.isIntersecting) {
-          this._activeTarget = null;
-          this._clearActiveClass(targetElement(entry));
-          continue;
-        }
-        const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;
-        if (userScrollsDown && entryIsLowerThanPrevious) {
-          activate(entry);
-          if (!parentScrollTop) {
-            return;
-          }
-          continue;
-        }
-        if (!userScrollsDown && !entryIsLowerThanPrevious) {
-          activate(entry);
-        }
-      }
-    }
-    _initializeTargetsAndObservables() {
-      this._targetLinks = /* @__PURE__ */ new Map();
-      this._observableSections = /* @__PURE__ */ new Map();
-      const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);
-      for (const anchor of targetLinks) {
-        if (!anchor.hash || isDisabled(anchor)) {
-          continue;
-        }
-        const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);
-        if (isVisible(observableSection)) {
-          this._targetLinks.set(decodeURI(anchor.hash), anchor);
-          this._observableSections.set(anchor.hash, observableSection);
-        }
-      }
-    }
-    _process(target) {
-      if (this._activeTarget === target) {
-        return;
-      }
-      this._clearActiveClass(this._config.target);
-      this._activeTarget = target;
-      target.classList.add(CLASS_NAME_ACTIVE$1);
-      this._activateParents(target);
-      EventHandler.trigger(this._element, EVENT_ACTIVATE, {
-        relatedTarget: target
-      });
-    }
-    _activateParents(target) {
-      if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
-        SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);
-        return;
-      }
-      for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {
-        for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {
-          item.classList.add(CLASS_NAME_ACTIVE$1);
-        }
-      }
-    }
-    _clearActiveClass(parent) {
-      parent.classList.remove(CLASS_NAME_ACTIVE$1);
-      const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`, parent);
-      for (const node of activeNodes) {
-        node.classList.remove(CLASS_NAME_ACTIVE$1);
-      }
-    }
-    // Static
-    static jQueryInterface(config) {
-      return this.each(function() {
-        const data = _ScrollSpy.getOrCreateInstance(this, config);
-        if (typeof config !== "string") {
-          return;
-        }
-        if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
-          throw new TypeError(`No method named "${config}"`);
-        }
-        data[config]();
-      });
-    }
-  };
-  EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => {
-    for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {
-      ScrollSpy.getOrCreateInstance(spy);
-    }
-  });
-  defineJQueryPlugin(ScrollSpy);
-  var NAME$1 = "tab";
-  var DATA_KEY$1 = "bs.tab";
-  var EVENT_KEY$1 = `.${DATA_KEY$1}`;
-  var EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;
-  var EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;
-  var EVENT_SHOW$1 = `show${EVENT_KEY$1}`;
-  var EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;
-  var EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}`;
-  var EVENT_KEYDOWN = `keydown${EVENT_KEY$1}`;
-  var EVENT_LOAD_DATA_API = `load${EVENT_KEY$1}`;
-  var ARROW_LEFT_KEY = "ArrowLeft";
-  var ARROW_RIGHT_KEY = "ArrowRight";
-  var ARROW_UP_KEY = "ArrowUp";
-  var ARROW_DOWN_KEY = "ArrowDown";
-  var HOME_KEY = "Home";
-  var END_KEY = "End";
-  var CLASS_NAME_ACTIVE = "active";
-  var CLASS_NAME_FADE$1 = "fade";
-  var CLASS_NAME_SHOW$1 = "show";
-  var CLASS_DROPDOWN = "dropdown";
-  var SELECTOR_DROPDOWN_TOGGLE = ".dropdown-toggle";
-  var SELECTOR_DROPDOWN_MENU = ".dropdown-menu";
-  var NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`;
-  var SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]';
-  var SELECTOR_OUTER = ".nav-item, .list-group-item";
-  var SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;
-  var SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]';
-  var SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;
-  var SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`;
-  var Tab = class _Tab extends BaseComponent {
-    constructor(element) {
-      super(element);
-      this._parent = this._element.closest(SELECTOR_TAB_PANEL);
-      if (!this._parent) {
-        return;
-      }
-      this._setInitialAttributes(this._parent, this._getChildren());
-      EventHandler.on(this._element, EVENT_KEYDOWN, (event) => this._keydown(event));
-    }
-    // Getters
-    static get NAME() {
-      return NAME$1;
-    }
-    // Public
-    show() {
-      const innerElem = this._element;
-      if (this._elemIsActive(innerElem)) {
-        return;
-      }
-      const active = this._getActiveElem();
-      const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE$1, {
-        relatedTarget: innerElem
-      }) : null;
-      const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW$1, {
-        relatedTarget: active
-      });
-      if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) {
-        return;
-      }
-      this._deactivate(active, innerElem);
-      this._activate(innerElem, active);
-    }
-    // Private
-    _activate(element, relatedElem) {
-      if (!element) {
-        return;
-      }
-      element.classList.add(CLASS_NAME_ACTIVE);
-      this._activate(SelectorEngine.getElementFromSelector(element));
-      const complete = () => {
-        if (element.getAttribute("role") !== "tab") {
-          element.classList.add(CLASS_NAME_SHOW$1);
-          return;
-        }
-        element.removeAttribute("tabindex");
-        element.setAttribute("aria-selected", true);
-        this._toggleDropDown(element, true);
-        EventHandler.trigger(element, EVENT_SHOWN$1, {
-          relatedTarget: relatedElem
-        });
-      };
-      this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
-    }
-    _deactivate(element, relatedElem) {
-      if (!element) {
-        return;
-      }
-      element.classList.remove(CLASS_NAME_ACTIVE);
-      element.blur();
-      this._deactivate(SelectorEngine.getElementFromSelector(element));
-      const complete = () => {
-        if (element.getAttribute("role") !== "tab") {
-          element.classList.remove(CLASS_NAME_SHOW$1);
-          return;
-        }
-        element.setAttribute("aria-selected", false);
-        element.setAttribute("tabindex", "-1");
-        this._toggleDropDown(element, false);
-        EventHandler.trigger(element, EVENT_HIDDEN$1, {
-          relatedTarget: relatedElem
-        });
-      };
-      this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
-    }
-    _keydown(event) {
-      if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key)) {
-        return;
-      }
-      event.stopPropagation();
-      event.preventDefault();
-      const children = this._getChildren().filter((element) => !isDisabled(element));
-      let nextActiveElement;
-      if ([HOME_KEY, END_KEY].includes(event.key)) {
-        nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1];
-      } else {
-        const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
-        nextActiveElement = getNextActiveElement(children, event.target, isNext, true);
-      }
-      if (nextActiveElement) {
-        nextActiveElement.focus({
-          preventScroll: true
-        });
-        _Tab.getOrCreateInstance(nextActiveElement).show();
-      }
-    }
-    _getChildren() {
-      return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent);
-    }
-    _getActiveElem() {
-      return this._getChildren().find((child) => this._elemIsActive(child)) || null;
-    }
-    _setInitialAttributes(parent, children) {
-      this._setAttributeIfNotExists(parent, "role", "tablist");
-      for (const child of children) {
-        this._setInitialAttributesOnChild(child);
-      }
-    }
-    _setInitialAttributesOnChild(child) {
-      child = this._getInnerElement(child);
-      const isActive = this._elemIsActive(child);
-      const outerElem = this._getOuterElement(child);
-      child.setAttribute("aria-selected", isActive);
-      if (outerElem !== child) {
-        this._setAttributeIfNotExists(outerElem, "role", "presentation");
-      }
-      if (!isActive) {
-        child.setAttribute("tabindex", "-1");
-      }
-      this._setAttributeIfNotExists(child, "role", "tab");
-      this._setInitialAttributesOnTargetPanel(child);
-    }
-    _setInitialAttributesOnTargetPanel(child) {
-      const target = SelectorEngine.getElementFromSelector(child);
-      if (!target) {
-        return;
-      }
-      this._setAttributeIfNotExists(target, "role", "tabpanel");
-      if (child.id) {
-        this._setAttributeIfNotExists(target, "aria-labelledby", `${child.id}`);
-      }
-    }
-    _toggleDropDown(element, open) {
-      const outerElem = this._getOuterElement(element);
-      if (!outerElem.classList.contains(CLASS_DROPDOWN)) {
-        return;
-      }
-      const toggle = (selector, className) => {
-        const element2 = SelectorEngine.findOne(selector, outerElem);
-        if (element2) {
-          element2.classList.toggle(className, open);
-        }
-      };
-      toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE);
-      toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW$1);
-      outerElem.setAttribute("aria-expanded", open);
-    }
-    _setAttributeIfNotExists(element, attribute, value) {
-      if (!element.hasAttribute(attribute)) {
-        element.setAttribute(attribute, value);
-      }
-    }
-    _elemIsActive(elem) {
-      return elem.classList.contains(CLASS_NAME_ACTIVE);
-    }
-    // Try to get the inner element (usually the .nav-link)
-    _getInnerElement(elem) {
-      return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem);
-    }
-    // Try to get the outer element (usually the .nav-item)
-    _getOuterElement(elem) {
-      return elem.closest(SELECTOR_OUTER) || elem;
-    }
-    // Static
-    static jQueryInterface(config) {
-      return this.each(function() {
-        const data = _Tab.getOrCreateInstance(this);
-        if (typeof config !== "string") {
-          return;
-        }
-        if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
-          throw new TypeError(`No method named "${config}"`);
-        }
-        data[config]();
-      });
-    }
-  };
-  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function(event) {
-    if (["A", "AREA"].includes(this.tagName)) {
-      event.preventDefault();
-    }
-    if (isDisabled(this)) {
-      return;
-    }
-    Tab.getOrCreateInstance(this).show();
-  });
-  EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
-    for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {
-      Tab.getOrCreateInstance(element);
-    }
-  });
-  defineJQueryPlugin(Tab);
-  var NAME = "toast";
-  var DATA_KEY = "bs.toast";
-  var EVENT_KEY = `.${DATA_KEY}`;
-  var EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
-  var EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
-  var EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
-  var EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;
-  var EVENT_HIDE = `hide${EVENT_KEY}`;
-  var EVENT_HIDDEN = `hidden${EVENT_KEY}`;
-  var EVENT_SHOW = `show${EVENT_KEY}`;
-  var EVENT_SHOWN = `shown${EVENT_KEY}`;
-  var CLASS_NAME_FADE = "fade";
-  var CLASS_NAME_HIDE = "hide";
-  var CLASS_NAME_SHOW = "show";
-  var CLASS_NAME_SHOWING = "showing";
-  var DefaultType = {
-    animation: "boolean",
-    autohide: "boolean",
-    delay: "number"
-  };
-  var Default = {
-    animation: true,
-    autohide: true,
-    delay: 5e3
-  };
-  var Toast = class _Toast extends BaseComponent {
-    constructor(element, config) {
-      super(element, config);
-      this._timeout = null;
-      this._hasMouseInteraction = false;
-      this._hasKeyboardInteraction = false;
-      this._setListeners();
-    }
-    // Getters
-    static get Default() {
-      return Default;
-    }
-    static get DefaultType() {
-      return DefaultType;
-    }
-    static get NAME() {
-      return NAME;
-    }
-    // Public
-    show() {
-      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);
-      if (showEvent.defaultPrevented) {
-        return;
-      }
-      this._clearTimeout();
-      if (this._config.animation) {
-        this._element.classList.add(CLASS_NAME_FADE);
-      }
-      const complete = () => {
-        this._element.classList.remove(CLASS_NAME_SHOWING);
-        EventHandler.trigger(this._element, EVENT_SHOWN);
-        this._maybeScheduleHide();
-      };
-      this._element.classList.remove(CLASS_NAME_HIDE);
-      reflow(this._element);
-      this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING);
-      this._queueCallback(complete, this._element, this._config.animation);
-    }
-    hide() {
-      if (!this.isShown()) {
-        return;
-      }
-      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
-      if (hideEvent.defaultPrevented) {
-        return;
-      }
-      const complete = () => {
-        this._element.classList.add(CLASS_NAME_HIDE);
-        this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW);
-        EventHandler.trigger(this._element, EVENT_HIDDEN);
-      };
-      this._element.classList.add(CLASS_NAME_SHOWING);
-      this._queueCallback(complete, this._element, this._config.animation);
-    }
-    dispose() {
-      this._clearTimeout();
-      if (this.isShown()) {
-        this._element.classList.remove(CLASS_NAME_SHOW);
-      }
-      super.dispose();
-    }
-    isShown() {
-      return this._element.classList.contains(CLASS_NAME_SHOW);
-    }
-    // Private
-    _maybeScheduleHide() {
-      if (!this._config.autohide) {
-        return;
-      }
-      if (this._hasMouseInteraction || this._hasKeyboardInteraction) {
-        return;
-      }
-      this._timeout = setTimeout(() => {
-        this.hide();
-      }, this._config.delay);
-    }
-    _onInteraction(event, isInteracting) {
-      switch (event.type) {
-        case "mouseover":
-        case "mouseout": {
-          this._hasMouseInteraction = isInteracting;
-          break;
-        }
-        case "focusin":
-        case "focusout": {
-          this._hasKeyboardInteraction = isInteracting;
-          break;
-        }
-      }
-      if (isInteracting) {
-        this._clearTimeout();
-        return;
-      }
-      const nextElement = event.relatedTarget;
-      if (this._element === nextElement || this._element.contains(nextElement)) {
-        return;
-      }
-      this._maybeScheduleHide();
-    }
-    _setListeners() {
-      EventHandler.on(this._element, EVENT_MOUSEOVER, (event) => this._onInteraction(event, true));
-      EventHandler.on(this._element, EVENT_MOUSEOUT, (event) => this._onInteraction(event, false));
-      EventHandler.on(this._element, EVENT_FOCUSIN, (event) => this._onInteraction(event, true));
-      EventHandler.on(this._element, EVENT_FOCUSOUT, (event) => this._onInteraction(event, false));
-    }
-    _clearTimeout() {
-      clearTimeout(this._timeout);
-      this._timeout = null;
-    }
-    // Static
-    static jQueryInterface(config) {
-      return this.each(function() {
-        const data = _Toast.getOrCreateInstance(this, config);
-        if (typeof config === "string") {
-          if (typeof data[config] === "undefined") {
-            throw new TypeError(`No method named "${config}"`);
-          }
-          data[config](this);
-        }
-      });
-    }
-  };
-  enableDismissTrigger(Toast);
-  defineJQueryPlugin(Toast);
-
-  // js/app.js
-  var import_prism = __toESM(require_prism());
-
-  // js/repository.js
-  var import_jquery = __toESM(require_jquery());
-  (0, import_jquery.default)(function() {
-    (0, import_jquery.default)("select.tree").change(function() {
-      document.location = this.value;
-    });
-  });
-
-  // js/kmx_anim.js
-  var import_jquery2 = __toESM(require_jquery());
-
-  // js/kmx_colors.js
-  var kmx_colors = {
-    "kmx-black": "#1e1f1d",
-    "kmx-blue": "#5a60f9",
-    "kmx-blue1": "#6f72f9",
-    "kmx-blue2": "#9c99fd",
-    "kmx-blue3": "#5a60f9",
-    "kmx-blue4": "#6f72f9",
-    "kmx-blue5": "#9c99fd",
-    "index": [
-      "kmx-black",
-      "kmx-blue",
-      "kmx-blue1",
-      "kmx-blue2",
-      "kmx-blue3",
-      "kmx-blue4",
-      "kmx-blue5",
-      "kmx-cyan",
-      "kmx-cyan1",
-      "kmx-green",
-      "kmx-green1",
-      "kmx-orange",
-      "kmx-orange1",
-      "kmx-orange2",
-      "kmx-pink",
-      "kmx-white",
-      "kmx-white1",
-      "kmx-white2",
-      "kmx-yellow",
-      "kmx-yellow1",
-      "kmx-yellow2",
-      "kmx-yellow3"
-    ],
-    "kmx-cyan": "#d4f3f6",
-    "kmx-cyan1": "#d4f3f6",
-    "kmx-green": "#c4ed3a",
-    "kmx-green1": "#c4ed3a",
-    "kmx-orange": "#f8681c",
-    "kmx-orange1": "#fa7734",
-    "kmx-orange2": "#ffa532",
-    "kmx-pink": "#fc9ef9",
-    "kmx-white": "#f5f8f4",
-    "kmx-white1": "#fff9f2",
-    "kmx-white2": "#ffffff",
-    "kmx-yellow": "#ecfe49",
-    "kmx-yellow1": "#fff43e",
-    "kmx-yellow2": "#ecfe49",
-    "kmx-yellow3": "#fff43e"
-  };
-  var kmx_colors_default = kmx_colors;
-
-  // js/kmx_anim.js
-  function getRandomInt(max2) {
-    return Math.floor(Math.random() * max2);
-  }
-  (0, import_jquery2.default)(function() {
-    setInterval(function() {
-      const i = getRandomInt(kmx_colors_default.index.length);
-      const name = kmx_colors_default.index[i];
-      const color = kmx_colors_default[name];
-      const x = (getRandomInt(99) - 48) * 2e-3;
-      (0, import_jquery2.default)("a").css("text-shadow", "0 0 0");
-      (0, import_jquery2.default)("a:hover").css("text-shadow", x + "em 0 0 " + color);
-    }, 200);
-  });
-
-  // ../deps/phoenix_html/priv/static/phoenix_html.js
-  (function() {
-    var PolyfillEvent = eventConstructor();
-    function eventConstructor() {
-      if (typeof window.CustomEvent === "function")
-        return window.CustomEvent;
-      function CustomEvent2(event, params) {
-        params = params || { bubbles: false, cancelable: false, detail: void 0 };
-        var evt = document.createEvent("CustomEvent");
-        evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
-        return evt;
-      }
-      CustomEvent2.prototype = window.Event.prototype;
-      return CustomEvent2;
-    }
-    function buildHiddenInput(name, value) {
-      var input = document.createElement("input");
-      input.type = "hidden";
-      input.name = name;
-      input.value = value;
-      return input;
-    }
-    function handleClick(element, targetModifierKey) {
-      var to = element.getAttribute("data-to"), method = buildHiddenInput("_method", element.getAttribute("data-method")), csrf = buildHiddenInput("_csrf_token", element.getAttribute("data-csrf")), form = document.createElement("form"), submit = document.createElement("input"), target = element.getAttribute("target");
-      form.method = element.getAttribute("data-method") === "get" ? "get" : "post";
-      form.action = to;
-      form.style.display = "none";
-      if (target)
-        form.target = target;
-      else if (targetModifierKey)
-        form.target = "_blank";
-      form.appendChild(csrf);
-      form.appendChild(method);
-      document.body.appendChild(form);
-      submit.type = "submit";
-      form.appendChild(submit);
-      submit.click();
-    }
-    window.addEventListener("click", function(e) {
-      var element = e.target;
-      if (e.defaultPrevented)
-        return;
-      while (element && element.getAttribute) {
-        var phoenixLinkEvent = new PolyfillEvent("phoenix.link.click", {
-          "bubbles": true,
-          "cancelable": true
-        });
-        if (!element.dispatchEvent(phoenixLinkEvent)) {
-          e.preventDefault();
-          e.stopImmediatePropagation();
-          return false;
-        }
-        if (element.getAttribute("data-method")) {
-          handleClick(element, e.metaKey || e.shiftKey);
-          e.preventDefault();
-          return false;
-        } else {
-          element = element.parentNode;
-        }
-      }
-    }, false);
-    window.addEventListener("phoenix.link.click", function(e) {
-      var message = e.target.getAttribute("data-confirm");
-      if (message && !window.confirm(message)) {
-        e.preventDefault();
-      }
-    }, false);
-  })();
-
-  // ../deps/phoenix/priv/static/phoenix.mjs
-  var closure = (value) => {
-    if (typeof value === "function") {
-      return value;
-    } else {
-      let closure22 = function() {
-        return value;
-      };
-      return closure22;
-    }
-  };
-  var globalSelf = typeof self !== "undefined" ? self : null;
-  var phxWindow = typeof window !== "undefined" ? window : null;
-  var global2 = globalSelf || phxWindow || global2;
-  var DEFAULT_VSN = "2.0.0";
-  var SOCKET_STATES = { connecting: 0, open: 1, closing: 2, closed: 3 };
-  var DEFAULT_TIMEOUT = 1e4;
-  var WS_CLOSE_NORMAL = 1e3;
-  var CHANNEL_STATES = {
-    closed: "closed",
-    errored: "errored",
-    joined: "joined",
-    joining: "joining",
-    leaving: "leaving"
-  };
-  var CHANNEL_EVENTS = {
-    close: "phx_close",
-    error: "phx_error",
-    join: "phx_join",
-    reply: "phx_reply",
-    leave: "phx_leave"
-  };
-  var TRANSPORTS = {
-    longpoll: "longpoll",
-    websocket: "websocket"
-  };
-  var XHR_STATES = {
-    complete: 4
-  };
-  var Push = class {
-    constructor(channel, event, payload, timeout) {
-      this.channel = channel;
-      this.event = event;
-      this.payload = payload || function() {
-        return {};
-      };
-      this.receivedResp = null;
-      this.timeout = timeout;
-      this.timeoutTimer = null;
-      this.recHooks = [];
-      this.sent = false;
-    }
-    resend(timeout) {
-      this.timeout = timeout;
-      this.reset();
-      this.send();
-    }
-    send() {
-      if (this.hasReceived("timeout")) {
-        return;
-      }
-      this.startTimeout();
-      this.sent = true;
-      this.channel.socket.push({
-        topic: this.channel.topic,
-        event: this.event,
-        payload: this.payload(),
-        ref: this.ref,
-        join_ref: this.channel.joinRef()
-      });
-    }
-    receive(status, callback) {
-      if (this.hasReceived(status)) {
-        callback(this.receivedResp.response);
-      }
-      this.recHooks.push({ status, callback });
-      return this;
-    }
-    reset() {
-      this.cancelRefEvent();
-      this.ref = null;
-      this.refEvent = null;
-      this.receivedResp = null;
-      this.sent = false;
-    }
-    matchReceive({ status, response, _ref }) {
-      this.recHooks.filter((h) => h.status === status).forEach((h) => h.callback(response));
-    }
-    cancelRefEvent() {
-      if (!this.refEvent) {
-        return;
-      }
-      this.channel.off(this.refEvent);
-    }
-    cancelTimeout() {
-      clearTimeout(this.timeoutTimer);
-      this.timeoutTimer = null;
-    }
-    startTimeout() {
-      if (this.timeoutTimer) {
-        this.cancelTimeout();
-      }
-      this.ref = this.channel.socket.makeRef();
-      this.refEvent = this.channel.replyEventName(this.ref);
-      this.channel.on(this.refEvent, (payload) => {
-        this.cancelRefEvent();
-        this.cancelTimeout();
-        this.receivedResp = payload;
-        this.matchReceive(payload);
-      });
-      this.timeoutTimer = setTimeout(() => {
-        this.trigger("timeout", {});
-      }, this.timeout);
-    }
-    hasReceived(status) {
-      return this.receivedResp && this.receivedResp.status === status;
-    }
-    trigger(status, response) {
-      this.channel.trigger(this.refEvent, { status, response });
-    }
-  };
-  var Timer = class {
-    constructor(callback, timerCalc) {
-      this.callback = callback;
-      this.timerCalc = timerCalc;
-      this.timer = null;
-      this.tries = 0;
-    }
-    reset() {
-      this.tries = 0;
-      clearTimeout(this.timer);
-    }
-    scheduleTimeout() {
-      clearTimeout(this.timer);
-      this.timer = setTimeout(() => {
-        this.tries = this.tries + 1;
-        this.callback();
-      }, this.timerCalc(this.tries + 1));
-    }
-  };
-  var Channel = class {
-    constructor(topic, params, socket) {
-      this.state = CHANNEL_STATES.closed;
-      this.topic = topic;
-      this.params = closure(params || {});
-      this.socket = socket;
-      this.bindings = [];
-      this.bindingRef = 0;
-      this.timeout = this.socket.timeout;
-      this.joinedOnce = false;
-      this.joinPush = new Push(this, CHANNEL_EVENTS.join, this.params, this.timeout);
-      this.pushBuffer = [];
-      this.stateChangeRefs = [];
-      this.rejoinTimer = new Timer(() => {
-        if (this.socket.isConnected()) {
-          this.rejoin();
-        }
-      }, this.socket.rejoinAfterMs);
-      this.stateChangeRefs.push(this.socket.onError(() => this.rejoinTimer.reset()));
-      this.stateChangeRefs.push(this.socket.onOpen(() => {
-        this.rejoinTimer.reset();
-        if (this.isErrored()) {
-          this.rejoin();
-        }
-      }));
-      this.joinPush.receive("ok", () => {
-        this.state = CHANNEL_STATES.joined;
-        this.rejoinTimer.reset();
-        this.pushBuffer.forEach((pushEvent) => pushEvent.send());
-        this.pushBuffer = [];
-      });
-      this.joinPush.receive("error", () => {
-        this.state = CHANNEL_STATES.errored;
-        if (this.socket.isConnected()) {
-          this.rejoinTimer.scheduleTimeout();
-        }
-      });
-      this.onClose(() => {
-        this.rejoinTimer.reset();
-        if (this.socket.hasLogger())
-          this.socket.log("channel", `close ${this.topic} ${this.joinRef()}`);
-        this.state = CHANNEL_STATES.closed;
-        this.socket.remove(this);
-      });
-      this.onError((reason) => {
-        if (this.socket.hasLogger())
-          this.socket.log("channel", `error ${this.topic}`, reason);
-        if (this.isJoining()) {
-          this.joinPush.reset();
-        }
-        this.state = CHANNEL_STATES.errored;
-        if (this.socket.isConnected()) {
-          this.rejoinTimer.scheduleTimeout();
-        }
-      });
-      this.joinPush.receive("timeout", () => {
-        if (this.socket.hasLogger())
-          this.socket.log("channel", `timeout ${this.topic} (${this.joinRef()})`, this.joinPush.timeout);
-        let leavePush = new Push(this, CHANNEL_EVENTS.leave, closure({}), this.timeout);
-        leavePush.send();
-        this.state = CHANNEL_STATES.errored;
-        this.joinPush.reset();
-        if (this.socket.isConnected()) {
-          this.rejoinTimer.scheduleTimeout();
-        }
-      });
-      this.on(CHANNEL_EVENTS.reply, (payload, ref) => {
-        this.trigger(this.replyEventName(ref), payload);
-      });
-    }
-    join(timeout = this.timeout) {
-      if (this.joinedOnce) {
-        throw new Error("tried to join multiple times. 'join' can only be called a single time per channel instance");
-      } else {
-        this.timeout = timeout;
-        this.joinedOnce = true;
-        this.rejoin();
-        return this.joinPush;
-      }
-    }
-    onClose(callback) {
-      this.on(CHANNEL_EVENTS.close, callback);
-    }
-    onError(callback) {
-      return this.on(CHANNEL_EVENTS.error, (reason) => callback(reason));
-    }
-    on(event, callback) {
-      let ref = this.bindingRef++;
-      this.bindings.push({ event, ref, callback });
-      return ref;
-    }
-    off(event, ref) {
-      this.bindings = this.bindings.filter((bind) => {
-        return !(bind.event === event && (typeof ref === "undefined" || ref === bind.ref));
-      });
-    }
-    canPush() {
-      return this.socket.isConnected() && this.isJoined();
-    }
-    push(event, payload, timeout = this.timeout) {
-      payload = payload || {};
-      if (!this.joinedOnce) {
-        throw new Error(`tried to push '${event}' to '${this.topic}' before joining. Use channel.join() before pushing events`);
-      }
-      let pushEvent = new Push(this, event, function() {
-        return payload;
-      }, timeout);
-      if (this.canPush()) {
-        pushEvent.send();
-      } else {
-        pushEvent.startTimeout();
-        this.pushBuffer.push(pushEvent);
-      }
-      return pushEvent;
-    }
-    leave(timeout = this.timeout) {
-      this.rejoinTimer.reset();
-      this.joinPush.cancelTimeout();
-      this.state = CHANNEL_STATES.leaving;
-      let onClose = () => {
-        if (this.socket.hasLogger())
-          this.socket.log("channel", `leave ${this.topic}`);
-        this.trigger(CHANNEL_EVENTS.close, "leave");
-      };
-      let leavePush = new Push(this, CHANNEL_EVENTS.leave, closure({}), timeout);
-      leavePush.receive("ok", () => onClose()).receive("timeout", () => onClose());
-      leavePush.send();
-      if (!this.canPush()) {
-        leavePush.trigger("ok", {});
-      }
-      return leavePush;
-    }
-    onMessage(_event, payload, _ref) {
-      return payload;
-    }
-    isMember(topic, event, payload, joinRef) {
-      if (this.topic !== topic) {
-        return false;
-      }
-      if (joinRef && joinRef !== this.joinRef()) {
-        if (this.socket.hasLogger())
-          this.socket.log("channel", "dropping outdated message", { topic, event, payload, joinRef });
-        return false;
-      } else {
-        return true;
-      }
-    }
-    joinRef() {
-      return this.joinPush.ref;
-    }
-    rejoin(timeout = this.timeout) {
-      if (this.isLeaving()) {
-        return;
-      }
-      this.socket.leaveOpenTopic(this.topic);
-      this.state = CHANNEL_STATES.joining;
-      this.joinPush.resend(timeout);
-    }
-    trigger(event, payload, ref, joinRef) {
-      let handledPayload = this.onMessage(event, payload, ref, joinRef);
-      if (payload && !handledPayload) {
-        throw new Error("channel onMessage callbacks must return the payload, modified or unmodified");
-      }
-      let eventBindings = this.bindings.filter((bind) => bind.event === event);
-      for (let i = 0; i < eventBindings.length; i++) {
-        let bind = eventBindings[i];
-        bind.callback(handledPayload, ref, joinRef || this.joinRef());
-      }
-    }
-    replyEventName(ref) {
-      return `chan_reply_${ref}`;
-    }
-    isClosed() {
-      return this.state === CHANNEL_STATES.closed;
-    }
-    isErrored() {
-      return this.state === CHANNEL_STATES.errored;
-    }
-    isJoined() {
-      return this.state === CHANNEL_STATES.joined;
-    }
-    isJoining() {
-      return this.state === CHANNEL_STATES.joining;
-    }
-    isLeaving() {
-      return this.state === CHANNEL_STATES.leaving;
-    }
-  };
-  var Ajax = class {
-    static request(method, endPoint, accept, body, timeout, ontimeout, callback) {
-      if (global2.XDomainRequest) {
-        let req = new global2.XDomainRequest();
-        return this.xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback);
-      } else {
-        let req = new global2.XMLHttpRequest();
-        return this.xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback);
-      }
-    }
-    static xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback) {
-      req.timeout = timeout;
-      req.open(method, endPoint);
-      req.onload = () => {
-        let response = this.parseJSON(req.responseText);
-        callback && callback(response);
-      };
-      if (ontimeout) {
-        req.ontimeout = ontimeout;
-      }
-      req.onprogress = () => {
-      };
-      req.send(body);
-      return req;
-    }
-    static xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback) {
-      req.open(method, endPoint, true);
-      req.timeout = timeout;
-      req.setRequestHeader("Content-Type", accept);
-      req.onerror = () => callback && callback(null);
-      req.onreadystatechange = () => {
-        if (req.readyState === XHR_STATES.complete && callback) {
-          let response = this.parseJSON(req.responseText);
-          callback(response);
-        }
-      };
-      if (ontimeout) {
-        req.ontimeout = ontimeout;
-      }
-      req.send(body);
-      return req;
-    }
-    static parseJSON(resp) {
-      if (!resp || resp === "") {
-        return null;
-      }
-      try {
-        return JSON.parse(resp);
-      } catch (e) {
-        console && console.log("failed to parse JSON response", resp);
-        return null;
-      }
-    }
-    static serialize(obj, parentKey) {
-      let queryStr = [];
-      for (var key in obj) {
-        if (!Object.prototype.hasOwnProperty.call(obj, key)) {
-          continue;
-        }
-        let paramKey = parentKey ? `${parentKey}[${key}]` : key;
-        let paramVal = obj[key];
-        if (typeof paramVal === "object") {
-          queryStr.push(this.serialize(paramVal, paramKey));
-        } else {
-          queryStr.push(encodeURIComponent(paramKey) + "=" + encodeURIComponent(paramVal));
-        }
-      }
-      return queryStr.join("&");
-    }
-    static appendParams(url, params) {
-      if (Object.keys(params).length === 0) {
-        return url;
-      }
-      let prefix = url.match(/\?/) ? "&" : "?";
-      return `${url}${prefix}${this.serialize(params)}`;
-    }
-  };
-  var LongPoll = class {
-    constructor(endPoint) {
-      this.endPoint = null;
-      this.token = null;
-      this.skipHeartbeat = true;
-      this.reqs = /* @__PURE__ */ new Set();
-      this.onopen = function() {
-      };
-      this.onerror = function() {
-      };
-      this.onmessage = function() {
-      };
-      this.onclose = function() {
-      };
-      this.pollEndpoint = this.normalizeEndpoint(endPoint);
-      this.readyState = SOCKET_STATES.connecting;
-      this.poll();
-    }
-    normalizeEndpoint(endPoint) {
-      return endPoint.replace("ws://", "http://").replace("wss://", "https://").replace(new RegExp("(.*)/" + TRANSPORTS.websocket), "$1/" + TRANSPORTS.longpoll);
-    }
-    endpointURL() {
-      return Ajax.appendParams(this.pollEndpoint, { token: this.token });
-    }
-    closeAndRetry(code, reason, wasClean) {
-      this.close(code, reason, wasClean);
-      this.readyState = SOCKET_STATES.connecting;
-    }
-    ontimeout() {
-      this.onerror("timeout");
-      this.closeAndRetry(1005, "timeout", false);
-    }
-    isActive() {
-      return this.readyState === SOCKET_STATES.open || this.readyState === SOCKET_STATES.connecting;
-    }
-    poll() {
-      this.ajax("GET", null, () => this.ontimeout(), (resp) => {
-        if (resp) {
-          var { status, token, messages } = resp;
-          this.token = token;
-        } else {
-          status = 0;
-        }
-        switch (status) {
-          case 200:
-            messages.forEach((msg) => {
-              setTimeout(() => this.onmessage({ data: msg }), 0);
-            });
-            this.poll();
-            break;
-          case 204:
-            this.poll();
-            break;
-          case 410:
-            this.readyState = SOCKET_STATES.open;
-            this.onopen({});
-            this.poll();
-            break;
-          case 403:
-            this.onerror(403);
-            this.close(1008, "forbidden", false);
-            break;
-          case 0:
-          case 500:
-            this.onerror(500);
-            this.closeAndRetry(1011, "internal server error", 500);
-            break;
-          default:
-            throw new Error(`unhandled poll status ${status}`);
-        }
-      });
-    }
-    send(body) {
-      this.ajax("POST", body, () => this.onerror("timeout"), (resp) => {
-        if (!resp || resp.status !== 200) {
-          this.onerror(resp && resp.status);
-          this.closeAndRetry(1011, "internal server error", false);
-        }
-      });
-    }
-    close(code, reason, wasClean) {
-      for (let req of this.reqs) {
-        req.abort();
-      }
-      this.readyState = SOCKET_STATES.closed;
-      let opts = Object.assign({ code: 1e3, reason: void 0, wasClean: true }, { code, reason, wasClean });
-      if (typeof CloseEvent !== "undefined") {
-        this.onclose(new CloseEvent("close", opts));
-      } else {
-        this.onclose(opts);
-      }
-    }
-    ajax(method, body, onCallerTimeout, callback) {
-      let req;
-      let ontimeout = () => {
-        this.reqs.delete(req);
-        onCallerTimeout();
-      };
-      req = Ajax.request(method, this.endpointURL(), "application/json", body, this.timeout, ontimeout, (resp) => {
-        this.reqs.delete(req);
-        if (this.isActive()) {
-          callback(resp);
-        }
-      });
-      this.reqs.add(req);
-    }
-  };
-  var serializer_default = {
-    HEADER_LENGTH: 1,
-    META_LENGTH: 4,
-    KINDS: { push: 0, reply: 1, broadcast: 2 },
-    encode(msg, callback) {
-      if (msg.payload.constructor === ArrayBuffer) {
-        return callback(this.binaryEncode(msg));
-      } else {
-        let payload = [msg.join_ref, msg.ref, msg.topic, msg.event, msg.payload];
-        return callback(JSON.stringify(payload));
-      }
-    },
-    decode(rawPayload, callback) {
-      if (rawPayload.constructor === ArrayBuffer) {
-        return callback(this.binaryDecode(rawPayload));
-      } else {
-        let [join_ref, ref, topic, event, payload] = JSON.parse(rawPayload);
-        return callback({ join_ref, ref, topic, event, payload });
-      }
-    },
-    binaryEncode(message) {
-      let { join_ref, ref, event, topic, payload } = message;
-      let metaLength = this.META_LENGTH + join_ref.length + ref.length + topic.length + event.length;
-      let header = new ArrayBuffer(this.HEADER_LENGTH + metaLength);
-      let view = new DataView(header);
-      let offset2 = 0;
-      view.setUint8(offset2++, this.KINDS.push);
-      view.setUint8(offset2++, join_ref.length);
-      view.setUint8(offset2++, ref.length);
-      view.setUint8(offset2++, topic.length);
-      view.setUint8(offset2++, event.length);
-      Array.from(join_ref, (char) => view.setUint8(offset2++, char.charCodeAt(0)));
-      Array.from(ref, (char) => view.setUint8(offset2++, char.charCodeAt(0)));
-      Array.from(topic, (char) => view.setUint8(offset2++, char.charCodeAt(0)));
-      Array.from(event, (char) => view.setUint8(offset2++, char.charCodeAt(0)));
-      var combined = new Uint8Array(header.byteLength + payload.byteLength);
-      combined.set(new Uint8Array(header), 0);
-      combined.set(new Uint8Array(payload), header.byteLength);
-      return combined.buffer;
-    },
-    binaryDecode(buffer) {
-      let view = new DataView(buffer);
-      let kind = view.getUint8(0);
-      let decoder = new TextDecoder();
-      switch (kind) {
-        case this.KINDS.push:
-          return this.decodePush(buffer, view, decoder);
-        case this.KINDS.reply:
-          return this.decodeReply(buffer, view, decoder);
-        case this.KINDS.broadcast:
-          return this.decodeBroadcast(buffer, view, decoder);
-      }
-    },
-    decodePush(buffer, view, decoder) {
-      let joinRefSize = view.getUint8(1);
-      let topicSize = view.getUint8(2);
-      let eventSize = view.getUint8(3);
-      let offset2 = this.HEADER_LENGTH + this.META_LENGTH - 1;
-      let joinRef = decoder.decode(buffer.slice(offset2, offset2 + joinRefSize));
-      offset2 = offset2 + joinRefSize;
-      let topic = decoder.decode(buffer.slice(offset2, offset2 + topicSize));
-      offset2 = offset2 + topicSize;
-      let event = decoder.decode(buffer.slice(offset2, offset2 + eventSize));
-      offset2 = offset2 + eventSize;
-      let data = buffer.slice(offset2, buffer.byteLength);
-      return { join_ref: joinRef, ref: null, topic, event, payload: data };
-    },
-    decodeReply(buffer, view, decoder) {
-      let joinRefSize = view.getUint8(1);
-      let refSize = view.getUint8(2);
-      let topicSize = view.getUint8(3);
-      let eventSize = view.getUint8(4);
-      let offset2 = this.HEADER_LENGTH + this.META_LENGTH;
-      let joinRef = decoder.decode(buffer.slice(offset2, offset2 + joinRefSize));
-      offset2 = offset2 + joinRefSize;
-      let ref = decoder.decode(buffer.slice(offset2, offset2 + refSize));
-      offset2 = offset2 + refSize;
-      let topic = decoder.decode(buffer.slice(offset2, offset2 + topicSize));
-      offset2 = offset2 + topicSize;
-      let event = decoder.decode(buffer.slice(offset2, offset2 + eventSize));
-      offset2 = offset2 + eventSize;
-      let data = buffer.slice(offset2, buffer.byteLength);
-      let payload = { status: event, response: data };
-      return { join_ref: joinRef, ref, topic, event: CHANNEL_EVENTS.reply, payload };
-    },
-    decodeBroadcast(buffer, view, decoder) {
-      let topicSize = view.getUint8(1);
-      let eventSize = view.getUint8(2);
-      let offset2 = this.HEADER_LENGTH + 2;
-      let topic = decoder.decode(buffer.slice(offset2, offset2 + topicSize));
-      offset2 = offset2 + topicSize;
-      let event = decoder.decode(buffer.slice(offset2, offset2 + eventSize));
-      offset2 = offset2 + eventSize;
-      let data = buffer.slice(offset2, buffer.byteLength);
-      return { join_ref: null, ref: null, topic, event, payload: data };
-    }
-  };
-  var Socket = class {
-    constructor(endPoint, opts = {}) {
-      this.stateChangeCallbacks = { open: [], close: [], error: [], message: [] };
-      this.channels = [];
-      this.sendBuffer = [];
-      this.ref = 0;
-      this.timeout = opts.timeout || DEFAULT_TIMEOUT;
-      this.transport = opts.transport || global2.WebSocket || LongPoll;
-      this.establishedConnections = 0;
-      this.defaultEncoder = serializer_default.encode.bind(serializer_default);
-      this.defaultDecoder = serializer_default.decode.bind(serializer_default);
-      this.closeWasClean = false;
-      this.binaryType = opts.binaryType || "arraybuffer";
-      this.connectClock = 1;
-      if (this.transport !== LongPoll) {
-        this.encode = opts.encode || this.defaultEncoder;
-        this.decode = opts.decode || this.defaultDecoder;
-      } else {
-        this.encode = this.defaultEncoder;
-        this.decode = this.defaultDecoder;
-      }
-      let awaitingConnectionOnPageShow = null;
-      if (phxWindow && phxWindow.addEventListener) {
-        phxWindow.addEventListener("pagehide", (_e) => {
-          if (this.conn) {
-            this.disconnect();
-            awaitingConnectionOnPageShow = this.connectClock;
-          }
-        });
-        phxWindow.addEventListener("pageshow", (_e) => {
-          if (awaitingConnectionOnPageShow === this.connectClock) {
-            awaitingConnectionOnPageShow = null;
-            this.connect();
-          }
-        });
-      }
-      this.heartbeatIntervalMs = opts.heartbeatIntervalMs || 3e4;
-      this.rejoinAfterMs = (tries) => {
-        if (opts.rejoinAfterMs) {
-          return opts.rejoinAfterMs(tries);
-        } else {
-          return [1e3, 2e3, 5e3][tries - 1] || 1e4;
-        }
-      };
-      this.reconnectAfterMs = (tries) => {
-        if (opts.reconnectAfterMs) {
-          return opts.reconnectAfterMs(tries);
-        } else {
-          return [10, 50, 100, 150, 200, 250, 500, 1e3, 2e3][tries - 1] || 5e3;
-        }
-      };
-      this.logger = opts.logger || null;
-      this.longpollerTimeout = opts.longpollerTimeout || 2e4;
-      this.params = closure(opts.params || {});
-      this.endPoint = `${endPoint}/${TRANSPORTS.websocket}`;
-      this.vsn = opts.vsn || DEFAULT_VSN;
-      this.heartbeatTimeoutTimer = null;
-      this.heartbeatTimer = null;
-      this.pendingHeartbeatRef = null;
-      this.reconnectTimer = new Timer(() => {
-        this.teardown(() => this.connect());
-      }, this.reconnectAfterMs);
-    }
-    getLongPollTransport() {
-      return LongPoll;
-    }
-    replaceTransport(newTransport) {
-      this.connectClock++;
-      this.closeWasClean = true;
-      this.reconnectTimer.reset();
-      this.sendBuffer = [];
-      if (this.conn) {
-        this.conn.close();
-        this.conn = null;
-      }
-      this.transport = newTransport;
-    }
-    protocol() {
-      return location.protocol.match(/^https/) ? "wss" : "ws";
-    }
-    endPointURL() {
-      let uri = Ajax.appendParams(Ajax.appendParams(this.endPoint, this.params()), { vsn: this.vsn });
-      if (uri.charAt(0) !== "/") {
-        return uri;
-      }
-      if (uri.charAt(1) === "/") {
-        return `${this.protocol()}:${uri}`;
-      }
-      return `${this.protocol()}://${location.host}${uri}`;
-    }
-    disconnect(callback, code, reason) {
-      this.connectClock++;
-      this.closeWasClean = true;
-      this.reconnectTimer.reset();
-      this.teardown(callback, code, reason);
-    }
-    connect(params) {
-      if (params) {
-        console && console.log("passing params to connect is deprecated. Instead pass :params to the Socket constructor");
-        this.params = closure(params);
-      }
-      if (this.conn) {
-        return;
-      }
-      this.connectClock++;
-      this.closeWasClean = false;
-      this.conn = new this.transport(this.endPointURL());
-      this.conn.binaryType = this.binaryType;
-      this.conn.timeout = this.longpollerTimeout;
-      this.conn.onopen = () => this.onConnOpen();
-      this.conn.onerror = (error) => this.onConnError(error);
-      this.conn.onmessage = (event) => this.onConnMessage(event);
-      this.conn.onclose = (event) => this.onConnClose(event);
-    }
-    log(kind, msg, data) {
-      this.logger(kind, msg, data);
-    }
-    hasLogger() {
-      return this.logger !== null;
-    }
-    onOpen(callback) {
-      let ref = this.makeRef();
-      this.stateChangeCallbacks.open.push([ref, callback]);
-      return ref;
-    }
-    onClose(callback) {
-      let ref = this.makeRef();
-      this.stateChangeCallbacks.close.push([ref, callback]);
-      return ref;
-    }
-    onError(callback) {
-      let ref = this.makeRef();
-      this.stateChangeCallbacks.error.push([ref, callback]);
-      return ref;
-    }
-    onMessage(callback) {
-      let ref = this.makeRef();
-      this.stateChangeCallbacks.message.push([ref, callback]);
-      return ref;
-    }
-    ping(callback) {
-      if (!this.isConnected()) {
-        return false;
-      }
-      let ref = this.makeRef();
-      let startTime = Date.now();
-      this.push({ topic: "phoenix", event: "heartbeat", payload: {}, ref });
-      let onMsgRef = this.onMessage((msg) => {
-        if (msg.ref === ref) {
-          this.off([onMsgRef]);
-          callback(Date.now() - startTime);
-        }
-      });
-      return true;
-    }
-    clearHeartbeats() {
-      clearTimeout(this.heartbeatTimer);
-      clearTimeout(this.heartbeatTimeoutTimer);
-    }
-    onConnOpen() {
-      if (this.hasLogger())
-        this.log("transport", `connected to ${this.endPointURL()}`);
-      this.closeWasClean = false;
-      this.establishedConnections++;
-      this.flushSendBuffer();
-      this.reconnectTimer.reset();
-      this.resetHeartbeat();
-      this.stateChangeCallbacks.open.forEach(([, callback]) => callback());
-    }
-    heartbeatTimeout() {
-      if (this.pendingHeartbeatRef) {
-        this.pendingHeartbeatRef = null;
-        if (this.hasLogger()) {
-          this.log("transport", "heartbeat timeout. Attempting to re-establish connection");
-        }
-        this.triggerChanError();
-        this.closeWasClean = false;
-        this.teardown(() => this.reconnectTimer.scheduleTimeout(), WS_CLOSE_NORMAL, "heartbeat timeout");
-      }
-    }
-    resetHeartbeat() {
-      if (this.conn && this.conn.skipHeartbeat) {
-        return;
-      }
-      this.pendingHeartbeatRef = null;
-      this.clearHeartbeats();
-      this.heartbeatTimer = setTimeout(() => this.sendHeartbeat(), this.heartbeatIntervalMs);
-    }
-    teardown(callback, code, reason) {
-      if (!this.conn) {
-        return callback && callback();
-      }
-      this.waitForBufferDone(() => {
-        if (this.conn) {
-          if (code) {
-            this.conn.close(code, reason || "");
-          } else {
-            this.conn.close();
-          }
-        }
-        this.waitForSocketClosed(() => {
-          if (this.conn) {
-            this.conn.onopen = function() {
-            };
-            this.conn.onerror = function() {
-            };
-            this.conn.onmessage = function() {
-            };
-            this.conn.onclose = function() {
-            };
-            this.conn = null;
-          }
-          callback && callback();
-        });
-      });
-    }
-    waitForBufferDone(callback, tries = 1) {
-      if (tries === 5 || !this.conn || !this.conn.bufferedAmount) {
-        callback();
-        return;
-      }
-      setTimeout(() => {
-        this.waitForBufferDone(callback, tries + 1);
-      }, 150 * tries);
-    }
-    waitForSocketClosed(callback, tries = 1) {
-      if (tries === 5 || !this.conn || this.conn.readyState === SOCKET_STATES.closed) {
-        callback();
-        return;
-      }
-      setTimeout(() => {
-        this.waitForSocketClosed(callback, tries + 1);
-      }, 150 * tries);
-    }
-    onConnClose(event) {
-      let closeCode = event && event.code;
-      if (this.hasLogger())
-        this.log("transport", "close", event);
-      this.triggerChanError();
-      this.clearHeartbeats();
-      if (!this.closeWasClean && closeCode !== 1e3) {
-        this.reconnectTimer.scheduleTimeout();
-      }
-      this.stateChangeCallbacks.close.forEach(([, callback]) => callback(event));
-    }
-    onConnError(error) {
-      if (this.hasLogger())
-        this.log("transport", error);
-      let transportBefore = this.transport;
-      let establishedBefore = this.establishedConnections;
-      this.stateChangeCallbacks.error.forEach(([, callback]) => {
-        callback(error, transportBefore, establishedBefore);
-      });
-      if (transportBefore === this.transport || establishedBefore > 0) {
-        this.triggerChanError();
-      }
-    }
-    triggerChanError() {
-      this.channels.forEach((channel) => {
-        if (!(channel.isErrored() || channel.isLeaving() || channel.isClosed())) {
-          channel.trigger(CHANNEL_EVENTS.error);
-        }
-      });
-    }
-    connectionState() {
-      switch (this.conn && this.conn.readyState) {
-        case SOCKET_STATES.connecting:
-          return "connecting";
-        case SOCKET_STATES.open:
-          return "open";
-        case SOCKET_STATES.closing:
-          return "closing";
-        default:
-          return "closed";
-      }
-    }
-    isConnected() {
-      return this.connectionState() === "open";
-    }
-    remove(channel) {
-      this.off(channel.stateChangeRefs);
-      this.channels = this.channels.filter((c) => c.joinRef() !== channel.joinRef());
-    }
-    off(refs) {
-      for (let key in this.stateChangeCallbacks) {
-        this.stateChangeCallbacks[key] = this.stateChangeCallbacks[key].filter(([ref]) => {
-          return refs.indexOf(ref) === -1;
-        });
-      }
-    }
-    channel(topic, chanParams = {}) {
-      let chan = new Channel(topic, chanParams, this);
-      this.channels.push(chan);
-      return chan;
-    }
-    push(data) {
-      if (this.hasLogger()) {
-        let { topic, event, payload, ref, join_ref } = data;
-        this.log("push", `${topic} ${event} (${join_ref}, ${ref})`, payload);
-      }
-      if (this.isConnected()) {
-        this.encode(data, (result) => this.conn.send(result));
-      } else {
-        this.sendBuffer.push(() => this.encode(data, (result) => this.conn.send(result)));
-      }
-    }
-    makeRef() {
-      let newRef = this.ref + 1;
-      if (newRef === this.ref) {
-        this.ref = 0;
-      } else {
-        this.ref = newRef;
-      }
-      return this.ref.toString();
-    }
-    sendHeartbeat() {
-      if (this.pendingHeartbeatRef && !this.isConnected()) {
-        return;
-      }
-      this.pendingHeartbeatRef = this.makeRef();
-      this.push({ topic: "phoenix", event: "heartbeat", payload: {}, ref: this.pendingHeartbeatRef });
-      this.heartbeatTimeoutTimer = setTimeout(() => this.heartbeatTimeout(), this.heartbeatIntervalMs);
-    }
-    flushSendBuffer() {
-      if (this.isConnected() && this.sendBuffer.length > 0) {
-        this.sendBuffer.forEach((callback) => callback());
-        this.sendBuffer = [];
-      }
-    }
-    onConnMessage(rawMessage) {
-      this.decode(rawMessage.data, (msg) => {
-        let { topic, event, payload, ref, join_ref } = msg;
-        if (ref && ref === this.pendingHeartbeatRef) {
-          this.clearHeartbeats();
-          this.pendingHeartbeatRef = null;
-          this.heartbeatTimer = setTimeout(() => this.sendHeartbeat(), this.heartbeatIntervalMs);
-        }
-        if (this.hasLogger())
-          this.log("receive", `${payload.status || ""} ${topic} ${event} ${ref && "(" + ref + ")" || ""}`, payload);
-        for (let i = 0; i < this.channels.length; i++) {
-          const channel = this.channels[i];
-          if (!channel.isMember(topic, event, payload, join_ref)) {
-            continue;
-          }
-          channel.trigger(event, payload, ref, join_ref);
-        }
-        for (let i = 0; i < this.stateChangeCallbacks.message.length; i++) {
-          let [, callback] = this.stateChangeCallbacks.message[i];
-          callback(msg);
-        }
-      });
-    }
-    leaveOpenTopic(topic) {
-      let dupChannel = this.channels.find((c) => c.topic === topic && (c.isJoined() || c.isJoining()));
-      if (dupChannel) {
-        if (this.hasLogger())
-          this.log("transport", `leaving duplicate topic "${topic}"`);
-        dupChannel.leave();
-      }
-    }
-  };
-
-  // ../deps/phoenix_live_view/priv/static/phoenix_live_view.esm.js
-  var CONSECUTIVE_RELOADS = "consecutive-reloads";
-  var MAX_RELOADS = 10;
-  var RELOAD_JITTER_MIN = 5e3;
-  var RELOAD_JITTER_MAX = 1e4;
-  var FAILSAFE_JITTER = 3e4;
-  var PHX_EVENT_CLASSES = [
-    "phx-click-loading",
-    "phx-change-loading",
-    "phx-submit-loading",
-    "phx-keydown-loading",
-    "phx-keyup-loading",
-    "phx-blur-loading",
-    "phx-focus-loading"
-  ];
-  var PHX_COMPONENT = "data-phx-component";
-  var PHX_LIVE_LINK = "data-phx-link";
-  var PHX_TRACK_STATIC = "track-static";
-  var PHX_LINK_STATE = "data-phx-link-state";
-  var PHX_REF = "data-phx-ref";
-  var PHX_REF_SRC = "data-phx-ref-src";
-  var PHX_TRACK_UPLOADS = "track-uploads";
-  var PHX_UPLOAD_REF = "data-phx-upload-ref";
-  var PHX_PREFLIGHTED_REFS = "data-phx-preflighted-refs";
-  var PHX_DONE_REFS = "data-phx-done-refs";
-  var PHX_DROP_TARGET = "drop-target";
-  var PHX_ACTIVE_ENTRY_REFS = "data-phx-active-refs";
-  var PHX_LIVE_FILE_UPDATED = "phx:live-file:updated";
-  var PHX_SKIP = "data-phx-skip";
-  var PHX_PRUNE = "data-phx-prune";
-  var PHX_PAGE_LOADING = "page-loading";
-  var PHX_CONNECTED_CLASS = "phx-connected";
-  var PHX_DISCONNECTED_CLASS = "phx-loading";
-  var PHX_NO_FEEDBACK_CLASS = "phx-no-feedback";
-  var PHX_ERROR_CLASS = "phx-error";
-  var PHX_PARENT_ID = "data-phx-parent-id";
-  var PHX_MAIN = "data-phx-main";
-  var PHX_ROOT_ID = "data-phx-root-id";
-  var PHX_TRIGGER_ACTION = "trigger-action";
-  var PHX_FEEDBACK_FOR = "feedback-for";
-  var PHX_HAS_FOCUSED = "phx-has-focused";
-  var FOCUSABLE_INPUTS = ["text", "textarea", "number", "email", "password", "search", "tel", "url", "date", "time", "datetime-local", "color", "range"];
-  var CHECKABLE_INPUTS = ["checkbox", "radio"];
-  var PHX_HAS_SUBMITTED = "phx-has-submitted";
-  var PHX_SESSION = "data-phx-session";
-  var PHX_VIEW_SELECTOR = `[${PHX_SESSION}]`;
-  var PHX_STICKY = "data-phx-sticky";
-  var PHX_STATIC = "data-phx-static";
-  var PHX_READONLY = "data-phx-readonly";
-  var PHX_DISABLED = "data-phx-disabled";
-  var PHX_DISABLE_WITH = "disable-with";
-  var PHX_DISABLE_WITH_RESTORE = "data-phx-disable-with-restore";
-  var PHX_HOOK = "hook";
-  var PHX_DEBOUNCE = "debounce";
-  var PHX_THROTTLE = "throttle";
-  var PHX_UPDATE = "update";
-  var PHX_KEY = "key";
-  var PHX_PRIVATE = "phxPrivate";
-  var PHX_AUTO_RECOVER = "auto-recover";
-  var PHX_LV_DEBUG = "phx:live-socket:debug";
-  var PHX_LV_PROFILE = "phx:live-socket:profiling";
-  var PHX_LV_LATENCY_SIM = "phx:live-socket:latency-sim";
-  var PHX_PROGRESS = "progress";
-  var LOADER_TIMEOUT = 1;
-  var BEFORE_UNLOAD_LOADER_TIMEOUT = 200;
-  var BINDING_PREFIX = "phx-";
-  var PUSH_TIMEOUT = 3e4;
-  var DEBOUNCE_TRIGGER = "debounce-trigger";
-  var THROTTLED = "throttled";
-  var DEBOUNCE_PREV_KEY = "debounce-prev-key";
-  var DEFAULTS = {
-    debounce: 300,
-    throttle: 300
-  };
-  var DYNAMICS = "d";
-  var STATIC = "s";
-  var COMPONENTS = "c";
-  var EVENTS = "e";
-  var REPLY = "r";
-  var TITLE = "t";
-  var TEMPLATES = "p";
-  var EntryUploader = class {
-    constructor(entry, chunkSize, liveSocket2) {
-      this.liveSocket = liveSocket2;
-      this.entry = entry;
-      this.offset = 0;
-      this.chunkSize = chunkSize;
-      this.chunkTimer = null;
-      this.uploadChannel = liveSocket2.channel(`lvu:${entry.ref}`, { token: entry.metadata() });
-    }
-    error(reason) {
-      clearTimeout(this.chunkTimer);
-      this.uploadChannel.leave();
-      this.entry.error(reason);
-    }
-    upload() {
-      this.uploadChannel.onError((reason) => this.error(reason));
-      this.uploadChannel.join().receive("ok", (_data) => this.readNextChunk()).receive("error", (reason) => this.error(reason));
-    }
-    isDone() {
-      return this.offset >= this.entry.file.size;
-    }
-    readNextChunk() {
-      let reader = new window.FileReader();
-      let blob = this.entry.file.slice(this.offset, this.chunkSize + this.offset);
-      reader.onload = (e) => {
-        if (e.target.error === null) {
-          this.offset += e.target.result.byteLength;
-          this.pushChunk(e.target.result);
-        } else {
-          return logError("Read error: " + e.target.error);
-        }
-      };
-      reader.readAsArrayBuffer(blob);
-    }
-    pushChunk(chunk) {
-      if (!this.uploadChannel.isJoined()) {
-        return;
-      }
-      this.uploadChannel.push("chunk", chunk).receive("ok", () => {
-        this.entry.progress(this.offset / this.entry.file.size * 100);
-        if (!this.isDone()) {
-          this.chunkTimer = setTimeout(() => this.readNextChunk(), this.liveSocket.getLatencySim() || 0);
-        }
-      });
-    }
-  };
-  var logError = (msg, obj) => console.error && console.error(msg, obj);
-  var isCid = (cid) => {
-    let type = typeof cid;
-    return type === "number" || type === "string" && /^(0|[1-9]\d*)$/.test(cid);
-  };
-  function detectDuplicateIds() {
-    let ids = /* @__PURE__ */ new Set();
-    let elems = document.querySelectorAll("*[id]");
-    for (let i = 0, len = elems.length; i < len; i++) {
-      if (ids.has(elems[i].id)) {
-        console.error(`Multiple IDs detected: ${elems[i].id}. Ensure unique element ids.`);
-      } else {
-        ids.add(elems[i].id);
-      }
-    }
-  }
-  var debug = (view, kind, msg, obj) => {
-    if (view.liveSocket.isDebugEnabled()) {
-      console.log(`${view.id} ${kind}: ${msg} - `, obj);
-    }
-  };
-  var closure2 = (val) => typeof val === "function" ? val : function() {
-    return val;
-  };
-  var clone = (obj) => {
-    return JSON.parse(JSON.stringify(obj));
-  };
-  var closestPhxBinding = (el, binding, borderEl) => {
-    do {
-      if (el.matches(`[${binding}]`)) {
-        return el;
-      }
-      el = el.parentElement || el.parentNode;
-    } while (el !== null && el.nodeType === 1 && !(borderEl && borderEl.isSameNode(el) || el.matches(PHX_VIEW_SELECTOR)));
-    return null;
-  };
-  var isObject = (obj) => {
-    return obj !== null && typeof obj === "object" && !(obj instanceof Array);
-  };
-  var isEqualObj = (obj1, obj2) => JSON.stringify(obj1) === JSON.stringify(obj2);
-  var isEmpty = (obj) => {
-    for (let x in obj) {
-      return false;
-    }
-    return true;
-  };
-  var maybe = (el, callback) => el && callback(el);
-  var channelUploader = function(entries, onError, resp, liveSocket2) {
-    entries.forEach((entry) => {
-      let entryUploader = new EntryUploader(entry, resp.config.chunk_size, liveSocket2);
-      entryUploader.upload();
-    });
-  };
-  var Browser = {
-    canPushState() {
-      return typeof history.pushState !== "undefined";
-    },
-    dropLocal(localStorage, namespace, subkey) {
-      return localStorage.removeItem(this.localKey(namespace, subkey));
-    },
-    updateLocal(localStorage, namespace, subkey, initial, func) {
-      let current = this.getLocal(localStorage, namespace, subkey);
-      let key = this.localKey(namespace, subkey);
-      let newVal = current === null ? initial : func(current);
-      localStorage.setItem(key, JSON.stringify(newVal));
-      return newVal;
-    },
-    getLocal(localStorage, namespace, subkey) {
-      return JSON.parse(localStorage.getItem(this.localKey(namespace, subkey)));
-    },
-    updateCurrentState(callback) {
-      if (!this.canPushState()) {
-        return;
-      }
-      history.replaceState(callback(history.state || {}), "", window.location.href);
-    },
-    pushState(kind, meta, to) {
-      if (this.canPushState()) {
-        if (to !== window.location.href) {
-          if (meta.type == "redirect" && meta.scroll) {
-            let currentState = history.state || {};
-            currentState.scroll = meta.scroll;
-            history.replaceState(currentState, "", window.location.href);
-          }
-          delete meta.scroll;
-          history[kind + "State"](meta, "", to || null);
-          let hashEl = this.getHashTargetEl(window.location.hash);
-          if (hashEl) {
-            hashEl.scrollIntoView();
-          } else if (meta.type === "redirect") {
-            window.scroll(0, 0);
-          }
-        }
-      } else {
-        this.redirect(to);
-      }
-    },
-    setCookie(name, value) {
-      document.cookie = `${name}=${value}`;
-    },
-    getCookie(name) {
-      return document.cookie.replace(new RegExp(`(?:(?:^|.*;s*)${name}s*=s*([^;]*).*$)|^.*$`), "$1");
-    },
-    redirect(toURL, flash) {
-      if (flash) {
-        Browser.setCookie("__phoenix_flash__", flash + "; max-age=60000; path=/");
-      }
-      window.location = toURL;
-    },
-    localKey(namespace, subkey) {
-      return `${namespace}-${subkey}`;
-    },
-    getHashTargetEl(maybeHash) {
-      let hash3 = maybeHash.toString().substring(1);
-      if (hash3 === "") {
-        return;
-      }
-      return document.getElementById(hash3) || document.querySelector(`a[name="${hash3}"]`);
-    }
-  };
-  var browser_default = Browser;
-  var DOM = {
-    byId(id) {
-      return document.getElementById(id) || logError(`no id found for ${id}`);
-    },
-    removeClass(el, className) {
-      el.classList.remove(className);
-      if (el.classList.length === 0) {
-        el.removeAttribute("class");
-      }
-    },
-    all(node, query, callback) {
-      if (!node) {
-        return [];
-      }
-      let array = Array.from(node.querySelectorAll(query));
-      return callback ? array.forEach(callback) : array;
-    },
-    childNodeLength(html) {
-      let template = document.createElement("template");
-      template.innerHTML = html;
-      return template.content.childElementCount;
-    },
-    isUploadInput(el) {
-      return el.type === "file" && el.getAttribute(PHX_UPLOAD_REF) !== null;
-    },
-    findUploadInputs(node) {
-      return this.all(node, `input[type="file"][${PHX_UPLOAD_REF}]`);
-    },
-    findComponentNodeList(node, cid) {
-      return this.filterWithinSameLiveView(this.all(node, `[${PHX_COMPONENT}="${cid}"]`), node);
-    },
-    isPhxDestroyed(node) {
-      return node.id && DOM.private(node, "destroyed") ? true : false;
-    },
-    markPhxChildDestroyed(el) {
-      if (this.isPhxChild(el)) {
-        el.setAttribute(PHX_SESSION, "");
-      }
-      this.putPrivate(el, "destroyed", true);
-    },
-    findPhxChildrenInFragment(html, parentId) {
-      let template = document.createElement("template");
-      template.innerHTML = html;
-      return this.findPhxChildren(template.content, parentId);
-    },
-    isIgnored(el, phxUpdate) {
-      return (el.getAttribute(phxUpdate) || el.getAttribute("data-phx-update")) === "ignore";
-    },
-    isPhxUpdate(el, phxUpdate, updateTypes) {
-      return el.getAttribute && updateTypes.indexOf(el.getAttribute(phxUpdate)) >= 0;
-    },
-    findPhxSticky(el) {
-      return this.all(el, `[${PHX_STICKY}]`);
-    },
-    findPhxChildren(el, parentId) {
-      return this.all(el, `${PHX_VIEW_SELECTOR}[${PHX_PARENT_ID}="${parentId}"]`);
-    },
-    findParentCIDs(node, cids) {
-      let initial = new Set(cids);
-      return cids.reduce((acc, cid) => {
-        let selector = `[${PHX_COMPONENT}="${cid}"] [${PHX_COMPONENT}]`;
-        this.filterWithinSameLiveView(this.all(node, selector), node).map((el) => parseInt(el.getAttribute(PHX_COMPONENT))).forEach((childCID) => acc.delete(childCID));
-        return acc;
-      }, initial);
-    },
-    filterWithinSameLiveView(nodes, parent) {
-      if (parent.querySelector(PHX_VIEW_SELECTOR)) {
-        return nodes.filter((el) => this.withinSameLiveView(el, parent));
-      } else {
-        return nodes;
-      }
-    },
-    withinSameLiveView(node, parent) {
-      while (node = node.parentNode) {
-        if (node.isSameNode(parent)) {
-          return true;
-        }
-        if (node.getAttribute(PHX_SESSION) !== null) {
-          return false;
-        }
-      }
-    },
-    private(el, key) {
-      return el[PHX_PRIVATE] && el[PHX_PRIVATE][key];
-    },
-    deletePrivate(el, key) {
-      el[PHX_PRIVATE] && delete el[PHX_PRIVATE][key];
-    },
-    putPrivate(el, key, value) {
-      if (!el[PHX_PRIVATE]) {
-        el[PHX_PRIVATE] = {};
-      }
-      el[PHX_PRIVATE][key] = value;
-    },
-    updatePrivate(el, key, defaultVal, updateFunc) {
-      let existing = this.private(el, key);
-      if (existing === void 0) {
-        this.putPrivate(el, key, updateFunc(defaultVal));
-      } else {
-        this.putPrivate(el, key, updateFunc(existing));
-      }
-    },
-    copyPrivates(target, source) {
-      if (source[PHX_PRIVATE]) {
-        target[PHX_PRIVATE] = source[PHX_PRIVATE];
-      }
-    },
-    putTitle(str) {
-      let titleEl = document.querySelector("title");
-      let { prefix, suffix } = titleEl.dataset;
-      document.title = `${prefix || ""}${str}${suffix || ""}`;
-    },
-    debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, asyncFilter, callback) {
-      let debounce2 = el.getAttribute(phxDebounce);
-      let throttle = el.getAttribute(phxThrottle);
-      if (debounce2 === "") {
-        debounce2 = defaultDebounce;
-      }
-      if (throttle === "") {
-        throttle = defaultThrottle;
-      }
-      let value = debounce2 || throttle;
-      switch (value) {
-        case null:
-          return callback();
-        case "blur":
-          if (this.once(el, "debounce-blur")) {
-            el.addEventListener("blur", () => callback());
-          }
-          return;
-        default:
-          let timeout = parseInt(value);
-          let trigger = () => throttle ? this.deletePrivate(el, THROTTLED) : callback();
-          let currentCycle = this.incCycle(el, DEBOUNCE_TRIGGER, trigger);
-          if (isNaN(timeout)) {
-            return logError(`invalid throttle/debounce value: ${value}`);
-          }
-          if (throttle) {
-            let newKeyDown = false;
-            if (event.type === "keydown") {
-              let prevKey = this.private(el, DEBOUNCE_PREV_KEY);
-              this.putPrivate(el, DEBOUNCE_PREV_KEY, event.key);
-              newKeyDown = prevKey !== event.key;
-            }
-            if (!newKeyDown && this.private(el, THROTTLED)) {
-              return false;
-            } else {
-              callback();
-              this.putPrivate(el, THROTTLED, true);
-              setTimeout(() => {
-                if (asyncFilter()) {
-                  this.triggerCycle(el, DEBOUNCE_TRIGGER);
-                }
-              }, timeout);
-            }
-          } else {
-            setTimeout(() => {
-              if (asyncFilter()) {
-                this.triggerCycle(el, DEBOUNCE_TRIGGER, currentCycle);
-              }
-            }, timeout);
-          }
-          let form = el.form;
-          if (form && this.once(form, "bind-debounce")) {
-            form.addEventListener("submit", () => {
-              Array.from(new FormData(form).entries(), ([name]) => {
-                let input = form.querySelector(`[name="${name}"]`);
-                this.incCycle(input, DEBOUNCE_TRIGGER);
-                this.deletePrivate(input, THROTTLED);
-              });
-            });
-          }
-          if (this.once(el, "bind-debounce")) {
-            el.addEventListener("blur", () => this.triggerCycle(el, DEBOUNCE_TRIGGER));
-          }
-      }
-    },
-    triggerCycle(el, key, currentCycle) {
-      let [cycle, trigger] = this.private(el, key);
-      if (!currentCycle) {
-        currentCycle = cycle;
-      }
-      if (currentCycle === cycle) {
-        this.incCycle(el, key);
-        trigger();
-      }
-    },
-    once(el, key) {
-      if (this.private(el, key) === true) {
-        return false;
-      }
-      this.putPrivate(el, key, true);
-      return true;
-    },
-    incCycle(el, key, trigger = function() {
-    }) {
-      let [currentCycle] = this.private(el, key) || [0, trigger];
-      currentCycle++;
-      this.putPrivate(el, key, [currentCycle, trigger]);
-      return currentCycle;
-    },
-    discardError(container, el, phxFeedbackFor) {
-      let field = el.getAttribute && el.getAttribute(phxFeedbackFor);
-      let input = field && container.querySelector(`[id="${field}"], [name="${field}"]`);
-      if (!input) {
-        return;
-      }
-      if (!(this.private(input, PHX_HAS_FOCUSED) || this.private(input.form, PHX_HAS_SUBMITTED))) {
-        el.classList.add(PHX_NO_FEEDBACK_CLASS);
-      }
-    },
-    showError(inputEl, phxFeedbackFor) {
-      if (inputEl.id || inputEl.name) {
-        this.all(inputEl.form, `[${phxFeedbackFor}="${inputEl.id}"], [${phxFeedbackFor}="${inputEl.name}"]`, (el) => {
-          this.removeClass(el, PHX_NO_FEEDBACK_CLASS);
-        });
-      }
-    },
-    isPhxChild(node) {
-      return node.getAttribute && node.getAttribute(PHX_PARENT_ID);
-    },
-    isPhxSticky(node) {
-      return node.getAttribute && node.getAttribute(PHX_STICKY) !== null;
-    },
-    firstPhxChild(el) {
-      return this.isPhxChild(el) ? el : this.all(el, `[${PHX_PARENT_ID}]`)[0];
-    },
-    dispatchEvent(target, name, opts = {}) {
-      let bubbles = opts.bubbles === void 0 ? true : !!opts.bubbles;
-      let eventOpts = { bubbles, cancelable: true, detail: opts.detail || {} };
-      let event = name === "click" ? new MouseEvent("click", eventOpts) : new CustomEvent(name, eventOpts);
-      target.dispatchEvent(event);
-    },
-    cloneNode(node, html) {
-      if (typeof html === "undefined") {
-        return node.cloneNode(true);
-      } else {
-        let cloned = node.cloneNode(false);
-        cloned.innerHTML = html;
-        return cloned;
-      }
-    },
-    mergeAttrs(target, source, opts = {}) {
-      let exclude = opts.exclude || [];
-      let isIgnored = opts.isIgnored;
-      let sourceAttrs = source.attributes;
-      for (let i = sourceAttrs.length - 1; i >= 0; i--) {
-        let name = sourceAttrs[i].name;
-        if (exclude.indexOf(name) < 0) {
-          target.setAttribute(name, source.getAttribute(name));
-        }
-      }
-      let targetAttrs = target.attributes;
-      for (let i = targetAttrs.length - 1; i >= 0; i--) {
-        let name = targetAttrs[i].name;
-        if (isIgnored) {
-          if (name.startsWith("data-") && !source.hasAttribute(name)) {
-            target.removeAttribute(name);
-          }
-        } else {
-          if (!source.hasAttribute(name)) {
-            target.removeAttribute(name);
-          }
-        }
-      }
-    },
-    mergeFocusedInput(target, source) {
-      if (!(target instanceof HTMLSelectElement)) {
-        DOM.mergeAttrs(target, source, { exclude: ["value"] });
-      }
-      if (source.readOnly) {
-        target.setAttribute("readonly", true);
-      } else {
-        target.removeAttribute("readonly");
-      }
-    },
-    hasSelectionRange(el) {
-      return el.setSelectionRange && (el.type === "text" || el.type === "textarea");
-    },
-    restoreFocus(focused, selectionStart, selectionEnd) {
-      if (!DOM.isTextualInput(focused)) {
-        return;
-      }
-      let wasFocused = focused.matches(":focus");
-      if (focused.readOnly) {
-        focused.blur();
-      }
-      if (!wasFocused) {
-        focused.focus();
-      }
-      if (this.hasSelectionRange(focused)) {
-        focused.setSelectionRange(selectionStart, selectionEnd);
-      }
-    },
-    isFormInput(el) {
-      return /^(?:input|select|textarea)$/i.test(el.tagName) && el.type !== "button";
-    },
-    syncAttrsToProps(el) {
-      if (el instanceof HTMLInputElement && CHECKABLE_INPUTS.indexOf(el.type.toLocaleLowerCase()) >= 0) {
-        el.checked = el.getAttribute("checked") !== null;
-      }
-    },
-    isTextualInput(el) {
-      return FOCUSABLE_INPUTS.indexOf(el.type) >= 0;
-    },
-    isNowTriggerFormExternal(el, phxTriggerExternal) {
-      return el.getAttribute && el.getAttribute(phxTriggerExternal) !== null;
-    },
-    syncPendingRef(fromEl, toEl, disableWith) {
-      let ref = fromEl.getAttribute(PHX_REF);
-      if (ref === null) {
-        return true;
-      }
-      let refSrc = fromEl.getAttribute(PHX_REF_SRC);
-      if (DOM.isFormInput(fromEl) || fromEl.getAttribute(disableWith) !== null) {
-        if (DOM.isUploadInput(fromEl)) {
-          DOM.mergeAttrs(fromEl, toEl, { isIgnored: true });
-        }
-        DOM.putPrivate(fromEl, PHX_REF, toEl);
-        return false;
-      } else {
-        PHX_EVENT_CLASSES.forEach((className) => {
-          fromEl.classList.contains(className) && toEl.classList.add(className);
-        });
-        toEl.setAttribute(PHX_REF, ref);
-        toEl.setAttribute(PHX_REF_SRC, refSrc);
-        return true;
-      }
-    },
-    cleanChildNodes(container, phxUpdate) {
-      if (DOM.isPhxUpdate(container, phxUpdate, ["append", "prepend"])) {
-        let toRemove = [];
-        container.childNodes.forEach((childNode) => {
-          if (!childNode.id) {
-            let isEmptyTextNode = childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue.trim() === "";
-            if (!isEmptyTextNode) {
-              logError(`only HTML element tags with an id are allowed inside containers with phx-update.
-
-removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}"
-
-`);
-            }
-            toRemove.push(childNode);
-          }
-        });
-        toRemove.forEach((childNode) => childNode.remove());
-      }
-    },
-    replaceRootContainer(container, tagName, attrs) {
-      let retainedAttrs = /* @__PURE__ */ new Set(["id", PHX_SESSION, PHX_STATIC, PHX_MAIN, PHX_ROOT_ID]);
-      if (container.tagName.toLowerCase() === tagName.toLowerCase()) {
-        Array.from(container.attributes).filter((attr) => !retainedAttrs.has(attr.name.toLowerCase())).forEach((attr) => container.removeAttribute(attr.name));
-        Object.keys(attrs).filter((name) => !retainedAttrs.has(name.toLowerCase())).forEach((attr) => container.setAttribute(attr, attrs[attr]));
-        return container;
-      } else {
-        let newContainer = document.createElement(tagName);
-        Object.keys(attrs).forEach((attr) => newContainer.setAttribute(attr, attrs[attr]));
-        retainedAttrs.forEach((attr) => newContainer.setAttribute(attr, container.getAttribute(attr)));
-        newContainer.innerHTML = container.innerHTML;
-        container.replaceWith(newContainer);
-        return newContainer;
-      }
-    },
-    getSticky(el, name, defaultVal) {
-      let op = (DOM.private(el, "sticky") || []).find(([existingName]) => name === existingName);
-      if (op) {
-        let [_name, _op, stashedResult] = op;
-        return stashedResult;
-      } else {
-        return typeof defaultVal === "function" ? defaultVal() : defaultVal;
-      }
-    },
-    deleteSticky(el, name) {
-      this.updatePrivate(el, "sticky", [], (ops) => {
-        return ops.filter(([existingName, _]) => existingName !== name);
-      });
-    },
-    putSticky(el, name, op) {
-      let stashedResult = op(el);
-      this.updatePrivate(el, "sticky", [], (ops) => {
-        let existingIndex = ops.findIndex(([existingName]) => name === existingName);
-        if (existingIndex >= 0) {
-          ops[existingIndex] = [name, op, stashedResult];
-        } else {
-          ops.push([name, op, stashedResult]);
-        }
-        return ops;
-      });
-    },
-    applyStickyOperations(el) {
-      let ops = DOM.private(el, "sticky");
-      if (!ops) {
-        return;
-      }
-      ops.forEach(([name, op, _stashed]) => this.putSticky(el, name, op));
-    }
-  };
-  var dom_default = DOM;
-  var UploadEntry = class {
-    static isActive(fileEl, file) {
-      let isNew = file._phxRef === void 0;
-      let activeRefs = fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(",");
-      let isActive = activeRefs.indexOf(LiveUploader.genFileRef(file)) >= 0;
-      return file.size > 0 && (isNew || isActive);
-    }
-    static isPreflighted(fileEl, file) {
-      let preflightedRefs = fileEl.getAttribute(PHX_PREFLIGHTED_REFS).split(",");
-      let isPreflighted = preflightedRefs.indexOf(LiveUploader.genFileRef(file)) >= 0;
-      return isPreflighted && this.isActive(fileEl, file);
-    }
-    constructor(fileEl, file, view) {
-      this.ref = LiveUploader.genFileRef(file);
-      this.fileEl = fileEl;
-      this.file = file;
-      this.view = view;
-      this.meta = null;
-      this._isCancelled = false;
-      this._isDone = false;
-      this._progress = 0;
-      this._lastProgressSent = -1;
-      this._onDone = function() {
-      };
-      this._onElUpdated = this.onElUpdated.bind(this);
-      this.fileEl.addEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated);
-    }
-    metadata() {
-      return this.meta;
-    }
-    progress(progress) {
-      this._progress = Math.floor(progress);
-      if (this._progress > this._lastProgressSent) {
-        if (this._progress >= 100) {
-          this._progress = 100;
-          this._lastProgressSent = 100;
-          this._isDone = true;
-          this.view.pushFileProgress(this.fileEl, this.ref, 100, () => {
-            LiveUploader.untrackFile(this.fileEl, this.file);
-            this._onDone();
-          });
-        } else {
-          this._lastProgressSent = this._progress;
-          this.view.pushFileProgress(this.fileEl, this.ref, this._progress);
-        }
-      }
-    }
-    cancel() {
-      this._isCancelled = true;
-      this._isDone = true;
-      this._onDone();
-    }
-    isDone() {
-      return this._isDone;
-    }
-    error(reason = "failed") {
-      this.view.pushFileProgress(this.fileEl, this.ref, { error: reason });
-      LiveUploader.clearFiles(this.fileEl);
-    }
-    onDone(callback) {
-      this._onDone = () => {
-        this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated);
-        callback();
-      };
-    }
-    onElUpdated() {
-      let activeRefs = this.fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(",");
-      if (activeRefs.indexOf(this.ref) === -1) {
-        this.cancel();
-      }
-    }
-    toPreflightPayload() {
-      return {
-        last_modified: this.file.lastModified,
-        name: this.file.name,
-        size: this.file.size,
-        type: this.file.type,
-        ref: this.ref
-      };
-    }
-    uploader(uploaders) {
-      if (this.meta.uploader) {
-        let callback = uploaders[this.meta.uploader] || logError(`no uploader configured for ${this.meta.uploader}`);
-        return { name: this.meta.uploader, callback };
-      } else {
-        return { name: "channel", callback: channelUploader };
-      }
-    }
-    zipPostFlight(resp) {
-      this.meta = resp.entries[this.ref];
-      if (!this.meta) {
-        logError(`no preflight upload response returned with ref ${this.ref}`, { input: this.fileEl, response: resp });
-      }
-    }
-  };
-  var liveUploaderFileRef = 0;
-  var LiveUploader = class {
-    static genFileRef(file) {
-      let ref = file._phxRef;
-      if (ref !== void 0) {
-        return ref;
-      } else {
-        file._phxRef = (liveUploaderFileRef++).toString();
-        return file._phxRef;
-      }
-    }
-    static getEntryDataURL(inputEl, ref, callback) {
-      let file = this.activeFiles(inputEl).find((file2) => this.genFileRef(file2) === ref);
-      callback(URL.createObjectURL(file));
-    }
-    static hasUploadsInProgress(formEl) {
-      let active = 0;
-      dom_default.findUploadInputs(formEl).forEach((input) => {
-        if (input.getAttribute(PHX_PREFLIGHTED_REFS) !== input.getAttribute(PHX_DONE_REFS)) {
-          active++;
-        }
-      });
-      return active > 0;
-    }
-    static serializeUploads(inputEl) {
-      let files = this.activeFiles(inputEl);
-      let fileData = {};
-      files.forEach((file) => {
-        let entry = { path: inputEl.name };
-        let uploadRef = inputEl.getAttribute(PHX_UPLOAD_REF);
-        fileData[uploadRef] = fileData[uploadRef] || [];
-        entry.ref = this.genFileRef(file);
-        entry.name = file.name || entry.ref;
-        entry.type = file.type;
-        entry.size = file.size;
-        fileData[uploadRef].push(entry);
-      });
-      return fileData;
-    }
-    static clearFiles(inputEl) {
-      inputEl.value = null;
-      inputEl.removeAttribute(PHX_UPLOAD_REF);
-      dom_default.putPrivate(inputEl, "files", []);
-    }
-    static untrackFile(inputEl, file) {
-      dom_default.putPrivate(inputEl, "files", dom_default.private(inputEl, "files").filter((f) => !Object.is(f, file)));
-    }
-    static trackFiles(inputEl, files) {
-      if (inputEl.getAttribute("multiple") !== null) {
-        let newFiles = files.filter((file) => !this.activeFiles(inputEl).find((f) => Object.is(f, file)));
-        dom_default.putPrivate(inputEl, "files", this.activeFiles(inputEl).concat(newFiles));
-        inputEl.value = null;
-      } else {
-        dom_default.putPrivate(inputEl, "files", files);
-      }
-    }
-    static activeFileInputs(formEl) {
-      let fileInputs = dom_default.findUploadInputs(formEl);
-      return Array.from(fileInputs).filter((el) => el.files && this.activeFiles(el).length > 0);
-    }
-    static activeFiles(input) {
-      return (dom_default.private(input, "files") || []).filter((f) => UploadEntry.isActive(input, f));
-    }
-    static inputsAwaitingPreflight(formEl) {
-      let fileInputs = dom_default.findUploadInputs(formEl);
-      return Array.from(fileInputs).filter((input) => this.filesAwaitingPreflight(input).length > 0);
-    }
-    static filesAwaitingPreflight(input) {
-      return this.activeFiles(input).filter((f) => !UploadEntry.isPreflighted(input, f));
-    }
-    constructor(inputEl, view, onComplete) {
-      this.view = view;
-      this.onComplete = onComplete;
-      this._entries = Array.from(LiveUploader.filesAwaitingPreflight(inputEl) || []).map((file) => new UploadEntry(inputEl, file, view));
-      this.numEntriesInProgress = this._entries.length;
-    }
-    entries() {
-      return this._entries;
-    }
-    initAdapterUpload(resp, onError, liveSocket2) {
-      this._entries = this._entries.map((entry) => {
-        entry.zipPostFlight(resp);
-        entry.onDone(() => {
-          this.numEntriesInProgress--;
-          if (this.numEntriesInProgress === 0) {
-            this.onComplete();
-          }
-        });
-        return entry;
-      });
-      let groupedEntries = this._entries.reduce((acc, entry) => {
-        let { name, callback } = entry.uploader(liveSocket2.uploaders);
-        acc[name] = acc[name] || { callback, entries: [] };
-        acc[name].entries.push(entry);
-        return acc;
-      }, {});
-      for (let name in groupedEntries) {
-        let { callback, entries } = groupedEntries[name];
-        callback(entries, onError, resp, liveSocket2);
-      }
-    }
-  };
-  var Hooks = {
-    LiveFileUpload: {
-      activeRefs() {
-        return this.el.getAttribute(PHX_ACTIVE_ENTRY_REFS);
-      },
-      preflightedRefs() {
-        return this.el.getAttribute(PHX_PREFLIGHTED_REFS);
-      },
-      mounted() {
-        this.preflightedWas = this.preflightedRefs();
-      },
-      updated() {
-        let newPreflights = this.preflightedRefs();
-        if (this.preflightedWas !== newPreflights) {
-          this.preflightedWas = newPreflights;
-          if (newPreflights === "") {
-            this.__view.cancelSubmit(this.el.form);
-          }
-        }
-        if (this.activeRefs() === "") {
-          this.el.value = null;
-        }
-        this.el.dispatchEvent(new CustomEvent(PHX_LIVE_FILE_UPDATED));
-      }
-    },
-    LiveImgPreview: {
-      mounted() {
-        this.ref = this.el.getAttribute("data-phx-entry-ref");
-        this.inputEl = document.getElementById(this.el.getAttribute(PHX_UPLOAD_REF));
-        LiveUploader.getEntryDataURL(this.inputEl, this.ref, (url) => {
-          this.url = url;
-          this.el.src = url;
-        });
-      },
-      destroyed() {
-        URL.revokeObjectURL(this.url);
-      }
-    }
-  };
-  var hooks_default = Hooks;
-  var DOMPostMorphRestorer = class {
-    constructor(containerBefore, containerAfter, updateType) {
-      let idsBefore = /* @__PURE__ */ new Set();
-      let idsAfter = new Set([...containerAfter.children].map((child) => child.id));
-      let elementsToModify = [];
-      Array.from(containerBefore.children).forEach((child) => {
-        if (child.id) {
-          idsBefore.add(child.id);
-          if (idsAfter.has(child.id)) {
-            let previousElementId = child.previousElementSibling && child.previousElementSibling.id;
-            elementsToModify.push({ elementId: child.id, previousElementId });
-          }
-        }
-      });
-      this.containerId = containerAfter.id;
-      this.updateType = updateType;
-      this.elementsToModify = elementsToModify;
-      this.elementIdsToAdd = [...idsAfter].filter((id) => !idsBefore.has(id));
-    }
-    perform() {
-      let container = dom_default.byId(this.containerId);
-      this.elementsToModify.forEach((elementToModify) => {
-        if (elementToModify.previousElementId) {
-          maybe(document.getElementById(elementToModify.previousElementId), (previousElem) => {
-            maybe(document.getElementById(elementToModify.elementId), (elem) => {
-              let isInRightPlace = elem.previousElementSibling && elem.previousElementSibling.id == previousElem.id;
-              if (!isInRightPlace) {
-                previousElem.insertAdjacentElement("afterend", elem);
-              }
-            });
-          });
-        } else {
-          maybe(document.getElementById(elementToModify.elementId), (elem) => {
-            let isInRightPlace = elem.previousElementSibling == null;
-            if (!isInRightPlace) {
-              container.insertAdjacentElement("afterbegin", elem);
-            }
-          });
-        }
-      });
-      if (this.updateType == "prepend") {
-        this.elementIdsToAdd.reverse().forEach((elemId) => {
-          maybe(document.getElementById(elemId), (elem) => container.insertAdjacentElement("afterbegin", elem));
-        });
-      }
-    }
-  };
-  var DOCUMENT_FRAGMENT_NODE = 11;
-  function morphAttrs(fromNode, toNode) {
-    var toNodeAttrs = toNode.attributes;
-    var attr;
-    var attrName;
-    var attrNamespaceURI;
-    var attrValue;
-    var fromValue;
-    if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE || fromNode.nodeType === DOCUMENT_FRAGMENT_NODE) {
-      return;
-    }
-    for (var i = toNodeAttrs.length - 1; i >= 0; i--) {
-      attr = toNodeAttrs[i];
-      attrName = attr.name;
-      attrNamespaceURI = attr.namespaceURI;
-      attrValue = attr.value;
-      if (attrNamespaceURI) {
-        attrName = attr.localName || attrName;
-        fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName);
-        if (fromValue !== attrValue) {
-          if (attr.prefix === "xmlns") {
-            attrName = attr.name;
-          }
-          fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue);
-        }
-      } else {
-        fromValue = fromNode.getAttribute(attrName);
-        if (fromValue !== attrValue) {
-          fromNode.setAttribute(attrName, attrValue);
-        }
-      }
-    }
-    var fromNodeAttrs = fromNode.attributes;
-    for (var d = fromNodeAttrs.length - 1; d >= 0; d--) {
-      attr = fromNodeAttrs[d];
-      attrName = attr.name;
-      attrNamespaceURI = attr.namespaceURI;
-      if (attrNamespaceURI) {
-        attrName = attr.localName || attrName;
-        if (!toNode.hasAttributeNS(attrNamespaceURI, attrName)) {
-          fromNode.removeAttributeNS(attrNamespaceURI, attrName);
-        }
-      } else {
-        if (!toNode.hasAttribute(attrName)) {
-          fromNode.removeAttribute(attrName);
-        }
-      }
-    }
-  }
-  var range;
-  var NS_XHTML = "http://www.w3.org/1999/xhtml";
-  var doc = typeof document === "undefined" ? void 0 : document;
-  var HAS_TEMPLATE_SUPPORT = !!doc && "content" in doc.createElement("template");
-  var HAS_RANGE_SUPPORT = !!doc && doc.createRange && "createContextualFragment" in doc.createRange();
-  function createFragmentFromTemplate(str) {
-    var template = doc.createElement("template");
-    template.innerHTML = str;
-    return template.content.childNodes[0];
-  }
-  function createFragmentFromRange(str) {
-    if (!range) {
-      range = doc.createRange();
-      range.selectNode(doc.body);
-    }
-    var fragment = range.createContextualFragment(str);
-    return fragment.childNodes[0];
-  }
-  function createFragmentFromWrap(str) {
-    var fragment = doc.createElement("body");
-    fragment.innerHTML = str;
-    return fragment.childNodes[0];
-  }
-  function toElement(str) {
-    str = str.trim();
-    if (HAS_TEMPLATE_SUPPORT) {
-      return createFragmentFromTemplate(str);
-    } else if (HAS_RANGE_SUPPORT) {
-      return createFragmentFromRange(str);
-    }
-    return createFragmentFromWrap(str);
-  }
-  function compareNodeNames(fromEl, toEl) {
-    var fromNodeName = fromEl.nodeName;
-    var toNodeName = toEl.nodeName;
-    var fromCodeStart, toCodeStart;
-    if (fromNodeName === toNodeName) {
-      return true;
-    }
-    fromCodeStart = fromNodeName.charCodeAt(0);
-    toCodeStart = toNodeName.charCodeAt(0);
-    if (fromCodeStart <= 90 && toCodeStart >= 97) {
-      return fromNodeName === toNodeName.toUpperCase();
-    } else if (toCodeStart <= 90 && fromCodeStart >= 97) {
-      return toNodeName === fromNodeName.toUpperCase();
-    } else {
-      return false;
-    }
-  }
-  function createElementNS(name, namespaceURI) {
-    return !namespaceURI || namespaceURI === NS_XHTML ? doc.createElement(name) : doc.createElementNS(namespaceURI, name);
-  }
-  function moveChildren(fromEl, toEl) {
-    var curChild = fromEl.firstChild;
-    while (curChild) {
-      var nextChild = curChild.nextSibling;
-      toEl.appendChild(curChild);
-      curChild = nextChild;
-    }
-    return toEl;
-  }
-  function syncBooleanAttrProp(fromEl, toEl, name) {
-    if (fromEl[name] !== toEl[name]) {
-      fromEl[name] = toEl[name];
-      if (fromEl[name]) {
-        fromEl.setAttribute(name, "");
-      } else {
-        fromEl.removeAttribute(name);
-      }
-    }
-  }
-  var specialElHandlers = {
-    OPTION: function(fromEl, toEl) {
-      var parentNode = fromEl.parentNode;
-      if (parentNode) {
-        var parentName = parentNode.nodeName.toUpperCase();
-        if (parentName === "OPTGROUP") {
-          parentNode = parentNode.parentNode;
-          parentName = parentNode && parentNode.nodeName.toUpperCase();
-        }
-        if (parentName === "SELECT" && !parentNode.hasAttribute("multiple")) {
-          if (fromEl.hasAttribute("selected") && !toEl.selected) {
-            fromEl.setAttribute("selected", "selected");
-            fromEl.removeAttribute("selected");
-          }
-          parentNode.selectedIndex = -1;
-        }
-      }
-      syncBooleanAttrProp(fromEl, toEl, "selected");
-    },
-    INPUT: function(fromEl, toEl) {
-      syncBooleanAttrProp(fromEl, toEl, "checked");
-      syncBooleanAttrProp(fromEl, toEl, "disabled");
-      if (fromEl.value !== toEl.value) {
-        fromEl.value = toEl.value;
-      }
-      if (!toEl.hasAttribute("value")) {
-        fromEl.removeAttribute("value");
-      }
-    },
-    TEXTAREA: function(fromEl, toEl) {
-      var newValue = toEl.value;
-      if (fromEl.value !== newValue) {
-        fromEl.value = newValue;
-      }
-      var firstChild = fromEl.firstChild;
-      if (firstChild) {
-        var oldValue = firstChild.nodeValue;
-        if (oldValue == newValue || !newValue && oldValue == fromEl.placeholder) {
-          return;
-        }
-        firstChild.nodeValue = newValue;
-      }
-    },
-    SELECT: function(fromEl, toEl) {
-      if (!toEl.hasAttribute("multiple")) {
-        var selectedIndex = -1;
-        var i = 0;
-        var curChild = fromEl.firstChild;
-        var optgroup;
-        var nodeName;
-        while (curChild) {
-          nodeName = curChild.nodeName && curChild.nodeName.toUpperCase();
-          if (nodeName === "OPTGROUP") {
-            optgroup = curChild;
-            curChild = optgroup.firstChild;
-          } else {
-            if (nodeName === "OPTION") {
-              if (curChild.hasAttribute("selected")) {
-                selectedIndex = i;
-                break;
-              }
-              i++;
-            }
-            curChild = curChild.nextSibling;
-            if (!curChild && optgroup) {
-              curChild = optgroup.nextSibling;
-              optgroup = null;
-            }
-          }
-        }
-        fromEl.selectedIndex = selectedIndex;
-      }
-    }
-  };
-  var ELEMENT_NODE = 1;
-  var DOCUMENT_FRAGMENT_NODE$1 = 11;
-  var TEXT_NODE = 3;
-  var COMMENT_NODE = 8;
-  function noop2() {
-  }
-  function defaultGetNodeKey(node) {
-    if (node) {
-      return node.getAttribute && node.getAttribute("id") || node.id;
-    }
-  }
-  function morphdomFactory(morphAttrs2) {
-    return function morphdom2(fromNode, toNode, options) {
-      if (!options) {
-        options = {};
-      }
-      if (typeof toNode === "string") {
-        if (fromNode.nodeName === "#document" || fromNode.nodeName === "HTML" || fromNode.nodeName === "BODY") {
-          var toNodeHtml = toNode;
-          toNode = doc.createElement("html");
-          toNode.innerHTML = toNodeHtml;
-        } else {
-          toNode = toElement(toNode);
-        }
-      }
-      var getNodeKey = options.getNodeKey || defaultGetNodeKey;
-      var onBeforeNodeAdded = options.onBeforeNodeAdded || noop2;
-      var onNodeAdded = options.onNodeAdded || noop2;
-      var onBeforeElUpdated = options.onBeforeElUpdated || noop2;
-      var onElUpdated = options.onElUpdated || noop2;
-      var onBeforeNodeDiscarded = options.onBeforeNodeDiscarded || noop2;
-      var onNodeDiscarded = options.onNodeDiscarded || noop2;
-      var onBeforeElChildrenUpdated = options.onBeforeElChildrenUpdated || noop2;
-      var childrenOnly = options.childrenOnly === true;
-      var fromNodesLookup = /* @__PURE__ */ Object.create(null);
-      var keyedRemovalList = [];
-      function addKeyedRemoval(key) {
-        keyedRemovalList.push(key);
-      }
-      function walkDiscardedChildNodes(node, skipKeyedNodes) {
-        if (node.nodeType === ELEMENT_NODE) {
-          var curChild = node.firstChild;
-          while (curChild) {
-            var key = void 0;
-            if (skipKeyedNodes && (key = getNodeKey(curChild))) {
-              addKeyedRemoval(key);
-            } else {
-              onNodeDiscarded(curChild);
-              if (curChild.firstChild) {
-                walkDiscardedChildNodes(curChild, skipKeyedNodes);
-              }
-            }
-            curChild = curChild.nextSibling;
-          }
-        }
-      }
-      function removeNode(node, parentNode, skipKeyedNodes) {
-        if (onBeforeNodeDiscarded(node) === false) {
-          return;
-        }
-        if (parentNode) {
-          parentNode.removeChild(node);
-        }
-        onNodeDiscarded(node);
-        walkDiscardedChildNodes(node, skipKeyedNodes);
-      }
-      function indexTree(node) {
-        if (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE$1) {
-          var curChild = node.firstChild;
-          while (curChild) {
-            var key = getNodeKey(curChild);
-            if (key) {
-              fromNodesLookup[key] = curChild;
-            }
-            indexTree(curChild);
-            curChild = curChild.nextSibling;
-          }
-        }
-      }
-      indexTree(fromNode);
-      function handleNodeAdded(el) {
-        onNodeAdded(el);
-        var curChild = el.firstChild;
-        while (curChild) {
-          var nextSibling = curChild.nextSibling;
-          var key = getNodeKey(curChild);
-          if (key) {
-            var unmatchedFromEl = fromNodesLookup[key];
-            if (unmatchedFromEl && compareNodeNames(curChild, unmatchedFromEl)) {
-              curChild.parentNode.replaceChild(unmatchedFromEl, curChild);
-              morphEl(unmatchedFromEl, curChild);
-            } else {
-              handleNodeAdded(curChild);
-            }
-          } else {
-            handleNodeAdded(curChild);
-          }
-          curChild = nextSibling;
-        }
-      }
-      function cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey) {
-        while (curFromNodeChild) {
-          var fromNextSibling = curFromNodeChild.nextSibling;
-          if (curFromNodeKey = getNodeKey(curFromNodeChild)) {
-            addKeyedRemoval(curFromNodeKey);
-          } else {
-            removeNode(curFromNodeChild, fromEl, true);
-          }
-          curFromNodeChild = fromNextSibling;
-        }
-      }
-      function morphEl(fromEl, toEl, childrenOnly2) {
-        var toElKey = getNodeKey(toEl);
-        if (toElKey) {
-          delete fromNodesLookup[toElKey];
-        }
-        if (!childrenOnly2) {
-          if (onBeforeElUpdated(fromEl, toEl) === false) {
-            return;
-          }
-          morphAttrs2(fromEl, toEl);
-          onElUpdated(fromEl);
-          if (onBeforeElChildrenUpdated(fromEl, toEl) === false) {
-            return;
-          }
-        }
-        if (fromEl.nodeName !== "TEXTAREA") {
-          morphChildren(fromEl, toEl);
-        } else {
-          specialElHandlers.TEXTAREA(fromEl, toEl);
-        }
-      }
-      function morphChildren(fromEl, toEl) {
-        var curToNodeChild = toEl.firstChild;
-        var curFromNodeChild = fromEl.firstChild;
-        var curToNodeKey;
-        var curFromNodeKey;
-        var fromNextSibling;
-        var toNextSibling;
-        var matchingFromEl;
-        outer:
-          while (curToNodeChild) {
-            toNextSibling = curToNodeChild.nextSibling;
-            curToNodeKey = getNodeKey(curToNodeChild);
-            while (curFromNodeChild) {
-              fromNextSibling = curFromNodeChild.nextSibling;
-              if (curToNodeChild.isSameNode && curToNodeChild.isSameNode(curFromNodeChild)) {
-                curToNodeChild = toNextSibling;
-                curFromNodeChild = fromNextSibling;
-                continue outer;
-              }
-              curFromNodeKey = getNodeKey(curFromNodeChild);
-              var curFromNodeType = curFromNodeChild.nodeType;
-              var isCompatible = void 0;
-              if (curFromNodeType === curToNodeChild.nodeType) {
-                if (curFromNodeType === ELEMENT_NODE) {
-                  if (curToNodeKey) {
-                    if (curToNodeKey !== curFromNodeKey) {
-                      if (matchingFromEl = fromNodesLookup[curToNodeKey]) {
-                        if (fromNextSibling === matchingFromEl) {
-                          isCompatible = false;
-                        } else {
-                          fromEl.insertBefore(matchingFromEl, curFromNodeChild);
-                          if (curFromNodeKey) {
-                            addKeyedRemoval(curFromNodeKey);
-                          } else {
-                            removeNode(curFromNodeChild, fromEl, true);
-                          }
-                          curFromNodeChild = matchingFromEl;
-                        }
-                      } else {
-                        isCompatible = false;
-                      }
-                    }
-                  } else if (curFromNodeKey) {
-                    isCompatible = false;
-                  }
-                  isCompatible = isCompatible !== false && compareNodeNames(curFromNodeChild, curToNodeChild);
-                  if (isCompatible) {
-                    morphEl(curFromNodeChild, curToNodeChild);
-                  }
-                } else if (curFromNodeType === TEXT_NODE || curFromNodeType == COMMENT_NODE) {
-                  isCompatible = true;
-                  if (curFromNodeChild.nodeValue !== curToNodeChild.nodeValue) {
-                    curFromNodeChild.nodeValue = curToNodeChild.nodeValue;
-                  }
-                }
-              }
-              if (isCompatible) {
-                curToNodeChild = toNextSibling;
-                curFromNodeChild = fromNextSibling;
-                continue outer;
-              }
-              if (curFromNodeKey) {
-                addKeyedRemoval(curFromNodeKey);
-              } else {
-                removeNode(curFromNodeChild, fromEl, true);
-              }
-              curFromNodeChild = fromNextSibling;
-            }
-            if (curToNodeKey && (matchingFromEl = fromNodesLookup[curToNodeKey]) && compareNodeNames(matchingFromEl, curToNodeChild)) {
-              fromEl.appendChild(matchingFromEl);
-              morphEl(matchingFromEl, curToNodeChild);
-            } else {
-              var onBeforeNodeAddedResult = onBeforeNodeAdded(curToNodeChild);
-              if (onBeforeNodeAddedResult !== false) {
-                if (onBeforeNodeAddedResult) {
-                  curToNodeChild = onBeforeNodeAddedResult;
-                }
-                if (curToNodeChild.actualize) {
-                  curToNodeChild = curToNodeChild.actualize(fromEl.ownerDocument || doc);
-                }
-                fromEl.appendChild(curToNodeChild);
-                handleNodeAdded(curToNodeChild);
-              }
-            }
-            curToNodeChild = toNextSibling;
-            curFromNodeChild = fromNextSibling;
-          }
-        cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey);
-        var specialElHandler = specialElHandlers[fromEl.nodeName];
-        if (specialElHandler) {
-          specialElHandler(fromEl, toEl);
-        }
-      }
-      var morphedNode = fromNode;
-      var morphedNodeType = morphedNode.nodeType;
-      var toNodeType = toNode.nodeType;
-      if (!childrenOnly) {
-        if (morphedNodeType === ELEMENT_NODE) {
-          if (toNodeType === ELEMENT_NODE) {
-            if (!compareNodeNames(fromNode, toNode)) {
-              onNodeDiscarded(fromNode);
-              morphedNode = moveChildren(fromNode, createElementNS(toNode.nodeName, toNode.namespaceURI));
-            }
-          } else {
-            morphedNode = toNode;
-          }
-        } else if (morphedNodeType === TEXT_NODE || morphedNodeType === COMMENT_NODE) {
-          if (toNodeType === morphedNodeType) {
-            if (morphedNode.nodeValue !== toNode.nodeValue) {
-              morphedNode.nodeValue = toNode.nodeValue;
-            }
-            return morphedNode;
-          } else {
-            morphedNode = toNode;
-          }
-        }
-      }
-      if (morphedNode === toNode) {
-        onNodeDiscarded(fromNode);
-      } else {
-        if (toNode.isSameNode && toNode.isSameNode(morphedNode)) {
-          return;
-        }
-        morphEl(morphedNode, toNode, childrenOnly);
-        if (keyedRemovalList) {
-          for (var i = 0, len = keyedRemovalList.length; i < len; i++) {
-            var elToRemove = fromNodesLookup[keyedRemovalList[i]];
-            if (elToRemove) {
-              removeNode(elToRemove, elToRemove.parentNode, false);
-            }
-          }
-        }
-      }
-      if (!childrenOnly && morphedNode !== fromNode && fromNode.parentNode) {
-        if (morphedNode.actualize) {
-          morphedNode = morphedNode.actualize(fromNode.ownerDocument || doc);
-        }
-        fromNode.parentNode.replaceChild(morphedNode, fromNode);
-      }
-      return morphedNode;
-    };
-  }
-  var morphdom = morphdomFactory(morphAttrs);
-  var morphdom_esm_default = morphdom;
-  var DOMPatch = class {
-    static patchEl(fromEl, toEl, activeElement) {
-      morphdom_esm_default(fromEl, toEl, {
-        childrenOnly: false,
-        onBeforeElUpdated: (fromEl2, toEl2) => {
-          if (activeElement && activeElement.isSameNode(fromEl2) && dom_default.isFormInput(fromEl2)) {
-            dom_default.mergeFocusedInput(fromEl2, toEl2);
-            return false;
-          }
-        }
-      });
-    }
-    constructor(view, container, id, html, targetCID) {
-      this.view = view;
-      this.liveSocket = view.liveSocket;
-      this.container = container;
-      this.id = id;
-      this.rootID = view.root.id;
-      this.html = html;
-      this.targetCID = targetCID;
-      this.cidPatch = isCid(this.targetCID);
-      this.callbacks = {
-        beforeadded: [],
-        beforeupdated: [],
-        beforephxChildAdded: [],
-        afteradded: [],
-        afterupdated: [],
-        afterdiscarded: [],
-        afterphxChildAdded: [],
-        aftertransitionsDiscarded: []
-      };
-    }
-    before(kind, callback) {
-      this.callbacks[`before${kind}`].push(callback);
-    }
-    after(kind, callback) {
-      this.callbacks[`after${kind}`].push(callback);
-    }
-    trackBefore(kind, ...args) {
-      this.callbacks[`before${kind}`].forEach((callback) => callback(...args));
-    }
-    trackAfter(kind, ...args) {
-      this.callbacks[`after${kind}`].forEach((callback) => callback(...args));
-    }
-    markPrunableContentForRemoval() {
-      dom_default.all(this.container, "[phx-update=append] > *, [phx-update=prepend] > *", (el) => {
-        el.setAttribute(PHX_PRUNE, "");
-      });
-    }
-    perform() {
-      let { view, liveSocket: liveSocket2, container, html } = this;
-      let targetContainer = this.isCIDPatch() ? this.targetCIDContainer(html) : container;
-      if (this.isCIDPatch() && !targetContainer) {
-        return;
-      }
-      let focused = liveSocket2.getActiveElement();
-      let { selectionStart, selectionEnd } = focused && dom_default.hasSelectionRange(focused) ? focused : {};
-      let phxUpdate = liveSocket2.binding(PHX_UPDATE);
-      let phxFeedbackFor = liveSocket2.binding(PHX_FEEDBACK_FOR);
-      let disableWith = liveSocket2.binding(PHX_DISABLE_WITH);
-      let phxTriggerExternal = liveSocket2.binding(PHX_TRIGGER_ACTION);
-      let phxRemove = liveSocket2.binding("remove");
-      let added = [];
-      let updates = [];
-      let appendPrependUpdates = [];
-      let pendingRemoves = [];
-      let externalFormTriggered = null;
-      let diffHTML = liveSocket2.time("premorph container prep", () => {
-        return this.buildDiffHTML(container, html, phxUpdate, targetContainer);
-      });
-      this.trackBefore("added", container);
-      this.trackBefore("updated", container, container);
-      liveSocket2.time("morphdom", () => {
-        morphdom_esm_default(targetContainer, diffHTML, {
-          childrenOnly: targetContainer.getAttribute(PHX_COMPONENT) === null,
-          getNodeKey: (node) => {
-            return dom_default.isPhxDestroyed(node) ? null : node.id;
-          },
-          onBeforeNodeAdded: (el) => {
-            this.trackBefore("added", el);
-            return el;
-          },
-          onNodeAdded: (el) => {
-            if (el instanceof HTMLImageElement && el.srcset) {
-              el.srcset = el.srcset;
-            } else if (el instanceof HTMLVideoElement && el.autoplay) {
-              el.play();
-            }
-            if (dom_default.isNowTriggerFormExternal(el, phxTriggerExternal)) {
-              externalFormTriggered = el;
-            }
-            dom_default.discardError(targetContainer, el, phxFeedbackFor);
-            if (dom_default.isPhxChild(el) && view.ownsElement(el) || dom_default.isPhxSticky(el) && view.ownsElement(el.parentNode)) {
-              this.trackAfter("phxChildAdded", el);
-            }
-            added.push(el);
-          },
-          onNodeDiscarded: (el) => {
-            if (dom_default.isPhxChild(el) || dom_default.isPhxSticky(el)) {
-              liveSocket2.destroyViewByEl(el);
-            }
-            this.trackAfter("discarded", el);
-          },
-          onBeforeNodeDiscarded: (el) => {
-            if (el.getAttribute && el.getAttribute(PHX_PRUNE) !== null) {
-              return true;
-            }
-            if (el.parentNode !== null && dom_default.isPhxUpdate(el.parentNode, phxUpdate, ["append", "prepend"]) && el.id) {
-              return false;
-            }
-            if (el.getAttribute && el.getAttribute(phxRemove)) {
-              pendingRemoves.push(el);
-              return false;
-            }
-            if (this.skipCIDSibling(el)) {
-              return false;
-            }
-            return true;
-          },
-          onElUpdated: (el) => {
-            if (dom_default.isNowTriggerFormExternal(el, phxTriggerExternal)) {
-              externalFormTriggered = el;
-            }
-            updates.push(el);
-          },
-          onBeforeElUpdated: (fromEl, toEl) => {
-            dom_default.cleanChildNodes(toEl, phxUpdate);
-            if (this.skipCIDSibling(toEl)) {
-              return false;
-            }
-            if (dom_default.isPhxSticky(fromEl)) {
-              return false;
-            }
-            if (dom_default.isIgnored(fromEl, phxUpdate)) {
-              this.trackBefore("updated", fromEl, toEl);
-              dom_default.mergeAttrs(fromEl, toEl, { isIgnored: true });
-              updates.push(fromEl);
-              dom_default.applyStickyOperations(fromEl);
-              return false;
-            }
-            if (fromEl.type === "number" && (fromEl.validity && fromEl.validity.badInput)) {
-              return false;
-            }
-            if (!dom_default.syncPendingRef(fromEl, toEl, disableWith)) {
-              if (dom_default.isUploadInput(fromEl)) {
-                this.trackBefore("updated", fromEl, toEl);
-                updates.push(fromEl);
-              }
-              dom_default.applyStickyOperations(fromEl);
-              return false;
-            }
-            if (dom_default.isPhxChild(toEl)) {
-              let prevSession = fromEl.getAttribute(PHX_SESSION);
-              dom_default.mergeAttrs(fromEl, toEl, { exclude: [PHX_STATIC] });
-              if (prevSession !== "") {
-                fromEl.setAttribute(PHX_SESSION, prevSession);
-              }
-              fromEl.setAttribute(PHX_ROOT_ID, this.rootID);
-              dom_default.applyStickyOperations(fromEl);
-              return false;
-            }
-            dom_default.copyPrivates(toEl, fromEl);
-            dom_default.discardError(targetContainer, toEl, phxFeedbackFor);
-            let isFocusedFormEl = focused && fromEl.isSameNode(focused) && dom_default.isFormInput(fromEl);
-            if (isFocusedFormEl) {
-              this.trackBefore("updated", fromEl, toEl);
-              dom_default.mergeFocusedInput(fromEl, toEl);
-              dom_default.syncAttrsToProps(fromEl);
-              updates.push(fromEl);
-              dom_default.applyStickyOperations(fromEl);
-              return false;
-            } else {
-              if (dom_default.isPhxUpdate(toEl, phxUpdate, ["append", "prepend"])) {
-                appendPrependUpdates.push(new DOMPostMorphRestorer(fromEl, toEl, toEl.getAttribute(phxUpdate)));
-              }
-              dom_default.syncAttrsToProps(toEl);
-              dom_default.applyStickyOperations(toEl);
-              this.trackBefore("updated", fromEl, toEl);
-              return true;
-            }
-          }
-        });
-      });
-      if (liveSocket2.isDebugEnabled()) {
-        detectDuplicateIds();
-      }
-      if (appendPrependUpdates.length > 0) {
-        liveSocket2.time("post-morph append/prepend restoration", () => {
-          appendPrependUpdates.forEach((update) => update.perform());
-        });
-      }
-      liveSocket2.silenceEvents(() => dom_default.restoreFocus(focused, selectionStart, selectionEnd));
-      dom_default.dispatchEvent(document, "phx:update");
-      added.forEach((el) => this.trackAfter("added", el));
-      updates.forEach((el) => this.trackAfter("updated", el));
-      if (pendingRemoves.length > 0) {
-        liveSocket2.transitionRemoves(pendingRemoves);
-        liveSocket2.requestDOMUpdate(() => {
-          pendingRemoves.forEach((el) => {
-            let child = dom_default.firstPhxChild(el);
-            if (child) {
-              liveSocket2.destroyViewByEl(child);
-            }
-            el.remove();
-          });
-          this.trackAfter("transitionsDiscarded", pendingRemoves);
-        });
-      }
-      if (externalFormTriggered) {
-        liveSocket2.disconnect();
-        externalFormTriggered.submit();
-      }
-      return true;
-    }
-    isCIDPatch() {
-      return this.cidPatch;
-    }
-    skipCIDSibling(el) {
-      return el.nodeType === Node.ELEMENT_NODE && el.getAttribute(PHX_SKIP) !== null;
-    }
-    targetCIDContainer(html) {
-      if (!this.isCIDPatch()) {
-        return;
-      }
-      let [first, ...rest] = dom_default.findComponentNodeList(this.container, this.targetCID);
-      if (rest.length === 0 && dom_default.childNodeLength(html) === 1) {
-        return first;
-      } else {
-        return first && first.parentNode;
-      }
-    }
-    buildDiffHTML(container, html, phxUpdate, targetContainer) {
-      let isCIDPatch = this.isCIDPatch();
-      let isCIDWithSingleRoot = isCIDPatch && targetContainer.getAttribute(PHX_COMPONENT) === this.targetCID.toString();
-      if (!isCIDPatch || isCIDWithSingleRoot) {
-        return html;
-      } else {
-        let diffContainer = null;
-        let template = document.createElement("template");
-        diffContainer = dom_default.cloneNode(targetContainer);
-        let [firstComponent, ...rest] = dom_default.findComponentNodeList(diffContainer, this.targetCID);
-        template.innerHTML = html;
-        rest.forEach((el) => el.remove());
-        Array.from(diffContainer.childNodes).forEach((child) => {
-          if (child.id && child.nodeType === Node.ELEMENT_NODE && child.getAttribute(PHX_COMPONENT) !== this.targetCID.toString()) {
-            child.setAttribute(PHX_SKIP, "");
-            child.innerHTML = "";
-          }
-        });
-        Array.from(template.content.childNodes).forEach((el) => diffContainer.insertBefore(el, firstComponent));
-        firstComponent.remove();
-        return diffContainer.outerHTML;
-      }
-    }
-  };
-  var Rendered = class {
-    static extract(diff) {
-      let { [REPLY]: reply, [EVENTS]: events, [TITLE]: title } = diff;
-      delete diff[REPLY];
-      delete diff[EVENTS];
-      delete diff[TITLE];
-      return { diff, title, reply: reply || null, events: events || [] };
-    }
-    constructor(viewId, rendered) {
-      this.viewId = viewId;
-      this.rendered = {};
-      this.mergeDiff(rendered);
-    }
-    parentViewId() {
-      return this.viewId;
-    }
-    toString(onlyCids) {
-      return this.recursiveToString(this.rendered, this.rendered[COMPONENTS], onlyCids);
-    }
-    recursiveToString(rendered, components = rendered[COMPONENTS], onlyCids) {
-      onlyCids = onlyCids ? new Set(onlyCids) : null;
-      let output = { buffer: "", components, onlyCids };
-      this.toOutputBuffer(rendered, null, output);
-      return output.buffer;
-    }
-    componentCIDs(diff) {
-      return Object.keys(diff[COMPONENTS] || {}).map((i) => parseInt(i));
-    }
-    isComponentOnlyDiff(diff) {
-      if (!diff[COMPONENTS]) {
-        return false;
-      }
-      return Object.keys(diff).length === 1;
-    }
-    getComponent(diff, cid) {
-      return diff[COMPONENTS][cid];
-    }
-    mergeDiff(diff) {
-      let newc = diff[COMPONENTS];
-      let cache = {};
-      delete diff[COMPONENTS];
-      this.rendered = this.mutableMerge(this.rendered, diff);
-      this.rendered[COMPONENTS] = this.rendered[COMPONENTS] || {};
-      if (newc) {
-        let oldc = this.rendered[COMPONENTS];
-        for (let cid in newc) {
-          newc[cid] = this.cachedFindComponent(cid, newc[cid], oldc, newc, cache);
-        }
-        for (let cid in newc) {
-          oldc[cid] = newc[cid];
-        }
-        diff[COMPONENTS] = newc;
-      }
-    }
-    cachedFindComponent(cid, cdiff, oldc, newc, cache) {
-      if (cache[cid]) {
-        return cache[cid];
-      } else {
-        let ndiff, stat, scid = cdiff[STATIC];
-        if (isCid(scid)) {
-          let tdiff;
-          if (scid > 0) {
-            tdiff = this.cachedFindComponent(scid, newc[scid], oldc, newc, cache);
-          } else {
-            tdiff = oldc[-scid];
-          }
-          stat = tdiff[STATIC];
-          ndiff = this.cloneMerge(tdiff, cdiff);
-          ndiff[STATIC] = stat;
-        } else {
-          ndiff = cdiff[STATIC] !== void 0 ? cdiff : this.cloneMerge(oldc[cid] || {}, cdiff);
-        }
-        cache[cid] = ndiff;
-        return ndiff;
-      }
-    }
-    mutableMerge(target, source) {
-      if (source[STATIC] !== void 0) {
-        return source;
-      } else {
-        this.doMutableMerge(target, source);
-        return target;
-      }
-    }
-    doMutableMerge(target, source) {
-      for (let key in source) {
-        let val = source[key];
-        let targetVal = target[key];
-        if (isObject(val) && val[STATIC] === void 0 && isObject(targetVal)) {
-          this.doMutableMerge(targetVal, val);
-        } else {
-          target[key] = val;
-        }
-      }
-    }
-    cloneMerge(target, source) {
-      let merged = __spreadValues(__spreadValues({}, target), source);
-      for (let key in merged) {
-        let val = source[key];
-        let targetVal = target[key];
-        if (isObject(val) && val[STATIC] === void 0 && isObject(targetVal)) {
-          merged[key] = this.cloneMerge(targetVal, val);
-        }
-      }
-      return merged;
-    }
-    componentToString(cid) {
-      return this.recursiveCIDToString(this.rendered[COMPONENTS], cid);
-    }
-    pruneCIDs(cids) {
-      cids.forEach((cid) => delete this.rendered[COMPONENTS][cid]);
-    }
-    get() {
-      return this.rendered;
-    }
-    isNewFingerprint(diff = {}) {
-      return !!diff[STATIC];
-    }
-    templateStatic(part, templates) {
-      if (typeof part === "number") {
-        return templates[part];
-      } else {
-        return part;
-      }
-    }
-    toOutputBuffer(rendered, templates, output) {
-      if (rendered[DYNAMICS]) {
-        return this.comprehensionToBuffer(rendered, templates, output);
-      }
-      let { [STATIC]: statics } = rendered;
-      statics = this.templateStatic(statics, templates);
-      output.buffer += statics[0];
-      for (let i = 1; i < statics.length; i++) {
-        this.dynamicToBuffer(rendered[i - 1], templates, output);
-        output.buffer += statics[i];
-      }
-    }
-    comprehensionToBuffer(rendered, templates, output) {
-      let { [DYNAMICS]: dynamics, [STATIC]: statics } = rendered;
-      statics = this.templateStatic(statics, templates);
-      let compTemplates = templates || rendered[TEMPLATES];
-      for (let d = 0; d < dynamics.length; d++) {
-        let dynamic = dynamics[d];
-        output.buffer += statics[0];
-        for (let i = 1; i < statics.length; i++) {
-          this.dynamicToBuffer(dynamic[i - 1], compTemplates, output);
-          output.buffer += statics[i];
-        }
-      }
-    }
-    dynamicToBuffer(rendered, templates, output) {
-      if (typeof rendered === "number") {
-        output.buffer += this.recursiveCIDToString(output.components, rendered, output.onlyCids);
-      } else if (isObject(rendered)) {
-        this.toOutputBuffer(rendered, templates, output);
-      } else {
-        output.buffer += rendered;
-      }
-    }
-    recursiveCIDToString(components, cid, onlyCids) {
-      let component = components[cid] || logError(`no component for CID ${cid}`, components);
-      let template = document.createElement("template");
-      template.innerHTML = this.recursiveToString(component, components, onlyCids);
-      let container = template.content;
-      let skip = onlyCids && !onlyCids.has(cid);
-      let [hasChildNodes, hasChildComponents] = Array.from(container.childNodes).reduce(([hasNodes, hasComponents], child, i) => {
-        if (child.nodeType === Node.ELEMENT_NODE) {
-          if (child.getAttribute(PHX_COMPONENT)) {
-            return [hasNodes, true];
-          }
-          child.setAttribute(PHX_COMPONENT, cid);
-          if (!child.id) {
-            child.id = `${this.parentViewId()}-${cid}-${i}`;
-          }
-          if (skip) {
-            child.setAttribute(PHX_SKIP, "");
-            child.innerHTML = "";
-          }
-          return [true, hasComponents];
-        } else {
-          if (child.nodeValue.trim() !== "") {
-            logError(`only HTML element tags are allowed at the root of components.
-
-got: "${child.nodeValue.trim()}"
+got: "${I.nodeValue.trim()}"
 
 within:
-`, template.innerHTML.trim());
-            child.replaceWith(this.createSpan(child.nodeValue, cid));
-            return [true, hasComponents];
-          } else {
-            child.remove();
-            return [hasNodes, hasComponents];
-          }
-        }
-      }, [false, false]);
-      if (!hasChildNodes && !hasChildComponents) {
-        logError("expected at least one HTML element tag inside a component, but the component is empty:\n", template.innerHTML.trim());
-        return this.createSpan("", cid).outerHTML;
-      } else if (!hasChildNodes && hasChildComponents) {
-        logError("expected at least one HTML element tag directly inside a component, but only subcomponents were found. A component must render at least one HTML tag directly inside itself.", template.innerHTML.trim());
-        return template.innerHTML;
-      } else {
-        return template.innerHTML;
-      }
-    }
-    createSpan(text, cid) {
-      let span = document.createElement("span");
-      span.innerText = text;
-      span.setAttribute(PHX_COMPONENT, cid);
-      return span;
-    }
-  };
-  var viewHookID = 1;
-  var ViewHook = class {
-    static makeID() {
-      return viewHookID++;
-    }
-    static elementID(el) {
-      return el.phxHookId;
-    }
-    constructor(view, el, callbacks) {
-      this.__view = view;
-      this.liveSocket = view.liveSocket;
-      this.__callbacks = callbacks;
-      this.__listeners = /* @__PURE__ */ new Set();
-      this.__isDisconnected = false;
-      this.el = el;
-      this.el.phxHookId = this.constructor.makeID();
-      for (let key in this.__callbacks) {
-        this[key] = this.__callbacks[key];
-      }
-    }
-    __mounted() {
-      this.mounted && this.mounted();
-    }
-    __updated() {
-      this.updated && this.updated();
-    }
-    __beforeUpdate() {
-      this.beforeUpdate && this.beforeUpdate();
-    }
-    __destroyed() {
-      this.destroyed && this.destroyed();
-    }
-    __reconnected() {
-      if (this.__isDisconnected) {
-        this.__isDisconnected = false;
-        this.reconnected && this.reconnected();
-      }
-    }
-    __disconnected() {
-      this.__isDisconnected = true;
-      this.disconnected && this.disconnected();
-    }
-    pushEvent(event, payload = {}, onReply = function() {
-    }) {
-      return this.__view.pushHookEvent(null, event, payload, onReply);
-    }
-    pushEventTo(phxTarget, event, payload = {}, onReply = function() {
-    }) {
-      return this.__view.withinTargets(phxTarget, (view, targetCtx) => {
-        return view.pushHookEvent(targetCtx, event, payload, onReply);
-      });
-    }
-    handleEvent(event, callback) {
-      let callbackRef = (customEvent, bypass) => bypass ? event : callback(customEvent.detail);
-      window.addEventListener(`phx:${event}`, callbackRef);
-      this.__listeners.add(callbackRef);
-      return callbackRef;
-    }
-    removeHandleEvent(callbackRef) {
-      let event = callbackRef(null, true);
-      window.removeEventListener(`phx:${event}`, callbackRef);
-      this.__listeners.delete(callbackRef);
-    }
-    upload(name, files) {
-      return this.__view.dispatchUploads(name, files);
-    }
-    uploadTo(phxTarget, name, files) {
-      return this.__view.withinTargets(phxTarget, (view) => view.dispatchUploads(name, files));
-    }
-    __cleanup__() {
-      this.__listeners.forEach((callbackRef) => this.removeHandleEvent(callbackRef));
-    }
-  };
-  var JS = {
-    exec(eventType, phxEvent, view, sourceEl, defaults) {
-      let [defaultKind, defaultArgs] = defaults || [null, {}];
-      let commands = phxEvent.charAt(0) === "[" ? JSON.parse(phxEvent) : [[defaultKind, defaultArgs]];
-      commands.forEach(([kind, args]) => {
-        if (kind === defaultKind && defaultArgs.data) {
-          args.data = Object.assign(args.data || {}, defaultArgs.data);
-        }
-        this.filterToEls(sourceEl, args).forEach((el) => {
-          this[`exec_${kind}`](eventType, phxEvent, view, sourceEl, el, args);
-        });
-      });
-    },
-    isVisible(el) {
-      return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length > 0);
-    },
-    exec_dispatch(eventType, phxEvent, view, sourceEl, el, { to, event, detail, bubbles }) {
-      detail = detail || {};
-      detail.dispatcher = sourceEl;
-      dom_default.dispatchEvent(el, event, { detail, bubbles });
-    },
-    exec_push(eventType, phxEvent, view, sourceEl, el, args) {
-      if (!view.isConnected()) {
-        return;
-      }
-      let { event, data, target, page_loading, loading, value, dispatcher } = args;
-      let pushOpts = { loading, value, target, page_loading: !!page_loading };
-      let targetSrc = eventType === "change" && dispatcher ? dispatcher : sourceEl;
-      let phxTarget = target || targetSrc.getAttribute(view.binding("target")) || targetSrc;
-      view.withinTargets(phxTarget, (targetView, targetCtx) => {
-        if (eventType === "change") {
-          let { newCid, _target, callback } = args;
-          _target = _target || (sourceEl instanceof HTMLInputElement ? sourceEl.name : void 0);
-          if (_target) {
-            pushOpts._target = _target;
-          }
-          targetView.pushInput(sourceEl, targetCtx, newCid, event || phxEvent, pushOpts, callback);
-        } else if (eventType === "submit") {
-          targetView.submitForm(sourceEl, targetCtx, event || phxEvent, pushOpts);
-        } else {
-          targetView.pushEvent(eventType, sourceEl, targetCtx, event || phxEvent, data, pushOpts);
-        }
-      });
-    },
-    exec_add_class(eventType, phxEvent, view, sourceEl, el, { names, transition, time }) {
-      this.addOrRemoveClasses(el, names, [], transition, time, view);
-    },
-    exec_remove_class(eventType, phxEvent, view, sourceEl, el, { names, transition, time }) {
-      this.addOrRemoveClasses(el, [], names, transition, time, view);
-    },
-    exec_transition(eventType, phxEvent, view, sourceEl, el, { time, transition }) {
-      let [transition_start, running, transition_end] = transition;
-      let onStart = () => this.addOrRemoveClasses(el, transition_start.concat(running), []);
-      let onDone = () => this.addOrRemoveClasses(el, transition_end, transition_start.concat(running));
-      view.transition(time, onStart, onDone);
-    },
-    exec_toggle(eventType, phxEvent, view, sourceEl, el, { display, ins, outs, time }) {
-      this.toggle(eventType, view, el, display, ins, outs, time);
-    },
-    exec_show(eventType, phxEvent, view, sourceEl, el, { display, transition, time }) {
-      this.show(eventType, view, el, display, transition, time);
-    },
-    exec_hide(eventType, phxEvent, view, sourceEl, el, { display, transition, time }) {
-      this.hide(eventType, view, el, display, transition, time);
-    },
-    exec_set_attr(eventType, phxEvent, view, sourceEl, el, { attr: [attr, val] }) {
-      this.setOrRemoveAttrs(el, [[attr, val]], []);
-    },
-    exec_remove_attr(eventType, phxEvent, view, sourceEl, el, { attr }) {
-      this.setOrRemoveAttrs(el, [], [attr]);
-    },
-    show(eventType, view, el, display, transition, time) {
-      if (!this.isVisible(el)) {
-        this.toggle(eventType, view, el, display, transition, null, time);
-      }
-    },
-    hide(eventType, view, el, display, transition, time) {
-      if (this.isVisible(el)) {
-        this.toggle(eventType, view, el, display, null, transition, time);
-      }
-    },
-    toggle(eventType, view, el, display, ins, outs, time) {
-      let [inClasses, inStartClasses, inEndClasses] = ins || [[], [], []];
-      let [outClasses, outStartClasses, outEndClasses] = outs || [[], [], []];
-      if (inClasses.length > 0 || outClasses.length > 0) {
-        if (this.isVisible(el)) {
-          let onStart = () => {
-            this.addOrRemoveClasses(el, outStartClasses, inClasses.concat(inStartClasses).concat(inEndClasses));
-            window.requestAnimationFrame(() => {
-              this.addOrRemoveClasses(el, outClasses, []);
-              window.requestAnimationFrame(() => this.addOrRemoveClasses(el, outEndClasses, outStartClasses));
-            });
-          };
-          el.dispatchEvent(new Event("phx:hide-start"));
-          view.transition(time, onStart, () => {
-            this.addOrRemoveClasses(el, [], outClasses.concat(outEndClasses));
-            dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = "none");
-            el.dispatchEvent(new Event("phx:hide-end"));
-          });
-        } else {
-          if (eventType === "remove") {
-            return;
-          }
-          let onStart = () => {
-            this.addOrRemoveClasses(el, inStartClasses, outClasses.concat(outStartClasses).concat(outEndClasses));
-            dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = display || "block");
-            window.requestAnimationFrame(() => {
-              this.addOrRemoveClasses(el, inClasses, []);
-              window.requestAnimationFrame(() => this.addOrRemoveClasses(el, inEndClasses, inStartClasses));
-            });
-          };
-          el.dispatchEvent(new Event("phx:show-start"));
-          view.transition(time, onStart, () => {
-            this.addOrRemoveClasses(el, [], inClasses.concat(inEndClasses));
-            el.dispatchEvent(new Event("phx:show-end"));
-          });
-        }
-      } else {
-        if (this.isVisible(el)) {
-          window.requestAnimationFrame(() => {
-            el.dispatchEvent(new Event("phx:hide-start"));
-            dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = "none");
-            el.dispatchEvent(new Event("phx:hide-end"));
-          });
-        } else {
-          window.requestAnimationFrame(() => {
-            el.dispatchEvent(new Event("phx:show-start"));
-            dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = display || "block");
-            el.dispatchEvent(new Event("phx:show-end"));
-          });
-        }
-      }
-    },
-    addOrRemoveClasses(el, adds, removes, transition, time, view) {
-      let [transition_run, transition_start, transition_end] = transition || [[], [], []];
-      if (transition_run.length > 0) {
-        let onStart = () => this.addOrRemoveClasses(el, transition_start.concat(transition_run), []);
-        let onDone = () => this.addOrRemoveClasses(el, adds.concat(transition_end), removes.concat(transition_run).concat(transition_start));
-        return view.transition(time, onStart, onDone);
-      }
-      window.requestAnimationFrame(() => {
-        let [prevAdds, prevRemoves] = dom_default.getSticky(el, "classes", [[], []]);
-        let keepAdds = adds.filter((name) => prevAdds.indexOf(name) < 0 && !el.classList.contains(name));
-        let keepRemoves = removes.filter((name) => prevRemoves.indexOf(name) < 0 && el.classList.contains(name));
-        let newAdds = prevAdds.filter((name) => removes.indexOf(name) < 0).concat(keepAdds);
-        let newRemoves = prevRemoves.filter((name) => adds.indexOf(name) < 0).concat(keepRemoves);
-        dom_default.putSticky(el, "classes", (currentEl) => {
-          currentEl.classList.remove(...newRemoves);
-          currentEl.classList.add(...newAdds);
-          return [newAdds, newRemoves];
-        });
-      });
-    },
-    setOrRemoveAttrs(el, sets, removes) {
-      let [prevSets, prevRemoves] = dom_default.getSticky(el, "attrs", [[], []]);
-      let alteredAttrs = sets.map(([attr, _val]) => attr).concat(removes);
-      let newSets = prevSets.filter(([attr, _val]) => !alteredAttrs.includes(attr)).concat(sets);
-      let newRemoves = prevRemoves.filter((attr) => !alteredAttrs.includes(attr)).concat(removes);
-      dom_default.putSticky(el, "attrs", (currentEl) => {
-        newRemoves.forEach((attr) => currentEl.removeAttribute(attr));
-        newSets.forEach(([attr, val]) => currentEl.setAttribute(attr, val));
-        return [newSets, newRemoves];
-      });
-    },
-    hasAllClasses(el, classes) {
-      return classes.every((name) => el.classList.contains(name));
-    },
-    isToggledOut(el, outClasses) {
-      return !this.isVisible(el) || this.hasAllClasses(el, outClasses);
-    },
-    filterToEls(sourceEl, { to }) {
-      return to ? dom_default.all(document, to) : [sourceEl];
-    }
-  };
-  var js_default = JS;
-  var serializeForm = (form, meta, onlyNames = []) => {
-    let formData = new FormData(form);
-    let toRemove = [];
-    formData.forEach((val, key, _index) => {
-      if (val instanceof File) {
-        toRemove.push(key);
-      }
-    });
-    toRemove.forEach((key) => formData.delete(key));
-    let params = new URLSearchParams();
-    for (let [key, val] of formData.entries()) {
-      if (onlyNames.length === 0 || onlyNames.indexOf(key) >= 0) {
-        params.append(key, val);
-      }
-    }
-    for (let metaKey in meta) {
-      params.append(metaKey, meta[metaKey]);
-    }
-    return params.toString();
-  };
-  var View = class {
-    constructor(el, liveSocket2, parentView, flash) {
-      this.liveSocket = liveSocket2;
-      this.flash = flash;
-      this.parent = parentView;
-      this.root = parentView ? parentView.root : this;
-      this.el = el;
-      this.id = this.el.id;
-      this.ref = 0;
-      this.childJoins = 0;
-      this.loaderTimer = null;
-      this.pendingDiffs = [];
-      this.pruningCIDs = [];
-      this.redirect = false;
-      this.href = null;
-      this.joinCount = this.parent ? this.parent.joinCount - 1 : 0;
-      this.joinPending = true;
-      this.destroyed = false;
-      this.joinCallback = function(onDone) {
-        onDone && onDone();
-      };
-      this.stopCallback = function() {
-      };
-      this.pendingJoinOps = this.parent ? null : [];
-      this.viewHooks = {};
-      this.uploaders = {};
-      this.formSubmits = [];
-      this.children = this.parent ? null : {};
-      this.root.children[this.id] = {};
-      this.channel = this.liveSocket.channel(`lv:${this.id}`, () => {
-        return {
-          redirect: this.redirect ? this.href : void 0,
-          url: this.redirect ? void 0 : this.href || void 0,
-          params: this.connectParams(),
-          session: this.getSession(),
-          static: this.getStatic(),
-          flash: this.flash
-        };
-      });
-      this.showLoader(this.liveSocket.loaderTimeout);
-      this.bindChannel();
-    }
-    setHref(href) {
-      this.href = href;
-    }
-    setRedirect(href) {
-      this.redirect = true;
-      this.href = href;
-    }
-    isMain() {
-      return this.el.hasAttribute(PHX_MAIN);
-    }
-    connectParams() {
-      let params = this.liveSocket.params(this.el);
-      let manifest = dom_default.all(document, `[${this.binding(PHX_TRACK_STATIC)}]`).map((node) => node.src || node.href).filter((url) => typeof url === "string");
-      if (manifest.length > 0) {
-        params["_track_static"] = manifest;
-      }
-      params["_mounts"] = this.joinCount;
-      return params;
-    }
-    isConnected() {
-      return this.channel.canPush();
-    }
-    getSession() {
-      return this.el.getAttribute(PHX_SESSION);
-    }
-    getStatic() {
-      let val = this.el.getAttribute(PHX_STATIC);
-      return val === "" ? null : val;
-    }
-    destroy(callback = function() {
-    }) {
-      this.destroyAllChildren();
-      this.destroyed = true;
-      delete this.root.children[this.id];
-      if (this.parent) {
-        delete this.root.children[this.parent.id][this.id];
-      }
-      clearTimeout(this.loaderTimer);
-      let onFinished = () => {
-        callback();
-        for (let id in this.viewHooks) {
-          this.destroyHook(this.viewHooks[id]);
-        }
-      };
-      dom_default.markPhxChildDestroyed(this.el);
-      this.log("destroyed", () => ["the child has been removed from the parent"]);
-      this.channel.leave().receive("ok", onFinished).receive("error", onFinished).receive("timeout", onFinished);
-    }
-    setContainerClasses(...classes) {
-      this.el.classList.remove(PHX_CONNECTED_CLASS, PHX_DISCONNECTED_CLASS, PHX_ERROR_CLASS);
-      this.el.classList.add(...classes);
-    }
-    showLoader(timeout) {
-      clearTimeout(this.loaderTimer);
-      if (timeout) {
-        this.loaderTimer = setTimeout(() => this.showLoader(), timeout);
-      } else {
-        for (let id in this.viewHooks) {
-          this.viewHooks[id].__disconnected();
-        }
-        this.setContainerClasses(PHX_DISCONNECTED_CLASS);
-      }
-    }
-    hideLoader() {
-      clearTimeout(this.loaderTimer);
-      this.setContainerClasses(PHX_CONNECTED_CLASS);
-    }
-    triggerReconnected() {
-      for (let id in this.viewHooks) {
-        this.viewHooks[id].__reconnected();
-      }
-    }
-    log(kind, msgCallback) {
-      this.liveSocket.log(this, kind, msgCallback);
-    }
-    transition(time, onStart, onDone = function() {
-    }) {
-      this.liveSocket.transition(time, onStart, onDone);
-    }
-    withinTargets(phxTarget, callback) {
-      if (phxTarget instanceof HTMLElement || phxTarget instanceof SVGElement) {
-        return this.liveSocket.owner(phxTarget, (view) => callback(view, phxTarget));
-      }
-      if (isCid(phxTarget)) {
-        let targets = dom_default.findComponentNodeList(this.el, phxTarget);
-        if (targets.length === 0) {
-          logError(`no component found matching phx-target of ${phxTarget}`);
-        } else {
-          callback(this, parseInt(phxTarget));
-        }
-      } else {
-        let targets = Array.from(document.querySelectorAll(phxTarget));
-        if (targets.length === 0) {
-          logError(`nothing found matching the phx-target selector "${phxTarget}"`);
-        }
-        targets.forEach((target) => this.liveSocket.owner(target, (view) => callback(view, target)));
-      }
-    }
-    applyDiff(type, rawDiff, callback) {
-      this.log(type, () => ["", clone(rawDiff)]);
-      let { diff, reply, events, title } = Rendered.extract(rawDiff);
-      if (title) {
-        dom_default.putTitle(title);
-      }
-      callback({ diff, reply, events });
-      return reply;
-    }
-    onJoin(resp) {
-      let { rendered, container } = resp;
-      if (container) {
-        let [tag, attrs] = container;
-        this.el = dom_default.replaceRootContainer(this.el, tag, attrs);
-      }
-      this.childJoins = 0;
-      this.joinPending = true;
-      this.flash = null;
-      browser_default.dropLocal(this.liveSocket.localStorage, window.location.pathname, CONSECUTIVE_RELOADS);
-      this.applyDiff("mount", rendered, ({ diff, events }) => {
-        this.rendered = new Rendered(this.id, diff);
-        let html = this.renderContainer(null, "join");
-        this.dropPendingRefs();
-        let forms = this.formsForRecovery(html);
-        this.joinCount++;
-        if (forms.length > 0) {
-          forms.forEach(([form, newForm, newCid], i) => {
-            this.pushFormRecovery(form, newCid, (resp2) => {
-              if (i === forms.length - 1) {
-                this.onJoinComplete(resp2, html, events);
-              }
-            });
-          });
-        } else {
-          this.onJoinComplete(resp, html, events);
-        }
-      });
-    }
-    dropPendingRefs() {
-      dom_default.all(document, `[${PHX_REF_SRC}="${this.id}"][${PHX_REF}]`, (el) => {
-        el.removeAttribute(PHX_REF);
-        el.removeAttribute(PHX_REF_SRC);
-      });
-    }
-    onJoinComplete({ live_patch }, html, events) {
-      if (this.joinCount > 1 || this.parent && !this.parent.isJoinPending()) {
-        return this.applyJoinPatch(live_patch, html, events);
-      }
-      let newChildren = dom_default.findPhxChildrenInFragment(html, this.id).filter((toEl) => {
-        let fromEl = toEl.id && this.el.querySelector(`[id="${toEl.id}"]`);
-        let phxStatic = fromEl && fromEl.getAttribute(PHX_STATIC);
-        if (phxStatic) {
-          toEl.setAttribute(PHX_STATIC, phxStatic);
-        }
-        return this.joinChild(toEl);
-      });
-      if (newChildren.length === 0) {
-        if (this.parent) {
-          this.root.pendingJoinOps.push([this, () => this.applyJoinPatch(live_patch, html, events)]);
-          this.parent.ackJoin(this);
-        } else {
-          this.onAllChildJoinsComplete();
-          this.applyJoinPatch(live_patch, html, events);
-        }
-      } else {
-        this.root.pendingJoinOps.push([this, () => this.applyJoinPatch(live_patch, html, events)]);
-      }
-    }
-    attachTrueDocEl() {
-      this.el = dom_default.byId(this.id);
-      this.el.setAttribute(PHX_ROOT_ID, this.root.id);
-    }
-    applyJoinPatch(live_patch, html, events) {
-      this.attachTrueDocEl();
-      let patch = new DOMPatch(this, this.el, this.id, html, null);
-      patch.markPrunableContentForRemoval();
-      this.performPatch(patch, false);
-      this.joinNewChildren();
-      dom_default.all(this.el, `[${this.binding(PHX_HOOK)}], [data-phx-${PHX_HOOK}]`, (hookEl) => {
-        let hook = this.addHook(hookEl);
-        if (hook) {
-          hook.__mounted();
-        }
-      });
-      this.joinPending = false;
-      this.liveSocket.dispatchEvents(events);
-      this.applyPendingUpdates();
-      if (live_patch) {
-        let { kind, to } = live_patch;
-        this.liveSocket.historyPatch(to, kind);
-      }
-      this.hideLoader();
-      if (this.joinCount > 1) {
-        this.triggerReconnected();
-      }
-      this.stopCallback();
-    }
-    triggerBeforeUpdateHook(fromEl, toEl) {
-      this.liveSocket.triggerDOM("onBeforeElUpdated", [fromEl, toEl]);
-      let hook = this.getHook(fromEl);
-      let isIgnored = hook && dom_default.isIgnored(fromEl, this.binding(PHX_UPDATE));
-      if (hook && !fromEl.isEqualNode(toEl) && !(isIgnored && isEqualObj(fromEl.dataset, toEl.dataset))) {
-        hook.__beforeUpdate();
-        return hook;
-      }
-    }
-    performPatch(patch, pruneCids) {
-      let removedEls = [];
-      let phxChildrenAdded = false;
-      let updatedHookIds = /* @__PURE__ */ new Set();
-      patch.after("added", (el) => {
-        this.liveSocket.triggerDOM("onNodeAdded", [el]);
-        let newHook = this.addHook(el);
-        if (newHook) {
-          newHook.__mounted();
-        }
-      });
-      patch.after("phxChildAdded", (el) => {
-        if (dom_default.isPhxSticky(el)) {
-          this.liveSocket.joinRootViews();
-        } else {
-          phxChildrenAdded = true;
-        }
-      });
-      patch.before("updated", (fromEl, toEl) => {
-        let hook = this.triggerBeforeUpdateHook(fromEl, toEl);
-        if (hook) {
-          updatedHookIds.add(fromEl.id);
-        }
-      });
-      patch.after("updated", (el) => {
-        if (updatedHookIds.has(el.id)) {
-          this.getHook(el).__updated();
-        }
-      });
-      patch.after("discarded", (el) => {
-        if (el.nodeType === Node.ELEMENT_NODE) {
-          removedEls.push(el);
-        }
-      });
-      patch.after("transitionsDiscarded", (els) => this.afterElementsRemoved(els, pruneCids));
-      patch.perform();
-      this.afterElementsRemoved(removedEls, pruneCids);
-      return phxChildrenAdded;
-    }
-    afterElementsRemoved(elements, pruneCids) {
-      let destroyedCIDs = [];
-      elements.forEach((parent) => {
-        let components = dom_default.all(parent, `[${PHX_COMPONENT}]`);
-        let hooks = dom_default.all(parent, `[${this.binding(PHX_HOOK)}]`);
-        components.concat(parent).forEach((el) => {
-          let cid = this.componentID(el);
-          if (isCid(cid) && destroyedCIDs.indexOf(cid) === -1) {
-            destroyedCIDs.push(cid);
-          }
-        });
-        hooks.concat(parent).forEach((hookEl) => {
-          let hook = this.getHook(hookEl);
-          hook && this.destroyHook(hook);
-        });
-      });
-      if (pruneCids) {
-        this.maybePushComponentsDestroyed(destroyedCIDs);
-      }
-    }
-    joinNewChildren() {
-      dom_default.findPhxChildren(this.el, this.id).forEach((el) => this.joinChild(el));
-    }
-    getChildById(id) {
-      return this.root.children[this.id][id];
-    }
-    getDescendentByEl(el) {
-      if (el.id === this.id) {
-        return this;
-      } else {
-        return this.children[el.getAttribute(PHX_PARENT_ID)][el.id];
-      }
-    }
-    destroyDescendent(id) {
-      for (let parentId in this.root.children) {
-        for (let childId in this.root.children[parentId]) {
-          if (childId === id) {
-            return this.root.children[parentId][childId].destroy();
-          }
-        }
-      }
-    }
-    joinChild(el) {
-      let child = this.getChildById(el.id);
-      if (!child) {
-        let view = new View(el, this.liveSocket, this);
-        this.root.children[this.id][view.id] = view;
-        view.join();
-        this.childJoins++;
-        return true;
-      }
-    }
-    isJoinPending() {
-      return this.joinPending;
-    }
-    ackJoin(_child) {
-      this.childJoins--;
-      if (this.childJoins === 0) {
-        if (this.parent) {
-          this.parent.ackJoin(this);
-        } else {
-          this.onAllChildJoinsComplete();
-        }
-      }
-    }
-    onAllChildJoinsComplete() {
-      this.joinCallback(() => {
-        this.pendingJoinOps.forEach(([view, op]) => {
-          if (!view.isDestroyed()) {
-            op();
-          }
-        });
-        this.pendingJoinOps = [];
-      });
-    }
-    update(diff, events) {
-      if (this.isJoinPending() || this.liveSocket.hasPendingLink() && !dom_default.isPhxSticky(this.el)) {
-        return this.pendingDiffs.push({ diff, events });
-      }
-      this.rendered.mergeDiff(diff);
-      let phxChildrenAdded = false;
-      if (this.rendered.isComponentOnlyDiff(diff)) {
-        this.liveSocket.time("component patch complete", () => {
-          let parentCids = dom_default.findParentCIDs(this.el, this.rendered.componentCIDs(diff));
-          parentCids.forEach((parentCID) => {
-            if (this.componentPatch(this.rendered.getComponent(diff, parentCID), parentCID)) {
-              phxChildrenAdded = true;
-            }
-          });
-        });
-      } else if (!isEmpty(diff)) {
-        this.liveSocket.time("full patch complete", () => {
-          let html = this.renderContainer(diff, "update");
-          let patch = new DOMPatch(this, this.el, this.id, html, null);
-          phxChildrenAdded = this.performPatch(patch, true);
-        });
-      }
-      this.liveSocket.dispatchEvents(events);
-      if (phxChildrenAdded) {
-        this.joinNewChildren();
-      }
-    }
-    renderContainer(diff, kind) {
-      return this.liveSocket.time(`toString diff (${kind})`, () => {
-        let tag = this.el.tagName;
-        let cids = diff ? this.rendered.componentCIDs(diff).concat(this.pruningCIDs) : null;
-        let html = this.rendered.toString(cids);
-        return `<${tag}>${html}</${tag}>`;
-      });
-    }
-    componentPatch(diff, cid) {
-      if (isEmpty(diff))
-        return false;
-      let html = this.rendered.componentToString(cid);
-      let patch = new DOMPatch(this, this.el, this.id, html, cid);
-      let childrenAdded = this.performPatch(patch, true);
-      return childrenAdded;
-    }
-    getHook(el) {
-      return this.viewHooks[ViewHook.elementID(el)];
-    }
-    addHook(el) {
-      if (ViewHook.elementID(el) || !el.getAttribute) {
-        return;
-      }
-      let hookName = el.getAttribute(`data-phx-${PHX_HOOK}`) || el.getAttribute(this.binding(PHX_HOOK));
-      if (hookName && !this.ownsElement(el)) {
-        return;
-      }
-      let callbacks = this.liveSocket.getHookCallbacks(hookName);
-      if (callbacks) {
-        if (!el.id) {
-          logError(`no DOM ID for hook "${hookName}". Hooks require a unique ID on each element.`, el);
-        }
-        let hook = new ViewHook(this, el, callbacks);
-        this.viewHooks[ViewHook.elementID(hook.el)] = hook;
-        return hook;
-      } else if (hookName !== null) {
-        logError(`unknown hook found for "${hookName}"`, el);
-      }
-    }
-    destroyHook(hook) {
-      hook.__destroyed();
-      hook.__cleanup__();
-      delete this.viewHooks[ViewHook.elementID(hook.el)];
-    }
-    applyPendingUpdates() {
-      this.pendingDiffs.forEach(({ diff, events }) => this.update(diff, events));
-      this.pendingDiffs = [];
-    }
-    onChannel(event, cb) {
-      this.liveSocket.onChannel(this.channel, event, (resp) => {
-        if (this.isJoinPending()) {
-          this.root.pendingJoinOps.push([this, () => cb(resp)]);
-        } else {
-          this.liveSocket.requestDOMUpdate(() => cb(resp));
-        }
-      });
-    }
-    bindChannel() {
-      this.liveSocket.onChannel(this.channel, "diff", (rawDiff) => {
-        this.liveSocket.requestDOMUpdate(() => {
-          this.applyDiff("update", rawDiff, ({ diff, events }) => this.update(diff, events));
-        });
-      });
-      this.onChannel("redirect", ({ to, flash }) => this.onRedirect({ to, flash }));
-      this.onChannel("live_patch", (redir) => this.onLivePatch(redir));
-      this.onChannel("live_redirect", (redir) => this.onLiveRedirect(redir));
-      this.channel.onError((reason) => this.onError(reason));
-      this.channel.onClose((reason) => this.onClose(reason));
-    }
-    destroyAllChildren() {
-      for (let id in this.root.children[this.id]) {
-        this.getChildById(id).destroy();
-      }
-    }
-    onLiveRedirect(redir) {
-      let { to, kind, flash } = redir;
-      let url = this.expandURL(to);
-      this.liveSocket.historyRedirect(url, kind, flash);
-    }
-    onLivePatch(redir) {
-      let { to, kind } = redir;
-      this.href = this.expandURL(to);
-      this.liveSocket.historyPatch(to, kind);
-    }
-    expandURL(to) {
-      return to.startsWith("/") ? `${window.location.protocol}//${window.location.host}${to}` : to;
-    }
-    onRedirect({ to, flash }) {
-      this.liveSocket.redirect(to, flash);
-    }
-    isDestroyed() {
-      return this.destroyed;
-    }
-    join(callback) {
-      if (this.isMain()) {
-        this.stopCallback = this.liveSocket.withPageLoading({ to: this.href, kind: "initial" });
-      }
-      this.joinCallback = (onDone) => {
-        onDone = onDone || function() {
-        };
-        callback ? callback(this.joinCount, onDone) : onDone();
-      };
-      this.liveSocket.wrapPush(this, { timeout: false }, () => {
-        return this.channel.join().receive("ok", (data) => {
-          if (!this.isDestroyed()) {
-            this.liveSocket.requestDOMUpdate(() => this.onJoin(data));
-          }
-        }).receive("error", (resp) => !this.isDestroyed() && this.onJoinError(resp)).receive("timeout", () => !this.isDestroyed() && this.onJoinError({ reason: "timeout" }));
-      });
-    }
-    onJoinError(resp) {
-      if (resp.reason === "unauthorized" || resp.reason === "stale") {
-        this.log("error", () => ["unauthorized live_redirect. Falling back to page request", resp]);
-        return this.onRedirect({ to: this.href });
-      }
-      if (resp.redirect || resp.live_redirect) {
-        this.joinPending = false;
-        this.channel.leave();
-      }
-      if (resp.redirect) {
-        return this.onRedirect(resp.redirect);
-      }
-      if (resp.live_redirect) {
-        return this.onLiveRedirect(resp.live_redirect);
-      }
-      this.log("error", () => ["unable to join", resp]);
-      if (this.liveSocket.isConnected()) {
-        this.liveSocket.reloadWithJitter(this);
-      }
-    }
-    onClose(reason) {
-      if (this.isDestroyed()) {
-        return;
-      }
-      if (this.liveSocket.hasPendingLink() && reason !== "leave") {
-        return this.liveSocket.reloadWithJitter(this);
-      }
-      this.destroyAllChildren();
-      this.liveSocket.dropActiveElement(this);
-      if (document.activeElement) {
-        document.activeElement.blur();
-      }
-      if (this.liveSocket.isUnloaded()) {
-        this.showLoader(BEFORE_UNLOAD_LOADER_TIMEOUT);
-      }
-    }
-    onError(reason) {
-      this.onClose(reason);
-      if (this.liveSocket.isConnected()) {
-        this.log("error", () => ["view crashed", reason]);
-      }
-      if (!this.liveSocket.isUnloaded()) {
-        this.displayError();
-      }
-    }
-    displayError() {
-      if (this.isMain()) {
-        dom_default.dispatchEvent(window, "phx:page-loading-start", { detail: { to: this.href, kind: "error" } });
-      }
-      this.showLoader();
-      this.setContainerClasses(PHX_DISCONNECTED_CLASS, PHX_ERROR_CLASS);
-    }
-    pushWithReply(refGenerator, event, payload, onReply = function() {
-    }) {
-      if (!this.isConnected()) {
-        return;
-      }
-      let [ref, [el], opts] = refGenerator ? refGenerator() : [null, [], {}];
-      let onLoadingDone = function() {
-      };
-      if (opts.page_loading || el && el.getAttribute(this.binding(PHX_PAGE_LOADING)) !== null) {
-        onLoadingDone = this.liveSocket.withPageLoading({ kind: "element", target: el });
-      }
-      if (typeof payload.cid !== "number") {
-        delete payload.cid;
-      }
-      return this.liveSocket.wrapPush(this, { timeout: true }, () => {
-        return this.channel.push(event, payload, PUSH_TIMEOUT).receive("ok", (resp) => {
-          if (ref !== null) {
-            this.undoRefs(ref);
-          }
-          let finish = (hookReply) => {
-            if (resp.redirect) {
-              this.onRedirect(resp.redirect);
-            }
-            if (resp.live_patch) {
-              this.onLivePatch(resp.live_patch);
-            }
-            if (resp.live_redirect) {
-              this.onLiveRedirect(resp.live_redirect);
-            }
-            onLoadingDone();
-            onReply(resp, hookReply);
-          };
-          if (resp.diff) {
-            this.liveSocket.requestDOMUpdate(() => {
-              let hookReply = this.applyDiff("update", resp.diff, ({ diff, events }) => {
-                this.update(diff, events);
-              });
-              finish(hookReply);
-            });
-          } else {
-            finish(null);
-          }
-        });
-      });
-    }
-    undoRefs(ref) {
-      dom_default.all(document, `[${PHX_REF_SRC}="${this.id}"][${PHX_REF}="${ref}"]`, (el) => {
-        let disabledVal = el.getAttribute(PHX_DISABLED);
-        el.removeAttribute(PHX_REF);
-        el.removeAttribute(PHX_REF_SRC);
-        if (el.getAttribute(PHX_READONLY) !== null) {
-          el.readOnly = false;
-          el.removeAttribute(PHX_READONLY);
-        }
-        if (disabledVal !== null) {
-          el.disabled = disabledVal === "true" ? true : false;
-          el.removeAttribute(PHX_DISABLED);
-        }
-        PHX_EVENT_CLASSES.forEach((className) => dom_default.removeClass(el, className));
-        let disableRestore = el.getAttribute(PHX_DISABLE_WITH_RESTORE);
-        if (disableRestore !== null) {
-          el.innerText = disableRestore;
-          el.removeAttribute(PHX_DISABLE_WITH_RESTORE);
-        }
-        let toEl = dom_default.private(el, PHX_REF);
-        if (toEl) {
-          let hook = this.triggerBeforeUpdateHook(el, toEl);
-          DOMPatch.patchEl(el, toEl, this.liveSocket.getActiveElement());
-          if (hook) {
-            hook.__updated();
-          }
-          dom_default.deletePrivate(el, PHX_REF);
-        }
-      });
-    }
-    putRef(elements, event, opts = {}) {
-      let newRef = this.ref++;
-      let disableWith = this.binding(PHX_DISABLE_WITH);
-      if (opts.loading) {
-        elements = elements.concat(dom_default.all(document, opts.loading));
-      }
-      elements.forEach((el) => {
-        el.classList.add(`phx-${event}-loading`);
-        el.setAttribute(PHX_REF, newRef);
-        el.setAttribute(PHX_REF_SRC, this.el.id);
-        let disableText = el.getAttribute(disableWith);
-        if (disableText !== null) {
-          if (!el.getAttribute(PHX_DISABLE_WITH_RESTORE)) {
-            el.setAttribute(PHX_DISABLE_WITH_RESTORE, el.innerText);
-          }
-          if (disableText !== "") {
-            el.innerText = disableText;
-          }
-          el.setAttribute("disabled", "");
-        }
-      });
-      return [newRef, elements, opts];
-    }
-    componentID(el) {
-      let cid = el.getAttribute && el.getAttribute(PHX_COMPONENT);
-      return cid ? parseInt(cid) : null;
-    }
-    targetComponentID(target, targetCtx, opts = {}) {
-      if (isCid(targetCtx)) {
-        return targetCtx;
-      }
-      let cidOrSelector = target.getAttribute(this.binding("target"));
-      if (isCid(cidOrSelector)) {
-        return parseInt(cidOrSelector);
-      } else if (targetCtx && (cidOrSelector !== null || opts.target)) {
-        return this.closestComponentID(targetCtx);
-      } else {
-        return null;
-      }
-    }
-    closestComponentID(targetCtx) {
-      if (isCid(targetCtx)) {
-        return targetCtx;
-      } else if (targetCtx) {
-        return maybe(targetCtx.closest(`[${PHX_COMPONENT}]`), (el) => this.ownsElement(el) && this.componentID(el));
-      } else {
-        return null;
-      }
-    }
-    pushHookEvent(targetCtx, event, payload, onReply) {
-      if (!this.isConnected()) {
-        this.log("hook", () => ["unable to push hook event. LiveView not connected", event, payload]);
-        return false;
-      }
-      let [ref, els, opts] = this.putRef([], "hook");
-      this.pushWithReply(() => [ref, els, opts], "event", {
-        type: "hook",
-        event,
-        value: payload,
-        cid: this.closestComponentID(targetCtx)
-      }, (resp, reply) => onReply(reply, ref));
-      return ref;
-    }
-    extractMeta(el, meta, value) {
-      let prefix = this.binding("value-");
-      for (let i = 0; i < el.attributes.length; i++) {
-        if (!meta) {
-          meta = {};
-        }
-        let name = el.attributes[i].name;
-        if (name.startsWith(prefix)) {
-          meta[name.replace(prefix, "")] = el.getAttribute(name);
-        }
-      }
-      if (el.value !== void 0) {
-        if (!meta) {
-          meta = {};
-        }
-        meta.value = el.value;
-        if (el.tagName === "INPUT" && CHECKABLE_INPUTS.indexOf(el.type) >= 0 && !el.checked) {
-          delete meta.value;
-        }
-      }
-      if (value) {
-        if (!meta) {
-          meta = {};
-        }
-        for (let key in value) {
-          meta[key] = value[key];
-        }
-      }
-      return meta;
-    }
-    pushEvent(type, el, targetCtx, phxEvent, meta, opts = {}) {
-      this.pushWithReply(() => this.putRef([el], type, opts), "event", {
-        type,
-        event: phxEvent,
-        value: this.extractMeta(el, meta, opts.value),
-        cid: this.targetComponentID(el, targetCtx, opts)
-      });
-    }
-    pushFileProgress(fileEl, entryRef, progress, onReply = function() {
-    }) {
-      this.liveSocket.withinOwners(fileEl.form, (view, targetCtx) => {
-        view.pushWithReply(null, "progress", {
-          event: fileEl.getAttribute(view.binding(PHX_PROGRESS)),
-          ref: fileEl.getAttribute(PHX_UPLOAD_REF),
-          entry_ref: entryRef,
-          progress,
-          cid: view.targetComponentID(fileEl.form, targetCtx)
-        }, onReply);
-      });
-    }
-    pushInput(inputEl, targetCtx, forceCid, phxEvent, opts, callback) {
-      let uploads;
-      let cid = isCid(forceCid) ? forceCid : this.targetComponentID(inputEl.form, targetCtx);
-      let refGenerator = () => this.putRef([inputEl, inputEl.form], "change", opts);
-      let formData;
-      if (inputEl.getAttribute(this.binding("change"))) {
-        formData = serializeForm(inputEl.form, { _target: opts._target }, [inputEl.name]);
-      } else {
-        formData = serializeForm(inputEl.form, { _target: opts._target });
-      }
-      if (dom_default.isUploadInput(inputEl) && inputEl.files && inputEl.files.length > 0) {
-        LiveUploader.trackFiles(inputEl, Array.from(inputEl.files));
-      }
-      uploads = LiveUploader.serializeUploads(inputEl);
-      let event = {
-        type: "form",
-        event: phxEvent,
-        value: formData,
-        uploads,
-        cid
-      };
-      this.pushWithReply(refGenerator, "event", event, (resp) => {
-        dom_default.showError(inputEl, this.liveSocket.binding(PHX_FEEDBACK_FOR));
-        if (dom_default.isUploadInput(inputEl) && inputEl.getAttribute("data-phx-auto-upload") !== null) {
-          if (LiveUploader.filesAwaitingPreflight(inputEl).length > 0) {
-            let [ref, _els] = refGenerator();
-            this.uploadFiles(inputEl.form, targetCtx, ref, cid, (_uploads) => {
-              callback && callback(resp);
-              this.triggerAwaitingSubmit(inputEl.form);
-            });
-          }
-        } else {
-          callback && callback(resp);
-        }
-      });
-    }
-    triggerAwaitingSubmit(formEl) {
-      let awaitingSubmit = this.getScheduledSubmit(formEl);
-      if (awaitingSubmit) {
-        let [_el, _ref, _opts, callback] = awaitingSubmit;
-        this.cancelSubmit(formEl);
-        callback();
-      }
-    }
-    getScheduledSubmit(formEl) {
-      return this.formSubmits.find(([el, _ref, _opts, _callback]) => el.isSameNode(formEl));
-    }
-    scheduleSubmit(formEl, ref, opts, callback) {
-      if (this.getScheduledSubmit(formEl)) {
-        return true;
-      }
-      this.formSubmits.push([formEl, ref, opts, callback]);
-    }
-    cancelSubmit(formEl) {
-      this.formSubmits = this.formSubmits.filter(([el, ref, _callback]) => {
-        if (el.isSameNode(formEl)) {
-          this.undoRefs(ref);
-          return false;
-        } else {
-          return true;
-        }
-      });
-    }
-    pushFormSubmit(formEl, targetCtx, phxEvent, opts, onReply) {
-      let filterIgnored = (el) => {
-        let userIgnored = closestPhxBinding(el, `${this.binding(PHX_UPDATE)}=ignore`, el.form);
-        return !(userIgnored || closestPhxBinding(el, "data-phx-update=ignore", el.form));
-      };
-      let filterDisables = (el) => {
-        return el.hasAttribute(this.binding(PHX_DISABLE_WITH));
-      };
-      let filterButton = (el) => el.tagName == "BUTTON";
-      let filterInput = (el) => ["INPUT", "TEXTAREA", "SELECT"].includes(el.tagName);
-      let refGenerator = () => {
-        let formElements = Array.from(formEl.elements);
-        let disables = formElements.filter(filterDisables);
-        let buttons = formElements.filter(filterButton).filter(filterIgnored);
-        let inputs = formElements.filter(filterInput).filter(filterIgnored);
-        buttons.forEach((button) => {
-          button.setAttribute(PHX_DISABLED, button.disabled);
-          button.disabled = true;
-        });
-        inputs.forEach((input) => {
-          input.setAttribute(PHX_READONLY, input.readOnly);
-          input.readOnly = true;
-          if (input.files) {
-            input.setAttribute(PHX_DISABLED, input.disabled);
-            input.disabled = true;
-          }
-        });
-        formEl.setAttribute(this.binding(PHX_PAGE_LOADING), "");
-        return this.putRef([formEl].concat(disables).concat(buttons).concat(inputs), "submit", opts);
-      };
-      let cid = this.targetComponentID(formEl, targetCtx);
-      if (LiveUploader.hasUploadsInProgress(formEl)) {
-        let [ref, _els] = refGenerator();
-        let push = () => this.pushFormSubmit(formEl, targetCtx, phxEvent, opts, onReply);
-        return this.scheduleSubmit(formEl, ref, opts, push);
-      } else if (LiveUploader.inputsAwaitingPreflight(formEl).length > 0) {
-        let [ref, els] = refGenerator();
-        let proxyRefGen = () => [ref, els, opts];
-        this.uploadFiles(formEl, targetCtx, ref, cid, (_uploads) => {
-          let formData = serializeForm(formEl, {});
-          this.pushWithReply(proxyRefGen, "event", {
-            type: "form",
-            event: phxEvent,
-            value: formData,
-            cid
-          }, onReply);
-        });
-      } else {
-        let formData = serializeForm(formEl, {});
-        this.pushWithReply(refGenerator, "event", {
-          type: "form",
-          event: phxEvent,
-          value: formData,
-          cid
-        }, onReply);
-      }
-    }
-    uploadFiles(formEl, targetCtx, ref, cid, onComplete) {
-      let joinCountAtUpload = this.joinCount;
-      let inputEls = LiveUploader.activeFileInputs(formEl);
-      let numFileInputsInProgress = inputEls.length;
-      inputEls.forEach((inputEl) => {
-        let uploader = new LiveUploader(inputEl, this, () => {
-          numFileInputsInProgress--;
-          if (numFileInputsInProgress === 0) {
-            onComplete();
-          }
-        });
-        this.uploaders[inputEl] = uploader;
-        let entries = uploader.entries().map((entry) => entry.toPreflightPayload());
-        let payload = {
-          ref: inputEl.getAttribute(PHX_UPLOAD_REF),
-          entries,
-          cid: this.targetComponentID(inputEl.form, targetCtx)
-        };
-        this.log("upload", () => ["sending preflight request", payload]);
-        this.pushWithReply(null, "allow_upload", payload, (resp) => {
-          this.log("upload", () => ["got preflight response", resp]);
-          if (resp.error) {
-            this.undoRefs(ref);
-            let [entry_ref, reason] = resp.error;
-            this.log("upload", () => [`error for entry ${entry_ref}`, reason]);
-          } else {
-            let onError = (callback) => {
-              this.channel.onError(() => {
-                if (this.joinCount === joinCountAtUpload) {
-                  callback();
-                }
-              });
-            };
-            uploader.initAdapterUpload(resp, onError, this.liveSocket);
-          }
-        });
-      });
-    }
-    dispatchUploads(name, filesOrBlobs) {
-      let inputs = dom_default.findUploadInputs(this.el).filter((el) => el.name === name);
-      if (inputs.length === 0) {
-        logError(`no live file inputs found matching the name "${name}"`);
-      } else if (inputs.length > 1) {
-        logError(`duplicate live file inputs found matching the name "${name}"`);
-      } else {
-        dom_default.dispatchEvent(inputs[0], PHX_TRACK_UPLOADS, { detail: { files: filesOrBlobs } });
-      }
-    }
-    pushFormRecovery(form, newCid, callback) {
-      this.liveSocket.withinOwners(form, (view, targetCtx) => {
-        let input = form.elements[0];
-        let phxEvent = form.getAttribute(this.binding(PHX_AUTO_RECOVER)) || form.getAttribute(this.binding("change"));
-        js_default.exec("change", phxEvent, view, input, ["push", { _target: input.name, newCid, callback }]);
-      });
-    }
-    pushLinkPatch(href, targetEl, callback) {
-      let linkRef = this.liveSocket.setPendingLink(href);
-      let refGen = targetEl ? () => this.putRef([targetEl], "click") : null;
-      let fallback = () => this.liveSocket.redirect(window.location.href);
-      let push = this.pushWithReply(refGen, "live_patch", { url: href }, (resp) => {
-        this.liveSocket.requestDOMUpdate(() => {
-          if (resp.link_redirect) {
-            this.liveSocket.replaceMain(href, null, callback, linkRef);
-          } else {
-            if (this.liveSocket.commitPendingLink(linkRef)) {
-              this.href = href;
-            }
-            this.applyPendingUpdates();
-            callback && callback(linkRef);
-          }
-        });
-      });
-      if (push) {
-        push.receive("timeout", fallback);
-      } else {
-        fallback();
-      }
-    }
-    formsForRecovery(html) {
-      if (this.joinCount === 0) {
-        return [];
-      }
-      let phxChange = this.binding("change");
-      let template = document.createElement("template");
-      template.innerHTML = html;
-      return dom_default.all(this.el, `form[${phxChange}]`).filter((form) => form.id && this.ownsElement(form)).filter((form) => form.elements.length > 0).filter((form) => form.getAttribute(this.binding(PHX_AUTO_RECOVER)) !== "ignore").map((form) => {
-        let newForm = template.content.querySelector(`form[id="${form.id}"][${phxChange}="${form.getAttribute(phxChange)}"]`);
-        if (newForm) {
-          return [form, newForm, this.targetComponentID(newForm)];
-        } else {
-          return [form, null, null];
-        }
-      }).filter(([form, newForm, newCid]) => newForm);
-    }
-    maybePushComponentsDestroyed(destroyedCIDs) {
-      let willDestroyCIDs = destroyedCIDs.filter((cid) => {
-        return dom_default.findComponentNodeList(this.el, cid).length === 0;
-      });
-      if (willDestroyCIDs.length > 0) {
-        this.pruningCIDs.push(...willDestroyCIDs);
-        this.pushWithReply(null, "cids_will_destroy", { cids: willDestroyCIDs }, () => {
-          this.pruningCIDs = this.pruningCIDs.filter((cid) => willDestroyCIDs.indexOf(cid) !== -1);
-          let completelyDestroyCIDs = willDestroyCIDs.filter((cid) => {
-            return dom_default.findComponentNodeList(this.el, cid).length === 0;
-          });
-          if (completelyDestroyCIDs.length > 0) {
-            this.pushWithReply(null, "cids_destroyed", { cids: completelyDestroyCIDs }, (resp) => {
-              this.rendered.pruneCIDs(resp.cids);
-            });
-          }
-        });
-      }
-    }
-    ownsElement(el) {
-      return el.getAttribute(PHX_PARENT_ID) === this.id || maybe(el.closest(PHX_VIEW_SELECTOR), (node) => node.id) === this.id;
-    }
-    submitForm(form, targetCtx, phxEvent, opts = {}) {
-      dom_default.putPrivate(form, PHX_HAS_SUBMITTED, true);
-      let phxFeedback = this.liveSocket.binding(PHX_FEEDBACK_FOR);
-      let inputs = Array.from(form.elements);
-      this.liveSocket.blurActiveElement(this);
-      this.pushFormSubmit(form, targetCtx, phxEvent, opts, () => {
-        inputs.forEach((input) => dom_default.showError(input, phxFeedback));
-        this.liveSocket.restorePreviouslyActiveFocus();
-      });
-    }
-    binding(kind) {
-      return this.liveSocket.binding(kind);
-    }
-  };
-  var LiveSocket = class {
-    constructor(url, phxSocket, opts = {}) {
-      this.unloaded = false;
-      if (!phxSocket || phxSocket.constructor.name === "Object") {
-        throw new Error(`
+`,o.innerHTML.trim()),I.replaceWith(this.createSpan(I.nodeValue,e)),[!0,x]):(I.remove(),[C,x]),[!1,!1]);return!g&&!v?(We(`expected at least one HTML element tag inside a component, but the component is empty:
+`,o.innerHTML.trim()),this.createSpan("",e).outerHTML):(!g&&v&&We("expected at least one HTML element tag directly inside a component, but only subcomponents were found. A component must render at least one HTML tag directly inside itself.",o.innerHTML.trim()),o.innerHTML)}createSpan(t,e){let i=document.createElement("span");return i.innerText=t,i.setAttribute(ot,e),i}},zg=1,Wn=class{static makeID(){return zg++}static elementID(t){return t.phxHookId}constructor(t,e,i){this.__view=t,this.liveSocket=t.liveSocket,this.__callbacks=i,this.__listeners=new Set,this.__isDisconnected=!1,this.el=e,this.el.phxHookId=this.constructor.makeID();for(let s in this.__callbacks)this[s]=this.__callbacks[s]}__mounted(){this.mounted&&this.mounted()}__updated(){this.updated&&this.updated()}__beforeUpdate(){this.beforeUpdate&&this.beforeUpdate()}__destroyed(){this.destroyed&&this.destroyed()}__reconnected(){this.__isDisconnected&&(this.__isDisconnected=!1,this.reconnected&&this.reconnected())}__disconnected(){this.__isDisconnected=!0,this.disconnected&&this.disconnected()}pushEvent(t,e={},i=function(){}){return this.__view.pushHookEvent(null,t,e,i)}pushEventTo(t,e,i={},s=function(){}){return this.__view.withinTargets(t,(o,c)=>o.pushHookEvent(c,e,i,s))}handleEvent(t,e){let i=(s,o)=>o?t:e(s.detail);return window.addEventListener(`phx:${t}`,i),this.__listeners.add(i),i}removeHandleEvent(t){let e=t(null,!0);window.removeEventListener(`phx:${e}`,t),this.__listeners.delete(t)}upload(t,e){return this.__view.dispatchUploads(t,e)}uploadTo(t,e,i){return this.__view.withinTargets(t,s=>s.dispatchUploads(e,i))}__cleanup__(){this.__listeners.forEach(t=>this.removeHandleEvent(t))}},Kg={exec(t,e,i,s,o){let[c,d]=o||[null,{}];(e.charAt(0)==="["?JSON.parse(e):[[c,d]]).forEach(([v,C])=>{v===c&&d.data&&(C.data=Object.assign(C.data||{},d.data)),this.filterToEls(s,C).forEach(x=>{this[`exec_${v}`](t,e,i,s,x,C)})})},isVisible(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length>0)},exec_dispatch(t,e,i,s,o,{to:c,event:d,detail:g,bubbles:v}){g=g||{},g.dispatcher=s,j.dispatchEvent(o,d,{detail:g,bubbles:v})},exec_push(t,e,i,s,o,c){if(!i.isConnected())return;let{event:d,data:g,target:v,page_loading:C,loading:x,value:I,dispatcher:D}=c,S={loading:x,value:I,target:v,page_loading:!!C},N=t==="change"&&D?D:s,A=v||N.getAttribute(i.binding("target"))||N;i.withinTargets(A,(_,R)=>{if(t==="change"){let{newCid:F,_target:T,callback:H}=c;T=T||(s instanceof HTMLInputElement?s.name:void 0),T&&(S._target=T),_.pushInput(s,R,F,d||e,S,H)}else t==="submit"?_.submitForm(s,R,d||e,S):_.pushEvent(t,s,R,d||e,g,S)})},exec_add_class(t,e,i,s,o,{names:c,transition:d,time:g}){this.addOrRemoveClasses(o,c,[],d,g,i)},exec_remove_class(t,e,i,s,o,{names:c,transition:d,time:g}){this.addOrRemoveClasses(o,[],c,d,g,i)},exec_transition(t,e,i,s,o,{time:c,transition:d}){let[g,v,C]=d,x=()=>this.addOrRemoveClasses(o,g.concat(v),[]),I=()=>this.addOrRemoveClasses(o,C,g.concat(v));i.transition(c,x,I)},exec_toggle(t,e,i,s,o,{display:c,ins:d,outs:g,time:v}){this.toggle(t,i,o,c,d,g,v)},exec_show(t,e,i,s,o,{display:c,transition:d,time:g}){this.show(t,i,o,c,d,g)},exec_hide(t,e,i,s,o,{display:c,transition:d,time:g}){this.hide(t,i,o,c,d,g)},exec_set_attr(t,e,i,s,o,{attr:[c,d]}){this.setOrRemoveAttrs(o,[[c,d]],[])},exec_remove_attr(t,e,i,s,o,{attr:c}){this.setOrRemoveAttrs(o,[],[c])},show(t,e,i,s,o,c){this.isVisible(i)||this.toggle(t,e,i,s,o,null,c)},hide(t,e,i,s,o,c){this.isVisible(i)&&this.toggle(t,e,i,s,null,o,c)},toggle(t,e,i,s,o,c,d){let[g,v,C]=o||[[],[],[]],[x,I,D]=c||[[],[],[]];if(g.length>0||x.length>0)if(this.isVisible(i)){let S=()=>{this.addOrRemoveClasses(i,I,g.concat(v).concat(C)),window.requestAnimationFrame(()=>{this.addOrRemoveClasses(i,x,[]),window.requestAnimationFrame(()=>this.addOrRemoveClasses(i,D,I))})};i.dispatchEvent(new Event("phx:hide-start")),e.transition(d,S,()=>{this.addOrRemoveClasses(i,[],x.concat(D)),j.putSticky(i,"toggle",N=>N.style.display="none"),i.dispatchEvent(new Event("phx:hide-end"))})}else{if(t==="remove")return;let S=()=>{this.addOrRemoveClasses(i,v,x.concat(I).concat(D)),j.putSticky(i,"toggle",N=>N.style.display=s||"block"),window.requestAnimationFrame(()=>{this.addOrRemoveClasses(i,g,[]),window.requestAnimationFrame(()=>this.addOrRemoveClasses(i,C,v))})};i.dispatchEvent(new Event("phx:show-start")),e.transition(d,S,()=>{this.addOrRemoveClasses(i,[],g.concat(C)),i.dispatchEvent(new Event("phx:show-end"))})}else this.isVisible(i)?window.requestAnimationFrame(()=>{i.dispatchEvent(new Event("phx:hide-start")),j.putSticky(i,"toggle",S=>S.style.display="none"),i.dispatchEvent(new Event("phx:hide-end"))}):window.requestAnimationFrame(()=>{i.dispatchEvent(new Event("phx:show-start")),j.putSticky(i,"toggle",S=>S.style.display=s||"block"),i.dispatchEvent(new Event("phx:show-end"))})},addOrRemoveClasses(t,e,i,s,o,c){let[d,g,v]=s||[[],[],[]];if(d.length>0){let C=()=>this.addOrRemoveClasses(t,g.concat(d),[]),x=()=>this.addOrRemoveClasses(t,e.concat(v),i.concat(d).concat(g));return c.transition(o,C,x)}window.requestAnimationFrame(()=>{let[C,x]=j.getSticky(t,"classes",[[],[]]),I=e.filter(A=>C.indexOf(A)<0&&!t.classList.contains(A)),D=i.filter(A=>x.indexOf(A)<0&&t.classList.contains(A)),S=C.filter(A=>i.indexOf(A)<0).concat(I),N=x.filter(A=>e.indexOf(A)<0).concat(D);j.putSticky(t,"classes",A=>(A.classList.remove(...N),A.classList.add(...S),[S,N]))})},setOrRemoveAttrs(t,e,i){let[s,o]=j.getSticky(t,"attrs",[[],[]]),c=e.map(([v,C])=>v).concat(i),d=s.filter(([v,C])=>!c.includes(v)).concat(e),g=o.filter(v=>!c.includes(v)).concat(i);j.putSticky(t,"attrs",v=>(g.forEach(C=>v.removeAttribute(C)),d.forEach(([C,x])=>v.setAttribute(C,x)),[d,g]))},hasAllClasses(t,e){return e.every(i=>t.classList.contains(i))},isToggledOut(t,e){return!this.isVisible(t)||this.hasAllClasses(t,e)},filterToEls(t,{to:e}){return e?j.all(document,e):[t]}},Nt=Kg,Gr=(t,e,i=[])=>{let s=new FormData(t),o=[];s.forEach((d,g,v)=>{d instanceof File&&o.push(g)}),o.forEach(d=>s.delete(d));let c=new URLSearchParams;for(let[d,g]of s.entries())(i.length===0||i.indexOf(d)>=0)&&c.append(d,g);for(let d in e)c.append(d,e[d]);return c.toString()},cu=class{constructor(t,e,i,s){this.liveSocket=e,this.flash=s,this.parent=i,this.root=i?i.root:this,this.el=t,this.id=this.el.id,this.ref=0,this.childJoins=0,this.loaderTimer=null,this.pendingDiffs=[],this.pruningCIDs=[],this.redirect=!1,this.href=null,this.joinCount=this.parent?this.parent.joinCount-1:0,this.joinPending=!0,this.destroyed=!1,this.joinCallback=function(o){o&&o()},this.stopCallback=function(){},this.pendingJoinOps=this.parent?null:[],this.viewHooks={},this.uploaders={},this.formSubmits=[],this.children=this.parent?null:{},this.root.children[this.id]={},this.channel=this.liveSocket.channel(`lv:${this.id}`,()=>({redirect:this.redirect?this.href:void 0,url:this.redirect?void 0:this.href||void 0,params:this.connectParams(),session:this.getSession(),static:this.getStatic(),flash:this.flash})),this.showLoader(this.liveSocket.loaderTimeout),this.bindChannel()}setHref(t){this.href=t}setRedirect(t){this.redirect=!0,this.href=t}isMain(){return this.el.hasAttribute(Do)}connectParams(){let t=this.liveSocket.params(this.el),e=j.all(document,`[${this.binding(lg)}]`).map(i=>i.src||i.href).filter(i=>typeof i=="string");return e.length>0&&(t._track_static=e),t._mounts=this.joinCount,t}isConnected(){return this.channel.canPush()}getSession(){return this.el.getAttribute(li)}getStatic(){let t=this.el.getAttribute(qn);return t===""?null:t}destroy(t=function(){}){this.destroyAllChildren(),this.destroyed=!0,delete this.root.children[this.id],this.parent&&delete this.root.children[this.parent.id][this.id],clearTimeout(this.loaderTimer);let e=()=>{t();for(let i in this.viewHooks)this.destroyHook(this.viewHooks[i])};j.markPhxChildDestroyed(this.el),this.log("destroyed",()=>["the child has been removed from the parent"]),this.channel.leave().receive("ok",e).receive("error",e).receive("timeout",e)}setContainerClasses(...t){this.el.classList.remove(jl,mo,Ul),this.el.classList.add(...t)}showLoader(t){if(clearTimeout(this.loaderTimer),t)this.loaderTimer=setTimeout(()=>this.showLoader(),t);else{for(let e in this.viewHooks)this.viewHooks[e].__disconnected();this.setContainerClasses(mo)}}hideLoader(){clearTimeout(this.loaderTimer),this.setContainerClasses(jl)}triggerReconnected(){for(let t in this.viewHooks)this.viewHooks[t].__reconnected()}log(t,e){this.liveSocket.log(this,t,e)}transition(t,e,i=function(){}){this.liveSocket.transition(t,e,i)}withinTargets(t,e){if(t instanceof HTMLElement||t instanceof SVGElement)return this.liveSocket.owner(t,i=>e(i,t));if(ai(t))j.findComponentNodeList(this.el,t).length===0?We(`no component found matching phx-target of ${t}`):e(this,parseInt(t));else{let i=Array.from(document.querySelectorAll(t));i.length===0&&We(`nothing found matching the phx-target selector "${t}"`),i.forEach(s=>this.liveSocket.owner(s,o=>e(o,s)))}}applyDiff(t,e,i){this.log(t,()=>["",Jr(e)]);let{diff:s,reply:o,events:c,title:d}=iu.extract(e);return d&&j.putTitle(d),i({diff:s,reply:o,events:c}),o}onJoin(t){let{rendered:e,container:i}=t;if(i){let[s,o]=i;this.el=j.replaceRootContainer(this.el,s,o)}this.childJoins=0,this.joinPending=!0,this.flash=null,oi.dropLocal(this.liveSocket.localStorage,window.location.pathname,nu),this.applyDiff("mount",e,({diff:s,events:o})=>{this.rendered=new iu(this.id,s);let c=this.renderContainer(null,"join");this.dropPendingRefs();let d=this.formsForRecovery(c);this.joinCount++,d.length>0?d.forEach(([g,v,C],x)=>{this.pushFormRecovery(g,C,I=>{x===d.length-1&&this.onJoinComplete(I,c,o)})}):this.onJoinComplete(t,c,o)})}dropPendingRefs(){j.all(document,`[${Li}="${this.id}"][${Pt}]`,t=>{t.removeAttribute(Pt),t.removeAttribute(Li)})}onJoinComplete({live_patch:t},e,i){if(this.joinCount>1||this.parent&&!this.parent.isJoinPending())return this.applyJoinPatch(t,e,i);j.findPhxChildrenInFragment(e,this.id).filter(o=>{let c=o.id&&this.el.querySelector(`[id="${o.id}"]`),d=c&&c.getAttribute(qn);return d&&o.setAttribute(qn,d),this.joinChild(o)}).length===0?this.parent?(this.root.pendingJoinOps.push([this,()=>this.applyJoinPatch(t,e,i)]),this.parent.ackJoin(this)):(this.onAllChildJoinsComplete(),this.applyJoinPatch(t,e,i)):this.root.pendingJoinOps.push([this,()=>this.applyJoinPatch(t,e,i)])}attachTrueDocEl(){this.el=j.byId(this.id),this.el.setAttribute(Kn,this.root.id)}applyJoinPatch(t,e,i){this.attachTrueDocEl();let s=new Yr(this,this.el,this.id,e,null);if(s.markPrunableContentForRemoval(),this.performPatch(s,!1),this.joinNewChildren(),j.all(this.el,`[${this.binding(jn)}], [data-phx-${jn}]`,o=>{let c=this.addHook(o);c&&c.__mounted()}),this.joinPending=!1,this.liveSocket.dispatchEvents(i),this.applyPendingUpdates(),t){let{kind:o,to:c}=t;this.liveSocket.historyPatch(c,o)}this.hideLoader(),this.joinCount>1&&this.triggerReconnected(),this.stopCallback()}triggerBeforeUpdateHook(t,e){this.liveSocket.triggerDOM("onBeforeElUpdated",[t,e]);let i=this.getHook(t),s=i&&j.isIgnored(t,this.binding(ko));if(i&&!t.isEqualNode(e)&&!(s&&Cg(t.dataset,e.dataset)))return i.__beforeUpdate(),i}performPatch(t,e){let i=[],s=!1,o=new Set;return t.after("added",c=>{this.liveSocket.triggerDOM("onNodeAdded",[c]);let d=this.addHook(c);d&&d.__mounted()}),t.after("phxChildAdded",c=>{j.isPhxSticky(c)?this.liveSocket.joinRootViews():s=!0}),t.before("updated",(c,d)=>{this.triggerBeforeUpdateHook(c,d)&&o.add(c.id)}),t.after("updated",c=>{o.has(c.id)&&this.getHook(c).__updated()}),t.after("discarded",c=>{c.nodeType===Node.ELEMENT_NODE&&i.push(c)}),t.after("transitionsDiscarded",c=>this.afterElementsRemoved(c,e)),t.perform(),this.afterElementsRemoved(i,e),s}afterElementsRemoved(t,e){let i=[];t.forEach(s=>{let o=j.all(s,`[${ot}]`),c=j.all(s,`[${this.binding(jn)}]`);o.concat(s).forEach(d=>{let g=this.componentID(d);ai(g)&&i.indexOf(g)===-1&&i.push(g)}),c.concat(s).forEach(d=>{let g=this.getHook(d);g&&this.destroyHook(g)})}),e&&this.maybePushComponentsDestroyed(i)}joinNewChildren(){j.findPhxChildren(this.el,this.id).forEach(t=>this.joinChild(t))}getChildById(t){return this.root.children[this.id][t]}getDescendentByEl(t){return t.id===this.id?this:this.children[t.getAttribute(on)][t.id]}destroyDescendent(t){for(let e in this.root.children)for(let i in this.root.children[e])if(i===t)return this.root.children[e][i].destroy()}joinChild(t){if(!this.getChildById(t.id)){let i=new cu(t,this.liveSocket,this);return this.root.children[this.id][i.id]=i,i.join(),this.childJoins++,!0}}isJoinPending(){return this.joinPending}ackJoin(t){this.childJoins--,this.childJoins===0&&(this.parent?this.parent.ackJoin(this):this.onAllChildJoinsComplete())}onAllChildJoinsComplete(){this.joinCallback(()=>{this.pendingJoinOps.forEach(([t,e])=>{t.isDestroyed()||e()}),this.pendingJoinOps=[]})}update(t,e){if(this.isJoinPending()||this.liveSocket.hasPendingLink()&&!j.isPhxSticky(this.el))return this.pendingDiffs.push({diff:t,events:e});this.rendered.mergeDiff(t);let i=!1;this.rendered.isComponentOnlyDiff(t)?this.liveSocket.time("component patch complete",()=>{j.findParentCIDs(this.el,this.rendered.componentCIDs(t)).forEach(o=>{this.componentPatch(this.rendered.getComponent(t,o),o)&&(i=!0)})}):Gl(t)||this.liveSocket.time("full patch complete",()=>{let s=this.renderContainer(t,"update"),o=new Yr(this,this.el,this.id,s,null);i=this.performPatch(o,!0)}),this.liveSocket.dispatchEvents(e),i&&this.joinNewChildren()}renderContainer(t,e){return this.liveSocket.time(`toString diff (${e})`,()=>{let i=this.el.tagName,s=t?this.rendered.componentCIDs(t).concat(this.pruningCIDs):null,o=this.rendered.toString(s);return`<${i}>${o}</${i}>`})}componentPatch(t,e){if(Gl(t))return!1;let i=this.rendered.componentToString(e),s=new Yr(this,this.el,this.id,i,e);return this.performPatch(s,!0)}getHook(t){return this.viewHooks[Wn.elementID(t)]}addHook(t){if(Wn.elementID(t)||!t.getAttribute)return;let e=t.getAttribute(`data-phx-${jn}`)||t.getAttribute(this.binding(jn));if(e&&!this.ownsElement(t))return;let i=this.liveSocket.getHookCallbacks(e);if(i){t.id||We(`no DOM ID for hook "${e}". Hooks require a unique ID on each element.`,t);let s=new Wn(this,t,i);return this.viewHooks[Wn.elementID(s.el)]=s,s}else e!==null&&We(`unknown hook found for "${e}"`,t)}destroyHook(t){t.__destroyed(),t.__cleanup__(),delete this.viewHooks[Wn.elementID(t.el)]}applyPendingUpdates(){this.pendingDiffs.forEach(({diff:t,events:e})=>this.update(t,e)),this.pendingDiffs=[]}onChannel(t,e){this.liveSocket.onChannel(this.channel,t,i=>{this.isJoinPending()?this.root.pendingJoinOps.push([this,()=>e(i)]):this.liveSocket.requestDOMUpdate(()=>e(i))})}bindChannel(){this.liveSocket.onChannel(this.channel,"diff",t=>{this.liveSocket.requestDOMUpdate(()=>{this.applyDiff("update",t,({diff:e,events:i})=>this.update(e,i))})}),this.onChannel("redirect",({to:t,flash:e})=>this.onRedirect({to:t,flash:e})),this.onChannel("live_patch",t=>this.onLivePatch(t)),this.onChannel("live_redirect",t=>this.onLiveRedirect(t)),this.channel.onError(t=>this.onError(t)),this.channel.onClose(t=>this.onClose(t))}destroyAllChildren(){for(let t in this.root.children[this.id])this.getChildById(t).destroy()}onLiveRedirect(t){let{to:e,kind:i,flash:s}=t,o=this.expandURL(e);this.liveSocket.historyRedirect(o,i,s)}onLivePatch(t){let{to:e,kind:i}=t;this.href=this.expandURL(e),this.liveSocket.historyPatch(e,i)}expandURL(t){return t.startsWith("/")?`${window.location.protocol}//${window.location.host}${t}`:t}onRedirect({to:t,flash:e}){this.liveSocket.redirect(t,e)}isDestroyed(){return this.destroyed}join(t){this.isMain()&&(this.stopCallback=this.liveSocket.withPageLoading({to:this.href,kind:"initial"})),this.joinCallback=e=>{e=e||function(){},t?t(this.joinCount,e):e()},this.liveSocket.wrapPush(this,{timeout:!1},()=>this.channel.join().receive("ok",e=>{this.isDestroyed()||this.liveSocket.requestDOMUpdate(()=>this.onJoin(e))}).receive("error",e=>!this.isDestroyed()&&this.onJoinError(e)).receive("timeout",()=>!this.isDestroyed()&&this.onJoinError({reason:"timeout"})))}onJoinError(t){if(t.reason==="unauthorized"||t.reason==="stale")return this.log("error",()=>["unauthorized live_redirect. Falling back to page request",t]),this.onRedirect({to:this.href});if((t.redirect||t.live_redirect)&&(this.joinPending=!1,this.channel.leave()),t.redirect)return this.onRedirect(t.redirect);if(t.live_redirect)return this.onLiveRedirect(t.live_redirect);this.log("error",()=>["unable to join",t]),this.liveSocket.isConnected()&&this.liveSocket.reloadWithJitter(this)}onClose(t){if(!this.isDestroyed()){if(this.liveSocket.hasPendingLink()&&t!=="leave")return this.liveSocket.reloadWithJitter(this);this.destroyAllChildren(),this.liveSocket.dropActiveElement(this),document.activeElement&&document.activeElement.blur(),this.liveSocket.isUnloaded()&&this.showLoader(bg)}}onError(t){this.onClose(t),this.liveSocket.isConnected()&&this.log("error",()=>["view crashed",t]),this.liveSocket.isUnloaded()||this.displayError()}displayError(){this.isMain()&&j.dispatchEvent(window,"phx:page-loading-start",{detail:{to:this.href,kind:"error"}}),this.showLoader(),this.setContainerClasses(mo,Ul)}pushWithReply(t,e,i,s=function(){}){if(!this.isConnected())return;let[o,[c],d]=t?t():[null,[],{}],g=function(){};return(d.page_loading||c&&c.getAttribute(this.binding(Fl))!==null)&&(g=this.liveSocket.withPageLoading({kind:"element",target:c})),typeof i.cid!="number"&&delete i.cid,this.liveSocket.wrapPush(this,{timeout:!0},()=>this.channel.push(e,i,_g).receive("ok",v=>{o!==null&&this.undoRefs(o);let C=x=>{v.redirect&&this.onRedirect(v.redirect),v.live_patch&&this.onLivePatch(v.live_patch),v.live_redirect&&this.onLiveRedirect(v.live_redirect),g(),s(v,x)};v.diff?this.liveSocket.requestDOMUpdate(()=>{let x=this.applyDiff("update",v.diff,({diff:I,events:D})=>{this.update(I,D)});C(x)}):C(null)}))}undoRefs(t){j.all(document,`[${Li}="${this.id}"][${Pt}="${t}"]`,e=>{let i=e.getAttribute(Vr);e.removeAttribute(Pt),e.removeAttribute(Li),e.getAttribute(vo)!==null&&(e.readOnly=!1,e.removeAttribute(vo)),i!==null&&(e.disabled=i==="true",e.removeAttribute(Vr)),ru.forEach(c=>j.removeClass(e,c));let s=e.getAttribute(Wr);s!==null&&(e.innerText=s,e.removeAttribute(Wr));let o=j.private(e,Pt);if(o){let c=this.triggerBeforeUpdateHook(e,o);Yr.patchEl(e,o,this.liveSocket.getActiveElement()),c&&c.__updated(),j.deletePrivate(e,Pt)}})}putRef(t,e,i={}){let s=this.ref++,o=this.binding(So);return i.loading&&(t=t.concat(j.all(document,i.loading))),t.forEach(c=>{c.classList.add(`phx-${e}-loading`),c.setAttribute(Pt,s),c.setAttribute(Li,this.el.id);let d=c.getAttribute(o);d!==null&&(c.getAttribute(Wr)||c.setAttribute(Wr,c.innerText),d!==""&&(c.innerText=d),c.setAttribute("disabled",""))}),[s,t,i]}componentID(t){let e=t.getAttribute&&t.getAttribute(ot);return e?parseInt(e):null}targetComponentID(t,e,i={}){if(ai(e))return e;let s=t.getAttribute(this.binding("target"));return ai(s)?parseInt(s):e&&(s!==null||i.target)?this.closestComponentID(e):null}closestComponentID(t){return ai(t)?t:t?qt(t.closest(`[${ot}]`),e=>this.ownsElement(e)&&this.componentID(e)):null}pushHookEvent(t,e,i,s){if(!this.isConnected())return this.log("hook",()=>["unable to push hook event. LiveView not connected",e,i]),!1;let[o,c,d]=this.putRef([],"hook");return this.pushWithReply(()=>[o,c,d],"event",{type:"hook",event:e,value:i,cid:this.closestComponentID(t)},(g,v)=>s(v,o)),o}extractMeta(t,e,i){let s=this.binding("value-");for(let o=0;o<t.attributes.length;o++){e||(e={});let c=t.attributes[o].name;c.startsWith(s)&&(e[c.replace(s,"")]=t.getAttribute(c))}if(t.value!==void 0&&(e||(e={}),e.value=t.value,t.tagName==="INPUT"&&au.indexOf(t.type)>=0&&!t.checked&&delete e.value),i){e||(e={});for(let o in i)e[o]=i[o]}return e}pushEvent(t,e,i,s,o,c={}){this.pushWithReply(()=>this.putRef([e],t,c),"event",{type:t,event:s,value:this.extractMeta(e,o,c.value),cid:this.targetComponentID(e,i,c)})}pushFileProgress(t,e,i,s=function(){}){this.liveSocket.withinOwners(t.form,(o,c)=>{o.pushWithReply(null,"progress",{event:t.getAttribute(o.binding(mg)),ref:t.getAttribute(Ni),entry_ref:e,progress:i,cid:o.targetComponentID(t.form,c)},s)})}pushInput(t,e,i,s,o,c){let d,g=ai(i)?i:this.targetComponentID(t.form,e),v=()=>this.putRef([t,t.form],"change",o),C;t.getAttribute(this.binding("change"))?C=Gr(t.form,{_target:o._target},[t.name]):C=Gr(t.form,{_target:o._target}),j.isUploadInput(t)&&t.files&&t.files.length>0&&Ve.trackFiles(t,Array.from(t.files)),d=Ve.serializeUploads(t);let x={type:"form",event:s,value:C,uploads:d,cid:g};this.pushWithReply(v,"event",x,I=>{if(j.showError(t,this.liveSocket.binding(Co)),j.isUploadInput(t)&&t.getAttribute("data-phx-auto-upload")!==null){if(Ve.filesAwaitingPreflight(t).length>0){let[D,S]=v();this.uploadFiles(t.form,e,D,g,N=>{c&&c(I),this.triggerAwaitingSubmit(t.form)})}}else c&&c(I)})}triggerAwaitingSubmit(t){let e=this.getScheduledSubmit(t);if(e){let[i,s,o,c]=e;this.cancelSubmit(t),c()}}getScheduledSubmit(t){return this.formSubmits.find(([e,i,s,o])=>e.isSameNode(t))}scheduleSubmit(t,e,i,s){if(this.getScheduledSubmit(t))return!0;this.formSubmits.push([t,e,i,s])}cancelSubmit(t){this.formSubmits=this.formSubmits.filter(([e,i,s])=>e.isSameNode(t)?(this.undoRefs(i),!1):!0)}pushFormSubmit(t,e,i,s,o){let c=I=>!(zn(I,`${this.binding(ko)}=ignore`,I.form)||zn(I,"data-phx-update=ignore",I.form)),d=I=>I.hasAttribute(this.binding(So)),g=I=>I.tagName=="BUTTON",v=I=>["INPUT","TEXTAREA","SELECT"].includes(I.tagName),C=()=>{let I=Array.from(t.elements),D=I.filter(d),S=I.filter(g).filter(c),N=I.filter(v).filter(c);return S.forEach(A=>{A.setAttribute(Vr,A.disabled),A.disabled=!0}),N.forEach(A=>{A.setAttribute(vo,A.readOnly),A.readOnly=!0,A.files&&(A.setAttribute(Vr,A.disabled),A.disabled=!0)}),t.setAttribute(this.binding(Fl),""),this.putRef([t].concat(D).concat(S).concat(N),"submit",s)},x=this.targetComponentID(t,e);if(Ve.hasUploadsInProgress(t)){let[I,D]=C(),S=()=>this.pushFormSubmit(t,e,i,s,o);return this.scheduleSubmit(t,I,s,S)}else if(Ve.inputsAwaitingPreflight(t).length>0){let[I,D]=C(),S=()=>[I,D,s];this.uploadFiles(t,e,I,x,N=>{let A=Gr(t,{});this.pushWithReply(S,"event",{type:"form",event:i,value:A,cid:x},o)})}else{let I=Gr(t,{});this.pushWithReply(C,"event",{type:"form",event:i,value:I,cid:x},o)}}uploadFiles(t,e,i,s,o){let c=this.joinCount,d=Ve.activeFileInputs(t),g=d.length;d.forEach(v=>{let C=new Ve(v,this,()=>{g--,g===0&&o()});this.uploaders[v]=C;let x=C.entries().map(D=>D.toPreflightPayload()),I={ref:v.getAttribute(Ni),entries:x,cid:this.targetComponentID(v.form,e)};this.log("upload",()=>["sending preflight request",I]),this.pushWithReply(null,"allow_upload",I,D=>{if(this.log("upload",()=>["got preflight response",D]),D.error){this.undoRefs(i);let[S,N]=D.error;this.log("upload",()=>[`error for entry ${S}`,N])}else{let S=N=>{this.channel.onError(()=>{this.joinCount===c&&N()})};C.initAdapterUpload(D,S,this.liveSocket)}})})}dispatchUploads(t,e){let i=j.findUploadInputs(this.el).filter(s=>s.name===t);i.length===0?We(`no live file inputs found matching the name "${t}"`):i.length>1?We(`duplicate live file inputs found matching the name "${t}"`):j.dispatchEvent(i[0],su,{detail:{files:e}})}pushFormRecovery(t,e,i){this.liveSocket.withinOwners(t,(s,o)=>{let c=t.elements[0],d=t.getAttribute(this.binding(Wl))||t.getAttribute(this.binding("change"));Nt.exec("change",d,s,c,["push",{_target:c.name,newCid:e,callback:i}])})}pushLinkPatch(t,e,i){let s=this.liveSocket.setPendingLink(t),o=e?()=>this.putRef([e],"click"):null,c=()=>this.liveSocket.redirect(window.location.href),d=this.pushWithReply(o,"live_patch",{url:t},g=>{this.liveSocket.requestDOMUpdate(()=>{g.link_redirect?this.liveSocket.replaceMain(t,null,i,s):(this.liveSocket.commitPendingLink(s)&&(this.href=t),this.applyPendingUpdates(),i&&i(s))})});d?d.receive("timeout",c):c()}formsForRecovery(t){if(this.joinCount===0)return[];let e=this.binding("change"),i=document.createElement("template");return i.innerHTML=t,j.all(this.el,`form[${e}]`).filter(s=>s.id&&this.ownsElement(s)).filter(s=>s.elements.length>0).filter(s=>s.getAttribute(this.binding(Wl))!=="ignore").map(s=>{let o=i.content.querySelector(`form[id="${s.id}"][${e}="${s.getAttribute(e)}"]`);return o?[s,o,this.targetComponentID(o)]:[s,null,null]}).filter(([s,o,c])=>o)}maybePushComponentsDestroyed(t){let e=t.filter(i=>j.findComponentNodeList(this.el,i).length===0);e.length>0&&(this.pruningCIDs.push(...e),this.pushWithReply(null,"cids_will_destroy",{cids:e},()=>{this.pruningCIDs=this.pruningCIDs.filter(s=>e.indexOf(s)!==-1);let i=e.filter(s=>j.findComponentNodeList(this.el,s).length===0);i.length>0&&this.pushWithReply(null,"cids_destroyed",{cids:i},s=>{this.rendered.pruneCIDs(s.cids)})}))}ownsElement(t){return t.getAttribute(on)===this.id||qt(t.closest(an),e=>e.id)===this.id}submitForm(t,e,i,s={}){j.putPrivate(t,lu,!0);let o=this.liveSocket.binding(Co),c=Array.from(t.elements);this.liveSocket.blurActiveElement(this),this.pushFormSubmit(t,e,i,s,()=>{c.forEach(d=>j.showError(d,o)),this.liveSocket.restorePreviouslyActiveFocus()})}binding(t){return this.liveSocket.binding(t)}},fu=class{constructor(t,e,i={}){if(this.unloaded=!1,!e||e.constructor.name==="Object")throw new Error(`
       a phoenix Socket must be provided as the second argument to the LiveSocket constructor. For example:
 
           import {Socket} from "phoenix"
           import {LiveSocket} from "phoenix_live_view"
           let liveSocket = new LiveSocket("/live", Socket, {...})
-      `);
-      }
-      this.socket = new phxSocket(url, opts);
-      this.bindingPrefix = opts.bindingPrefix || BINDING_PREFIX;
-      this.opts = opts;
-      this.params = closure2(opts.params || {});
-      this.viewLogger = opts.viewLogger;
-      this.metadataCallbacks = opts.metadata || {};
-      this.defaults = Object.assign(clone(DEFAULTS), opts.defaults || {});
-      this.activeElement = null;
-      this.prevActive = null;
-      this.silenced = false;
-      this.main = null;
-      this.outgoingMainEl = null;
-      this.clickStartedAtTarget = null;
-      this.linkRef = 1;
-      this.roots = {};
-      this.href = window.location.href;
-      this.pendingLink = null;
-      this.currentLocation = clone(window.location);
-      this.hooks = opts.hooks || {};
-      this.uploaders = opts.uploaders || {};
-      this.loaderTimeout = opts.loaderTimeout || LOADER_TIMEOUT;
-      this.reloadWithJitterTimer = null;
-      this.maxReloads = opts.maxReloads || MAX_RELOADS;
-      this.reloadJitterMin = opts.reloadJitterMin || RELOAD_JITTER_MIN;
-      this.reloadJitterMax = opts.reloadJitterMax || RELOAD_JITTER_MAX;
-      this.failsafeJitter = opts.failsafeJitter || FAILSAFE_JITTER;
-      this.localStorage = opts.localStorage || window.localStorage;
-      this.sessionStorage = opts.sessionStorage || window.sessionStorage;
-      this.boundTopLevelEvents = false;
-      this.domCallbacks = Object.assign({ onNodeAdded: closure2(), onBeforeElUpdated: closure2() }, opts.dom || {});
-      this.transitions = new TransitionSet();
-      window.addEventListener("pagehide", (_e) => {
-        this.unloaded = true;
-      });
-      this.socket.onOpen(() => {
-        if (this.isUnloaded()) {
-          window.location.reload();
-        }
-      });
-    }
-    isProfileEnabled() {
-      return this.sessionStorage.getItem(PHX_LV_PROFILE) === "true";
-    }
-    isDebugEnabled() {
-      return this.sessionStorage.getItem(PHX_LV_DEBUG) === "true";
-    }
-    isDebugDisabled() {
-      return this.sessionStorage.getItem(PHX_LV_DEBUG) === "false";
-    }
-    enableDebug() {
-      this.sessionStorage.setItem(PHX_LV_DEBUG, "true");
-    }
-    enableProfiling() {
-      this.sessionStorage.setItem(PHX_LV_PROFILE, "true");
-    }
-    disableDebug() {
-      this.sessionStorage.setItem(PHX_LV_DEBUG, "false");
-    }
-    disableProfiling() {
-      this.sessionStorage.removeItem(PHX_LV_PROFILE);
-    }
-    enableLatencySim(upperBoundMs) {
-      this.enableDebug();
-      console.log("latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable");
-      this.sessionStorage.setItem(PHX_LV_LATENCY_SIM, upperBoundMs);
-    }
-    disableLatencySim() {
-      this.sessionStorage.removeItem(PHX_LV_LATENCY_SIM);
-    }
-    getLatencySim() {
-      let str = this.sessionStorage.getItem(PHX_LV_LATENCY_SIM);
-      return str ? parseInt(str) : null;
-    }
-    getSocket() {
-      return this.socket;
-    }
-    connect() {
-      if (window.location.hostname === "localhost" && !this.isDebugDisabled()) {
-        this.enableDebug();
-      }
-      let doConnect = () => {
-        if (this.joinRootViews()) {
-          this.bindTopLevelEvents();
-          this.socket.connect();
-        } else if (this.main) {
-          this.socket.connect();
-        }
-      };
-      if (["complete", "loaded", "interactive"].indexOf(document.readyState) >= 0) {
-        doConnect();
-      } else {
-        document.addEventListener("DOMContentLoaded", () => doConnect());
-      }
-    }
-    disconnect(callback) {
-      clearTimeout(this.reloadWithJitterTimer);
-      this.socket.disconnect(callback);
-    }
-    replaceTransport(transport) {
-      clearTimeout(this.reloadWithJitterTimer);
-      this.socket.replaceTransport(transport);
-      this.connect();
-    }
-    execJS(el, encodedJS, eventType = null) {
-      this.owner(el, (view) => js_default.exec(eventType, encodedJS, view, el));
-    }
-    triggerDOM(kind, args) {
-      this.domCallbacks[kind](...args);
-    }
-    time(name, func) {
-      if (!this.isProfileEnabled() || !console.time) {
-        return func();
-      }
-      console.time(name);
-      let result = func();
-      console.timeEnd(name);
-      return result;
-    }
-    log(view, kind, msgCallback) {
-      if (this.viewLogger) {
-        let [msg, obj] = msgCallback();
-        this.viewLogger(view, kind, msg, obj);
-      } else if (this.isDebugEnabled()) {
-        let [msg, obj] = msgCallback();
-        debug(view, kind, msg, obj);
-      }
-    }
-    requestDOMUpdate(callback) {
-      this.transitions.after(callback);
-    }
-    transition(time, onStart, onDone = function() {
-    }) {
-      this.transitions.addTransition(time, onStart, onDone);
-    }
-    onChannel(channel, event, cb) {
-      channel.on(event, (data) => {
-        let latency = this.getLatencySim();
-        if (!latency) {
-          cb(data);
-        } else {
-          console.log(`simulating ${latency}ms of latency from server to client`);
-          setTimeout(() => cb(data), latency);
-        }
-      });
-    }
-    wrapPush(view, opts, push) {
-      let latency = this.getLatencySim();
-      let oldJoinCount = view.joinCount;
-      if (!latency) {
-        if (this.isConnected() && opts.timeout) {
-          return push().receive("timeout", () => {
-            if (view.joinCount === oldJoinCount && !view.isDestroyed()) {
-              this.reloadWithJitter(view, () => {
-                this.log(view, "timeout", () => ["received timeout while communicating with server. Falling back to hard refresh for recovery"]);
-              });
-            }
-          });
-        } else {
-          return push();
-        }
-      }
-      console.log(`simulating ${latency}ms of latency from client to server`);
-      let fakePush = {
-        receives: [],
-        receive(kind, cb) {
-          this.receives.push([kind, cb]);
-        }
-      };
-      setTimeout(() => {
-        if (view.isDestroyed()) {
-          return;
-        }
-        fakePush.receives.reduce((acc, [kind, cb]) => acc.receive(kind, cb), push());
-      }, latency);
-      return fakePush;
-    }
-    reloadWithJitter(view, log) {
-      clearTimeout(this.reloadWithJitterTimer);
-      this.disconnect();
-      let minMs = this.reloadJitterMin;
-      let maxMs = this.reloadJitterMax;
-      let afterMs = Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs;
-      let tries = browser_default.updateLocal(this.localStorage, window.location.pathname, CONSECUTIVE_RELOADS, 0, (count) => count + 1);
-      if (tries > this.maxReloads) {
-        afterMs = this.failsafeJitter;
-      }
-      this.reloadWithJitterTimer = setTimeout(() => {
-        if (view.isDestroyed() || view.isConnected()) {
-          return;
-        }
-        view.destroy();
-        log ? log() : this.log(view, "join", () => [`encountered ${tries} consecutive reloads`]);
-        if (tries > this.maxReloads) {
-          this.log(view, "join", () => [`exceeded ${this.maxReloads} consecutive reloads. Entering failsafe mode`]);
-        }
-        if (this.hasPendingLink()) {
-          window.location = this.pendingLink;
-        } else {
-          window.location.reload();
-        }
-      }, afterMs);
-    }
-    getHookCallbacks(name) {
-      return name && name.startsWith("Phoenix.") ? hooks_default[name.split(".")[1]] : this.hooks[name];
-    }
-    isUnloaded() {
-      return this.unloaded;
-    }
-    isConnected() {
-      return this.socket.isConnected();
-    }
-    getBindingPrefix() {
-      return this.bindingPrefix;
-    }
-    binding(kind) {
-      return `${this.getBindingPrefix()}${kind}`;
-    }
-    channel(topic, params) {
-      return this.socket.channel(topic, params);
-    }
-    joinRootViews() {
-      let rootsFound = false;
-      dom_default.all(document, `${PHX_VIEW_SELECTOR}:not([${PHX_PARENT_ID}])`, (rootEl) => {
-        if (!this.getRootById(rootEl.id)) {
-          let view = this.newRootView(rootEl);
-          view.setHref(this.getHref());
-          view.join();
-          if (rootEl.hasAttribute(PHX_MAIN)) {
-            this.main = view;
-          }
-        }
-        rootsFound = true;
-      });
-      return rootsFound;
-    }
-    redirect(to, flash) {
-      this.disconnect();
-      browser_default.redirect(to, flash);
-    }
-    replaceMain(href, flash, callback = null, linkRef = this.setPendingLink(href)) {
-      this.outgoingMainEl = this.outgoingMainEl || this.main.el;
-      let newMainEl = dom_default.cloneNode(this.outgoingMainEl, "");
-      this.main.showLoader(this.loaderTimeout);
-      this.main.destroy();
-      this.main = this.newRootView(newMainEl, flash);
-      this.main.setRedirect(href);
-      this.transitionRemoves();
-      this.main.join((joinCount, onDone) => {
-        if (joinCount === 1 && this.commitPendingLink(linkRef)) {
-          this.requestDOMUpdate(() => {
-            dom_default.findPhxSticky(document).forEach((el) => newMainEl.appendChild(el));
-            this.outgoingMainEl.replaceWith(newMainEl);
-            this.outgoingMainEl = null;
-            callback && requestAnimationFrame(callback);
-            onDone();
-          });
-        }
-      });
-    }
-    transitionRemoves(elements) {
-      let removeAttr = this.binding("remove");
-      elements = elements || dom_default.all(document, `[${removeAttr}]`);
-      elements.forEach((el) => {
-        if (document.body.contains(el)) {
-          this.execJS(el, el.getAttribute(removeAttr), "remove");
-        }
-      });
-    }
-    isPhxView(el) {
-      return el.getAttribute && el.getAttribute(PHX_SESSION) !== null;
-    }
-    newRootView(el, flash) {
-      let view = new View(el, this, null, flash);
-      this.roots[view.id] = view;
-      return view;
-    }
-    owner(childEl, callback) {
-      let view = maybe(childEl.closest(PHX_VIEW_SELECTOR), (el) => this.getViewByEl(el)) || this.main;
-      if (view) {
-        callback(view);
-      }
-    }
-    withinOwners(childEl, callback) {
-      this.owner(childEl, (view) => callback(view, childEl));
-    }
-    getViewByEl(el) {
-      let rootId = el.getAttribute(PHX_ROOT_ID);
-      return maybe(this.getRootById(rootId), (root) => root.getDescendentByEl(el));
-    }
-    getRootById(id) {
-      return this.roots[id];
-    }
-    destroyAllViews() {
-      for (let id in this.roots) {
-        this.roots[id].destroy();
-        delete this.roots[id];
-      }
-      this.main = null;
-    }
-    destroyViewByEl(el) {
-      let root = this.getRootById(el.getAttribute(PHX_ROOT_ID));
-      if (root && root.id === el.id) {
-        root.destroy();
-        delete this.roots[root.id];
-      } else if (root) {
-        root.destroyDescendent(el.id);
-      }
-    }
-    setActiveElement(target) {
-      if (this.activeElement === target) {
-        return;
-      }
-      this.activeElement = target;
-      let cancel = () => {
-        if (target === this.activeElement) {
-          this.activeElement = null;
-        }
-        target.removeEventListener("mouseup", this);
-        target.removeEventListener("touchend", this);
-      };
-      target.addEventListener("mouseup", cancel);
-      target.addEventListener("touchend", cancel);
-    }
-    getActiveElement() {
-      if (document.activeElement === document.body) {
-        return this.activeElement || document.activeElement;
-      } else {
-        return document.activeElement || document.body;
-      }
-    }
-    dropActiveElement(view) {
-      if (this.prevActive && view.ownsElement(this.prevActive)) {
-        this.prevActive = null;
-      }
-    }
-    restorePreviouslyActiveFocus() {
-      if (this.prevActive && this.prevActive !== document.body) {
-        this.prevActive.focus();
-      }
-    }
-    blurActiveElement() {
-      this.prevActive = this.getActiveElement();
-      if (this.prevActive !== document.body) {
-        this.prevActive.blur();
-      }
-    }
-    bindTopLevelEvents() {
-      if (this.boundTopLevelEvents) {
-        return;
-      }
-      this.boundTopLevelEvents = true;
-      this.socket.onClose((event) => {
-        if (event && event.code === 1e3 && this.main) {
-          this.reloadWithJitter(this.main);
-        }
-      });
-      document.body.addEventListener("click", function() {
-      });
-      window.addEventListener("pageshow", (e) => {
-        if (e.persisted) {
-          this.getSocket().disconnect();
-          this.withPageLoading({ to: window.location.href, kind: "redirect" });
-          window.location.reload();
-        }
-      }, true);
-      this.bindNav();
-      this.bindClicks();
-      this.bindForms();
-      this.bind({ keyup: "keyup", keydown: "keydown" }, (e, type, view, targetEl, phxEvent, eventTarget) => {
-        let matchKey = targetEl.getAttribute(this.binding(PHX_KEY));
-        let pressedKey = e.key && e.key.toLowerCase();
-        if (matchKey && matchKey.toLowerCase() !== pressedKey) {
-          return;
-        }
-        let data = __spreadValues({ key: e.key }, this.eventMeta(type, e, targetEl));
-        js_default.exec(type, phxEvent, view, targetEl, ["push", { data }]);
-      });
-      this.bind({ blur: "focusout", focus: "focusin" }, (e, type, view, targetEl, phxEvent, eventTarget) => {
-        if (!eventTarget) {
-          let data = __spreadValues({ key: e.key }, this.eventMeta(type, e, targetEl));
-          js_default.exec(type, phxEvent, view, targetEl, ["push", { data }]);
-        }
-      });
-      this.bind({ blur: "blur", focus: "focus" }, (e, type, view, targetEl, targetCtx, phxEvent, phxTarget) => {
-        if (phxTarget === "window") {
-          let data = this.eventMeta(type, e, targetEl);
-          js_default.exec(type, phxEvent, view, targetEl, ["push", { data }]);
-        }
-      });
-      window.addEventListener("dragover", (e) => e.preventDefault());
-      window.addEventListener("drop", (e) => {
-        e.preventDefault();
-        let dropTargetId = maybe(closestPhxBinding(e.target, this.binding(PHX_DROP_TARGET)), (trueTarget) => {
-          return trueTarget.getAttribute(this.binding(PHX_DROP_TARGET));
-        });
-        let dropTarget = dropTargetId && document.getElementById(dropTargetId);
-        let files = Array.from(e.dataTransfer.files || []);
-        if (!dropTarget || dropTarget.disabled || files.length === 0 || !(dropTarget.files instanceof FileList)) {
-          return;
-        }
-        LiveUploader.trackFiles(dropTarget, files);
-        dropTarget.dispatchEvent(new Event("input", { bubbles: true }));
-      });
-      this.on(PHX_TRACK_UPLOADS, (e) => {
-        let uploadTarget = e.target;
-        if (!dom_default.isUploadInput(uploadTarget)) {
-          return;
-        }
-        let files = Array.from(e.detail.files || []).filter((f) => f instanceof File || f instanceof Blob);
-        LiveUploader.trackFiles(uploadTarget, files);
-        uploadTarget.dispatchEvent(new Event("input", { bubbles: true }));
-      });
-    }
-    eventMeta(eventName, e, targetEl) {
-      let callback = this.metadataCallbacks[eventName];
-      return callback ? callback(e, targetEl) : {};
-    }
-    setPendingLink(href) {
-      this.linkRef++;
-      this.pendingLink = href;
-      return this.linkRef;
-    }
-    commitPendingLink(linkRef) {
-      if (this.linkRef !== linkRef) {
-        return false;
-      } else {
-        this.href = this.pendingLink;
-        this.pendingLink = null;
-        return true;
-      }
-    }
-    getHref() {
-      return this.href;
-    }
-    hasPendingLink() {
-      return !!this.pendingLink;
-    }
-    bind(events, callback) {
-      for (let event in events) {
-        let browserEventName = events[event];
-        this.on(browserEventName, (e) => {
-          let binding = this.binding(event);
-          let windowBinding = this.binding(`window-${event}`);
-          let targetPhxEvent = e.target.getAttribute && e.target.getAttribute(binding);
-          if (targetPhxEvent) {
-            this.debounce(e.target, e, browserEventName, () => {
-              this.withinOwners(e.target, (view) => {
-                callback(e, event, view, e.target, targetPhxEvent, null);
-              });
-            });
-          } else {
-            dom_default.all(document, `[${windowBinding}]`, (el) => {
-              let phxEvent = el.getAttribute(windowBinding);
-              this.debounce(el, e, browserEventName, () => {
-                this.withinOwners(el, (view) => {
-                  callback(e, event, view, el, phxEvent, "window");
-                });
-              });
-            });
-          }
-        });
-      }
-    }
-    bindClicks() {
-      window.addEventListener("mousedown", (e) => this.clickStartedAtTarget = e.target);
-      this.bindClick("click", "click", false);
-      this.bindClick("mousedown", "capture-click", true);
-    }
-    bindClick(eventName, bindingName, capture) {
-      let click = this.binding(bindingName);
-      window.addEventListener(eventName, (e) => {
-        let target = null;
-        if (capture) {
-          target = e.target.matches(`[${click}]`) ? e.target : e.target.querySelector(`[${click}]`);
-        } else {
-          let clickStartedAtTarget = this.clickStartedAtTarget || e.target;
-          target = closestPhxBinding(clickStartedAtTarget, click);
-          this.dispatchClickAway(e, clickStartedAtTarget);
-          this.clickStartedAtTarget = null;
-        }
-        let phxEvent = target && target.getAttribute(click);
-        if (!phxEvent) {
-          return;
-        }
-        if (target.getAttribute("href") === "#") {
-          e.preventDefault();
-        }
-        this.debounce(target, e, "click", () => {
-          this.withinOwners(target, (view) => {
-            js_default.exec("click", phxEvent, view, target, ["push", { data: this.eventMeta("click", e, target) }]);
-          });
-        });
-      }, capture);
-    }
-    dispatchClickAway(e, clickStartedAt) {
-      let phxClickAway = this.binding("click-away");
-      dom_default.all(document, `[${phxClickAway}]`, (el) => {
-        if (!(el.isSameNode(clickStartedAt) || el.contains(clickStartedAt))) {
-          this.withinOwners(e.target, (view) => {
-            let phxEvent = el.getAttribute(phxClickAway);
-            if (js_default.isVisible(el)) {
-              js_default.exec("click", phxEvent, view, el, ["push", { data: this.eventMeta("click", e, e.target) }]);
-            }
-          });
-        }
-      });
-    }
-    bindNav() {
-      if (!browser_default.canPushState()) {
-        return;
-      }
-      if (history.scrollRestoration) {
-        history.scrollRestoration = "manual";
-      }
-      let scrollTimer = null;
-      window.addEventListener("scroll", (_e) => {
-        clearTimeout(scrollTimer);
-        scrollTimer = setTimeout(() => {
-          browser_default.updateCurrentState((state) => Object.assign(state, { scroll: window.scrollY }));
-        }, 100);
-      });
-      window.addEventListener("popstate", (event) => {
-        if (!this.registerNewLocation(window.location)) {
-          return;
-        }
-        let { type, id, root, scroll } = event.state || {};
-        let href = window.location.href;
-        this.requestDOMUpdate(() => {
-          if (this.main.isConnected() && (type === "patch" && id === this.main.id)) {
-            this.main.pushLinkPatch(href, null);
-          } else {
-            this.replaceMain(href, null, () => {
-              if (root) {
-                this.replaceRootHistory();
-              }
-              if (typeof scroll === "number") {
-                setTimeout(() => {
-                  window.scrollTo(0, scroll);
-                }, 0);
-              }
-            });
-          }
-        });
-      }, false);
-      window.addEventListener("click", (e) => {
-        let target = closestPhxBinding(e.target, PHX_LIVE_LINK);
-        let type = target && target.getAttribute(PHX_LIVE_LINK);
-        let wantsNewTab = e.metaKey || e.ctrlKey || e.button === 1;
-        if (!type || !this.isConnected() || !this.main || wantsNewTab) {
-          return;
-        }
-        let href = target.href;
-        let linkState = target.getAttribute(PHX_LINK_STATE);
-        e.preventDefault();
-        e.stopImmediatePropagation();
-        if (this.pendingLink === href) {
-          return;
-        }
-        this.requestDOMUpdate(() => {
-          if (type === "patch") {
-            this.pushHistoryPatch(href, linkState, target);
-          } else if (type === "redirect") {
-            this.historyRedirect(href, linkState);
-          } else {
-            throw new Error(`expected ${PHX_LIVE_LINK} to be "patch" or "redirect", got: ${type}`);
-          }
-        });
-      }, false);
-    }
-    dispatchEvent(event, payload = {}) {
-      dom_default.dispatchEvent(window, `phx:${event}`, { detail: payload });
-    }
-    dispatchEvents(events) {
-      events.forEach(([event, payload]) => this.dispatchEvent(event, payload));
-    }
-    withPageLoading(info, callback) {
-      dom_default.dispatchEvent(window, "phx:page-loading-start", { detail: info });
-      let done = () => dom_default.dispatchEvent(window, "phx:page-loading-stop", { detail: info });
-      return callback ? callback(done) : done;
-    }
-    pushHistoryPatch(href, linkState, targetEl) {
-      this.withPageLoading({ to: href, kind: "patch" }, (done) => {
-        this.main.pushLinkPatch(href, targetEl, (linkRef) => {
-          this.historyPatch(href, linkState, linkRef);
-          done();
-        });
-      });
-    }
-    historyPatch(href, linkState, linkRef = this.setPendingLink(href)) {
-      if (!this.commitPendingLink(linkRef)) {
-        return;
-      }
-      browser_default.pushState(linkState, { type: "patch", id: this.main.id }, href);
-      this.registerNewLocation(window.location);
-    }
-    historyRedirect(href, linkState, flash) {
-      let scroll = window.scrollY;
-      this.withPageLoading({ to: href, kind: "redirect" }, (done) => {
-        this.replaceMain(href, flash, () => {
-          browser_default.pushState(linkState, { type: "redirect", id: this.main.id, scroll }, href);
-          this.registerNewLocation(window.location);
-          done();
-        });
-      });
-    }
-    replaceRootHistory() {
-      browser_default.pushState("replace", { root: true, type: "patch", id: this.main.id });
-    }
-    registerNewLocation(newLocation) {
-      let { pathname, search } = this.currentLocation;
-      if (pathname + search === newLocation.pathname + newLocation.search) {
-        return false;
-      } else {
-        this.currentLocation = clone(newLocation);
-        return true;
-      }
-    }
-    bindForms() {
-      let iterations = 0;
-      this.on("submit", (e) => {
-        let phxEvent = e.target.getAttribute(this.binding("submit"));
-        if (!phxEvent) {
-          return;
-        }
-        e.preventDefault();
-        e.target.disabled = true;
-        this.withinOwners(e.target, (view) => {
-          js_default.exec("submit", phxEvent, view, e.target, ["push", {}]);
-        });
-      }, false);
-      for (let type of ["change", "input"]) {
-        this.on(type, (e) => {
-          let phxChange = this.binding("change");
-          let input = e.target;
-          let inputEvent = input.getAttribute(phxChange);
-          let formEvent = input.form && input.form.getAttribute(phxChange);
-          let phxEvent = inputEvent || formEvent;
-          if (!phxEvent) {
-            return;
-          }
-          if (input.type === "number" && input.validity && input.validity.badInput) {
-            return;
-          }
-          let dispatcher = inputEvent ? input : input.form;
-          let currentIterations = iterations;
-          iterations++;
-          let { at, type: lastType } = dom_default.private(input, "prev-iteration") || {};
-          if (at === currentIterations - 1 && type !== lastType) {
-            return;
-          }
-          dom_default.putPrivate(input, "prev-iteration", { at: currentIterations, type });
-          this.debounce(input, e, type, () => {
-            this.withinOwners(dispatcher, (view) => {
-              dom_default.putPrivate(input, PHX_HAS_FOCUSED, true);
-              if (!dom_default.isTextualInput(input)) {
-                this.setActiveElement(input);
-              }
-              js_default.exec("change", phxEvent, view, input, ["push", { _target: e.target.name, dispatcher }]);
-            });
-          });
-        }, false);
-      }
-    }
-    debounce(el, event, eventType, callback) {
-      if (eventType === "blur" || eventType === "focusout") {
-        return callback();
-      }
-      let phxDebounce = this.binding(PHX_DEBOUNCE);
-      let phxThrottle = this.binding(PHX_THROTTLE);
-      let defaultDebounce = this.defaults.debounce.toString();
-      let defaultThrottle = this.defaults.throttle.toString();
-      this.withinOwners(el, (view) => {
-        let asyncFilter = () => !view.isDestroyed() && document.body.contains(el);
-        dom_default.debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, asyncFilter, () => {
-          callback();
-        });
-      });
-    }
-    silenceEvents(callback) {
-      this.silenced = true;
-      callback();
-      this.silenced = false;
-    }
-    on(event, callback) {
-      window.addEventListener(event, (e) => {
-        if (!this.silenced) {
-          callback(e);
-        }
-      });
-    }
-  };
-  var TransitionSet = class {
-    constructor() {
-      this.transitions = /* @__PURE__ */ new Set();
-      this.pendingOps = [];
-      this.reset();
-    }
-    reset() {
-      this.transitions.forEach((timer) => {
-        cancelTimeout(timer);
-        this.transitions.delete(timer);
-      });
-      this.flushPendingOps();
-    }
-    after(callback) {
-      if (this.size() === 0) {
-        callback();
-      } else {
-        this.pushPendingOp(callback);
-      }
-    }
-    addTransition(time, onStart, onDone) {
-      onStart();
-      let timer = setTimeout(() => {
-        this.transitions.delete(timer);
-        onDone();
-        if (this.size() === 0) {
-          this.flushPendingOps();
-        }
-      }, time);
-      this.transitions.add(timer);
-    }
-    pushPendingOp(op) {
-      this.pendingOps.push(op);
-    }
-    size() {
-      return this.transitions.size;
-    }
-    flushPendingOps() {
-      this.pendingOps.forEach((op) => op());
-      this.pendingOps = [];
-    }
-  };
-
-  // js/app.js
-  var import_topbar = __toESM(require_topbar());
-  window.$ = import_jquery3.default;
-  window.jQuery = import_jquery3.default;
-  var csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content");
-  var liveSocket = new LiveSocket("/live", Socket, { params: { _csrf_token: csrfToken } });
-  import_topbar.default.config({ barColors: { 0: "#29d" }, shadowColor: "rgba(0, 0, 0, .3)" });
-  window.addEventListener("phx:page-loading-start", (info) => import_topbar.default.show());
-  window.addEventListener("phx:page-loading-stop", (info) => import_topbar.default.hide());
-  liveSocket.connect();
-  window.liveSocket = liveSocket;
-})();
+      `);this.socket=new e(t,i),this.bindingPrefix=i.bindingPrefix||yg,this.opts=i,this.params=_o(i.params||{}),this.viewLogger=i.viewLogger,this.metadataCallbacks=i.metadata||{},this.defaults=Object.assign(Jr(Eg),i.defaults||{}),this.activeElement=null,this.prevActive=null,this.silenced=!1,this.main=null,this.outgoingMainEl=null,this.clickStartedAtTarget=null,this.linkRef=1,this.roots={},this.href=window.location.href,this.pendingLink=null,this.currentLocation=Jr(window.location),this.hooks=i.hooks||{},this.uploaders=i.uploaders||{},this.loaderTimeout=i.loaderTimeout||vg,this.reloadWithJitterTimer=null,this.maxReloads=i.maxReloads||rg,this.reloadJitterMin=i.reloadJitterMin||sg,this.reloadJitterMax=i.reloadJitterMax||og,this.failsafeJitter=i.failsafeJitter||ag,this.localStorage=i.localStorage||window.localStorage,this.sessionStorage=i.sessionStorage||window.sessionStorage,this.boundTopLevelEvents=!1,this.domCallbacks=Object.assign({onNodeAdded:_o(),onBeforeElUpdated:_o()},i.dom||{}),this.transitions=new Xg,window.addEventListener("pagehide",s=>{this.unloaded=!0}),this.socket.onOpen(()=>{this.isUnloaded()&&window.location.reload()})}isProfileEnabled(){return this.sessionStorage.getItem(bo)==="true"}isDebugEnabled(){return this.sessionStorage.getItem(qr)==="true"}isDebugDisabled(){return this.sessionStorage.getItem(qr)==="false"}enableDebug(){this.sessionStorage.setItem(qr,"true")}enableProfiling(){this.sessionStorage.setItem(bo,"true")}disableDebug(){this.sessionStorage.setItem(qr,"false")}disableProfiling(){this.sessionStorage.removeItem(bo)}enableLatencySim(t){this.enableDebug(),console.log("latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable"),this.sessionStorage.setItem(yo,t)}disableLatencySim(){this.sessionStorage.removeItem(yo)}getLatencySim(){let t=this.sessionStorage.getItem(yo);return t?parseInt(t):null}getSocket(){return this.socket}connect(){window.location.hostname==="localhost"&&!this.isDebugDisabled()&&this.enableDebug();let t=()=>{this.joinRootViews()?(this.bindTopLevelEvents(),this.socket.connect()):this.main&&this.socket.connect()};["complete","loaded","interactive"].indexOf(document.readyState)>=0?t():document.addEventListener("DOMContentLoaded",()=>t())}disconnect(t){clearTimeout(this.reloadWithJitterTimer),this.socket.disconnect(t)}replaceTransport(t){clearTimeout(this.reloadWithJitterTimer),this.socket.replaceTransport(t),this.connect()}execJS(t,e,i=null){this.owner(t,s=>Nt.exec(i,e,s,t))}triggerDOM(t,e){this.domCallbacks[t](...e)}time(t,e){if(!this.isProfileEnabled()||!console.time)return e();console.time(t);let i=e();return console.timeEnd(t),i}log(t,e,i){if(this.viewLogger){let[s,o]=i();this.viewLogger(t,e,s,o)}else if(this.isDebugEnabled()){let[s,o]=i();xg(t,e,s,o)}}requestDOMUpdate(t){this.transitions.after(t)}transition(t,e,i=function(){}){this.transitions.addTransition(t,e,i)}onChannel(t,e,i){t.on(e,s=>{let o=this.getLatencySim();o?(console.log(`simulating ${o}ms of latency from server to client`),setTimeout(()=>i(s),o)):i(s)})}wrapPush(t,e,i){let s=this.getLatencySim(),o=t.joinCount;if(!s)return this.isConnected()&&e.timeout?i().receive("timeout",()=>{t.joinCount===o&&!t.isDestroyed()&&this.reloadWithJitter(t,()=>{this.log(t,"timeout",()=>["received timeout while communicating with server. Falling back to hard refresh for recovery"])})}):i();console.log(`simulating ${s}ms of latency from client to server`);let c={receives:[],receive(d,g){this.receives.push([d,g])}};return setTimeout(()=>{t.isDestroyed()||c.receives.reduce((d,[g,v])=>d.receive(g,v),i())},s),c}reloadWithJitter(t,e){clearTimeout(this.reloadWithJitterTimer),this.disconnect();let i=this.reloadJitterMin,s=this.reloadJitterMax,o=Math.floor(Math.random()*(s-i+1))+i,c=oi.updateLocal(this.localStorage,window.location.pathname,nu,0,d=>d+1);c>this.maxReloads&&(o=this.failsafeJitter),this.reloadWithJitterTimer=setTimeout(()=>{t.isDestroyed()||t.isConnected()||(t.destroy(),e?e():this.log(t,"join",()=>[`encountered ${c} consecutive reloads`]),c>this.maxReloads&&this.log(t,"join",()=>[`exceeded ${this.maxReloads} consecutive reloads. Entering failsafe mode`]),this.hasPendingLink()?window.location=this.pendingLink:window.location.reload())},o)}getHookCallbacks(t){return t&&t.startsWith("Phoenix.")?Dg[t.split(".")[1]]:this.hooks[t]}isUnloaded(){return this.unloaded}isConnected(){return this.socket.isConnected()}getBindingPrefix(){return this.bindingPrefix}binding(t){return`${this.getBindingPrefix()}${t}`}channel(t,e){return this.socket.channel(t,e)}joinRootViews(){let t=!1;return j.all(document,`${an}:not([${on}])`,e=>{if(!this.getRootById(e.id)){let i=this.newRootView(e);i.setHref(this.getHref()),i.join(),e.hasAttribute(Do)&&(this.main=i)}t=!0}),t}redirect(t,e){this.disconnect(),oi.redirect(t,e)}replaceMain(t,e,i=null,s=this.setPendingLink(t)){this.outgoingMainEl=this.outgoingMainEl||this.main.el;let o=j.cloneNode(this.outgoingMainEl,"");this.main.showLoader(this.loaderTimeout),this.main.destroy(),this.main=this.newRootView(o,e),this.main.setRedirect(t),this.transitionRemoves(),this.main.join((c,d)=>{c===1&&this.commitPendingLink(s)&&this.requestDOMUpdate(()=>{j.findPhxSticky(document).forEach(g=>o.appendChild(g)),this.outgoingMainEl.replaceWith(o),this.outgoingMainEl=null,i&&requestAnimationFrame(i),d()})})}transitionRemoves(t){let e=this.binding("remove");t=t||j.all(document,`[${e}]`),t.forEach(i=>{document.body.contains(i)&&this.execJS(i,i.getAttribute(e),"remove")})}isPhxView(t){return t.getAttribute&&t.getAttribute(li)!==null}newRootView(t,e){let i=new cu(t,this,null,e);return this.roots[i.id]=i,i}owner(t,e){let i=qt(t.closest(an),s=>this.getViewByEl(s))||this.main;i&&e(i)}withinOwners(t,e){this.owner(t,i=>e(i,t))}getViewByEl(t){let e=t.getAttribute(Kn);return qt(this.getRootById(e),i=>i.getDescendentByEl(t))}getRootById(t){return this.roots[t]}destroyAllViews(){for(let t in this.roots)this.roots[t].destroy(),delete this.roots[t];this.main=null}destroyViewByEl(t){let e=this.getRootById(t.getAttribute(Kn));e&&e.id===t.id?(e.destroy(),delete this.roots[e.id]):e&&e.destroyDescendent(t.id)}setActiveElement(t){if(this.activeElement===t)return;this.activeElement=t;let e=()=>{t===this.activeElement&&(this.activeElement=null),t.removeEventListener("mouseup",this),t.removeEventListener("touchend",this)};t.addEventListener("mouseup",e),t.addEventListener("touchend",e)}getActiveElement(){return document.activeElement===document.body?this.activeElement||document.activeElement:document.activeElement||document.body}dropActiveElement(t){this.prevActive&&t.ownsElement(this.prevActive)&&(this.prevActive=null)}restorePreviouslyActiveFocus(){this.prevActive&&this.prevActive!==document.body&&this.prevActive.focus()}blurActiveElement(){this.prevActive=this.getActiveElement(),this.prevActive!==document.body&&this.prevActive.blur()}bindTopLevelEvents(){this.boundTopLevelEvents||(this.boundTopLevelEvents=!0,this.socket.onClose(t=>{t&&t.code===1e3&&this.main&&this.reloadWithJitter(this.main)}),document.body.addEventListener("click",function(){}),window.addEventListener("pageshow",t=>{t.persisted&&(this.getSocket().disconnect(),this.withPageLoading({to:window.location.href,kind:"redirect"}),window.location.reload())},!0),this.bindNav(),this.bindClicks(),this.bindForms(),this.bind({keyup:"keyup",keydown:"keydown"},(t,e,i,s,o,c)=>{let d=s.getAttribute(this.binding(gg)),g=t.key&&t.key.toLowerCase();if(d&&d.toLowerCase()!==g)return;let v={key:t.key,...this.eventMeta(e,t,s)};Nt.exec(e,o,i,s,["push",{data:v}])}),this.bind({blur:"focusout",focus:"focusin"},(t,e,i,s,o,c)=>{if(!c){let d={key:t.key,...this.eventMeta(e,t,s)};Nt.exec(e,o,i,s,["push",{data:d}])}}),this.bind({blur:"blur",focus:"focus"},(t,e,i,s,o,c,d)=>{if(d==="window"){let g=this.eventMeta(e,t,s);Nt.exec(e,c,i,s,["push",{data:g}])}}),window.addEventListener("dragover",t=>t.preventDefault()),window.addEventListener("drop",t=>{t.preventDefault();let e=qt(zn(t.target,this.binding(Ml)),o=>o.getAttribute(this.binding(Ml))),i=e&&document.getElementById(e),s=Array.from(t.dataTransfer.files||[]);!i||i.disabled||s.length===0||!(i.files instanceof FileList)||(Ve.trackFiles(i,s),i.dispatchEvent(new Event("input",{bubbles:!0})))}),this.on(su,t=>{let e=t.target;if(!j.isUploadInput(e))return;let i=Array.from(t.detail.files||[]).filter(s=>s instanceof File||s instanceof Blob);Ve.trackFiles(e,i),e.dispatchEvent(new Event("input",{bubbles:!0}))}))}eventMeta(t,e,i){let s=this.metadataCallbacks[t];return s?s(e,i):{}}setPendingLink(t){return this.linkRef++,this.pendingLink=t,this.linkRef}commitPendingLink(t){return this.linkRef!==t?!1:(this.href=this.pendingLink,this.pendingLink=null,!0)}getHref(){return this.href}hasPendingLink(){return!!this.pendingLink}bind(t,e){for(let i in t){let s=t[i];this.on(s,o=>{let c=this.binding(i),d=this.binding(`window-${i}`),g=o.target.getAttribute&&o.target.getAttribute(c);g?this.debounce(o.target,o,s,()=>{this.withinOwners(o.target,v=>{e(o,i,v,o.target,g,null)})}):j.all(document,`[${d}]`,v=>{let C=v.getAttribute(d);this.debounce(v,o,s,()=>{this.withinOwners(v,x=>{e(o,i,x,v,C,"window")})})})})}}bindClicks(){window.addEventListener("mousedown",t=>this.clickStartedAtTarget=t.target),this.bindClick("click","click",!1),this.bindClick("mousedown","capture-click",!0)}bindClick(t,e,i){let s=this.binding(e);window.addEventListener(t,o=>{let c=null;if(i)c=o.target.matches(`[${s}]`)?o.target:o.target.querySelector(`[${s}]`);else{let g=this.clickStartedAtTarget||o.target;c=zn(g,s),this.dispatchClickAway(o,g),this.clickStartedAtTarget=null}let d=c&&c.getAttribute(s);d&&(c.getAttribute("href")==="#"&&o.preventDefault(),this.debounce(c,o,"click",()=>{this.withinOwners(c,g=>{Nt.exec("click",d,g,c,["push",{data:this.eventMeta("click",o,c)}])})}))},i)}dispatchClickAway(t,e){let i=this.binding("click-away");j.all(document,`[${i}]`,s=>{s.isSameNode(e)||s.contains(e)||this.withinOwners(t.target,o=>{let c=s.getAttribute(i);Nt.isVisible(s)&&Nt.exec("click",c,o,s,["push",{data:this.eventMeta("click",t,t.target)}])})})}bindNav(){if(!oi.canPushState())return;history.scrollRestoration&&(history.scrollRestoration="manual");let t=null;window.addEventListener("scroll",e=>{clearTimeout(t),t=setTimeout(()=>{oi.updateCurrentState(i=>Object.assign(i,{scroll:window.scrollY}))},100)}),window.addEventListener("popstate",e=>{if(!this.registerNewLocation(window.location))return;let{type:i,id:s,root:o,scroll:c}=e.state||{},d=window.location.href;this.requestDOMUpdate(()=>{this.main.isConnected()&&i==="patch"&&s===this.main.id?this.main.pushLinkPatch(d,null):this.replaceMain(d,null,()=>{o&&this.replaceRootHistory(),typeof c=="number"&&setTimeout(()=>{window.scrollTo(0,c)},0)})})},!1),window.addEventListener("click",e=>{let i=zn(e.target,go),s=i&&i.getAttribute(go),o=e.metaKey||e.ctrlKey||e.button===1;if(!s||!this.isConnected()||!this.main||o)return;let c=i.href,d=i.getAttribute(ug);e.preventDefault(),e.stopImmediatePropagation(),this.pendingLink!==c&&this.requestDOMUpdate(()=>{if(s==="patch")this.pushHistoryPatch(c,d,i);else if(s==="redirect")this.historyRedirect(c,d);else throw new Error(`expected ${go} to be "patch" or "redirect", got: ${s}`)})},!1)}dispatchEvent(t,e={}){j.dispatchEvent(window,`phx:${t}`,{detail:e})}dispatchEvents(t){t.forEach(([e,i])=>this.dispatchEvent(e,i))}withPageLoading(t,e){j.dispatchEvent(window,"phx:page-loading-start",{detail:t});let i=()=>j.dispatchEvent(window,"phx:page-loading-stop",{detail:t});return e?e(i):i}pushHistoryPatch(t,e,i){this.withPageLoading({to:t,kind:"patch"},s=>{this.main.pushLinkPatch(t,i,o=>{this.historyPatch(t,e,o),s()})})}historyPatch(t,e,i=this.setPendingLink(t)){this.commitPendingLink(i)&&(oi.pushState(e,{type:"patch",id:this.main.id},t),this.registerNewLocation(window.location))}historyRedirect(t,e,i){let s=window.scrollY;this.withPageLoading({to:t,kind:"redirect"},o=>{this.replaceMain(t,i,()=>{oi.pushState(e,{type:"redirect",id:this.main.id,scroll:s},t),this.registerNewLocation(window.location),o()})})}replaceRootHistory(){oi.pushState("replace",{root:!0,type:"patch",id:this.main.id})}registerNewLocation(t){let{pathname:e,search:i}=this.currentLocation;return e+i===t.pathname+t.search?!1:(this.currentLocation=Jr(t),!0)}bindForms(){let t=0;this.on("submit",e=>{let i=e.target.getAttribute(this.binding("submit"));i&&(e.preventDefault(),e.target.disabled=!0,this.withinOwners(e.target,s=>{Nt.exec("submit",i,s,e.target,["push",{}])}))},!1);for(let e of["change","input"])this.on(e,i=>{let s=this.binding("change"),o=i.target,c=o.getAttribute(s),d=o.form&&o.form.getAttribute(s),g=c||d;if(!g||o.type==="number"&&o.validity&&o.validity.badInput)return;let v=c?o:o.form,C=t;t++;let{at:x,type:I}=j.private(o,"prev-iteration")||{};x===C-1&&e!==I||(j.putPrivate(o,"prev-iteration",{at:C,type:e}),this.debounce(o,i,e,()=>{this.withinOwners(v,D=>{j.putPrivate(o,ou,!0),j.isTextualInput(o)||this.setActiveElement(o),Nt.exec("change",g,D,o,["push",{_target:i.target.name,dispatcher:v}])})}))},!1)}debounce(t,e,i,s){if(i==="blur"||i==="focusout")return s();let o=this.binding(dg),c=this.binding(pg),d=this.defaults.debounce.toString(),g=this.defaults.throttle.toString();this.withinOwners(t,v=>{let C=()=>!v.isDestroyed()&&document.body.contains(t);j.debounce(t,e,o,d,c,g,C,()=>{s()})})}silenceEvents(t){this.silenced=!0,t(),this.silenced=!1}on(t,e){window.addEventListener(t,i=>{this.silenced||e(i)})}},Xg=class{constructor(){this.transitions=new Set,this.pendingOps=[],this.reset()}reset(){this.transitions.forEach(t=>{cancelTimeout(t),this.transitions.delete(t)}),this.flushPendingOps()}after(t){this.size()===0?t():this.pushPendingOp(t)}addTransition(t,e,i){e();let s=setTimeout(()=>{this.transitions.delete(s),i(),this.size()===0&&this.flushPendingOps()},t);this.transitions.add(s)}pushPendingOp(t){this.pendingOps.push(t)}size(){return this.transitions.size}flushPendingOps(){this.pendingOps.forEach(t=>t()),this.pendingOps=[]}};var Zr=yn(du());window.$=Lo.default;window.jQuery=Lo.default;var Yg=document.querySelector("meta[name='csrf-token']").getAttribute("content"),pu=new fu("/live",$l,{params:{_csrf_token:Yg}});Zr.default.config({barColors:{0:"#29d"},shadowColor:"rgba(0, 0, 0, .3)"});window.addEventListener("phx:page-loading-start",t=>Zr.default.show());window.addEventListener("phx:page-loading-stop",t=>Zr.default.hide());pu.connect();window.liveSocket=pu;})();
 /**
  * Prism: Lightweight, robust, elegant syntax highlighting
  *
@@ -36383,4 +54,4 @@ bootstrap/dist/js/bootstrap.esm.js:
     * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
     *)
 */
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9qcXVlcnkvZGlzdC9qcXVlcnkuanMiLCAiLi4vLi4vLi4vYXNzZXRzL3ZlbmRvci9wcmlzbS5qcyIsICIuLi8uLi8uLi9hc3NldHMvdmVuZG9yL3RvcGJhci5qcyIsICIuLi8uLi8uLi9hc3NldHMvanMvYXBwLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2luZGV4LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2VudW1zLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXROb2RlTmFtZS5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcHBseVN0eWxlcy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21hdGguanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvdXNlckFnZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc0xheW91dFZpZXdwb3J0LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldExheW91dFJlY3QuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2NvbnRhaW5zLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1RhYmxlRWxlbWVudC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRQYXJlbnROb2RlLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3dpdGhpbi5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXJyb3cuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0VmFyaWF0aW9uLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRWaWV3cG9ydFJlY3QuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50UmVjdC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNTY3JvbGxQYXJlbnQuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFNjcm9sbFBhcmVudC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9mbGlwLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9oaWRlLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9vZmZzZXQuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QWx0QXhpcy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRIVE1MRWxlbWVudFNjcm9sbC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZVNjcm9sbC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9vcmRlck1vZGlmaWVycy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZWJvdW5jZS5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZUJ5TmFtZS5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9jcmVhdGVQb3BwZXIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLWxpdGUuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy9kb20vZGF0YS5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9pbmRleC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvZG9tL2V2ZW50LWhhbmRsZXIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2RvbS9tYW5pcHVsYXRvci5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9jb25maWcuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2Jhc2UtY29tcG9uZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy9kb20vc2VsZWN0b3ItZW5naW5lLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy91dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2FsZXJ0LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy9idXR0b24uanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvc3dpcGUuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2Nhcm91c2VsLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy9jb2xsYXBzZS5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvZHJvcGRvd24uanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvYmFja2Ryb3AuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvZm9jdXN0cmFwLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy91dGlsL3Njcm9sbGJhci5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvbW9kYWwuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL29mZmNhbnZhcy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9zYW5pdGl6ZXIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvdGVtcGxhdGUtZmFjdG9yeS5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdG9vbHRpcC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvcG9wb3Zlci5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvc2Nyb2xsc3B5LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy90YWIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3RvYXN0LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9qcy9yZXBvc2l0b3J5LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9qcy9rbXhfYW5pbS5qcyIsICIuLi8uLi8uLi9hc3NldHMvanMva214X2NvbG9ycy5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfaHRtbC9wcml2L3N0YXRpYy9waG9lbml4X2h0bWwuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3V0aWxzLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jb25zdGFudHMuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3B1c2guanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3RpbWVyLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jaGFubmVsLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9hamF4LmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9sb25ncG9sbC5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvcHJlc2VuY2UuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NlcmlhbGl6ZXIuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NvY2tldC5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9jb25zdGFudHMuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZW50cnlfdXBsb2FkZXIuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXRpbHMuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYnJvd3Nlci5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb20uanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXBsb2FkX2VudHJ5LmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2xpdmVfdXBsb2FkZXIuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvaG9va3MuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZG9tX3Bvc3RfbW9ycGhfcmVzdG9yZXIuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvbm9kZV9tb2R1bGVzL21vcnBoZG9tL2Rpc3QvbW9ycGhkb20tZXNtLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2RvbV9wYXRjaC5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9yZW5kZXJlZC5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy92aWV3X2hvb2suanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvanMuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdmlldy5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9saXZlX3NvY2tldC5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyohXG4gKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYzLjcuMVxuICogaHR0cHM6Ly9qcXVlcnkuY29tL1xuICpcbiAqIENvcHlyaWdodCBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAyMy0wOC0yOFQxMzozN1pcbiAqL1xuKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyBGb3IgQ29tbW9uSlMgYW5kIENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHdoZXJlIGEgcHJvcGVyIGB3aW5kb3dgXG5cdFx0Ly8gaXMgcHJlc2VudCwgZXhlY3V0ZSB0aGUgZmFjdG9yeSBhbmQgZ2V0IGpRdWVyeS5cblx0XHQvLyBGb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGhhdmUgYSBgd2luZG93YCB3aXRoIGEgYGRvY3VtZW50YFxuXHRcdC8vIChzdWNoIGFzIE5vZGUuanMpLCBleHBvc2UgYSBmYWN0b3J5IGFzIG1vZHVsZS5leHBvcnRzLlxuXHRcdC8vIFRoaXMgYWNjZW50dWF0ZXMgdGhlIG5lZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIHJlYWwgYHdpbmRvd2AuXG5cdFx0Ly8gZS5nLiB2YXIgalF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKSh3aW5kb3cpO1xuXHRcdC8vIFNlZSB0aWNrZXQgdHJhYy0xNDU0OSBmb3IgbW9yZSBpbmZvLlxuXHRcdG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50ID9cblx0XHRcdGZhY3RvcnkoIGdsb2JhbCwgdHJ1ZSApIDpcblx0XHRcdGZ1bmN0aW9uKCB3ICkge1xuXHRcdFx0XHRpZiAoICF3LmRvY3VtZW50ICkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggXCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50XCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeSggdyApO1xuXHRcdFx0fTtcblx0fSBlbHNlIHtcblx0XHRmYWN0b3J5KCBnbG9iYWwgKTtcblx0fVxuXG4vLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldFxufSApKCB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7XG5cbi8vIEVkZ2UgPD0gMTIgLSAxMyssIEZpcmVmb3ggPD0xOCAtIDQ1KywgSUUgMTAgLSAxMSwgU2FmYXJpIDUuMSAtIDkrLCBpT1MgNiAtIDkuMVxuLy8gdGhyb3cgZXhjZXB0aW9ucyB3aGVuIG5vbi1zdHJpY3QgY29kZSAoZS5nLiwgQVNQLk5FVCA0LjUpIGFjY2Vzc2VzIHN0cmljdCBtb2RlXG4vLyBhcmd1bWVudHMuY2FsbGVlLmNhbGxlciAodHJhYy0xMzMzNSkuIEJ1dCBhcyBvZiBqUXVlcnkgMy4wICgyMDE2KSwgc3RyaWN0IG1vZGUgc2hvdWxkIGJlIGNvbW1vblxuLy8gZW5vdWdoIHRoYXQgYWxsIHN1Y2ggYXR0ZW1wdHMgYXJlIGd1YXJkZWQgaW4gYSB0cnkgYmxvY2suXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIGFyciA9IFtdO1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cbnZhciBzbGljZSA9IGFyci5zbGljZTtcblxudmFyIGZsYXQgPSBhcnIuZmxhdCA/IGZ1bmN0aW9uKCBhcnJheSApIHtcblx0cmV0dXJuIGFyci5mbGF0LmNhbGwoIGFycmF5ICk7XG59IDogZnVuY3Rpb24oIGFycmF5ICkge1xuXHRyZXR1cm4gYXJyLmNvbmNhdC5hcHBseSggW10sIGFycmF5ICk7XG59O1xuXG5cbnZhciBwdXNoID0gYXJyLnB1c2g7XG5cbnZhciBpbmRleE9mID0gYXJyLmluZGV4T2Y7XG5cbnZhciBjbGFzczJ0eXBlID0ge307XG5cbnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7XG5cbnZhciBoYXNPd24gPSBjbGFzczJ0eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgZm5Ub1N0cmluZyA9IGhhc093bi50b1N0cmluZztcblxudmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTtcblxudmFyIHN1cHBvcnQgPSB7fTtcblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uKCBvYmogKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD01NywgRmlyZWZveCA8PTUyXG5cdFx0Ly8gSW4gc29tZSBicm93c2VycywgdHlwZW9mIHJldHVybnMgXCJmdW5jdGlvblwiIGZvciBIVE1MIDxvYmplY3Q+IGVsZW1lbnRzXG5cdFx0Ly8gKGkuZS4sIGB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvYmplY3RcIiApID09PSBcImZ1bmN0aW9uXCJgKS5cblx0XHQvLyBXZSBkb24ndCB3YW50IHRvIGNsYXNzaWZ5ICphbnkqIERPTSBub2RlIGFzIGEgZnVuY3Rpb24uXG5cdFx0Ly8gU3VwcG9ydDogUXRXZWIgPD0zLjguNSwgV2ViS2l0IDw9NTM0LjM0LCB3a2h0bWx0b3BkZiB0b29sIDw9MC4xMi41XG5cdFx0Ly8gUGx1cyBmb3Igb2xkIFdlYktpdCwgdHlwZW9mIHJldHVybnMgXCJmdW5jdGlvblwiIGZvciBIVE1MIGNvbGxlY3Rpb25zXG5cdFx0Ly8gKGUuZy4sIGB0eXBlb2YgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJkaXZcIikgPT09IFwiZnVuY3Rpb25cImApLiAoZ2gtNDc1Nilcblx0XHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBvYmoubm9kZVR5cGUgIT09IFwibnVtYmVyXCIgJiZcblx0XHRcdHR5cGVvZiBvYmouaXRlbSAhPT0gXCJmdW5jdGlvblwiO1xuXHR9O1xuXG5cbnZhciBpc1dpbmRvdyA9IGZ1bmN0aW9uIGlzV2luZG93KCBvYmogKSB7XG5cdFx0cmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PT0gb2JqLndpbmRvdztcblx0fTtcblxuXG52YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG5cblxuXG5cdHZhciBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzID0ge1xuXHRcdHR5cGU6IHRydWUsXG5cdFx0c3JjOiB0cnVlLFxuXHRcdG5vbmNlOiB0cnVlLFxuXHRcdG5vTW9kdWxlOiB0cnVlXG5cdH07XG5cblx0ZnVuY3Rpb24gRE9NRXZhbCggY29kZSwgbm9kZSwgZG9jICkge1xuXHRcdGRvYyA9IGRvYyB8fCBkb2N1bWVudDtcblxuXHRcdHZhciBpLCB2YWwsXG5cdFx0XHRzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggXCJzY3JpcHRcIiApO1xuXG5cdFx0c2NyaXB0LnRleHQgPSBjb2RlO1xuXHRcdGlmICggbm9kZSApIHtcblx0XHRcdGZvciAoIGkgaW4gcHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDY0KywgRWRnZSAxOCtcblx0XHRcdFx0Ly8gU29tZSBicm93c2VycyBkb24ndCBzdXBwb3J0IHRoZSBcIm5vbmNlXCIgcHJvcGVydHkgb24gc2NyaXB0cy5cblx0XHRcdFx0Ly8gT24gdGhlIG90aGVyIGhhbmQsIGp1c3QgdXNpbmcgYGdldEF0dHJpYnV0ZWAgaXMgbm90IGVub3VnaCBhc1xuXHRcdFx0XHQvLyB0aGUgYG5vbmNlYCBhdHRyaWJ1dGUgaXMgcmVzZXQgdG8gYW4gZW1wdHkgc3RyaW5nIHdoZW5ldmVyIGl0XG5cdFx0XHRcdC8vIGJlY29tZXMgYnJvd3NpbmctY29udGV4dCBjb25uZWN0ZWQuXG5cdFx0XHRcdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL2h0bWwvaXNzdWVzLzIzNjlcblx0XHRcdFx0Ly8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI25vbmNlLWF0dHJpYnV0ZXNcblx0XHRcdFx0Ly8gVGhlIGBub2RlLmdldEF0dHJpYnV0ZWAgY2hlY2sgd2FzIGFkZGVkIGZvciB0aGUgc2FrZSBvZlxuXHRcdFx0XHQvLyBgalF1ZXJ5Lmdsb2JhbEV2YWxgIHNvIHRoYXQgaXQgY2FuIGZha2UgYSBub25jZS1jb250YWluaW5nIG5vZGVcblx0XHRcdFx0Ly8gdmlhIGFuIG9iamVjdC5cblx0XHRcdFx0dmFsID0gbm9kZVsgaSBdIHx8IG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKCBpICk7XG5cdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoIGksIHZhbCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGRvYy5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHQgKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIHRvVHlwZSggb2JqICkge1xuXHRpZiAoIG9iaiA9PSBudWxsICkge1xuXHRcdHJldHVybiBvYmogKyBcIlwiO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5IChmdW5jdGlvbmlzaCBSZWdFeHApXG5cdHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiA/XG5cdFx0Y2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCBcIm9iamVjdFwiIDpcblx0XHR0eXBlb2Ygb2JqO1xufVxuLyogZ2xvYmFsIFN5bWJvbCAqL1xuLy8gRGVmaW5pbmcgdGhpcyBnbG9iYWwgaW4gLmVzbGludHJjLmpzb24gd291bGQgY3JlYXRlIGEgZGFuZ2VyIG9mIHVzaW5nIHRoZSBnbG9iYWxcbi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBkZWZpbmUgZ2xvYmFsIG9ubHkgZm9yIHRoaXMgbW9kdWxlXG5cblxuXG52YXIgdmVyc2lvbiA9IFwiMy43LjFcIixcblxuXHRyaHRtbFN1ZmZpeCA9IC9IVE1MJC9pLFxuXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XG5cdGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblxuXHRcdC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJ1xuXHRcdC8vIE5lZWQgaW5pdCBpZiBqUXVlcnkgaXMgY2FsbGVkIChqdXN0IGFsbG93IGVycm9yIHRvIGJlIHRocm93biBpZiBub3QgaW5jbHVkZWQpXG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQgKTtcblx0fTtcblxualF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHtcblxuXHQvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkXG5cdGpxdWVyeTogdmVyc2lvbixcblxuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LFxuXG5cdC8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMFxuXHRsZW5ndGg6IDAsXG5cblx0dG9BcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0fSxcblxuXHQvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SXG5cdC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5XG5cdGdldDogZnVuY3Rpb24oIG51bSApIHtcblxuXHRcdC8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXlcblx0XHRpZiAoIG51bSA9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4ganVzdCB0aGUgb25lIGVsZW1lbnQgZnJvbSB0aGUgc2V0XG5cdFx0cmV0dXJuIG51bSA8IDAgPyB0aGlzWyBudW0gKyB0aGlzLmxlbmd0aCBdIDogdGhpc1sgbnVtIF07XG5cdH0sXG5cblx0Ly8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFja1xuXHQvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldClcblx0cHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cblx0XHQvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldFxuXHRcdHZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTtcblxuXHRcdC8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpXG5cdFx0cmV0LnByZXZPYmplY3QgPSB0aGlzO1xuXG5cdFx0Ly8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXRcblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdC8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuXG5cdGVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7XG5cdH0sXG5cblx0bWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0c2xpY2U6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApICk7XG5cdH0sXG5cblx0Zmlyc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVxKCAwICk7XG5cdH0sXG5cblx0bGFzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIC0xICk7XG5cdH0sXG5cblx0ZXZlbjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkuZ3JlcCggdGhpcywgZnVuY3Rpb24oIF9lbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuICggaSArIDEgKSAlIDI7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0b2RkOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5ncmVwKCB0aGlzLCBmdW5jdGlvbiggX2VsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gaSAlIDI7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0ZXE6IGZ1bmN0aW9uKCBpICkge1xuXHRcdHZhciBsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdGogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApO1xuXHR9LFxuXG5cdGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCB0aGlzLmNvbnN0cnVjdG9yKCk7XG5cdH0sXG5cblx0Ly8gRm9yIGludGVybmFsIHVzZSBvbmx5LlxuXHQvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC5cblx0cHVzaDogcHVzaCxcblx0c29ydDogYXJyLnNvcnQsXG5cdHNwbGljZTogYXJyLnNwbGljZVxufTtcblxualF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHtcblx0dmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lLFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgMCBdIHx8IHt9LFxuXHRcdGkgPSAxLFxuXHRcdGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cdFx0ZGVlcCA9IGZhbHNlO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKCB0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRkZWVwID0gdGFyZ2V0O1xuXG5cdFx0Ly8gU2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgaSBdIHx8IHt9O1xuXHRcdGkrKztcblx0fVxuXG5cdC8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KVxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgIT09IFwib2JqZWN0XCIgJiYgIWlzRnVuY3Rpb24oIHRhcmdldCApICkge1xuXHRcdHRhcmdldCA9IHt9O1xuXHR9XG5cblx0Ly8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkXG5cdGlmICggaSA9PT0gbGVuZ3RoICkge1xuXHRcdHRhcmdldCA9IHRoaXM7XG5cdFx0aS0tO1xuXHR9XG5cblx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKCAoIG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSApICE9IG51bGwgKSB7XG5cblx0XHRcdC8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3Rcblx0XHRcdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IE9iamVjdC5wcm90b3R5cGUgcG9sbHV0aW9uXG5cdFx0XHRcdC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3Bcblx0XHRcdFx0aWYgKCBuYW1lID09PSBcIl9fcHJvdG9fX1wiIHx8IHRhcmdldCA9PT0gY29weSApIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5c1xuXHRcdFx0XHRpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHxcblx0XHRcdFx0XHQoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHtcblx0XHRcdFx0XHRzcmMgPSB0YXJnZXRbIG5hbWUgXTtcblxuXHRcdFx0XHRcdC8vIEVuc3VyZSBwcm9wZXIgdHlwZSBmb3IgdGhlIHNvdXJjZSB2YWx1ZVxuXHRcdFx0XHRcdGlmICggY29weUlzQXJyYXkgJiYgIUFycmF5LmlzQXJyYXkoIHNyYyApICkge1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSBbXTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAhY29weUlzQXJyYXkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBzcmMgKSApIHtcblx0XHRcdFx0XHRcdGNsb25lID0ge307XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb3B5SXNBcnJheSA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0Ly8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtXG5cdFx0XHRcdFx0dGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCBjbG9uZSwgY29weSApO1xuXG5cdFx0XHRcdC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXNcblx0XHRcdFx0fSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0gY29weTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0XG5cdHJldHVybiB0YXJnZXQ7XG59O1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gVW5pcXVlIGZvciBlYWNoIGNvcHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlXG5cdGV4cGFuZG86IFwialF1ZXJ5XCIgKyAoIHZlcnNpb24gKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xcRC9nLCBcIlwiICksXG5cblx0Ly8gQXNzdW1lIGpRdWVyeSBpcyByZWFkeSB3aXRob3V0IHRoZSByZWFkeSBtb2R1bGVcblx0aXNSZWFkeTogdHJ1ZSxcblxuXHRlcnJvcjogZnVuY3Rpb24oIG1zZyApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xuXHR9LFxuXG5cdG5vb3A6IGZ1bmN0aW9uKCkge30sXG5cblx0aXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblx0XHR2YXIgcHJvdG8sIEN0b3I7XG5cblx0XHQvLyBEZXRlY3Qgb2J2aW91cyBuZWdhdGl2ZXNcblx0XHQvLyBVc2UgdG9TdHJpbmcgaW5zdGVhZCBvZiBqUXVlcnkudHlwZSB0byBjYXRjaCBob3N0IG9iamVjdHNcblx0XHRpZiAoICFvYmogfHwgdG9TdHJpbmcuY2FsbCggb2JqICkgIT09IFwiW29iamVjdCBPYmplY3RdXCIgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cHJvdG8gPSBnZXRQcm90byggb2JqICk7XG5cblx0XHQvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluXG5cdFx0aWYgKCAhcHJvdG8gKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBPYmplY3RzIHdpdGggcHJvdG90eXBlIGFyZSBwbGFpbiBpZmYgdGhleSB3ZXJlIGNvbnN0cnVjdGVkIGJ5IGEgZ2xvYmFsIE9iamVjdCBmdW5jdGlvblxuXHRcdEN0b3IgPSBoYXNPd24uY2FsbCggcHJvdG8sIFwiY29uc3RydWN0b3JcIiApICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuXHRcdHJldHVybiB0eXBlb2YgQ3RvciA9PT0gXCJmdW5jdGlvblwiICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZztcblx0fSxcblxuXHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBuYW1lO1xuXG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdC8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIHByb3ZpZGVkIGNvbnRleHQ7IGZhbGxzIGJhY2sgdG8gdGhlIGdsb2JhbCBvbmVcblx0Ly8gaWYgbm90IHNwZWNpZmllZC5cblx0Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGNvZGUsIG9wdGlvbnMsIGRvYyApIHtcblx0XHRET01FdmFsKCBjb2RlLCB7IG5vbmNlOiBvcHRpb25zICYmIG9wdGlvbnMubm9uY2UgfSwgZG9jICk7XG5cdH0sXG5cblx0ZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGxlbmd0aCwgaSA9IDA7XG5cblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHtcblx0XHRcdGxlbmd0aCA9IG9iai5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBvYmogKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iajtcblx0fSxcblxuXG5cdC8vIFJldHJpZXZlIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2Rlc1xuXHR0ZXh0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbm9kZSxcblx0XHRcdHJldCA9IFwiXCIsXG5cdFx0XHRpID0gMCxcblx0XHRcdG5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdGlmICggIW5vZGVUeXBlICkge1xuXG5cdFx0XHQvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheVxuXHRcdFx0d2hpbGUgKCAoIG5vZGUgPSBlbGVtWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIERvIG5vdCB0cmF2ZXJzZSBjb21tZW50IG5vZGVzXG5cdFx0XHRcdHJldCArPSBqUXVlcnkudGV4dCggbm9kZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSAxMSApIHtcblx0XHRcdHJldHVybiBlbGVtLnRleHRDb250ZW50O1xuXHRcdH1cblx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZG9jdW1lbnRFbGVtZW50LnRleHRDb250ZW50O1xuXHRcdH1cblx0XHRpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkge1xuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZVZhbHVlO1xuXHRcdH1cblxuXHRcdC8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2Rlc1xuXG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LFxuXHRcdFx0XHRcdHR5cGVvZiBhcnIgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFx0WyBhcnIgXSA6IGFyclxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5jYWxsKCByZXQsIGFyciApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0aW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHtcblx0XHRyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7XG5cdH0sXG5cblx0aXNYTUxEb2M6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lc3BhY2UgPSBlbGVtICYmIGVsZW0ubmFtZXNwYWNlVVJJLFxuXHRcdFx0ZG9jRWxlbSA9IGVsZW0gJiYgKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdC8vIEFzc3VtZSBIVE1MIHdoZW4gZG9jdW1lbnRFbGVtZW50IGRvZXNuJ3QgeWV0IGV4aXN0LCBzdWNoIGFzIGluc2lkZVxuXHRcdC8vIGRvY3VtZW50IGZyYWdtZW50cy5cblx0XHRyZXR1cm4gIXJodG1sU3VmZml4LnRlc3QoIG5hbWVzcGFjZSB8fCBkb2NFbGVtICYmIGRvY0VsZW0ubm9kZU5hbWUgfHwgXCJIVE1MXCIgKTtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRtZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7XG5cdFx0dmFyIGxlbiA9ICtzZWNvbmQubGVuZ3RoLFxuXHRcdFx0aiA9IDAsXG5cdFx0XHRpID0gZmlyc3QubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTtcblx0XHR9XG5cblx0XHRmaXJzdC5sZW5ndGggPSBpO1xuXG5cdFx0cmV0dXJuIGZpcnN0O1xuXHR9LFxuXG5cdGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHtcblx0XHR2YXIgY2FsbGJhY2tJbnZlcnNlLFxuXHRcdFx0bWF0Y2hlcyA9IFtdLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0XHRjYWxsYmFja0V4cGVjdCA9ICFpbnZlcnQ7XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zXG5cdFx0Ly8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cblx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdGNhbGxiYWNrSW52ZXJzZSA9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApO1xuXHRcdFx0aWYgKCBjYWxsYmFja0ludmVyc2UgIT09IGNhbGxiYWNrRXhwZWN0ICkge1xuXHRcdFx0XHRtYXRjaGVzLnB1c2goIGVsZW1zWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlcztcblx0fSxcblxuXHQvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7XG5cdFx0dmFyIGxlbmd0aCwgdmFsdWUsXG5cdFx0XHRpID0gMCxcblx0XHRcdHJldCA9IFtdO1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyIG5ldyB2YWx1ZXNcblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBlbGVtcyApICkge1xuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCxcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBlbGVtcyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRcdHJldHVybiBmbGF0KCByZXQgKTtcblx0fSxcblxuXHQvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHNcblx0Z3VpZDogMSxcblxuXHQvLyBqUXVlcnkuc3VwcG9ydCBpcyBub3QgdXNlZCBpbiBDb3JlIGJ1dCBvdGhlciBwcm9qZWN0cyBhdHRhY2ggdGhlaXJcblx0Ly8gcHJvcGVydGllcyB0byBpdCBzbyBpdCBuZWVkcyB0byBleGlzdC5cblx0c3VwcG9ydDogc3VwcG9ydFxufSApO1xuXG5pZiAoIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiApIHtcblx0alF1ZXJ5LmZuWyBTeW1ib2wuaXRlcmF0b3IgXSA9IGFyclsgU3ltYm9sLml0ZXJhdG9yIF07XG59XG5cbi8vIFBvcHVsYXRlIHRoZSBjbGFzczJ0eXBlIG1hcFxualF1ZXJ5LmVhY2goIFwiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2xcIi5zcGxpdCggXCIgXCIgKSxcblx0ZnVuY3Rpb24oIF9pLCBuYW1lICkge1xuXHRcdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHR9ICk7XG5cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKCBvYmogKSB7XG5cblx0Ly8gU3VwcG9ydDogcmVhbCBpT1MgOC4yIG9ubHkgKG5vdCByZXByb2R1Y2libGUgaW4gc2ltdWxhdG9yKVxuXHQvLyBgaW5gIGNoZWNrIHVzZWQgdG8gcHJldmVudCBKSVQgZXJyb3IgKGdoLTIxNDUpXG5cdC8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlc1xuXHQvLyByZWdhcmRpbmcgTm9kZWxpc3QgbGVuZ3RoIGluIElFXG5cdHZhciBsZW5ndGggPSAhIW9iaiAmJiBcImxlbmd0aFwiIGluIG9iaiAmJiBvYmoubGVuZ3RoLFxuXHRcdHR5cGUgPSB0b1R5cGUoIG9iaiApO1xuXG5cdGlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB0eXBlID09PSBcImFycmF5XCIgfHwgbGVuZ3RoID09PSAwIHx8XG5cdFx0dHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajtcbn1cblxuXG5mdW5jdGlvbiBub2RlTmFtZSggZWxlbSwgbmFtZSApIHtcblxuXHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKTtcblxufVxudmFyIHBvcCA9IGFyci5wb3A7XG5cblxudmFyIHNvcnQgPSBhcnIuc29ydDtcblxuXG52YXIgc3BsaWNlID0gYXJyLnNwbGljZTtcblxuXG52YXIgd2hpdGVzcGFjZSA9IFwiW1xcXFx4MjBcXFxcdFxcXFxyXFxcXG5cXFxcZl1cIjtcblxuXG52YXIgcnRyaW1DU1MgPSBuZXcgUmVnRXhwKFxuXHRcIl5cIiArIHdoaXRlc3BhY2UgKyBcIit8KCg/Ol58W15cXFxcXFxcXF0pKD86XFxcXFxcXFwuKSopXCIgKyB3aGl0ZXNwYWNlICsgXCIrJFwiLFxuXHRcImdcIlxuKTtcblxuXG5cblxuLy8gTm90ZTogYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZlxualF1ZXJ5LmNvbnRhaW5zID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cdHZhciBidXAgPSBiICYmIGIucGFyZW50Tm9kZTtcblxuXHRyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmIChcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMStcblx0XHQvLyBJRSBkb2Vzbid0IGhhdmUgYGNvbnRhaW5zYCBvbiBTVkcuXG5cdFx0YS5jb250YWlucyA/XG5cdFx0XHRhLmNvbnRhaW5zKCBidXAgKSA6XG5cdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGJ1cCApICYgMTZcblx0KSApO1xufTtcblxuXG5cblxuLy8gQ1NTIHN0cmluZy9pZGVudGlmaWVyIHNlcmlhbGl6YXRpb25cbi8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3NvbS8jY29tbW9uLXNlcmlhbGl6aW5nLWlkaW9tc1xudmFyIHJjc3Nlc2NhcGUgPSAvKFtcXDAtXFx4MWZcXHg3Zl18Xi0/XFxkKXxeLSR8W15cXHg4MC1cXHVGRkZGXFx3LV0vZztcblxuZnVuY3Rpb24gZmNzc2VzY2FwZSggY2gsIGFzQ29kZVBvaW50ICkge1xuXHRpZiAoIGFzQ29kZVBvaW50ICkge1xuXG5cdFx0Ly8gVSswMDAwIE5VTEwgYmVjb21lcyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSXG5cdFx0aWYgKCBjaCA9PT0gXCJcXDBcIiApIHtcblx0XHRcdHJldHVybiBcIlxcdUZGRkRcIjtcblx0XHR9XG5cblx0XHQvLyBDb250cm9sIGNoYXJhY3RlcnMgYW5kIChkZXBlbmRlbnQgdXBvbiBwb3NpdGlvbikgbnVtYmVycyBnZXQgZXNjYXBlZCBhcyBjb2RlIHBvaW50c1xuXHRcdHJldHVybiBjaC5zbGljZSggMCwgLTEgKSArIFwiXFxcXFwiICsgY2guY2hhckNvZGVBdCggY2gubGVuZ3RoIC0gMSApLnRvU3RyaW5nKCAxNiApICsgXCIgXCI7XG5cdH1cblxuXHQvLyBPdGhlciBwb3RlbnRpYWxseS1zcGVjaWFsIEFTQ0lJIGNoYXJhY3RlcnMgZ2V0IGJhY2tzbGFzaC1lc2NhcGVkXG5cdHJldHVybiBcIlxcXFxcIiArIGNoO1xufVxuXG5qUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBmdW5jdGlvbiggc2VsICkge1xuXHRyZXR1cm4gKCBzZWwgKyBcIlwiICkucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApO1xufTtcblxuXG5cblxudmFyIHByZWZlcnJlZERvYyA9IGRvY3VtZW50LFxuXHRwdXNoTmF0aXZlID0gcHVzaDtcblxuKCBmdW5jdGlvbigpIHtcblxudmFyIGksXG5cdEV4cHIsXG5cdG91dGVybW9zdENvbnRleHQsXG5cdHNvcnRJbnB1dCxcblx0aGFzRHVwbGljYXRlLFxuXHRwdXNoID0gcHVzaE5hdGl2ZSxcblxuXHQvLyBMb2NhbCBkb2N1bWVudCB2YXJzXG5cdGRvY3VtZW50LFxuXHRkb2N1bWVudEVsZW1lbnQsXG5cdGRvY3VtZW50SXNIVE1MLFxuXHRyYnVnZ3lRU0EsXG5cdG1hdGNoZXMsXG5cblx0Ly8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YVxuXHRleHBhbmRvID0galF1ZXJ5LmV4cGFuZG8sXG5cdGRpcnJ1bnMgPSAwLFxuXHRkb25lID0gMCxcblx0Y2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRjb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0bm9ubmF0aXZlU2VsZWN0b3JDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8XCIgK1xuXHRcdFwibG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXN5bnRheC0zLyNpZGVudC10b2tlbi1kaWFncmFtXG5cdGlkZW50aWZpZXIgPSBcIig/OlxcXFxcXFxcW1xcXFxkYS1mQS1GXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIj98XFxcXFxcXFxbXlxcXFxyXFxcXG5cXFxcZl18W1xcXFx3LV18W15cXDAtXFxcXHg3Zl0pK1wiLFxuXG5cdC8vIEF0dHJpYnV0ZSBzZWxlY3RvcnM6IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnNcblx0YXR0cmlidXRlcyA9IFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XCIgKyB3aGl0ZXNwYWNlICtcblxuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblxuXHRcdC8vIFwiQXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIENTUyBpZGVudGlmaWVycyBbY2FwdHVyZSA1XSBvciBzdHJpbmdzIFtjYXB0dXJlIDMgb3IgY2FwdHVyZSA0XVwiXG5cdFx0XCIqKD86JygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwifChcIiArIGlkZW50aWZpZXIgKyBcIikpfClcIiArXG5cdFx0d2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsXG5cblx0cHNldWRvcyA9IFwiOihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcXFxcKChcIiArXG5cblx0XHQvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgcHJlRmlsdGVyLCBwcmVmZXIgYXJndW1lbnRzOlxuXHRcdC8vIDEuIHF1b3RlZCAoY2FwdHVyZSAzOyBjYXB0dXJlIDQgb3IgY2FwdHVyZSA1KVxuXHRcdFwiKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8XCIgK1xuXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXG5cdFx0Ly8gMy4gYW55dGhpbmcgZWxzZSAoY2FwdHVyZSAyKVxuXHRcdFwiLipcIiArXG5cdFx0XCIpXFxcXCl8KVwiLFxuXG5cdC8vIExlYWRpbmcgYW5kIG5vbi1lc2NhcGVkIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGNhcHR1cmluZyBzb21lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcHJlY2VkaW5nIHRoZSBsYXR0ZXJcblx0cndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgXCIrXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJsZWFkaW5nQ29tYmluYXRvciA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArXG5cdFx0d2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJkZXNjZW5kID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwifD5cIiApLFxuXG5cdHJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksXG5cdHJpZGVudGlmaWVyID0gbmV3IFJlZ0V4cCggXCJeXCIgKyBpZGVudGlmaWVyICsgXCIkXCIgKSxcblxuXHRtYXRjaEV4cHIgPSB7XG5cdFx0SUQ6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRDTEFTUzogbmV3IFJlZ0V4cCggXCJeXFxcXC4oXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRUQUc6IG5ldyBSZWdFeHAoIFwiXihcIiArIGlkZW50aWZpZXIgKyBcInxbKl0pXCIgKSxcblx0XHRBVFRSOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRQU0VVRE86IG5ldyBSZWdFeHAoIFwiXlwiICsgcHNldWRvcyApLFxuXHRcdENISUxEOiBuZXcgUmVnRXhwKFxuXHRcdFx0XCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXFxcKFwiICtcblx0XHRcdFx0d2hpdGVzcGFjZSArIFwiKihldmVufG9kZHwoKFsrLV18KShcXFxcZCopbnwpXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86KFsrLV18KVwiICtcblx0XHRcdFx0d2hpdGVzcGFjZSArIFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdGJvb2w6IG5ldyBSZWdFeHAoIFwiXig/OlwiICsgYm9vbGVhbnMgKyBcIikkXCIsIFwiaVwiICksXG5cblx0XHQvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKClcblx0XHQvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgXG5cdFx0bmVlZHNDb250ZXh0OiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXFxcKFwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcIiooKD86LVxcXFxkKT9cXFxcZCopXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KSg/PVteLV18JClcIiwgXCJpXCIgKVxuXHR9LFxuXG5cdHJpbnB1dHMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyaGVhZGVyID0gL15oXFxkJC9pLFxuXG5cdC8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9yc1xuXHRycXVpY2tFeHByID0gL14oPzojKFtcXHctXSspfChcXHcrKXxcXC4oW1xcdy1dKykpJC8sXG5cblx0cnNpYmxpbmcgPSAvWyt+XS8sXG5cblx0Ly8gQ1NTIGVzY2FwZXNcblx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnNcblx0cnVuZXNjYXBlID0gbmV3IFJlZ0V4cCggXCJcXFxcXFxcXFtcXFxcZGEtZkEtRl17MSw2fVwiICsgd2hpdGVzcGFjZSArXG5cdFx0XCI/fFxcXFxcXFxcKFteXFxcXHJcXFxcblxcXFxmXSlcIiwgXCJnXCIgKSxcblx0ZnVuZXNjYXBlID0gZnVuY3Rpb24oIGVzY2FwZSwgbm9uSGV4ICkge1xuXHRcdHZhciBoaWdoID0gXCIweFwiICsgZXNjYXBlLnNsaWNlKCAxICkgLSAweDEwMDAwO1xuXG5cdFx0aWYgKCBub25IZXggKSB7XG5cblx0XHRcdC8vIFN0cmlwIHRoZSBiYWNrc2xhc2ggcHJlZml4IGZyb20gYSBub24taGV4IGVzY2FwZSBzZXF1ZW5jZVxuXHRcdFx0cmV0dXJuIG5vbkhleDtcblx0XHR9XG5cblx0XHQvLyBSZXBsYWNlIGEgaGV4YWRlY2ltYWwgZXNjYXBlIHNlcXVlbmNlIHdpdGggdGhlIGVuY29kZWQgVW5pY29kZSBjb2RlIHBvaW50XG5cdFx0Ly8gU3VwcG9ydDogSUUgPD0xMStcblx0XHQvLyBGb3IgdmFsdWVzIG91dHNpZGUgdGhlIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSAoQk1QKSwgbWFudWFsbHkgY29uc3RydWN0IGFcblx0XHQvLyBzdXJyb2dhdGUgcGFpclxuXHRcdHJldHVybiBoaWdoIDwgMCA/XG5cdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDpcblx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2ggJiAweDNGRiB8IDB4REMwMCApO1xuXHR9LFxuXG5cdC8vIFVzZWQgZm9yIGlmcmFtZXM7IHNlZSBgc2V0RG9jdW1lbnRgLlxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErLCBFZGdlIDEyIC0gMTgrXG5cdC8vIFJlbW92aW5nIHRoZSBmdW5jdGlvbiB3cmFwcGVyIGNhdXNlcyBhIFwiUGVybWlzc2lvbiBEZW5pZWRcIlxuXHQvLyBlcnJvciBpbiBJRS9FZGdlLlxuXHR1bmxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0c2V0RG9jdW1lbnQoKTtcblx0fSxcblxuXHRpbkRpc2FibGVkRmllbGRzZXQgPSBhZGRDb21iaW5hdG9yKFxuXHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWUgJiYgbm9kZU5hbWUoIGVsZW0sIFwiZmllbGRzZXRcIiApO1xuXHRcdH0sXG5cdFx0eyBkaXI6IFwicGFyZW50Tm9kZVwiLCBuZXh0OiBcImxlZ2VuZFwiIH1cblx0KTtcblxuLy8gU3VwcG9ydDogSUUgPD05IG9ubHlcbi8vIEFjY2Vzc2luZyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGNhbiB0aHJvdyB1bmV4cGVjdGVkbHlcbi8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM5M1xuZnVuY3Rpb24gc2FmZUFjdGl2ZUVsZW1lbnQoKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cdH0gY2F0Y2ggKCBlcnIgKSB7IH1cbn1cblxuLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0IClcbnRyeSB7XG5cdHB1c2guYXBwbHkoXG5cdFx0KCBhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApICksXG5cdFx0cHJlZmVycmVkRG9jLmNoaWxkTm9kZXNcblx0KTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wXG5cdC8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHlcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHRhcnJbIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzLmxlbmd0aCBdLm5vZGVUeXBlO1xufSBjYXRjaCAoIGUgKSB7XG5cdHB1c2ggPSB7XG5cdFx0YXBwbHk6IGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHB1c2hOYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbCggZWxzICkgKTtcblx0XHR9LFxuXHRcdGNhbGw6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0XHRwdXNoTmF0aXZlLmFwcGx5KCB0YXJnZXQsIHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApICk7XG5cdFx0fVxuXHR9O1xufVxuXG5mdW5jdGlvbiBmaW5kKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XG5cblx0XHRpZiAoIGRvY3VtZW50SXNIVE1MICkge1xuXG5cdFx0XHQvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgXCJnZXQqQnkqXCIgRE9NIG1ldGhvZFxuXHRcdFx0Ly8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KVxuXHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMTEgJiYgKCBtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSApICkge1xuXG5cdFx0XHRcdC8vIElEIHNlbGVjdG9yXG5cdFx0XHRcdGlmICggKCBtID0gbWF0Y2hbIDEgXSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9jdW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSApICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDkgb25seVxuXHRcdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRcdGlmICggZWxlbS5pZCA9PT0gbSApIHtcblx0XHRcdFx0XHRcdFx0XHRwdXNoLmNhbGwoIHJlc3VsdHMsIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBFbGVtZW50IGNvbnRleHRcblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHRcdFx0XHRcdC8vIGdldEVsZW1lbnRCeUlkIGNhbiBtYXRjaCBlbGVtZW50cyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdGlmICggbmV3Q29udGV4dCAmJiAoIGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkgKSAmJlxuXHRcdFx0XHRcdFx0XHRmaW5kLmNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRwdXNoLmNhbGwoIHJlc3VsdHMsIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbIDIgXSApIHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdFx0Ly8gQ2xhc3Mgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggKCBtID0gbWF0Y2hbIDMgXSApICYmIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIG0gKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGxcblx0XHRcdGlmICggIW5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXSAmJlxuXHRcdFx0XHQoICFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBzZWxlY3RvciApICkgKSB7XG5cblx0XHRcdFx0bmV3U2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0XHRcdFx0bmV3Q29udGV4dCA9IGNvbnRleHQ7XG5cblx0XHRcdFx0Ly8gcVNBIGNvbnNpZGVycyBlbGVtZW50cyBvdXRzaWRlIGEgc2NvcGluZyByb290IHdoZW4gZXZhbHVhdGluZyBjaGlsZCBvclxuXHRcdFx0XHQvLyBkZXNjZW5kYW50IGNvbWJpbmF0b3JzLCB3aGljaCBpcyBub3Qgd2hhdCB3ZSB3YW50LlxuXHRcdFx0XHQvLyBJbiBzdWNoIGNhc2VzLCB3ZSB3b3JrIGFyb3VuZCB0aGUgYmVoYXZpb3IgYnkgcHJlZml4aW5nIGV2ZXJ5IHNlbGVjdG9yIGluIHRoZVxuXHRcdFx0XHQvLyBsaXN0IHdpdGggYW4gSUQgc2VsZWN0b3IgcmVmZXJlbmNpbmcgdGhlIHNjb3BlIGNvbnRleHQuXG5cdFx0XHRcdC8vIFRoZSB0ZWNobmlxdWUgaGFzIHRvIGJlIHVzZWQgYXMgd2VsbCB3aGVuIGEgbGVhZGluZyBjb21iaW5hdG9yIGlzIHVzZWRcblx0XHRcdFx0Ly8gYXMgc3VjaCBzZWxlY3RvcnMgYXJlIG5vdCByZWNvZ25pemVkIGJ5IHF1ZXJ5U2VsZWN0b3JBbGwuXG5cdFx0XHRcdC8vIFRoYW5rcyB0byBBbmRyZXcgRHVwb250IGZvciB0aGlzIHRlY2huaXF1ZS5cblx0XHRcdFx0aWYgKCBub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdCggcmRlc2NlbmQudGVzdCggc2VsZWN0b3IgKSB8fCBybGVhZGluZ0NvbWJpbmF0b3IudGVzdCggc2VsZWN0b3IgKSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzXG5cdFx0XHRcdFx0bmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8XG5cdFx0XHRcdFx0XHRjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gV2UgY2FuIHVzZSA6c2NvcGUgaW5zdGVhZCBvZiB0aGUgSUQgaGFjayBpZiB0aGUgYnJvd3NlclxuXHRcdFx0XHRcdC8vIHN1cHBvcnRzIGl0ICYgaWYgd2UncmUgbm90IGNoYW5naW5nIHRoZSBjb250ZXh0LlxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW5cblx0XHRcdFx0XHQvLyBzdHJpY3QtY29tcGFyaW5nIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRcdFx0aWYgKCBuZXdDb250ZXh0ICE9IGNvbnRleHQgfHwgIXN1cHBvcnQuc2NvcGUgKSB7XG5cblx0XHRcdFx0XHRcdC8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0XHRpZiAoICggbmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApICkgKSB7XG5cdFx0XHRcdFx0XHRcdG5pZCA9IGpRdWVyeS5lc2NhcGVTZWxlY3RvciggbmlkICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0LnNldEF0dHJpYnV0ZSggXCJpZFwiLCAoIG5pZCA9IGV4cGFuZG8gKSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZWZpeCBldmVyeSBzZWxlY3RvciBpbiB0aGUgbGlzdFxuXHRcdFx0XHRcdGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdFx0XHRcdGkgPSBncm91cHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0Z3JvdXBzWyBpIF0gPSAoIG5pZCA/IFwiI1wiICsgbmlkIDogXCI6c2NvcGVcIiApICsgXCIgXCIgK1xuXHRcdFx0XHRcdFx0XHR0b1NlbGVjdG9yKCBncm91cHNbIGkgXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCBcIixcIiApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0bmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0fSBjYXRjaCAoIHFzYUVycm9yICkge1xuXHRcdFx0XHRcdG5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGUoIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0aWYgKCBuaWQgPT09IGV4cGFuZG8gKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbUNTUywgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cblx0XHQvLyBVc2UgKGtleSArIFwiIFwiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXNcblx0XHQvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL2lzc3Vlcy8xNTcpXG5cdFx0aWYgKCBrZXlzLnB1c2goIGtleSArIFwiIFwiICkgPiBFeHByLmNhY2hlTGVuZ3RoICkge1xuXG5cdFx0XHQvLyBPbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXNcblx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07XG5cdFx0fVxuXHRcdHJldHVybiAoIGNhY2hlWyBrZXkgKyBcIiBcIiBdID0gdmFsdWUgKTtcblx0fVxuXHRyZXR1cm4gY2FjaGU7XG59XG5cbi8qKlxuICogTWFyayBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVzZSBieSBqUXVlcnkgc2VsZWN0b3IgbW9kdWxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZmllbGRzZXRcIiApO1xuXG5cdHRyeSB7XG5cdFx0cmV0dXJuICEhZm4oIGVsICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBmaW5hbGx5IHtcblxuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZWwucGFyZW50Tm9kZSApIHtcblx0XHRcdGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsICk7XG5cdFx0fVxuXG5cdFx0Ly8gcmVsZWFzZSBtZW1vcnkgaW4gSUVcblx0XHRlbCA9IG51bGw7XG5cdH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGlucHV0IHR5cGVzXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnB1dFBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgJiYgZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9uc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuICggbm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApIHx8IG5vZGVOYW1lKCBlbGVtLCBcImJ1dHRvblwiICkgKSAmJlxuXHRcdFx0ZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRpc2FibGVkIHRydWUgZm9yIDpkaXNhYmxlZDsgZmFsc2UgZm9yIDplbmFibGVkXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHtcblxuXHQvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGVcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkXG5cdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWRcblx0XHRpZiAoIFwiZm9ybVwiIGluIGVsZW0gKSB7XG5cblx0XHRcdC8vIENoZWNrIGZvciBpbmhlcml0ZWQgZGlzYWJsZWRuZXNzIG9uIHJlbGV2YW50IG5vbi1kaXNhYmxlZCBlbGVtZW50czpcblx0XHRcdC8vICogbGlzdGVkIGZvcm0tYXNzb2NpYXRlZCBlbGVtZW50cyBpbiBhIGRpc2FibGVkIGZpZWxkc2V0XG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1mZS1kaXNhYmxlZFxuXHRcdFx0Ly8gKiBvcHRpb24gZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0Ly8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkXG5cdFx0XHQvLyBBbGwgc3VjaCBlbGVtZW50cyBoYXZlIGEgXCJmb3JtXCIgcHJvcGVydHkuXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSAmJiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHQvLyBPcHRpb24gZWxlbWVudHMgZGVmZXIgdG8gYSBwYXJlbnQgb3B0Z3JvdXAgaWYgcHJlc2VudFxuXHRcdFx0XHRpZiAoIFwibGFiZWxcIiBpbiBlbGVtICkge1xuXHRcdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLnBhcmVudE5vZGUuZGlzYWJsZWQgPT09IGRpc2FibGVkO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDExK1xuXHRcdFx0XHQvLyBVc2UgdGhlIGlzRGlzYWJsZWQgc2hvcnRjdXQgcHJvcGVydHkgdG8gY2hlY2sgZm9yIGRpc2FibGVkIGZpZWxkc2V0IGFuY2VzdG9yc1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5pc0Rpc2FibGVkID09PSBkaXNhYmxlZCB8fFxuXG5cdFx0XHRcdFx0Ly8gV2hlcmUgdGhlcmUgaXMgbm8gaXNEaXNhYmxlZCwgY2hlY2sgbWFudWFsbHlcblx0XHRcdFx0XHRlbGVtLmlzRGlzYWJsZWQgIT09ICFkaXNhYmxlZCAmJlxuXHRcdFx0XHRcdFx0aW5EaXNhYmxlZEZpZWxkc2V0KCBlbGVtICkgPT09IGRpc2FibGVkO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cblx0XHQvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuXG5cdFx0Ly8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0XG5cdFx0Ly8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuXG5cdFx0fSBlbHNlIGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVtYWluaW5nIGVsZW1lbnRzIGFyZSBuZWl0aGVyIDplbmFibGVkIG5vciA6ZGlzYWJsZWRcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFsc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBhcmd1bWVudCApIHtcblx0XHRhcmd1bWVudCA9ICthcmd1bWVudDtcblx0XHRyZXR1cm4gbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoIGogPSBtYXRjaEluZGV4ZXNbIGkgXSApIF0gKSB7XG5cdFx0XHRcdFx0c2VlZFsgaiBdID0gISggbWF0Y2hlc1sgaiBdID0gc2VlZFsgaiBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0gKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgYSBub2RlIGZvciB2YWxpZGl0eSBhcyBhIGpRdWVyeSBzZWxlY3RvciBjb250ZXh0XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dFxuICogQHJldHVybnMge0VsZW1lbnR8T2JqZWN0fEJvb2xlYW59IFRoZSBpbnB1dCBub2RlIGlmIGFjY2VwdGFibGUsIG90aGVyd2lzZSBhIGZhbHN5IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkge1xuXHRyZXR1cm4gY29udGV4dCAmJiB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb250ZXh0O1xufVxuXG4vKipcbiAqIFNldHMgZG9jdW1lbnQtcmVsYXRlZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gW25vZGVdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKi9cbmZ1bmN0aW9uIHNldERvY3VtZW50KCBub2RlICkge1xuXHR2YXIgc3ViV2luZG93LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRpZiAoIGRvYyA9PSBkb2N1bWVudCB8fCBkb2Mubm9kZVR5cGUgIT09IDkgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQgKSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50O1xuXHR9XG5cblx0Ly8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZXNcblx0ZG9jdW1lbnQgPSBkb2M7XG5cdGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblx0ZG9jdW1lbnRJc0hUTUwgPSAhalF1ZXJ5LmlzWE1MRG9jKCBkb2N1bWVudCApO1xuXG5cdC8vIFN1cHBvcnQ6IGlPUyA3IG9ubHksIElFIDkgLSAxMStcblx0Ly8gT2xkZXIgYnJvd3NlcnMgZGlkbid0IHN1cHBvcnQgdW5wcmVmaXhlZCBgbWF0Y2hlc2AuXG5cdG1hdGNoZXMgPSBkb2N1bWVudEVsZW1lbnQubWF0Y2hlcyB8fFxuXHRcdGRvY3VtZW50RWxlbWVudC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2N1bWVudEVsZW1lbnQubXNNYXRjaGVzU2VsZWN0b3I7XG5cblx0Ly8gU3VwcG9ydDogSUUgOSAtIDExKywgRWRnZSAxMiAtIDE4K1xuXHQvLyBBY2Nlc3NpbmcgaWZyYW1lIGRvY3VtZW50cyBhZnRlciB1bmxvYWQgdGhyb3dzIFwicGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvcnNcblx0Ly8gKHNlZSB0cmFjLTEzOTM2KS5cblx0Ly8gTGltaXQgdGhlIGZpeCB0byBJRSAmIEVkZ2UgTGVnYWN5OyBkZXNwaXRlIEVkZ2UgMTUrIGltcGxlbWVudGluZyBgbWF0Y2hlc2AsXG5cdC8vIGFsbCBJRSA5KyBhbmQgRWRnZSBMZWdhY3kgdmVyc2lvbnMgaW1wbGVtZW50IGBtc01hdGNoZXNTZWxlY3RvcmAgYXMgd2VsbC5cblx0aWYgKCBkb2N1bWVudEVsZW1lbnQubXNNYXRjaGVzU2VsZWN0b3IgJiZcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0cHJlZmVycmVkRG9jICE9IGRvY3VtZW50ICYmXG5cdFx0KCBzdWJXaW5kb3cgPSBkb2N1bWVudC5kZWZhdWx0VmlldyApICYmIHN1YldpbmRvdy50b3AgIT09IHN1YldpbmRvdyApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTIgLSAxOCtcblx0XHRzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciApO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUUgPDEwXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRCeUlkIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZVxuXHQvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtbWF0aWNhbGx5LXNldCBuYW1lcyxcblx0Ly8gc28gdXNlIGEgcm91bmRhYm91dCBnZXRFbGVtZW50c0J5TmFtZSB0ZXN0XG5cdHN1cHBvcnQuZ2V0QnlJZCA9IGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggZWwgKS5pZCA9IGpRdWVyeS5leHBhbmRvO1xuXHRcdHJldHVybiAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgfHxcblx0XHRcdCFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggalF1ZXJ5LmV4cGFuZG8gKS5sZW5ndGg7XG5cdH0gKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdC8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUuXG5cdHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRyZXR1cm4gbWF0Y2hlcy5jYWxsKCBlbCwgXCIqXCIgKTtcblx0fSApO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTIgLSAxOCtcblx0Ly8gSUUvRWRnZSBkb24ndCBzdXBwb3J0IHRoZSA6c2NvcGUgcHNldWRvLWNsYXNzLlxuXHRzdXBwb3J0LnNjb3BlID0gYXNzZXJ0KCBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggXCI6c2NvcGVcIiApO1xuXHR9ICk7XG5cblx0Ly8gU3VwcG9ydDogQ2hyb21lIDEwNSAtIDExMSBvbmx5LCBTYWZhcmkgMTUuNCAtIDE2LjMgb25seVxuXHQvLyBNYWtlIHN1cmUgdGhlIGA6aGFzKClgIGFyZ3VtZW50IGlzIHBhcnNlZCB1bmZvcmdpdmluZ2x5LlxuXHQvLyBXZSBpbmNsdWRlIGAqYCBpbiB0aGUgdGVzdCB0byBkZXRlY3QgYnVnZ3kgaW1wbGVtZW50YXRpb25zIHRoYXQgYXJlXG5cdC8vIF9zZWxlY3RpdmVseV8gZm9yZ2l2aW5nIChzcGVjaWZpY2FsbHkgd2hlbiB0aGUgbGlzdCBpbmNsdWRlcyBhdCBsZWFzdFxuXHQvLyBvbmUgdmFsaWQgc2VsZWN0b3IpLlxuXHQvLyBOb3RlIHRoYXQgd2UgdHJlYXQgY29tcGxldGUgbGFjayBvZiBzdXBwb3J0IGZvciBgOmhhcygpYCBhcyBpZiBpdCB3ZXJlXG5cdC8vIHNwZWMtY29tcGxpYW50IHN1cHBvcnQsIHdoaWNoIGlzIGZpbmUgYmVjYXVzZSB1c2Ugb2YgYDpoYXMoKWAgaW4gc3VjaFxuXHQvLyBlbnZpcm9ubWVudHMgd2lsbCBmYWlsIGluIHRoZSBxU0EgcGF0aCBhbmQgZmFsbCBiYWNrIHRvIGpRdWVyeSB0cmF2ZXJzYWxcblx0Ly8gYW55d2F5LlxuXHRzdXBwb3J0LmNzc0hhcyA9IGFzc2VydCggZnVuY3Rpb24oKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIFwiOmhhcygqLDpqcWZha2UpXCIgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fSApO1xuXG5cdC8vIElEIGZpbHRlciBhbmQgZmluZFxuXHRpZiAoIHN1cHBvcnQuZ2V0QnlJZCApIHtcblx0XHRFeHByLmZpbHRlci5JRCA9IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cdFx0RXhwci5maW5kLklEID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRFeHByLmZpbHRlci5JRCA9ICBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBcImlkXCIgKTtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDcgb25seVxuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRFeHByLmZpbmQuSUQgPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0XHR2YXIgbm9kZSwgaSwgZWxlbXMsXG5cdFx0XHRcdFx0ZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtICkge1xuXG5cdFx0XHRcdFx0Ly8gVmVyaWZ5IHRoZSBpZCBhdHRyaWJ1dGVcblx0XHRcdFx0XHRub2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBcImlkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBlbGVtIF07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRmFsbCBiYWNrIG9uIGdldEVsZW1lbnRzQnlOYW1lXG5cdFx0XHRcdFx0ZWxlbXMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBpZCApO1xuXHRcdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKCBlbGVtID0gZWxlbXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdFx0XHRub2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBcImlkXCIgKTtcblx0XHRcdFx0XHRcdGlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0Ly8gVGFnXG5cdEV4cHIuZmluZC5UQUcgPSBmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHQvLyBEb2N1bWVudEZyYWdtZW50IG5vZGVzIGRvbid0IGhhdmUgZ0VCVE5cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIENsYXNzXG5cdEV4cHIuZmluZC5DTEFTUyA9IGZ1bmN0aW9uKCBjbGFzc05hbWUsIGNvbnRleHQgKSB7XG5cdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggY2xhc3NOYW1lICk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qIFFTQS9tYXRjaGVzU2VsZWN0b3Jcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnRcblxuXHRyYnVnZ3lRU0EgPSBbXTtcblxuXHQvLyBCdWlsZCBRU0EgcmVnZXhcblx0Ly8gUmVnZXggc3RyYXRlZ3kgYWRvcHRlZCBmcm9tIERpZWdvIFBlcmluaVxuXHRhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblxuXHRcdHZhciBpbnB1dDtcblxuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggZWwgKS5pbm5lckhUTUwgPVxuXHRcdFx0XCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+XCIgK1xuXHRcdFx0XCI8c2VsZWN0IGlkPSdcIiArIGV4cGFuZG8gKyBcIi1cXHJcXFxcJyBkaXNhYmxlZD0nZGlzYWJsZWQnPlwiICtcblx0XHRcdFwiPG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD5cIjtcblxuXHRcdC8vIFN1cHBvcnQ6IGlPUyA8PTcgLSA4IG9ubHlcblx0XHQvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kIFwidmFsdWVcIiBhcmUgbm90IHRyZWF0ZWQgY29ycmVjdGx5IGluIHNvbWUgWE1MIGRvY3VtZW50c1xuXHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW3NlbGVjdGVkXVwiICkubGVuZ3RoICkge1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooPzp2YWx1ZXxcIiArIGJvb2xlYW5zICsgXCIpXCIgKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBpT1MgPD03IC0gOCBvbmx5XG5cdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJbaWR+PVwiICsgZXhwYW5kbyArIFwiLV1cIiApLmxlbmd0aCApIHtcblx0XHRcdHJidWdneVFTQS5wdXNoKCBcIn49XCIgKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBpT1MgOCBvbmx5XG5cdFx0Ly8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MVxuXHRcdC8vIEluLXBhZ2UgYHNlbGVjdG9yI2lkIHNpYmxpbmctY29tYmluYXRvciBzZWxlY3RvcmAgZmFpbHNcblx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcImEjXCIgKyBleHBhbmRvICsgXCIrKlwiICkubGVuZ3RoICkge1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiLiMuK1srfl1cIiApO1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTEwNSssIEZpcmVmb3ggPD0xMDQrLCBTYWZhcmkgPD0xNS40K1xuXHRcdC8vIEluIHNvbWUgb2YgdGhlIGRvY3VtZW50IGtpbmRzLCB0aGVzZSBzZWxlY3RvcnMgd291bGRuJ3Qgd29yayBuYXRpdmVseS5cblx0XHQvLyBUaGlzIGlzIHByb2JhYmx5IE9LIGJ1dCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2Ugd2FudCB0byBtYWludGFpblxuXHRcdC8vIGhhbmRsaW5nIHRoZW0gdGhyb3VnaCBqUXVlcnkgdHJhdmVyc2FsIGluIGpRdWVyeSAzLnguXG5cdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCI6Y2hlY2tlZFwiICkubGVuZ3RoICkge1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmNoZWNrZWRcIiApO1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IFdpbmRvd3MgOCBOYXRpdmUgQXBwc1xuXHRcdC8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudFxuXHRcdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdGVsLmFwcGVuZENoaWxkKCBpbnB1dCApLnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwiRFwiICk7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErXG5cdFx0Ly8gSUUncyA6ZGlzYWJsZWQgc2VsZWN0b3IgZG9lcyBub3QgcGljayB1cCB0aGUgY2hpbGRyZW4gb2YgZGlzYWJsZWQgZmllbGRzZXRzXG5cdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MTA1KywgRmlyZWZveCA8PTEwNCssIFNhZmFyaSA8PTE1LjQrXG5cdFx0Ly8gSW4gc29tZSBvZiB0aGUgZG9jdW1lbnQga2luZHMsIHRoZXNlIHNlbGVjdG9ycyB3b3VsZG4ndCB3b3JrIG5hdGl2ZWx5LlxuXHRcdC8vIFRoaXMgaXMgcHJvYmFibHkgT0sgYnV0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3ZSB3YW50IHRvIG1haW50YWluXG5cdFx0Ly8gaGFuZGxpbmcgdGhlbSB0aHJvdWdoIGpRdWVyeSB0cmF2ZXJzYWwgaW4galF1ZXJ5IDMueC5cblx0XHRkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGVsICkuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbCggXCI6ZGlzYWJsZWRcIiApLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjplbmFibGVkXCIsIFwiOmRpc2FibGVkXCIgKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTUgLSAxOCtcblx0XHQvLyBJRSAxMS9FZGdlIGRvbid0IGZpbmQgZWxlbWVudHMgb24gYSBgW25hbWU9JyddYCBxdWVyeSBpbiBzb21lIGNhc2VzLlxuXHRcdC8vIEFkZGluZyBhIHRlbXBvcmFyeSBhdHRyaWJ1dGUgdG8gdGhlIGRvY3VtZW50IGJlZm9yZSB0aGUgc2VsZWN0aW9uIHdvcmtzXG5cdFx0Ly8gYXJvdW5kIHRoZSBpc3N1ZS5cblx0XHQvLyBJbnRlcmVzdGluZ2x5LCBJRSAxMCAmIG9sZGVyIGRvbid0IHNlZW0gdG8gaGF2ZSB0aGUgaXNzdWUuXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcIlwiICk7XG5cdFx0ZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XG5cdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJbbmFtZT0nJ11cIiApLmxlbmd0aCApIHtcblx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqbmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKj1cIiArXG5cdFx0XHRcdHdoaXRlc3BhY2UgKyBcIiooPzonJ3xcXFwiXFxcIilcIiApO1xuXHRcdH1cblx0fSApO1xuXG5cdGlmICggIXN1cHBvcnQuY3NzSGFzICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDEwNSAtIDExMCssIFNhZmFyaSAxNS40IC0gMTYuMytcblx0XHQvLyBPdXIgcmVndWxhciBgdHJ5LWNhdGNoYCBtZWNoYW5pc20gZmFpbHMgdG8gZGV0ZWN0IG5hdGl2ZWx5LXVuc3VwcG9ydGVkXG5cdFx0Ly8gcHNldWRvLWNsYXNzZXMgaW5zaWRlIGA6aGFzKClgIChzdWNoIGFzIGA6aGFzKDpjb250YWlucyhcIkZvb1wiKSlgKVxuXHRcdC8vIGluIGJyb3dzZXJzIHRoYXQgcGFyc2UgdGhlIGA6aGFzKClgIGFyZ3VtZW50IGFzIGEgZm9yZ2l2aW5nIHNlbGVjdG9yIGxpc3QuXG5cdFx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL3NlbGVjdG9ycy8jcmVsYXRpb25hbCBub3cgcmVxdWlyZXMgdGhlIGFyZ3VtZW50XG5cdFx0Ly8gdG8gYmUgcGFyc2VkIHVuZm9yZ2l2aW5nbHksIGJ1dCBicm93c2VycyBoYXZlIG5vdCB5ZXQgZnVsbHkgYWRqdXN0ZWQuXG5cdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmhhc1wiICk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKCBcInxcIiApICk7XG5cblx0LyogU29ydGluZ1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gRG9jdW1lbnQgb3JkZXIgc29ydGluZ1xuXHRzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHtcblxuXHRcdC8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsXG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdC8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb25cblx0XHR2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247XG5cdFx0aWYgKCBjb21wYXJlICkge1xuXHRcdFx0cmV0dXJuIGNvbXBhcmU7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsY3VsYXRlIHBvc2l0aW9uIGlmIGJvdGggaW5wdXRzIGJlbG9uZyB0byB0aGUgc2FtZSBkb2N1bWVudFxuXHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0Y29tcGFyZSA9ICggYS5vd25lckRvY3VtZW50IHx8IGEgKSA9PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgP1xuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkXG5cdFx0XHQxO1xuXG5cdFx0Ly8gRGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0aWYgKCBjb21wYXJlICYgMSB8fFxuXHRcdFx0KCAhc3VwcG9ydC5zb3J0RGV0YWNoZWQgJiYgYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYSApID09PSBjb21wYXJlICkgKSB7XG5cblx0XHRcdC8vIENob29zZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHJlbGF0ZWQgdG8gb3VyIHByZWZlcnJlZCBkb2N1bWVudFxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdGlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09IHByZWZlcnJlZERvYyAmJlxuXHRcdFx0XHRmaW5kLmNvbnRhaW5zKCBwcmVmZXJyZWREb2MsIGEgKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdFx0aWYgKCBiID09PSBkb2N1bWVudCB8fCBiLm93bmVyRG9jdW1lbnQgPT0gcHJlZmVycmVkRG9jICYmXG5cdFx0XHRcdGZpbmQuY29udGFpbnMoIHByZWZlcnJlZERvYywgYiApICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YuY2FsbCggc29ydElucHV0LCBhICkgLSBpbmRleE9mLmNhbGwoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21wYXJlICYgNCA/IC0xIDogMTtcblx0fTtcblxuXHRyZXR1cm4gZG9jdW1lbnQ7XG59XG5cbmZpbmQubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIGZpbmQoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7XG59O1xuXG5maW5kLm1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKCBlbGVtLCBleHByICkge1xuXHRzZXREb2N1bWVudCggZWxlbSApO1xuXG5cdGlmICggZG9jdW1lbnRJc0hUTUwgJiZcblx0XHQhbm9ubmF0aXZlU2VsZWN0b3JDYWNoZVsgZXhwciArIFwiIFwiIF0gJiZcblx0XHQoICFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblxuXHRcdFx0XHRcdC8vIEFzIHdlbGwsIGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUgc2FpZCB0byBiZSBpbiBhIGRvY3VtZW50XG5cdFx0XHRcdFx0Ly8gZnJhZ21lbnQgaW4gSUUgOVxuXHRcdFx0XHRcdGVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRub25uYXRpdmVTZWxlY3RvckNhY2hlKCBleHByLCB0cnVlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZpbmQoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7XG59O1xuXG5maW5kLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdGlmICggKCBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCApICE9IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdH1cblx0cmV0dXJuIGpRdWVyeS5jb250YWlucyggY29udGV4dCwgZWxlbSApO1xufTtcblxuXG5maW5kLmF0dHIgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblxuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0aWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cblx0XHQvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoc2VlIHRyYWMtMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRpZiAoIHZhbCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdHJldHVybiB2YWw7XG5cdH1cblxuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTtcbn07XG5cbmZpbmQuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkge1xuXHR0aHJvdyBuZXcgRXJyb3IoIFwiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogXCIgKyBtc2cgKTtcbn07XG5cbi8qKlxuICogRG9jdW1lbnQgc29ydGluZyBhbmQgcmVtb3ZpbmcgZHVwbGljYXRlc1xuICogQHBhcmFtIHtBcnJheUxpa2V9IHJlc3VsdHNcbiAqL1xualF1ZXJ5LnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHtcblx0dmFyIGVsZW0sXG5cdFx0ZHVwbGljYXRlcyA9IFtdLFxuXHRcdGogPSAwLFxuXHRcdGkgPSAwO1xuXG5cdC8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2Vcblx0Ly9cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCtcblx0Ly8gVGVzdGluZyBmb3IgZGV0ZWN0aW5nIGR1cGxpY2F0ZXMgaXMgdW5wcmVkaWN0YWJsZSBzbyBpbnN0ZWFkIGFzc3VtZSB3ZSBjYW4ndFxuXHQvLyBkZXBlbmQgb24gZHVwbGljYXRlIGRldGVjdGlvbiBpbiBhbGwgYnJvd3NlcnMgd2l0aG91dCBhIHN0YWJsZSBzb3J0LlxuXHRoYXNEdXBsaWNhdGUgPSAhc3VwcG9ydC5zb3J0U3RhYmxlO1xuXHRzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHNsaWNlLmNhbGwoIHJlc3VsdHMsIDAgKTtcblx0c29ydC5jYWxsKCByZXN1bHRzLCBzb3J0T3JkZXIgKTtcblxuXHRpZiAoIGhhc0R1cGxpY2F0ZSApIHtcblx0XHR3aGlsZSAoICggZWxlbSA9IHJlc3VsdHNbIGkrKyBdICkgKSB7XG5cdFx0XHRpZiAoIGVsZW0gPT09IHJlc3VsdHNbIGkgXSApIHtcblx0XHRcdFx0aiA9IGR1cGxpY2F0ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdHNwbGljZS5jYWxsKCByZXN1bHRzLCBkdXBsaWNhdGVzWyBqIF0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDbGVhciBpbnB1dCBhZnRlciBzb3J0aW5nIHRvIHJlbGVhc2Ugb2JqZWN0c1xuXHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjVcblx0c29ydElucHV0ID0gbnVsbDtcblxuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbmpRdWVyeS5mbi51bmlxdWVTb3J0ID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LnVuaXF1ZVNvcnQoIHNsaWNlLmFwcGx5KCB0aGlzICkgKSApO1xufTtcblxuRXhwciA9IGpRdWVyeS5leHByID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdEFUVFI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdG1hdGNoWyAxIF0gPSBtYXRjaFsgMSBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFsgMyBdID0gKCBtYXRjaFsgMyBdIHx8IG1hdGNoWyA0IF0gfHwgbWF0Y2hbIDUgXSB8fCBcIlwiIClcblx0XHRcdFx0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbIDIgXSA9PT0gXCJ+PVwiICkge1xuXHRcdFx0XHRtYXRjaFsgMyBdID0gXCIgXCIgKyBtYXRjaFsgMyBdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRDSElMRDogZnVuY3Rpb24oIG1hdGNoICkge1xuXG5cdFx0XHQvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByW1wiQ0hJTERcIl1cblx0XHRcdFx0MSB0eXBlIChvbmx5fG50aHwuLi4pXG5cdFx0XHRcdDIgd2hhdCAoY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0MyBhcmd1bWVudCAoZXZlbnxvZGR8XFxkKnxcXGQqbihbKy1dXFxkKyk/fC4uLilcblx0XHRcdFx0NCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cXGQqbnwpXG5cdFx0XHRcdDUgc2lnbiBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NiB4IG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ3IHNpZ24gb2YgeS1jb21wb25lbnRcblx0XHRcdFx0OCB5IG9mIHktY29tcG9uZW50XG5cdFx0XHQqL1xuXHRcdFx0bWF0Y2hbIDEgXSA9IG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0aWYgKCBtYXRjaFsgMSBdLnNsaWNlKCAwLCAzICkgPT09IFwibnRoXCIgKSB7XG5cblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbIDMgXSApIHtcblx0XHRcdFx0XHRmaW5kLmVycm9yKCBtYXRjaFsgMCBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBudW1lcmljIHggYW5kIHkgcGFyYW1ldGVycyBmb3IgRXhwci5maWx0ZXIuQ0hJTERcblx0XHRcdFx0Ly8gcmVtZW1iZXIgdGhhdCBmYWxzZS90cnVlIGNhc3QgcmVzcGVjdGl2ZWx5IHRvIDAvMVxuXHRcdFx0XHRtYXRjaFsgNCBdID0gKyggbWF0Y2hbIDQgXSA/XG5cdFx0XHRcdFx0bWF0Y2hbIDUgXSArICggbWF0Y2hbIDYgXSB8fCAxICkgOlxuXHRcdFx0XHRcdDIgKiAoIG1hdGNoWyAzIF0gPT09IFwiZXZlblwiIHx8IG1hdGNoWyAzIF0gPT09IFwib2RkXCIgKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRtYXRjaFsgNSBdID0gKyggKCBtYXRjaFsgNyBdICsgbWF0Y2hbIDggXSApIHx8IG1hdGNoWyAzIF0gPT09IFwib2RkXCIgKTtcblxuXHRcdFx0Ly8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFsgMyBdICkge1xuXHRcdFx0XHRmaW5kLmVycm9yKCBtYXRjaFsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0UFNFVURPOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHR2YXIgZXhjZXNzLFxuXHRcdFx0XHR1bnF1b3RlZCA9ICFtYXRjaFsgNiBdICYmIG1hdGNoWyAyIF07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByLkNISUxELnRlc3QoIG1hdGNoWyAwIF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWyAzIF0gKSB7XG5cdFx0XHRcdG1hdGNoWyAyIF0gPSBtYXRjaFsgNCBdIHx8IG1hdGNoWyA1IF0gfHwgXCJcIjtcblxuXHRcdFx0Ly8gU3RyaXAgZXhjZXNzIGNoYXJhY3RlcnMgZnJvbSB1bnF1b3RlZCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJlxuXG5cdFx0XHRcdC8vIEdldCBleGNlc3MgZnJvbSB0b2tlbml6ZSAocmVjdXJzaXZlbHkpXG5cdFx0XHRcdCggZXhjZXNzID0gdG9rZW5pemUoIHVucXVvdGVkLCB0cnVlICkgKSAmJlxuXG5cdFx0XHRcdC8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpc1xuXHRcdFx0XHQoIGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCApICkge1xuXG5cdFx0XHRcdC8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4XG5cdFx0XHRcdG1hdGNoWyAwIF0gPSBtYXRjaFsgMCBdLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdFx0bWF0Y2hbIDIgXSA9IHVucXVvdGVkLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTtcblx0XHR9XG5cdH0sXG5cblx0ZmlsdGVyOiB7XG5cblx0XHRUQUc6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIGV4cGVjdGVkTm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBub2RlTmFtZVNlbGVjdG9yID09PSBcIipcIiA/XG5cdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9IDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5vZGVOYW1lKCBlbGVtLCBleHBlY3RlZE5vZGVOYW1lICk7XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdENMQVNTOiBmdW5jdGlvbiggY2xhc3NOYW1lICkge1xuXHRcdFx0dmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyBcIiBcIiBdO1xuXG5cdFx0XHRyZXR1cm4gcGF0dGVybiB8fFxuXHRcdFx0XHQoIHBhdHRlcm4gPSBuZXcgUmVnRXhwKCBcIihefFwiICsgd2hpdGVzcGFjZSArIFwiKVwiICsgY2xhc3NOYW1lICtcblx0XHRcdFx0XHRcIihcIiArIHdoaXRlc3BhY2UgKyBcInwkKVwiICkgKSAmJlxuXHRcdFx0XHRjbGFzc0NhY2hlKCBjbGFzc05hbWUsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXR0ZXJuLnRlc3QoXG5cdFx0XHRcdFx0XHR0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHxcblx0XHRcdFx0XHRcdFx0dHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8XG5cdFx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9ICk7XG5cdFx0fSxcblxuXHRcdEFUVFI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBmaW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0XHRpZiAoIHJlc3VsdCA9PSBudWxsICkge1xuXHRcdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCIhPVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggIW9wZXJhdG9yICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0ICs9IFwiXCI7XG5cblx0XHRcdFx0aWYgKCBvcGVyYXRvciA9PT0gXCI9XCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdCA9PT0gY2hlY2s7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBvcGVyYXRvciA9PT0gXCIhPVwiICkge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQgIT09IGNoZWNrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggb3BlcmF0b3IgPT09IFwiXj1cIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBvcGVyYXRvciA9PT0gXCIqPVwiICkge1xuXHRcdFx0XHRcdHJldHVybiBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggb3BlcmF0b3IgPT09IFwiJD1cIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gY2hlY2sgJiYgcmVzdWx0LnNsaWNlKCAtY2hlY2subGVuZ3RoICkgPT09IGNoZWNrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggb3BlcmF0b3IgPT09IFwifj1cIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gKCBcIiBcIiArIHJlc3VsdC5yZXBsYWNlKCByd2hpdGVzcGFjZSwgXCIgXCIgKSArIFwiIFwiIClcblx0XHRcdFx0XHRcdC5pbmRleE9mKCBjaGVjayApID4gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBvcGVyYXRvciA9PT0gXCJ8PVwiICkge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0Q0hJTEQ6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0LCBfYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkge1xuXHRcdFx0dmFyIHNpbXBsZSA9IHR5cGUuc2xpY2UoIDAsIDMgKSAhPT0gXCJudGhcIixcblx0XHRcdFx0Zm9yd2FyZCA9IHR5cGUuc2xpY2UoIC00ICkgIT09IFwibGFzdFwiLFxuXHRcdFx0XHRvZlR5cGUgPSB3aGF0ID09PSBcIm9mLXR5cGVcIjtcblxuXHRcdFx0cmV0dXJuIGZpcnN0ID09PSAxICYmIGxhc3QgPT09IDAgP1xuXG5cdFx0XHRcdC8vIFNob3J0Y3V0IGZvciA6bnRoLSoobilcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuICEhZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0XHR9IDpcblxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgX2NvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIG91dGVyQ2FjaGUsIG5vZGUsIG5vZGVJbmRleCwgc3RhcnQsXG5cdFx0XHRcdFx0XHRkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyBcIm5leHRTaWJsaW5nXCIgOiBcInByZXZpb3VzU2libGluZ1wiLFxuXHRcdFx0XHRcdFx0cGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLFxuXHRcdFx0XHRcdFx0bmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksXG5cdFx0XHRcdFx0XHR1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZSxcblx0XHRcdFx0XHRcdGRpZmYgPSBmYWxzZTtcblxuXHRcdFx0XHRcdGlmICggcGFyZW50ICkge1xuXG5cdFx0XHRcdFx0XHQvLyA6KGZpcnN0fGxhc3R8b25seSktKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdFx0XHRpZiAoIHNpbXBsZSApIHtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCBkaXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG5vZGUgPSBub2RlWyBkaXIgXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlTmFtZSggbm9kZSwgbmFtZSApIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gUmV2ZXJzZSBkaXJlY3Rpb24gZm9yIDpvbmx5LSogKGlmIHdlIGhhdmVuJ3QgeWV0IGRvbmUgc28pXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnQgPSBkaXIgPSB0eXBlID09PSBcIm9ubHlcIiAmJiAhc3RhcnQgJiYgXCJuZXh0U2libGluZ1wiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdO1xuXG5cdFx0XHRcdFx0XHQvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YFxuXHRcdFx0XHRcdFx0aWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleFxuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gcGFyZW50WyBleHBhbmRvIF0gfHwgKCBwYXJlbnRbIGV4cGFuZG8gXSA9IHt9ICk7XG5cdFx0XHRcdFx0XHRcdGNhY2hlID0gb3V0ZXJDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRub2RlSW5kZXggPSBjYWNoZVsgMCBdID09PSBkaXJydW5zICYmIGNhY2hlWyAxIF07XG5cdFx0XHRcdFx0XHRcdGRpZmYgPSBub2RlSW5kZXggJiYgY2FjaGVbIDIgXTtcblx0XHRcdFx0XHRcdFx0bm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdCggZGlmZiA9IG5vZGVJbmRleCA9IDAgKSB8fCBzdGFydC5wb3AoKSApICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoIGVsZW1bIGV4cGFuZG8gXSA9IHt9ICk7XG5cdFx0XHRcdFx0XHRcdFx0Y2FjaGUgPSBvdXRlckNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRcdGRpZmYgPSBub2RlSW5kZXg7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyB4bWwgOm50aC1jaGlsZCguLi4pXG5cdFx0XHRcdFx0XHRcdC8vIG9yIDpudGgtbGFzdC1jaGlsZCguLi4pIG9yIDpudGgoLWxhc3QpPy1vZi10eXBlKC4uLilcblx0XHRcdFx0XHRcdFx0aWYgKCBkaWZmID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQoIGRpZmYgPSBub2RlSW5kZXggPSAwICkgfHwgc3RhcnQucG9wKCkgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGVOYW1lKCBub2RlLCBuYW1lICkgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0KytkaWZmICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQoIG5vZGVbIGV4cGFuZG8gXSA9IHt9ICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNpemVcblx0XHRcdFx0XHRcdGRpZmYgLT0gbGFzdDtcblx0XHRcdFx0XHRcdHJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0UFNFVURPOiBmdW5jdGlvbiggcHNldWRvLCBhcmd1bWVudCApIHtcblxuXHRcdFx0Ly8gcHNldWRvLWNsYXNzIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3Nlc1xuXHRcdFx0Ly8gUHJpb3JpdGl6ZSBieSBjYXNlIHNlbnNpdGl2aXR5IGluIGNhc2UgY3VzdG9tIHBzZXVkb3MgYXJlIGFkZGVkIHdpdGggdXBwZXJjYXNlIGxldHRlcnNcblx0XHRcdC8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3Ncblx0XHRcdHZhciBhcmdzLFxuXHRcdFx0XHRmbiA9IEV4cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdFx0ZmluZC5lcnJvciggXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiICsgcHNldWRvICk7XG5cblx0XHRcdC8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXRcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG5cdFx0XHQvLyBqdXN0IGFzIGpRdWVyeSBkb2VzXG5cdFx0XHRpZiAoIGZuWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHJldHVybiBmbiggYXJndW1lbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzXG5cdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdGFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCBcIlwiLCBhcmd1bWVudCBdO1xuXHRcdFx0XHRyZXR1cm4gRXhwci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID9cblx0XHRcdFx0XHRtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkge1xuXHRcdFx0XHRcdFx0dmFyIGlkeCxcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLFxuXHRcdFx0XHRcdFx0XHRpID0gbWF0Y2hlZC5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWR4ID0gaW5kZXhPZi5jYWxsKCBzZWVkLCBtYXRjaGVkWyBpIF0gKTtcblx0XHRcdFx0XHRcdFx0c2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbIGkgXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gKSA6XG5cdFx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZm47XG5cdFx0fVxuXHR9LFxuXG5cdHBzZXVkb3M6IHtcblxuXHRcdC8vIFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvc1xuXHRcdG5vdDogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cblx0XHRcdC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlXG5cdFx0XHQvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXG5cdFx0XHR2YXIgaW5wdXQgPSBbXSxcblx0XHRcdFx0cmVzdWx0cyA9IFtdLFxuXHRcdFx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW1DU1MsIFwiJDFcIiApICk7XG5cblx0XHRcdHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gP1xuXHRcdFx0XHRtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzLCBfY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHRcdFx0dW5tYXRjaGVkID0gbWF0Y2hlciggc2VlZCwgbnVsbCwgeG1sLCBbXSApLFxuXHRcdFx0XHRcdFx0aSA9IHNlZWQubGVuZ3RoO1xuXG5cdFx0XHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYFxuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSB1bm1hdGNoZWRbIGkgXSApICkge1xuXHRcdFx0XHRcdFx0XHRzZWVkWyBpIF0gPSAhKCBtYXRjaGVzWyBpIF0gPSBlbGVtICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgX2NvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHRpbnB1dFsgMCBdID0gZWxlbTtcblx0XHRcdFx0XHRtYXRjaGVyKCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1bHRzICk7XG5cblx0XHRcdFx0XHQvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50XG5cdFx0XHRcdFx0Ly8gKHNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9pc3N1ZXMvMjk5KVxuXHRcdFx0XHRcdGlucHV0WyAwIF0gPSBudWxsO1xuXHRcdFx0XHRcdHJldHVybiAhcmVzdWx0cy5wb3AoKTtcblx0XHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHRoYXM6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZmluZCggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwO1xuXHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHRjb250YWluczogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgalF1ZXJ5LnRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xO1xuXHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHQvLyBcIldoZXRoZXIgYW4gZWxlbWVudCBpcyByZXByZXNlbnRlZCBieSBhIDpsYW5nKCkgc2VsZWN0b3Jcblx0XHQvLyBpcyBiYXNlZCBzb2xlbHkgb24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZVxuXHRcdC8vIGJlaW5nIGVxdWFsIHRvIHRoZSBpZGVudGlmaWVyIEMsXG5cdFx0Ly8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50aWZpZXIgQyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBcIi1cIi5cblx0XHQvLyBUaGUgbWF0Y2hpbmcgb2YgQyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUgaXMgcGVyZm9ybWVkIGNhc2UtaW5zZW5zaXRpdmVseS5cblx0XHQvLyBUaGUgaWRlbnRpZmllciBDIGRvZXMgbm90IGhhdmUgdG8gYmUgYSB2YWxpZCBsYW5ndWFnZSBuYW1lLlwiXG5cdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG9cblx0XHRsYW5nOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBsYW5nICkge1xuXG5cdFx0XHQvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyXG5cdFx0XHRpZiAoICFyaWRlbnRpZmllci50ZXN0KCBsYW5nIHx8IFwiXCIgKSApIHtcblx0XHRcdFx0ZmluZC5lcnJvciggXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIiArIGxhbmcgKTtcblx0XHRcdH1cblx0XHRcdGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIGVsZW1MYW5nO1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0aWYgKCAoIGVsZW1MYW5nID0gZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0XHRcdFx0ZWxlbS5sYW5nIDpcblx0XHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKCBcInhtbDpsYW5nXCIgKSB8fCBlbGVtLmdldEF0dHJpYnV0ZSggXCJsYW5nXCIgKSApICkge1xuXG5cdFx0XHRcdFx0XHRlbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArIFwiLVwiICkgPT09IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IHdoaWxlICggKCBlbGVtID0gZWxlbS5wYXJlbnROb2RlICkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0gKSxcblxuXHRcdC8vIE1pc2NlbGxhbmVvdXNcblx0XHR0YXJnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7XG5cdFx0XHRyZXR1cm4gaGFzaCAmJiBoYXNoLnNsaWNlKCAxICkgPT09IGVsZW0uaWQ7XG5cdFx0fSxcblxuXHRcdHJvb3Q6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY3VtZW50RWxlbWVudDtcblx0XHR9LFxuXG5cdFx0Zm9jdXM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiZcblx0XHRcdFx0ZG9jdW1lbnQuaGFzRm9jdXMoKSAmJlxuXHRcdFx0XHQhISggZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCApO1xuXHRcdH0sXG5cblx0XHQvLyBCb29sZWFuIHByb3BlcnRpZXNcblx0XHRlbmFibGVkOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggZmFsc2UgKSxcblx0XHRkaXNhYmxlZDogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIHRydWUgKSxcblxuXHRcdGNoZWNrZWQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHNcblx0XHRcdC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0cmV0dXJuICggbm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICYmICEhZWxlbS5jaGVja2VkICkgfHxcblx0XHRcdFx0KCBub2RlTmFtZSggZWxlbSwgXCJvcHRpb25cIiApICYmICEhZWxlbS5zZWxlY3RlZCApO1xuXHRcdH0sXG5cblx0XHRzZWxlY3RlZDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTErXG5cdFx0XHQvLyBBY2Nlc3NpbmcgdGhlIHNlbGVjdGVkSW5kZXggcHJvcGVydHlcblx0XHRcdC8vIGZvcmNlcyB0aGUgYnJvd3NlciB0byB0cmVhdCB0aGUgZGVmYXVsdCBvcHRpb24gYXNcblx0XHRcdC8vIHNlbGVjdGVkIHdoZW4gaW4gYW4gb3B0Z3JvdXAuXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHRcdFx0XHRlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdC8vIENvbnRlbnRzXG5cdFx0ZW1wdHk6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG9cblx0XHRcdC8vIDplbXB0eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9kZXMgKHRleHQ6IDM7IGNkYXRhOiA0OyBlbnRpdHkgcmVmOiA1KSxcblx0XHRcdC8vICAgYnV0IG5vdCBieSBvdGhlcnMgKGNvbW1lbnQ6IDg7IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246IDc7IGV0Yy4pXG5cdFx0XHQvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICFFeHByLnBzZXVkb3MuZW1wdHkoIGVsZW0gKTtcblx0XHR9LFxuXG5cdFx0Ly8gRWxlbWVudC9pbnB1dCB0eXBlc1xuXHRcdGhlYWRlcjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmhlYWRlci50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdGlucHV0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaW5wdXRzLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0YnV0dG9uOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgJiYgZWxlbS50eXBlID09PSBcImJ1dHRvblwiIHx8XG5cdFx0XHRcdG5vZGVOYW1lKCBlbGVtLCBcImJ1dHRvblwiICk7XG5cdFx0fSxcblxuXHRcdHRleHQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICYmIGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCIgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8MTAgb25seVxuXHRcdFx0XHQvLyBOZXcgSFRNTDUgYXR0cmlidXRlIHZhbHVlcyAoZS5nLiwgXCJzZWFyY2hcIikgYXBwZWFyXG5cdFx0XHRcdC8vIHdpdGggZWxlbS50eXBlID09PSBcInRleHRcIlxuXHRcdFx0XHQoICggYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCBcInR5cGVcIiApICkgPT0gbnVsbCB8fFxuXHRcdFx0XHRcdGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIgKTtcblx0XHR9LFxuXG5cdFx0Ly8gUG9zaXRpb24taW4tY29sbGVjdGlvblxuXHRcdGZpcnN0OiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBbIDAgXTtcblx0XHR9ICksXG5cblx0XHRsYXN0OiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggX21hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIFsgbGVuZ3RoIC0gMSBdO1xuXHRcdH0gKSxcblxuXHRcdGVxOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggX21hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTtcblx0XHR9ICksXG5cblx0XHRldmVuOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApLFxuXG5cdFx0b2RkOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDE7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApLFxuXG5cdFx0bHQ6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaTtcblxuXHRcdFx0aWYgKCBhcmd1bWVudCA8IDAgKSB7XG5cdFx0XHRcdGkgPSBhcmd1bWVudCArIGxlbmd0aDtcblx0XHRcdH0gZWxzZSBpZiAoIGFyZ3VtZW50ID4gbGVuZ3RoICkge1xuXHRcdFx0XHRpID0gbGVuZ3RoO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aSA9IGFyZ3VtZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCA7IC0taSA+PSAwOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApLFxuXG5cdFx0Z3Q6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7ICsraSA8IGxlbmd0aDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0gKVxuXHR9XG59O1xuXG5FeHByLnBzZXVkb3MubnRoID0gRXhwci5wc2V1ZG9zLmVxO1xuXG4vLyBBZGQgYnV0dG9uL2lucHV0IHR5cGUgcHNldWRvc1xuZm9yICggaSBpbiB7IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1ZSwgZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdlOiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTtcbn1cbmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlQnV0dG9uUHNldWRvKCBpICk7XG59XG5cbi8vIEVhc3kgQVBJIGZvciBjcmVhdGluZyBuZXcgc2V0RmlsdGVyc1xuZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9XG5zZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4cHIuZmlsdGVycyA9IEV4cHIucHNldWRvcztcbkV4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7XG5cbmZ1bmN0aW9uIHRva2VuaXplKCBzZWxlY3RvciwgcGFyc2VPbmx5ICkge1xuXHR2YXIgbWF0Y2hlZCwgbWF0Y2gsIHRva2VucywgdHlwZSxcblx0XHRzb0ZhciwgZ3JvdXBzLCBwcmVGaWx0ZXJzLFxuXHRcdGNhY2hlZCA9IHRva2VuQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoIGNhY2hlZCApIHtcblx0XHRyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApO1xuXHR9XG5cblx0c29GYXIgPSBzZWxlY3Rvcjtcblx0Z3JvdXBzID0gW107XG5cdHByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjtcblxuXHR3aGlsZSAoIHNvRmFyICkge1xuXG5cdFx0Ly8gQ29tbWEgYW5kIGZpcnN0IHJ1blxuXHRcdGlmICggIW1hdGNoZWQgfHwgKCBtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApICkgKSB7XG5cdFx0XHRpZiAoIG1hdGNoICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWyAwIF0ubGVuZ3RoICkgfHwgc29GYXI7XG5cdFx0XHR9XG5cdFx0XHRncm91cHMucHVzaCggKCB0b2tlbnMgPSBbXSApICk7XG5cdFx0fVxuXG5cdFx0bWF0Y2hlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gQ29tYmluYXRvcnNcblx0XHRpZiAoICggbWF0Y2ggPSBybGVhZGluZ0NvbWJpbmF0b3IuZXhlYyggc29GYXIgKSApICkge1xuXHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHR0b2tlbnMucHVzaCgge1xuXHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblxuXHRcdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2Vcblx0XHRcdFx0dHlwZTogbWF0Y2hbIDAgXS5yZXBsYWNlKCBydHJpbUNTUywgXCIgXCIgKVxuXHRcdFx0fSApO1xuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGaWx0ZXJzXG5cdFx0Zm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHtcblx0XHRcdGlmICggKCBtYXRjaCA9IG1hdGNoRXhwclsgdHlwZSBdLmV4ZWMoIHNvRmFyICkgKSAmJiAoICFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcblx0XHRcdFx0KCBtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSApICkgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCgge1xuXHRcdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdFx0bWF0Y2hlczogbWF0Y2hcblx0XHRcdFx0fSApO1xuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggIW1hdGNoZWQgKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3Ncblx0Ly8gaWYgd2UncmUganVzdCBwYXJzaW5nXG5cdC8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2Vuc1xuXHRpZiAoIHBhcnNlT25seSApIHtcblx0XHRyZXR1cm4gc29GYXIubGVuZ3RoO1xuXHR9XG5cblx0cmV0dXJuIHNvRmFyID9cblx0XHRmaW5kLmVycm9yKCBzZWxlY3RvciApIDpcblxuXHRcdC8vIENhY2hlIHRoZSB0b2tlbnNcblx0XHR0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTtcbn1cblxuZnVuY3Rpb24gdG9TZWxlY3RvciggdG9rZW5zICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gdG9rZW5zLmxlbmd0aCxcblx0XHRzZWxlY3RvciA9IFwiXCI7XG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdHNlbGVjdG9yICs9IHRva2Vuc1sgaSBdLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHtcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxuXHRcdHNraXAgPSBjb21iaW5hdG9yLm5leHQsXG5cdFx0a2V5ID0gc2tpcCB8fCBkaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYga2V5ID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cblx0XHQvLyBDaGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRcblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IDpcblxuXHRcdC8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50c1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgb2xkQ2FjaGUsIG91dGVyQ2FjaGUsXG5cdFx0XHRcdG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdO1xuXG5cdFx0XHQvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBjb21iaW5hdG9yIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKCBlbGVtWyBleHBhbmRvIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHNraXAgJiYgbm9kZU5hbWUoIGVsZW0sIHNraXAgKSApIHtcblx0XHRcdFx0XHRcdFx0ZWxlbSA9IGVsZW1bIGRpciBdIHx8IGVsZW07XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCAoIG9sZENhY2hlID0gb3V0ZXJDYWNoZVsga2V5IF0gKSAmJlxuXHRcdFx0XHRcdFx0XHRvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiAoIG5ld0NhY2hlWyAyIF0gPSBvbGRDYWNoZVsgMiBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFJldXNlIG5ld2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZVsga2V5IF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAoIG5ld0NhY2hlWyAyIF0gPSBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcbn1cblxuZnVuY3Rpb24gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICkge1xuXHRyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBpID0gbWF0Y2hlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggIW1hdGNoZXJzWyBpIF0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSA6XG5cdFx0bWF0Y2hlcnNbIDAgXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRmaW5kKCBzZWxlY3RvciwgY29udGV4dHNbIGkgXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKCBlbGVtID0gdW5tYXRjaGVkWyBpIF0gKSApIHtcblx0XHRcdGlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRuZXdVbm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRpZiAoIG1hcHBlZCApIHtcblx0XHRcdFx0XHRtYXAucHVzaCggaSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5ld1VubWF0Y2hlZDtcbn1cblxuZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkge1xuXHRpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmlsdGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbHRlciApO1xuXHR9XG5cdGlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTtcblx0fVxuXHRyZXR1cm4gbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgcmVzdWx0cywgY29udGV4dCwgeG1sICkge1xuXHRcdHZhciB0ZW1wLCBpLCBlbGVtLCBtYXRjaGVyT3V0LFxuXHRcdFx0cHJlTWFwID0gW10sXG5cdFx0XHRwb3N0TWFwID0gW10sXG5cdFx0XHRwcmVleGlzdGluZyA9IHJlc3VsdHMubGVuZ3RoLFxuXG5cdFx0XHQvLyBHZXQgaW5pdGlhbCBlbGVtZW50cyBmcm9tIHNlZWQgb3IgY29udGV4dFxuXHRcdFx0ZWxlbXMgPSBzZWVkIHx8XG5cdFx0XHRcdG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yIHx8IFwiKlwiLFxuXHRcdFx0XHRcdGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksXG5cblx0XHRcdC8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvblxuXHRcdFx0bWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0ZWxlbXM7XG5cblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cblx0XHRcdC8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyXG5cdFx0XHQvLyBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0bWF0Y2hlck91dCA9IHBvc3RGaW5kZXIgfHwgKCBzZWVkID8gcHJlRmlsdGVyIDogcHJlZXhpc3RpbmcgfHwgcG9zdEZpbHRlciApID9cblxuXHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0W10gOlxuXG5cdFx0XHRcdC8vIC4uLm90aGVyd2lzZSB1c2UgcmVzdWx0cyBkaXJlY3RseVxuXHRcdFx0XHRyZXN1bHRzO1xuXG5cdFx0XHQvLyBGaW5kIHByaW1hcnkgbWF0Y2hlc1xuXHRcdFx0bWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXJJbjtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwb3N0RmlsdGVyXG5cdFx0aWYgKCBwb3N0RmlsdGVyICkge1xuXHRcdFx0dGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7XG5cdFx0XHRwb3N0RmlsdGVyKCB0ZW1wLCBbXSwgY29udGV4dCwgeG1sICk7XG5cblx0XHRcdC8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW5cblx0XHRcdGkgPSB0ZW1wLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICggZWxlbSA9IHRlbXBbIGkgXSApICkge1xuXHRcdFx0XHRcdG1hdGNoZXJPdXRbIHBvc3RNYXBbIGkgXSBdID0gISggbWF0Y2hlckluWyBwb3N0TWFwWyBpIF0gXSA9IGVsZW0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggc2VlZCApIHtcblx0XHRcdGlmICggcG9zdEZpbmRlciB8fCBwcmVGaWx0ZXIgKSB7XG5cdFx0XHRcdGlmICggcG9zdEZpbmRlciApIHtcblxuXHRcdFx0XHRcdC8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJtZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0c1xuXHRcdFx0XHRcdHRlbXAgPSBbXTtcblx0XHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZWxlbSA9IG1hdGNoZXJPdXRbIGkgXSApICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgbWF0Y2hlckluIHNpbmNlIGVsZW0gaXMgbm90IHlldCBhIGZpbmFsIG1hdGNoXG5cdFx0XHRcdFx0XHRcdHRlbXAucHVzaCggKCBtYXRjaGVySW5bIGkgXSA9IGVsZW0gKSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCAoIG1hdGNoZXJPdXQgPSBbXSApLCB0ZW1wLCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkXG5cdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSBtYXRjaGVyT3V0WyBpIF0gKSAmJlxuXHRcdFx0XHRcdFx0KCB0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YuY2FsbCggc2VlZCwgZWxlbSApIDogcHJlTWFwWyBpIF0gKSA+IC0xICkge1xuXG5cdFx0XHRcdFx0XHRzZWVkWyB0ZW1wIF0gPSAhKCByZXN1bHRzWyB0ZW1wIF0gPSBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBBZGQgZWxlbWVudHMgdG8gcmVzdWx0cywgdGhyb3VnaCBwb3N0RmluZGVyIGlmIGRlZmluZWRcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlck91dCA9IGNvbmRlbnNlKFxuXHRcdFx0XHRtYXRjaGVyT3V0ID09PSByZXN1bHRzID9cblx0XHRcdFx0XHRtYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVuZ3RoICkgOlxuXHRcdFx0XHRcdG1hdGNoZXJPdXRcblx0XHRcdCk7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdHBvc3RGaW5kZXIoIG51bGwsIHJlc3VsdHMsIG1hdGNoZXJPdXQsIHhtbCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgbWF0Y2hlck91dCApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWyAwIF0udHlwZSBdLFxuXHRcdGltcGxpY2l0UmVsYXRpdmUgPSBsZWFkaW5nUmVsYXRpdmUgfHwgRXhwci5yZWxhdGl2ZVsgXCIgXCIgXSxcblx0XHRpID0gbGVhZGluZ1JlbGF0aXZlID8gMSA6IDAsXG5cblx0XHQvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKVxuXHRcdG1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hBbnlDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPSBvdXRlcm1vc3RDb250ZXh0ICkgKSB8fCAoXG5cdFx0XHRcdCggY2hlY2tDb250ZXh0ID0gY29udGV4dCApLm5vZGVUeXBlID9cblx0XHRcdFx0XHRtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0XHRtYXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7XG5cblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50XG5cdFx0XHQvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL2lzc3Vlcy8yOTkpXG5cdFx0XHRjaGVja0NvbnRleHQgPSBudWxsO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9IF07XG5cblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0aWYgKCAoIG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbIGkgXS50eXBlIF0gKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKCBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlciApIF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXIgPSBFeHByLmZpbHRlclsgdG9rZW5zWyBpIF0udHlwZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbIGkgXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblxuXHRcdFx0XHQvLyBGaW5kIHRoZSBuZXh0IHJlbGF0aXZlIG9wZXJhdG9yIChpZiBhbnkpIGZvciBwcm9wZXIgaGFuZGxpbmdcblx0XHRcdFx0aiA9ICsraTtcblx0XHRcdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyB0b2tlbnNbIGogXS50eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNldE1hdGNoZXIoXG5cdFx0XHRcdFx0aSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksXG5cdFx0XHRcdFx0aSA+IDEgJiYgdG9TZWxlY3RvcihcblxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKVxuXHRcdFx0XHRcdFx0XHQuY29uY2F0KCB7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gXCIgXCIgPyBcIipcIiA6IFwiXCIgfSApXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbUNTUywgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAoIHRva2VucyA9IHRva2Vucy5zbGljZSggaiApICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIHRvU2VsZWN0b3IoIHRva2VucyApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRtYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSB7XG5cdHZhciBieVNldCA9IHNldE1hdGNoZXJzLmxlbmd0aCA+IDAsXG5cdFx0YnlFbGVtZW50ID0gZWxlbWVudE1hdGNoZXJzLmxlbmd0aCA+IDAsXG5cdFx0c3VwZXJNYXRjaGVyID0gZnVuY3Rpb24oIHNlZWQsIGNvbnRleHQsIHhtbCwgcmVzdWx0cywgb3V0ZXJtb3N0ICkge1xuXHRcdFx0dmFyIGVsZW0sIGosIG1hdGNoZXIsXG5cdFx0XHRcdG1hdGNoZWRDb3VudCA9IDAsXG5cdFx0XHRcdGkgPSBcIjBcIixcblx0XHRcdFx0dW5tYXRjaGVkID0gc2VlZCAmJiBbXSxcblx0XHRcdFx0c2V0TWF0Y2hlZCA9IFtdLFxuXHRcdFx0XHRjb250ZXh0QmFja3VwID0gb3V0ZXJtb3N0Q29udGV4dCxcblxuXHRcdFx0XHQvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0XG5cdFx0XHRcdGVsZW1zID0gc2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5kLlRBRyggXCIqXCIsIG91dGVybW9zdCApLFxuXG5cdFx0XHRcdC8vIFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyXG5cdFx0XHRcdGRpcnJ1bnNVbmlxdWUgPSAoIGRpcnJ1bnMgKz0gY29udGV4dEJhY2t1cCA9PSBudWxsID8gMSA6IE1hdGgucmFuZG9tKCkgfHwgMC4xICksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdFx0b3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHQgPT0gZG9jdW1lbnQgfHwgY29udGV4dCB8fCBvdXRlcm1vc3Q7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBlbGVtZW50cyBwYXNzaW5nIGVsZW1lbnRNYXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRzXG5cdFx0XHQvLyBTdXBwb3J0OiBpT1MgPD03IC0gOSBvbmx5XG5cdFx0XHQvLyBUb2xlcmF0ZSBOb2RlTGlzdCBwcm9wZXJ0aWVzIChJRTogXCJsZW5ndGhcIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmdcblx0XHRcdC8vIGVsZW1lbnRzIGJ5IGlkLiAoc2VlIHRyYWMtMTQxNDIpXG5cdFx0XHRmb3IgKCA7IGkgIT09IGxlbiAmJiAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGJ5RWxlbWVudCAmJiBlbGVtICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdFx0XHRpZiAoICFjb250ZXh0ICYmIGVsZW0ub3duZXJEb2N1bWVudCAhPSBkb2N1bWVudCApIHtcblx0XHRcdFx0XHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdFx0XHRcdFx0XHR4bWwgPSAhZG9jdW1lbnRJc0hUTUw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaGVyID0gZWxlbWVudE1hdGNoZXJzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cHVzaC5jYWxsKCByZXN1bHRzLCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblxuXHRcdFx0XHRcdC8vIFRoZXkgd2lsbCBoYXZlIGdvbmUgdGhyb3VnaCBhbGwgcG9zc2libGUgbWF0Y2hlcnNcblx0XHRcdFx0XHRpZiAoICggZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0gKSApIHtcblx0XHRcdFx0XHRcdG1hdGNoZWRDb3VudC0tO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIExlbmd0aGVuIHRoZSBhcnJheSBmb3IgZXZlcnkgZWxlbWVudCwgbWF0Y2hlZCBvciBub3Rcblx0XHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBgaWAgaXMgbm93IHRoZSBjb3VudCBvZiBlbGVtZW50cyB2aXNpdGVkIGFib3ZlLCBhbmQgYWRkaW5nIGl0IHRvIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLlxuXHRcdFx0bWF0Y2hlZENvdW50ICs9IGk7XG5cblx0XHRcdC8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50c1xuXHRcdFx0Ly8gTk9URTogVGhpcyBjYW4gYmUgc2tpcHBlZCBpZiB0aGVyZSBhcmUgbm8gdW5tYXRjaGVkIGVsZW1lbnRzIChpLmUuLCBgbWF0Y2hlZENvdW50YFxuXHRcdFx0Ly8gZXF1YWxzIGBpYCksIHVubGVzcyB3ZSBkaWRuJ3QgdmlzaXQgX2FueV8gZWxlbWVudHMgaW4gdGhlIGFib3ZlIGxvb3AgYmVjYXVzZSB3ZSBoYXZlXG5cdFx0XHQvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLlxuXHRcdFx0Ly8gSW5jcmVtZW50aW5nIGFuIGluaXRpYWxseS1zdHJpbmcgXCIwXCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdFxuXHRcdFx0Ly8gY2FzZSwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSBcIjAwXCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvXG5cdFx0XHQvLyBudW1lcmljYWxseSB6ZXJvLlxuXHRcdFx0aWYgKCBieVNldCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7XG5cdFx0XHRcdGogPSAwO1xuXHRcdFx0XHR3aGlsZSAoICggbWF0Y2hlciA9IHNldE1hdGNoZXJzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdG1hdGNoZXIoIHVubWF0Y2hlZCwgc2V0TWF0Y2hlZCwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBSZWludGVncmF0ZSBlbGVtZW50IG1hdGNoZXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBzb3J0aW5nXG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkQ291bnQgPiAwICkge1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggISggdW5tYXRjaGVkWyBpIF0gfHwgc2V0TWF0Y2hlZFsgaSBdICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0c2V0TWF0Y2hlZFsgaSBdID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRqUXVlcnkudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5mdW5jdGlvbiBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7XG5cdHZhciBpLFxuXHRcdHNldE1hdGNoZXJzID0gW10sXG5cdFx0ZWxlbWVudE1hdGNoZXJzID0gW10sXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggIWNhY2hlZCApIHtcblxuXHRcdC8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudFxuXHRcdGlmICggIW1hdGNoICkge1xuXHRcdFx0bWF0Y2ggPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblx0XHR9XG5cdFx0aSA9IG1hdGNoLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGNhY2hlZCA9IG1hdGNoZXJGcm9tVG9rZW5zKCBtYXRjaFsgaSBdICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3Rvcixcblx0XHRcdG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApICk7XG5cblx0XHQvLyBTYXZlIHNlbGVjdG9yIGFuZCB0b2tlbml6YXRpb25cblx0XHRjYWNoZWQuc2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0fVxuXHRyZXR1cm4gY2FjaGVkO1xufVxuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggalF1ZXJ5J3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBqUXVlcnkgc2VsZWN0b3IgY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbmZ1bmN0aW9uIHNlbGVjdCggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKCBzZWxlY3RvciA9IGNvbXBpbGVkLnNlbGVjdG9yIHx8IHNlbGVjdG9yICkgKTtcblxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblxuXHQvLyBUcnkgdG8gbWluaW1pemUgb3BlcmF0aW9ucyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBzZWxlY3RvciBpbiB0aGUgbGlzdCBhbmQgbm8gc2VlZFxuXHQvLyAodGhlIGxhdHRlciBvZiB3aGljaCBndWFyYW50ZWVzIHVzIGNvbnRleHQpXG5cdGlmICggbWF0Y2gubGVuZ3RoID09PSAxICkge1xuXG5cdFx0Ly8gUmVkdWNlIGNvbnRleHQgaWYgdGhlIGxlYWRpbmcgY29tcG91bmQgc2VsZWN0b3IgaXMgYW4gSURcblx0XHR0b2tlbnMgPSBtYXRjaFsgMCBdID0gbWF0Y2hbIDAgXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKCB0b2tlbiA9IHRva2Vuc1sgMCBdICkudHlwZSA9PT0gXCJJRFwiICYmXG5cdFx0XHRcdGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgZG9jdW1lbnRJc0hUTUwgJiYgRXhwci5yZWxhdGl2ZVsgdG9rZW5zWyAxIF0udHlwZSBdICkge1xuXG5cdFx0XHRjb250ZXh0ID0gKCBFeHByLmZpbmQuSUQoXG5cdFx0XHRcdHRva2VuLm1hdGNoZXNbIDAgXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLFxuXHRcdFx0XHRjb250ZXh0XG5cdFx0XHQpIHx8IFtdIClbIDAgXTtcblx0XHRcdGlmICggIWNvbnRleHQgKSB7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHQvLyBQcmVjb21waWxlZCBtYXRjaGVycyB3aWxsIHN0aWxsIHZlcmlmeSBhbmNlc3RyeSwgc28gc3RlcCB1cCBhIGxldmVsXG5cdFx0XHR9IGVsc2UgaWYgKCBjb21waWxlZCApIHtcblx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQucGFyZW50Tm9kZTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZSggdG9rZW5zLnNoaWZ0KCkudmFsdWUubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZ1xuXHRcdGkgPSBtYXRjaEV4cHIubmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRva2VuID0gdG9rZW5zWyBpIF07XG5cblx0XHRcdC8vIEFib3J0IGlmIHdlIGhpdCBhIGNvbWJpbmF0b3Jcblx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgKCB0eXBlID0gdG9rZW4udHlwZSApIF0gKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAoIGZpbmQgPSBFeHByLmZpbmRbIHR5cGUgXSApICkge1xuXG5cdFx0XHRcdC8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9yc1xuXHRcdFx0XHRpZiAoICggc2VlZCA9IGZpbmQoXG5cdFx0XHRcdFx0dG9rZW4ubWF0Y2hlc1sgMCBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICksXG5cdFx0XHRcdFx0cnNpYmxpbmcudGVzdCggdG9rZW5zWyAwIF0udHlwZSApICYmXG5cdFx0XHRcdFx0XHR0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHRcdFx0XHQpICkgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHlcblx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTtcblx0XHRcdFx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNlZWQgKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbiBpZiBvbmUgaXMgbm90IHByb3ZpZGVkXG5cdC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmVcblx0KCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKFxuXHRcdHNlZWQsXG5cdFx0Y29udGV4dCxcblx0XHQhZG9jdW1lbnRJc0hUTUwsXG5cdFx0cmVzdWx0cyxcblx0XHQhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdCk7XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG4vLyBPbmUtdGltZSBhc3NpZ25tZW50c1xuXG4vLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIC0gNC4xK1xuLy8gU29ydCBzdGFiaWxpdHlcbnN1cHBvcnQuc29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoIFwiXCIgKS5zb3J0KCBzb3J0T3JkZXIgKS5qb2luKCBcIlwiICkgPT09IGV4cGFuZG87XG5cbi8vIEluaXRpYWxpemUgYWdhaW5zdCB0aGUgZGVmYXVsdCBkb2N1bWVudFxuc2V0RG9jdW1lbnQoKTtcblxuLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCAtIDQuMStcbi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKlxuc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblxuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGVsLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImZpZWxkc2V0XCIgKSApICYgMTtcbn0gKTtcblxualF1ZXJ5LmZpbmQgPSBmaW5kO1xuXG4vLyBEZXByZWNhdGVkXG5qUXVlcnkuZXhwclsgXCI6XCIgXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7XG5qUXVlcnkudW5pcXVlID0galF1ZXJ5LnVuaXF1ZVNvcnQ7XG5cbi8vIFRoZXNlIGhhdmUgYWx3YXlzIGJlZW4gcHJpdmF0ZSwgYnV0IHRoZXkgdXNlZCB0byBiZSBkb2N1bWVudGVkIGFzIHBhcnQgb2Zcbi8vIFNpenpsZSBzbyBsZXQncyBtYWludGFpbiB0aGVtIGZvciBub3cgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLlxuZmluZC5jb21waWxlID0gY29tcGlsZTtcbmZpbmQuc2VsZWN0ID0gc2VsZWN0O1xuZmluZC5zZXREb2N1bWVudCA9IHNldERvY3VtZW50O1xuZmluZC50b2tlbml6ZSA9IHRva2VuaXplO1xuXG5maW5kLmVzY2FwZSA9IGpRdWVyeS5lc2NhcGVTZWxlY3RvcjtcbmZpbmQuZ2V0VGV4dCA9IGpRdWVyeS50ZXh0O1xuZmluZC5pc1hNTCA9IGpRdWVyeS5pc1hNTERvYztcbmZpbmQuc2VsZWN0b3JzID0galF1ZXJ5LmV4cHI7XG5maW5kLnN1cHBvcnQgPSBqUXVlcnkuc3VwcG9ydDtcbmZpbmQudW5pcXVlU29ydCA9IGpRdWVyeS51bmlxdWVTb3J0O1xuXG5cdC8qIGVzbGludC1lbmFibGUgKi9cblxufSApKCk7XG5cblxudmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkge1xuXHR2YXIgbWF0Y2hlZCA9IFtdLFxuXHRcdHRydW5jYXRlID0gdW50aWwgIT09IHVuZGVmaW5lZDtcblxuXHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgJiYgZWxlbS5ub2RlVHlwZSAhPT0gOSApIHtcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdG1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbWF0Y2hlZDtcbn07XG5cblxudmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7XG5cdHZhciBtYXRjaGVkID0gW107XG5cblx0Zm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHtcblx0XHRpZiAoIG4ubm9kZVR5cGUgPT09IDEgJiYgbiAhPT0gZWxlbSApIHtcblx0XHRcdG1hdGNoZWQucHVzaCggbiApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtcblxudmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXFwvXFwwPjpcXHgyMFxcdFxcclxcblxcZl0qKVtcXHgyMFxcdFxcclxcblxcZl0qXFwvPz4oPzo8XFwvXFwxPnwpJC9pICk7XG5cblxuXG4vLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdFxuZnVuY3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBub3QgKSB7XG5cdGlmICggaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gU2luZ2xlIGVsZW1lbnRcblx0aWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KVxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID4gLTEgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEZpbHRlcmVkIGRpcmVjdGx5IGZvciBib3RoIHNpbXBsZSBhbmQgY29tcGxleCBzZWxlY3RvcnNcblx0cmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApO1xufVxuXG5qUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7XG5cdHZhciBlbGVtID0gZWxlbXNbIDAgXTtcblxuXHRpZiAoIG5vdCApIHtcblx0XHRleHByID0gXCI6bm90KFwiICsgZXhwciArIFwiKVwiO1xuXHR9XG5cblx0aWYgKCBlbGVtcy5sZW5ndGggPT09IDEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBleHByICkgPyBbIGVsZW0gXSA6IFtdO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXMoIGV4cHIsIGpRdWVyeS5ncmVwKCBlbGVtcywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7XG5cdH0gKSApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGksIHJldCxcblx0XHRcdGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0c2VsZiA9IHRoaXM7XG5cblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhpcyApICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cblx0XHRyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRqUXVlcnkuZmluZCggc2VsZWN0b3IsIHNlbGZbIGkgXSwgcmV0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7XG5cdH0sXG5cdGZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgZmFsc2UgKSApO1xuXHR9LFxuXHRub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyggdGhpcywgc2VsZWN0b3IgfHwgW10sIHRydWUgKSApO1xuXHR9LFxuXHRpczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiAhIXdpbm5vdyhcblx0XHRcdHRoaXMsXG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXRcblx0XHRcdC8vIHNvICQoXCJwOmZpcnN0XCIpLmlzKFwicDpsYXN0XCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3byBcInBcIi5cblx0XHRcdHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiAmJiBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9yICkgOlxuXHRcdFx0XHRzZWxlY3RvciB8fCBbXSxcblx0XHRcdGZhbHNlXG5cdFx0KS5sZW5ndGg7XG5cdH1cbn0gKTtcblxuXG4vLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdFxuXG5cbi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KVxudmFyIHJvb3RqUXVlcnksXG5cblx0Ly8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Ncblx0Ly8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKHRyYWMtOTUyMSlcblx0Ly8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKHRyYWMtMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHQvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkXG5cdHJxdWlja0V4cHIgPSAvXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0rKSkkLyxcblxuXHRpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7XG5cdFx0dmFyIG1hdGNoLCBlbGVtO1xuXG5cdFx0Ly8gSEFORExFOiAkKFwiXCIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpXG5cdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvLyBNZXRob2QgaW5pdCgpIGFjY2VwdHMgYW4gYWx0ZXJuYXRlIHJvb3RqUXVlcnlcblx0XHQvLyBzbyBtaWdyYXRlIGNhbiBzdXBwb3J0IGpRdWVyeS5zdWIgKGdoLTIxMDEpXG5cdFx0cm9vdCA9IHJvb3QgfHwgcm9vdGpRdWVyeTtcblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3JbIDAgXSA9PT0gXCI8XCIgJiZcblx0XHRcdFx0c2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gXCI+XCIgJiZcblx0XHRcdFx0c2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cblx0XHRcdFx0Ly8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2tcblx0XHRcdFx0bWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkXG5cdFx0XHRpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWyAxIF0gKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WyAwIF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsgMSBdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWyAxIF0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkge1xuXHRcdFx0XHRcdFx0Zm9yICggbWF0Y2ggaW4gY29udGV4dCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTtcblxuXHRcdFx0XHRcdGlmICggZWxlbSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3Rcblx0XHRcdFx0XHRcdHRoaXNbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpc1sgMCBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkge1xuXHRcdFx0cmV0dXJuIHJvb3QucmVhZHkgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHJvb3QucmVhZHkoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0c2VsZWN0b3IoIGpRdWVyeSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xuXHR9O1xuXG4vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uXG5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcblxuLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZVxucm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTtcblxuXG52YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXG5cblx0Ly8gTWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXRcblx0Z3VhcmFudGVlZFVuaXF1ZSA9IHtcblx0XHRjaGlsZHJlbjogdHJ1ZSxcblx0XHRjb250ZW50czogdHJ1ZSxcblx0XHRuZXh0OiB0cnVlLFxuXHRcdHByZXY6IHRydWVcblx0fTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0dmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLFxuXHRcdFx0bCA9IHRhcmdldHMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbIGkgXSApICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7XG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0bWF0Y2hlZCA9IFtdLFxuXHRcdFx0dGFyZ2V0cyA9IHR5cGVvZiBzZWxlY3RvcnMgIT09IFwic3RyaW5nXCIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTtcblxuXHRcdC8vIFBvc2l0aW9uYWwgc2VsZWN0b3JzIG5ldmVyIG1hdGNoLCBzaW5jZSB0aGVyZSdzIG5vIF9zZWxlY3Rpb25fIGNvbnRleHRcblx0XHRpZiAoICFybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmb3IgKCBjdXIgPSB0aGlzWyBpIF07IGN1ciAmJiBjdXIgIT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXG5cdFx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAoIHRhcmdldHMgP1xuXHRcdFx0XHRcdFx0dGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIGpRdWVyeSNmaW5kXG5cdFx0XHRcdFx0XHRjdXIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBjdXIsIHNlbGVjdG9ycyApICkgKSB7XG5cblx0XHRcdFx0XHRcdG1hdGNoZWQucHVzaCggY3VyICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQubGVuZ3RoID4gMSA/IGpRdWVyeS51bmlxdWVTb3J0KCBtYXRjaGVkICkgOiBtYXRjaGVkICk7XG5cdH0sXG5cblx0Ly8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IHdpdGhpbiB0aGUgc2V0XG5cdGluZGV4OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIE5vIGFyZ3VtZW50LCByZXR1cm4gaW5kZXggaW4gcGFyZW50XG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybiAoIHRoaXNbIDAgXSAmJiB0aGlzWyAwIF0ucGFyZW50Tm9kZSApID8gdGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGggOiAtMTtcblx0XHR9XG5cblx0XHQvLyBJbmRleCBpbiBzZWxlY3RvclxuXHRcdGlmICggdHlwZW9mIGVsZW0gPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50XG5cdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggdGhpcyxcblxuXHRcdFx0Ly8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkXG5cdFx0XHRlbGVtLmpxdWVyeSA/IGVsZW1bIDAgXSA6IGVsZW1cblx0XHQpO1xuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayhcblx0XHRcdGpRdWVyeS51bmlxdWVTb3J0KFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHRhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID9cblx0XHRcdHRoaXMucHJldk9iamVjdCA6IHRoaXMucHJldk9iamVjdC5maWx0ZXIoIHNlbGVjdG9yIClcblx0XHQpO1xuXHR9XG59ICk7XG5cbmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkge1xuXHR3aGlsZSAoICggY3VyID0gY3VyWyBkaXIgXSApICYmIGN1ci5ub2RlVHlwZSAhPT0gMSApIHt9XG5cdHJldHVybiBjdXI7XG59XG5cbmpRdWVyeS5lYWNoKCB7XG5cdHBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsO1xuXHR9LFxuXHRwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInBhcmVudE5vZGVcIiApO1xuXHR9LFxuXHRwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBfaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIsIHVudGlsICk7XG5cdH0sXG5cdG5leHQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgX2ksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0cHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgX2ksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHNpYmxpbmdzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZ3MoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApO1xuXHR9LFxuXHRjaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCBlbGVtLmZpcnN0Q2hpbGQgKTtcblx0fSxcblx0Y29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdGlmICggZWxlbS5jb250ZW50RG9jdW1lbnQgIT0gbnVsbCAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMStcblx0XHRcdC8vIDxvYmplY3Q+IGVsZW1lbnRzIHdpdGggbm8gYGRhdGFgIGF0dHJpYnV0ZSBoYXMgYW4gb2JqZWN0XG5cdFx0XHQvLyBgY29udGVudERvY3VtZW50YCB3aXRoIGEgYG51bGxgIHByb3RvdHlwZS5cblx0XHRcdGdldFByb3RvKCBlbGVtLmNvbnRlbnREb2N1bWVudCApICkge1xuXG5cdFx0XHRyZXR1cm4gZWxlbS5jb250ZW50RG9jdW1lbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHksIGlPUyA3IG9ubHksIEFuZHJvaWQgQnJvd3NlciA8PTQuMyBvbmx5XG5cdFx0Ly8gVHJlYXQgdGhlIHRlbXBsYXRlIGVsZW1lbnQgYXMgYSByZWd1bGFyIG9uZSBpbiBicm93c2VycyB0aGF0XG5cdFx0Ly8gZG9uJ3Qgc3VwcG9ydCBpdC5cblx0XHRpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRlbXBsYXRlXCIgKSApIHtcblx0XHRcdGVsZW0gPSBlbGVtLmNvbnRlbnQgfHwgZWxlbTtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7XG5cdH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggdW50aWwsIHNlbGVjdG9yICkge1xuXHRcdHZhciBtYXRjaGVkID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7XG5cblx0XHRpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09IFwiVW50aWxcIiApIHtcblx0XHRcdHNlbGVjdG9yID0gdW50aWw7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRtYXRjaGVkID0galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIG1hdGNoZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZXNcblx0XHRcdGlmICggIWd1YXJhbnRlZWRVbmlxdWVbIG5hbWUgXSApIHtcblx0XHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV2ZXJzZSBvcmRlciBmb3IgcGFyZW50cyogYW5kIHByZXYtZGVyaXZhdGl2ZXNcblx0XHRcdGlmICggcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0bWF0Y2hlZC5yZXZlcnNlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7XG5cdH07XG59ICk7XG52YXIgcm5vdGh0bWx3aGl0ZSA9ICggL1teXFx4MjBcXHRcXHJcXG5cXGZdKy9nICk7XG5cblxuXG4vLyBDb252ZXJ0IFN0cmluZy1mb3JtYXR0ZWQgb3B0aW9ucyBpbnRvIE9iamVjdC1mb3JtYXR0ZWQgb25lc1xuZnVuY3Rpb24gY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIHtcblx0dmFyIG9iamVjdCA9IHt9O1xuXHRqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHtcblx0XHRvYmplY3RbIGZsYWcgXSA9IHRydWU7XG5cdH0gKTtcblx0cmV0dXJuIG9iamVjdDtcbn1cblxuLypcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICpcbiAqXHRvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93XG4gKlx0XHRcdHRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3RcbiAqXG4gKiBCeSBkZWZhdWx0IGEgY2FsbGJhY2sgbGlzdCB3aWxsIGFjdCBsaWtlIGFuIGV2ZW50IGNhbGxiYWNrIGxpc3QgYW5kIGNhbiBiZVxuICogXCJmaXJlZFwiIG11bHRpcGxlIHRpbWVzLlxuICpcbiAqIFBvc3NpYmxlIG9wdGlvbnM6XG4gKlxuICpcdG9uY2U6XHRcdFx0d2lsbCBlbnN1cmUgdGhlIGNhbGxiYWNrIGxpc3QgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHRtZW1vcnk6XHRcdFx0d2lsbCBrZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBhZGRlZFxuICpcdFx0XHRcdFx0YWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgXCJtZW1vcml6ZWRcIlxuICpcdFx0XHRcdFx0dmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdHVuaXF1ZTpcdFx0XHR3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdClcbiAqXG4gKlx0c3RvcE9uRmFsc2U6XHRpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFsc2VcbiAqXG4gKi9cbmpRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHQvLyBDb252ZXJ0IG9wdGlvbnMgZnJvbSBTdHJpbmctZm9ybWF0dGVkIHRvIE9iamVjdC1mb3JtYXR0ZWQgaWYgbmVlZGVkXG5cdC8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdClcblx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiID9cblx0XHRjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgOlxuXHRcdGpRdWVyeS5leHRlbmQoIHt9LCBvcHRpb25zICk7XG5cblx0dmFyIC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IGlzIGN1cnJlbnRseSBmaXJpbmdcblx0XHRmaXJpbmcsXG5cblx0XHQvLyBMYXN0IGZpcmUgdmFsdWUgZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0c1xuXHRcdG1lbW9yeSxcblxuXHRcdC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkXG5cdFx0ZmlyZWQsXG5cblx0XHQvLyBGbGFnIHRvIHByZXZlbnQgZmlyaW5nXG5cdFx0bG9ja2VkLFxuXG5cdFx0Ly8gQWN0dWFsIGNhbGxiYWNrIGxpc3Rcblx0XHRsaXN0ID0gW10sXG5cblx0XHQvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0c1xuXHRcdHF1ZXVlID0gW10sXG5cblx0XHQvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSBhZGQvcmVtb3ZlIGFzIG5lZWRlZClcblx0XHRmaXJpbmdJbmRleCA9IC0xLFxuXG5cdFx0Ly8gRmlyZSBjYWxsYmFja3Ncblx0XHRmaXJlID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuZm9yY2Ugc2luZ2xlLWZpcmluZ1xuXHRcdFx0bG9ja2VkID0gbG9ja2VkIHx8IG9wdGlvbnMub25jZTtcblxuXHRcdFx0Ly8gRXhlY3V0ZSBjYWxsYmFja3MgZm9yIGFsbCBwZW5kaW5nIGV4ZWN1dGlvbnMsXG5cdFx0XHQvLyByZXNwZWN0aW5nIGZpcmluZ0luZGV4IG92ZXJyaWRlcyBhbmQgcnVudGltZSBjaGFuZ2VzXG5cdFx0XHRmaXJlZCA9IGZpcmluZyA9IHRydWU7XG5cdFx0XHRmb3IgKCA7IHF1ZXVlLmxlbmd0aDsgZmlyaW5nSW5kZXggPSAtMSApIHtcblx0XHRcdFx0bWVtb3J5ID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdFx0d2hpbGUgKCArK2ZpcmluZ0luZGV4IDwgbGlzdC5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHQvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvblxuXHRcdFx0XHRcdGlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmXG5cdFx0XHRcdFx0XHRvcHRpb25zLnN0b3BPbkZhbHNlICkge1xuXG5cdFx0XHRcdFx0XHQvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlXG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvcmdldCB0aGUgZGF0YSBpZiB3ZSdyZSBkb25lIHdpdGggaXRcblx0XHRcdGlmICggIW9wdGlvbnMubWVtb3J5ICkge1xuXHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0ZmlyaW5nID0gZmFsc2U7XG5cblx0XHRcdC8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kXG5cdFx0XHRpZiAoIGxvY2tlZCApIHtcblxuXHRcdFx0XHQvLyBLZWVwIGFuIGVtcHR5IGxpc3QgaWYgd2UgaGF2ZSBkYXRhIGZvciBmdXR1cmUgYWRkIGNhbGxzXG5cdFx0XHRcdGlmICggbWVtb3J5ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGlzdCA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3Rcblx0XHRzZWxmID0ge1xuXG5cdFx0XHQvLyBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0XG5cdFx0XHRhZGQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBoYXZlIG1lbW9yeSBmcm9tIGEgcGFzdCBydW4sIHdlIHNob3VsZCBmaXJlIGFmdGVyIGFkZGluZ1xuXHRcdFx0XHRcdGlmICggbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRcdHF1ZXVlLnB1c2goIG1lbW9yeSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCggZnVuY3Rpb24gYWRkKCBhcmdzICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3QucHVzaCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiB0b1R5cGUoIGFyZyApICE9PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gSW5zcGVjdCByZWN1cnNpdmVseVxuXHRcdFx0XHRcdFx0XHRcdGFkZCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHR9ICkoIGFyZ3VtZW50cyApO1xuXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0XG5cdFx0XHRyZW1vdmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZWFjaCggYXJndW1lbnRzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdHZhciBpbmRleDtcblx0XHRcdFx0XHR3aGlsZSAoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdGxpc3Quc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgZmlyaW5nIGluZGV4ZXNcblx0XHRcdFx0XHRcdGlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7XG5cdFx0XHRcdFx0XHRcdGZpcmluZ0luZGV4LS07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYSBnaXZlbiBjYWxsYmFjayBpcyBpbiB0aGUgbGlzdC5cblx0XHRcdC8vIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCByZXR1cm4gd2hldGhlciBvciBub3QgbGlzdCBoYXMgY2FsbGJhY2tzIGF0dGFjaGVkLlxuXHRcdFx0aGFzOiBmdW5jdGlvbiggZm4gKSB7XG5cdFx0XHRcdHJldHVybiBmbiA/XG5cdFx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIGZuLCBsaXN0ICkgPiAtMSA6XG5cdFx0XHRcdFx0bGlzdC5sZW5ndGggPiAwO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gUmVtb3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgbGlzdFxuXHRcdFx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZFxuXHRcdFx0Ly8gQWJvcnQgYW55IGN1cnJlbnQvcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHQvLyBDbGVhciBhbGwgY2FsbGJhY2tzIGFuZCB2YWx1ZXNcblx0XHRcdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsb2NrZWQgPSBxdWV1ZSA9IFtdO1xuXHRcdFx0XHRsaXN0ID0gbWVtb3J5ID0gXCJcIjtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0ZGlzYWJsZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gIWxpc3Q7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlXG5cdFx0XHQvLyBBbHNvIGRpc2FibGUgLmFkZCB1bmxlc3Mgd2UgaGF2ZSBtZW1vcnkgKHNpbmNlIGl0IHdvdWxkIGhhdmUgbm8gZWZmZWN0KVxuXHRcdFx0Ly8gQWJvcnQgYW55IHBlbmRpbmcgZXhlY3V0aW9uc1xuXHRcdFx0bG9jazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGlmICggIW1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGxvY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWxvY2tlZDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHNcblx0XHRcdGZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHtcblx0XHRcdFx0aWYgKCAhbG9ja2VkICkge1xuXHRcdFx0XHRcdGFyZ3MgPSBhcmdzIHx8IFtdO1xuXHRcdFx0XHRcdGFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07XG5cdFx0XHRcdFx0cXVldWUucHVzaCggYXJncyApO1xuXHRcdFx0XHRcdGlmICggIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDYWxsIGFsbCB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZVxuXHRcdFx0ZmlyZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFmaXJlZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdHJldHVybiBzZWxmO1xufTtcblxuXG5mdW5jdGlvbiBJZGVudGl0eSggdiApIHtcblx0cmV0dXJuIHY7XG59XG5mdW5jdGlvbiBUaHJvd2VyKCBleCApIHtcblx0dGhyb3cgZXg7XG59XG5cbmZ1bmN0aW9uIGFkb3B0VmFsdWUoIHZhbHVlLCByZXNvbHZlLCByZWplY3QsIG5vVmFsdWUgKSB7XG5cdHZhciBtZXRob2Q7XG5cblx0dHJ5IHtcblxuXHRcdC8vIENoZWNrIGZvciBwcm9taXNlIGFzcGVjdCBmaXJzdCB0byBwcml2aWxlZ2Ugc3luY2hyb25vdXMgYmVoYXZpb3Jcblx0XHRpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUucHJvbWlzZSApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUgKS5kb25lKCByZXNvbHZlICkuZmFpbCggcmVqZWN0ICk7XG5cblx0XHQvLyBPdGhlciB0aGVuYWJsZXNcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnRoZW4gKSApICkge1xuXHRcdFx0bWV0aG9kLmNhbGwoIHZhbHVlLCByZXNvbHZlLCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIG5vbi10aGVuYWJsZXNcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb250cm9sIGByZXNvbHZlYCBhcmd1bWVudHMgYnkgbGV0dGluZyBBcnJheSNzbGljZSBjYXN0IGJvb2xlYW4gYG5vVmFsdWVgIHRvIGludGVnZXI6XG5cdFx0XHQvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApXG5cdFx0XHQvLyAqIHRydWU6IFsgdmFsdWUgXS5zbGljZSggMSApID0+IHJlc29sdmUoKVxuXHRcdFx0cmVzb2x2ZS5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0uc2xpY2UoIG5vVmFsdWUgKSApO1xuXHRcdH1cblxuXHQvLyBGb3IgUHJvbWlzZXMvQSssIGNvbnZlcnQgZXhjZXB0aW9ucyBpbnRvIHJlamVjdGlvbnNcblx0Ly8gU2luY2UgalF1ZXJ5LndoZW4gZG9lc24ndCB1bndyYXAgdGhlbmFibGVzLCB3ZSBjYW4gc2tpcCB0aGUgZXh0cmEgY2hlY2tzIGFwcGVhcmluZyBpblxuXHQvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLlxuXHR9IGNhdGNoICggdmFsdWUgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5XG5cdFx0Ly8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dFxuXHRcdHJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTtcblx0fVxufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0RGVmZXJyZWQ6IGZ1bmN0aW9uKCBmdW5jICkge1xuXHRcdHZhciB0dXBsZXMgPSBbXG5cblx0XHRcdFx0Ly8gYWN0aW9uLCBhZGQgbGlzdGVuZXIsIGNhbGxiYWNrcyxcblx0XHRcdFx0Ly8gLi4uIC50aGVuIGhhbmRsZXJzLCBhcmd1bWVudCBpbmRleCwgW2ZpbmFsIHN0YXRlXVxuXHRcdFx0XHRbIFwibm90aWZ5XCIsIFwicHJvZ3Jlc3NcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwibWVtb3J5XCIgKSwgMiBdLFxuXHRcdFx0XHRbIFwicmVzb2x2ZVwiLCBcImRvbmVcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksIDAsIFwicmVzb2x2ZWRcIiBdLFxuXHRcdFx0XHRbIFwicmVqZWN0XCIsIFwiZmFpbFwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgMSwgXCJyZWplY3RlZFwiIF1cblx0XHRcdF0sXG5cdFx0XHRzdGF0ZSA9IFwicGVuZGluZ1wiLFxuXHRcdFx0cHJvbWlzZSA9IHtcblx0XHRcdFx0c3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YWx3YXlzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJjYXRjaFwiOiBmdW5jdGlvbiggZm4gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb21pc2UudGhlbiggbnVsbCwgZm4gKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdHBpcGU6IGZ1bmN0aW9uKCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAqLyApIHtcblx0XHRcdFx0XHR2YXIgZm5zID0gYXJndW1lbnRzO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIF9pLCB0dXBsZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBNYXAgdHVwbGVzIChwcm9ncmVzcywgZG9uZSwgZmFpbCkgdG8gYXJndW1lbnRzIChkb25lLCBmYWlsLCBwcm9ncmVzcylcblx0XHRcdFx0XHRcdFx0dmFyIGZuID0gaXNGdW5jdGlvbiggZm5zWyB0dXBsZVsgNCBdIF0gKSAmJiBmbnNbIHR1cGxlWyA0IF0gXTtcblxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5wcm9ncmVzcyhmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5ub3RpZnkgfSlcblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQuZG9uZShmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZXNvbHZlIH0pXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLmZhaWwoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIucmVqZWN0IH0pXG5cdFx0XHRcdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMSBdIF0oIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciByZXR1cm5lZCA9IGZuICYmIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkICYmIGlzRnVuY3Rpb24oIHJldHVybmVkLnByb21pc2UgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLnByb21pc2UoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQucHJvZ3Jlc3MoIG5ld0RlZmVyLm5vdGlmeSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5kb25lKCBuZXdEZWZlci5yZXNvbHZlIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmZhaWwoIG5ld0RlZmVyLnJlamVjdCApO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlclsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0Zm5zID0gbnVsbDtcblx0XHRcdFx0XHR9ICkucHJvbWlzZSgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGVuOiBmdW5jdGlvbiggb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIG9uUHJvZ3Jlc3MgKSB7XG5cdFx0XHRcdFx0dmFyIG1heERlcHRoID0gMDtcblx0XHRcdFx0XHRmdW5jdGlvbiByZXNvbHZlKCBkZXB0aCwgZGVmZXJyZWQsIGhhbmRsZXIsIHNwZWNpYWwgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHZhciB0aGF0ID0gdGhpcyxcblx0XHRcdFx0XHRcdFx0XHRhcmdzID0gYXJndW1lbnRzLFxuXHRcdFx0XHRcdFx0XHRcdG1pZ2h0VGhyb3cgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHZhciByZXR1cm5lZCwgdGhlbjtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjNcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTU5XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBJZ25vcmUgZG91YmxlLXJlc29sdXRpb24gYXR0ZW1wdHNcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggZGVwdGggPCBtYXhEZXB0aCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZCA9IGhhbmRsZXIuYXBwbHkoIHRoYXQsIGFyZ3MgKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNDhcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggcmV0dXJuZWQgPT09IGRlZmVycmVkLnByb21pc2UoKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggXCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb25cIiApO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9ucyAyLjMuMy4xLCAzLjVcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTU0XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC03NVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gUmV0cmlldmUgYHRoZW5gIG9ubHkgb25jZVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhlbiA9IHJldHVybmVkICYmXG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuNFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02NFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IGNoZWNrIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlbmFiaWxpdHlcblx0XHRcdFx0XHRcdFx0XHRcdFx0KCB0eXBlb2YgcmV0dXJuZWQgPT09IFwib2JqZWN0XCIgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgcmV0dXJuZWQgPT09IFwiZnVuY3Rpb25cIiApICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLnRoZW47XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBhIHJldHVybmVkIHRoZW5hYmxlXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGlzRnVuY3Rpb24oIHRoZW4gKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTcGVjaWFsIHByb2Nlc3NvcnMgKG5vdGlmeSkganVzdCB3YWl0IGZvciByZXNvbHV0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGVuLmNhbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgVGhyb3dlciwgc3BlY2lhbCApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBOb3JtYWwgcHJvY2Vzc29ycyAocmVzb2x2ZSkgYWxzbyBob29rIGludG8gcHJvZ3Jlc3Ncblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIC4uLmFuZCBkaXNyZWdhcmQgb2xkZXIgcmVzb2x1dGlvbiB2YWx1ZXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtYXhEZXB0aCsrO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIFRocm93ZXIsIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGggKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGFsbCBvdGhlciByZXR1cm5lZCB2YWx1ZXNcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcilcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBoYW5kbGVyICE9PSBJZGVudGl0eSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIHJldHVybmVkIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBQcm9jZXNzIHRoZSB2YWx1ZShzKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEZWZhdWx0IHByb2Nlc3MgaXMgcmVzb2x2ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoIHNwZWNpYWwgfHwgZGVmZXJyZWQucmVzb2x2ZVdpdGggKSggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IG5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBjYXRjaCBhbmQgcmVqZWN0IGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzID0gc3BlY2lhbCA/XG5cdFx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93IDpcblx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1pZ2h0VGhyb3coKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soIGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MuZXJyb3IgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuNC4xXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBJZ25vcmUgcG9zdC1yZXNvbHV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICsgMSA+PSBtYXhEZXB0aCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IFRocm93ZXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIGUgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMVxuXHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01N1xuXHRcdFx0XHRcdFx0XHQvLyBSZS1yZXNvbHZlIHByb21pc2VzIGltbWVkaWF0ZWx5IHRvIGRvZGdlIGZhbHNlIHJlamVjdGlvbiBmcm9tXG5cdFx0XHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgZXJyb3JzXG5cdFx0XHRcdFx0XHRcdGlmICggZGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcygpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ2FsbCBhbiBvcHRpb25hbCBob29rIHRvIHJlY29yZCB0aGUgZXJyb3IsIGluIGNhc2Ugb2YgZXhjZXB0aW9uXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc2luY2UgaXQncyBvdGhlcndpc2UgbG9zdCB3aGVuIGV4ZWN1dGlvbiBnb2VzIGFzeW5jXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZ2V0RXJyb3JIb29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5lcnJvciA9IGpRdWVyeS5EZWZlcnJlZC5nZXRFcnJvckhvb2soKTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZSBkZXByZWNhdGVkIGFsaWFzIG9mIHRoZSBhYm92ZS4gV2hpbGUgdGhlIG5hbWUgc3VnZ2VzdHNcblx0XHRcdFx0XHRcdFx0XHQvLyByZXR1cm5pbmcgdGhlIHN0YWNrLCBub3QgYW4gZXJyb3IgaW5zdGFuY2UsIGpRdWVyeSBqdXN0IHBhc3Nlc1xuXHRcdFx0XHRcdFx0XHRcdC8vIGl0IGRpcmVjdGx5IHRvIGBjb25zb2xlLndhcm5gIHNvIGJvdGggd2lsbCB3b3JrOyBhbiBpbnN0YW5jZVxuXHRcdFx0XHRcdFx0XHRcdC8vIGp1c3QgYmV0dGVyIGNvb3BlcmF0ZXMgd2l0aCBzb3VyY2UgbWFwcy5cblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBqUXVlcnkuRGVmZXJyZWQuZ2V0U3RhY2tIb29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5lcnJvciA9IGpRdWVyeS5EZWZlcnJlZC5nZXRTdGFja0hvb2soKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIHByb2Nlc3MgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25Qcm9ncmVzcyApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUHJvZ3Jlc3MgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHksXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIubm90aWZ5V2l0aFxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAxIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvbkZ1bGZpbGxlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uRnVsZmlsbGVkIDpcblx0XHRcdFx0XHRcdFx0XHRcdElkZW50aXR5XG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMiBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25SZWplY3RlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUmVqZWN0ZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0VGhyb3dlclxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZFxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XG5cdFx0XHRcdHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcblxuXHRcdC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHNcblx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHR2YXIgbGlzdCA9IHR1cGxlWyAyIF0sXG5cdFx0XHRcdHN0YXRlU3RyaW5nID0gdHVwbGVbIDUgXTtcblxuXHRcdFx0Ly8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmRvbmUgPSBsaXN0LmFkZFxuXHRcdFx0Ly8gcHJvbWlzZS5mYWlsID0gbGlzdC5hZGRcblx0XHRcdHByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGVcblx0XHRcdGlmICggc3RhdGVTdHJpbmcgKSB7XG5cdFx0XHRcdGxpc3QuYWRkKFxuXHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVzb2x2ZWRcIiAoaS5lLiwgZnVsZmlsbGVkKVxuXHRcdFx0XHRcdFx0Ly8gc3RhdGUgPSBcInJlamVjdGVkXCJcblx0XHRcdFx0XHRcdHN0YXRlID0gc3RhdGVTdHJpbmc7XG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0Ly8gZnVsZmlsbGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAyIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGVcblx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZVxuXHRcdFx0XHRcdHR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsXG5cblx0XHRcdFx0XHQvLyBwcm9ncmVzc19jYWxsYmFja3MubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAyIF0ubG9jayxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmxvY2tcblx0XHRcdFx0XHR0dXBsZXNbIDAgXVsgMyBdLmxvY2tcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gZnVsZmlsbGVkX2hhbmRsZXJzLmZpcmVcblx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmVcblx0XHRcdGxpc3QuYWRkKCB0dXBsZVsgMyBdLmZpcmUgKTtcblxuXHRcdFx0Ly8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlc29sdmVXaXRoKC4uLikgfVxuXHRcdFx0Ly8gZGVmZXJyZWQucmVqZWN0ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlamVjdFdpdGgoLi4uKSB9XG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyB1bmRlZmluZWQgOiB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0Ly8gZGVmZXJyZWQucmVzb2x2ZVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3RXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdID0gbGlzdC5maXJlV2l0aDtcblx0XHR9ICk7XG5cblx0XHQvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2Vcblx0XHRwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7XG5cblx0XHQvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55XG5cdFx0aWYgKCBmdW5jICkge1xuXHRcdFx0ZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGwgZG9uZSFcblx0XHRyZXR1cm4gZGVmZXJyZWQ7XG5cdH0sXG5cblx0Ly8gRGVmZXJyZWQgaGVscGVyXG5cdHdoZW46IGZ1bmN0aW9uKCBzaW5nbGVWYWx1ZSApIHtcblx0XHR2YXJcblxuXHRcdFx0Ly8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzXG5cdFx0XHRyZW1haW5pbmcgPSBhcmd1bWVudHMubGVuZ3RoLFxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHNcblx0XHRcdGkgPSByZW1haW5pbmcsXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGFcblx0XHRcdHJlc29sdmVDb250ZXh0cyA9IEFycmF5KCBpICksXG5cdFx0XHRyZXNvbHZlVmFsdWVzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cblx0XHRcdC8vIHRoZSBwcmltYXJ5IERlZmVycmVkXG5cdFx0XHRwcmltYXJ5ID0galF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3Rvcnlcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdHByaW1hcnkucmVzb2x2ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHQvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmVcblx0XHRpZiAoIHJlbWFpbmluZyA8PSAxICkge1xuXHRcdFx0YWRvcHRWYWx1ZSggc2luZ2xlVmFsdWUsIHByaW1hcnkuZG9uZSggdXBkYXRlRnVuYyggaSApICkucmVzb2x2ZSwgcHJpbWFyeS5yZWplY3QsXG5cdFx0XHRcdCFyZW1haW5pbmcgKTtcblxuXHRcdFx0Ly8gVXNlIC50aGVuKCkgdG8gdW53cmFwIHNlY29uZGFyeSB0aGVuYWJsZXMgKGNmLiBnaC0zMDAwKVxuXHRcdFx0aWYgKCBwcmltYXJ5LnN0YXRlKCkgPT09IFwicGVuZGluZ1wiIHx8XG5cdFx0XHRcdGlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiByZXNvbHZlVmFsdWVzWyBpIF0udGhlbiApICkge1xuXG5cdFx0XHRcdHJldHVybiBwcmltYXJ5LnRoZW4oKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBNdWx0aXBsZSBhcmd1bWVudHMgYXJlIGFnZ3JlZ2F0ZWQgbGlrZSBQcm9taXNlLmFsbCBhcnJheSBlbGVtZW50c1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0YWRvcHRWYWx1ZSggcmVzb2x2ZVZhbHVlc1sgaSBdLCB1cGRhdGVGdW5jKCBpICksIHByaW1hcnkucmVqZWN0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByaW1hcnkucHJvbWlzZSgpO1xuXHR9XG59ICk7XG5cblxuLy8gVGhlc2UgdXN1YWxseSBpbmRpY2F0ZSBhIHByb2dyYW1tZXIgbWlzdGFrZSBkdXJpbmcgZGV2ZWxvcG1lbnQsXG4vLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC5cbnZhciByZXJyb3JOYW1lcyA9IC9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1xuXG4vLyBJZiBgalF1ZXJ5LkRlZmVycmVkLmdldEVycm9ySG9va2AgaXMgZGVmaW5lZCwgYGFzeW5jRXJyb3JgIGlzIGFuIGVycm9yXG4vLyBjYXB0dXJlZCBiZWZvcmUgdGhlIGFzeW5jIGJhcnJpZXIgdG8gZ2V0IHRoZSBvcmlnaW5hbCBlcnJvciBjYXVzZVxuLy8gd2hpY2ggbWF5IG90aGVyd2lzZSBiZSBoaWRkZW4uXG5qUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgYXN5bmNFcnJvciApIHtcblxuXHQvLyBTdXBwb3J0OiBJRSA4IC0gOSBvbmx5XG5cdC8vIENvbnNvbGUgZXhpc3RzIHdoZW4gZGV2IHRvb2xzIGFyZSBvcGVuLCB3aGljaCBjYW4gaGFwcGVuIGF0IGFueSB0aW1lXG5cdGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7XG5cdFx0d2luZG93LmNvbnNvbGUud2FybiggXCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiBcIiArIGVycm9yLm1lc3NhZ2UsXG5cdFx0XHRlcnJvci5zdGFjaywgYXN5bmNFcnJvciApO1xuXHR9XG59O1xuXG5cblxuXG5qUXVlcnkucmVhZHlFeGNlcHRpb24gPSBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHR0aHJvdyBlcnJvcjtcblx0fSApO1xufTtcblxuXG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cbmpRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHtcblxuXHRyZWFkeUxpc3Rcblx0XHQudGhlbiggZm4gKVxuXG5cdFx0Ly8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXBcblx0XHQvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2tcblx0XHQvLyByZWdpc3RyYXRpb24uXG5cdFx0LmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlFeGNlcHRpb24oIGVycm9yICk7XG5cdFx0fSApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgdHJhYy02NzgxXG5cdHJlYWR5V2FpdDogMSxcblxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XG5cdHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHtcblxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcblx0XHRpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHlcblx0XHRqUXVlcnkuaXNSZWFkeSA9IHRydWU7XG5cblx0XHQvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZVxuXHRcdGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcblx0XHRyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjtcblxuLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcblx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCApO1xuXHRqUXVlcnkucmVhZHkoKTtcbn1cblxuLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWRcbi8vIGFmdGVyIHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLlxuLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seVxuLy8gT2xkZXIgSUUgc29tZXRpbWVzIHNpZ25hbHMgXCJpbnRlcmFjdGl2ZVwiIHRvbyBzb29uXG5pZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiB8fFxuXHQoIGRvY3VtZW50LnJlYWR5U3RhdGUgIT09IFwibG9hZGluZ1wiICYmICFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgKSApIHtcblxuXHQvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHlcblx0d2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApO1xuXG59IGVsc2Uge1xuXG5cdC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXG5cdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG59XG5cblxuXG5cbi8vIE11bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvblxuLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uXG52YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGJ1bGsgPSBrZXkgPT0gbnVsbDtcblxuXHQvLyBTZXRzIG1hbnkgdmFsdWVzXG5cdGlmICggdG9UeXBlKCBrZXkgKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXHRcdGZvciAoIGkgaW4ga2V5ICkge1xuXHRcdFx0YWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVsgaSBdLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7XG5cdFx0fVxuXG5cdC8vIFNldHMgb25lIHZhbHVlXG5cdH0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblxuXHRcdGlmICggIWlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyYXcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICggYnVsayApIHtcblxuXHRcdFx0Ly8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0XG5cdFx0XHRpZiAoIHJhdyApIHtcblx0XHRcdFx0Zm4uY2FsbCggZWxlbXMsIHZhbHVlICk7XG5cdFx0XHRcdGZuID0gbnVsbDtcblxuXHRcdFx0Ly8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnVsayA9IGZuO1xuXHRcdFx0XHRmbiA9IGZ1bmN0aW9uKCBlbGVtLCBfa2V5LCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdGZuKFxuXHRcdFx0XHRcdGVsZW1zWyBpIF0sIGtleSwgcmF3ID9cblx0XHRcdFx0XHRcdHZhbHVlIDpcblx0XHRcdFx0XHRcdHZhbHVlLmNhbGwoIGVsZW1zWyBpIF0sIGksIGZuKCBlbGVtc1sgaSBdLCBrZXkgKSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBjaGFpbmFibGUgKSB7XG5cdFx0cmV0dXJuIGVsZW1zO1xuXHR9XG5cblx0Ly8gR2V0c1xuXHRpZiAoIGJ1bGsgKSB7XG5cdFx0cmV0dXJuIGZuLmNhbGwoIGVsZW1zICk7XG5cdH1cblxuXHRyZXR1cm4gbGVuID8gZm4oIGVsZW1zWyAwIF0sIGtleSApIDogZW1wdHlHZXQ7XG59O1xuXG5cbi8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xudmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sXG5cdHJkYXNoQWxwaGEgPSAvLShbYS16XSkvZztcblxuLy8gVXNlZCBieSBjYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5mdW5jdGlvbiBmY2FtZWxDYXNlKCBfYWxsLCBsZXR0ZXIgKSB7XG5cdHJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTtcbn1cblxuLy8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlc1xuLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNVxuLy8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKHRyYWMtOTU3MilcbmZ1bmN0aW9uIGNhbWVsQ2FzZSggc3RyaW5nICkge1xuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHJtc1ByZWZpeCwgXCJtcy1cIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTtcbn1cbnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkge1xuXG5cdC8vIEFjY2VwdHMgb25seTpcblx0Ly8gIC0gTm9kZVxuXHQvLyAgICAtIE5vZGUuRUxFTUVOVF9OT0RFXG5cdC8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFXG5cdC8vICAtIE9iamVjdFxuXHQvLyAgICAtIEFueVxuXHRyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7XG59O1xuXG5cblxuXG5mdW5jdGlvbiBEYXRhKCkge1xuXHR0aGlzLmV4cGFuZG8gPSBqUXVlcnkuZXhwYW5kbyArIERhdGEudWlkKys7XG59XG5cbkRhdGEudWlkID0gMTtcblxuRGF0YS5wcm90b3R5cGUgPSB7XG5cblx0Y2FjaGU6IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHRcdC8vIENoZWNrIGlmIHRoZSBvd25lciBvYmplY3QgYWxyZWFkeSBoYXMgYSBjYWNoZVxuXHRcdHZhciB2YWx1ZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblxuXHRcdC8vIElmIG5vdCwgY3JlYXRlIG9uZVxuXHRcdGlmICggIXZhbHVlICkge1xuXHRcdFx0dmFsdWUgPSB7fTtcblxuXHRcdFx0Ly8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsXG5cdFx0XHQvLyBidXQgd2Ugc2hvdWxkIG5vdCwgc2VlIHRyYWMtODMzNS5cblx0XHRcdC8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LlxuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBvd25lciApICkge1xuXG5cdFx0XHRcdC8vIElmIGl0IGlzIGEgbm9kZSB1bmxpa2VseSB0byBiZSBzdHJpbmdpZnktZWQgb3IgbG9vcGVkIG92ZXJcblx0XHRcdFx0Ly8gdXNlIHBsYWluIGFzc2lnbm1lbnRcblx0XHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB2YWx1ZTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2Ugc2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHlcblx0XHRcdFx0Ly8gY29uZmlndXJhYmxlIG11c3QgYmUgdHJ1ZSB0byBhbGxvdyB0aGUgcHJvcGVydHkgdG8gYmVcblx0XHRcdFx0Ly8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggb3duZXIsIHRoaXMuZXhwYW5kbywge1xuXHRcdFx0XHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7XG5cdFx0dmFyIHByb3AsXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGUoIG93bmVyICk7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUgXSBhcmdzXG5cdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBkYXRhICkgXSA9IHZhbHVlO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3Ncblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBwcm9wICkgXSA9IGRhdGFbIHByb3AgXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlO1xuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzLmNhY2hlKCBvd25lciApIDpcblxuXHRcdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdICYmIG93bmVyWyB0aGlzLmV4cGFuZG8gXVsgY2FtZWxDYXNlKCBrZXkgKSBdO1xuXHR9LFxuXHRhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHtcblxuXHRcdC8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gTm8ga2V5IHdhcyBzcGVjaWZpZWRcblx0XHQvLyAgIDIuIEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFsdWUgcHJvdmlkZWRcblx0XHQvL1xuXHRcdC8vIFRha2UgdGhlIFwicmVhZFwiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZVxuXHRcdC8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3Rcblx0XHQvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5XG5cdFx0Ly9cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdCggKCBrZXkgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiApICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2hlbiB0aGUga2V5IGlzIG5vdCBhIHN0cmluZywgb3IgYm90aCBhIGtleSBhbmQgdmFsdWVcblx0XHQvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gQW4gb2JqZWN0IG9mIHByb3BlcnRpZXNcblx0XHQvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vXG5cdFx0dGhpcy5zZXQoIG93bmVyLCBrZXksIHZhbHVlICk7XG5cblx0XHQvLyBTaW5jZSB0aGUgXCJzZXRcIiBwYXRoIGNhbiBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHNcblx0XHQvLyByZXR1cm4gdGhlIGV4cGVjdGVkIGRhdGEgYmFzZWQgb24gd2hpY2ggcGF0aCB3YXMgdGFrZW5bKl1cblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5O1xuXHR9LFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHZhciBpLFxuXHRcdFx0Y2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHRpZiAoIGNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydCBhcnJheSBvciBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGtleXNcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHNldCBjYW1lbENhc2Uga2V5cywgc28gcmVtb3ZlIHRoYXQuXG5cdFx0XHRcdGtleSA9IGtleS5tYXAoIGNhbWVsQ2FzZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0a2V5ID0gY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0XHQvLyBJZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlXG5cdFx0XHRcdGtleSA9IGtleSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0WyBrZXkgXSA6XG5cdFx0XHRcdFx0KCBrZXkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpID0ga2V5Lmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgdGhlcmUncyBubyBtb3JlIGRhdGFcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1XG5cdFx0XHQvLyBXZWJraXQgJiBCbGluayBwZXJmb3JtYW5jZSBzdWZmZXJzIHdoZW4gZGVsZXRpbmcgcHJvcGVydGllc1xuXHRcdFx0Ly8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZFxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzc4NjA3IChidWcgcmVzdHJpY3RlZClcblx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRoYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0dmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdHJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTtcblx0fVxufTtcbnZhciBkYXRhUHJpdiA9IG5ldyBEYXRhKCk7XG5cbnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7XG5cblxuXG4vL1x0SW1wbGVtZW50YXRpb24gU3VtbWFyeVxuLy9cbi8vXHQxLiBFbmZvcmNlIEFQSSBzdXJmYWNlIGFuZCBzZW1hbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggMS45LnggYnJhbmNoXG4vL1x0Mi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlXG4vL1x0XHRwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20uXG4vL1x0My4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBcInByaXZhdGVcIiBhbmQgXCJ1c2VyXCIgZGF0YS5cbi8vXHQ0LiBfTmV2ZXJfIGV4cG9zZSBcInByaXZhdGVcIiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpXG4vL1x0NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvbiB1c2VyIG9iamVjdHMgKGVnLiBleHBhbmRvIHByb3BlcnRpZXMpXG4vL1x0Ni4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0XG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvW0EtWl0vZztcblxuZnVuY3Rpb24gZ2V0RGF0YSggZGF0YSApIHtcblx0aWYgKCBkYXRhID09PSBcInRydWVcIiApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJmYWxzZVwiICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJudWxsXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xuXHRpZiAoIGRhdGEgPT09ICtkYXRhICsgXCJcIiApIHtcblx0XHRyZXR1cm4gK2RhdGE7XG5cdH1cblxuXHRpZiAoIHJicmFjZS50ZXN0KCBkYXRhICkgKSB7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKTtcblx0fVxuXG5cdHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXHR2YXIgbmFtZTtcblxuXHQvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55XG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxuXHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJCZcIiApLnRvTG93ZXJDYXNlKCk7XG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGdldERhdGEoIGRhdGEgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRkYXRhVXNlci5zZXQoIGVsZW0sIGtleSwgZGF0YSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTtcblx0fSxcblxuXHRkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVVzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH0sXG5cblx0Ly8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWRcblx0Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YVByaXYgbWV0aG9kcywgdGhlc2UgY2FuIGJlIGRlcHJlY2F0ZWQuXG5cdF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGRhdGEsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0YXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlcztcblxuXHRcdC8vIEdldHMgYWxsIHZhbHVlc1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHRoaXMubGVuZ3RoICkge1xuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhUHJpdi5nZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIgKSApIHtcblx0XHRcdFx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKHRyYWMtMTQ4OTQpXG5cdFx0XHRcdFx0XHRpZiAoIGF0dHJzWyBpIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7XG5cdFx0XHRcdFx0XHRcdGlmICggbmFtZS5pbmRleE9mKCBcImRhdGEtXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lID0gY2FtZWxDYXNlKCBuYW1lLnNsaWNlKCA1ICkgKTtcblx0XHRcdFx0XHRcdFx0XHRkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0cyBtdWx0aXBsZSB2YWx1ZXNcblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZGF0YTtcblxuXHRcdFx0Ly8gVGhlIGNhbGxpbmcgalF1ZXJ5IG9iamVjdCAoZWxlbWVudCBtYXRjaGVzKSBpcyBub3QgZW1wdHlcblx0XHRcdC8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlXG5cdFx0XHQvLyBgdmFsdWVgIHBhcmFtZXRlciB3YXMgbm90IHVuZGVmaW5lZC4gQW4gZW1wdHkgalF1ZXJ5IG9iamVjdFxuXHRcdFx0Ly8gd2lsbCByZXN1bHQgaW4gYHVuZGVmaW5lZGAgZm9yIGVsZW0gPSB0aGlzWyAwIF0gd2hpY2ggd2lsbFxuXHRcdFx0Ly8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS5cblx0XHRcdGlmICggZWxlbSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGVcblx0XHRcdFx0Ly8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGFcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBcImRpc2NvdmVyXCIgdGhlIGRhdGEgaW5cblx0XHRcdFx0Ly8gSFRNTDUgY3VzdG9tIGRhdGEtKiBhdHRyc1xuXHRcdFx0XHRkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdlIHRyaWVkIHJlYWxseSBoYXJkLCBidXQgdGhlIGRhdGEgZG9lc24ndCBleGlzdC5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgdGhlIGRhdGEuLi5cblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHN0b3JlIHRoZSBjYW1lbENhc2VkIGtleVxuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTtcblx0XHRcdH0gKTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGF0YVVzZXIucmVtb3ZlKCB0aGlzLCBrZXkgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgcXVldWU7XG5cblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHR0eXBlID0gKCB0eXBlIHx8IFwiZnhcIiApICsgXCJxdWV1ZVwiO1xuXHRcdFx0cXVldWUgPSBkYXRhUHJpdi5nZXQoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0Ly8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cFxuXHRcdFx0aWYgKCBkYXRhICkge1xuXHRcdFx0XHRpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGRhdGEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHF1ZXVlIHx8IFtdO1xuXHRcdH1cblx0fSxcblxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSxcblx0XHRcdHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLFxuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpLFxuXHRcdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSxcblx0XHRcdG5leHQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTtcblx0XHRcdH07XG5cblx0XHQvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsXG5cdFx0aWYgKCBmbiA9PT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRzdGFydExlbmd0aC0tO1xuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cblx0XHRcdC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmdcblx0XHRcdC8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWRcblx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICkge1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KCBcImlucHJvZ3Jlc3NcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uXG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdGZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhc3RhcnRMZW5ndGggJiYgaG9va3MgKSB7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIE5vdCBwdWJsaWMgLSBnZW5lcmF0ZSBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm4gdGhlIGN1cnJlbnQgb25lXG5cdF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR2YXIga2V5ID0gdHlwZSArIFwicXVldWVIb29rc1wiO1xuXHRcdHJldHVybiBkYXRhUHJpdi5nZXQoIGVsZW0sIGtleSApIHx8IGRhdGFQcml2LmFjY2VzcyggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICkuYWRkKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBbIHR5cGUgKyBcInF1ZXVlXCIsIGtleSBdICk7XG5cdFx0XHR9IClcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzIDpcblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWyAwIF0gIT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0gKTtcblx0fSxcblx0Y2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHR9LFxuXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0gZGF0YVByaXYuZ2V0KCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59ICk7XG52YXIgcG51bSA9ICggL1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8gKS5zb3VyY2U7XG5cbnZhciByY3NzTnVtID0gbmV3IFJlZ0V4cCggXCJeKD86KFsrLV0pPXwpKFwiICsgcG51bSArIFwiKShbYS16JV0qKSRcIiwgXCJpXCIgKTtcblxuXG52YXIgY3NzRXhwYW5kID0gWyBcIlRvcFwiLCBcIlJpZ2h0XCIsIFwiQm90dG9tXCIsIFwiTGVmdFwiIF07XG5cbnZhciBkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblxuXG5cdHZhciBpc0F0dGFjaGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblx0XHR9LFxuXHRcdGNvbXBvc2VkID0geyBjb21wb3NlZDogdHJ1ZSB9O1xuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTIgLSAxOCssIGlPUyAxMC4wIC0gMTAuMiBvbmx5XG5cdC8vIENoZWNrIGF0dGFjaG1lbnQgYWNyb3NzIHNoYWRvdyBET00gYm91bmRhcmllcyB3aGVuIHBvc3NpYmxlIChnaC0zNTA0KVxuXHQvLyBTdXBwb3J0OiBpT1MgMTAuMC0xMC4yIG9ubHlcblx0Ly8gRWFybHkgaU9TIDEwIHZlcnNpb25zIHN1cHBvcnQgYGF0dGFjaFNoYWRvd2AgYnV0IG5vdCBgZ2V0Um9vdE5vZGVgLFxuXHQvLyBsZWFkaW5nIHRvIGVycm9ycy4gV2UgbmVlZCB0byBjaGVjayBmb3IgYGdldFJvb3ROb2RlYC5cblx0aWYgKCBkb2N1bWVudEVsZW1lbnQuZ2V0Um9vdE5vZGUgKSB7XG5cdFx0aXNBdHRhY2hlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgfHxcblx0XHRcdFx0ZWxlbS5nZXRSb290Tm9kZSggY29tcG9zZWQgKSA9PT0gZWxlbS5vd25lckRvY3VtZW50O1xuXHRcdH07XG5cdH1cbnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7XG5cblx0XHQvLyBpc0hpZGRlbldpdGhpblRyZWUgbWlnaHQgYmUgY2FsbGVkIGZyb20galF1ZXJ5I2ZpbHRlciBmdW5jdGlvbjtcblx0XHQvLyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnRcblx0XHRlbGVtID0gZWwgfHwgZWxlbTtcblxuXHRcdC8vIElubGluZSBzdHlsZSB0cnVtcHMgYWxsXG5cdFx0cmV0dXJuIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgfHxcblx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJlxuXG5cdFx0XHQvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDMgLSA0NVxuXHRcdFx0Ly8gRGlzY29ubmVjdGVkIGVsZW1lbnRzIGNhbiBoYXZlIGNvbXB1dGVkIGRpc3BsYXk6IG5vbmUsIHNvIGZpcnN0IGNvbmZpcm0gdGhhdCBlbGVtIGlzXG5cdFx0XHQvLyBpbiB0aGUgZG9jdW1lbnQuXG5cdFx0XHRpc0F0dGFjaGVkKCBlbGVtICkgJiZcblxuXHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSA9PT0gXCJub25lXCI7XG5cdH07XG5cblxuXG5mdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkge1xuXHR2YXIgYWRqdXN0ZWQsIHNjYWxlLFxuXHRcdG1heEl0ZXJhdGlvbnMgPSAyMCxcblx0XHRjdXJyZW50VmFsdWUgPSB0d2VlbiA/XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmN1cigpO1xuXHRcdFx0fSA6XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsIFwiXCIgKTtcblx0XHRcdH0sXG5cdFx0aW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLFxuXHRcdHVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKSxcblxuXHRcdC8vIFN0YXJ0aW5nIHZhbHVlIGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzXG5cdFx0aW5pdGlhbEluVW5pdCA9IGVsZW0ubm9kZVR5cGUgJiZcblx0XHRcdCggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09IFwicHhcIiAmJiAraW5pdGlhbCApICYmXG5cdFx0XHRyY3NzTnVtLmV4ZWMoIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AgKSApO1xuXG5cdGlmICggaW5pdGlhbEluVW5pdCAmJiBpbml0aWFsSW5Vbml0WyAzIF0gIT09IHVuaXQgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTRcblx0XHQvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpXG5cdFx0aW5pdGlhbCA9IGluaXRpYWwgLyAyO1xuXG5cdFx0Ly8gVHJ1c3QgdW5pdHMgcmVwb3J0ZWQgYnkgalF1ZXJ5LmNzc1xuXHRcdHVuaXQgPSB1bml0IHx8IGluaXRpYWxJblVuaXRbIDMgXTtcblxuXHRcdC8vIEl0ZXJhdGl2ZWx5IGFwcHJveGltYXRlIGZyb20gYSBub256ZXJvIHN0YXJ0aW5nIHBvaW50XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsIHx8IDE7XG5cblx0XHR3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHtcblxuXHRcdFx0Ly8gRXZhbHVhdGUgYW5kIHVwZGF0ZSBvdXIgYmVzdCBndWVzcyAoZG91YmxpbmcgZ3Vlc3NlcyB0aGF0IHplcm8gb3V0KS5cblx0XHRcdC8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS5cblx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTtcblx0XHRcdGlmICggKCAxIC0gc2NhbGUgKSAqICggMSAtICggc2NhbGUgPSBjdXJyZW50VmFsdWUoKSAvIGluaXRpYWwgfHwgMC41ICkgKSA8PSAwICkge1xuXHRcdFx0XHRtYXhJdGVyYXRpb25zID0gMDtcblx0XHRcdH1cblx0XHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7XG5cblx0XHR9XG5cblx0XHRpbml0aWFsSW5Vbml0ID0gaW5pdGlhbEluVW5pdCAqIDI7XG5cdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvblxuXHRcdHZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdO1xuXHR9XG5cblx0aWYgKCB2YWx1ZVBhcnRzICkge1xuXHRcdGluaXRpYWxJblVuaXQgPSAraW5pdGlhbEluVW5pdCB8fCAraW5pdGlhbCB8fCAwO1xuXG5cdFx0Ly8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkXG5cdFx0YWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gP1xuXHRcdFx0aW5pdGlhbEluVW5pdCArICggdmFsdWVQYXJ0c1sgMSBdICsgMSApICogdmFsdWVQYXJ0c1sgMiBdIDpcblx0XHRcdCt2YWx1ZVBhcnRzWyAyIF07XG5cdFx0aWYgKCB0d2VlbiApIHtcblx0XHRcdHR3ZWVuLnVuaXQgPSB1bml0O1xuXHRcdFx0dHdlZW4uc3RhcnQgPSBpbml0aWFsSW5Vbml0O1xuXHRcdFx0dHdlZW4uZW5kID0gYWRqdXN0ZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhZGp1c3RlZDtcbn1cblxuXG52YXIgZGVmYXVsdERpc3BsYXlNYXAgPSB7fTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7XG5cdHZhciB0ZW1wLFxuXHRcdGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCxcblx0XHRub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUsXG5cdFx0ZGlzcGxheSA9IGRlZmF1bHREaXNwbGF5TWFwWyBub2RlTmFtZSBdO1xuXG5cdGlmICggZGlzcGxheSApIHtcblx0XHRyZXR1cm4gZGlzcGxheTtcblx0fVxuXG5cdHRlbXAgPSBkb2MuYm9keS5hcHBlbmRDaGlsZCggZG9jLmNyZWF0ZUVsZW1lbnQoIG5vZGVOYW1lICkgKTtcblx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsIFwiZGlzcGxheVwiICk7XG5cblx0dGVtcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0ZW1wICk7XG5cblx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRkaXNwbGF5ID0gXCJibG9ja1wiO1xuXHR9XG5cdGRlZmF1bHREaXNwbGF5TWFwWyBub2RlTmFtZSBdID0gZGlzcGxheTtcblxuXHRyZXR1cm4gZGlzcGxheTtcbn1cblxuZnVuY3Rpb24gc2hvd0hpZGUoIGVsZW1lbnRzLCBzaG93ICkge1xuXHR2YXIgZGlzcGxheSwgZWxlbSxcblx0XHR2YWx1ZXMgPSBbXSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoO1xuXG5cdC8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZVxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0ZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTtcblx0XHRpZiAoIHNob3cgKSB7XG5cblx0XHRcdC8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdylcblx0XHRcdC8vIGNoZWNrIGlzIHJlcXVpcmVkIGluIHRoaXMgZmlyc3QgbG9vcCB1bmxlc3Mgd2UgaGF2ZSBhIG5vbmVtcHR5IGRpc3BsYXkgdmFsdWUgKGVpdGhlclxuXHRcdFx0Ly8gaW5saW5lIG9yIGFib3V0LXRvLWJlLXJlc3RvcmVkKVxuXHRcdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApIHx8IG51bGw7XG5cdFx0XHRcdGlmICggIXZhbHVlc1sgaW5kZXggXSApIHtcblx0XHRcdFx0XHRlbGVtLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJiBpc0hpZGRlbldpdGhpblRyZWUoIGVsZW0gKSApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCBkaXNwbGF5ICE9PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gXCJub25lXCI7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgd2hhdCB3ZSdyZSBvdmVyd3JpdGluZ1xuXHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiZGlzcGxheVwiLCBkaXNwbGF5ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvd1xuXHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGlmICggdmFsdWVzWyBpbmRleCBdICE9IG51bGwgKSB7XG5cdFx0XHRlbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50cztcbn1cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTtcblx0fSxcblx0aGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzICk7XG5cdH0sXG5cdHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkge1xuXHRcdGlmICggdHlwZW9mIHN0YXRlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGlzSGlkZGVuV2l0aGluVHJlZSggdGhpcyApICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5zaG93KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG59ICk7XG52YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7XG5cbnZhciBydGFnTmFtZSA9ICggLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pICk7XG5cbnZhciByc2NyaXB0VHlwZSA9ICggL14kfF5tb2R1bGUkfFxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApO1xuXG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdGRpdiA9IGZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKSxcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHlcblx0Ly8gQ2hlY2sgc3RhdGUgbG9zdCBpZiB0aGUgbmFtZSBpcyBzZXQgKHRyYWMtMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICh0cmFjLTE0OTAxKVxuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcInJhZGlvXCIgKTtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcImNoZWNrZWRcIiwgXCJjaGVja2VkXCIgKTtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJ0XCIgKTtcblxuXHRkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMSBvbmx5XG5cdC8vIE9sZGVyIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50c1xuXHRzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIE1ha2Ugc3VyZSB0ZXh0YXJlYSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUgaXMgcHJvcGVybHkgY2xvbmVkXG5cdGRpdi5pbm5lckhUTUwgPSBcIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT5cIjtcblx0c3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCA9ICEhZGl2LmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0Ly8gSUUgPD05IHJlcGxhY2VzIDxvcHRpb24+IHRhZ3Mgd2l0aCB0aGVpciBjb250ZW50cyB3aGVuIGluc2VydGVkIG91dHNpZGUgb2Zcblx0Ly8gdGhlIHNlbGVjdCBlbGVtZW50LlxuXHRkaXYuaW5uZXJIVE1MID0gXCI8b3B0aW9uPjwvb3B0aW9uPlwiO1xuXHRzdXBwb3J0Lm9wdGlvbiA9ICEhZGl2Lmxhc3RDaGlsZDtcbn0gKSgpO1xuXG5cbi8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICh0cmFjLTEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cbi8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5pZiAoICFzdXBwb3J0Lm9wdGlvbiApIHtcblx0d3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uID0gWyAxLCBcIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz5cIiwgXCI8L3NlbGVjdD5cIiBdO1xufVxuXG5cbmZ1bmN0aW9uIGdldEFsbCggY29udGV4dCwgdGFnICkge1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0Ly8gVXNlIHR5cGVvZiB0byBhdm9pZCB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBpbnZvY2F0aW9uIG9uIGhvc3Qgb2JqZWN0cyAodHJhYy0xNTE1MSlcblx0dmFyIHJldDtcblxuXHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCBcIipcIiApO1xuXG5cdH0gZWxzZSBpZiAoIHR5cGVvZiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0cmV0ID0gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2Uge1xuXHRcdHJldCA9IFtdO1xuXHR9XG5cblx0aWYgKCB0YWcgPT09IHVuZGVmaW5lZCB8fCB0YWcgJiYgbm9kZU5hbWUoIGNvbnRleHQsIHRhZyApICkge1xuXHRcdHJldHVybiBqUXVlcnkubWVyZ2UoIFsgY29udGV4dCBdLCByZXQgKTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59XG5cblxuLy8gTWFyayBzY3JpcHRzIGFzIGhhdmluZyBhbHJlYWR5IGJlZW4gZXZhbHVhdGVkXG5mdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRkYXRhUHJpdi5zZXQoXG5cdFx0XHRlbGVtc1sgaSBdLFxuXHRcdFx0XCJnbG9iYWxFdmFsXCIsXG5cdFx0XHQhcmVmRWxlbWVudHMgfHwgZGF0YVByaXYuZ2V0KCByZWZFbGVtZW50c1sgaSBdLCBcImdsb2JhbEV2YWxcIiApXG5cdFx0KTtcblx0fVxufVxuXG5cbnZhciByaHRtbCA9IC88fCYjP1xcdys7LztcblxuZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHtcblx0dmFyIGVsZW0sIHRtcCwgdGFnLCB3cmFwLCBhdHRhY2hlZCwgaixcblx0XHRmcmFnbWVudCA9IGNvbnRleHQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdG5vZGVzID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1zWyBpIF07XG5cblx0XHRpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHtcblxuXHRcdFx0Ly8gQWRkIG5vZGVzIGRpcmVjdGx5XG5cdFx0XHRpZiAoIHRvVHlwZSggZWxlbSApID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTtcblxuXHRcdFx0Ly8gQ29udmVydCBub24taHRtbCBpbnRvIGEgdGV4dCBub2RlXG5cdFx0XHR9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkge1xuXHRcdFx0XHRub2Rlcy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICkgKTtcblxuXHRcdFx0Ly8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0bXAgPSB0bXAgfHwgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGNvbnRleHQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICk7XG5cblx0XHRcdFx0Ly8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvblxuXHRcdFx0XHR0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0d3JhcCA9IHdyYXBNYXBbIHRhZyBdIHx8IHdyYXBNYXAuX2RlZmF1bHQ7XG5cdFx0XHRcdHRtcC5pbm5lckhUTUwgPSB3cmFwWyAxIF0gKyBqUXVlcnkuaHRtbFByZWZpbHRlciggZWxlbSApICsgd3JhcFsgMiBdO1xuXG5cdFx0XHRcdC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudFxuXHRcdFx0XHRqID0gd3JhcFsgMCBdO1xuXHRcdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0XHR0bXAgPSB0bXAubGFzdENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxkTm9kZXMgKTtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lclxuXHRcdFx0XHR0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSB0aGUgY3JlYXRlZCBub2RlcyBhcmUgb3JwaGFuZWQgKHRyYWMtMTIzOTIpXG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRmcmFnbWVudC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0aSA9IDA7XG5cdHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7XG5cblx0XHQvLyBTa2lwIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgY29sbGVjdGlvbiAodHJhYy00MDg3KVxuXHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSA+IC0xICkge1xuXHRcdFx0aWYgKCBpZ25vcmVkICkge1xuXHRcdFx0XHRpZ25vcmVkLnB1c2goIGVsZW0gKTtcblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGF0dGFjaGVkID0gaXNBdHRhY2hlZCggZWxlbSApO1xuXG5cdFx0Ly8gQXBwZW5kIHRvIGZyYWdtZW50XG5cdFx0dG1wID0gZ2V0QWxsKCBmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApLCBcInNjcmlwdFwiICk7XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0aWYgKCBhdHRhY2hlZCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIHRtcCApO1xuXHRcdH1cblxuXHRcdC8vIENhcHR1cmUgZXhlY3V0YWJsZXNcblx0XHRpZiAoIHNjcmlwdHMgKSB7XG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdG1wWyBqKysgXSApICkge1xuXHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSB8fCBcIlwiICkgKSB7XG5cdFx0XHRcdFx0c2NyaXB0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZnJhZ21lbnQ7XG59XG5cblxudmFyIHJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XFwuKC4rKXwpLztcblxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJldHVybkZhbHNlKCkge1xuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9uKCBlbGVtLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCBvbmUgKSB7XG5cdHZhciBvcmlnRm4sIHR5cGU7XG5cblx0Ly8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzXG5cdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gKCB0eXBlcy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhIClcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKVxuXHRcdFx0ZGF0YSA9IGRhdGEgfHwgc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdG9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7XG5cdFx0fVxuXHRcdHJldHVybiBlbGVtO1xuXHR9XG5cblx0aWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHtcblxuXHRcdC8vICggdHlwZXMsIGZuIClcblx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdGRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHtcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgc2VsZWN0b3IsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgZGF0YSwgZm4gKVxuXHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdH0gZWxzZSBpZiAoICFmbiApIHtcblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggb25lID09PSAxICkge1xuXHRcdG9yaWdGbiA9IGZuO1xuXHRcdGZuID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0XHQvLyBDYW4gdXNlIGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQgY29udGFpbnMgdGhlIGluZm9cblx0XHRcdGpRdWVyeSgpLm9mZiggZXZlbnQgKTtcblx0XHRcdHJldHVybiBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH07XG5cblx0XHQvLyBVc2Ugc2FtZSBndWlkIHNvIGNhbGxlciBjYW4gcmVtb3ZlIHVzaW5nIG9yaWdGblxuXHRcdGZuLmd1aWQgPSBvcmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApO1xuXHR9XG5cdHJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTtcblx0fSApO1xufVxuXG4vKlxuICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLlxuICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy5cbiAqL1xualF1ZXJ5LmV2ZW50ID0ge1xuXG5cdGdsb2JhbDoge30sXG5cblx0YWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkge1xuXG5cdFx0dmFyIGhhbmRsZU9iakluLCBldmVudEhhbmRsZSwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2LmdldCggZWxlbSApO1xuXG5cdFx0Ly8gT25seSBhdHRhY2ggZXZlbnRzIHRvIG9iamVjdHMgdGhhdCBhY2NlcHQgZGF0YVxuXHRcdGlmICggIWFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhhbmRsZXJcblx0XHRpZiAoIGhhbmRsZXIuaGFuZGxlciApIHtcblx0XHRcdGhhbmRsZU9iakluID0gaGFuZGxlcjtcblx0XHRcdGhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyO1xuXHRcdFx0c2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3Rvcjtcblx0XHR9XG5cblx0XHQvLyBFbnN1cmUgdGhhdCBpbnZhbGlkIHNlbGVjdG9ycyB0aHJvdyBleGNlcHRpb25zIGF0IGF0dGFjaCB0aW1lXG5cdFx0Ly8gRXZhbHVhdGUgYWdhaW5zdCBkb2N1bWVudEVsZW1lbnQgaW4gY2FzZSBlbGVtIGlzIGEgbm9uLWVsZW1lbnQgbm9kZSAoZS5nLiwgZG9jdW1lbnQpXG5cdFx0aWYgKCBzZWxlY3RvciApIHtcblx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZG9jdW1lbnRFbGVtZW50LCBzZWxlY3RvciApO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBoYW5kbGVyIGhhcyBhIHVuaXF1ZSBJRCwgdXNlZCB0byBmaW5kL3JlbW92ZSBpdCBsYXRlclxuXHRcdGlmICggIWhhbmRsZXIuZ3VpZCApIHtcblx0XHRcdGhhbmRsZXIuZ3VpZCA9IGpRdWVyeS5ndWlkKys7XG5cdFx0fVxuXG5cdFx0Ly8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdFxuXHRcdGlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7XG5cdFx0XHRldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgPSBPYmplY3QuY3JlYXRlKCBudWxsICk7XG5cdFx0fVxuXHRcdGlmICggISggZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzXG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cblx0XHRcdC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVyc1xuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKVxuXHRcdFx0fSwgaGFuZGxlT2JqSW4gKTtcblxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3Rcblx0XHRcdGlmICggISggaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSApICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdGlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdO1xuXHRcdFx0dG1wID0gdG1wWyAyIF0gJiZcblx0XHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fFxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fFxuXHRcdFx0XHRcdHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSBldmVudHNbIHR5cGUgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgZGF0YSBhbmQgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZFxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImhhbmRsZSBldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkge1xuXG5cdFx0dmFyIGksIGosIHJldCwgbWF0Y2hlZCwgaGFuZGxlT2JqLCBoYW5kbGVyUXVldWUsXG5cdFx0XHRhcmdzID0gbmV3IEFycmF5KCBhcmd1bWVudHMubGVuZ3RoICksXG5cblx0XHRcdC8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdFxuXHRcdFx0ZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApLFxuXG5cdFx0XHRoYW5kbGVycyA9IChcblx0XHRcdFx0ZGF0YVByaXYuZ2V0KCB0aGlzLCBcImV2ZW50c1wiICkgfHwgT2JqZWN0LmNyZWF0ZSggbnVsbCApXG5cdFx0XHQpWyBldmVudC50eXBlIF0gfHwgW10sXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGV2ZW50LnR5cGUgXSB8fCB7fTtcblxuXHRcdC8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50XG5cdFx0YXJnc1sgMCBdID0gZXZlbnQ7XG5cblx0XHRmb3IgKCBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdGFyZ3NbIGkgXSA9IGFyZ3VtZW50c1sgaSBdO1xuXHRcdH1cblxuXHRcdGV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpcztcblxuXHRcdC8vIENhbGwgdGhlIHByZURpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZSwgYW5kIGxldCBpdCBiYWlsIGlmIGRlc2lyZWRcblx0XHRpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgaGFuZGxlcnNcblx0XHRoYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7XG5cblx0XHQvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0aCB1c1xuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKCBtYXRjaGVkID0gaGFuZGxlclF1ZXVlWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0ZXZlbnQuY3VycmVudFRhcmdldCA9IG1hdGNoZWQuZWxlbTtcblxuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggaGFuZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0gKSAmJlxuXHRcdFx0XHQhZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGUgZXZlbnQgaXMgbmFtZXNwYWNlZCwgdGhlbiBlYWNoIGhhbmRsZXIgaXMgb25seSBpbnZva2VkIGlmIGl0IGlzXG5cdFx0XHRcdC8vIHNwZWNpYWxseSB1bml2ZXJzYWwgb3IgaXRzIG5hbWVzcGFjZXMgYXJlIGEgc3VwZXJzZXQgb2YgdGhlIGV2ZW50J3MuXG5cdFx0XHRcdGlmICggIWV2ZW50LnJuYW1lc3BhY2UgfHwgaGFuZGxlT2JqLm5hbWVzcGFjZSA9PT0gZmFsc2UgfHxcblx0XHRcdFx0XHRldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHtcblxuXHRcdFx0XHRcdGV2ZW50LmhhbmRsZU9iaiA9IGhhbmRsZU9iajtcblx0XHRcdFx0XHRldmVudC5kYXRhID0gaGFuZGxlT2JqLmRhdGE7XG5cblx0XHRcdFx0XHRyZXQgPSAoICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9ICkuaGFuZGxlIHx8XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZXZlbnQucmVzdWx0ID0gcmV0ICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlXG5cdFx0aWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHtcblx0XHRcdHNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRoYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycyxcblx0XHRcdGhhbmRsZXJRdWV1ZSA9IFtdLFxuXHRcdFx0ZGVsZWdhdGVDb3VudCA9IGhhbmRsZXJzLmRlbGVnYXRlQ291bnQsXG5cdFx0XHRjdXIgPSBldmVudC50YXJnZXQ7XG5cblx0XHQvLyBGaW5kIGRlbGVnYXRlIGhhbmRsZXJzXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50ICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OVxuXHRcdFx0Ly8gQmxhY2staG9sZSBTVkcgPHVzZT4gaW5zdGFuY2UgdHJlZXMgKHRyYWMtMTMxODApXG5cdFx0XHRjdXIubm9kZVR5cGUgJiZcblxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTQyXG5cdFx0XHQvLyBTdXBwcmVzcyBzcGVjLXZpb2xhdGluZyBjbGlja3MgaW5kaWNhdGluZyBhIG5vbi1wcmltYXJ5IHBvaW50ZXIgYnV0dG9uICh0cmFjLTM4NjEpXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHQvLyAuLi5idXQgbm90IGFycm93IGtleSBcImNsaWNrc1wiIG9mIHJhZGlvIGlucHV0cywgd2hpY2ggY2FuIGhhdmUgYGJ1dHRvbmAgLTEgKGdoLTIzNDMpXG5cdFx0XHQhKCBldmVudC50eXBlID09PSBcImNsaWNrXCIgJiYgZXZlbnQuYnV0dG9uID49IDEgKSApIHtcblxuXHRcdFx0Zm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICh0cmFjLTEzMjA4KVxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAodHJhYy02OTExLCB0cmFjLTgxNjUsIHRyYWMtMTEzODIsIHRyYWMtMTE3NjQpXG5cdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICEoIGV2ZW50LnR5cGUgPT09IFwiY2xpY2tcIiAmJiBjdXIuZGlzYWJsZWQgPT09IHRydWUgKSApIHtcblx0XHRcdFx0XHRtYXRjaGVkSGFuZGxlcnMgPSBbXTtcblx0XHRcdFx0XHRtYXRjaGVkU2VsZWN0b3JzID0ge307XG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAodHJhYy0xMzIwMylcblx0XHRcdFx0XHRcdHNlbCA9IGhhbmRsZU9iai5zZWxlY3RvciArIFwiIFwiO1xuXG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdID0gaGFuZGxlT2JqLm5lZWRzQ29udGV4dCA/XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5KCBzZWwsIHRoaXMgKS5pbmRleCggY3VyICkgPiAtMSA6XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQoIHNlbCwgdGhpcywgbnVsbCwgWyBjdXIgXSApLmxlbmd0aDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogbWF0Y2hlZEhhbmRsZXJzIH0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIHJlbWFpbmluZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJzXG5cdFx0Y3VyID0gdGhpcztcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgPCBoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRoYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaGFuZGxlclF1ZXVlO1xuXHR9LFxuXG5cdGFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblxuXHRcdFx0Z2V0OiBpc0Z1bmN0aW9uKCBob29rICkgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdHJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gOlxuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbIG5hbWUgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsIG5hbWUsIHtcblx0XHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkge1xuXHRcdHJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdG9yaWdpbmFsRXZlbnQgOlxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApO1xuXHR9LFxuXG5cdHNwZWNpYWw6IHtcblx0XHRsb2FkOiB7XG5cblx0XHRcdC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWRcblx0XHRcdG5vQnViYmxlOiB0cnVlXG5cdFx0fSxcblx0XHRjbGljazoge1xuXG5cdFx0XHQvLyBVdGlsaXplIG5hdGl2ZSBldmVudCB0byBlbnN1cmUgY29ycmVjdCBzdGF0ZSBmb3IgY2hlY2thYmxlIGlucHV0c1xuXHRcdFx0c2V0dXA6IGZ1bmN0aW9uKCBkYXRhICkge1xuXG5cdFx0XHRcdC8vIEZvciBtdXR1YWwgY29tcHJlc3NpYmlsaXR5IHdpdGggX2RlZmF1bHQsIHJlcGxhY2UgYHRoaXNgIGFjY2VzcyB3aXRoIGEgbG9jYWwgdmFyLlxuXHRcdFx0XHQvLyBgfHwgZGF0YWAgaXMgZGVhZCBjb2RlIG1lYW50IG9ubHkgdG8gcHJlc2VydmUgdGhlIHZhcmlhYmxlIHRocm91Z2ggbWluaWZpY2F0aW9uLlxuXHRcdFx0XHR2YXIgZWwgPSB0aGlzIHx8IGRhdGE7XG5cblx0XHRcdFx0Ly8gQ2xhaW0gdGhlIGZpcnN0IGhhbmRsZXJcblx0XHRcdFx0aWYgKCByY2hlY2thYmxlVHlwZS50ZXN0KCBlbC50eXBlICkgJiZcblx0XHRcdFx0XHRlbC5jbGljayAmJiBub2RlTmFtZSggZWwsIFwiaW5wdXRcIiApICkge1xuXG5cdFx0XHRcdFx0Ly8gZGF0YVByaXYuc2V0KCBlbCwgXCJjbGlja1wiLCAuLi4gKVxuXHRcdFx0XHRcdGxldmVyYWdlTmF0aXZlKCBlbCwgXCJjbGlja1wiLCB0cnVlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIHByb2Nlc3NpbmcgaW4gdGhlIGNhbGxlclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oIGRhdGEgKSB7XG5cblx0XHRcdFx0Ly8gRm9yIG11dHVhbCBjb21wcmVzc2liaWxpdHkgd2l0aCBfZGVmYXVsdCwgcmVwbGFjZSBgdGhpc2AgYWNjZXNzIHdpdGggYSBsb2NhbCB2YXIuXG5cdFx0XHRcdC8vIGB8fCBkYXRhYCBpcyBkZWFkIGNvZGUgbWVhbnQgb25seSB0byBwcmVzZXJ2ZSB0aGUgdmFyaWFibGUgdGhyb3VnaCBtaW5pZmljYXRpb24uXG5cdFx0XHRcdHZhciBlbCA9IHRoaXMgfHwgZGF0YTtcblxuXHRcdFx0XHQvLyBGb3JjZSBzZXR1cCBiZWZvcmUgdHJpZ2dlcmluZyBhIGNsaWNrXG5cdFx0XHRcdGlmICggcmNoZWNrYWJsZVR5cGUudGVzdCggZWwudHlwZSApICYmXG5cdFx0XHRcdFx0ZWwuY2xpY2sgJiYgbm9kZU5hbWUoIGVsLCBcImlucHV0XCIgKSApIHtcblxuXHRcdFx0XHRcdGxldmVyYWdlTmF0aXZlKCBlbCwgXCJjbGlja1wiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXR1cm4gbm9uLWZhbHNlIHRvIGFsbG93IG5vcm1hbCBldmVudC1wYXRoIHByb3BhZ2F0aW9uXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIHN1cHByZXNzIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5rc1xuXHRcdFx0Ly8gQWxzbyBwcmV2ZW50IGl0IGlmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGUgYSBsZXZlcmFnZWQgbmF0aXZlLWV2ZW50IHN0YWNrXG5cdFx0XHRfZGVmYXVsdDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXHRcdFx0XHRyZXR1cm4gcmNoZWNrYWJsZVR5cGUudGVzdCggdGFyZ2V0LnR5cGUgKSAmJlxuXHRcdFx0XHRcdHRhcmdldC5jbGljayAmJiBub2RlTmFtZSggdGFyZ2V0LCBcImlucHV0XCIgKSAmJlxuXHRcdFx0XHRcdGRhdGFQcml2LmdldCggdGFyZ2V0LCBcImNsaWNrXCIgKSB8fFxuXHRcdFx0XHRcdG5vZGVOYW1lKCB0YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gRW5zdXJlIHRoZSBwcmVzZW5jZSBvZiBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGhhbmRsZXMgbWFudWFsbHktdHJpZ2dlcmVkXG4vLyBzeW50aGV0aWMgZXZlbnRzIGJ5IGludGVycnVwdGluZyBwcm9ncmVzcyB1bnRpbCByZWludm9rZWQgaW4gcmVzcG9uc2UgdG9cbi8vICpuYXRpdmUqIGV2ZW50cyB0aGF0IGl0IGZpcmVzIGRpcmVjdGx5LCBlbnN1cmluZyB0aGF0IHN0YXRlIGNoYW5nZXMgaGF2ZVxuLy8gYWxyZWFkeSBvY2N1cnJlZCBiZWZvcmUgb3RoZXIgbGlzdGVuZXJzIGFyZSBpbnZva2VkLlxuZnVuY3Rpb24gbGV2ZXJhZ2VOYXRpdmUoIGVsLCB0eXBlLCBpc1NldHVwICkge1xuXG5cdC8vIE1pc3NpbmcgYGlzU2V0dXBgIGluZGljYXRlcyBhIHRyaWdnZXIgY2FsbCwgd2hpY2ggbXVzdCBmb3JjZSBzZXR1cCB0aHJvdWdoIGpRdWVyeS5ldmVudC5hZGRcblx0aWYgKCAhaXNTZXR1cCApIHtcblx0XHRpZiAoIGRhdGFQcml2LmdldCggZWwsIHR5cGUgKSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZWwsIHR5cGUsIHJldHVyblRydWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVnaXN0ZXIgdGhlIGNvbnRyb2xsZXIgYXMgYSBzcGVjaWFsIHVuaXZlcnNhbCBoYW5kbGVyIGZvciBhbGwgZXZlbnQgbmFtZXNwYWNlc1xuXHRkYXRhUHJpdi5zZXQoIGVsLCB0eXBlLCBmYWxzZSApO1xuXHRqUXVlcnkuZXZlbnQuYWRkKCBlbCwgdHlwZSwge1xuXHRcdG5hbWVzcGFjZTogZmFsc2UsXG5cdFx0aGFuZGxlcjogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIHJlc3VsdCxcblx0XHRcdFx0c2F2ZWQgPSBkYXRhUHJpdi5nZXQoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0aWYgKCAoIGV2ZW50LmlzVHJpZ2dlciAmIDEgKSAmJiB0aGlzWyB0eXBlIF0gKSB7XG5cblx0XHRcdFx0Ly8gSW50ZXJydXB0IHByb2Nlc3Npbmcgb2YgdGhlIG91dGVyIHN5bnRoZXRpYyAudHJpZ2dlcigpZWQgZXZlbnRcblx0XHRcdFx0aWYgKCAhc2F2ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBhcmd1bWVudHMgZm9yIHVzZSB3aGVuIGhhbmRsaW5nIHRoZSBpbm5lciBuYXRpdmUgZXZlbnRcblx0XHRcdFx0XHQvLyBUaGVyZSB3aWxsIGFsd2F5cyBiZSBhdCBsZWFzdCBvbmUgYXJndW1lbnQgKGFuIGV2ZW50IG9iamVjdCksIHNvIHRoaXMgYXJyYXlcblx0XHRcdFx0XHQvLyB3aWxsIG5vdCBiZSBjb25mdXNlZCB3aXRoIGEgbGVmdG92ZXIgY2FwdHVyZSBvYmplY3QuXG5cdFx0XHRcdFx0c2F2ZWQgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIHR5cGUsIHNhdmVkICk7XG5cblx0XHRcdFx0XHQvLyBUcmlnZ2VyIHRoZSBuYXRpdmUgZXZlbnQgYW5kIGNhcHR1cmUgaXRzIHJlc3VsdFxuXHRcdFx0XHRcdHRoaXNbIHR5cGUgXSgpO1xuXHRcdFx0XHRcdHJlc3VsdCA9IGRhdGFQcml2LmdldCggdGhpcywgdHlwZSApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgdHlwZSwgZmFsc2UgKTtcblxuXHRcdFx0XHRcdGlmICggc2F2ZWQgIT09IHJlc3VsdCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSBvdXRlciBzeW50aGV0aWMgZXZlbnRcblx0XHRcdFx0XHRcdGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSWYgdGhpcyBpcyBhbiBpbm5lciBzeW50aGV0aWMgZXZlbnQgZm9yIGFuIGV2ZW50IHdpdGggYSBidWJibGluZyBzdXJyb2dhdGVcblx0XHRcdFx0Ly8gKGZvY3VzIG9yIGJsdXIpLCBhc3N1bWUgdGhhdCB0aGUgc3Vycm9nYXRlIGFscmVhZHkgcHJvcGFnYXRlZCBmcm9tIHRyaWdnZXJpbmdcblx0XHRcdFx0Ly8gdGhlIG5hdGl2ZSBldmVudCBhbmQgcHJldmVudCB0aGF0IGZyb20gaGFwcGVuaW5nIGFnYWluIGhlcmUuXG5cdFx0XHRcdC8vIFRoaXMgdGVjaG5pY2FsbHkgZ2V0cyB0aGUgb3JkZXJpbmcgd3Jvbmcgdy5yLnQuIHRvIGAudHJpZ2dlcigpYCAoaW4gd2hpY2ggdGhlXG5cdFx0XHRcdC8vIGJ1YmJsaW5nIHN1cnJvZ2F0ZSBwcm9wYWdhdGVzICphZnRlciogdGhlIG5vbi1idWJibGluZyBiYXNlKSwgYnV0IHRoYXQgc2VlbXNcblx0XHRcdFx0Ly8gbGVzcyBiYWQgdGhhbiBkdXBsaWNhdGlvbi5cblx0XHRcdFx0fSBlbHNlIGlmICggKCBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9ICkuZGVsZWdhdGVUeXBlICkge1xuXHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBuYXRpdmUgZXZlbnQgdHJpZ2dlcmVkIGFib3ZlLCBldmVyeXRoaW5nIGlzIG5vdyBpbiBvcmRlclxuXHRcdFx0Ly8gRmlyZSBhbiBpbm5lciBzeW50aGV0aWMgZXZlbnQgd2l0aCB0aGUgb3JpZ2luYWwgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBzYXZlZCApIHtcblxuXHRcdFx0XHQvLyAuLi5hbmQgY2FwdHVyZSB0aGUgcmVzdWx0XG5cdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgdHlwZSwgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoXG5cdFx0XHRcdFx0c2F2ZWRbIDAgXSxcblx0XHRcdFx0XHRzYXZlZC5zbGljZSggMSApLFxuXHRcdFx0XHRcdHRoaXNcblx0XHRcdFx0KSApO1xuXG5cdFx0XHRcdC8vIEFib3J0IGhhbmRsaW5nIG9mIHRoZSBuYXRpdmUgZXZlbnQgYnkgYWxsIGpRdWVyeSBoYW5kbGVycyB3aGlsZSBhbGxvd2luZ1xuXHRcdFx0XHQvLyBuYXRpdmUgaGFuZGxlcnMgb24gdGhlIHNhbWUgZWxlbWVudCB0byBydW4uIE9uIHRhcmdldCwgdGhpcyBpcyBhY2hpZXZlZFxuXHRcdFx0XHQvLyBieSBzdG9wcGluZyBpbW1lZGlhdGUgcHJvcGFnYXRpb24ganVzdCBvbiB0aGUgalF1ZXJ5IGV2ZW50LiBIb3dldmVyLFxuXHRcdFx0XHQvLyB0aGUgbmF0aXZlIGV2ZW50IGlzIHJlLXdyYXBwZWQgYnkgYSBqUXVlcnkgb25lIG9uIGVhY2ggbGV2ZWwgb2YgdGhlXG5cdFx0XHRcdC8vIHByb3BhZ2F0aW9uIHNvIHRoZSBvbmx5IHdheSB0byBzdG9wIGl0IGZvciBqUXVlcnkgaXMgdG8gc3RvcCBpdCBmb3Jcblx0XHRcdFx0Ly8gZXZlcnlvbmUgdmlhIG5hdGl2ZSBgc3RvcFByb3BhZ2F0aW9uKClgLiBUaGlzIGlzIG5vdCBhIHByb2JsZW0gZm9yXG5cdFx0XHRcdC8vIGZvY3VzL2JsdXIgd2hpY2ggZG9uJ3QgYnViYmxlLCBidXQgaXQgZG9lcyBhbHNvIHN0b3AgY2xpY2sgb24gY2hlY2tib3hlc1xuXHRcdFx0XHQvLyBhbmQgcmFkaW9zLiBXZSBhY2NlcHQgdGhpcyBsaW1pdGF0aW9uLlxuXHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0ZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xufVxuXG5qUXVlcnkucmVtb3ZlRXZlbnQgPSBmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkge1xuXG5cdC8vIFRoaXMgXCJpZlwiIGlzIG5lZWRlZCBmb3IgcGxhaW4gb2JqZWN0c1xuXHRpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHtcblx0XHRlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApO1xuXHR9XG59O1xuXG5qUXVlcnkuRXZlbnQgPSBmdW5jdGlvbiggc3JjLCBwcm9wcyApIHtcblxuXHQvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgdGhlICduZXcnIGtleXdvcmRcblx0aWYgKCAhKCB0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50ICkgKSB7XG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQoIHNyYywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIEV2ZW50IG9iamVjdFxuXHRpZiAoIHNyYyAmJiBzcmMudHlwZSApIHtcblx0XHR0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7XG5cdFx0dGhpcy50eXBlID0gc3JjLnR5cGU7XG5cblx0XHQvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZFxuXHRcdC8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLlxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHxcblx0XHRcdFx0c3JjLmRlZmF1bHRQcmV2ZW50ZWQgPT09IHVuZGVmaW5lZCAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD0yLjMgb25seVxuXHRcdFx0XHRzcmMucmV0dXJuVmFsdWUgPT09IGZhbHNlID9cblx0XHRcdHJldHVyblRydWUgOlxuXHRcdFx0cmV0dXJuRmFsc2U7XG5cblx0XHQvLyBDcmVhdGUgdGFyZ2V0IHByb3BlcnRpZXNcblx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgPD02IC0gNyBvbmx5XG5cdFx0Ly8gVGFyZ2V0IHNob3VsZCBub3QgYmUgYSB0ZXh0IG5vZGUgKHRyYWMtNTA0LCB0cmFjLTEzMTQzKVxuXHRcdHRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/XG5cdFx0XHRzcmMudGFyZ2V0LnBhcmVudE5vZGUgOlxuXHRcdFx0c3JjLnRhcmdldDtcblxuXHRcdHRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0O1xuXHRcdHRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0O1xuXG5cdC8vIEV2ZW50IHR5cGVcblx0fSBlbHNlIHtcblx0XHR0aGlzLnR5cGUgPSBzcmM7XG5cdH1cblxuXHQvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuXHRpZiAoIHByb3BzICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZVxuXHR0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG5cblx0Ly8gTWFyayBpdCBhcyBmaXhlZFxuXHR0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTtcbn07XG5cbi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZ1xuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxualF1ZXJ5LkV2ZW50LnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IGpRdWVyeS5FdmVudCxcblx0aXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcblx0aXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXHRpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzU2ltdWxhdGVkOiBmYWxzZSxcblxuXHRwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblx0fSxcblx0c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cblx0XHR0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9XG59O1xuXG4vLyBJbmNsdWRlcyBhbGwgY29tbW9uIGV2ZW50IHByb3BzIGluY2x1ZGluZyBLZXlFdmVudCBhbmQgTW91c2VFdmVudCBzcGVjaWZpYyBwcm9wc1xualF1ZXJ5LmVhY2goIHtcblx0YWx0S2V5OiB0cnVlLFxuXHRidWJibGVzOiB0cnVlLFxuXHRjYW5jZWxhYmxlOiB0cnVlLFxuXHRjaGFuZ2VkVG91Y2hlczogdHJ1ZSxcblx0Y3RybEtleTogdHJ1ZSxcblx0ZGV0YWlsOiB0cnVlLFxuXHRldmVudFBoYXNlOiB0cnVlLFxuXHRtZXRhS2V5OiB0cnVlLFxuXHRwYWdlWDogdHJ1ZSxcblx0cGFnZVk6IHRydWUsXG5cdHNoaWZ0S2V5OiB0cnVlLFxuXHR2aWV3OiB0cnVlLFxuXHRcImNoYXJcIjogdHJ1ZSxcblx0Y29kZTogdHJ1ZSxcblx0Y2hhckNvZGU6IHRydWUsXG5cdGtleTogdHJ1ZSxcblx0a2V5Q29kZTogdHJ1ZSxcblx0YnV0dG9uOiB0cnVlLFxuXHRidXR0b25zOiB0cnVlLFxuXHRjbGllbnRYOiB0cnVlLFxuXHRjbGllbnRZOiB0cnVlLFxuXHRvZmZzZXRYOiB0cnVlLFxuXHRvZmZzZXRZOiB0cnVlLFxuXHRwb2ludGVySWQ6IHRydWUsXG5cdHBvaW50ZXJUeXBlOiB0cnVlLFxuXHRzY3JlZW5YOiB0cnVlLFxuXHRzY3JlZW5ZOiB0cnVlLFxuXHR0YXJnZXRUb3VjaGVzOiB0cnVlLFxuXHR0b0VsZW1lbnQ6IHRydWUsXG5cdHRvdWNoZXM6IHRydWUsXG5cdHdoaWNoOiB0cnVlXG59LCBqUXVlcnkuZXZlbnQuYWRkUHJvcCApO1xuXG5qUXVlcnkuZWFjaCggeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggdHlwZSwgZGVsZWdhdGVUeXBlICkge1xuXG5cdGZ1bmN0aW9uIGZvY3VzTWFwcGVkSGFuZGxlciggbmF0aXZlRXZlbnQgKSB7XG5cdFx0aWYgKCBkb2N1bWVudC5kb2N1bWVudE1vZGUgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExK1xuXHRcdFx0Ly8gQXR0YWNoIGEgc2luZ2xlIGZvY3VzaW4vZm9jdXNvdXQgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50c1xuXHRcdFx0Ly8gZm9jdXMvYmx1ci4gVGhpcyBpcyBiZWNhdXNlIHRoZSBmb3JtZXIgYXJlIHN5bmNocm9ub3VzIGluIElFIHdoaWxlIHRoZSBsYXR0ZXJcblx0XHRcdC8vIGFyZSBhc3luYy4gSW4gb3RoZXIgYnJvd3NlcnMsIGFsbCB0aG9zZSBoYW5kbGVycyBhcmUgaW52b2tlZCBzeW5jaHJvbm91c2x5LlxuXG5cdFx0XHQvLyBgaGFuZGxlYCBmcm9tIHByaXZhdGUgZGF0YSB3b3VsZCBhbHJlYWR5IHdyYXAgdGhlIGV2ZW50LCBidXQgd2UgbmVlZFxuXHRcdFx0Ly8gdG8gY2hhbmdlIHRoZSBgdHlwZWAgaGVyZS5cblx0XHRcdHZhciBoYW5kbGUgPSBkYXRhUHJpdi5nZXQoIHRoaXMsIFwiaGFuZGxlXCIgKSxcblx0XHRcdFx0ZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApO1xuXHRcdFx0ZXZlbnQudHlwZSA9IG5hdGl2ZUV2ZW50LnR5cGUgPT09IFwiZm9jdXNpblwiID8gXCJmb2N1c1wiIDogXCJibHVyXCI7XG5cdFx0XHRldmVudC5pc1NpbXVsYXRlZCA9IHRydWU7XG5cblx0XHRcdC8vIEZpcnN0LCBoYW5kbGUgZm9jdXNpbi9mb2N1c291dFxuXHRcdFx0aGFuZGxlKCBuYXRpdmVFdmVudCApO1xuXG5cdFx0XHQvLyAuLi50aGVuLCBoYW5kbGUgZm9jdXMvYmx1clxuXHRcdFx0Ly9cblx0XHRcdC8vIGZvY3VzL2JsdXIgZG9uJ3QgYnViYmxlIHdoaWxlIGZvY3VzaW4vZm9jdXNvdXQgZG87IHNpbXVsYXRlIHRoZSBmb3JtZXIgYnkgb25seVxuXHRcdFx0Ly8gaW52b2tpbmcgdGhlIGhhbmRsZXIgYXQgdGhlIGxvd2VyIGxldmVsLlxuXHRcdFx0aWYgKCBldmVudC50YXJnZXQgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQgKSB7XG5cblx0XHRcdFx0Ly8gVGhlIHNldHVwIHBhcnQgY2FsbHMgYGxldmVyYWdlTmF0aXZlYCwgd2hpY2gsIGluIHR1cm4sIGNhbGxzXG5cdFx0XHRcdC8vIGBqUXVlcnkuZXZlbnQuYWRkYCwgc28gZXZlbnQgaGFuZGxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gc2V0XG5cdFx0XHRcdC8vIGJ5IHRoaXMgcG9pbnQuXG5cdFx0XHRcdGhhbmRsZSggZXZlbnQgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBGb3Igbm9uLUlFIGJyb3dzZXJzLCBhdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50XG5cdFx0XHQvLyB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXQuXG5cdFx0XHRqUXVlcnkuZXZlbnQuc2ltdWxhdGUoIGRlbGVnYXRlVHlwZSwgbmF0aXZlRXZlbnQudGFyZ2V0LFxuXHRcdFx0XHRqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApICk7XG5cdFx0fVxuXHR9XG5cblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSA9IHtcblxuXHRcdC8vIFV0aWxpemUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdHNldHVwOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0dmFyIGF0dGFjaGVzO1xuXG5cdFx0XHQvLyBDbGFpbSB0aGUgZmlyc3QgaGFuZGxlclxuXHRcdFx0Ly8gZGF0YVByaXYuc2V0KCB0aGlzLCBcImZvY3VzXCIsIC4uLiApXG5cdFx0XHQvLyBkYXRhUHJpdi5zZXQoIHRoaXMsIFwiYmx1clwiLCAuLi4gKVxuXHRcdFx0bGV2ZXJhZ2VOYXRpdmUoIHRoaXMsIHR5cGUsIHRydWUgKTtcblxuXHRcdFx0aWYgKCBkb2N1bWVudC5kb2N1bWVudE1vZGUgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDExK1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIHNhbWUgbmF0aXZlIGhhbmRsZXIgZm9yIGZvY3VzaW4gJiBmb2N1cyAoYW5kIGZvY3Vzb3V0ICYgYmx1cilcblx0XHRcdFx0Ly8gc28gd2UgbmVlZCB0byBjb29yZGluYXRlIHNldHVwICYgdGVhcmRvd24gcGFydHMgYmV0d2VlbiB0aG9zZSBldmVudHMuXG5cdFx0XHRcdC8vIFVzZSBgZGVsZWdhdGVUeXBlYCBhcyB0aGUga2V5IGFzIGB0eXBlYCBpcyBhbHJlYWR5IHVzZWQgYnkgYGxldmVyYWdlTmF0aXZlYC5cblx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhUHJpdi5nZXQoIHRoaXMsIGRlbGVnYXRlVHlwZSApO1xuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHR0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIGRlbGVnYXRlVHlwZSwgZm9jdXNNYXBwZWRIYW5kbGVyICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBkZWxlZ2F0ZVR5cGUsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIHByb2Nlc3NpbmcgaW4gdGhlIGNhbGxlclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRm9yY2Ugc2V0dXAgYmVmb3JlIHRyaWdnZXJcblx0XHRcdGxldmVyYWdlTmF0aXZlKCB0aGlzLCB0eXBlICk7XG5cblx0XHRcdC8vIFJldHVybiBub24tZmFsc2UgdG8gYWxsb3cgbm9ybWFsIGV2ZW50LXBhdGggcHJvcGFnYXRpb25cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgYXR0YWNoZXM7XG5cblx0XHRcdGlmICggZG9jdW1lbnQuZG9jdW1lbnRNb2RlICkge1xuXHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmdldCggdGhpcywgZGVsZWdhdGVUeXBlICkgLSAxO1xuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHR0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoIGRlbGVnYXRlVHlwZSwgZm9jdXNNYXBwZWRIYW5kbGVyICk7XG5cdFx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCB0aGlzLCBkZWxlZ2F0ZVR5cGUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIGRlbGVnYXRlVHlwZSwgYXR0YWNoZXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgc3RhbmRhcmQgdGVhcmRvd24gc2hvdWxkIGJlIGFwcGxpZWRcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBTdXBwcmVzcyBuYXRpdmUgZm9jdXMgb3IgYmx1ciBpZiB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlXG5cdFx0Ly8gYSBsZXZlcmFnZWQgbmF0aXZlLWV2ZW50IHN0YWNrXG5cdFx0X2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHJldHVybiBkYXRhUHJpdi5nZXQoIGV2ZW50LnRhcmdldCwgdHlwZSApO1xuXHRcdH0sXG5cblx0XHRkZWxlZ2F0ZVR5cGU6IGRlbGVnYXRlVHlwZVxuXHR9O1xuXG5cdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00NFxuXHQvLyBGaXJlZm94IGRvZXNuJ3QgaGF2ZSBmb2N1cyhpbiB8IG91dCkgZXZlbnRzXG5cdC8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg3Nzg3XG5cdC8vXG5cdC8vIFN1cHBvcnQ6IENocm9tZSA8PTQ4IC0gNDksIFNhZmFyaSA8PTkuMCAtIDkuMVxuXHQvLyBmb2N1cyhpbiB8IG91dCkgZXZlbnRzIGZpcmUgYWZ0ZXIgZm9jdXMgJiBibHVyIGV2ZW50cyxcblx0Ly8gd2hpY2ggaXMgc3BlYyB2aW9sYXRpb24gLSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50cy1mb2N1c2V2ZW50LWV2ZW50LW9yZGVyXG5cdC8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ5ODU3XG5cdC8vXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMStcblx0Ly8gVG8gcHJlc2VydmUgcmVsYXRpdmUgZm9jdXNpbi9mb2N1cyAmIGZvY3Vzb3V0L2JsdXIgZXZlbnQgb3JkZXIgZ3VhcmFudGVlZCBvbiB0aGUgMy54IGJyYW5jaCxcblx0Ly8gYXR0YWNoIGEgc2luZ2xlIGhhbmRsZXIgZm9yIGJvdGggZXZlbnRzIGluIElFLlxuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZGVsZWdhdGVUeXBlIF0gPSB7XG5cdFx0c2V0dXA6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBIYW5kbGU6IHJlZ3VsYXIgbm9kZXMgKHZpYSBgdGhpcy5vd25lckRvY3VtZW50YCksIHdpbmRvd1xuXHRcdFx0Ly8gKHZpYSBgdGhpcy5kb2N1bWVudGApICYgZG9jdW1lbnQgKHZpYSBgdGhpc2ApLlxuXHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLmRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdGRhdGFIb2xkZXIgPSBkb2N1bWVudC5kb2N1bWVudE1vZGUgPyB0aGlzIDogZG9jLFxuXHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmdldCggZGF0YUhvbGRlciwgZGVsZWdhdGVUeXBlICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMStcblx0XHRcdC8vIFdlIHVzZSB0aGUgc2FtZSBuYXRpdmUgaGFuZGxlciBmb3IgZm9jdXNpbiAmIGZvY3VzIChhbmQgZm9jdXNvdXQgJiBibHVyKVxuXHRcdFx0Ly8gc28gd2UgbmVlZCB0byBjb29yZGluYXRlIHNldHVwICYgdGVhcmRvd24gcGFydHMgYmV0d2VlbiB0aG9zZSBldmVudHMuXG5cdFx0XHQvLyBVc2UgYGRlbGVnYXRlVHlwZWAgYXMgdGhlIGtleSBhcyBgdHlwZWAgaXMgYWxyZWFkeSB1c2VkIGJ5IGBsZXZlcmFnZU5hdGl2ZWAuXG5cdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0aWYgKCBkb2N1bWVudC5kb2N1bWVudE1vZGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5hZGRFdmVudExpc3RlbmVyKCBkZWxlZ2F0ZVR5cGUsIGZvY3VzTWFwcGVkSGFuZGxlciApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRvYy5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBmb2N1c01hcHBlZEhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGF0YVByaXYuc2V0KCBkYXRhSG9sZGVyLCBkZWxlZ2F0ZVR5cGUsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdH0sXG5cdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLmRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdGRhdGFIb2xkZXIgPSBkb2N1bWVudC5kb2N1bWVudE1vZGUgPyB0aGlzIDogZG9jLFxuXHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmdldCggZGF0YUhvbGRlciwgZGVsZWdhdGVUeXBlICkgLSAxO1xuXG5cdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0aWYgKCBkb2N1bWVudC5kb2N1bWVudE1vZGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCBkZWxlZ2F0ZVR5cGUsIGZvY3VzTWFwcGVkSGFuZGxlciApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBmb2N1c01hcHBlZEhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGRhdGFIb2xkZXIsIGRlbGVnYXRlVHlwZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF0YVByaXYuc2V0KCBkYXRhSG9sZGVyLCBkZWxlZ2F0ZVR5cGUsIGF0dGFjaGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufSApO1xuXG4vLyBDcmVhdGUgbW91c2VlbnRlci9sZWF2ZSBldmVudHMgdXNpbmcgbW91c2VvdmVyL291dCBhbmQgZXZlbnQtdGltZSBjaGVja3Ncbi8vIHNvIHRoYXQgZXZlbnQgZGVsZWdhdGlvbiB3b3JrcyBpbiBqUXVlcnkuXG4vLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dFxuLy9cbi8vIFN1cHBvcnQ6IFNhZmFyaSA3IG9ubHlcbi8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOlxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDcwMjU4XG4vLyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBidWcgKGl0IGV4aXN0ZWQgaW4gb2xkZXIgQ2hyb21lIHZlcnNpb25zIGFzIHdlbGwpLlxualF1ZXJ5LmVhY2goIHtcblx0bW91c2VlbnRlcjogXCJtb3VzZW92ZXJcIixcblx0bW91c2VsZWF2ZTogXCJtb3VzZW91dFwiLFxuXHRwb2ludGVyZW50ZXI6IFwicG9pbnRlcm92ZXJcIixcblx0cG9pbnRlcmxlYXZlOiBcInBvaW50ZXJvdXRcIlxufSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHtcblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHtcblx0XHRkZWxlZ2F0ZVR5cGU6IGZpeCxcblx0XHRiaW5kVHlwZTogZml4LFxuXG5cdFx0aGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHR2YXIgcmV0LFxuXHRcdFx0XHR0YXJnZXQgPSB0aGlzLFxuXHRcdFx0XHRyZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldCxcblx0XHRcdFx0aGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqO1xuXG5cdFx0XHQvLyBGb3IgbW91c2VlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQgaXMgb3V0c2lkZSB0aGUgdGFyZ2V0LlxuXHRcdFx0Ly8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3dcblx0XHRcdGlmICggIXJlbGF0ZWQgfHwgKCByZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFyZ2V0LCByZWxhdGVkICkgKSApIHtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTtcblx0XHRcdFx0cmV0ID0gaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRldmVudC50eXBlID0gZml4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHRvbjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICk7XG5cdH0sXG5cdG9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7XG5cdH0sXG5cdG9mZjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZm4gKSB7XG5cdFx0dmFyIGhhbmRsZU9iaiwgdHlwZTtcblx0XHRpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYmIHR5cGVzLmhhbmRsZU9iaiApIHtcblxuXHRcdFx0Ly8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudFxuXHRcdFx0aGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2JqO1xuXHRcdFx0alF1ZXJ5KCB0eXBlcy5kZWxlZ2F0ZVRhcmdldCApLm9mZihcblx0XHRcdFx0aGFuZGxlT2JqLm5hbWVzcGFjZSA/XG5cdFx0XHRcdFx0aGFuZGxlT2JqLm9yaWdUeXBlICsgXCIuXCIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDpcblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUsXG5cdFx0XHRcdGhhbmRsZU9iai5zZWxlY3Rvcixcblx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXJcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApXG5cdFx0XHRmb3IgKCB0eXBlIGluIHR5cGVzICkge1xuXHRcdFx0XHR0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5cGVzWyB0eXBlIF0gKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcyBbLCBmbl0gKVxuXHRcdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZXMsIGZuLCBzZWxlY3RvciApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbnZhclxuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSwgRWRnZSAxMiAtIDEzIG9ubHlcblx0Ly8gSW4gSUUvRWRnZSB1c2luZyByZWdleCBncm91cHMgaGVyZSBjYXVzZXMgc2V2ZXJlIHNsb3dkb3ducy5cblx0Ly8gU2VlIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvMTczNjUxMi9cblx0cm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksXG5cblx0Ly8gY2hlY2tlZD1cImNoZWNrZWRcIiBvciBjaGVja2VkXG5cdHJjaGVja2VkID0gL2NoZWNrZWRcXHMqKD86W149XXw9XFxzKi5jaGVja2VkLikvaSxcblxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8IVxcW0NEQVRBXFxbfFxcXVxcXT5cXHMqJC9nO1xuXG4vLyBQcmVmZXIgYSB0Ym9keSBvdmVyIGl0cyBwYXJlbnQgdGFibGUgZm9yIGNvbnRhaW5pbmcgbmV3IHJvd3NcbmZ1bmN0aW9uIG1hbmlwdWxhdGlvblRhcmdldCggZWxlbSwgY29udGVudCApIHtcblx0aWYgKCBub2RlTmFtZSggZWxlbSwgXCJ0YWJsZVwiICkgJiZcblx0XHRub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCBcInRyXCIgKSApIHtcblxuXHRcdHJldHVybiBqUXVlcnkoIGVsZW0gKS5jaGlsZHJlbiggXCJ0Ym9keVwiIClbIDAgXSB8fCBlbGVtO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbi8vIFJlcGxhY2UvcmVzdG9yZSB0aGUgdHlwZSBhdHRyaWJ1dGUgb2Ygc2NyaXB0IGVsZW1lbnRzIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb25cbmZ1bmN0aW9uIGRpc2FibGVTY3JpcHQoIGVsZW0gKSB7XG5cdGVsZW0udHlwZSA9ICggZWxlbS5nZXRBdHRyaWJ1dGUoIFwidHlwZVwiICkgIT09IG51bGwgKSArIFwiL1wiICsgZWxlbS50eXBlO1xuXHRyZXR1cm4gZWxlbTtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7XG5cdGlmICggKCBlbGVtLnR5cGUgfHwgXCJcIiApLnNsaWNlKCAwLCA1ICkgPT09IFwidHJ1ZS9cIiApIHtcblx0XHRlbGVtLnR5cGUgPSBlbGVtLnR5cGUuc2xpY2UoIDUgKTtcblx0fSBlbHNlIHtcblx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggXCJ0eXBlXCIgKTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5mdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkge1xuXHR2YXIgaSwgbCwgdHlwZSwgcGRhdGFPbGQsIHVkYXRhT2xkLCB1ZGF0YUN1ciwgZXZlbnRzO1xuXG5cdGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLlxuXHRpZiAoIGRhdGFQcml2Lmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHBkYXRhT2xkID0gZGF0YVByaXYuZ2V0KCBzcmMgKTtcblx0XHRldmVudHMgPSBwZGF0YU9sZC5ldmVudHM7XG5cblx0XHRpZiAoIGV2ZW50cyApIHtcblx0XHRcdGRhdGFQcml2LnJlbW92ZSggZGVzdCwgXCJoYW5kbGUgZXZlbnRzXCIgKTtcblxuXHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIDIuIENvcHkgdXNlciBkYXRhXG5cdGlmICggZGF0YVVzZXIuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0dWRhdGFPbGQgPSBkYXRhVXNlci5hY2Nlc3MoIHNyYyApO1xuXHRcdHVkYXRhQ3VyID0galF1ZXJ5LmV4dGVuZCgge30sIHVkYXRhT2xkICk7XG5cblx0XHRkYXRhVXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7XG5cdH1cbn1cblxuLy8gRml4IElFIGJ1Z3MsIHNlZSBzdXBwb3J0IHRlc3RzXG5mdW5jdGlvbiBmaXhJbnB1dCggc3JjLCBkZXN0ICkge1xuXHR2YXIgbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0Ly8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uXG5cdGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkge1xuXHRcdGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkO1xuXG5cdC8vIEZhaWxzIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIiApIHtcblx0XHRkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7XG5cdH1cbn1cblxuZnVuY3Rpb24gZG9tTWFuaXAoIGNvbGxlY3Rpb24sIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICkge1xuXG5cdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0YXJncyA9IGZsYXQoIGFyZ3MgKTtcblxuXHR2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuXHRcdGlOb0Nsb25lID0gbCAtIDEsXG5cdFx0dmFsdWUgPSBhcmdzWyAwIF0sXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gfHxcblx0XHRcdCggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkge1xuXHRcdHJldHVybiBjb2xsZWN0aW9uLmVhY2goIGZ1bmN0aW9uKCBpbmRleCApIHtcblx0XHRcdHZhciBzZWxmID0gY29sbGVjdGlvbi5lcSggaW5kZXggKTtcblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTtcblx0XHRcdH1cblx0XHRcdGRvbU1hbmlwKCBzZWxmLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggbCApIHtcblx0XHRmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApO1xuXHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdH1cblxuXHRcdC8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFja1xuXHRcdGlmICggZmlyc3QgfHwgaWdub3JlZCApIHtcblx0XHRcdHNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCBcInNjcmlwdFwiICksIGRpc2FibGVTY3JpcHQgKTtcblx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdFx0Ly8gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwXG5cdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAodHJhYy04MDcwKS5cblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0bm9kZSA9IGZyYWdtZW50O1xuXG5cdFx0XHRcdGlmICggaSAhPT0gaU5vQ2xvbmUgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Ly8gS2VlcCByZWZlcmVuY2VzIHRvIGNsb25lZCBzY3JpcHRzIGZvciBsYXRlciByZXN0b3JhdGlvblxuXHRcdFx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHNjcmlwdHMsIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y2FsbGJhY2suY2FsbCggY29sbGVjdGlvblsgaSBdLCBub2RlLCBpICk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblx0XHRcdFx0ZG9jID0gc2NyaXB0c1sgc2NyaXB0cy5sZW5ndGggLSAxIF0ub3duZXJEb2N1bWVudDtcblxuXHRcdFx0XHQvLyBSZS1lbmFibGUgc2NyaXB0c1xuXHRcdFx0XHRqUXVlcnkubWFwKCBzY3JpcHRzLCByZXN0b3JlU2NyaXB0ICk7XG5cblx0XHRcdFx0Ly8gRXZhbHVhdGUgZXhlY3V0YWJsZSBzY3JpcHRzIG9uIGZpcnN0IGRvY3VtZW50IGluc2VydGlvblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGhhc1NjcmlwdHM7IGkrKyApIHtcblx0XHRcdFx0XHRub2RlID0gc2NyaXB0c1sgaSBdO1xuXHRcdFx0XHRcdGlmICggcnNjcmlwdFR5cGUudGVzdCggbm9kZS50eXBlIHx8IFwiXCIgKSAmJlxuXHRcdFx0XHRcdFx0IWRhdGFQcml2LmFjY2Vzcyggbm9kZSwgXCJnbG9iYWxFdmFsXCIgKSAmJlxuXHRcdFx0XHRcdFx0alF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBub2RlLnNyYyAmJiAoIG5vZGUudHlwZSB8fCBcIlwiICkudG9Mb3dlckNhc2UoKSAgIT09IFwibW9kdWxlXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gT3B0aW9uYWwgQUpBWCBkZXBlbmRlbmN5LCBidXQgd29uJ3QgcnVuIHNjcmlwdHMgaWYgbm90IHByZXNlbnRcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuX2V2YWxVcmwgJiYgIW5vZGUubm9Nb2R1bGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYywge1xuXHRcdFx0XHRcdFx0XHRcdFx0bm9uY2U6IG5vZGUubm9uY2UgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoIFwibm9uY2VcIiApXG5cdFx0XHRcdFx0XHRcdFx0fSwgZG9jICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVW53cmFwIGEgQ0RBVEEgc2VjdGlvbiBjb250YWluaW5nIHNjcmlwdCBjb250ZW50cy4gVGhpcyBzaG91bGRuJ3QgYmVcblx0XHRcdFx0XHRcdFx0Ly8gbmVlZGVkIGFzIGluIFhNTCBkb2N1bWVudHMgdGhleSdyZSBhbHJlYWR5IG5vdCB2aXNpYmxlIHdoZW5cblx0XHRcdFx0XHRcdFx0Ly8gaW5zcGVjdGluZyBlbGVtZW50IGNvbnRlbnRzIGFuZCBpbiBIVE1MIGRvY3VtZW50cyB0aGV5IGhhdmUgbm9cblx0XHRcdFx0XHRcdFx0Ly8gbWVhbmluZyBidXQgd2UncmUgcHJlc2VydmluZyB0aGF0IGxvZ2ljIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyB3aWxsIGJlIHJlbW92ZWQgY29tcGxldGVseSBpbiA0LjAuIFNlZSBnaC00OTA0LlxuXHRcdFx0XHRcdFx0XHRET01FdmFsKCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgXCJcIiApLCBub2RlLCBkb2MgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY29sbGVjdGlvbjtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlKCBlbGVtLCBzZWxlY3Rvciwga2VlcERhdGEgKSB7XG5cdHZhciBub2RlLFxuXHRcdG5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSxcblx0XHRpID0gMDtcblxuXHRmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0aWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggbm9kZSApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBub2RlLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRpZiAoIGtlZXBEYXRhICYmIGlzQXR0YWNoZWQoIG5vZGUgKSApIHtcblx0XHRcdFx0c2V0R2xvYmFsRXZhbCggZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdH1cblx0XHRcdG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggbm9kZSApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHJldHVybiBodG1sO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0dmFyIGksIGwsIHNyY0VsZW1lbnRzLCBkZXN0RWxlbWVudHMsXG5cdFx0XHRjbG9uZSA9IGVsZW0uY2xvbmVOb2RlKCB0cnVlICksXG5cdFx0XHRpblBhZ2UgPSBpc0F0dGFjaGVkKCBlbGVtICk7XG5cblx0XHQvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXNcblx0XHRpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmXG5cdFx0XHRcdCFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gV2UgZXNjaGV3IGpRdWVyeSNmaW5kIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6XG5cdFx0XHQvLyBodHRwczovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yXG5cdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XG5cdFx0XHRzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxuXHRcdGlmICggZGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRcdHNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7XG5cdFx0XHRcdGRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCBcInNjcmlwdFwiICk7XG5cdFx0aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiB0aGUgY2xvbmVkIHNldFxuXHRcdHJldHVybiBjbG9uZTtcblx0fSxcblxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblx0XHR2YXIgZGF0YSwgZWxlbSwgdHlwZSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT09IHVuZGVmaW5lZDsgaSsrICkge1xuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRcdGlmICggKCBkYXRhID0gZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbFsgdHlwZSBdICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTtcblx0fSxcblxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IHRoaXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5odG1sUHJlZmlsdGVyKCB2YWx1ZSApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaWdub3JlZCA9IFtdO1xuXG5cdFx0Ly8gTWFrZSB0aGUgY2hhbmdlcywgcmVwbGFjaW5nIGVhY2ggbm9uLWlnbm9yZWQgY29udGV4dCBlbGVtZW50IHdpdGggdGhlIG5ldyBjb250ZW50XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaW5BcnJheSggdGhpcywgaWdub3JlZCApIDwgMCApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTtcblx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uXG5cdFx0fSwgaWdub3JlZCApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCB7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0Ly8gLmdldCgpIGJlY2F1c2UgcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0cHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7XG5cdH07XG59ICk7XG52YXIgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgcG51bSArIFwiKSg/IXB4KVthLXolXSskXCIsIFwiaVwiICk7XG5cbnZhciByY3VzdG9tUHJvcCA9IC9eLS0vO1xuXG5cbnZhciBnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seSwgRmlyZWZveCA8PTMwICh0cmFjLTE1MDk4LCB0cmFjLTE0MTUwKVxuXHRcdC8vIElFIHRocm93cyBvbiBlbGVtZW50cyBjcmVhdGVkIGluIHBvcHVwc1xuXHRcdC8vIEZGIG1lYW53aGlsZSB0aHJvd3Mgb24gZnJhbWUgZWxlbWVudHMgdGhyb3VnaCBcImRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGVcIlxuXHRcdHZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuXG5cdFx0aWYgKCAhdmlldyB8fCAhdmlldy5vcGVuZXIgKSB7XG5cdFx0XHR2aWV3ID0gd2luZG93O1xuXHRcdH1cblxuXHRcdHJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTtcblx0fTtcblxudmFyIHN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2sgKSB7XG5cdHZhciByZXQsIG5hbWUsXG5cdFx0b2xkID0ge307XG5cblx0Ly8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07XG5cdH1cblxuXHRyZXQgPSBjYWxsYmFjay5jYWxsKCBlbGVtICk7XG5cblx0Ly8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59O1xuXG5cbnZhciByYm94U3R5bGUgPSBuZXcgUmVnRXhwKCBjc3NFeHBhbmQuam9pbiggXCJ8XCIgKSwgXCJpXCIgKTtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVTdHlsZVRlc3RzKCkge1xuXG5cdFx0Ly8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZVxuXHRcdGlmICggIWRpdiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O1wiICtcblx0XHRcdFwibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowXCI7XG5cdFx0ZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0XCJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7XCIgK1xuXHRcdFx0XCJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O1wiICtcblx0XHRcdFwid2lkdGg6NjAlO3RvcDoxJVwiO1xuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggY29udGFpbmVyICkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdFx0dmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiApO1xuXHRcdHBpeGVsUG9zaXRpb25WYWwgPSBkaXZTdHlsZS50b3AgIT09IFwiMSVcIjtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gNDRcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwgPSByb3VuZFBpeGVsTWVhc3VyZXMoIGRpdlN0eWxlLm1hcmdpbkxlZnQgKSA9PT0gMTI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjNcblx0XHQvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3Rcblx0XHRkaXYuc3R5bGUucmlnaHQgPSBcIjYwJVwiO1xuXHRcdHBpeGVsQm94U3R5bGVzVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5yaWdodCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdFx0Ly8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50c1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgb25seVxuXHRcdC8vIERldGVjdCBvdmVyZmxvdzpzY3JvbGwgc2NyZXdpbmVzcyAoZ2gtMzY5OSlcblx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD02NFxuXHRcdC8vIERvbid0IGdldCB0cmlja2VkIHdoZW4gem9vbSBhZmZlY3RzIG9mZnNldFdpZHRoIChnaC00MDI5KVxuXHRcdGRpdi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcblx0XHRzY3JvbGxib3hTaXplVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXYub2Zmc2V0V2lkdGggLyAzICkgPT09IDEyO1xuXG5cdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdC8vIE51bGxpZnkgdGhlIGRpdiBzbyBpdCB3b3VsZG4ndCBiZSBzdG9yZWQgaW4gdGhlIG1lbW9yeSBhbmRcblx0XHQvLyBpdCB3aWxsIGFsc28gYmUgYSBzaWduIHRoYXQgY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHtcblx0XHRyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7XG5cdH1cblxuXHR2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsIHNjcm9sbGJveFNpemVWYWwsIHBpeGVsQm94U3R5bGVzVmFsLFxuXHRcdHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsLCByZWxpYWJsZU1hcmdpbkxlZnRWYWwsXG5cdFx0Y29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLFxuXHRcdGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKTtcblxuXHQvLyBGaW5pc2ggZWFybHkgaW4gbGltaXRlZCAobm9uLWJyb3dzZXIpIGVudmlyb25tZW50c1xuXHRpZiAoICFkaXYuc3R5bGUgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBTdHlsZSBvZiBjbG9uZWQgZWxlbWVudCBhZmZlY3RzIHNvdXJjZSBlbGVtZW50IGNsb25lZCAodHJhYy04OTA4KVxuXHRkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcImNvbnRlbnQtYm94XCI7XG5cdGRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiXCI7XG5cdHN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSBcImNvbnRlbnQtYm94XCI7XG5cblx0alF1ZXJ5LmV4dGVuZCggc3VwcG9ydCwge1xuXHRcdGJveFNpemluZ1JlbGlhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gYm94U2l6aW5nUmVsaWFibGVWYWw7XG5cdFx0fSxcblx0XHRwaXhlbEJveFN0eWxlczogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHBpeGVsQm94U3R5bGVzVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHBpeGVsUG9zaXRpb25WYWw7XG5cdFx0fSxcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiByZWxpYWJsZU1hcmdpbkxlZnRWYWw7XG5cdFx0fSxcblx0XHRzY3JvbGxib3hTaXplOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gc2Nyb2xsYm94U2l6ZVZhbDtcblx0XHR9LFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDExKywgRWRnZSAxNSAtIDE4K1xuXHRcdC8vIElFL0VkZ2UgbWlzcmVwb3J0IGBnZXRDb21wdXRlZFN0eWxlYCBvZiB0YWJsZSByb3dzIHdpdGggd2lkdGgvaGVpZ2h0XG5cdFx0Ly8gc2V0IGluIENTUyB3aGlsZSBgb2Zmc2V0KmAgcHJvcGVydGllcyByZXBvcnQgY29ycmVjdCB2YWx1ZXMuXG5cdFx0Ly8gQmVoYXZpb3IgaW4gSUUgOSBpcyBtb3JlIHN1YnRsZSB0aGFuIGluIG5ld2VyIHZlcnNpb25zICYgaXQgcGFzc2VzXG5cdFx0Ly8gc29tZSB2ZXJzaW9ucyBvZiB0aGlzIHRlc3Q7IG1ha2Ugc3VyZSBub3QgdG8gbWFrZSBpdCBwYXNzIHRoZXJlIVxuXHRcdC8vXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA3MCtcblx0XHQvLyBPbmx5IEZpcmVmb3ggaW5jbHVkZXMgYm9yZGVyIHdpZHRoc1xuXHRcdC8vIGluIGNvbXB1dGVkIGRpbWVuc2lvbnMuIChnaC00NTI5KVxuXHRcdHJlbGlhYmxlVHJEaW1lbnNpb25zOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0YWJsZSwgdHIsIHRyQ2hpbGQsIHRyU3R5bGU7XG5cdFx0XHRpZiAoIHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJ0YWJsZVwiICk7XG5cdFx0XHRcdHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJ0clwiICk7XG5cdFx0XHRcdHRyQ2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0XHRcdFx0dGFibGUuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDtib3JkZXItY29sbGFwc2U6c2VwYXJhdGVcIjtcblx0XHRcdFx0dHIuc3R5bGUuY3NzVGV4dCA9IFwiYm94LXNpemluZzpjb250ZW50LWJveDtib3JkZXI6MXB4IHNvbGlkXCI7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDg2K1xuXHRcdFx0XHQvLyBIZWlnaHQgc2V0IHRocm91Z2ggY3NzVGV4dCBkb2VzIG5vdCBnZXQgYXBwbGllZC5cblx0XHRcdFx0Ly8gQ29tcHV0ZWQgaGVpZ2h0IHRoZW4gY29tZXMgYmFjayBhcyAwLlxuXHRcdFx0XHR0ci5zdHlsZS5oZWlnaHQgPSBcIjFweFwiO1xuXHRcdFx0XHR0ckNoaWxkLnN0eWxlLmhlaWdodCA9IFwiOXB4XCI7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA4IENocm9tZSA4Nitcblx0XHRcdFx0Ly8gSW4gb3VyIGJvZHlCYWNrZ3JvdW5kLmh0bWwgaWZyYW1lLFxuXHRcdFx0XHQvLyBkaXNwbGF5IGZvciBhbGwgZGl2IGVsZW1lbnRzIGlzIHNldCB0byBcImlubGluZVwiLFxuXHRcdFx0XHQvLyB3aGljaCBjYXVzZXMgYSBwcm9ibGVtIG9ubHkgaW4gQW5kcm9pZCA4IENocm9tZSA4Ni5cblx0XHRcdFx0Ly8gRW5zdXJpbmcgdGhlIGRpdiBpcyBgZGlzcGxheTogYmxvY2tgXG5cdFx0XHRcdC8vIGdldHMgYXJvdW5kIHRoaXMgaXNzdWUuXG5cdFx0XHRcdHRyQ2hpbGQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblxuXHRcdFx0XHRkb2N1bWVudEVsZW1lbnRcblx0XHRcdFx0XHQuYXBwZW5kQ2hpbGQoIHRhYmxlIClcblx0XHRcdFx0XHQuYXBwZW5kQ2hpbGQoIHRyIClcblx0XHRcdFx0XHQuYXBwZW5kQ2hpbGQoIHRyQ2hpbGQgKTtcblxuXHRcdFx0XHR0clN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIHRyICk7XG5cdFx0XHRcdHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsID0gKCBwYXJzZUludCggdHJTdHlsZS5oZWlnaHQsIDEwICkgK1xuXHRcdFx0XHRcdHBhcnNlSW50KCB0clN0eWxlLmJvcmRlclRvcFdpZHRoLCAxMCApICtcblx0XHRcdFx0XHRwYXJzZUludCggdHJTdHlsZS5ib3JkZXJCb3R0b21XaWR0aCwgMTAgKSApID09PSB0ci5vZmZzZXRIZWlnaHQ7XG5cblx0XHRcdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCB0YWJsZSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsO1xuXHRcdH1cblx0fSApO1xufSApKCk7XG5cblxuZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHtcblx0dmFyIHdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgsIHJldCxcblx0XHRpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksXG5cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDUxK1xuXHRcdC8vIFJldHJpZXZpbmcgc3R5bGUgYmVmb3JlIGNvbXB1dGVkIHNvbWVob3dcblx0XHQvLyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGdldHRpbmcgd3JvbmcgdmFsdWVzXG5cdFx0Ly8gb24gZGV0YWNoZWQgZWxlbWVudHNcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0Y29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTtcblxuXHQvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG5lZWRlZCBmb3I6XG5cdC8vICAgLmNzcygnZmlsdGVyJykgKElFIDkgb25seSwgdHJhYy0xMjUzNylcblx0Ly8gICAuY3NzKCctLWN1c3RvbVByb3BlcnR5KSAoZ2gtMzE0NClcblx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExK1xuXHRcdC8vIElFIG9ubHkgc3VwcG9ydHMgYFwiZmxvYXRcImAgaW4gYGdldFByb3BlcnR5VmFsdWVgOyBpbiBjb21wdXRlZCBzdHlsZXNcblx0XHQvLyBpdCdzIG9ubHkgYXZhaWxhYmxlIGFzIGBcImNzc0Zsb2F0XCJgLiBXZSBubyBsb25nZXIgbW9kaWZ5IHByb3BlcnRpZXNcblx0XHQvLyBzZW50IHRvIGAuY3NzKClgIGFwYXJ0IGZyb20gY2FtZWxDYXNpbmcsIHNvIHdlIG5lZWQgdG8gY2hlY2sgYm90aC5cblx0XHQvLyBOb3JtYWxseSwgdGhpcyB3b3VsZCBjcmVhdGUgZGlmZmVyZW5jZSBpbiBiZWhhdmlvcjogaWZcblx0XHQvLyBgZ2V0UHJvcGVydHlWYWx1ZWAgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcsIHRoZSB2YWx1ZSByZXR1cm5lZFxuXHRcdC8vIGJ5IGAuY3NzKClgIHdvdWxkIGJlIGB1bmRlZmluZWRgLiBUaGlzIGlzIHVzdWFsbHkgdGhlIGNhc2UgZm9yXG5cdFx0Ly8gZGlzY29ubmVjdGVkIGVsZW1lbnRzLiBIb3dldmVyLCBpbiBJRSBldmVuIGRpc2Nvbm5lY3RlZCBlbGVtZW50c1xuXHRcdC8vIHdpdGggbm8gc3R5bGVzIHJldHVybiBgXCJub25lXCJgIGZvciBgZ2V0UHJvcGVydHlWYWx1ZSggXCJmbG9hdFwiIClgXG5cdFx0cmV0ID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF07XG5cblx0XHRpZiAoIGlzQ3VzdG9tUHJvcCAmJiByZXQgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggMTA1KywgQ2hyb21lIDw9MTA1K1xuXHRcdFx0Ly8gU3BlYyByZXF1aXJlcyB0cmltbWluZyB3aGl0ZXNwYWNlIGZvciBjdXN0b20gcHJvcGVydGllcyAoZ2gtNDkyNikuXG5cdFx0XHQvLyBGaXJlZm94IG9ubHkgdHJpbXMgbGVhZGluZyB3aGl0ZXNwYWNlLiBDaHJvbWUganVzdCBjb2xsYXBzZXNcblx0XHRcdC8vIGJvdGggbGVhZGluZyAmIHRyYWlsaW5nIHdoaXRlc3BhY2UgdG8gYSBzaW5nbGUgc3BhY2UuXG5cdFx0XHQvL1xuXHRcdFx0Ly8gRmFsbCBiYWNrIHRvIGB1bmRlZmluZWRgIGlmIGVtcHR5IHN0cmluZyByZXR1cm5lZC5cblx0XHRcdC8vIFRoaXMgY29sbGFwc2VzIGEgbWlzc2luZyBkZWZpbml0aW9uIHdpdGggcHJvcGVydHkgZGVmaW5lZFxuXHRcdFx0Ly8gYW5kIHNldCB0byBhbiBlbXB0eSBzdHJpbmcgYnV0IHRoZXJlJ3Mgbm8gc3RhbmRhcmQgQVBJXG5cdFx0XHQvLyBhbGxvd2luZyB1cyB0byBkaWZmZXJlbnRpYXRlIHRoZW0gd2l0aG91dCBhIHBlcmZvcm1hbmNlIHBlbmFsdHlcblx0XHRcdC8vIGFuZCByZXR1cm5pbmcgYHVuZGVmaW5lZGAgYWxpZ25zIHdpdGggb2xkZXIgalF1ZXJ5LlxuXHRcdFx0Ly9cblx0XHRcdC8vIHJ0cmltQ1NTIHRyZWF0cyBVKzAwMEQgQ0FSUklBR0UgUkVUVVJOIGFuZCBVKzAwMEMgRk9STSBGRUVEXG5cdFx0XHQvLyBhcyB3aGl0ZXNwYWNlIHdoaWxlIENTUyBkb2VzIG5vdCwgYnV0IHRoaXMgaXMgbm90IGEgcHJvYmxlbVxuXHRcdFx0Ly8gYmVjYXVzZSBDU1MgcHJlcHJvY2Vzc2luZyByZXBsYWNlcyB0aGVtIHdpdGggVSswMDBBIExJTkUgRkVFRFxuXHRcdFx0Ly8gKHdoaWNoICppcyogQ1NTIHdoaXRlc3BhY2UpXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXN5bnRheC0zLyNpbnB1dC1wcmVwcm9jZXNzaW5nXG5cdFx0XHRyZXQgPSByZXQucmVwbGFjZSggcnRyaW1DU1MsIFwiJDFcIiApIHx8IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAoIHJldCA9PT0gXCJcIiAmJiAhaXNBdHRhY2hlZCggZWxlbSApICkge1xuXHRcdFx0cmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gQSB0cmlidXRlIHRvIHRoZSBcImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHNcIlxuXHRcdC8vIEFuZHJvaWQgQnJvd3NlciByZXR1cm5zIHBlcmNlbnRhZ2UgZm9yIHNvbWUgdmFsdWVzLFxuXHRcdC8vIGJ1dCB3aWR0aCBzZWVtcyB0byBiZSByZWxpYWJseSBwaXhlbHMuXG5cdFx0Ly8gVGhpcyBpcyBhZ2FpbnN0IHRoZSBDU1NPTSBkcmFmdCBzcGVjOlxuXHRcdC8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3NvbS8jcmVzb2x2ZWQtdmFsdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5waXhlbEJveFN0eWxlcygpICYmIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiByYm94U3R5bGUudGVzdCggbmFtZSApICkge1xuXG5cdFx0XHQvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzXG5cdFx0XHR3aWR0aCA9IHN0eWxlLndpZHRoO1xuXHRcdFx0bWluV2lkdGggPSBzdHlsZS5taW5XaWR0aDtcblx0XHRcdG1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7XG5cblx0XHRcdC8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXRcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDtcblx0XHRcdHJldCA9IGNvbXB1dGVkLndpZHRoO1xuXG5cdFx0XHQvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzXG5cdFx0XHRzdHlsZS53aWR0aCA9IHdpZHRoO1xuXHRcdFx0c3R5bGUubWluV2lkdGggPSBtaW5XaWR0aDtcblx0XHRcdHN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJldCAhPT0gdW5kZWZpbmVkID9cblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0XHQvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLlxuXHRcdHJldCArIFwiXCIgOlxuXHRcdHJldDtcbn1cblxuXG5mdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7XG5cblx0Ly8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBjb25kaXRpb25GbigpICkge1xuXG5cdFx0XHRcdC8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZVxuXHRcdFx0XHQvLyB0byBtaXNzaW5nIGRlcGVuZGVuY3kpLCByZW1vdmUgaXQuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmdldDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi5cblx0XHRcdHJldHVybiAoIHRoaXMuZ2V0ID0gaG9va0ZuICkuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0fTtcbn1cblxuXG52YXIgY3NzUHJlZml4ZXMgPSBbIFwiV2Via2l0XCIsIFwiTW96XCIsIFwibXNcIiBdLFxuXHRlbXB0eVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLnN0eWxlLFxuXHR2ZW5kb3JQcm9wcyA9IHt9O1xuXG4vLyBSZXR1cm4gYSB2ZW5kb3ItcHJlZml4ZWQgcHJvcGVydHkgb3IgdW5kZWZpbmVkXG5mdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHtcblxuXHQvLyBDaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzXG5cdHZhciBjYXBOYW1lID0gbmFtZVsgMCBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKCAxICksXG5cdFx0aSA9IGNzc1ByZWZpeGVzLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7XG5cdFx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0XHRyZXR1cm4gbmFtZTtcblx0XHR9XG5cdH1cbn1cblxuLy8gUmV0dXJuIGEgcG90ZW50aWFsbHktbWFwcGVkIGpRdWVyeS5jc3NQcm9wcyBvciB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHlcbmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7XG5cdHZhciBmaW5hbCA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdIHx8IHZlbmRvclByb3BzWyBuYW1lIF07XG5cblx0aWYgKCBmaW5hbCApIHtcblx0XHRyZXR1cm4gZmluYWw7XG5cdH1cblx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cblx0cmV0dXJuIHZlbmRvclByb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7XG59XG5cblxudmFyXG5cblx0Ly8gU3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZVxuXHQvLyBleGNlcHQgXCJ0YWJsZVwiLCBcInRhYmxlLWNlbGxcIiwgb3IgXCJ0YWJsZS1jYXB0aW9uXCJcblx0Ly8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5XG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcblx0Y3NzU2hvdyA9IHsgcG9zaXRpb246IFwiYWJzb2x1dGVcIiwgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiwgZGlzcGxheTogXCJibG9ja1wiIH0sXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcblx0XHRsZXR0ZXJTcGFjaW5nOiBcIjBcIixcblx0XHRmb250V2VpZ2h0OiBcIjQwMFwiXG5cdH07XG5cbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBfZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkge1xuXG5cdC8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW5cblx0Ly8gbm9ybWFsaXplZCBhdCB0aGlzIHBvaW50XG5cdHZhciBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApO1xuXHRyZXR1cm4gbWF0Y2hlcyA/XG5cblx0XHQvLyBHdWFyZCBhZ2FpbnN0IHVuZGVmaW5lZCBcInN1YnRyYWN0XCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rc1xuXHRcdE1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgOlxuXHRcdHZhbHVlO1xufVxuXG5mdW5jdGlvbiBib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgYm94LCBpc0JvcmRlckJveCwgc3R5bGVzLCBjb21wdXRlZFZhbCApIHtcblx0dmFyIGkgPSBkaW1lbnNpb24gPT09IFwid2lkdGhcIiA/IDEgOiAwLFxuXHRcdGV4dHJhID0gMCxcblx0XHRkZWx0YSA9IDAsXG5cdFx0bWFyZ2luRGVsdGEgPSAwO1xuXG5cdC8vIEFkanVzdG1lbnQgbWF5IG5vdCBiZSBuZWNlc3Nhcnlcblx0aWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHtcblxuXHRcdC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpblxuXHRcdC8vIENvdW50IG1hcmdpbiBkZWx0YSBzZXBhcmF0ZWx5IHRvIG9ubHkgYWRkIGl0IGFmdGVyIHNjcm9sbCBndXR0ZXIgYWRqdXN0bWVudC5cblx0XHQvLyBUaGlzIGlzIG5lZWRlZCB0byBtYWtlIG5lZ2F0aXZlIG1hcmdpbnMgd29yayB3aXRoIGBvdXRlckhlaWdodCggdHJ1ZSApYCAoZ2gtMzk4MikuXG5cdFx0aWYgKCBib3ggPT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRtYXJnaW5EZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZ2V0IGhlcmUgd2l0aCBhIGNvbnRlbnQtYm94LCB3ZSdyZSBzZWVraW5nIFwicGFkZGluZ1wiIG9yIFwiYm9yZGVyXCIgb3IgXCJtYXJnaW5cIlxuXHRcdGlmICggIWlzQm9yZGVyQm94ICkge1xuXG5cdFx0XHQvLyBBZGQgcGFkZGluZ1xuXHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEZvciBcImJvcmRlclwiIG9yIFwibWFyZ2luXCIsIGFkZCBib3JkZXJcblx0XHRcdGlmICggYm94ICE9PSBcInBhZGRpbmdcIiApIHtcblx0XHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblxuXHRcdFx0Ly8gQnV0IHN0aWxsIGtlZXAgdHJhY2sgb2YgaXQgb3RoZXJ3aXNlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRleHRyYSArPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZ2V0IGhlcmUgd2l0aCBhIGJvcmRlci1ib3ggKGNvbnRlbnQgKyBwYWRkaW5nICsgYm9yZGVyKSwgd2UncmUgc2Vla2luZyBcImNvbnRlbnRcIiBvclxuXHRcdC8vIFwicGFkZGluZ1wiIG9yIFwibWFyZ2luXCJcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBGb3IgXCJjb250ZW50XCIsIHN1YnRyYWN0IHBhZGRpbmdcblx0XHRcdGlmICggYm94ID09PSBcImNvbnRlbnRcIiApIHtcblx0XHRcdFx0ZGVsdGEgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBcImNvbnRlbnRcIiBvciBcInBhZGRpbmdcIiwgc3VidHJhY3QgYm9yZGVyXG5cdFx0XHRpZiAoIGJveCAhPT0gXCJtYXJnaW5cIiApIHtcblx0XHRcdFx0ZGVsdGEgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBBY2NvdW50IGZvciBwb3NpdGl2ZSBjb250ZW50LWJveCBzY3JvbGwgZ3V0dGVyIHdoZW4gcmVxdWVzdGVkIGJ5IHByb3ZpZGluZyBjb21wdXRlZFZhbFxuXHRpZiAoICFpc0JvcmRlckJveCAmJiBjb21wdXRlZFZhbCA+PSAwICkge1xuXG5cdFx0Ly8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGlzIGEgcm91bmRlZCBzdW0gb2YgY29udGVudCwgcGFkZGluZywgc2Nyb2xsIGd1dHRlciwgYW5kIGJvcmRlclxuXHRcdC8vIEFzc3VtaW5nIGludGVnZXIgc2Nyb2xsIGd1dHRlciwgc3VidHJhY3QgdGhlIHJlc3QgYW5kIHJvdW5kIGRvd25cblx0XHRkZWx0YSArPSBNYXRoLm1heCggMCwgTWF0aC5jZWlsKFxuXHRcdFx0ZWxlbVsgXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdIC1cblx0XHRcdGNvbXB1dGVkVmFsIC1cblx0XHRcdGRlbHRhIC1cblx0XHRcdGV4dHJhIC1cblx0XHRcdDAuNVxuXG5cdFx0Ly8gSWYgb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGlzIHVua25vd24sIHRoZW4gd2UgY2FuJ3QgZGV0ZXJtaW5lIGNvbnRlbnQtYm94IHNjcm9sbCBndXR0ZXJcblx0XHQvLyBVc2UgYW4gZXhwbGljaXQgemVybyB0byBhdm9pZCBOYU4gKGdoLTM5NjQpXG5cdFx0KSApIHx8IDA7XG5cdH1cblxuXHRyZXR1cm4gZGVsdGEgKyBtYXJnaW5EZWx0YTtcbn1cblxuZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApIHtcblxuXHQvLyBTdGFydCB3aXRoIGNvbXB1dGVkIHN0eWxlXG5cdHZhciBzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblxuXHRcdC8vIFRvIGF2b2lkIGZvcmNpbmcgYSByZWZsb3csIG9ubHkgZmV0Y2ggYm94U2l6aW5nIGlmIHdlIG5lZWQgaXQgKGdoLTQzMjIpLlxuXHRcdC8vIEZha2UgY29udGVudC1ib3ggdW50aWwgd2Uga25vdyBpdCdzIG5lZWRlZCB0byBrbm93IHRoZSB0cnVlIHZhbHVlLlxuXHRcdGJveFNpemluZ05lZWRlZCA9ICFzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgZXh0cmEsXG5cdFx0aXNCb3JkZXJCb3ggPSBib3hTaXppbmdOZWVkZWQgJiZcblx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94LFxuXG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBkaW1lbnNpb24sIHN0eWxlcyApLFxuXHRcdG9mZnNldFByb3AgPSBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApO1xuXG5cdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD01NFxuXHQvLyBSZXR1cm4gYSBjb25mb3VuZGluZyBub24tcGl4ZWwgdmFsdWUgb3IgZmVpZ24gaWdub3JhbmNlLCBhcyBhcHByb3ByaWF0ZS5cblx0aWYgKCBybnVtbm9ucHgudGVzdCggdmFsICkgKSB7XG5cdFx0aWYgKCAhZXh0cmEgKSB7XG5cdFx0XHRyZXR1cm4gdmFsO1xuXHRcdH1cblx0XHR2YWwgPSBcImF1dG9cIjtcblx0fVxuXG5cblx0Ly8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHlcblx0Ly8gVXNlIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBmb3Igd2hlbiBib3ggc2l6aW5nIGlzIHVucmVsaWFibGUuXG5cdC8vIEluIHRob3NlIGNhc2VzLCB0aGUgY29tcHV0ZWQgdmFsdWUgY2FuIGJlIHRydXN0ZWQgdG8gYmUgYm9yZGVyLWJveC5cblx0aWYgKCAoICFzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgJiYgaXNCb3JkZXJCb3ggfHxcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDEwIC0gMTErLCBFZGdlIDE1IC0gMTgrXG5cdFx0Ly8gSUUvRWRnZSBtaXNyZXBvcnQgYGdldENvbXB1dGVkU3R5bGVgIG9mIHRhYmxlIHJvd3Mgd2l0aCB3aWR0aC9oZWlnaHRcblx0XHQvLyBzZXQgaW4gQ1NTIHdoaWxlIGBvZmZzZXQqYCBwcm9wZXJ0aWVzIHJlcG9ydCBjb3JyZWN0IHZhbHVlcy5cblx0XHQvLyBJbnRlcmVzdGluZ2x5LCBpbiBzb21lIGNhc2VzIElFIDkgZG9lc24ndCBzdWZmZXIgZnJvbSB0aGlzIGlzc3VlLlxuXHRcdCFzdXBwb3J0LnJlbGlhYmxlVHJEaW1lbnNpb25zKCkgJiYgbm9kZU5hbWUoIGVsZW0sIFwidHJcIiApIHx8XG5cblx0XHQvLyBGYWxsIGJhY2sgdG8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IHdoZW4gdmFsdWUgaXMgXCJhdXRvXCJcblx0XHQvLyBUaGlzIGhhcHBlbnMgZm9yIGlubGluZSBlbGVtZW50cyB3aXRoIG5vIGV4cGxpY2l0IHNldHRpbmcgKGdoLTM1NzEpXG5cdFx0dmFsID09PSBcImF1dG9cIiB8fFxuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMSAtIDQuMyBvbmx5XG5cdFx0Ly8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMilcblx0XHQhcGFyc2VGbG9hdCggdmFsICkgJiYgalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJpbmxpbmVcIiApICYmXG5cblx0XHQvLyBNYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSAmIGNvbm5lY3RlZFxuXHRcdGVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7XG5cblx0XHRpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCI7XG5cblx0XHQvLyBXaGVyZSBhdmFpbGFibGUsIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBhcHByb3hpbWF0ZSBib3JkZXIgYm94IGRpbWVuc2lvbnMuXG5cdFx0Ly8gV2hlcmUgbm90IGF2YWlsYWJsZSAoZS5nLiwgU1ZHKSwgYXNzdW1lIHVucmVsaWFibGUgYm94LXNpemluZyBhbmQgaW50ZXJwcmV0IHRoZVxuXHRcdC8vIHJldHJpZXZlZCB2YWx1ZSBhcyBhIGNvbnRlbnQgYm94IGRpbWVuc2lvbi5cblx0XHR2YWx1ZUlzQm9yZGVyQm94ID0gb2Zmc2V0UHJvcCBpbiBlbGVtO1xuXHRcdGlmICggdmFsdWVJc0JvcmRlckJveCApIHtcblx0XHRcdHZhbCA9IGVsZW1bIG9mZnNldFByb3AgXTtcblx0XHR9XG5cdH1cblxuXHQvLyBOb3JtYWxpemUgXCJcIiBhbmQgYXV0b1xuXHR2YWwgPSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAwO1xuXG5cdC8vIEFkanVzdCBmb3IgdGhlIGVsZW1lbnQncyBib3ggbW9kZWxcblx0cmV0dXJuICggdmFsICtcblx0XHRib3hNb2RlbEFkanVzdG1lbnQoXG5cdFx0XHRlbGVtLFxuXHRcdFx0ZGltZW5zaW9uLFxuXHRcdFx0ZXh0cmEgfHwgKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApLFxuXHRcdFx0dmFsdWVJc0JvcmRlckJveCxcblx0XHRcdHN0eWxlcyxcblxuXHRcdFx0Ly8gUHJvdmlkZSB0aGUgY3VycmVudCBjb21wdXRlZCBzaXplIHRvIHJlcXVlc3Qgc2Nyb2xsIGd1dHRlciBjYWxjdWxhdGlvbiAoZ2gtMzU4OSlcblx0XHRcdHZhbFxuXHRcdClcblx0KSArIFwicHhcIjtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIEFkZCBpbiBzdHlsZSBwcm9wZXJ0eSBob29rcyBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmYXVsdFxuXHQvLyBiZWhhdmlvciBvZiBnZXR0aW5nIGFuZCBzZXR0aW5nIGEgc3R5bGUgcHJvcGVydHlcblx0Y3NzSG9va3M6IHtcblx0XHRvcGFjaXR5OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdFx0XHRcdC8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFjaXR5XG5cdFx0XHRcdFx0dmFyIHJldCA9IGN1ckNTUyggZWxlbSwgXCJvcGFjaXR5XCIgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmV0ID09PSBcIlwiID8gXCIxXCIgOiByZXQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Ly8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgXCJweFwiIHRvIHRoZXNlIHBvc3NpYmx5LXVuaXRsZXNzIHByb3BlcnRpZXNcblx0Y3NzTnVtYmVyOiB7XG5cdFx0YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IHRydWUsXG5cdFx0YXNwZWN0UmF0aW86IHRydWUsXG5cdFx0Ym9yZGVySW1hZ2VTbGljZTogdHJ1ZSxcblx0XHRjb2x1bW5Db3VudDogdHJ1ZSxcblx0XHRmbGV4R3JvdzogdHJ1ZSxcblx0XHRmbGV4U2hyaW5rOiB0cnVlLFxuXHRcdGZvbnRXZWlnaHQ6IHRydWUsXG5cdFx0Z3JpZEFyZWE6IHRydWUsXG5cdFx0Z3JpZENvbHVtbjogdHJ1ZSxcblx0XHRncmlkQ29sdW1uRW5kOiB0cnVlLFxuXHRcdGdyaWRDb2x1bW5TdGFydDogdHJ1ZSxcblx0XHRncmlkUm93OiB0cnVlLFxuXHRcdGdyaWRSb3dFbmQ6IHRydWUsXG5cdFx0Z3JpZFJvd1N0YXJ0OiB0cnVlLFxuXHRcdGxpbmVIZWlnaHQ6IHRydWUsXG5cdFx0b3BhY2l0eTogdHJ1ZSxcblx0XHRvcmRlcjogdHJ1ZSxcblx0XHRvcnBoYW5zOiB0cnVlLFxuXHRcdHNjYWxlOiB0cnVlLFxuXHRcdHdpZG93czogdHJ1ZSxcblx0XHR6SW5kZXg6IHRydWUsXG5cdFx0em9vbTogdHJ1ZSxcblxuXHRcdC8vIFNWRy1yZWxhdGVkXG5cdFx0ZmlsbE9wYWNpdHk6IHRydWUsXG5cdFx0Zmxvb2RPcGFjaXR5OiB0cnVlLFxuXHRcdHN0b3BPcGFjaXR5OiB0cnVlLFxuXHRcdHN0cm9rZU1pdGVybGltaXQ6IHRydWUsXG5cdFx0c3Ryb2tlT3BhY2l0eTogdHJ1ZVxuXHR9LFxuXG5cdC8vIEFkZCBpbiBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBiZWZvcmVcblx0Ly8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZVxuXHRjc3NQcm9wczoge30sXG5cblx0Ly8gR2V0IGFuZCBzZXQgdGhlIHN0eWxlIHByb3BlcnR5IG9uIGEgRE9NIE5vZGVcblx0c3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7XG5cblx0XHQvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHR2YXIgcmV0LCB0eXBlLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0gY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUuIFdlIGRvbid0XG5cdFx0Ly8gd2FudCB0byBxdWVyeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5XG5cdFx0Ly8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLlxuXHRcdGlmICggIWlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdG5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIEdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24sIHRoZW4gdW5wcmVmaXhlZCB2ZXJzaW9uXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWVcblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG5cdFx0XHQvLyBDb252ZXJ0IFwiKz1cIiBvciBcIi09XCIgdG8gcmVsYXRpdmUgbnVtYmVycyAodHJhYy03MzQ1KVxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICYmICggcmV0ID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiYgcmV0WyAxIF0gKSB7XG5cdFx0XHRcdHZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTtcblxuXHRcdFx0XHQvLyBGaXhlcyBidWcgdHJhYy05MjM3XG5cdFx0XHRcdHR5cGUgPSBcIm51bWJlclwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQgKHRyYWMtNzExNilcblx0XHRcdGlmICggdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpXG5cdFx0XHQvLyBUaGUgaXNDdXN0b21Qcm9wIGNoZWNrIGNhbiBiZSByZW1vdmVkIGluIGpRdWVyeSA0LjAgd2hlbiB3ZSBvbmx5IGF1dG8tYXBwZW5kXG5cdFx0XHQvLyBcInB4XCIgdG8gYSBmZXcgaGFyZGNvZGVkIHZhbHVlcy5cblx0XHRcdGlmICggdHlwZSA9PT0gXCJudW1iZXJcIiAmJiAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0XHR2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gXCJcIiA6IFwicHhcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBiYWNrZ3JvdW5kLSogcHJvcHMgYWZmZWN0IG9yaWdpbmFsIGNsb25lJ3MgdmFsdWVzXG5cdFx0XHRpZiAoICFzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSAmJiB2YWx1ZSA9PT0gXCJcIiAmJiBuYW1lLmluZGV4T2YoIFwiYmFja2dyb3VuZFwiICkgPT09IDAgKSB7XG5cdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSBcImluaGVyaXRcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKCBcInNldFwiIGluIGhvb2tzICkgfHxcblx0XHRcdFx0KCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGlmICggaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0XHRcdHN0eWxlLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdFxuXHRcdFx0cmV0dXJuIHN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXHR9LFxuXG5cdGNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhLCBzdHlsZXMgKSB7XG5cdFx0dmFyIHZhbCwgbnVtLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0gY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUuIFdlIGRvbid0XG5cdFx0Ly8gd2FudCB0byBtb2RpZnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eVxuXHRcdC8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC5cblx0XHRpZiAoICFpc0N1c3RvbVByb3AgKSB7XG5cdFx0XHRuYW1lID0gZmluYWxQcm9wTmFtZSggb3JpZ05hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2UsIGlmIGEgd2F5IHRvIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZXhpc3RzLCB1c2UgdGhhdFxuXHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgXCJub3JtYWxcIiB0byBjb21wdXRlZCB2YWx1ZVxuXHRcdGlmICggdmFsID09PSBcIm5vcm1hbFwiICYmIG5hbWUgaW4gY3NzTm9ybWFsVHJhbnNmb3JtICkge1xuXHRcdFx0dmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBudW1lcmljIGlmIGZvcmNlZCBvciBhIHF1YWxpZmllciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljXG5cdFx0aWYgKCBleHRyYSA9PT0gXCJcIiB8fCBleHRyYSApIHtcblx0XHRcdG51bSA9IHBhcnNlRmxvYXQoIHZhbCApO1xuXHRcdFx0cmV0dXJuIGV4dHJhID09PSB0cnVlIHx8IGlzRmluaXRlKCBudW0gKSA/IG51bSB8fCAwIDogdmFsO1xuXHRcdH1cblxuXHRcdHJldHVybiB2YWw7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiIF0sIGZ1bmN0aW9uKCBfaSwgZGltZW5zaW9uICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0Ly8gQ2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtXG5cdFx0XHRcdC8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0XG5cdFx0XHRcdHJldHVybiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApICYmXG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCtcblx0XHRcdFx0XHQvLyBUYWJsZSBjb2x1bW5zIGluIFNhZmFyaSBoYXZlIG5vbi16ZXJvIG9mZnNldFdpZHRoICYgemVyb1xuXHRcdFx0XHRcdC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHVubGVzcyBkaXNwbGF5IGlzIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0XHRcdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYSBkaXNjb25uZWN0ZWQgbm9kZVxuXHRcdFx0XHRcdC8vIGluIElFIHRocm93cyBhbiBlcnJvci5cblx0XHRcdFx0XHQoICFlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoIHx8ICFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICkgP1xuXHRcdFx0XHRcdHN3YXAoIGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKTtcblx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkge1xuXHRcdFx0dmFyIG1hdGNoZXMsXG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLFxuXG5cdFx0XHRcdC8vIE9ubHkgcmVhZCBzdHlsZXMucG9zaXRpb24gaWYgdGhlIHRlc3QgaGFzIGEgY2hhbmNlIHRvIGZhaWxcblx0XHRcdFx0Ly8gdG8gYXZvaWQgZm9yY2luZyBhIHJlZmxvdy5cblx0XHRcdFx0c2Nyb2xsYm94U2l6ZUJ1Z2d5ID0gIXN1cHBvcnQuc2Nyb2xsYm94U2l6ZSgpICYmXG5cdFx0XHRcdFx0c3R5bGVzLnBvc2l0aW9uID09PSBcImFic29sdXRlXCIsXG5cblx0XHRcdFx0Ly8gVG8gYXZvaWQgZm9yY2luZyBhIHJlZmxvdywgb25seSBmZXRjaCBib3hTaXppbmcgaWYgd2UgbmVlZCBpdCAoZ2gtMzk5MSlcblx0XHRcdFx0Ym94U2l6aW5nTmVlZGVkID0gc2Nyb2xsYm94U2l6ZUJ1Z2d5IHx8IGV4dHJhLFxuXHRcdFx0XHRpc0JvcmRlckJveCA9IGJveFNpemluZ05lZWRlZCAmJlxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0XHRcdHN1YnRyYWN0ID0gZXh0cmEgP1xuXHRcdFx0XHRcdGJveE1vZGVsQWRqdXN0bWVudChcblx0XHRcdFx0XHRcdGVsZW0sXG5cdFx0XHRcdFx0XHRkaW1lbnNpb24sXG5cdFx0XHRcdFx0XHRleHRyYSxcblx0XHRcdFx0XHRcdGlzQm9yZGVyQm94LFxuXHRcdFx0XHRcdFx0c3R5bGVzXG5cdFx0XHRcdFx0KSA6XG5cdFx0XHRcdFx0MDtcblxuXHRcdFx0Ly8gQWNjb3VudCBmb3IgdW5yZWxpYWJsZSBib3JkZXItYm94IGRpbWVuc2lvbnMgYnkgY29tcGFyaW5nIG9mZnNldCogdG8gY29tcHV0ZWQgYW5kXG5cdFx0XHQvLyBmYWtpbmcgYSBjb250ZW50LWJveCB0byBnZXQgYm9yZGVyIGFuZCBwYWRkaW5nIChnaC0zNjk5KVxuXHRcdFx0aWYgKCBpc0JvcmRlckJveCAmJiBzY3JvbGxib3hTaXplQnVnZ3kgKSB7XG5cdFx0XHRcdHN1YnRyYWN0IC09IE1hdGguY2VpbChcblx0XHRcdFx0XHRlbGVtWyBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApIF0gLVxuXHRcdFx0XHRcdHBhcnNlRmxvYXQoIHN0eWxlc1sgZGltZW5zaW9uIF0gKSAtXG5cdFx0XHRcdFx0Ym94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIFwiYm9yZGVyXCIsIGZhbHNlLCBzdHlsZXMgKSAtXG5cdFx0XHRcdFx0MC41XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnZlcnQgdG8gcGl4ZWxzIGlmIHZhbHVlIGFkanVzdG1lbnQgaXMgbmVlZGVkXG5cdFx0XHRpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmXG5cdFx0XHRcdCggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApICE9PSBcInB4XCIgKSB7XG5cblx0XHRcdFx0ZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gPSB2YWx1ZTtcblx0XHRcdFx0dmFsdWUgPSBqUXVlcnkuY3NzKCBlbGVtLCBkaW1lbnNpb24gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKTtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5jc3NIb29rcy5tYXJnaW5MZWZ0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luTGVmdCxcblx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4gKCBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sIFwibWFyZ2luTGVmdFwiICkgKSB8fFxuXHRcdFx0XHRlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuXHRcdFx0XHRcdHN3YXAoIGVsZW0sIHsgbWFyZ2luTGVmdDogMCB9LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cdFx0XHRcdFx0fSApXG5cdFx0XHQpICsgXCJweFwiO1xuXHRcdH1cblx0fVxuKTtcblxuLy8gVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgYW5pbWF0ZSB0byBleHBhbmQgcHJvcGVydGllc1xualF1ZXJ5LmVhY2goIHtcblx0bWFyZ2luOiBcIlwiLFxuXHRwYWRkaW5nOiBcIlwiLFxuXHRib3JkZXI6IFwiV2lkdGhcIlxufSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdID0ge1xuXHRcdGV4cGFuZDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGkgPSAwLFxuXHRcdFx0XHRleHBhbmRlZCA9IHt9LFxuXG5cdFx0XHRcdC8vIEFzc3VtZXMgYSBzaW5nbGUgbnVtYmVyIGlmIG5vdCBhIHN0cmluZ1xuXHRcdFx0XHRwYXJ0cyA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlLnNwbGl0KCBcIiBcIiApIDogWyB2YWx1ZSBdO1xuXG5cdFx0XHRmb3IgKCA7IGkgPCA0OyBpKysgKSB7XG5cdFx0XHRcdGV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID1cblx0XHRcdFx0XHRwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBleHBhbmRlZDtcblx0XHR9XG5cdH07XG5cblx0aWYgKCBwcmVmaXggIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXS5zZXQgPSBzZXRQb3NpdGl2ZU51bWJlcjtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGNzczogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHRcdHZhciBzdHlsZXMsIGxlbixcblx0XHRcdFx0bWFwID0ge30sXG5cdFx0XHRcdGkgPSAwO1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHtcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7XG5cdFx0XHRcdGxlbiA9IG5hbWUubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdG1hcFsgbmFtZVsgaSBdIF0gPSBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lWyBpIF0sIGZhbHNlLCBzdHlsZXMgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBtYXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDpcblx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApO1xuXHRcdH0sIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9XG59ICk7XG5cblxuZnVuY3Rpb24gVHdlZW4oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICkge1xuXHRyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApO1xufVxualF1ZXJ5LlR3ZWVuID0gVHdlZW47XG5cblR3ZWVuLnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IFR3ZWVuLFxuXHRpbml0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcsIHVuaXQgKSB7XG5cdFx0dGhpcy5lbGVtID0gZWxlbTtcblx0XHR0aGlzLnByb3AgPSBwcm9wO1xuXHRcdHRoaXMuZWFzaW5nID0gZWFzaW5nIHx8IGpRdWVyeS5lYXNpbmcuX2RlZmF1bHQ7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0XHR0aGlzLnN0YXJ0ID0gdGhpcy5ub3cgPSB0aGlzLmN1cigpO1xuXHRcdHRoaXMuZW5kID0gZW5kO1xuXHRcdHRoaXMudW5pdCA9IHVuaXQgfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICk7XG5cdH0sXG5cdGN1cjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTtcblxuXHRcdHJldHVybiBob29rcyAmJiBob29rcy5nZXQgP1xuXHRcdFx0aG9va3MuZ2V0KCB0aGlzICkgOlxuXHRcdFx0VHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LmdldCggdGhpcyApO1xuXHR9LFxuXHRydW46IGZ1bmN0aW9uKCBwZXJjZW50ICkge1xuXHRcdHZhciBlYXNlZCxcblx0XHRcdGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLmR1cmF0aW9uICkge1xuXHRcdFx0dGhpcy5wb3MgPSBlYXNlZCA9IGpRdWVyeS5lYXNpbmdbIHRoaXMuZWFzaW5nIF0oXG5cdFx0XHRcdHBlcmNlbnQsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIHBlcmNlbnQsIDAsIDEsIHRoaXMub3B0aW9ucy5kdXJhdGlvblxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7XG5cdFx0fVxuXHRcdHRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLnN0ZXAgKSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKCB0aGlzLmVsZW0sIHRoaXMubm93LCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7XG5cdFx0XHRob29rcy5zZXQoIHRoaXMgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0VHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LnNldCggdGhpcyApO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufTtcblxuVHdlZW4ucHJvdG90eXBlLmluaXQucHJvdG90eXBlID0gVHdlZW4ucHJvdG90eXBlO1xuXG5Ud2Vlbi5wcm9wSG9va3MgPSB7XG5cdF9kZWZhdWx0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cdFx0XHR2YXIgcmVzdWx0O1xuXG5cdFx0XHQvLyBVc2UgYSBwcm9wZXJ0eSBvbiB0aGUgZWxlbWVudCBkaXJlY3RseSB3aGVuIGl0IGlzIG5vdCBhIERPTSBlbGVtZW50LFxuXHRcdFx0Ly8gb3Igd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBzdHlsZSBwcm9wZXJ0eSB0aGF0IGV4aXN0cy5cblx0XHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAhPT0gMSB8fFxuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJiB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCApIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUGFzc2luZyBhbiBlbXB0eSBzdHJpbmcgYXMgYSAzcmQgcGFyYW1ldGVyIHRvIC5jc3Mgd2lsbCBhdXRvbWF0aWNhbGx5XG5cdFx0XHQvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLlxuXHRcdFx0Ly8gU2ltcGxlIHZhbHVlcyBzdWNoIGFzIFwiMTBweFwiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7XG5cdFx0XHQvLyBjb21wbGV4IHZhbHVlcyBzdWNoIGFzIFwicm90YXRlKDFyYWQpXCIgYXJlIHJldHVybmVkIGFzLWlzLlxuXHRcdFx0cmVzdWx0ID0galF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgXCJcIiApO1xuXG5cdFx0XHQvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kIFwiYXV0b1wiIGFyZSBjb252ZXJ0ZWQgdG8gMC5cblx0XHRcdHJldHVybiAhcmVzdWx0IHx8IHJlc3VsdCA9PT0gXCJhdXRvXCIgPyAwIDogcmVzdWx0O1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cblx0XHRcdC8vIFVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0LlxuXHRcdFx0Ly8gVXNlIGNzc0hvb2sgaWYgaXRzIHRoZXJlLlxuXHRcdFx0Ly8gVXNlIC5zdHlsZSBpZiBhdmFpbGFibGUgYW5kIHVzZSBwbGFpbiBwcm9wZXJ0aWVzIHdoZXJlIGF2YWlsYWJsZS5cblx0XHRcdGlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHtcblx0XHRcdFx0alF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSggdHdlZW4gKTtcblx0XHRcdH0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKFxuXHRcdFx0XHRqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSB8fFxuXHRcdFx0XHRcdHR3ZWVuLmVsZW0uc3R5bGVbIGZpbmFsUHJvcE5hbWUoIHR3ZWVuLnByb3AgKSBdICE9IG51bGwgKSApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJvcEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fSxcblx0X2RlZmF1bHQ6IFwic3dpbmdcIlxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgY29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIGluUHJvZ3Jlc3MsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLztcblxuZnVuY3Rpb24gc2NoZWR1bGUoKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHtcblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHNjaGVkdWxlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBzY2hlZHVsZSwgalF1ZXJ5LmZ4LmludGVydmFsICk7XG5cdFx0fVxuXG5cdFx0alF1ZXJ5LmZ4LnRpY2soKTtcblx0fVxufVxuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9ICk7XG5cdHJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApO1xufVxuXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxuZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHtcblx0dmFyIHdoaWNoLFxuXHRcdGkgPSAwLFxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTtcblxuXHQvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXG5cdC8vIG90aGVyd2lzZSBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0XG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwO1xuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIEFuaW1hdGlvbi50d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICggdHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApICkge1xuXG5cdFx0XHQvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHtcblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LFxuXHRcdGlzQm94ID0gXCJ3aWR0aFwiIGluIHByb3BzIHx8IFwiaGVpZ2h0XCIgaW4gcHJvcHMsXG5cdFx0YW5pbSA9IHRoaXMsXG5cdFx0b3JpZyA9IHt9LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cblx0Ly8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLnRlc3QoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIFByZXRlbmQgdG8gYmUgaGlkZGVuIGlmIHRoaXMgaXMgYSBcInNob3dcIiBhbmRcblx0XHRcdFx0Ly8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGVcblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJzaG93XCIgJiYgZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gSWdub3JlIGFsbCBvdGhlciBuby1vcCBzaG93L2hpZGUgZGF0YVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpXG5cdHByb3BUd2VlbiA9ICFqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcHMgKTtcblx0aWYgKCAhcHJvcFR3ZWVuICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVzdHJpY3QgXCJvdmVyZmxvd1wiIGFuZCBcImRpc3BsYXlcIiBzdHlsZXMgZHVyaW5nIGJveCBhbmltYXRpb25zXG5cdGlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTVcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90IGluZmVyIHRoZSBzaG9ydGhhbmRcblx0XHQvLyBmcm9tIGlkZW50aWNhbGx5LXZhbHVlZCBvdmVyZmxvd1ggYW5kIG92ZXJmbG93WSBhbmQgRWRnZSBqdXN0IG1pcnJvcnNcblx0XHQvLyB0aGUgb3ZlcmZsb3dYIHZhbHVlIHRoZXJlLlxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gSWRlbnRpZnkgYSBkaXNwbGF5IHR5cGUsIHByZWZlcnJpbmcgb2xkIHNob3cvaGlkZSBkYXRhIG92ZXIgdGhlIENTUyBjYXNjYWRlXG5cdFx0cmVzdG9yZURpc3BsYXkgPSBkYXRhU2hvdyAmJiBkYXRhU2hvdy5kaXNwbGF5O1xuXHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdH1cblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSApIHtcblx0XHRcdFx0ZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBHZXQgbm9uZW1wdHkgdmFsdWUocykgYnkgdGVtcG9yYXJpbHkgZm9yY2luZyB2aXNpYmlsaXR5XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApO1xuXHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheSB8fCByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFuaW1hdGUgaW5saW5lIGVsZW1lbnRzIGFzIGlubGluZS1ibG9ja1xuXHRcdGlmICggZGlzcGxheSA9PT0gXCJpbmxpbmVcIiB8fCBkaXNwbGF5ID09PSBcImlubGluZS1ibG9ja1wiICYmIHJlc3RvcmVEaXNwbGF5ICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZmxvYXRcIiApID09PSBcIm5vbmVcIiApIHtcblxuXHRcdFx0XHQvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlIGF0IHRoZSBlbmQgb2YgcHVyZSBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRcdFx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheSA9IHN0eWxlLmRpc3BsYXk7XG5cdFx0XHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJcIiA6IGRpc3BsYXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gSW1wbGVtZW50IHNob3cvaGlkZSBhbmltYXRpb25zXG5cdHByb3BUd2VlbiA9IGZhbHNlO1xuXHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cblx0XHQvLyBHZW5lcmFsIHNob3cvaGlkZSBzZXR1cCBmb3IgdGhpcyBlbGVtZW50IGFuaW1hdGlvblxuXHRcdGlmICggIXByb3BUd2VlbiApIHtcblx0XHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFTaG93ID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7IGRpc3BsYXk6IHJlc3RvcmVEaXNwbGF5IH0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RvcmUgaGlkZGVuL3Zpc2libGUgZm9yIHRvZ2dsZSBzbyBgLnN0b3AoKS50b2dnbGUoKWAgXCJyZXZlcnNlc1wiXG5cdFx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW1cblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi9cblxuXHRcdFx0XHQvLyBUaGUgZmluYWwgc3RlcCBvZiBhIFwiaGlkZVwiIGFuaW1hdGlvbiBpcyBhY3R1YWxseSBoaWRpbmcgdGhlIGVsZW1lbnRcblx0XHRcdFx0aWYgKCAhaGlkZGVuICkge1xuXHRcdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgXCJmeHNob3dcIiApO1xuXHRcdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdC8vIFBlci1wcm9wZXJ0eSBzZXR1cFxuXHRcdHByb3BUd2VlbiA9IGNyZWF0ZVR3ZWVuKCBoaWRkZW4gPyBkYXRhU2hvd1sgcHJvcCBdIDogMCwgcHJvcCwgYW5pbSApO1xuXHRcdGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkge1xuXHRcdFx0ZGF0YVNob3dbIHByb3AgXSA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRwcm9wVHdlZW4uZW5kID0gcHJvcFR3ZWVuLnN0YXJ0O1xuXHRcdFx0XHRwcm9wVHdlZW4uc3RhcnQgPSAwO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBwcm9wRmlsdGVyKCBwcm9wcywgc3BlY2lhbEVhc2luZyApIHtcblx0dmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rcztcblxuXHQvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3Ncblx0Zm9yICggaW5kZXggaW4gcHJvcHMgKSB7XG5cdFx0bmFtZSA9IGNhbWVsQ2FzZSggaW5kZXggKTtcblx0XHRlYXNpbmcgPSBzcGVjaWFsRWFzaW5nWyBuYW1lIF07XG5cdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRlYXNpbmcgPSB2YWx1ZVsgMSBdO1xuXHRcdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyAwIF07XG5cdFx0fVxuXG5cdFx0aWYgKCBpbmRleCAhPT0gbmFtZSApIHtcblx0XHRcdHByb3BzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgaW5kZXggXTtcblx0XHR9XG5cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdO1xuXHRcdGlmICggaG9va3MgJiYgXCJleHBhbmRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBuYW1lIF07XG5cblx0XHRcdC8vIE5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b24ndCBvdmVyd3JpdGUgZXhpc3Rpbmcga2V5cy5cblx0XHRcdC8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgXCJuYW1lXCJcblx0XHRcdGZvciAoIGluZGV4IGluIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7XG5cdFx0XHRcdFx0cHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgaW5kZXggXTtcblx0XHRcdFx0XHRzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0gZWFzaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZztcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRpb25zICkge1xuXHR2YXIgcmVzdWx0LFxuXHRcdHN0b3BwZWQsXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IEFuaW1hdGlvbi5wcmVmaWx0ZXJzLmxlbmd0aCxcblx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvclxuXHRcdFx0ZGVsZXRlIHRpY2suZWxlbTtcblx0XHR9ICksXG5cdFx0dGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0XHRyZW1haW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJhdGlvbiAtIGN1cnJlbnRUaW1lICksXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjMgb25seVxuXHRcdFx0XHQvLyBBcmNoYWljIGNyYXNoIGJ1ZyB3b24ndCBhbGxvdyB1cyB0byB1c2UgYDEgLSAoIDAuNSB8fCAwIClgICh0cmFjLTEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdICk7XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbW9yZSB0byBkbywgeWllbGRcblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIHdhcyBhbiBlbXB0eSBhbmltYXRpb24sIHN5bnRoZXNpemUgYSBmaW5hbCBwcm9ncmVzcyBub3RpZmljYXRpb25cblx0XHRcdGlmICggIWxlbmd0aCApIHtcblx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNvbHZlIHRoZSBhbmltYXRpb24gYW5kIHJlcG9ydCBpdHMgY29uY2x1c2lvblxuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcblx0XHRcdG9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHtcblx0XHRcdFx0c3BlY2lhbEVhc2luZzoge30sXG5cdFx0XHRcdGVhc2luZzogalF1ZXJ5LmVhc2luZy5fZGVmYXVsdFxuXHRcdFx0fSwgb3B0aW9ucyApLFxuXHRcdFx0b3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxuXHRcdFx0c3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0ZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sXG5cdFx0XHR0d2VlbnM6IFtdLFxuXHRcdFx0Y3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7XG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcblx0XHRcdFx0XHRhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdFx0fSxcblx0XHRcdHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkge1xuXHRcdFx0XHR2YXIgaW5kZXggPSAwLFxuXG5cdFx0XHRcdFx0Ly8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0XG5cdFx0XHRcdFx0bGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDtcblx0XHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0b3BwZWQgPSB0cnVlO1xuXHRcdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCAxICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXNvbHZlIHdoZW4gd2UgcGxheWVkIHRoZSBsYXN0IGZyYW1lOyBvdGhlcndpc2UsIHJlamVjdFxuXHRcdFx0XHRpZiAoIGdvdG9FbmQgKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdH0gKSxcblx0XHRwcm9wcyA9IGFuaW1hdGlvbi5wcm9wcztcblxuXHRwcm9wRmlsdGVyKCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApO1xuXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0cmVzdWx0ID0gQW5pbWF0aW9uLnByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTtcblx0XHRpZiAoIHJlc3VsdCApIHtcblx0XHRcdGlmICggaXNGdW5jdGlvbiggcmVzdWx0LnN0b3AgKSApIHtcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCBhbmltYXRpb24uZWxlbSwgYW5pbWF0aW9uLm9wdHMucXVldWUgKS5zdG9wID1cblx0XHRcdFx0XHRyZXN1bHQuc3RvcC5iaW5kKCByZXN1bHQgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHR9XG5cblx0alF1ZXJ5Lm1hcCggcHJvcHMsIGNyZWF0ZVR3ZWVuLCBhbmltYXRpb24gKTtcblxuXHRpZiAoIGlzRnVuY3Rpb24oIGFuaW1hdGlvbi5vcHRzLnN0YXJ0ICkgKSB7XG5cdFx0YW5pbWF0aW9uLm9wdHMuc3RhcnQuY2FsbCggZWxlbSwgYW5pbWF0aW9uICk7XG5cdH1cblxuXHQvLyBBdHRhY2ggY2FsbGJhY2tzIGZyb20gb3B0aW9uc1xuXHRhbmltYXRpb25cblx0XHQucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzIClcblx0XHQuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKVxuXHRcdC5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsIClcblx0XHQuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTtcblxuXHRqUXVlcnkuZngudGltZXIoXG5cdFx0alF1ZXJ5LmV4dGVuZCggdGljaywge1xuXHRcdFx0ZWxlbTogZWxlbSxcblx0XHRcdGFuaW06IGFuaW1hdGlvbixcblx0XHRcdHF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZVxuXHRcdH0gKVxuXHQpO1xuXG5cdHJldHVybiBhbmltYXRpb247XG59XG5cbmpRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHtcblxuXHR0d2VlbmVyczoge1xuXHRcdFwiKlwiOiBbIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHtcblx0XHRcdHZhciB0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICk7XG5cdFx0XHRhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTtcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9IF1cblx0fSxcblxuXHR0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggcHJvcHMgKSApIHtcblx0XHRcdGNhbGxiYWNrID0gcHJvcHM7XG5cdFx0XHRwcm9wcyA9IFsgXCIqXCIgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcHMgPSBwcm9wcy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApO1xuXHRcdH1cblxuXHRcdHZhciBwcm9wLFxuXHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0bGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdHByb3AgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdID0gQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW107XG5cdFx0XHRBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH1cblx0fSxcblxuXHRwcmVmaWx0ZXJzOiBbIGRlZmF1bHRQcmVmaWx0ZXIgXSxcblxuXHRwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCApIHtcblx0XHRpZiAoIHByZXBlbmQgKSB7XG5cdFx0XHRBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRBbmltYXRpb24ucHJlZmlsdGVycy5wdXNoKCBjYWxsYmFjayApO1xuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7XG5cdHZhciBvcHQgPSBzcGVlZCAmJiB0eXBlb2Ygc3BlZWQgPT09IFwib2JqZWN0XCIgPyBqUXVlcnkuZXh0ZW5kKCB7fSwgc3BlZWQgKSA6IHtcblx0XHRjb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fFxuXHRcdFx0aXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCxcblx0XHRkdXJhdGlvbjogc3BlZWQsXG5cdFx0ZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFpc0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmdcblx0fTtcblxuXHQvLyBHbyB0byB0aGUgZW5kIHN0YXRlIGlmIGZ4IGFyZSBvZmZcblx0aWYgKCBqUXVlcnkuZngub2ZmICkge1xuXHRcdG9wdC5kdXJhdGlvbiA9IDA7XG5cblx0fSBlbHNlIHtcblx0XHRpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiBcImZ4XCJcblx0aWYgKCBvcHQucXVldWUgPT0gbnVsbCB8fCBvcHQucXVldWUgPT09IHRydWUgKSB7XG5cdFx0b3B0LnF1ZXVlID0gXCJmeFwiO1xuXHR9XG5cblx0Ly8gUXVldWVpbmdcblx0b3B0Lm9sZCA9IG9wdC5jb21wbGV0ZTtcblxuXHRvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIGlzRnVuY3Rpb24oIG9wdC5vbGQgKSApIHtcblx0XHRcdG9wdC5vbGQuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0LnF1ZXVlICkge1xuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIG9wdC5xdWV1ZSApO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4gb3B0O1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmYWRlVG86IGZ1bmN0aW9uKCBzcGVlZCwgdG8sIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cblx0XHQvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDBcblx0XHRyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuV2l0aGluVHJlZSApLmNzcyggXCJvcGFjaXR5XCIsIDAgKS5zaG93KClcblxuXHRcdFx0Ly8gQW5pbWF0ZSB0byB0aGUgdmFsdWUgc3BlY2lmaWVkXG5cdFx0XHQuZW5kKCkuYW5pbWF0ZSggeyBvcGFjaXR5OiB0byB9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9LFxuXHRhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSxcblx0XHRcdG9wdGFsbCA9IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSxcblx0XHRcdGRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gT3BlcmF0ZSBvbiBhIGNvcHkgb2YgcHJvcCBzbyBwZXItcHJvcGVydHkgZWFzaW5nIHdvbid0IGJlIGxvc3Rcblx0XHRcdFx0dmFyIGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApO1xuXG5cdFx0XHRcdC8vIEVtcHR5IGFuaW1hdGlvbnMsIG9yIGZpbmlzaGluZyByZXNvbHZlcyBpbW1lZGlhdGVseVxuXHRcdFx0XHRpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgXCJmaW5pc2hcIiApICkge1xuXHRcdFx0XHRcdGFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0ZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247XG5cblx0XHRyZXR1cm4gZW1wdHkgfHwgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/XG5cdFx0XHR0aGlzLmVhY2goIGRvQW5pbWF0aW9uICkgOlxuXHRcdFx0dGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApO1xuXHR9LFxuXHRzdG9wOiBmdW5jdGlvbiggdHlwZSwgY2xlYXJRdWV1ZSwgZ290b0VuZCApIHtcblx0XHR2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkge1xuXHRcdFx0dmFyIHN0b3AgPSBob29rcy5zdG9wO1xuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XG5cdFx0XHRzdG9wKCBnb3RvRW5kICk7XG5cdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRnb3RvRW5kID0gY2xlYXJRdWV1ZTtcblx0XHRcdGNsZWFyUXVldWUgPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBjbGVhclF1ZXVlICkge1xuXHRcdFx0dGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZGVxdWV1ZSA9IHRydWUsXG5cdFx0XHRcdGluZGV4ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyBcInF1ZXVlSG9va3NcIixcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0ZGF0YSA9IGRhdGFQcml2LmdldCggdGhpcyApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICkge1xuXHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkge1xuXHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBpbmRleCBpbiBkYXRhICkge1xuXHRcdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgJiYgcnJ1bi50ZXN0KCBpbmRleCApICkge1xuXHRcdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiZcblx0XHRcdFx0XHQoIHR5cGUgPT0gbnVsbCB8fCB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSApIHtcblxuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIGdvdG9FbmQgKTtcblx0XHRcdFx0XHRkZXF1ZXVlID0gZmFsc2U7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2VkLlxuXHRcdFx0Ly8gVGltZXJzIGN1cnJlbnRseSB3aWxsIGNhbGwgdGhlaXIgY29tcGxldGUgY2FsbGJhY2tzLCB3aGljaFxuXHRcdFx0Ly8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLlxuXHRcdFx0aWYgKCBkZXF1ZXVlIHx8ICFnb3RvRW5kICkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblx0ZmluaXNoOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRpZiAoIHR5cGUgIT09IGZhbHNlICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpbmRleCxcblx0XHRcdFx0ZGF0YSA9IGRhdGFQcml2LmdldCggdGhpcyApLFxuXHRcdFx0XHRxdWV1ZSA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlXCIgXSxcblx0XHRcdFx0aG9va3MgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgXSxcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0bGVuZ3RoID0gcXVldWUgPyBxdWV1ZS5sZW5ndGggOiAwO1xuXG5cdFx0XHQvLyBFbmFibGUgZmluaXNoaW5nIGZsYWcgb24gcHJpdmF0ZSBkYXRhXG5cdFx0XHRkYXRhLmZpbmlzaCA9IHRydWU7XG5cblx0XHRcdC8vIEVtcHR5IHRoZSBxdWV1ZSBmaXJzdFxuXHRcdFx0alF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBbXSApO1xuXG5cdFx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnN0b3AgKSB7XG5cdFx0XHRcdGhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7XG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFuaW1hdGlvbnMgaW4gdGhlIG9sZCBxdWV1ZSBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdGlmICggcXVldWVbIGluZGV4IF0gJiYgcXVldWVbIGluZGV4IF0uZmluaXNoICkge1xuXHRcdFx0XHRcdHF1ZXVlWyBpbmRleCBdLmZpbmlzaC5jYWxsKCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVHVybiBvZmYgZmluaXNoaW5nIGZsYWdcblx0XHRcdGRlbGV0ZSBkYXRhLmZpbmlzaDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJ0b2dnbGVcIiwgXCJzaG93XCIsIFwiaGlkZVwiIF0sIGZ1bmN0aW9uKCBfaSwgbmFtZSApIHtcblx0dmFyIGNzc0ZuID0galF1ZXJ5LmZuWyBuYW1lIF07XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gXCJib29sZWFuXCIgP1xuXHRcdFx0Y3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDpcblx0XHRcdHRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxuLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9uc1xualF1ZXJ5LmVhY2goIHtcblx0c2xpZGVEb3duOiBnZW5GeCggXCJzaG93XCIgKSxcblx0c2xpZGVVcDogZ2VuRngoIFwiaGlkZVwiICksXG5cdHNsaWRlVG9nZ2xlOiBnZW5GeCggXCJ0b2dnbGVcIiApLFxuXHRmYWRlSW46IHsgb3BhY2l0eTogXCJzaG93XCIgfSxcblx0ZmFkZU91dDogeyBvcGFjaXR5OiBcImhpZGVcIiB9LFxuXHRmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6IFwidG9nZ2xlXCIgfVxufSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LnRpbWVycyA9IFtdO1xualF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHtcblx0dmFyIHRpbWVyLFxuXHRcdGkgPSAwLFxuXHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnM7XG5cblx0ZnhOb3cgPSBEYXRlLm5vdygpO1xuXG5cdGZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHtcblx0XHR0aW1lciA9IHRpbWVyc1sgaSBdO1xuXG5cdFx0Ly8gUnVuIHRoZSB0aW1lciBhbmQgc2FmZWx5IHJlbW92ZSBpdCB3aGVuIGRvbmUgKGFsbG93aW5nIGZvciBleHRlcm5hbCByZW1vdmFsKVxuXHRcdGlmICggIXRpbWVyKCkgJiYgdGltZXJzWyBpIF0gPT09IHRpbWVyICkge1xuXHRcdFx0dGltZXJzLnNwbGljZSggaS0tLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCAhdGltZXJzLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZnguc3RvcCgpO1xuXHR9XG5cdGZ4Tm93ID0gdW5kZWZpbmVkO1xufTtcblxualF1ZXJ5LmZ4LnRpbWVyID0gZnVuY3Rpb24oIHRpbWVyICkge1xuXHRqUXVlcnkudGltZXJzLnB1c2goIHRpbWVyICk7XG5cdGpRdWVyeS5meC5zdGFydCgpO1xufTtcblxualF1ZXJ5LmZ4LmludGVydmFsID0gMTM7XG5qUXVlcnkuZnguc3RhcnQgPSBmdW5jdGlvbigpIHtcblx0aWYgKCBpblByb2dyZXNzICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGluUHJvZ3Jlc3MgPSB0cnVlO1xuXHRzY2hlZHVsZSgpO1xufTtcblxualF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHtcblx0aW5Qcm9ncmVzcyA9IG51bGw7XG59O1xuXG5qUXVlcnkuZnguc3BlZWRzID0ge1xuXHRzbG93OiA2MDAsXG5cdGZhc3Q6IDIwMCxcblxuXHQvLyBEZWZhdWx0IHNwZWVkXG5cdF9kZWZhdWx0OiA0MDBcbn07XG5cblxuLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLlxualF1ZXJ5LmZuLmRlbGF5ID0gZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7XG5cdHRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzWyB0aW1lIF0gfHwgdGltZSA6IHRpbWU7XG5cdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkge1xuXHRcdHZhciB0aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoIG5leHQsIHRpbWUgKTtcblx0XHRob29rcy5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cdFx0fTtcblx0fSApO1xufTtcblxuXG4oIGZ1bmN0aW9uKCkge1xuXHR2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKSxcblx0XHRzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcInNlbGVjdFwiICksXG5cdFx0b3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcIm9wdGlvblwiICkgKTtcblxuXHRpbnB1dC50eXBlID0gXCJjaGVja2JveFwiO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjMgb25seVxuXHQvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSBcIm9uXCJcblx0c3VwcG9ydC5jaGVja09uID0gaW5wdXQudmFsdWUgIT09IFwiXCI7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIE11c3QgYWNjZXNzIHNlbGVjdGVkSW5kZXggdG8gbWFrZSBkZWZhdWx0IG9wdGlvbnMgc2VsZWN0XG5cdHN1cHBvcnQub3B0U2VsZWN0ZWQgPSBvcHQuc2VsZWN0ZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvXG5cdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdGlucHV0LnZhbHVlID0gXCJ0XCI7XG5cdGlucHV0LnR5cGUgPSBcInJhZGlvXCI7XG5cdHN1cHBvcnQucmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSBcInRcIjtcbn0gKSgpO1xuXG5cbnZhciBib29sSG9vayxcblx0YXR0ckhhbmRsZSA9IGpRdWVyeS5leHByLmF0dHJIYW5kbGU7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5hdHRyLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0YXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRmFsbGJhY2sgdG8gcHJvcCB3aGVuIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcblx0XHRpZiAoIHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSA9PT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdHJldHVybiBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSwgdmFsdWUgKTtcblx0XHR9XG5cblx0XHQvLyBBdHRyaWJ1dGUgaG9va3MgYXJlIGRldGVybWluZWQgYnkgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uXG5cdFx0Ly8gR3JhYiBuZWNlc3NhcnkgaG9vayBpZiBvbmUgaXMgZGVmaW5lZFxuXHRcdGlmICggblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXHRcdFx0aG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHQoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiB1bmRlZmluZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHZhbHVlID09PSBudWxsICkge1xuXHRcdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSArIFwiXCIgKTtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKCByZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSApICE9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cblx0XHRyZXQgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHQvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZFxuXHRcdHJldHVybiByZXQgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDtcblx0fSxcblxuXHRhdHRySG9va3M6IHtcblx0XHR0eXBlOiB7XG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhc3VwcG9ydC5yYWRpb1ZhbHVlICYmIHZhbHVlID09PSBcInJhZGlvXCIgJiZcblx0XHRcdFx0XHRub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dmFyIHZhbCA9IGVsZW0udmFsdWU7XG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCB2YWx1ZSApO1xuXHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0ZWxlbS52YWx1ZSA9IHZhbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHR2YXIgbmFtZSxcblx0XHRcdGkgPSAwLFxuXG5cdFx0XHQvLyBBdHRyaWJ1dGUgbmFtZXMgY2FuIGNvbnRhaW4gbm9uLUhUTUwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzXG5cdFx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNhdHRyaWJ1dGVzLTJcblx0XHRcdGF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cblx0XHRpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0d2hpbGUgKCAoIG5hbWUgPSBhdHRyTmFtZXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhvb2tzIGZvciBib29sZWFuIGF0dHJpYnV0ZXNcbmJvb2xIb29rID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHtcblx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZVxuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cbn07XG5cbmpRdWVyeS5lYWNoKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCggL1xcdysvZyApLCBmdW5jdGlvbiggX2ksIG5hbWUgKSB7XG5cdHZhciBnZXR0ZXIgPSBhdHRySGFuZGxlWyBuYW1lIF0gfHwgalF1ZXJ5LmZpbmQuYXR0cjtcblxuXHRhdHRySGFuZGxlWyBuYW1lIF0gPSBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0dmFyIHJldCwgaGFuZGxlLFxuXHRcdFx0bG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdGlmICggIWlzWE1MICkge1xuXG5cdFx0XHQvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyXG5cdFx0XHRoYW5kbGUgPSBhdHRySGFuZGxlWyBsb3dlcmNhc2VOYW1lIF07XG5cdFx0XHRhdHRySGFuZGxlWyBsb3dlcmNhc2VOYW1lIF0gPSByZXQ7XG5cdFx0XHRyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/XG5cdFx0XHRcdGxvd2VyY2FzZU5hbWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gaGFuZGxlO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xufSApO1xuXG5cblxuXG52YXIgcmZvY3VzYWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGRlbGV0ZSB0aGlzWyBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWUgXTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IHByb3BlcnRpZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rc1xuXHRcdFx0bmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcblx0XHRcdGhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVsZW1bIG5hbWUgXTtcblx0fSxcblxuXHRwcm9wSG9va3M6IHtcblx0XHR0YWJJbmRleDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdFx0XHRcdC8vIGVsZW0udGFiSW5kZXggZG9lc24ndCBhbHdheXMgcmV0dXJuIHRoZVxuXHRcdFx0XHQvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXRcblx0XHRcdFx0Ly8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsICh0cmFjLTEyMDcyKVxuXHRcdFx0XHR2YXIgdGFiaW5kZXggPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInRhYmluZGV4XCIgKTtcblxuXHRcdFx0XHRpZiAoIHRhYmluZGV4ICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHxcblx0XHRcdFx0XHRyY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJlxuXHRcdFx0XHRcdGVsZW0uaHJlZlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cHJvcEZpeDoge1xuXHRcdFwiZm9yXCI6IFwiaHRtbEZvclwiLFxuXHRcdFwiY2xhc3NcIjogXCJjbGFzc05hbWVcIlxuXHR9XG59ICk7XG5cbi8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuLy8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5XG4vLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkXG4vLyBvbiB0aGUgb3B0aW9uXG4vLyBUaGUgZ2V0dGVyIGVuc3VyZXMgYSBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZFxuLy8gd2hlbiBpbiBhbiBvcHRncm91cFxuLy8gZXNsaW50IHJ1bGUgXCJuby11bnVzZWQtZXhwcmVzc2lvbnNcIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlXG4vLyBzaW5jZSBpdCBjb25zaWRlcnMgc3VjaCBhY2Nlc3Npb25zIG5vb3BcbmlmICggIXN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7XG5cdGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0LyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogXCJvZmZcIiAqL1xuXG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgJiYgcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0XHRpZiAoIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSApO1xuXG5cblxuXG5cdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byBIVE1MIHNwZWNcblx0Ly8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlXG5cdGZ1bmN0aW9uIHN0cmlwQW5kQ29sbGFwc2UoIHZhbHVlICkge1xuXHRcdHZhciB0b2tlbnMgPSB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXHRcdHJldHVybiB0b2tlbnMuam9pbiggXCIgXCIgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkge1xuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHtcblx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblx0fVxuXHRyZXR1cm4gW107XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NOYW1lcywgY3VyLCBjdXJWYWx1ZSwgY2xhc3NOYW1lLCBpLCBmaW5hbFZhbHVlO1xuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRjbGFzc05hbWVzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIGNsYXNzTmFtZXMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGN1clZhbHVlID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0Y3VyID0gdGhpcy5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGFzc05hbWUgKyBcIiBcIiApIDwgMCApIHtcblx0XHRcdFx0XHRcdFx0Y3VyICs9IGNsYXNzTmFtZSArIFwiIFwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuXG5cdFx0XHRcdFx0ZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NOYW1lcywgY3VyLCBjdXJWYWx1ZSwgY2xhc3NOYW1lLCBpLCBmaW5hbFZhbHVlO1xuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYXR0ciggXCJjbGFzc1wiLCBcIlwiICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NOYW1lcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCBjbGFzc05hbWVzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCB0aGlzICk7XG5cblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gdGhpcy5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzXG5cdFx0XHRcdFx0XHR3aGlsZSAoIGN1ci5pbmRleE9mKCBcIiBcIiArIGNsYXNzTmFtZSArIFwiIFwiICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhc3NOYW1lICsgXCIgXCIsIFwiIFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gT25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0gc3RyaXBBbmRDb2xsYXBzZSggY3VyICk7XG5cdFx0XHRcdFx0aWYgKCBjdXJWYWx1ZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsIGZpbmFsVmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHtcblx0XHR2YXIgY2xhc3NOYW1lcywgY2xhc3NOYW1lLCBpLCBzZWxmLFxuXHRcdFx0dHlwZSA9IHR5cGVvZiB2YWx1ZSxcblx0XHRcdGlzVmFsaWRWYWx1ZSA9IHR5cGUgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheSggdmFsdWUgKTtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyhcblx0XHRcdFx0XHR2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLFxuXHRcdFx0XHRcdHN0YXRlVmFsXG5cdFx0XHRcdCk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09IFwiYm9vbGVhblwiICYmIGlzVmFsaWRWYWx1ZSApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBpc1ZhbGlkVmFsdWUgKSB7XG5cblx0XHRcdFx0Ly8gVG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXNcblx0XHRcdFx0c2VsZiA9IGpRdWVyeSggdGhpcyApO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0XHRjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpIF07XG5cblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0Y2xhc3NOYW1lID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0aWYgKCBjbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdGlmICggdGhpcy5zZXRBdHRyaWJ1dGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIixcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0XHRcdFx0XHRcIlwiIDpcblx0XHRcdFx0XHRcdFx0ZGF0YVByaXYuZ2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiApIHx8IFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZSwgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Y2xhc3NOYW1lID0gXCIgXCIgKyBzZWxlY3RvciArIFwiIFwiO1xuXHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHQoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggZ2V0Q2xhc3MoIGVsZW0gKSApICsgXCIgXCIgKS5pbmRleE9mKCBjbGFzc05hbWUgKSA+IC0xICkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn0gKTtcblxuXG5cblxudmFyIHJyZXR1cm4gPSAvXFxyL2c7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0dmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGhvb2tzLCByZXQsIHZhbHVlSXNGdW5jdGlvbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF07XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF0gfHxcblx0XHRcdFx0XHRqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHRcdGlmICggaG9va3MgJiZcblx0XHRcdFx0XHRcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIFwidmFsdWVcIiApICkgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0ID0gZWxlbS52YWx1ZTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzXG5cdFx0XHRcdGlmICggdHlwZW9mIHJldCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0LnJlcGxhY2UoIHJyZXR1cm4sIFwiXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEhhbmRsZSBjYXNlcyB3aGVyZSB2YWx1ZSBpcyBudWxsL3VuZGVmIG9yIG51bWJlclxuXHRcdFx0XHRyZXR1cm4gcmV0ID09IG51bGwgPyBcIlwiIDogcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0dmFyIHZhbDtcblxuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHR2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFsID0gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzIFwiXCI7IGNvbnZlcnQgbnVtYmVycyB0byBzdHJpbmdcblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHZhbCA9IFwiXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdHZhbCArPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCB2YWwgKSApIHtcblx0XHRcdFx0dmFsID0galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiO1xuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cblx0XHRcdGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyB0aGlzLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHQvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZ1xuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCBcInZhbHVlXCIgKSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHR0aGlzLnZhbHVlID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHZhbEhvb2tzOiB7XG5cdFx0b3B0aW9uOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHRcdHZhciB2YWwgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInZhbHVlXCIgKTtcblx0XHRcdFx0cmV0dXJuIHZhbCAhPSBudWxsID9cblx0XHRcdFx0XHR2YWwgOlxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMCAtIDExIG9ubHlcblx0XHRcdFx0XHQvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAodHJhYy0xNDY4NiwgdHJhYy0xNDg1OClcblx0XHRcdFx0XHQvLyBTdHJpcCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZVxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS13aGl0ZXNwYWNlXG5cdFx0XHRcdFx0c3RyaXBBbmRDb2xsYXBzZSggalF1ZXJ5LnRleHQoIGVsZW0gKSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0c2VsZWN0OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgdmFsdWUsIG9wdGlvbiwgaSxcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LFxuXHRcdFx0XHRcdG9uZSA9IGVsZW0udHlwZSA9PT0gXCJzZWxlY3Qtb25lXCIsXG5cdFx0XHRcdFx0dmFsdWVzID0gb25lID8gbnVsbCA6IFtdLFxuXHRcdFx0XHRcdG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoO1xuXG5cdFx0XHRcdGlmICggaW5kZXggPCAwICkge1xuXHRcdFx0XHRcdGkgPSBtYXg7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpID0gb25lID8gaW5kZXggOiAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuXHRcdFx0XHRmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHRcdFx0XHRcdC8vIElFOC05IGRvZXNuJ3QgdXBkYXRlIHNlbGVjdGVkIGFmdGVyIGZvcm0gcmVzZXQgKHRyYWMtMjU1MSlcblx0XHRcdFx0XHRpZiAoICggb3B0aW9uLnNlbGVjdGVkIHx8IGkgPT09IGluZGV4ICkgJiZcblxuXHRcdFx0XHRcdFx0XHQvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHRcdFx0XHRcdCFvcHRpb24uZGlzYWJsZWQgJiZcblx0XHRcdFx0XHRcdFx0KCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHxcblx0XHRcdFx0XHRcdFx0XHQhbm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCBcIm9wdGdyb3VwXCIgKSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBHZXQgdGhlIHNwZWNpZmljIHZhbHVlIGZvciB0aGUgb3B0aW9uXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7XG5cblx0XHRcdFx0XHRcdC8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzXG5cdFx0XHRcdFx0XHRpZiAoIG9uZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheVxuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgb3B0aW9uU2V0LCBvcHRpb24sXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcblx0XHRcdFx0XHR2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLFxuXHRcdFx0XHRcdGkgPSBvcHRpb25zLmxlbmd0aDtcblxuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXG5cdFx0XHRcdFx0aWYgKCBvcHRpb24uc2VsZWN0ZWQgPVxuXHRcdFx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29rcy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPiAtMVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b3B0aW9uU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbmQtYXNzaWduICovXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGb3JjZSBicm93c2VycyB0byBiZWhhdmUgY29uc2lzdGVudGx5IHdoZW4gbm9uLW1hdGNoaW5nIHZhbHVlIGlzIHNldFxuXHRcdFx0XHRpZiAoICFvcHRpb25TZXQgKSB7XG5cdFx0XHRcdFx0ZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIGdldHRlci9zZXR0ZXJcbmpRdWVyeS5lYWNoKCBbIFwicmFkaW9cIiwgXCJjaGVja2JveFwiIF0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHtcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeSggZWxlbSApLnZhbCgpLCB2YWx1ZSApID4gLTEgKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmICggIXN1cHBvcnQuY2hlY2tPbiApIHtcblx0XHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXS5nZXQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IG51bGwgPyBcIm9uXCIgOiBlbGVtLnZhbHVlO1xuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gUmV0dXJuIGpRdWVyeSBmb3IgYXR0cmlidXRlcy1vbmx5IGluY2x1c2lvblxudmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuXG52YXIgbm9uY2UgPSB7IGd1aWQ6IERhdGUubm93KCkgfTtcblxudmFyIHJxdWVyeSA9ICggL1xcPy8gKTtcblxuXG5cbi8vIENyb3NzLWJyb3dzZXIgeG1sIHBhcnNpbmdcbmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkge1xuXHR2YXIgeG1sLCBwYXJzZXJFcnJvckVsZW07XG5cdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seVxuXHQvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC5cblx0dHJ5IHtcblx0XHR4bWwgPSAoIG5ldyB3aW5kb3cuRE9NUGFyc2VyKCkgKS5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIFwidGV4dC94bWxcIiApO1xuXHR9IGNhdGNoICggZSApIHt9XG5cblx0cGFyc2VyRXJyb3JFbGVtID0geG1sICYmIHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJwYXJzZXJlcnJvclwiIClbIDAgXTtcblx0aWYgKCAheG1sIHx8IHBhcnNlckVycm9yRWxlbSApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgKFxuXHRcdFx0cGFyc2VyRXJyb3JFbGVtID9cblx0XHRcdFx0alF1ZXJ5Lm1hcCggcGFyc2VyRXJyb3JFbGVtLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWwudGV4dENvbnRlbnQ7XG5cdFx0XHRcdH0gKS5qb2luKCBcIlxcblwiICkgOlxuXHRcdFx0XHRkYXRhXG5cdFx0KSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhciByZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxcblx0c3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiggZSApIHtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9O1xuXG5qUXVlcnkuZXh0ZW5kKCBqUXVlcnkuZXZlbnQsIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyApIHtcblxuXHRcdHZhciBpLCBjdXIsIHRtcCwgYnViYmxlVHlwZSwgb250eXBlLCBoYW5kbGUsIHNwZWNpYWwsIGxhc3RFbGVtZW50LFxuXHRcdFx0ZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sXG5cdFx0XHR0eXBlID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcInR5cGVcIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LFxuXHRcdFx0bmFtZXNwYWNlcyA9IGhhc093bi5jYWxsKCBldmVudCwgXCJuYW1lc3BhY2VcIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCBcIi5cIiApIDogW107XG5cblx0XHRjdXIgPSBsYXN0RWxlbWVudCA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50O1xuXG5cdFx0Ly8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3dcblx0XHRpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlLmluZGV4T2YoIFwiLlwiICkgPiAtMSApIHtcblxuXHRcdFx0Ly8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKVxuXHRcdFx0bmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIFwiLlwiICk7XG5cdFx0XHR0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpO1xuXHRcdFx0bmFtZXNwYWNlcy5zb3J0KCk7XG5cdFx0fVxuXHRcdG9udHlwZSA9IHR5cGUuaW5kZXhPZiggXCI6XCIgKSA8IDAgJiYgXCJvblwiICsgdHlwZTtcblxuXHRcdC8vIENhbGxlciBjYW4gcGFzcyBpbiBhIGpRdWVyeS5FdmVudCBvYmplY3QsIE9iamVjdCwgb3IganVzdCBhbiBldmVudCB0eXBlIHN0cmluZ1xuXHRcdGV2ZW50ID0gZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gP1xuXHRcdFx0ZXZlbnQgOlxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSBcIm9iamVjdFwiICYmIGV2ZW50ICk7XG5cblx0XHQvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpXG5cdFx0ZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7XG5cdFx0ZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCBcIi5cIiApO1xuXHRcdGV2ZW50LnJuYW1lc3BhY2UgPSBldmVudC5uYW1lc3BhY2UgP1xuXHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICkgOlxuXHRcdFx0bnVsbDtcblxuXHRcdC8vIENsZWFuIHVwIHRoZSBldmVudCBpbiBjYXNlIGl0IGlzIGJlaW5nIHJldXNlZFxuXHRcdGV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDtcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBlbGVtO1xuXHRcdH1cblxuXHRcdC8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3Rcblx0XHRkYXRhID0gZGF0YSA9PSBudWxsID9cblx0XHRcdFsgZXZlbnQgXSA6XG5cdFx0XHRqUXVlcnkubWFrZUFycmF5KCBkYXRhLCBbIGV2ZW50IF0gKTtcblxuXHRcdC8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXNcblx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgZXZlbnQgcHJvcGFnYXRpb24gcGF0aCBpbiBhZHZhbmNlLCBwZXIgVzNDIGV2ZW50cyBzcGVjICh0cmFjLTk5NTEpXG5cdFx0Ly8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICh0cmFjLTk3MjQpXG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFpc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTtcblx0XHRcdGlmICggIXJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7XG5cdFx0XHRcdGN1ciA9IGN1ci5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yICggOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggY3VyICk7XG5cdFx0XHRcdHRtcCA9IGN1cjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pXG5cdFx0XHRpZiAoIHRtcCA9PT0gKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQgKSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGhcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggY3VyID0gZXZlbnRQYXRoWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0bGFzdEVsZW1lbnQgPSBjdXI7XG5cdFx0XHRldmVudC50eXBlID0gaSA+IDEgP1xuXHRcdFx0XHRidWJibGVUeXBlIDpcblx0XHRcdFx0c3BlY2lhbC5iaW5kVHlwZSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBqUXVlcnkgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gKCBkYXRhUHJpdi5nZXQoIGN1ciwgXCJldmVudHNcIiApIHx8IE9iamVjdC5jcmVhdGUoIG51bGwgKSApWyBldmVudC50eXBlIF0gJiZcblx0XHRcdFx0ZGF0YVByaXYuZ2V0KCBjdXIsIFwiaGFuZGxlXCIgKTtcblx0XHRcdGlmICggaGFuZGxlICkge1xuXHRcdFx0XHRoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBOYXRpdmUgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gb250eXBlICYmIGN1clsgb250eXBlIF07XG5cdFx0XHRpZiAoIGhhbmRsZSAmJiBoYW5kbGUuYXBwbHkgJiYgYWNjZXB0RGF0YSggY3VyICkgKSB7XG5cdFx0XHRcdGV2ZW50LnJlc3VsdCA9IGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGV2ZW50LnR5cGUgPSB0eXBlO1xuXG5cdFx0Ly8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vd1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7XG5cblx0XHRcdGlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fFxuXHRcdFx0XHRzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBldmVudFBhdGgucG9wKCksIGRhdGEgKSA9PT0gZmFsc2UgKSAmJlxuXHRcdFx0XHRhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cblx0XHRcdFx0Ly8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBldmVudC5cblx0XHRcdFx0Ly8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKHRyYWMtNjE3MClcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXG5cdFx0XHRcdFx0aWYgKCBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0XHRcdFx0bGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtWyB0eXBlIF0oKTtcblxuXHRcdFx0XHRcdGlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmVcblx0Ly8gVXNlZCBvbmx5IGZvciBgZm9jdXMoaW4gfCBvdXQpYCBldmVudHNcblx0c2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVtLCBldmVudCApIHtcblx0XHR2YXIgZSA9IGpRdWVyeS5leHRlbmQoXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCksXG5cdFx0XHRldmVudCxcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0aXNTaW11bGF0ZWQ6IHRydWVcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblx0fVxuXG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSApO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxudmFyXG5cdHJicmFja2V0ID0gL1xcW1xcXSQvLFxuXHRyQ1JMRiA9IC9cXHI/XFxuL2csXG5cdHJzdWJtaXR0ZXJUeXBlcyA9IC9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxcblx0cnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO1xuXG5mdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7XG5cdHZhciBuYW1lO1xuXG5cdGlmICggQXJyYXkuaXNBcnJheSggb2JqICkgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS5cblx0XHRqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHtcblx0XHRcdGlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7XG5cblx0XHRcdFx0Ly8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLlxuXHRcdFx0XHRhZGQoIHByZWZpeCwgdiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEl0ZW0gaXMgbm9uLXNjYWxhciAoYXJyYXkgb3Igb2JqZWN0KSwgZW5jb2RlIGl0cyBudW1lcmljIGluZGV4LlxuXHRcdFx0XHRidWlsZFBhcmFtcyhcblx0XHRcdFx0XHRwcmVmaXggKyBcIltcIiArICggdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPSBudWxsID8gaSA6IFwiXCIgKSArIFwiXVwiLFxuXHRcdFx0XHRcdHYsXG5cdFx0XHRcdFx0dHJhZGl0aW9uYWwsXG5cdFx0XHRcdFx0YWRkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiB0b1R5cGUoIG9iaiApID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIG9iamVjdCBpdGVtLlxuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCArIFwiW1wiICsgbmFtZSArIFwiXVwiLCBvYmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHNjYWxhciBpdGVtLlxuXHRcdGFkZCggcHJlZml4LCBvYmogKTtcblx0fVxufVxuXG4vLyBTZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZlxuLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nXG5qUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7XG5cdHZhciBwcmVmaXgsXG5cdFx0cyA9IFtdLFxuXHRcdGFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlT3JGdW5jdGlvbiApIHtcblxuXHRcdFx0Ly8gSWYgdmFsdWUgaXMgYSBmdW5jdGlvbiwgaW52b2tlIGl0IGFuZCB1c2UgaXRzIHJldHVybiB2YWx1ZVxuXHRcdFx0dmFyIHZhbHVlID0gaXNGdW5jdGlvbiggdmFsdWVPckZ1bmN0aW9uICkgP1xuXHRcdFx0XHR2YWx1ZU9yRnVuY3Rpb24oKSA6XG5cdFx0XHRcdHZhbHVlT3JGdW5jdGlvbjtcblxuXHRcdFx0c1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyBcIj1cIiArXG5cdFx0XHRcdGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSApO1xuXHRcdH07XG5cblx0aWYgKCBhID09IG51bGwgKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHQvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLlxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxlbWVudHNcblx0XHRqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApO1xuXHRcdH0gKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgXCJvbGRcIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXJcblx0XHQvLyBkaWQgaXQpLCBvdGhlcndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS5cblx0XHRmb3IgKCBwcmVmaXggaW4gYSApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvblxuXHRyZXR1cm4gcy5qb2luKCBcIiZcIiApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzZXJpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApO1xuXHR9LFxuXHRzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gQ2FuIGFkZCBwcm9wSG9vayBmb3IgXCJlbGVtZW50c1wiIHRvIGZpbHRlciBvciBhZGQgZm9ybSBlbGVtZW50c1xuXHRcdFx0dmFyIGVsZW1lbnRzID0galF1ZXJ5LnByb3AoIHRoaXMsIFwiZWxlbWVudHNcIiApO1xuXHRcdFx0cmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMgKSA6IHRoaXM7XG5cdFx0fSApLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdFx0Ly8gVXNlIC5pcyggXCI6ZGlzYWJsZWRcIiApIHNvIHRoYXQgZmllbGRzZXRbZGlzYWJsZWRdIHdvcmtzXG5cdFx0XHRyZXR1cm4gdGhpcy5uYW1lICYmICFqUXVlcnkoIHRoaXMgKS5pcyggXCI6ZGlzYWJsZWRcIiApICYmXG5cdFx0XHRcdHJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiZcblx0XHRcdFx0KCB0aGlzLmNoZWNrZWQgfHwgIXJjaGVja2FibGVUeXBlLnRlc3QoIHR5cGUgKSApO1xuXHRcdH0gKS5tYXAoIGZ1bmN0aW9uKCBfaSwgZWxlbSApIHtcblx0XHRcdHZhciB2YWwgPSBqUXVlcnkoIHRoaXMgKS52YWwoKTtcblxuXHRcdFx0aWYgKCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHJldHVybiBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdH0gKS5nZXQoKTtcblx0fVxufSApO1xuXG5cbnZhclxuXHRyMjAgPSAvJTIwL2csXG5cdHJoYXNoID0gLyMuKiQvLFxuXHRyYW50aUNhY2hlID0gLyhbPyZdKV89W14mXSovLFxuXHRyaGVhZGVycyA9IC9eKC4qPyk6WyBcXHRdKihbXlxcclxcbl0qKSQvbWcsXG5cblx0Ly8gdHJhYy03NjUzLCB0cmFjLTgxMjUsIHRyYWMtODE1MjogbG9jYWwgcHJvdG9jb2wgZGV0ZWN0aW9uXG5cdHJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sXG5cdHJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLFxuXHRycHJvdG9jb2wgPSAvXlxcL1xcLy8sXG5cblx0LyogUHJlZmlsdGVyc1xuXHQgKiAxKSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKVxuXHQgKiAyKSBUaGVzZSBhcmUgY2FsbGVkOlxuXHQgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0XG5cdCAqICAgIC0gQUZURVIgcGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEgaXMgdHJ1ZSlcblx0ICogMykga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDUpIGV4ZWN1dGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGNvbnRpbnVlIGRvd24gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHRwcmVmaWx0ZXJzID0ge30sXG5cblx0LyogVHJhbnNwb3J0cyBiaW5kaW5nc1xuXHQgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlXG5cdCAqIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcblx0ICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHR0cmFuc3BvcnRzID0ge30sXG5cblx0Ly8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAodHJhYy0xMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cbm9yaWdpbkFuY2hvci5ocmVmID0gbG9jYXRpb24uaHJlZjtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblxuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbIDAgXSA9PT0gXCIrXCIgKSB7XG5cdFx0XHRcdFx0ZGF0YVR5cGUgPSBkYXRhVHlwZS5zbGljZSggMSApIHx8IFwiKlwiO1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXG5cdFx0XHRcdG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0aW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkge1xuXHRcdFx0XHRyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyB0cmFjLTk4ODdcbmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkge1xuXHR2YXIga2V5LCBkZWVwLFxuXHRcdGZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTtcblxuXHRmb3IgKCBrZXkgaW4gc3JjICkge1xuXHRcdGlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0KCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKCBkZWVwID0ge30gKSApIClbIGtleSBdID0gc3JjWyBrZXkgXTtcblx0XHR9XG5cdH1cblx0aWYgKCBkZWVwICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApO1xuXHR9XG5cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OlxuICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSlcbiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuICovXG5mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkge1xuXG5cdHZhciBjdCwgdHlwZSwgZmluYWxEYXRhVHlwZSwgZmlyc3REYXRhVHlwZSxcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7XG5cblx0Ly8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3Ncblx0d2hpbGUgKCBkYXRhVHlwZXNbIDAgXSA9PT0gXCIqXCIgKSB7XG5cdFx0ZGF0YVR5cGVzLnNoaWZ0KCk7XG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0Y3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBlXG5cdGlmICggY3QgKSB7XG5cdFx0Zm9yICggdHlwZSBpbiBjb250ZW50cyApIHtcblx0XHRcdGlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7XG5cdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0eXBlICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZVxuXHRpZiAoIGRhdGFUeXBlc1sgMCBdIGluIHJlc3BvbnNlcyApIHtcblx0XHRmaW5hbERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXG5cdFx0Zm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7XG5cdFx0XHRpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyBcIiBcIiArIGRhdGFUeXBlc1sgMCBdIF0gKSB7XG5cdFx0XHRcdGZpbmFsRGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggIWZpcnN0RGF0YVR5cGUgKSB7XG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZVxuXHRcdGZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7XG5cdH1cblxuXHQvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlXG5cdC8vIFdlIGFkZCB0aGUgZGF0YVR5cGUgdG8gdGhlIGxpc3QgaWYgbmVlZGVkXG5cdC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2Vcblx0aWYgKCBmaW5hbERhdGFUeXBlICkge1xuXHRcdGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7XG5cdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07XG5cdH1cbn1cblxuLyogQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZVxuICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApIHtcblx0dmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0bXAsIHByZXYsXG5cdFx0Y29udmVydGVycyA9IHt9LFxuXG5cdFx0Ly8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvblxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7XG5cblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXG5cdGlmICggZGF0YVR5cGVzWyAxIF0gKSB7XG5cdFx0Zm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7XG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xuXHRcdH1cblx0fVxuXG5cdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHQvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZVxuXHR3aGlsZSAoIGN1cnJlbnQgKSB7XG5cblx0XHRpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHtcblx0XHRcdGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gXSA9IHJlc3BvbnNlO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkXG5cdFx0aWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkge1xuXHRcdFx0cmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7XG5cdFx0fVxuXG5cdFx0cHJldiA9IGN1cnJlbnQ7XG5cdFx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdFx0aWYgKCBjdXJyZW50ICkge1xuXG5cdFx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXG5cdFx0XHRpZiAoIGN1cnJlbnQgPT09IFwiKlwiICkge1xuXG5cdFx0XHRcdGN1cnJlbnQgPSBwcmV2O1xuXG5cdFx0XHQvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJyZW50XG5cdFx0XHR9IGVsc2UgaWYgKCBwcmV2ICE9PSBcIipcIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXG5cdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgXCIqIFwiICsgY3VycmVudCBdO1xuXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXG5cdFx0XHRcdGlmICggIWNvbnYgKSB7XG5cdFx0XHRcdFx0Zm9yICggY29udjIgaW4gY29udmVydGVycyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgY29udjIgb3V0cHV0cyBjdXJyZW50XG5cdFx0XHRcdFx0XHR0bXAgPSBjb252Mi5zcGxpdCggXCIgXCIgKTtcblx0XHRcdFx0XHRcdGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0XG5cdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyB0bXBbIDAgXSBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcblx0XHRcdFx0XHRcdFx0aWYgKCBjb252ICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVyc1xuXHRcdFx0XHRcdFx0XHRcdGlmICggY29udiA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIGludGVybWVkaWF0ZSBkYXRhVHlwZVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnZlcnRlcnNbIGNvbnYyIF0gIT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50ID0gdG1wWyAwIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdG1wWyAxIF0gKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSlcblx0XHRcdFx0aWYgKCBjb252ICE9PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0Ly8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbVxuXHRcdFx0XHRcdGlmICggY29udiAmJiBzLnRocm93cyApIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGU6IFwicGFyc2VyZXJyb3JcIixcblx0XHRcdFx0XHRcdFx0XHRlcnJvcjogY29udiA/IGUgOiBcIk5vIGNvbnZlcnNpb24gZnJvbSBcIiArIHByZXYgKyBcIiB0byBcIiArIGN1cnJlbnRcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4geyBzdGF0ZTogXCJzdWNjZXNzXCIsIGRhdGE6IHJlc3BvbnNlIH07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXNcblx0YWN0aXZlOiAwLFxuXG5cdC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3Rcblx0bGFzdE1vZGlmaWVkOiB7fSxcblx0ZXRhZzoge30sXG5cblx0YWpheFNldHRpbmdzOiB7XG5cdFx0dXJsOiBsb2NhdGlvbi5ocmVmLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0aXNMb2NhbDogcmxvY2FsUHJvdG9jb2wudGVzdCggbG9jYXRpb24ucHJvdG9jb2wgKSxcblx0XHRnbG9iYWw6IHRydWUsXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXG5cdFx0YXN5bmM6IHRydWUsXG5cdFx0Y29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIsXG5cblx0XHQvKlxuXHRcdHRpbWVvdXQ6IDAsXG5cdFx0ZGF0YTogbnVsbCxcblx0XHRkYXRhVHlwZTogbnVsbCxcblx0XHR1c2VybmFtZTogbnVsbCxcblx0XHRwYXNzd29yZDogbnVsbCxcblx0XHRjYWNoZTogbnVsbCxcblx0XHR0aHJvd3M6IGZhbHNlLFxuXHRcdHRyYWRpdGlvbmFsOiBmYWxzZSxcblx0XHRoZWFkZXJzOiB7fSxcblx0XHQqL1xuXG5cdFx0YWNjZXB0czoge1xuXHRcdFx0XCIqXCI6IGFsbFR5cGVzLFxuXHRcdFx0dGV4dDogXCJ0ZXh0L3BsYWluXCIsXG5cdFx0XHRodG1sOiBcInRleHQvaHRtbFwiLFxuXHRcdFx0eG1sOiBcImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWxcIixcblx0XHRcdGpzb246IFwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0XCJcblx0XHR9LFxuXG5cdFx0Y29udGVudHM6IHtcblx0XHRcdHhtbDogL1xcYnhtbFxcYi8sXG5cdFx0XHRodG1sOiAvXFxiaHRtbC8sXG5cdFx0XHRqc29uOiAvXFxianNvblxcYi9cblx0XHR9LFxuXG5cdFx0cmVzcG9uc2VGaWVsZHM6IHtcblx0XHRcdHhtbDogXCJyZXNwb25zZVhNTFwiLFxuXHRcdFx0dGV4dDogXCJyZXNwb25zZVRleHRcIixcblx0XHRcdGpzb246IFwicmVzcG9uc2VKU09OXCJcblx0XHR9LFxuXG5cdFx0Ly8gRGF0YSBjb252ZXJ0ZXJzXG5cdFx0Ly8gS2V5cyBzZXBhcmF0ZSBzb3VyY2UgKG9yIGNhdGNoYWxsIFwiKlwiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuXHRcdGNvbnZlcnRlcnM6IHtcblxuXHRcdFx0Ly8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0XG5cdFx0XHRcIiogdGV4dFwiOiBTdHJpbmcsXG5cblx0XHRcdC8vIFRleHQgdG8gaHRtbCAodHJ1ZSA9IG5vIHRyYW5zZm9ybWF0aW9uKVxuXHRcdFx0XCJ0ZXh0IGh0bWxcIjogdHJ1ZSxcblxuXHRcdFx0Ly8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvblxuXHRcdFx0XCJ0ZXh0IGpzb25cIjogSlNPTi5wYXJzZSxcblxuXHRcdFx0Ly8gUGFyc2UgdGV4dCBhcyB4bWxcblx0XHRcdFwidGV4dCB4bWxcIjogalF1ZXJ5LnBhcnNlWE1MXG5cdFx0fSxcblxuXHRcdC8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6XG5cdFx0Ly8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZlxuXHRcdC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlXG5cdFx0Ly8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpXG5cdFx0ZmxhdE9wdGlvbnM6IHtcblx0XHRcdHVybDogdHJ1ZSxcblx0XHRcdGNvbnRleHQ6IHRydWVcblx0XHR9XG5cdH0sXG5cblx0Ly8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXRcblx0Ly8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLlxuXHQvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLlxuXHRhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkge1xuXHRcdHJldHVybiBzZXR0aW5ncyA/XG5cblx0XHRcdC8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0XG5cdFx0XHRhamF4RXh0ZW5kKCBhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGluZ3MgKSwgc2V0dGluZ3MgKSA6XG5cblx0XHRcdC8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3Ncblx0XHRcdGFqYXhFeHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHRhcmdldCApO1xuXHR9LFxuXG5cdGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLFxuXHRhamF4VHJhbnNwb3J0OiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMgKSxcblxuXHQvLyBNYWluIG1ldGhvZFxuXHRhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkge1xuXG5cdFx0Ly8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmVcblx0XHRpZiAoIHR5cGVvZiB1cmwgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRvcHRpb25zID0gdXJsO1xuXHRcdFx0dXJsID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIEZvcmNlIG9wdGlvbnMgdG8gYmUgYW4gb2JqZWN0XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHR2YXIgdHJhbnNwb3J0LFxuXG5cdFx0XHQvLyBVUkwgd2l0aG91dCBhbnRpLWNhY2hlIHBhcmFtXG5cdFx0XHRjYWNoZVVSTCxcblxuXHRcdFx0Ly8gUmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nLFxuXHRcdFx0cmVzcG9uc2VIZWFkZXJzLFxuXG5cdFx0XHQvLyB0aW1lb3V0IGhhbmRsZVxuXHRcdFx0dGltZW91dFRpbWVyLFxuXG5cdFx0XHQvLyBVcmwgY2xlYW51cCB2YXJcblx0XHRcdHVybEFuY2hvcixcblxuXHRcdFx0Ly8gUmVxdWVzdCBzdGF0ZSAoYmVjb21lcyBmYWxzZSB1cG9uIHNlbmQgYW5kIHRydWUgdXBvbiBjb21wbGV0aW9uKVxuXHRcdFx0Y29tcGxldGVkLFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcblx0XHRcdGZpcmVHbG9iYWxzLFxuXG5cdFx0XHQvLyBMb29wIHZhcmlhYmxlXG5cdFx0XHRpLFxuXG5cdFx0XHQvLyB1bmNhY2hlZCBwYXJ0IG9mIHRoZSB1cmxcblx0XHRcdHVuY2FjaGVkLFxuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGZpbmFsIG9wdGlvbnMgb2JqZWN0XG5cdFx0XHRzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSxcblxuXHRcdFx0Ly8gQ2FsbGJhY2tzIGNvbnRleHRcblx0XHRcdGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLFxuXG5cdFx0XHQvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uXG5cdFx0XHRnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiZcblx0XHRcdFx0KCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID9cblx0XHRcdFx0alF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6XG5cdFx0XHRcdGpRdWVyeS5ldmVudCxcblxuXHRcdFx0Ly8gRGVmZXJyZWRzXG5cdFx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcblx0XHRcdHJlcXVlc3RIZWFkZXJzID0ge30sXG5cdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sXG5cblx0XHRcdC8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZVxuXHRcdFx0c3RyQWJvcnQgPSBcImNhbmNlbGVkXCIsXG5cblx0XHRcdC8vIEZha2UgeGhyXG5cdFx0XHRqcVhIUiA9IHtcblx0XHRcdFx0cmVhZHlTdGF0ZTogMCxcblxuXHRcdFx0XHQvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHRcdHZhciBtYXRjaDtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0XHRcdGlmICggIXJlc3BvbnNlSGVhZGVycyApIHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzID0ge307XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdID1cblx0XHRcdFx0XHRcdFx0XHRcdCggcmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdIHx8IFtdIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNvbmNhdCggbWF0Y2hbIDIgXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaC5qb2luKCBcIiwgXCIgKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gPVxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdFx0anFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzXG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0dmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XG5cdFx0XHRcdFx0aWYgKCB0cmFuc3BvcnQgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb25lKCAwLCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBkZWZlcnJlZHNcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApO1xuXG5cdFx0Ly8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpXG5cdFx0Ly8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICh0cmFjLTEwMDkzOiBjb25zaXN0ZW5jeSB3aXRoIG9sZCBzaWduYXR1cmUpXG5cdFx0Ly8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlXG5cdFx0cy51cmwgPSAoICggdXJsIHx8IHMudXJsIHx8IGxvY2F0aW9uLmhyZWYgKSArIFwiXCIgKVxuXHRcdFx0LnJlcGxhY2UoIHJwcm90b2NvbCwgbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKTtcblxuXHRcdC8vIEFsaWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBhcyBwZXIgdGlja2V0IHRyYWMtMTIwMDRcblx0XHRzLnR5cGUgPSBvcHRpb25zLm1ldGhvZCB8fCBvcHRpb25zLnR5cGUgfHwgcy5tZXRob2QgfHwgcy50eXBlO1xuXG5cdFx0Ly8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdFxuXHRcdHMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8IFwiKlwiICkudG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXG5cdFx0Ly8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHRoZSBvcmlnaW4gZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudCBvcmlnaW4uXG5cdFx0aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7XG5cdFx0XHR1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSwgRWRnZSAxMiAtIDE1XG5cdFx0XHQvLyBJRSB0aHJvd3MgZXhjZXB0aW9uIG9uIGFjY2Vzc2luZyB0aGUgaHJlZiBwcm9wZXJ0eSBpZiB1cmwgaXMgbWFsZm9ybWVkLFxuXHRcdFx0Ly8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4L1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dXJsQW5jaG9yLmhyZWYgPSBzLnVybDtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5XG5cdFx0XHRcdC8vIEFuY2hvcidzIGhvc3QgcHJvcGVydHkgaXNuJ3QgY29ycmVjdGx5IHNldCB3aGVuIHMudXJsIGlzIHJlbGF0aXZlXG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gdXJsQW5jaG9yLmhyZWY7XG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyBvcmlnaW5BbmNob3IuaG9zdCAhPT1cblx0XHRcdFx0XHR1cmxBbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyB1cmxBbmNob3IuaG9zdDtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGFuIGVycm9yIHBhcnNpbmcgdGhlIFVSTCwgYXNzdW1lIGl0IGlzIGNyb3NzRG9tYWluLFxuXHRcdFx0XHQvLyBpdCBjYW4gYmUgcmVqZWN0ZWQgYnkgdGhlIHRyYW5zcG9ydCBpZiBpdCBpcyBpbnZhbGlkXG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZ1xuXHRcdGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgcHJlZmlsdGVyc1xuXHRcdGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWx0ZXIsIHN0b3AgdGhlcmVcblx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdHJldHVybiBqcVhIUjtcblx0XHR9XG5cblx0XHQvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0b1xuXHRcdC8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICh0cmFjLTE1MTE4KVxuXHRcdGZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0c1xuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0YXJ0XCIgKTtcblx0XHR9XG5cblx0XHQvLyBVcHBlcmNhc2UgdGhlIHR5cGVcblx0XHRzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50XG5cdFx0cy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7XG5cblx0XHQvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2Vcblx0XHQvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb25cblx0XHQvLyBSZW1vdmUgaGFzaCB0byBzaW1wbGlmeSB1cmwgbWFuaXB1bGF0aW9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybC5yZXBsYWNlKCByaGFzaCwgXCJcIiApO1xuXG5cdFx0Ly8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnRcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBoYXNoIHNvIHdlIGNhbiBwdXQgaXQgYmFja1xuXHRcdFx0dW5jYWNoZWQgPSBzLnVybC5zbGljZSggY2FjaGVVUkwubGVuZ3RoICk7XG5cblx0XHRcdC8vIElmIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkLCBhcHBlbmQgZGF0YSB0byB1cmxcblx0XHRcdGlmICggcy5kYXRhICYmICggcy5wcm9jZXNzRGF0YSB8fCB0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICkgKSB7XG5cdFx0XHRcdGNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGE7XG5cblx0XHRcdFx0Ly8gdHJhYy05NjgyOiByZW1vdmUgZGF0YSBzbyB0aGF0IGl0J3Mgbm90IHVzZWQgaW4gYW4gZXZlbnR1YWwgcmV0cnlcblx0XHRcdFx0ZGVsZXRlIHMuZGF0YTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG9yIHVwZGF0ZSBhbnRpLWNhY2hlIHBhcmFtIGlmIG5lZWRlZFxuXHRcdFx0aWYgKCBzLmNhY2hlID09PSBmYWxzZSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgPSBjYWNoZVVSTC5yZXBsYWNlKCByYW50aUNhY2hlLCBcIiQxXCIgKTtcblx0XHRcdFx0dW5jYWNoZWQgPSAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gXCImXCIgOiBcIj9cIiApICsgXCJfPVwiICsgKCBub25jZS5ndWlkKysgKSArXG5cdFx0XHRcdFx0dW5jYWNoZWQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMilcblx0XHRcdHMudXJsID0gY2FjaGVVUkwgKyB1bmNhY2hlZDtcblxuXHRcdC8vIENoYW5nZSAnJTIwJyB0byAnKycgaWYgdGhpcyBpcyBlbmNvZGVkIGZvcm0gYm9keSBjb250ZW50IChnaC0yNjU4KVxuXHRcdH0gZWxzZSBpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmXG5cdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApLmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCApIHtcblx0XHRcdHMuZGF0YSA9IHMuZGF0YS5yZXBsYWNlKCByMjAsIFwiK1wiICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdGlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Nb2RpZmllZC1TaW5jZVwiLCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU5vbmUtTWF0Y2hcIiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnRcblx0XHRpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIsIHMuY29udGVudFR5cGUgKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlXG5cdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlcihcblx0XHRcdFwiQWNjZXB0XCIsXG5cdFx0XHRzLmRhdGFUeXBlc1sgMCBdICYmIHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdID9cblx0XHRcdFx0cy5hY2NlcHRzWyBzLmRhdGFUeXBlc1sgMCBdIF0gK1xuXHRcdFx0XHRcdCggcy5kYXRhVHlwZXNbIDAgXSAhPT0gXCIqXCIgPyBcIiwgXCIgKyBhbGxUeXBlcyArIFwiOyBxPTAuMDFcIiA6IFwiXCIgKSA6XG5cdFx0XHRcdHMuYWNjZXB0c1sgXCIqXCIgXVxuXHRcdCk7XG5cblx0XHQvLyBDaGVjayBmb3IgaGVhZGVycyBvcHRpb25cblx0XHRmb3IgKCBpIGluIHMuaGVhZGVycyApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydFxuXHRcdGlmICggcy5iZWZvcmVTZW5kICYmXG5cdFx0XHQoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQsIGpxWEhSLCBzICkgPT09IGZhbHNlIHx8IGNvbXBsZXRlZCApICkge1xuXG5cdFx0XHQvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm5cblx0XHRcdHJldHVybiBqcVhIUi5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdC8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvblxuXHRcdHN0ckFib3J0ID0gXCJhYm9ydFwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzXG5cdFx0Y29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTtcblx0XHRqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTtcblx0XHRqcVhIUi5mYWlsKCBzLmVycm9yICk7XG5cblx0XHQvLyBHZXQgdHJhbnNwb3J0XG5cdFx0dHJhbnNwb3J0ID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiBubyB0cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnRcblx0XHRpZiAoICF0cmFuc3BvcnQgKSB7XG5cdFx0XHRkb25lKCAtMSwgXCJObyBUcmFuc3BvcnRcIiApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gMTtcblxuXHRcdFx0Ly8gU2VuZCBnbG9iYWwgZXZlbnRcblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhTZW5kXCIsIFsganFYSFIsIHMgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhamF4U2VuZCwgc3RvcCB0aGVyZVxuXHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdHJldHVybiBqcVhIUjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGltZW91dFxuXHRcdFx0aWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7XG5cdFx0XHRcdHRpbWVvdXRUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRqcVhIUi5hYm9ydCggXCJ0aW1lb3V0XCIgKTtcblx0XHRcdFx0fSwgcy50aW1lb3V0ICk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbXBsZXRlZCA9IGZhbHNlO1xuXHRcdFx0XHR0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIFJldGhyb3cgcG9zdC1jb21wbGV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFByb3BhZ2F0ZSBvdGhlcnMgYXMgcmVzdWx0c1xuXHRcdFx0XHRkb25lKCAtMSwgZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZVxuXHRcdGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkge1xuXHRcdFx0dmFyIGlzU3VjY2Vzcywgc3VjY2VzcywgZXJyb3IsIHJlc3BvbnNlLCBtb2RpZmllZCxcblx0XHRcdFx0c3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7XG5cblx0XHRcdC8vIElnbm9yZSByZXBlYXQgaW52b2NhdGlvbnNcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbXBsZXRlZCA9IHRydWU7XG5cblx0XHRcdC8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzXG5cdFx0XHRpZiAoIHRpbWVvdXRUaW1lciApIHtcblx0XHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uXG5cdFx0XHQvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKVxuXHRcdFx0dHJhbnNwb3J0ID0gdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8IFwiXCI7XG5cblx0XHRcdC8vIFNldCByZWFkeVN0YXRlXG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gc3RhdHVzID4gMCA/IDQgOiAwO1xuXG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgc3VjY2Vzc2Z1bFxuXHRcdFx0aXNTdWNjZXNzID0gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQ7XG5cblx0XHRcdC8vIEdldCByZXNwb25zZSBkYXRhXG5cdFx0XHRpZiAoIHJlc3BvbnNlcyApIHtcblx0XHRcdFx0cmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVzZSBhIG5vb3AgY29udmVydGVyIGZvciBtaXNzaW5nIHNjcmlwdCBidXQgbm90IGlmIGpzb25wXG5cdFx0XHRpZiAoICFpc1N1Y2Nlc3MgJiZcblx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIFwic2NyaXB0XCIsIHMuZGF0YVR5cGVzICkgPiAtMSAmJlxuXHRcdFx0XHRqUXVlcnkuaW5BcnJheSggXCJqc29uXCIsIHMuZGF0YVR5cGVzICkgPCAwICkge1xuXHRcdFx0XHRzLmNvbnZlcnRlcnNbIFwidGV4dCBzY3JpcHRcIiBdID0gZnVuY3Rpb24oKSB7fTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KVxuXHRcdFx0cmVzcG9uc2UgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKTtcblxuXHRcdFx0Ly8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmdcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXG5cdFx0XHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0XHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiTGFzdC1Nb2RpZmllZFwiICk7XG5cdFx0XHRcdFx0aWYgKCBtb2RpZmllZCApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJldGFnXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBpZiBubyBjb250ZW50XG5cdFx0XHRcdGlmICggc3RhdHVzID09PSAyMDQgfHwgcy50eXBlID09PSBcIkhFQURcIiApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub2NvbnRlbnRcIjtcblxuXHRcdFx0XHQvLyBpZiBub3QgbW9kaWZpZWRcblx0XHRcdFx0fSBlbHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm90bW9kaWZpZWRcIjtcblxuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gcmVzcG9uc2Uuc3RhdGU7XG5cdFx0XHRcdFx0c3VjY2VzcyA9IHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdFx0ZXJyb3IgPSByZXNwb25zZS5lcnJvcjtcblx0XHRcdFx0XHRpc1N1Y2Nlc3MgPSAhZXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gRXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQgYW5kIG5vcm1hbGl6ZSBmb3Igbm9uLWFib3J0c1xuXHRcdFx0XHRlcnJvciA9IHN0YXR1c1RleHQ7XG5cdFx0XHRcdGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcImVycm9yXCI7XG5cdFx0XHRcdFx0aWYgKCBzdGF0dXMgPCAwICkge1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmplY3Rcblx0XHRcdGpxWEhSLnN0YXR1cyA9IHN0YXR1cztcblx0XHRcdGpxWEhSLnN0YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgXCJcIjtcblxuXHRcdFx0Ly8gU3VjY2Vzcy9FcnJvclxuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7XG5cdFx0XHRzdGF0dXNDb2RlID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggaXNTdWNjZXNzID8gXCJhamF4U3VjY2Vzc1wiIDogXCJhamF4RXJyb3JcIixcblx0XHRcdFx0XHRbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb21wbGV0ZVxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheENvbXBsZXRlXCIsIFsganFYSFIsIHMgXSApO1xuXG5cdFx0XHRcdC8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlclxuXHRcdFx0XHRpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdG9wXCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBqcVhIUjtcblx0fSxcblxuXHRnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFjaywgXCJqc29uXCIgKTtcblx0fSxcblxuXHRnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssIFwic2NyaXB0XCIgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcImdldFwiLCBcInBvc3RcIiBdLCBmdW5jdGlvbiggX2ksIG1ldGhvZCApIHtcblx0alF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkge1xuXG5cdFx0Ly8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWRcblx0XHRpZiAoIGlzRnVuY3Rpb24oIGRhdGEgKSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrO1xuXHRcdFx0Y2FsbGJhY2sgPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBUaGUgdXJsIGNhbiBiZSBhbiBvcHRpb25zIG9iamVjdCAod2hpY2ggdGhlbiBtdXN0IGhhdmUgLnVybClcblx0XHRyZXR1cm4galF1ZXJ5LmFqYXgoIGpRdWVyeS5leHRlbmQoIHtcblx0XHRcdHVybDogdXJsLFxuXHRcdFx0dHlwZTogbWV0aG9kLFxuXHRcdFx0ZGF0YVR5cGU6IHR5cGUsXG5cdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0c3VjY2VzczogY2FsbGJhY2tcblx0XHR9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIGZ1bmN0aW9uKCBzICkge1xuXHR2YXIgaTtcblx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0aWYgKCBpLnRvTG93ZXJDYXNlKCkgPT09IFwiY29udGVudC10eXBlXCIgKSB7XG5cdFx0XHRzLmNvbnRlbnRUeXBlID0gcy5oZWFkZXJzWyBpIF0gfHwgXCJcIjtcblx0XHR9XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsLCBvcHRpb25zLCBkb2MgKSB7XG5cdHJldHVybiBqUXVlcnkuYWpheCgge1xuXHRcdHVybDogdXJsLFxuXG5cdFx0Ly8gTWFrZSB0aGlzIGV4cGxpY2l0LCBzaW5jZSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIHRocm91Z2ggYWpheFNldHVwICh0cmFjLTExMjY0KVxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0ZGF0YVR5cGU6IFwic2NyaXB0XCIsXG5cdFx0Y2FjaGU6IHRydWUsXG5cdFx0YXN5bmM6IGZhbHNlLFxuXHRcdGdsb2JhbDogZmFsc2UsXG5cblx0XHQvLyBPbmx5IGV2YWx1YXRlIHRoZSByZXNwb25zZSBpZiBpdCBpcyBzdWNjZXNzZnVsIChnaC00MTI2KVxuXHRcdC8vIGRhdGFGaWx0ZXIgaXMgbm90IGludm9rZWQgZm9yIGZhaWx1cmUgcmVzcG9uc2VzLCBzbyB1c2luZyBpdCBpbnN0ZWFkXG5cdFx0Ly8gb2YgdGhlIGRlZmF1bHQgY29udmVydGVyIGlzIGtsdWRneSBidXQgaXQgd29ya3MuXG5cdFx0Y29udmVydGVyczoge1xuXHRcdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbigpIHt9XG5cdFx0fSxcblx0XHRkYXRhRmlsdGVyOiBmdW5jdGlvbiggcmVzcG9uc2UgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggcmVzcG9uc2UsIG9wdGlvbnMsIGRvYyApO1xuXHRcdH1cblx0fSApO1xufTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdFx0aHRtbCA9IGh0bWwuY2FsbCggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kXG5cdFx0XHR3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCApLmVxKCAwICkuY2xvbmUoIHRydWUgKTtcblxuXHRcdFx0aWYgKCB0aGlzWyAwIF0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHR3cmFwLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gdGhpcztcblxuXHRcdFx0XHR3aGlsZSAoIGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQgKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZWxlbTtcblx0XHRcdH0gKS5hcHBlbmQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWxJc0Z1bmN0aW9uID8gaHRtbC5jYWxsKCB0aGlzLCBpICkgOiBodG1sICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHVud3JhcDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHRoaXMucGFyZW50KCBzZWxlY3RvciApLm5vdCggXCJib2R5XCIgKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTtcblx0XHR9ICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApO1xufTtcbmpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gISEoIGVsZW0ub2Zmc2V0V2lkdGggfHwgZWxlbS5vZmZzZXRIZWlnaHQgfHwgZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApO1xufTtcblxuXG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoICggZSApIHt9XG59O1xuXG52YXIgeGhyU3VjY2Vzc1N0YXR1cyA9IHtcblxuXHRcdC8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHQvLyB0cmFjLTE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0XG5cdFx0MTIyMzogMjA0XG5cdH0sXG5cdHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7XG5cbnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHJTdXBwb3J0ZWQgKTtcbnN1cHBvcnQuYWpheCA9IHhoclN1cHBvcnRlZCA9ICEheGhyU3VwcG9ydGVkO1xuXG5qUXVlcnkuYWpheFRyYW5zcG9ydCggZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdHZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaztcblxuXHQvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0XG5cdGlmICggc3VwcG9ydC5jb3JzIHx8IHhoclN1cHBvcnRlZCAmJiAhb3B0aW9ucy5jcm9zc0RvbWFpbiApIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkge1xuXHRcdFx0XHR2YXIgaSxcblx0XHRcdFx0XHR4aHIgPSBvcHRpb25zLnhocigpO1xuXG5cdFx0XHRcdHhoci5vcGVuKFxuXHRcdFx0XHRcdG9wdGlvbnMudHlwZSxcblx0XHRcdFx0XHRvcHRpb25zLnVybCxcblx0XHRcdFx0XHRvcHRpb25zLmFzeW5jLFxuXHRcdFx0XHRcdG9wdGlvbnMudXNlcm5hbWUsXG5cdFx0XHRcdFx0b3B0aW9ucy5wYXNzd29yZFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIEFwcGx5IGN1c3RvbSBmaWVsZHMgaWYgcHJvdmlkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdFx0eGhyWyBpIF0gPSBvcHRpb25zLnhockZpZWxkc1sgaSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLm1pbWVUeXBlICYmIHhoci5vdmVycmlkZU1pbWVUeXBlICkge1xuXHRcdFx0XHRcdHhoci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1pbWVUeXBlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlclxuXHRcdFx0XHQvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlXG5cdFx0XHRcdC8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuXG5cdFx0XHRcdC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKVxuXHRcdFx0XHQvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC5cblx0XHRcdFx0aWYgKCAhb3B0aW9ucy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSApIHtcblx0XHRcdFx0XHRoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdID0gXCJYTUxIdHRwUmVxdWVzdFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IGhlYWRlcnNcblx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xuXHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrID0geGhyLm9ubG9hZCA9XG5cdFx0XHRcdFx0XHRcdFx0eGhyLm9uZXJyb3IgPSB4aHIub25hYm9ydCA9IHhoci5vbnRpbWVvdXQgPVxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlID09PSBcImFib3J0XCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0eGhyLmFib3J0KCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09IFwiZXJyb3JcIiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0Ly8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZVxuXHRcdFx0XHRcdFx0XHRcdGlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggMCwgXCJlcnJvclwiICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSB0cmFjLTg2MDUsIHRyYWMtMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHRcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBdIHx8IHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dCxcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElFOSBoYXMgbm8gWEhSMiBidXQgdGhyb3dzIG9uIGJpbmFyeSAodHJhYy0xMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpXG5cdFx0XHRcdFx0XHRcdFx0XHQoIHhoci5yZXNwb25zZVR5cGUgfHwgXCJ0ZXh0XCIgKSAhPT0gXCJ0ZXh0XCIgIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgYmluYXJ5OiB4aHIucmVzcG9uc2UgfSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0ZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0geGhyLm9udGltZW91dCA9IGNhbGxiYWNrKCBcImVycm9yXCIgKTtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHRcdFx0Ly8gVXNlIG9ucmVhZHlzdGF0ZWNoYW5nZSB0byByZXBsYWNlIG9uYWJvcnRcblx0XHRcdFx0Ly8gdG8gaGFuZGxlIHVuY2F1Z2h0IGFib3J0c1xuXHRcdFx0XHRpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0eGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgcmVhZHlTdGF0ZSBiZWZvcmUgdGltZW91dCBhcyBpdCBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFsbG93IG9uZXJyb3IgdG8gYmUgY2FsbGVkIGZpcnN0LFxuXHRcdFx0XHRcdFx0XHQvLyBidXQgdGhhdCB3aWxsIG5vdCBoYW5kbGUgYSBuYXRpdmUgYWJvcnRcblx0XHRcdFx0XHRcdFx0Ly8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0Ly8gYXMgeGhyLm9uZXJyb3IgY2Fubm90IGJlIGFjY2Vzc2VkXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDYWxsYmFjaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2soIFwiYWJvcnRcIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cblx0XHRcdFx0XHQvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pXG5cdFx0XHRcdFx0eGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApO1xuXHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdC8vIHRyYWMtMTQ2ODM6IE9ubHkgcmV0aHJvdyBpZiB0aGlzIGhhc24ndCBiZWVuIG5vdGlmaWVkIGFzIGFuIGVycm9yIHlldFxuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFByZXZlbnQgYXV0by1leGVjdXRpb24gb2Ygc2NyaXB0cyB3aGVuIG5vIGV4cGxpY2l0IGRhdGFUeXBlIHdhcyBwcm92aWRlZCAoU2VlIGdoLTI0MzIpXG5qUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLmNvbnRlbnRzLnNjcmlwdCA9IGZhbHNlO1xuXHR9XG59ICk7XG5cbi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlXG5qUXVlcnkuYWpheFNldHVwKCB7XG5cdGFjY2VwdHM6IHtcblx0XHRzY3JpcHQ6IFwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBcIiArXG5cdFx0XHRcImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdFwiXG5cdH0sXG5cdGNvbnRlbnRzOiB7XG5cdFx0c2NyaXB0OiAvXFxiKD86amF2YXxlY21hKXNjcmlwdFxcYi9cblx0fSxcblx0Y29udmVydGVyczoge1xuXHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApO1xuXHRcdFx0cmV0dXJuIHRleHQ7XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW5cbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0cy5jYWNoZSA9IGZhbHNlO1xuXHR9XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLnR5cGUgPSBcIkdFVFwiO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydFxualF1ZXJ5LmFqYXhUcmFuc3BvcnQoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXG5cdC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gb3IgZm9yY2VkLWJ5LWF0dHJzIHJlcXVlc3RzXG5cdGlmICggcy5jcm9zc0RvbWFpbiB8fCBzLnNjcmlwdEF0dHJzICkge1xuXHRcdHZhciBzY3JpcHQsIGNhbGxiYWNrO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggXywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGpRdWVyeSggXCI8c2NyaXB0PlwiIClcblx0XHRcdFx0XHQuYXR0ciggcy5zY3JpcHRBdHRycyB8fCB7fSApXG5cdFx0XHRcdFx0LnByb3AoIHsgY2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LCBzcmM6IHMudXJsIH0gKVxuXHRcdFx0XHRcdC5vbiggXCJsb2FkIGVycm9yXCIsIGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcblx0cmpzb25wID0gLyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztcblxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZS5ndWlkKysgKSApO1xuXHRcdHRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlO1xuXHRcdHJldHVybiBjYWxsYmFjaztcblx0fVxufSApO1xuXG4vLyBEZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVxdWVzdHNcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcImpzb24ganNvbnBcIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpxWEhSICkge1xuXG5cdHZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lcixcblx0XHRqc29uUHJvcCA9IHMuanNvbnAgIT09IGZhbHNlICYmICggcmpzb25wLnRlc3QoIHMudXJsICkgP1xuXHRcdFx0XCJ1cmxcIiA6XG5cdFx0XHR0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCggcy5jb250ZW50VHlwZSB8fCBcIlwiIClcblx0XHRcdFx0XHQuaW5kZXhPZiggXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiApID09PSAwICYmXG5cdFx0XHRcdHJqc29ucC50ZXN0KCBzLmRhdGEgKSAmJiBcImRhdGFcIlxuXHRcdCk7XG5cblx0Ly8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzIFwianNvbnBcIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldFxuXHRpZiAoIGpzb25Qcm9wIHx8IHMuZGF0YVR5cGVzWyAwIF0gPT09IFwianNvbnBcIiApIHtcblxuXHRcdC8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXRcblx0XHRjYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBpc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2soKSA6XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHQvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1cmwgb3IgZm9ybSBkYXRhXG5cdFx0aWYgKCBqc29uUHJvcCApIHtcblx0XHRcdHNbIGpzb25Qcm9wIF0gPSBzWyBqc29uUHJvcCBdLnJlcGxhY2UoIHJqc29ucCwgXCIkMVwiICsgY2FsbGJhY2tOYW1lICk7XG5cdFx0fSBlbHNlIGlmICggcy5qc29ucCAhPT0gZmFsc2UgKSB7XG5cdFx0XHRzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gXCImXCIgOiBcIj9cIiApICsgcy5qc29ucCArIFwiPVwiICsgY2FsbGJhY2tOYW1lO1xuXHRcdH1cblxuXHRcdC8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb25cblx0XHRzLmNvbnZlcnRlcnNbIFwic2NyaXB0IGpzb25cIiBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHtcblx0XHRcdFx0alF1ZXJ5LmVycm9yKCBjYWxsYmFja05hbWUgKyBcIiB3YXMgbm90IGNhbGxlZFwiICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTtcblx0XHR9O1xuXG5cdFx0Ly8gRm9yY2UganNvbiBkYXRhVHlwZVxuXHRcdHMuZGF0YVR5cGVzWyAwIF0gPSBcImpzb25cIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tcblx0XHRvdmVyd3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07XG5cdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBhcmd1bWVudHM7XG5cdFx0fTtcblxuXHRcdC8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKVxuXHRcdGpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIElmIHByZXZpb3VzIHZhbHVlIGRpZG4ndCBleGlzdCAtIHJlbW92ZSBpdFxuXHRcdFx0aWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRqUXVlcnkoIHdpbmRvdyApLnJlbW92ZVByb3AoIGNhbGxiYWNrTmFtZSApO1xuXG5cdFx0XHQvLyBPdGhlcndpc2UgcmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92ZXJ3cml0dGVuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTYXZlIGJhY2sgYXMgZnJlZVxuXHRcdFx0aWYgKCBzWyBjYWxsYmFja05hbWUgXSApIHtcblxuXHRcdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCByZS11c2luZyB0aGUgb3B0aW9ucyBkb2Vzbid0IHNjcmV3IHRoaW5ncyBhcm91bmRcblx0XHRcdFx0cy5qc29ucENhbGxiYWNrID0gb3JpZ2luYWxTZXR0aW5ncy5qc29ucENhbGxiYWNrO1xuXG5cdFx0XHRcdC8vIFNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2Vcblx0XHRcdFx0b2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2Vcblx0XHRcdGlmICggcmVzcG9uc2VDb250YWluZXIgJiYgaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHtcblx0XHRcdFx0b3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDtcblx0XHR9ICk7XG5cblx0XHQvLyBEZWxlZ2F0ZSB0byBzY3JpcHRcblx0XHRyZXR1cm4gXCJzY3JpcHRcIjtcblx0fVxufSApO1xuXG5cblxuXG4vLyBTdXBwb3J0OiBTYWZhcmkgOCBvbmx5XG4vLyBJbiBTYWZhcmkgOCBkb2N1bWVudHMgY3JlYXRlZCB2aWEgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50XG4vLyBjb2xsYXBzZSBzaWJsaW5nIGZvcm1zOiB0aGUgc2Vjb25kIG9uZSBiZWNvbWVzIGEgY2hpbGQgb2YgdGhlIGZpcnN0IG9uZS5cbi8vIEJlY2F1c2Ugb2YgdGhhdCwgdGhpcyBzZWN1cml0eSBtZWFzdXJlIGhhcyB0byBiZSBkaXNhYmxlZCBpbiBTYWZhcmkgOC5cbi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzczMzdcbnN1cHBvcnQuY3JlYXRlSFRNTERvY3VtZW50ID0gKCBmdW5jdGlvbigpIHtcblx0dmFyIGJvZHkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKS5ib2R5O1xuXHRib2R5LmlubmVySFRNTCA9IFwiPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT5cIjtcblx0cmV0dXJuIGJvZHkuY2hpbGROb2Rlcy5sZW5ndGggPT09IDI7XG59ICkoKTtcblxuXG4vLyBBcmd1bWVudCBcImRhdGFcIiBzaG91bGQgYmUgc3RyaW5nIG9mIGh0bWxcbi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCxcbi8vIGRlZmF1bHRzIHRvIGRvY3VtZW50XG4vLyBrZWVwU2NyaXB0cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIGh0bWwgc3RyaW5nXG5qUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkge1xuXHRpZiAoIHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRrZWVwU2NyaXB0cyA9IGNvbnRleHQ7XG5cdFx0Y29udGV4dCA9IGZhbHNlO1xuXHR9XG5cblx0dmFyIGJhc2UsIHBhcnNlZCwgc2NyaXB0cztcblxuXHRpZiAoICFjb250ZXh0ICkge1xuXG5cdFx0Ly8gU3RvcCBzY3JpcHRzIG9yIGlubGluZSBldmVudCBoYW5kbGVycyBmcm9tIGJlaW5nIGV4ZWN1dGVkIGltbWVkaWF0ZWx5XG5cdFx0Ly8gYnkgdXNpbmcgZG9jdW1lbnQuaW1wbGVtZW50YXRpb25cblx0XHRpZiAoIHN1cHBvcnQuY3JlYXRlSFRNTERvY3VtZW50ICkge1xuXHRcdFx0Y29udGV4dCA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCggXCJcIiApO1xuXG5cdFx0XHQvLyBTZXQgdGhlIGJhc2UgaHJlZiBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0XHRcdC8vIHNvIGFueSBwYXJzZWQgZWxlbWVudHMgd2l0aCBVUkxzXG5cdFx0XHQvLyBhcmUgYmFzZWQgb24gdGhlIGRvY3VtZW50J3MgVVJMIChnaC0yOTY1KVxuXHRcdFx0YmFzZSA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCggXCJiYXNlXCIgKTtcblx0XHRcdGJhc2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7XG5cdFx0XHRjb250ZXh0LmhlYWQuYXBwZW5kQ2hpbGQoIGJhc2UgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29udGV4dCA9IGRvY3VtZW50O1xuXHRcdH1cblx0fVxuXG5cdHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApO1xuXHRzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdO1xuXG5cdC8vIFNpbmdsZSB0YWdcblx0aWYgKCBwYXJzZWQgKSB7XG5cdFx0cmV0dXJuIFsgY29udGV4dC5jcmVhdGVFbGVtZW50KCBwYXJzZWRbIDEgXSApIF07XG5cdH1cblxuXHRwYXJzZWQgPSBidWlsZEZyYWdtZW50KCBbIGRhdGEgXSwgY29udGV4dCwgc2NyaXB0cyApO1xuXG5cdGlmICggc2NyaXB0cyAmJiBzY3JpcHRzLmxlbmd0aCApIHtcblx0XHRqUXVlcnkoIHNjcmlwdHMgKS5yZW1vdmUoKTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApO1xufTtcblxuXG4vKipcbiAqIExvYWQgYSB1cmwgaW50byBhIHBhZ2VcbiAqL1xualF1ZXJ5LmZuLmxvYWQgPSBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkge1xuXHR2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLFxuXHRcdHNlbGYgPSB0aGlzLFxuXHRcdG9mZiA9IHVybC5pbmRleE9mKCBcIiBcIiApO1xuXG5cdGlmICggb2ZmID4gLTEgKSB7XG5cdFx0c2VsZWN0b3IgPSBzdHJpcEFuZENvbGxhcHNlKCB1cmwuc2xpY2UoIG9mZiApICk7XG5cdFx0dXJsID0gdXJsLnNsaWNlKCAwLCBvZmYgKTtcblx0fVxuXG5cdC8vIElmIGl0J3MgYSBmdW5jdGlvblxuXHRpZiAoIGlzRnVuY3Rpb24oIHBhcmFtcyApICkge1xuXG5cdFx0Ly8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2tcblx0XHRjYWxsYmFjayA9IHBhcmFtcztcblx0XHRwYXJhbXMgPSB1bmRlZmluZWQ7XG5cblx0Ly8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZ1xuXHR9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gXCJvYmplY3RcIiApIHtcblx0XHR0eXBlID0gXCJQT1NUXCI7XG5cdH1cblxuXHQvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdFxuXHRpZiAoIHNlbGYubGVuZ3RoID4gMCApIHtcblx0XHRqUXVlcnkuYWpheCgge1xuXHRcdFx0dXJsOiB1cmwsXG5cblx0XHRcdC8vIElmIFwidHlwZVwiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlbiBcIkdFVFwiIG1ldGhvZCB3aWxsIGJlIHVzZWQuXG5cdFx0XHQvLyBNYWtlIHZhbHVlIG9mIHRoaXMgZmllbGQgZXhwbGljaXQgc2luY2Vcblx0XHRcdC8vIHVzZXIgY2FuIG92ZXJyaWRlIGl0IHRocm91Z2ggYWpheFNldHVwIG1ldGhvZFxuXHRcdFx0dHlwZTogdHlwZSB8fCBcIkdFVFwiLFxuXHRcdFx0ZGF0YVR5cGU6IFwiaHRtbFwiLFxuXHRcdFx0ZGF0YTogcGFyYW1zXG5cdFx0fSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7XG5cblx0XHRcdC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBjYWxsYmFja1xuXHRcdFx0cmVzcG9uc2UgPSBhcmd1bWVudHM7XG5cblx0XHRcdHNlbGYuaHRtbCggc2VsZWN0b3IgP1xuXG5cdFx0XHRcdC8vIElmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZCwgbG9jYXRlIHRoZSByaWdodCBlbGVtZW50cyBpbiBhIGR1bW15IGRpdlxuXHRcdFx0XHQvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnNcblx0XHRcdFx0alF1ZXJ5KCBcIjxkaXY+XCIgKS5hcHBlbmQoIGpRdWVyeS5wYXJzZUhUTUwoIHJlc3BvbnNlVGV4dCApICkuZmluZCggc2VsZWN0b3IgKSA6XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCByZXN1bHRcblx0XHRcdFx0cmVzcG9uc2VUZXh0ICk7XG5cblx0XHQvLyBJZiB0aGUgcmVxdWVzdCBzdWNjZWVkcywgdGhpcyBmdW5jdGlvbiBnZXRzIFwiZGF0YVwiLCBcInN0YXR1c1wiLCBcImpxWEhSXCJcblx0XHQvLyBidXQgdGhleSBhcmUgaWdub3JlZCBiZWNhdXNlIHJlc3BvbnNlIHdhcyBzZXQgYWJvdmUuXG5cdFx0Ly8gSWYgaXQgZmFpbHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImpxWEhSXCIsIFwic3RhdHVzXCIsIFwiZXJyb3JcIlxuXHRcdH0gKS5hbHdheXMoIGNhbGxiYWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkge1xuXHRcdFx0c2VsZi5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y2FsbGJhY2suYXBwbHkoIHRoaXMsIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTtcblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHRyZXR1cm4gdGhpcztcbn07XG5cblxuXG5cbmpRdWVyeS5leHByLnBzZXVkb3MuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW0gPT09IGZuLmVsZW07XG5cdH0gKS5sZW5ndGg7XG59O1xuXG5cblxuXG5qUXVlcnkub2Zmc2V0ID0ge1xuXHRzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkge1xuXHRcdHZhciBjdXJQb3NpdGlvbiwgY3VyTGVmdCwgY3VyQ1NTVG9wLCBjdXJUb3AsIGN1ck9mZnNldCwgY3VyQ1NTTGVmdCwgY2FsY3VsYXRlUG9zaXRpb24sXG5cdFx0XHRwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApLFxuXHRcdFx0Y3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLFxuXHRcdFx0cHJvcHMgPSB7fTtcblxuXHRcdC8vIFNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW1cblx0XHRpZiAoIHBvc2l0aW9uID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0ZWxlbS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcblx0XHR9XG5cblx0XHRjdXJPZmZzZXQgPSBjdXJFbGVtLm9mZnNldCgpO1xuXHRcdGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwidG9wXCIgKTtcblx0XHRjdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJsZWZ0XCIgKTtcblx0XHRjYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiB8fCBwb3NpdGlvbiA9PT0gXCJmaXhlZFwiICkgJiZcblx0XHRcdCggY3VyQ1NTVG9wICsgY3VyQ1NTTGVmdCApLmluZGV4T2YoIFwiYXV0b1wiICkgPiAtMTtcblxuXHRcdC8vIE5lZWQgdG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgcG9zaXRpb24gaWYgZWl0aGVyXG5cdFx0Ly8gdG9wIG9yIGxlZnQgaXMgYXV0byBhbmQgcG9zaXRpb24gaXMgZWl0aGVyIGFic29sdXRlIG9yIGZpeGVkXG5cdFx0aWYgKCBjYWxjdWxhdGVQb3NpdGlvbiApIHtcblx0XHRcdGN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpO1xuXHRcdFx0Y3VyVG9wID0gY3VyUG9zaXRpb24udG9wO1xuXHRcdFx0Y3VyTGVmdCA9IGN1clBvc2l0aW9uLmxlZnQ7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDtcblx0XHRcdGN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkgfHwgMDtcblx0XHR9XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHtcblxuXHRcdFx0Ly8gVXNlIGpRdWVyeS5leHRlbmQgaGVyZSB0byBhbGxvdyBtb2RpZmljYXRpb24gb2YgY29vcmRpbmF0ZXMgYXJndW1lbnQgKGdoLTE4NDgpXG5cdFx0XHRvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbnMudG9wICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy50b3AgPSAoIG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCApICsgY3VyVG9wO1xuXHRcdH1cblx0XHRpZiAoIG9wdGlvbnMubGVmdCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7XG5cdFx0fVxuXG5cdFx0aWYgKCBcInVzaW5nXCIgaW4gb3B0aW9ucyApIHtcblx0XHRcdG9wdGlvbnMudXNpbmcuY2FsbCggZWxlbSwgcHJvcHMgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJFbGVtLmNzcyggcHJvcHMgKTtcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHQvLyBvZmZzZXQoKSByZWxhdGVzIGFuIGVsZW1lbnQncyBib3JkZXIgYm94IHRvIHRoZSBkb2N1bWVudCBvcmlnaW5cblx0b2Zmc2V0OiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHRcdC8vIFByZXNlcnZlIGNoYWluaW5nIGZvciBzZXR0ZXJcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0dGhpcyA6XG5cdFx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTtcblx0XHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHZhciByZWN0LCB3aW4sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gemVyb3MgZm9yIGRpc2Nvbm5lY3RlZCBhbmQgaGlkZGVuIChkaXNwbGF5OiBub25lKSBlbGVtZW50cyAoZ2gtMjMxMClcblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0XHQvLyBSdW5uaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBhXG5cdFx0Ly8gZGlzY29ubmVjdGVkIG5vZGUgaW4gSUUgdGhyb3dzIGFuIGVycm9yXG5cdFx0aWYgKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9O1xuXHRcdH1cblxuXHRcdC8vIEdldCBkb2N1bWVudC1yZWxhdGl2ZSBwb3NpdGlvbiBieSBhZGRpbmcgdmlld3BvcnQgc2Nyb2xsIHRvIHZpZXdwb3J0LXJlbGF0aXZlIGdCQ1Jcblx0XHRyZWN0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHR3aW4gPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRvcDogcmVjdC50b3AgKyB3aW4ucGFnZVlPZmZzZXQsXG5cdFx0XHRsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXRcblx0XHR9O1xuXHR9LFxuXG5cdC8vIHBvc2l0aW9uKCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgbWFyZ2luIGJveCB0byBpdHMgb2Zmc2V0IHBhcmVudCdzIHBhZGRpbmcgYm94XG5cdC8vIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGJlaGF2aW9yIG9mIENTUyBhYnNvbHV0ZSBwb3NpdGlvbmluZ1xuXHRwb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhdGhpc1sgMCBdICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBvZmZzZXRQYXJlbnQsIG9mZnNldCwgZG9jLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdHBhcmVudE9mZnNldCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XG5cblx0XHQvLyBwb3NpdGlvbjpmaXhlZCBlbGVtZW50cyBhcmUgb2Zmc2V0IGZyb20gdGhlIHZpZXdwb3J0LCB3aGljaCBpdHNlbGYgYWx3YXlzIGhhcyB6ZXJvIG9mZnNldFxuXHRcdGlmICggalF1ZXJ5LmNzcyggZWxlbSwgXCJwb3NpdGlvblwiICkgPT09IFwiZml4ZWRcIiApIHtcblxuXHRcdFx0Ly8gQXNzdW1lIHBvc2l0aW9uOmZpeGVkIGltcGxpZXMgYXZhaWxhYmlsaXR5IG9mIGdldEJvdW5kaW5nQ2xpZW50UmVjdFxuXHRcdFx0b2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRvZmZzZXQgPSB0aGlzLm9mZnNldCgpO1xuXG5cdFx0XHQvLyBBY2NvdW50IGZvciB0aGUgKnJlYWwqIG9mZnNldCBwYXJlbnQsIHdoaWNoIGNhbiBiZSB0aGUgZG9jdW1lbnQgb3IgaXRzIHJvb3QgZWxlbWVudFxuXHRcdFx0Ly8gd2hlbiBhIHN0YXRpY2FsbHkgcG9zaXRpb25lZCBlbGVtZW50IGlzIGlkZW50aWZpZWRcblx0XHRcdGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDtcblx0XHRcdG9mZnNldFBhcmVudCA9IGVsZW0ub2Zmc2V0UGFyZW50IHx8IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJlxuXHRcdFx0XHQoIG9mZnNldFBhcmVudCA9PT0gZG9jLmJvZHkgfHwgb2Zmc2V0UGFyZW50ID09PSBkb2MuZG9jdW1lbnRFbGVtZW50ICkgJiZcblx0XHRcdFx0alF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcInBvc2l0aW9uXCIgKSA9PT0gXCJzdGF0aWNcIiApIHtcblxuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdGlmICggb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudCAhPT0gZWxlbSAmJiBvZmZzZXRQYXJlbnQubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgYm9yZGVycyBpbnRvIGl0cyBvZmZzZXQsIHNpbmNlIHRoZXkgYXJlIG91dHNpZGUgaXRzIGNvbnRlbnQgb3JpZ2luXG5cdFx0XHRcdHBhcmVudE9mZnNldCA9IGpRdWVyeSggb2Zmc2V0UGFyZW50ICkub2Zmc2V0KCk7XG5cdFx0XHRcdHBhcmVudE9mZnNldC50b3AgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcImJvcmRlclRvcFdpZHRoXCIsIHRydWUgKTtcblx0XHRcdFx0cGFyZW50T2Zmc2V0LmxlZnQgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcImJvcmRlckxlZnRXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2luc1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IG9mZnNldC50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5Ub3BcIiwgdHJ1ZSApLFxuXHRcdFx0bGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luTGVmdFwiLCB0cnVlIClcblx0XHR9O1xuXHR9LFxuXG5cdC8vIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGRvY3VtZW50RWxlbWVudCBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuXHQvLyAxKSBGb3IgdGhlIGVsZW1lbnQgaW5zaWRlIHRoZSBpZnJhbWUgd2l0aG91dCBvZmZzZXRQYXJlbnQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuXG5cdC8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvd1xuXHQvLyAyKSBGb3IgdGhlIGhpZGRlbiBvciBkZXRhY2hlZCBlbGVtZW50XG5cdC8vIDMpIEZvciBib2R5IG9yIGh0bWwgZWxlbWVudCwgaS5lLiBpbiBjYXNlIG9mIHRoZSBodG1sIG5vZGUgLSBpdCB3aWxsIHJldHVybiBpdHNlbGZcblx0Ly9cblx0Ly8gYnV0IHRob3NlIGV4Y2VwdGlvbnMgd2VyZSBuZXZlciBwcmVzZW50ZWQgYXMgYSByZWFsIGxpZmUgdXNlLWNhc2VzXG5cdC8vIGFuZCBtaWdodCBiZSBjb25zaWRlcmVkIGFzIG1vcmUgcHJlZmVyYWJsZSByZXN1bHRzLlxuXHQvL1xuXHQvLyBUaGlzIGxvZ2ljLCBob3dldmVyLCBpcyBub3QgZ3VhcmFudGVlZCBhbmQgY2FuIGNoYW5nZSBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZVxuXHRvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQ7XG5cblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnRFbGVtZW50O1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG4vLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHNcbmpRdWVyeS5lYWNoKCB7IHNjcm9sbExlZnQ6IFwicGFnZVhPZmZzZXRcIiwgc2Nyb2xsVG9wOiBcInBhZ2VZT2Zmc2V0XCIgfSwgZnVuY3Rpb24oIG1ldGhvZCwgcHJvcCApIHtcblx0dmFyIHRvcCA9IFwicGFnZVlPZmZzZXRcIiA9PT0gcHJvcDtcblxuXHRqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7XG5cblx0XHRcdC8vIENvYWxlc2NlIGRvY3VtZW50cyBhbmQgd2luZG93c1xuXHRcdFx0dmFyIHdpbjtcblx0XHRcdGlmICggaXNXaW5kb3coIGVsZW0gKSApIHtcblx0XHRcdFx0d2luID0gZWxlbTtcblx0XHRcdH0gZWxzZSBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHdpbiA9IGVsZW0uZGVmYXVsdFZpZXc7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiB3aW4gPyB3aW5bIHByb3AgXSA6IGVsZW1bIG1ldGhvZCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHdpbiApIHtcblx0XHRcdFx0d2luLnNjcm9sbFRvKFxuXHRcdFx0XHRcdCF0b3AgPyB2YWwgOiB3aW4ucGFnZVhPZmZzZXQsXG5cdFx0XHRcdFx0dG9wID8gdmFsIDogd2luLnBhZ2VZT2Zmc2V0XG5cdFx0XHRcdCk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1bIG1ldGhvZCBdID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0sIG1ldGhvZCwgdmFsLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH07XG59ICk7XG5cbi8vIFN1cHBvcnQ6IFNhZmFyaSA8PTcgLSA5LjEsIENocm9tZSA8PTM3IC0gNDlcbi8vIEFkZCB0aGUgdG9wL2xlZnQgY3NzSG9va3MgdXNpbmcgalF1ZXJ5LmZuLnBvc2l0aW9uXG4vLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODRcbi8vIEJsaW5rIGJ1ZzogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NTg5MzQ3XG4vLyBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNwZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0O1xuLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmVcbmpRdWVyeS5lYWNoKCBbIFwidG9wXCIsIFwibGVmdFwiIF0sIGZ1bmN0aW9uKCBfaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCgge1xuXHRcdHBhZGRpbmc6IFwiaW5uZXJcIiArIG5hbWUsXG5cdFx0Y29udGVudDogdHlwZSxcblx0XHRcIlwiOiBcIm91dGVyXCIgKyBuYW1lXG5cdH0sIGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkge1xuXG5cdFx0Ly8gTWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoXG5cdFx0alF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSBcImJvb2xlYW5cIiApLFxuXHRcdFx0XHRleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/IFwibWFyZ2luXCIgOiBcImJvcmRlclwiICk7XG5cblx0XHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGRvYztcblxuXHRcdFx0XHRpZiAoIGlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KVxuXHRcdFx0XHRcdHJldHVybiBmdW5jTmFtZS5pbmRleE9mKCBcIm91dGVyXCIgKSA9PT0gMCA/XG5cdFx0XHRcdFx0XHRlbGVtWyBcImlubmVyXCIgKyBuYW1lIF0gOlxuXHRcdFx0XHRcdFx0ZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIFwiY2xpZW50XCIgKyBuYW1lIF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBHZXQgZG9jdW1lbnQgd2lkdGggb3IgaGVpZ2h0XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdFx0XHRcdC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSxcblx0XHRcdFx0XHQvLyB3aGljaGV2ZXIgaXMgZ3JlYXRlc3Rcblx0XHRcdFx0XHRyZXR1cm4gTWF0aC5tYXgoXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwic2Nyb2xsXCIgKyBuYW1lIF0sIGRvY1sgXCJzY3JvbGxcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJvZmZzZXRcIiArIG5hbWUgXSwgZG9jWyBcIm9mZnNldFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZG9jWyBcImNsaWVudFwiICsgbmFtZSBdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblxuXHRcdFx0XHRcdC8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXRcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDpcblxuXHRcdFx0XHRcdC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApO1xuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUgKTtcblx0XHR9O1xuXHR9ICk7XG59ICk7XG5cblxualF1ZXJ5LmVhY2goIFtcblx0XCJhamF4U3RhcnRcIixcblx0XCJhamF4U3RvcFwiLFxuXHRcImFqYXhDb21wbGV0ZVwiLFxuXHRcImFqYXhFcnJvclwiLFxuXHRcImFqYXhTdWNjZXNzXCIsXG5cdFwiYWpheFNlbmRcIlxuXSwgZnVuY3Rpb24oIF9pLCB0eXBlICkge1xuXHRqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZSwgZm4gKTtcblx0fTtcbn0gKTtcblxuXG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcblx0fSxcblxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XG5cblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgP1xuXHRcdFx0dGhpcy5vZmYoIHNlbGVjdG9yLCBcIioqXCIgKSA6XG5cdFx0XHR0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8IFwiKipcIiwgZm4gKTtcblx0fSxcblxuXHRob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7XG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5vbiggXCJtb3VzZWVudGVyXCIsIGZuT3ZlciApXG5cdFx0XHQub24oIFwibW91c2VsZWF2ZVwiLCBmbk91dCB8fCBmbk92ZXIgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaChcblx0KCBcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudVwiICkuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBfaSwgbmFtZSApIHtcblxuXHRcdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdFx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7XG5cdFx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDAgP1xuXHRcdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCBuYW1lICk7XG5cdFx0fTtcblx0fVxuKTtcblxuXG5cblxuLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5XG4vLyBNYWtlIHN1cmUgd2UgdHJpbSBCT00gYW5kIE5CU1Bcbi8vIFJlcXVpcmUgdGhhdCB0aGUgXCJ3aGl0ZXNwYWNlIHJ1blwiIHN0YXJ0cyBmcm9tIGEgbm9uLXdoaXRlc3BhY2Vcbi8vIHRvIGF2b2lkIE8oTl4yKSBiZWhhdmlvciB3aGVuIHRoZSBlbmdpbmUgd291bGQgdHJ5IG1hdGNoaW5nIFwiXFxzKyRcIiBhdCBlYWNoIHNwYWNlIHBvc2l0aW9uLlxudmFyIHJ0cmltID0gL15bXFxzXFx1RkVGRlxceEEwXSt8KFteXFxzXFx1RkVGRlxceEEwXSlbXFxzXFx1RkVGRlxceEEwXSskL2c7XG5cbi8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueVxuLy8gYXJndW1lbnRzLlxuLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKVxuLy8gSG93ZXZlciwgaXQgaXMgbm90IHNsYXRlZCBmb3IgcmVtb3ZhbCBhbnkgdGltZSBzb29uXG5qUXVlcnkucHJveHkgPSBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7XG5cdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xuXG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0dG1wID0gZm5bIGNvbnRleHQgXTtcblx0XHRjb250ZXh0ID0gZm47XG5cdFx0Zm4gPSB0bXA7XG5cdH1cblxuXHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBTaW11bGF0ZWQgYmluZFxuXHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XG5cdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdH07XG5cblx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdHJldHVybiBwcm94eTtcbn07XG5cbmpRdWVyeS5ob2xkUmVhZHkgPSBmdW5jdGlvbiggaG9sZCApIHtcblx0aWYgKCBob2xkICkge1xuXHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0fSBlbHNlIHtcblx0XHRqUXVlcnkucmVhZHkoIHRydWUgKTtcblx0fVxufTtcbmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbmpRdWVyeS5wYXJzZUpTT04gPSBKU09OLnBhcnNlO1xualF1ZXJ5Lm5vZGVOYW1lID0gbm9kZU5hbWU7XG5qUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5qUXVlcnkuaXNXaW5kb3cgPSBpc1dpbmRvdztcbmpRdWVyeS5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG5qUXVlcnkudHlwZSA9IHRvVHlwZTtcblxualF1ZXJ5Lm5vdyA9IERhdGUubm93O1xuXG5qUXVlcnkuaXNOdW1lcmljID0gZnVuY3Rpb24oIG9iaiApIHtcblxuXHQvLyBBcyBvZiBqUXVlcnkgMy4wLCBpc051bWVyaWMgaXMgbGltaXRlZCB0b1xuXHQvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpXG5cdC8vIHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gZmluaXRlIG51bWJlcnMgKGdoLTI2NjIpXG5cdHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApO1xuXHRyZXR1cm4gKCB0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwic3RyaW5nXCIgKSAmJlxuXG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKFwiXCIpXG5cdFx0Ly8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoXCIweC4uLlwiKVxuXHRcdC8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTlxuXHRcdCFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTtcbn07XG5cbmpRdWVyeS50cmltID0gZnVuY3Rpb24oIHRleHQgKSB7XG5cdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFwiXCIgOlxuXHRcdCggdGV4dCArIFwiXCIgKS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICk7XG59O1xuXG5cblxuLy8gUmVnaXN0ZXIgYXMgYSBuYW1lZCBBTUQgbW9kdWxlLCBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyXG4vLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0XG4vLyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQgbW9zdCByb2J1c3Rcbi8vIHdheSB0byByZWdpc3Rlci4gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmVcbi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZVxuLy8gZmlsZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzXG4vLyB0byBjYWxsIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuXG5cbi8vIE5vdGUgdGhhdCBmb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBqUXVlcnkgc2hvdWxkXG4vLyBkZWNsYXJlIHRoZW1zZWx2ZXMgYXMgYW5vbnltb3VzIG1vZHVsZXMsIGFuZCBhdm9pZCBzZXR0aW5nIGEgZ2xvYmFsIGlmIGFuXG4vLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL3dpa2kvVXBkYXRpbmctZXhpc3RpbmctbGlicmFyaWVzI3dpa2ktYW5vblxuXG5pZiAoIHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kICkge1xuXHRkZWZpbmUoIFwianF1ZXJ5XCIsIFtdLCBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5O1xuXHR9ICk7XG59XG5cblxuXG5cbnZhclxuXG5cdC8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuXHRfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSxcblxuXHQvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuXHRfJCA9IHdpbmRvdy4kO1xuXG5qUXVlcnkubm9Db25mbGljdCA9IGZ1bmN0aW9uKCBkZWVwICkge1xuXHRpZiAoIHdpbmRvdy4kID09PSBqUXVlcnkgKSB7XG5cdFx0d2luZG93LiQgPSBfJDtcblx0fVxuXG5cdGlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7XG5cdFx0d2luZG93LmpRdWVyeSA9IF9qUXVlcnk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5O1xufTtcblxuLy8gRXhwb3NlIGpRdWVyeSBhbmQgJCBpZGVudGlmaWVycywgZXZlbiBpbiBBTURcbi8vICh0cmFjLTcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICh0cmFjLTEzNTY2KVxuaWYgKCB0eXBlb2Ygbm9HbG9iYWwgPT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdHdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTtcbn1cblxuXG5cblxucmV0dXJuIGpRdWVyeTtcbn0gKTtcbiIsICIvKiBQcmlzbUpTIDEuMjguMFxuaHR0cHM6Ly9wcmlzbWpzLmNvbS9kb3dubG9hZC5odG1sI3RoZW1lcz1wcmlzbS10b21vcnJvdyZsYW5ndWFnZXM9bWFya3VwK2NzcytjbGlrZStqYXZhc2NyaXB0K2FiYXArYWJuZithY3Rpb25zY3JpcHQrYWRhK2FnZGErYWwrYW50bHI0K2FwYWNoZWNvbmYrYXBleCthcGwrYXBwbGVzY3JpcHQrYXFsK2FyZHVpbm8rYXJmZithcm1hc20rYXJ0dXJvK2FzY2lpZG9jK2FzcG5ldCthc202NTAyK2FzbWF0bWVsK2F1dG9ob3RrZXkrYXV0b2l0K2F2aXN5bnRoK2F2cm8taWRsK2F3aytiYXNoK2Jhc2ljK2JhdGNoK2JiY29kZStiaWNlcCtiaXJiK2Jpc29uK2JuZiticmFpbmZ1Y2srYnJpZ2h0c2NyaXB0K2Jybytic2wrYytjc2hhcnArY3BwK2Nmc2NyaXB0K2NoYWlzY3JpcHQrY2lsK2Nsb2p1cmUrY21ha2UrY29ib2wrY29mZmVlc2NyaXB0K2NvbmN1cm5hcytjc3ArY29va2xhbmcrY29xK2NyeXN0YWwrY3NzLWV4dHJhcytjc3YrY3VlK2N5cGhlcitkK2RhcnQrZGF0YXdlYXZlK2RheCtkaGFsbCtkaWZmK2RqYW5nbytkbnMtem9uZS1maWxlK2RvY2tlcitkb3QrZWJuZitlZGl0b3Jjb25maWcrZWlmZmVsK2VqcytlbGl4aXIrZWxtK2V0bHVhK2VyYitlcmxhbmcrZXhjZWwtZm9ybXVsYStmc2hhcnArZmFjdG9yK2ZhbHNlK2ZpcmVzdG9yZS1zZWN1cml0eS1ydWxlcytmbG93K2ZvcnRyYW4rZnRsK2dtbCtnYXArZ2NvZGUrZ2RzY3JpcHQrZ2VkY29tK2dldHRleHQrZ2hlcmtpbitnaXQrZ2xzbCtnbitsaW5rZXItc2NyaXB0K2dvK2dvLW1vZHVsZStncmFkbGUrZ3JhcGhxbCtncm9vdnkraGFtbCtoYW5kbGViYXJzK2hhc2tlbGwraGF4ZStoY2wraGxzbCtob29uK2h0dHAraHBrcCtoc3RzK2ljaGlnb2phbStpY29uK2ljdS1tZXNzYWdlLWZvcm1hdCtpZHJpcytpZ25vcmUraW5mb3JtNytpbmkraW8raitqYXZhK2phdmFkb2MramF2YWRvY2xpa2UramF2YXN0YWNrdHJhY2UramV4bCtqb2xpZStqcStqc2RvYytqcy1leHRyYXMranNvbitqc29uNStqc29ucCtqc3N0YWNrdHJhY2UranMtdGVtcGxhdGVzK2p1bGlhK2tlZXBhbGl2ZWQra2V5bWFuK2tvdGxpbitrdW1pcitrdXN0bytsYXRleCtsYXR0ZStsZXNzK2xpbHlwb25kK2xpcXVpZCtsaXNwK2xpdmVzY3JpcHQrbGx2bStsb2crbG9sY29kZStsdWErbWFnbWErbWFrZWZpbGUrbWFya2Rvd24rbWFya3VwLXRlbXBsYXRpbmcrbWF0YSttYXRsYWIrbWF4c2NyaXB0K21lbCttZXJtYWlkK21pemFyK21vbmdvZGIrbW9ua2V5K21vb25zY3JpcHQrbjFxbCtuNGpzK25hbmQydGV0cmlzLWhkbCtuYW5pc2NyaXB0K25hc20rbmVvbituZXZvZCtuZ2lueCtuaW0rbml4K25zaXMrb2JqZWN0aXZlYytvY2FtbCtvZGluK29wZW5jbCtvcGVucWFzbStveitwYXJpZ3ArcGFyc2VyK3Bhc2NhbCtwYXNjYWxpZ28rcHNsK3BjYXhpcytwZW9wbGVjb2RlK3BlcmwrcGhwK3BocGRvYytwaHAtZXh0cmFzK3BsYW50LXVtbCtwbHNxbCtwb3dlcnF1ZXJ5K3Bvd2Vyc2hlbGwrcHJvY2Vzc2luZytwcm9sb2crcHJvbXFsK3Byb3BlcnRpZXMrcHJvdG9idWYrcHVnK3B1cHBldCtwdXJlK3B1cmViYXNpYytwdXJlc2NyaXB0K3B5dGhvbitxc2hhcnArcStxbWwrcW9yZStyK3JhY2tldCtjc2h0bWwranN4K3RzeCtyZWFzb24rcmVnZXgrcmVnbytyZW5weStyZXNjcmlwdCtyZXN0K3JpcCtyb2JvY29uZityb2JvdGZyYW1ld29yaytydWJ5K3J1c3Qrc2FzK3Nhc3Mrc2NzcytzY2FsYStzY2hlbWUrc2hlbGwtc2Vzc2lvbitzbWFsaStzbWFsbHRhbGsrc21hcnR5K3NtbCtzb2xpZGl0eStzb2x1dGlvbi1maWxlK3NveStzcGFycWwrc3BsdW5rLXNwbCtzcWYrc3FsK3NxdWlycmVsK3N0YW4rc3RhdGEraWVjc3Qrc3R5bHVzK3N1cGVyY29sbGlkZXIrc3dpZnQrc3lzdGVtZCt0NC10ZW1wbGF0aW5nK3Q0LWNzK3Q0LXZiK3RhcCt0Y2wrdHQyK3RleHRpbGUrdG9tbCt0cmVtb3IrdHVydGxlK3R3aWcrdHlwZXNjcmlwdCt0eXBvc2NyaXB0K3VucmVhbHNjcmlwdCt1b3Jhem9yK3VyaSt2K3ZhbGErdmJuZXQrdmVsb2NpdHkrdmVyaWxvZyt2aGRsK3ZpbSt2aXN1YWwtYmFzaWMrd2FycHNjcmlwdCt3YXNtK3dlYi1pZGwrd2dzbCt3aWtpK3dvbGZyYW0rd3Jlbit4ZW9yYSt4bWwtZG9jK3hvam8reHF1ZXJ5K3lhbWwreWFuZyt6aWcmcGx1Z2lucz1saW5lLW51bWJlcnMrZmlsZS1oaWdobGlnaHQgKi9cbi8vLyA8cmVmZXJlbmNlIGxpYj1cIldlYldvcmtlclwiLz5cblxudmFyIF9zZWxmID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKVxuXHQ/IHdpbmRvdyAgIC8vIGlmIGluIGJyb3dzZXJcblx0OiAoXG5cdFx0KHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlKVxuXHRcdFx0PyBzZWxmIC8vIGlmIGluIHdvcmtlclxuXHRcdFx0OiB7fSAgIC8vIGlmIGluIG5vZGUganNcblx0KTtcblxuLyoqXG4gKiBQcmlzbTogTGlnaHR3ZWlnaHQsIHJvYnVzdCwgZWxlZ2FudCBzeW50YXggaGlnaGxpZ2h0aW5nXG4gKlxuICogQGxpY2Vuc2UgTUlUIDxodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD5cbiAqIEBhdXRob3IgTGVhIFZlcm91IDxodHRwczovL2xlYS52ZXJvdS5tZT5cbiAqIEBuYW1lc3BhY2VcbiAqIEBwdWJsaWNcbiAqL1xudmFyIFByaXNtID0gKGZ1bmN0aW9uIChfc2VsZikge1xuXG5cdC8vIFByaXZhdGUgaGVscGVyIHZhcnNcblx0dmFyIGxhbmcgPSAvKD86XnxcXHMpbGFuZyg/OnVhZ2UpPy0oW1xcdy1dKykoPz1cXHN8JCkvaTtcblx0dmFyIHVuaXF1ZUlkID0gMDtcblxuXHQvLyBUaGUgZ3JhbW1hciBvYmplY3QgZm9yIHBsYWludGV4dFxuXHR2YXIgcGxhaW5UZXh0R3JhbW1hciA9IHt9O1xuXG5cblx0dmFyIF8gPSB7XG5cdFx0LyoqXG5cdFx0ICogQnkgZGVmYXVsdCwgUHJpc20gd2lsbCBhdHRlbXB0IHRvIGhpZ2hsaWdodCBhbGwgY29kZSBlbGVtZW50cyAoYnkgY2FsbGluZyB7QGxpbmsgUHJpc20uaGlnaGxpZ2h0QWxsfSkgb24gdGhlXG5cdFx0ICogY3VycmVudCBwYWdlIGFmdGVyIHRoZSBwYWdlIGZpbmlzaGVkIGxvYWRpbmcuIFRoaXMgbWlnaHQgYmUgYSBwcm9ibGVtIGlmIGUuZy4geW91IHdhbnRlZCB0byBhc3luY2hyb25vdXNseSBsb2FkXG5cdFx0ICogYWRkaXRpb25hbCBsYW5ndWFnZXMgb3IgcGx1Z2lucyB5b3Vyc2VsZi5cblx0XHQgKlxuXHRcdCAqIEJ5IHNldHRpbmcgdGhpcyB2YWx1ZSB0byBgdHJ1ZWAsIFByaXNtIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgaGlnaGxpZ2h0IGFsbCBjb2RlIGVsZW1lbnRzIG9uIHRoZSBwYWdlLlxuXHRcdCAqXG5cdFx0ICogWW91IG9idmlvdXNseSBoYXZlIHRvIGNoYW5nZSB0aGlzIHZhbHVlIGJlZm9yZSB0aGUgYXV0b21hdGljIGhpZ2hsaWdodGluZyBzdGFydGVkLiBUbyBkbyB0aGlzLCB5b3UgY2FuIGFkZCBhblxuXHRcdCAqIGVtcHR5IFByaXNtIG9iamVjdCBpbnRvIHRoZSBnbG9iYWwgc2NvcGUgYmVmb3JlIGxvYWRpbmcgdGhlIFByaXNtIHNjcmlwdCBsaWtlIHRoaXM6XG5cdFx0ICpcblx0XHQgKiBgYGBqc1xuXHRcdCAqIHdpbmRvdy5QcmlzbSA9IHdpbmRvdy5QcmlzbSB8fCB7fTtcblx0XHQgKiBQcmlzbS5tYW51YWwgPSB0cnVlO1xuXHRcdCAqIC8vIGFkZCBhIG5ldyA8c2NyaXB0PiB0byBsb2FkIFByaXNtJ3Mgc2NyaXB0XG5cdFx0ICogYGBgXG5cdFx0ICpcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxuXHRcdCAqIEBtZW1iZXJvZiBQcmlzbVxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKi9cblx0XHRtYW51YWw6IF9zZWxmLlByaXNtICYmIF9zZWxmLlByaXNtLm1hbnVhbCxcblx0XHQvKipcblx0XHQgKiBCeSBkZWZhdWx0LCBpZiBQcmlzbSBpcyBpbiBhIHdlYiB3b3JrZXIsIGl0IGFzc3VtZXMgdGhhdCBpdCBpcyBpbiBhIHdvcmtlciBpdCBjcmVhdGVkIGl0c2VsZiwgc28gaXQgdXNlc1xuXHRcdCAqIGBhZGRFdmVudExpc3RlbmVyYCB0byBjb21tdW5pY2F0ZSB3aXRoIGl0cyBwYXJlbnQgaW5zdGFuY2UuIEhvd2V2ZXIsIGlmIHlvdSdyZSB1c2luZyBQcmlzbSBtYW51YWxseSBpbiB5b3VyXG5cdFx0ICogb3duIHdvcmtlciwgeW91IGRvbid0IHdhbnQgaXQgdG8gZG8gdGhpcy5cblx0XHQgKlxuXHRcdCAqIEJ5IHNldHRpbmcgdGhpcyB2YWx1ZSB0byBgdHJ1ZWAsIFByaXNtIHdpbGwgbm90IGFkZCBpdHMgb3duIGxpc3RlbmVycyB0byB0aGUgd29ya2VyLlxuXHRcdCAqXG5cdFx0ICogWW91IG9idmlvdXNseSBoYXZlIHRvIGNoYW5nZSB0aGlzIHZhbHVlIGJlZm9yZSBQcmlzbSBleGVjdXRlcy4gVG8gZG8gdGhpcywgeW91IGNhbiBhZGQgYW5cblx0XHQgKiBlbXB0eSBQcmlzbSBvYmplY3QgaW50byB0aGUgZ2xvYmFsIHNjb3BlIGJlZm9yZSBsb2FkaW5nIHRoZSBQcmlzbSBzY3JpcHQgbGlrZSB0aGlzOlxuXHRcdCAqXG5cdFx0ICogYGBganNcblx0XHQgKiB3aW5kb3cuUHJpc20gPSB3aW5kb3cuUHJpc20gfHwge307XG5cdFx0ICogUHJpc20uZGlzYWJsZVdvcmtlck1lc3NhZ2VIYW5kbGVyID0gdHJ1ZTtcblx0XHQgKiAvLyBMb2FkIFByaXNtJ3Mgc2NyaXB0XG5cdFx0ICogYGBgXG5cdFx0ICpcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxuXHRcdCAqIEBtZW1iZXJvZiBQcmlzbVxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKi9cblx0XHRkaXNhYmxlV29ya2VyTWVzc2FnZUhhbmRsZXI6IF9zZWxmLlByaXNtICYmIF9zZWxmLlByaXNtLmRpc2FibGVXb3JrZXJNZXNzYWdlSGFuZGxlcixcblxuXHRcdC8qKlxuXHRcdCAqIEEgbmFtZXNwYWNlIGZvciB1dGlsaXR5IG1ldGhvZHMuXG5cdFx0ICpcblx0XHQgKiBBbGwgZnVuY3Rpb24gaW4gdGhpcyBuYW1lc3BhY2UgdGhhdCBhcmUgbm90IGV4cGxpY2l0bHkgbWFya2VkIGFzIF9wdWJsaWNfIGFyZSBmb3IgX19pbnRlcm5hbCB1c2Ugb25seV9fIGFuZCBtYXlcblx0XHQgKiBjaGFuZ2Ugb3IgZGlzYXBwZWFyIGF0IGFueSB0aW1lLlxuXHRcdCAqXG5cdFx0ICogQG5hbWVzcGFjZVxuXHRcdCAqIEBtZW1iZXJvZiBQcmlzbVxuXHRcdCAqL1xuXHRcdHV0aWw6IHtcblx0XHRcdGVuY29kZTogZnVuY3Rpb24gZW5jb2RlKHRva2Vucykge1xuXHRcdFx0XHRpZiAodG9rZW5zIGluc3RhbmNlb2YgVG9rZW4pIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFRva2VuKHRva2Vucy50eXBlLCBlbmNvZGUodG9rZW5zLmNvbnRlbnQpLCB0b2tlbnMuYWxpYXMpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodG9rZW5zKSkge1xuXHRcdFx0XHRcdHJldHVybiB0b2tlbnMubWFwKGVuY29kZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRva2Vucy5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC9cXHUwMGEwL2csICcgJyk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gdmFsdWUuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHthbnl9IG9cblx0XHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdFx0XHQgKiBAZXhhbXBsZVxuXHRcdFx0ICogdHlwZShudWxsKSAgICAgID09PSAnTnVsbCdcblx0XHRcdCAqIHR5cGUodW5kZWZpbmVkKSA9PT0gJ1VuZGVmaW5lZCdcblx0XHRcdCAqIHR5cGUoMTIzKSAgICAgICA9PT0gJ051bWJlcidcblx0XHRcdCAqIHR5cGUoJ2ZvbycpICAgICA9PT0gJ1N0cmluZydcblx0XHRcdCAqIHR5cGUodHJ1ZSkgICAgICA9PT0gJ0Jvb2xlYW4nXG5cdFx0XHQgKiB0eXBlKFsxLCAyXSkgICAgPT09ICdBcnJheSdcblx0XHRcdCAqIHR5cGUoe30pICAgICAgICA9PT0gJ09iamVjdCdcblx0XHRcdCAqIHR5cGUoU3RyaW5nKSAgICA9PT0gJ0Z1bmN0aW9uJ1xuXHRcdFx0ICogdHlwZSgvYWJjKy8pICAgID09PSAnUmVnRXhwJ1xuXHRcdFx0ICovXG5cdFx0XHR0eXBlOiBmdW5jdGlvbiAobykge1xuXHRcdFx0XHRyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogUmV0dXJucyBhIHVuaXF1ZSBudW1iZXIgZm9yIHRoZSBnaXZlbiBvYmplY3QuIExhdGVyIGNhbGxzIHdpbGwgc3RpbGwgcmV0dXJuIHRoZSBzYW1lIG51bWJlci5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gb2JqXG5cdFx0XHQgKiBAcmV0dXJucyB7bnVtYmVyfVxuXHRcdFx0ICovXG5cdFx0XHRvYmpJZDogZnVuY3Rpb24gKG9iaikge1xuXHRcdFx0XHRpZiAoIW9ialsnX19pZCddKSB7XG5cdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgJ19faWQnLCB7IHZhbHVlOiArK3VuaXF1ZUlkIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBvYmpbJ19faWQnXTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQ3JlYXRlcyBhIGRlZXAgY2xvbmUgb2YgdGhlIGdpdmVuIG9iamVjdC5cblx0XHRcdCAqXG5cdFx0XHQgKiBUaGUgbWFpbiBpbnRlbmRlZCB1c2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBjbG9uZSBsYW5ndWFnZSBkZWZpbml0aW9ucy5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge1R9IG9cblx0XHRcdCAqIEBwYXJhbSB7UmVjb3JkPG51bWJlciwgYW55Pn0gW3Zpc2l0ZWRdXG5cdFx0XHQgKiBAcmV0dXJucyB7VH1cblx0XHRcdCAqIEB0ZW1wbGF0ZSBUXG5cdFx0XHQgKi9cblx0XHRcdGNsb25lOiBmdW5jdGlvbiBkZWVwQ2xvbmUobywgdmlzaXRlZCkge1xuXHRcdFx0XHR2aXNpdGVkID0gdmlzaXRlZCB8fCB7fTtcblxuXHRcdFx0XHR2YXIgY2xvbmU7IHZhciBpZDtcblx0XHRcdFx0c3dpdGNoIChfLnV0aWwudHlwZShvKSkge1xuXHRcdFx0XHRcdGNhc2UgJ09iamVjdCc6XG5cdFx0XHRcdFx0XHRpZCA9IF8udXRpbC5vYmpJZChvKTtcblx0XHRcdFx0XHRcdGlmICh2aXNpdGVkW2lkXSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmlzaXRlZFtpZF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjbG9uZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKHt9KTtcblx0XHRcdFx0XHRcdHZpc2l0ZWRbaWRdID0gY2xvbmU7XG5cblx0XHRcdFx0XHRcdGZvciAodmFyIGtleSBpbiBvKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdFx0XHRcdFx0XHRjbG9uZVtrZXldID0gZGVlcENsb25lKG9ba2V5XSwgdmlzaXRlZCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyAoY2xvbmUpO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQXJyYXknOlxuXHRcdFx0XHRcdFx0aWQgPSBfLnV0aWwub2JqSWQobyk7XG5cdFx0XHRcdFx0XHRpZiAodmlzaXRlZFtpZF0pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZpc2l0ZWRbaWRdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y2xvbmUgPSBbXTtcblx0XHRcdFx0XHRcdHZpc2l0ZWRbaWRdID0gY2xvbmU7XG5cblx0XHRcdFx0XHRcdCgvKiogQHR5cGUge0FycmF5fSAqLygvKiogQHR5cGUge2FueX0gKi8obykpKS5mb3JFYWNoKGZ1bmN0aW9uICh2LCBpKSB7XG5cdFx0XHRcdFx0XHRcdGNsb25lW2ldID0gZGVlcENsb25lKHYsIHZpc2l0ZWQpO1xuXHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdHJldHVybiAvKiogQHR5cGUge2FueX0gKi8gKGNsb25lKTtcblxuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRyZXR1cm4gbztcblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBSZXR1cm5zIHRoZSBQcmlzbSBsYW5ndWFnZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBzZXQgYnkgYSBgbGFuZ3VhZ2UteHh4eGAgb3IgYGxhbmcteHh4eGAgY2xhc3MuXG5cdFx0XHQgKlxuXHRcdFx0ICogSWYgbm8gbGFuZ3VhZ2UgaXMgc2V0IGZvciB0aGUgZWxlbWVudCBvciB0aGUgZWxlbWVudCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIGBub25lYCB3aWxsIGJlIHJldHVybmVkLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuXHRcdFx0ICogQHJldHVybnMge3N0cmluZ31cblx0XHRcdCAqL1xuXHRcdFx0Z2V0TGFuZ3VhZ2U6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG5cdFx0XHRcdHdoaWxlIChlbGVtZW50KSB7XG5cdFx0XHRcdFx0dmFyIG0gPSBsYW5nLmV4ZWMoZWxlbWVudC5jbGFzc05hbWUpO1xuXHRcdFx0XHRcdGlmIChtKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbVsxXS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiAnbm9uZSc7XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIFNldHMgdGhlIFByaXNtIGBsYW5ndWFnZS14eHh4YCBjbGFzcyBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcblx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZVxuXHRcdFx0ICogQHJldHVybnMge3ZvaWR9XG5cdFx0XHQgKi9cblx0XHRcdHNldExhbmd1YWdlOiBmdW5jdGlvbiAoZWxlbWVudCwgbGFuZ3VhZ2UpIHtcblx0XHRcdFx0Ly8gcmVtb3ZlIGFsbCBgbGFuZ3VhZ2UteHh4eGAgY2xhc3Nlc1xuXHRcdFx0XHQvLyAodGhpcyBtaWdodCBsZWF2ZSBiZWhpbmQgYSBsZWFkaW5nIHNwYWNlKVxuXHRcdFx0XHRlbGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoUmVnRXhwKGxhbmcsICdnaScpLCAnJyk7XG5cblx0XHRcdFx0Ly8gYWRkIHRoZSBuZXcgYGxhbmd1YWdlLXh4eHhgIGNsYXNzXG5cdFx0XHRcdC8vICh1c2luZyBgY2xhc3NMaXN0YCB3aWxsIGF1dG9tYXRpY2FsbHkgY2xlYW4gdXAgc3BhY2VzIGZvciB1cylcblx0XHRcdFx0ZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsYW5ndWFnZS0nICsgbGFuZ3VhZ2UpO1xuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBSZXR1cm5zIHRoZSBzY3JpcHQgZWxlbWVudCB0aGF0IGlzIGN1cnJlbnRseSBleGVjdXRpbmcuXG5cdFx0XHQgKlxuXHRcdFx0ICogVGhpcyBkb2VzIF9fbm90X18gd29yayBmb3IgbGluZSBzY3JpcHQgZWxlbWVudC5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcmV0dXJucyB7SFRNTFNjcmlwdEVsZW1lbnQgfCBudWxsfVxuXHRcdFx0ICovXG5cdFx0XHRjdXJyZW50U2NyaXB0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCdjdXJyZW50U2NyaXB0JyBpbiBkb2N1bWVudCAmJiAxIDwgMiAvKiBoYWNrIHRvIHRyaXAgVFMnIGZsb3cgYW5hbHlzaXMgKi8pIHtcblx0XHRcdFx0XHRyZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovIChkb2N1bWVudC5jdXJyZW50U2NyaXB0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIElFMTEgd29ya2Fyb3VuZFxuXHRcdFx0XHQvLyB3ZSdsbCBnZXQgdGhlIHNyYyBvZiB0aGUgY3VycmVudCBzY3JpcHQgYnkgcGFyc2luZyBJRTExJ3MgZXJyb3Igc3RhY2sgdHJhY2Vcblx0XHRcdFx0Ly8gdGhpcyB3aWxsIG5vdCB3b3JrIGZvciBpbmxpbmUgc2NyaXB0c1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCk7XG5cdFx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRcdC8vIEdldCBmaWxlIHNyYyB1cmwgZnJvbSBzdGFjay4gU3BlY2lmaWNhbGx5IHdvcmtzIHdpdGggdGhlIGZvcm1hdCBvZiBzdGFjayB0cmFjZXMgaW4gSUUuXG5cdFx0XHRcdFx0Ly8gQSBzdGFjayB3aWxsIGxvb2sgbGlrZSB0aGlzOlxuXHRcdFx0XHRcdC8vXG5cdFx0XHRcdFx0Ly8gRXJyb3Jcblx0XHRcdFx0XHQvLyAgICBhdCBfLnV0aWwuY3VycmVudFNjcmlwdCAoaHR0cDovL2xvY2FsaG9zdC9jb21wb25lbnRzL3ByaXNtLWNvcmUuanM6MTE5OjUpXG5cdFx0XHRcdFx0Ly8gICAgYXQgR2xvYmFsIGNvZGUgKGh0dHA6Ly9sb2NhbGhvc3QvY29tcG9uZW50cy9wcmlzbS1jb3JlLmpzOjYwNjoxKVxuXG5cdFx0XHRcdFx0dmFyIHNyYyA9ICgvYXQgW14oXFxyXFxuXSpcXCgoLiopOlteOl0rOlteOl0rXFwpJC9pLmV4ZWMoZXJyLnN0YWNrKSB8fCBbXSlbMV07XG5cdFx0XHRcdFx0aWYgKHNyYykge1xuXHRcdFx0XHRcdFx0dmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7XG5cdFx0XHRcdFx0XHRmb3IgKHZhciBpIGluIHNjcmlwdHMpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHNjcmlwdHNbaV0uc3JjID09IHNyYykge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBzY3JpcHRzW2ldO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIFJldHVybnMgd2hldGhlciBhIGdpdmVuIGNsYXNzIGlzIGFjdGl2ZSBmb3IgYGVsZW1lbnRgLlxuXHRcdFx0ICpcblx0XHRcdCAqIFRoZSBjbGFzcyBjYW4gYmUgYWN0aXZhdGVkIGlmIGBlbGVtZW50YCBvciBvbmUgb2YgaXRzIGFuY2VzdG9ycyBoYXMgdGhlIGdpdmVuIGNsYXNzIGFuZCBpdCBjYW4gYmUgZGVhY3RpdmF0ZWRcblx0XHRcdCAqIGlmIGBlbGVtZW50YCBvciBvbmUgb2YgaXRzIGFuY2VzdG9ycyBoYXMgdGhlIG5lZ2F0ZWQgdmVyc2lvbiBvZiB0aGUgZ2l2ZW4gY2xhc3MuIFRoZSBfbmVnYXRlZCB2ZXJzaW9uXyBvZiB0aGVcblx0XHRcdCAqIGdpdmVuIGNsYXNzIGlzIGp1c3QgdGhlIGdpdmVuIGNsYXNzIHdpdGggYSBgbm8tYCBwcmVmaXguXG5cdFx0XHQgKlxuXHRcdFx0ICogV2hldGhlciB0aGUgY2xhc3MgaXMgYWN0aXZlIGlzIGRldGVybWluZWQgYnkgdGhlIGNsb3Nlc3QgYW5jZXN0b3Igb2YgYGVsZW1lbnRgICh3aGVyZSBgZWxlbWVudGAgaXRzZWxmIGlzXG5cdFx0XHQgKiBjbG9zZXN0IGFuY2VzdG9yKSB0aGF0IGhhcyB0aGUgZ2l2ZW4gY2xhc3Mgb3IgdGhlIG5lZ2F0ZWQgdmVyc2lvbiBvZiBpdC4gSWYgbmVpdGhlciBgZWxlbWVudGAgbm9yIGFueSBvZiBpdHNcblx0XHRcdCAqIGFuY2VzdG9ycyBoYXZlIHRoZSBnaXZlbiBjbGFzcyBvciB0aGUgbmVnYXRlZCB2ZXJzaW9uIG9mIGl0LCB0aGVuIHRoZSBkZWZhdWx0IGFjdGl2YXRpb24gd2lsbCBiZSByZXR1cm5lZC5cblx0XHRcdCAqXG5cdFx0XHQgKiBJbiB0aGUgcGFyYWRveGljYWwgc2l0dWF0aW9uIHdoZXJlIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGNvbnRhaW5zIF9fYm90aF9fIHRoZSBnaXZlbiBjbGFzcyBhbmQgdGhlIG5lZ2F0ZWRcblx0XHRcdCAqIHZlcnNpb24gb2YgaXQsIHRoZSBjbGFzcyBpcyBjb25zaWRlcmVkIGFjdGl2ZS5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcblx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWVcblx0XHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RlZmF1bHRBY3RpdmF0aW9uPWZhbHNlXVxuXHRcdFx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdFx0XHQgKi9cblx0XHRcdGlzQWN0aXZlOiBmdW5jdGlvbiAoZWxlbWVudCwgY2xhc3NOYW1lLCBkZWZhdWx0QWN0aXZhdGlvbikge1xuXHRcdFx0XHR2YXIgbm8gPSAnbm8tJyArIGNsYXNzTmFtZTtcblxuXHRcdFx0XHR3aGlsZSAoZWxlbWVudCkge1xuXHRcdFx0XHRcdHZhciBjbGFzc0xpc3QgPSBlbGVtZW50LmNsYXNzTGlzdDtcblx0XHRcdFx0XHRpZiAoY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoY2xhc3NMaXN0LmNvbnRhaW5zKG5vKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiAhIWRlZmF1bHRBY3RpdmF0aW9uO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBUaGlzIG5hbWVzcGFjZSBjb250YWlucyBhbGwgY3VycmVudGx5IGxvYWRlZCBsYW5ndWFnZXMgYW5kIHRoZSBzb21lIGhlbHBlciBmdW5jdGlvbnMgdG8gY3JlYXRlIGFuZCBtb2RpZnkgbGFuZ3VhZ2VzLlxuXHRcdCAqXG5cdFx0ICogQG5hbWVzcGFjZVxuXHRcdCAqIEBtZW1iZXJvZiBQcmlzbVxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKi9cblx0XHRsYW5ndWFnZXM6IHtcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIGdyYW1tYXIgZm9yIHBsYWluLCB1bmZvcm1hdHRlZCB0ZXh0LlxuXHRcdFx0ICovXG5cdFx0XHRwbGFpbjogcGxhaW5UZXh0R3JhbW1hcixcblx0XHRcdHBsYWludGV4dDogcGxhaW5UZXh0R3JhbW1hcixcblx0XHRcdHRleHQ6IHBsYWluVGV4dEdyYW1tYXIsXG5cdFx0XHR0eHQ6IHBsYWluVGV4dEdyYW1tYXIsXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQ3JlYXRlcyBhIGRlZXAgY29weSBvZiB0aGUgbGFuZ3VhZ2Ugd2l0aCB0aGUgZ2l2ZW4gaWQgYW5kIGFwcGVuZHMgdGhlIGdpdmVuIHRva2Vucy5cblx0XHRcdCAqXG5cdFx0XHQgKiBJZiBhIHRva2VuIGluIGByZWRlZmAgYWxzbyBhcHBlYXJzIGluIHRoZSBjb3BpZWQgbGFuZ3VhZ2UsIHRoZW4gdGhlIGV4aXN0aW5nIHRva2VuIGluIHRoZSBjb3BpZWQgbGFuZ3VhZ2Vcblx0XHRcdCAqIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYXQgaXRzIG9yaWdpbmFsIHBvc2l0aW9uLlxuXHRcdFx0ICpcblx0XHRcdCAqICMjIEJlc3QgcHJhY3RpY2VzXG5cdFx0XHQgKlxuXHRcdFx0ICogU2luY2UgdGhlIHBvc2l0aW9uIG9mIG92ZXJ3cml0aW5nIHRva2VucyAodG9rZW4gaW4gYHJlZGVmYCB0aGF0IG92ZXJ3cml0ZSB0b2tlbnMgaW4gdGhlIGNvcGllZCBsYW5ndWFnZSlcblx0XHRcdCAqIGRvZXNuJ3QgbWF0dGVyLCB0aGV5IGNhbiB0ZWNobmljYWxseSBiZSBpbiBhbnkgb3JkZXIuIEhvd2V2ZXIsIHRoaXMgY2FuIGJlIGNvbmZ1c2luZyB0byBvdGhlcnMgdGhhdCB0cnlpbmcgdG9cblx0XHRcdCAqIHVuZGVyc3RhbmQgdGhlIGxhbmd1YWdlIGRlZmluaXRpb24gYmVjYXVzZSwgbm9ybWFsbHksIHRoZSBvcmRlciBvZiB0b2tlbnMgbWF0dGVycyBpbiBQcmlzbSBncmFtbWFycy5cblx0XHRcdCAqXG5cdFx0XHQgKiBUaGVyZWZvcmUsIGl0IGlzIGVuY291cmFnZWQgdG8gb3JkZXIgb3ZlcndyaXRpbmcgdG9rZW5zIGFjY29yZGluZyB0byB0aGUgcG9zaXRpb25zIG9mIHRoZSBvdmVyd3JpdHRlbiB0b2tlbnMuXG5cdFx0XHQgKiBGdXJ0aGVybW9yZSwgYWxsIG5vbi1vdmVyd3JpdGluZyB0b2tlbnMgc2hvdWxkIGJlIHBsYWNlZCBhZnRlciB0aGUgb3ZlcndyaXRpbmcgb25lcy5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIGlkIG9mIHRoZSBsYW5ndWFnZSB0byBleHRlbmQuIFRoaXMgaGFzIHRvIGJlIGEga2V5IGluIGBQcmlzbS5sYW5ndWFnZXNgLlxuXHRcdFx0ICogQHBhcmFtIHtHcmFtbWFyfSByZWRlZiBUaGUgbmV3IHRva2VucyB0byBhcHBlbmQuXG5cdFx0XHQgKiBAcmV0dXJucyB7R3JhbW1hcn0gVGhlIG5ldyBsYW5ndWFnZSBjcmVhdGVkLlxuXHRcdFx0ICogQHB1YmxpY1xuXHRcdFx0ICogQGV4YW1wbGVcblx0XHRcdCAqIFByaXNtLmxhbmd1YWdlc1snY3NzLXdpdGgtY29sb3JzJ10gPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjc3MnLCB7XG5cdFx0XHQgKiAgICAgLy8gUHJpc20ubGFuZ3VhZ2VzLmNzcyBhbHJlYWR5IGhhcyBhICdjb21tZW50JyB0b2tlbiwgc28gdGhpcyB0b2tlbiB3aWxsIG92ZXJ3cml0ZSBDU1MnICdjb21tZW50JyB0b2tlblxuXHRcdFx0ICogICAgIC8vIGF0IGl0cyBvcmlnaW5hbCBwb3NpdGlvblxuXHRcdFx0ICogICAgICdjb21tZW50JzogeyAuLi4gfSxcblx0XHRcdCAqICAgICAvLyBDU1MgZG9lc24ndCBoYXZlIGEgJ2NvbG9yJyB0b2tlbiwgc28gdGhpcyB0b2tlbiB3aWxsIGJlIGFwcGVuZGVkXG5cdFx0XHQgKiAgICAgJ2NvbG9yJzogL1xcYig/OnJlZHxncmVlbnxibHVlKVxcYi9cblx0XHRcdCAqIH0pO1xuXHRcdFx0ICovXG5cdFx0XHRleHRlbmQ6IGZ1bmN0aW9uIChpZCwgcmVkZWYpIHtcblx0XHRcdFx0dmFyIGxhbmcgPSBfLnV0aWwuY2xvbmUoXy5sYW5ndWFnZXNbaWRdKTtcblxuXHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gcmVkZWYpIHtcblx0XHRcdFx0XHRsYW5nW2tleV0gPSByZWRlZltrZXldO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGxhbmc7XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIEluc2VydHMgdG9rZW5zIF9iZWZvcmVfIGFub3RoZXIgdG9rZW4gaW4gYSBsYW5ndWFnZSBkZWZpbml0aW9uIG9yIGFueSBvdGhlciBncmFtbWFyLlxuXHRcdFx0ICpcblx0XHRcdCAqICMjIFVzYWdlXG5cdFx0XHQgKlxuXHRcdFx0ICogVGhpcyBoZWxwZXIgbWV0aG9kIG1ha2VzIGl0IGVhc3kgdG8gbW9kaWZ5IGV4aXN0aW5nIGxhbmd1YWdlcy4gRm9yIGV4YW1wbGUsIHRoZSBDU1MgbGFuZ3VhZ2UgZGVmaW5pdGlvblxuXHRcdFx0ICogbm90IG9ubHkgZGVmaW5lcyBDU1MgaGlnaGxpZ2h0aW5nIGZvciBDU1MgZG9jdW1lbnRzLCBidXQgYWxzbyBuZWVkcyB0byBkZWZpbmUgaGlnaGxpZ2h0aW5nIGZvciBDU1MgZW1iZWRkZWRcblx0XHRcdCAqIGluIEhUTUwgdGhyb3VnaCBgPHN0eWxlPmAgZWxlbWVudHMuIFRvIGRvIHRoaXMsIGl0IG5lZWRzIHRvIG1vZGlmeSBgUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cGAgYW5kIGFkZCB0aGVcblx0XHRcdCAqIGFwcHJvcHJpYXRlIHRva2Vucy4gSG93ZXZlciwgYFByaXNtLmxhbmd1YWdlcy5tYXJrdXBgIGlzIGEgcmVndWxhciBKYXZhU2NyaXB0IG9iamVjdCBsaXRlcmFsLCBzbyBpZiB5b3UgZG9cblx0XHRcdCAqIHRoaXM6XG5cdFx0XHQgKlxuXHRcdFx0ICogYGBganNcblx0XHRcdCAqIFByaXNtLmxhbmd1YWdlcy5tYXJrdXAuc3R5bGUgPSB7XG5cdFx0XHQgKiAgICAgLy8gdG9rZW5cblx0XHRcdCAqIH07XG5cdFx0XHQgKiBgYGBcblx0XHRcdCAqXG5cdFx0XHQgKiB0aGVuIHRoZSBgc3R5bGVgIHRva2VuIHdpbGwgYmUgYWRkZWQgKGFuZCBwcm9jZXNzZWQpIGF0IHRoZSBlbmQuIGBpbnNlcnRCZWZvcmVgIGFsbG93cyB5b3UgdG8gaW5zZXJ0IHRva2Vuc1xuXHRcdFx0ICogYmVmb3JlIGV4aXN0aW5nIHRva2Vucy4gRm9yIHRoZSBDU1MgZXhhbXBsZSBhYm92ZSwgeW91IHdvdWxkIHVzZSBpdCBsaWtlIHRoaXM6XG5cdFx0XHQgKlxuXHRcdFx0ICogYGBganNcblx0XHRcdCAqIFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ21hcmt1cCcsICdjZGF0YScsIHtcblx0XHRcdCAqICAgICAnc3R5bGUnOiB7XG5cdFx0XHQgKiAgICAgICAgIC8vIHRva2VuXG5cdFx0XHQgKiAgICAgfVxuXHRcdFx0ICogfSk7XG5cdFx0XHQgKiBgYGBcblx0XHRcdCAqXG5cdFx0XHQgKiAjIyBTcGVjaWFsIGNhc2VzXG5cdFx0XHQgKlxuXHRcdFx0ICogSWYgdGhlIGdyYW1tYXJzIG9mIGBpbnNpZGVgIGFuZCBgaW5zZXJ0YCBoYXZlIHRva2VucyB3aXRoIHRoZSBzYW1lIG5hbWUsIHRoZSB0b2tlbnMgaW4gYGluc2lkZWAncyBncmFtbWFyXG5cdFx0XHQgKiB3aWxsIGJlIGlnbm9yZWQuXG5cdFx0XHQgKlxuXHRcdFx0ICogVGhpcyBiZWhhdmlvciBjYW4gYmUgdXNlZCB0byBpbnNlcnQgdG9rZW5zIGFmdGVyIGBiZWZvcmVgOlxuXHRcdFx0ICpcblx0XHRcdCAqIGBgYGpzXG5cdFx0XHQgKiBQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdtYXJrdXAnLCAnY29tbWVudCcsIHtcblx0XHRcdCAqICAgICAnY29tbWVudCc6IFByaXNtLmxhbmd1YWdlcy5tYXJrdXAuY29tbWVudCxcblx0XHRcdCAqICAgICAvLyB0b2tlbnMgYWZ0ZXIgJ2NvbW1lbnQnXG5cdFx0XHQgKiB9KTtcblx0XHRcdCAqIGBgYFxuXHRcdFx0ICpcblx0XHRcdCAqICMjIExpbWl0YXRpb25zXG5cdFx0XHQgKlxuXHRcdFx0ICogVGhlIG1haW4gcHJvYmxlbSBgaW5zZXJ0QmVmb3JlYCBoYXMgdG8gc29sdmUgaXMgaXRlcmF0aW9uIG9yZGVyLiBTaW5jZSBFUzIwMTUsIHRoZSBpdGVyYXRpb24gb3JkZXIgZm9yIG9iamVjdFxuXHRcdFx0ICogcHJvcGVydGllcyBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSBpbnNlcnRpb24gb3JkZXIgKGV4Y2VwdCBmb3IgaW50ZWdlciBrZXlzKSBidXQgc29tZSBicm93c2VycyBiZWhhdmVcblx0XHRcdCAqIGRpZmZlcmVudGx5IHdoZW4ga2V5cyBhcmUgZGVsZXRlZCBhbmQgcmUtaW5zZXJ0ZWQuIFNvIGBpbnNlcnRCZWZvcmVgIGNhbid0IGJlIGltcGxlbWVudGVkIGJ5IHRlbXBvcmFyaWx5XG5cdFx0XHQgKiBkZWxldGluZyBwcm9wZXJ0aWVzIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBpbnNlcnQgYXQgYXJiaXRyYXJ5IHBvc2l0aW9ucy5cblx0XHRcdCAqXG5cdFx0XHQgKiBUbyBzb2x2ZSB0aGlzIHByb2JsZW0sIGBpbnNlcnRCZWZvcmVgIGRvZXNuJ3QgYWN0dWFsbHkgaW5zZXJ0IHRoZSBnaXZlbiB0b2tlbnMgaW50byB0aGUgdGFyZ2V0IG9iamVjdC5cblx0XHRcdCAqIEluc3RlYWQsIGl0IHdpbGwgY3JlYXRlIGEgbmV3IG9iamVjdCBhbmQgcmVwbGFjZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBuZXcgb25lLiBUaGlzXG5cdFx0XHQgKiBjYW4gYmUgZG9uZSB3aXRob3V0IHRlbXBvcmFyaWx5IGRlbGV0aW5nIHByb3BlcnRpZXMsIHNvIHRoZSBpdGVyYXRpb24gb3JkZXIgaXMgd2VsbC1kZWZpbmVkLlxuXHRcdFx0ICpcblx0XHRcdCAqIEhvd2V2ZXIsIG9ubHkgcmVmZXJlbmNlcyB0aGF0IGNhbiBiZSByZWFjaGVkIGZyb20gYFByaXNtLmxhbmd1YWdlc2Agb3IgYGluc2VydGAgd2lsbCBiZSByZXBsYWNlZC4gSS5lLiBpZlxuXHRcdFx0ICogeW91IGhvbGQgdGhlIHRhcmdldCBvYmplY3QgaW4gYSB2YXJpYWJsZSwgdGhlbiB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHdpbGwgbm90IGNoYW5nZS5cblx0XHRcdCAqXG5cdFx0XHQgKiBgYGBqc1xuXHRcdFx0ICogdmFyIG9sZE1hcmt1cCA9IFByaXNtLmxhbmd1YWdlcy5tYXJrdXA7XG5cdFx0XHQgKiB2YXIgbmV3TWFya3VwID0gUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnbWFya3VwJywgJ2NvbW1lbnQnLCB7IC4uLiB9KTtcblx0XHRcdCAqXG5cdFx0XHQgKiBhc3NlcnQob2xkTWFya3VwICE9PSBQcmlzbS5sYW5ndWFnZXMubWFya3VwKTtcblx0XHRcdCAqIGFzc2VydChuZXdNYXJrdXAgPT09IFByaXNtLmxhbmd1YWdlcy5tYXJrdXApO1xuXHRcdFx0ICogYGBgXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtzdHJpbmd9IGluc2lkZSBUaGUgcHJvcGVydHkgb2YgYHJvb3RgIChlLmcuIGEgbGFuZ3VhZ2UgaWQgaW4gYFByaXNtLmxhbmd1YWdlc2ApIHRoYXQgY29udGFpbnMgdGhlXG5cdFx0XHQgKiBvYmplY3QgdG8gYmUgbW9kaWZpZWQuXG5cdFx0XHQgKiBAcGFyYW0ge3N0cmluZ30gYmVmb3JlIFRoZSBrZXkgdG8gaW5zZXJ0IGJlZm9yZS5cblx0XHRcdCAqIEBwYXJhbSB7R3JhbW1hcn0gaW5zZXJ0IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBrZXktdmFsdWUgcGFpcnMgdG8gYmUgaW5zZXJ0ZWQuXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IFtyb290XSBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgYGluc2lkZWAsIGkuZS4gdGhlIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZVxuXHRcdFx0ICogb2JqZWN0IHRvIGJlIG1vZGlmaWVkLlxuXHRcdFx0ICpcblx0XHRcdCAqIERlZmF1bHRzIHRvIGBQcmlzbS5sYW5ndWFnZXNgLlxuXHRcdFx0ICogQHJldHVybnMge0dyYW1tYXJ9IFRoZSBuZXcgZ3JhbW1hciBvYmplY3QuXG5cdFx0XHQgKiBAcHVibGljXG5cdFx0XHQgKi9cblx0XHRcdGluc2VydEJlZm9yZTogZnVuY3Rpb24gKGluc2lkZSwgYmVmb3JlLCBpbnNlcnQsIHJvb3QpIHtcblx0XHRcdFx0cm9vdCA9IHJvb3QgfHwgLyoqIEB0eXBlIHthbnl9ICovIChfLmxhbmd1YWdlcyk7XG5cdFx0XHRcdHZhciBncmFtbWFyID0gcm9vdFtpbnNpZGVdO1xuXHRcdFx0XHQvKiogQHR5cGUge0dyYW1tYXJ9ICovXG5cdFx0XHRcdHZhciByZXQgPSB7fTtcblxuXHRcdFx0XHRmb3IgKHZhciB0b2tlbiBpbiBncmFtbWFyKSB7XG5cdFx0XHRcdFx0aWYgKGdyYW1tYXIuaGFzT3duUHJvcGVydHkodG9rZW4pKSB7XG5cblx0XHRcdFx0XHRcdGlmICh0b2tlbiA9PSBiZWZvcmUpIHtcblx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgbmV3VG9rZW4gaW4gaW5zZXJ0KSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGluc2VydC5oYXNPd25Qcm9wZXJ0eShuZXdUb2tlbikpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldFtuZXdUb2tlbl0gPSBpbnNlcnRbbmV3VG9rZW5dO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBEbyBub3QgaW5zZXJ0IHRva2VuIHdoaWNoIGFsc28gb2NjdXIgaW4gaW5zZXJ0LiBTZWUgIzE1MjVcblx0XHRcdFx0XHRcdGlmICghaW5zZXJ0Lmhhc093blByb3BlcnR5KHRva2VuKSkge1xuXHRcdFx0XHRcdFx0XHRyZXRbdG9rZW5dID0gZ3JhbW1hclt0b2tlbl07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIG9sZCA9IHJvb3RbaW5zaWRlXTtcblx0XHRcdFx0cm9vdFtpbnNpZGVdID0gcmV0O1xuXG5cdFx0XHRcdC8vIFVwZGF0ZSByZWZlcmVuY2VzIGluIG90aGVyIGxhbmd1YWdlIGRlZmluaXRpb25zXG5cdFx0XHRcdF8ubGFuZ3VhZ2VzLkRGUyhfLmxhbmd1YWdlcywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0XHRcdFx0XHRpZiAodmFsdWUgPT09IG9sZCAmJiBrZXkgIT0gaW5zaWRlKSB7XG5cdFx0XHRcdFx0XHR0aGlzW2tleV0gPSByZXQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gVHJhdmVyc2UgYSBsYW5ndWFnZSBkZWZpbml0aW9uIHdpdGggRGVwdGggRmlyc3QgU2VhcmNoXG5cdFx0XHRERlM6IGZ1bmN0aW9uIERGUyhvLCBjYWxsYmFjaywgdHlwZSwgdmlzaXRlZCkge1xuXHRcdFx0XHR2aXNpdGVkID0gdmlzaXRlZCB8fCB7fTtcblxuXHRcdFx0XHR2YXIgb2JqSWQgPSBfLnV0aWwub2JqSWQ7XG5cblx0XHRcdFx0Zm9yICh2YXIgaSBpbiBvKSB7XG5cdFx0XHRcdFx0aWYgKG8uaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdFx0XHRcdGNhbGxiYWNrLmNhbGwobywgaSwgb1tpXSwgdHlwZSB8fCBpKTtcblxuXHRcdFx0XHRcdFx0dmFyIHByb3BlcnR5ID0gb1tpXTtcblx0XHRcdFx0XHRcdHZhciBwcm9wZXJ0eVR5cGUgPSBfLnV0aWwudHlwZShwcm9wZXJ0eSk7XG5cblx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eVR5cGUgPT09ICdPYmplY3QnICYmICF2aXNpdGVkW29iaklkKHByb3BlcnR5KV0pIHtcblx0XHRcdFx0XHRcdFx0dmlzaXRlZFtvYmpJZChwcm9wZXJ0eSldID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0REZTKHByb3BlcnR5LCBjYWxsYmFjaywgbnVsbCwgdmlzaXRlZCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5VHlwZSA9PT0gJ0FycmF5JyAmJiAhdmlzaXRlZFtvYmpJZChwcm9wZXJ0eSldKSB7XG5cdFx0XHRcdFx0XHRcdHZpc2l0ZWRbb2JqSWQocHJvcGVydHkpXSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdERGUyhwcm9wZXJ0eSwgY2FsbGJhY2ssIGksIHZpc2l0ZWQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRwbHVnaW5zOiB7fSxcblxuXHRcdC8qKlxuXHRcdCAqIFRoaXMgaXMgdGhlIG1vc3QgaGlnaC1sZXZlbCBmdW5jdGlvbiBpbiBQcmlzbVx1MjAxOXMgQVBJLlxuXHRcdCAqIEl0IGZldGNoZXMgYWxsIHRoZSBlbGVtZW50cyB0aGF0IGhhdmUgYSBgLmxhbmd1YWdlLXh4eHhgIGNsYXNzIGFuZCB0aGVuIGNhbGxzIHtAbGluayBQcmlzbS5oaWdobGlnaHRFbGVtZW50fSBvblxuXHRcdCAqIGVhY2ggb25lIG9mIHRoZW0uXG5cdFx0ICpcblx0XHQgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYFByaXNtLmhpZ2hsaWdodEFsbFVuZGVyKGRvY3VtZW50LCBhc3luYywgY2FsbGJhY2spYC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FzeW5jPWZhbHNlXSBTYW1lIGFzIGluIHtAbGluayBQcmlzbS5oaWdobGlnaHRBbGxVbmRlcn0uXG5cdFx0ICogQHBhcmFtIHtIaWdobGlnaHRDYWxsYmFja30gW2NhbGxiYWNrXSBTYW1lIGFzIGluIHtAbGluayBQcmlzbS5oaWdobGlnaHRBbGxVbmRlcn0uXG5cdFx0ICogQG1lbWJlcm9mIFByaXNtXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqL1xuXHRcdGhpZ2hsaWdodEFsbDogZnVuY3Rpb24gKGFzeW5jLCBjYWxsYmFjaykge1xuXHRcdFx0Xy5oaWdobGlnaHRBbGxVbmRlcihkb2N1bWVudCwgYXN5bmMsIGNhbGxiYWNrKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogRmV0Y2hlcyBhbGwgdGhlIGRlc2NlbmRhbnRzIG9mIGBjb250YWluZXJgIHRoYXQgaGF2ZSBhIGAubGFuZ3VhZ2UteHh4eGAgY2xhc3MgYW5kIHRoZW4gY2FsbHNcblx0XHQgKiB7QGxpbmsgUHJpc20uaGlnaGxpZ2h0RWxlbWVudH0gb24gZWFjaCBvbmUgb2YgdGhlbS5cblx0XHQgKlxuXHRcdCAqIFRoZSBmb2xsb3dpbmcgaG9va3Mgd2lsbCBiZSBydW46XG5cdFx0ICogMS4gYGJlZm9yZS1oaWdobGlnaHRhbGxgXG5cdFx0ICogMi4gYGJlZm9yZS1hbGwtZWxlbWVudHMtaGlnaGxpZ2h0YFxuXHRcdCAqIDMuIEFsbCBob29rcyBvZiB7QGxpbmsgUHJpc20uaGlnaGxpZ2h0RWxlbWVudH0gZm9yIGVhY2ggZWxlbWVudC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gY29udGFpbmVyIFRoZSByb290IGVsZW1lbnQsIHdob3NlIGRlc2NlbmRhbnRzIHRoYXQgaGF2ZSBhIGAubGFuZ3VhZ2UteHh4eGAgY2xhc3Mgd2lsbCBiZSBoaWdobGlnaHRlZC5cblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFthc3luYz1mYWxzZV0gV2hldGhlciBlYWNoIGVsZW1lbnQgaXMgdG8gYmUgaGlnaGxpZ2h0ZWQgYXN5bmNocm9ub3VzbHkgdXNpbmcgV2ViIFdvcmtlcnMuXG5cdFx0ICogQHBhcmFtIHtIaWdobGlnaHRDYWxsYmFja30gW2NhbGxiYWNrXSBBbiBvcHRpb25hbCBjYWxsYmFjayB0byBiZSBpbnZva2VkIG9uIGVhY2ggZWxlbWVudCBhZnRlciBpdHMgaGlnaGxpZ2h0aW5nIGlzIGRvbmUuXG5cdFx0ICogQG1lbWJlcm9mIFByaXNtXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqL1xuXHRcdGhpZ2hsaWdodEFsbFVuZGVyOiBmdW5jdGlvbiAoY29udGFpbmVyLCBhc3luYywgY2FsbGJhY2spIHtcblx0XHRcdHZhciBlbnYgPSB7XG5cdFx0XHRcdGNhbGxiYWNrOiBjYWxsYmFjayxcblx0XHRcdFx0Y29udGFpbmVyOiBjb250YWluZXIsXG5cdFx0XHRcdHNlbGVjdG9yOiAnY29kZVtjbGFzcyo9XCJsYW5ndWFnZS1cIl0sIFtjbGFzcyo9XCJsYW5ndWFnZS1cIl0gY29kZSwgY29kZVtjbGFzcyo9XCJsYW5nLVwiXSwgW2NsYXNzKj1cImxhbmctXCJdIGNvZGUnXG5cdFx0XHR9O1xuXG5cdFx0XHRfLmhvb2tzLnJ1bignYmVmb3JlLWhpZ2hsaWdodGFsbCcsIGVudik7XG5cblx0XHRcdGVudi5lbGVtZW50cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShlbnYuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoZW52LnNlbGVjdG9yKSk7XG5cblx0XHRcdF8uaG9va3MucnVuKCdiZWZvcmUtYWxsLWVsZW1lbnRzLWhpZ2hsaWdodCcsIGVudik7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwLCBlbGVtZW50OyAoZWxlbWVudCA9IGVudi5lbGVtZW50c1tpKytdKTspIHtcblx0XHRcdFx0Xy5oaWdobGlnaHRFbGVtZW50KGVsZW1lbnQsIGFzeW5jID09PSB0cnVlLCBlbnYuY2FsbGJhY2spO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBIaWdobGlnaHRzIHRoZSBjb2RlIGluc2lkZSBhIHNpbmdsZSBlbGVtZW50LlxuXHRcdCAqXG5cdFx0ICogVGhlIGZvbGxvd2luZyBob29rcyB3aWxsIGJlIHJ1bjpcblx0XHQgKiAxLiBgYmVmb3JlLXNhbml0eS1jaGVja2Bcblx0XHQgKiAyLiBgYmVmb3JlLWhpZ2hsaWdodGBcblx0XHQgKiAzLiBBbGwgaG9va3Mgb2Yge0BsaW5rIFByaXNtLmhpZ2hsaWdodH0uIFRoZXNlIGhvb2tzIHdpbGwgYmUgcnVuIGJ5IGFuIGFzeW5jaHJvbm91cyB3b3JrZXIgaWYgYGFzeW5jYCBpcyBgdHJ1ZWAuXG5cdFx0ICogNC4gYGJlZm9yZS1pbnNlcnRgXG5cdFx0ICogNS4gYGFmdGVyLWhpZ2hsaWdodGBcblx0XHQgKiA2LiBgY29tcGxldGVgXG5cdFx0ICpcblx0XHQgKiBTb21lIHRoZSBhYm92ZSBob29rcyB3aWxsIGJlIHNraXBwZWQgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBjb250YWluIGFueSB0ZXh0IG9yIHRoZXJlIGlzIG5vIGdyYW1tYXIgbG9hZGVkIGZvclxuXHRcdCAqIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgY29kZS5cblx0XHQgKiBJdCBtdXN0IGhhdmUgYSBjbGFzcyBvZiBgbGFuZ3VhZ2UteHh4eGAgdG8gYmUgcHJvY2Vzc2VkLCB3aGVyZSBgeHh4eGAgaXMgYSB2YWxpZCBsYW5ndWFnZSBpZGVudGlmaWVyLlxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FzeW5jPWZhbHNlXSBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIHRvIGJlIGhpZ2hsaWdodGVkIGFzeW5jaHJvbm91c2x5IHVzaW5nIFdlYiBXb3JrZXJzXG5cdFx0ICogdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBhbmQgYXZvaWQgYmxvY2tpbmcgdGhlIFVJIHdoZW4gaGlnaGxpZ2h0aW5nIHZlcnkgbGFyZ2UgY2h1bmtzIG9mIGNvZGUuIFRoaXMgb3B0aW9uIGlzXG5cdFx0ICogW2Rpc2FibGVkIGJ5IGRlZmF1bHRdKGh0dHBzOi8vcHJpc21qcy5jb20vZmFxLmh0bWwjd2h5LWlzLWFzeW5jaHJvbm91cy1oaWdobGlnaHRpbmctZGlzYWJsZWQtYnktZGVmYXVsdCkuXG5cdFx0ICpcblx0XHQgKiBOb3RlOiBBbGwgbGFuZ3VhZ2UgZGVmaW5pdGlvbnMgcmVxdWlyZWQgdG8gaGlnaGxpZ2h0IHRoZSBjb2RlIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIG1haW4gYHByaXNtLmpzYCBmaWxlIGZvclxuXHRcdCAqIGFzeW5jaHJvbm91cyBoaWdobGlnaHRpbmcgdG8gd29yay4gWW91IGNhbiBidWlsZCB5b3VyIG93biBidW5kbGUgb24gdGhlXG5cdFx0ICogW0Rvd25sb2FkIHBhZ2VdKGh0dHBzOi8vcHJpc21qcy5jb20vZG93bmxvYWQuaHRtbCkuXG5cdFx0ICogQHBhcmFtIHtIaWdobGlnaHRDYWxsYmFja30gW2NhbGxiYWNrXSBBbiBvcHRpb25hbCBjYWxsYmFjayB0byBiZSBpbnZva2VkIGFmdGVyIHRoZSBoaWdobGlnaHRpbmcgaXMgZG9uZS5cblx0XHQgKiBNb3N0bHkgdXNlZnVsIHdoZW4gYGFzeW5jYCBpcyBgdHJ1ZWAsIHNpbmNlIGluIHRoYXQgY2FzZSwgdGhlIGhpZ2hsaWdodGluZyBpcyBkb25lIGFzeW5jaHJvbm91c2x5LlxuXHRcdCAqIEBtZW1iZXJvZiBQcmlzbVxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKi9cblx0XHRoaWdobGlnaHRFbGVtZW50OiBmdW5jdGlvbiAoZWxlbWVudCwgYXN5bmMsIGNhbGxiYWNrKSB7XG5cdFx0XHQvLyBGaW5kIGxhbmd1YWdlXG5cdFx0XHR2YXIgbGFuZ3VhZ2UgPSBfLnV0aWwuZ2V0TGFuZ3VhZ2UoZWxlbWVudCk7XG5cdFx0XHR2YXIgZ3JhbW1hciA9IF8ubGFuZ3VhZ2VzW2xhbmd1YWdlXTtcblxuXHRcdFx0Ly8gU2V0IGxhbmd1YWdlIG9uIHRoZSBlbGVtZW50LCBpZiBub3QgcHJlc2VudFxuXHRcdFx0Xy51dGlsLnNldExhbmd1YWdlKGVsZW1lbnQsIGxhbmd1YWdlKTtcblxuXHRcdFx0Ly8gU2V0IGxhbmd1YWdlIG9uIHRoZSBwYXJlbnQsIGZvciBzdHlsaW5nXG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXHRcdFx0aWYgKHBhcmVudCAmJiBwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3ByZScpIHtcblx0XHRcdFx0Xy51dGlsLnNldExhbmd1YWdlKHBhcmVudCwgbGFuZ3VhZ2UpO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgY29kZSA9IGVsZW1lbnQudGV4dENvbnRlbnQ7XG5cblx0XHRcdHZhciBlbnYgPSB7XG5cdFx0XHRcdGVsZW1lbnQ6IGVsZW1lbnQsXG5cdFx0XHRcdGxhbmd1YWdlOiBsYW5ndWFnZSxcblx0XHRcdFx0Z3JhbW1hcjogZ3JhbW1hcixcblx0XHRcdFx0Y29kZTogY29kZVxuXHRcdFx0fTtcblxuXHRcdFx0ZnVuY3Rpb24gaW5zZXJ0SGlnaGxpZ2h0ZWRDb2RlKGhpZ2hsaWdodGVkQ29kZSkge1xuXHRcdFx0XHRlbnYuaGlnaGxpZ2h0ZWRDb2RlID0gaGlnaGxpZ2h0ZWRDb2RlO1xuXG5cdFx0XHRcdF8uaG9va3MucnVuKCdiZWZvcmUtaW5zZXJ0JywgZW52KTtcblxuXHRcdFx0XHRlbnYuZWxlbWVudC5pbm5lckhUTUwgPSBlbnYuaGlnaGxpZ2h0ZWRDb2RlO1xuXG5cdFx0XHRcdF8uaG9va3MucnVuKCdhZnRlci1oaWdobGlnaHQnLCBlbnYpO1xuXHRcdFx0XHRfLmhvb2tzLnJ1bignY29tcGxldGUnLCBlbnYpO1xuXHRcdFx0XHRjYWxsYmFjayAmJiBjYWxsYmFjay5jYWxsKGVudi5lbGVtZW50KTtcblx0XHRcdH1cblxuXHRcdFx0Xy5ob29rcy5ydW4oJ2JlZm9yZS1zYW5pdHktY2hlY2snLCBlbnYpO1xuXG5cdFx0XHQvLyBwbHVnaW5zIG1heSBjaGFuZ2UvYWRkIHRoZSBwYXJlbnQvZWxlbWVudFxuXHRcdFx0cGFyZW50ID0gZW52LmVsZW1lbnQucGFyZW50RWxlbWVudDtcblx0XHRcdGlmIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdwcmUnICYmICFwYXJlbnQuaGFzQXR0cmlidXRlKCd0YWJpbmRleCcpKSB7XG5cdFx0XHRcdHBhcmVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFlbnYuY29kZSkge1xuXHRcdFx0XHRfLmhvb2tzLnJ1bignY29tcGxldGUnLCBlbnYpO1xuXHRcdFx0XHRjYWxsYmFjayAmJiBjYWxsYmFjay5jYWxsKGVudi5lbGVtZW50KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRfLmhvb2tzLnJ1bignYmVmb3JlLWhpZ2hsaWdodCcsIGVudik7XG5cblx0XHRcdGlmICghZW52LmdyYW1tYXIpIHtcblx0XHRcdFx0aW5zZXJ0SGlnaGxpZ2h0ZWRDb2RlKF8udXRpbC5lbmNvZGUoZW52LmNvZGUpKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYXN5bmMgJiYgX3NlbGYuV29ya2VyKSB7XG5cdFx0XHRcdHZhciB3b3JrZXIgPSBuZXcgV29ya2VyKF8uZmlsZW5hbWUpO1xuXG5cdFx0XHRcdHdvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZ0KSB7XG5cdFx0XHRcdFx0aW5zZXJ0SGlnaGxpZ2h0ZWRDb2RlKGV2dC5kYXRhKTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHR3b3JrZXIucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoe1xuXHRcdFx0XHRcdGxhbmd1YWdlOiBlbnYubGFuZ3VhZ2UsXG5cdFx0XHRcdFx0Y29kZTogZW52LmNvZGUsXG5cdFx0XHRcdFx0aW1tZWRpYXRlQ2xvc2U6IHRydWVcblx0XHRcdFx0fSkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW5zZXJ0SGlnaGxpZ2h0ZWRDb2RlKF8uaGlnaGxpZ2h0KGVudi5jb2RlLCBlbnYuZ3JhbW1hciwgZW52Lmxhbmd1YWdlKSk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIExvdy1sZXZlbCBmdW5jdGlvbiwgb25seSB1c2UgaWYgeW91IGtub3cgd2hhdCB5b3VcdTIwMTlyZSBkb2luZy4gSXQgYWNjZXB0cyBhIHN0cmluZyBvZiB0ZXh0IGFzIGlucHV0XG5cdFx0ICogYW5kIHRoZSBsYW5ndWFnZSBkZWZpbml0aW9ucyB0byB1c2UsIGFuZCByZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIEhUTUwgcHJvZHVjZWQuXG5cdFx0ICpcblx0XHQgKiBUaGUgZm9sbG93aW5nIGhvb2tzIHdpbGwgYmUgcnVuOlxuXHRcdCAqIDEuIGBiZWZvcmUtdG9rZW5pemVgXG5cdFx0ICogMi4gYGFmdGVyLXRva2VuaXplYFxuXHRcdCAqIDMuIGB3cmFwYDogT24gZWFjaCB7QGxpbmsgVG9rZW59LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHQgQSBzdHJpbmcgd2l0aCB0aGUgY29kZSB0byBiZSBoaWdobGlnaHRlZC5cblx0XHQgKiBAcGFyYW0ge0dyYW1tYXJ9IGdyYW1tYXIgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRva2VucyB0byB1c2UuXG5cdFx0ICpcblx0XHQgKiBVc3VhbGx5IGEgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBsaWtlIGBQcmlzbS5sYW5ndWFnZXMubWFya3VwYC5cblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgVGhlIG5hbWUgb2YgdGhlIGxhbmd1YWdlIGRlZmluaXRpb24gcGFzc2VkIHRvIGBncmFtbWFyYC5cblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgaGlnaGxpZ2h0ZWQgSFRNTC5cblx0XHQgKiBAbWVtYmVyb2YgUHJpc21cblx0XHQgKiBAcHVibGljXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiBQcmlzbS5oaWdobGlnaHQoJ3ZhciBmb28gPSB0cnVlOycsIFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0LCAnamF2YXNjcmlwdCcpO1xuXHRcdCAqL1xuXHRcdGhpZ2hsaWdodDogZnVuY3Rpb24gKHRleHQsIGdyYW1tYXIsIGxhbmd1YWdlKSB7XG5cdFx0XHR2YXIgZW52ID0ge1xuXHRcdFx0XHRjb2RlOiB0ZXh0LFxuXHRcdFx0XHRncmFtbWFyOiBncmFtbWFyLFxuXHRcdFx0XHRsYW5ndWFnZTogbGFuZ3VhZ2Vcblx0XHRcdH07XG5cdFx0XHRfLmhvb2tzLnJ1bignYmVmb3JlLXRva2VuaXplJywgZW52KTtcblx0XHRcdGlmICghZW52LmdyYW1tYXIpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdUaGUgbGFuZ3VhZ2UgXCInICsgZW52Lmxhbmd1YWdlICsgJ1wiIGhhcyBubyBncmFtbWFyLicpO1xuXHRcdFx0fVxuXHRcdFx0ZW52LnRva2VucyA9IF8udG9rZW5pemUoZW52LmNvZGUsIGVudi5ncmFtbWFyKTtcblx0XHRcdF8uaG9va3MucnVuKCdhZnRlci10b2tlbml6ZScsIGVudik7XG5cdFx0XHRyZXR1cm4gVG9rZW4uc3RyaW5naWZ5KF8udXRpbC5lbmNvZGUoZW52LnRva2VucyksIGVudi5sYW5ndWFnZSk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFRoaXMgaXMgdGhlIGhlYXJ0IG9mIFByaXNtLCBhbmQgdGhlIG1vc3QgbG93LWxldmVsIGZ1bmN0aW9uIHlvdSBjYW4gdXNlLiBJdCBhY2NlcHRzIGEgc3RyaW5nIG9mIHRleHQgYXMgaW5wdXRcblx0XHQgKiBhbmQgdGhlIGxhbmd1YWdlIGRlZmluaXRpb25zIHRvIHVzZSwgYW5kIHJldHVybnMgYW4gYXJyYXkgd2l0aCB0aGUgdG9rZW5pemVkIGNvZGUuXG5cdFx0ICpcblx0XHQgKiBXaGVuIHRoZSBsYW5ndWFnZSBkZWZpbml0aW9uIGluY2x1ZGVzIG5lc3RlZCB0b2tlbnMsIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgcmVjdXJzaXZlbHkgb24gZWFjaCBvZiB0aGVzZSB0b2tlbnMuXG5cdFx0ICpcblx0XHQgKiBUaGlzIG1ldGhvZCBjb3VsZCBiZSB1c2VmdWwgaW4gb3RoZXIgY29udGV4dHMgYXMgd2VsbCwgYXMgYSB2ZXJ5IGNydWRlIHBhcnNlci5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IEEgc3RyaW5nIHdpdGggdGhlIGNvZGUgdG8gYmUgaGlnaGxpZ2h0ZWQuXG5cdFx0ICogQHBhcmFtIHtHcmFtbWFyfSBncmFtbWFyIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0b2tlbnMgdG8gdXNlLlxuXHRcdCAqXG5cdFx0ICogVXN1YWxseSBhIGxhbmd1YWdlIGRlZmluaXRpb24gbGlrZSBgUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cGAuXG5cdFx0ICogQHJldHVybnMge1Rva2VuU3RyZWFtfSBBbiBhcnJheSBvZiBzdHJpbmdzIGFuZCB0b2tlbnMsIGEgdG9rZW4gc3RyZWFtLlxuXHRcdCAqIEBtZW1iZXJvZiBQcmlzbVxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIGxldCBjb2RlID0gYHZhciBmb28gPSAwO2A7XG5cdFx0ICogbGV0IHRva2VucyA9IFByaXNtLnRva2VuaXplKGNvZGUsIFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0KTtcblx0XHQgKiB0b2tlbnMuZm9yRWFjaCh0b2tlbiA9PiB7XG5cdFx0ICogICAgIGlmICh0b2tlbiBpbnN0YW5jZW9mIFByaXNtLlRva2VuICYmIHRva2VuLnR5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0ICogICAgICAgICBjb25zb2xlLmxvZyhgRm91bmQgbnVtZXJpYyBsaXRlcmFsOiAke3Rva2VuLmNvbnRlbnR9YCk7XG5cdFx0ICogICAgIH1cblx0XHQgKiB9KTtcblx0XHQgKi9cblx0XHR0b2tlbml6ZTogZnVuY3Rpb24gKHRleHQsIGdyYW1tYXIpIHtcblx0XHRcdHZhciByZXN0ID0gZ3JhbW1hci5yZXN0O1xuXHRcdFx0aWYgKHJlc3QpIHtcblx0XHRcdFx0Zm9yICh2YXIgdG9rZW4gaW4gcmVzdCkge1xuXHRcdFx0XHRcdGdyYW1tYXJbdG9rZW5dID0gcmVzdFt0b2tlbl07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkZWxldGUgZ3JhbW1hci5yZXN0O1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdG9rZW5MaXN0ID0gbmV3IExpbmtlZExpc3QoKTtcblx0XHRcdGFkZEFmdGVyKHRva2VuTGlzdCwgdG9rZW5MaXN0LmhlYWQsIHRleHQpO1xuXG5cdFx0XHRtYXRjaEdyYW1tYXIodGV4dCwgdG9rZW5MaXN0LCBncmFtbWFyLCB0b2tlbkxpc3QuaGVhZCwgMCk7XG5cblx0XHRcdHJldHVybiB0b0FycmF5KHRva2VuTGlzdCk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBuYW1lc3BhY2Vcblx0XHQgKiBAbWVtYmVyb2YgUHJpc21cblx0XHQgKiBAcHVibGljXG5cdFx0ICovXG5cdFx0aG9va3M6IHtcblx0XHRcdGFsbDoge30sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQWRkcyB0aGUgZ2l2ZW4gY2FsbGJhY2sgdG8gdGhlIGxpc3Qgb2YgY2FsbGJhY2tzIGZvciB0aGUgZ2l2ZW4gaG9vay5cblx0XHRcdCAqXG5cdFx0XHQgKiBUaGUgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIGhvb2sgaXQgaXMgcmVnaXN0ZXJlZCBmb3IgaXMgcnVuLlxuXHRcdFx0ICogSG9va3MgYXJlIHVzdWFsbHkgZGlyZWN0bHkgcnVuIGJ5IGEgaGlnaGxpZ2h0IGZ1bmN0aW9uIGJ1dCB5b3UgY2FuIGFsc28gcnVuIGhvb2tzIHlvdXJzZWxmLlxuXHRcdFx0ICpcblx0XHRcdCAqIE9uZSBjYWxsYmFjayBmdW5jdGlvbiBjYW4gYmUgcmVnaXN0ZXJlZCB0byBtdWx0aXBsZSBob29rcyBhbmQgdGhlIHNhbWUgaG9vayBtdWx0aXBsZSB0aW1lcy5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgaG9vay5cblx0XHRcdCAqIEBwYXJhbSB7SG9va0NhbGxiYWNrfSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggaXMgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuXHRcdFx0ICogQHB1YmxpY1xuXHRcdFx0ICovXG5cdFx0XHRhZGQ6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaykge1xuXHRcdFx0XHR2YXIgaG9va3MgPSBfLmhvb2tzLmFsbDtcblxuXHRcdFx0XHRob29rc1tuYW1lXSA9IGhvb2tzW25hbWVdIHx8IFtdO1xuXG5cdFx0XHRcdGhvb2tzW25hbWVdLnB1c2goY2FsbGJhY2spO1xuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBSdW5zIGEgaG9vayBpbnZva2luZyBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuXHRcdFx0ICpcblx0XHRcdCAqIENhbGxiYWNrcyB3aWxsIGJlIGludm9rZWQgc3luY2hyb25vdXNseSBhbmQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSByZWdpc3RlcmVkLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBob29rLlxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBlbnYgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBvZiB0aGUgaG9vayBwYXNzZWQgdG8gYWxsIGNhbGxiYWNrcyByZWdpc3RlcmVkLlxuXHRcdFx0ICogQHB1YmxpY1xuXHRcdFx0ICovXG5cdFx0XHRydW46IGZ1bmN0aW9uIChuYW1lLCBlbnYpIHtcblx0XHRcdFx0dmFyIGNhbGxiYWNrcyA9IF8uaG9va3MuYWxsW25hbWVdO1xuXG5cdFx0XHRcdGlmICghY2FsbGJhY2tzIHx8ICFjYWxsYmFja3MubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICh2YXIgaSA9IDAsIGNhbGxiYWNrOyAoY2FsbGJhY2sgPSBjYWxsYmFja3NbaSsrXSk7KSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soZW52KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRUb2tlbjogVG9rZW5cblx0fTtcblx0X3NlbGYuUHJpc20gPSBfO1xuXG5cblx0Ly8gVHlwZXNjcmlwdCBub3RlOlxuXHQvLyBUaGUgZm9sbG93aW5nIGNhbiBiZSB1c2VkIHRvIGltcG9ydCB0aGUgVG9rZW4gdHlwZSBpbiBKU0RvYzpcblx0Ly9cblx0Ly8gICBAdHlwZWRlZiB7SW5zdGFuY2VUeXBlPGltcG9ydChcIi4vcHJpc20tY29yZVwiKVtcIlRva2VuXCJdPn0gVG9rZW5cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyB0b2tlbi5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgU2VlIHtAbGluayBUb2tlbiN0eXBlIHR5cGV9XG5cdCAqIEBwYXJhbSB7c3RyaW5nIHwgVG9rZW5TdHJlYW19IGNvbnRlbnQgU2VlIHtAbGluayBUb2tlbiNjb250ZW50IGNvbnRlbnR9XG5cdCAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbYWxpYXNdIFRoZSBhbGlhcyhlcykgb2YgdGhlIHRva2VuLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW21hdGNoZWRTdHI9XCJcIl0gQSBjb3B5IG9mIHRoZSBmdWxsIHN0cmluZyB0aGlzIHRva2VuIHdhcyBjcmVhdGVkIGZyb20uXG5cdCAqIEBjbGFzc1xuXHQgKiBAZ2xvYmFsXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdGZ1bmN0aW9uIFRva2VuKHR5cGUsIGNvbnRlbnQsIGFsaWFzLCBtYXRjaGVkU3RyKSB7XG5cdFx0LyoqXG5cdFx0ICogVGhlIHR5cGUgb2YgdGhlIHRva2VuLlxuXHRcdCAqXG5cdFx0ICogVGhpcyBpcyB1c3VhbGx5IHRoZSBrZXkgb2YgYSBwYXR0ZXJuIGluIGEge0BsaW5rIEdyYW1tYXJ9LlxuXHRcdCAqXG5cdFx0ICogQHR5cGUge3N0cmluZ31cblx0XHQgKiBAc2VlIEdyYW1tYXJUb2tlblxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKi9cblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xuXHRcdC8qKlxuXHRcdCAqIFRoZSBzdHJpbmdzIG9yIHRva2VucyBjb250YWluZWQgYnkgdGhpcyB0b2tlbi5cblx0XHQgKlxuXHRcdCAqIFRoaXMgd2lsbCBiZSBhIHRva2VuIHN0cmVhbSBpZiB0aGUgcGF0dGVybiBtYXRjaGVkIGFsc28gZGVmaW5lZCBhbiBgaW5zaWRlYCBncmFtbWFyLlxuXHRcdCAqXG5cdFx0ICogQHR5cGUge3N0cmluZyB8IFRva2VuU3RyZWFtfVxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKi9cblx0XHR0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuXHRcdC8qKlxuXHRcdCAqIFRoZSBhbGlhcyhlcykgb2YgdGhlIHRva2VuLlxuXHRcdCAqXG5cdFx0ICogQHR5cGUge3N0cmluZ3xzdHJpbmdbXX1cblx0XHQgKiBAc2VlIEdyYW1tYXJUb2tlblxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKi9cblx0XHR0aGlzLmFsaWFzID0gYWxpYXM7XG5cdFx0Ly8gQ29weSBvZiB0aGUgZnVsbCBzdHJpbmcgdGhpcyB0b2tlbiB3YXMgY3JlYXRlZCBmcm9tXG5cdFx0dGhpcy5sZW5ndGggPSAobWF0Y2hlZFN0ciB8fCAnJykubGVuZ3RoIHwgMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIHRva2VuIHN0cmVhbSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzIGFuZCB7QGxpbmsgVG9rZW4gVG9rZW59IG9iamVjdHMuXG5cdCAqXG5cdCAqIFRva2VuIHN0cmVhbXMgaGF2ZSB0byBmdWxmaWxsIGEgZmV3IHByb3BlcnRpZXMgdGhhdCBhcmUgYXNzdW1lZCBieSBtb3N0IGZ1bmN0aW9ucyAobW9zdGx5IGludGVybmFsIG9uZXMpIHRoYXQgcHJvY2Vzc1xuXHQgKiB0aGVtLlxuXHQgKlxuXHQgKiAxLiBObyBhZGphY2VudCBzdHJpbmdzLlxuXHQgKiAyLiBObyBlbXB0eSBzdHJpbmdzLlxuXHQgKlxuXHQgKiAgICBUaGUgb25seSBleGNlcHRpb24gaGVyZSBpcyB0aGUgdG9rZW4gc3RyZWFtIHRoYXQgb25seSBjb250YWlucyB0aGUgZW1wdHkgc3RyaW5nIGFuZCBub3RoaW5nIGVsc2UuXG5cdCAqXG5cdCAqIEB0eXBlZGVmIHtBcnJheTxzdHJpbmcgfCBUb2tlbj59IFRva2VuU3RyZWFtXG5cdCAqIEBnbG9iYWxcblx0ICogQHB1YmxpY1xuXHQgKi9cblxuXHQvKipcblx0ICogQ29udmVydHMgdGhlIGdpdmVuIHRva2VuIG9yIHRva2VuIHN0cmVhbSB0byBhbiBIVE1MIHJlcHJlc2VudGF0aW9uLlxuXHQgKlxuXHQgKiBUaGUgZm9sbG93aW5nIGhvb2tzIHdpbGwgYmUgcnVuOlxuXHQgKiAxLiBgd3JhcGA6IE9uIGVhY2gge0BsaW5rIFRva2VufS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmcgfCBUb2tlbiB8IFRva2VuU3RyZWFtfSBvIFRoZSB0b2tlbiBvciB0b2tlbiBzdHJlYW0gdG8gYmUgY29udmVydGVkLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgVGhlIG5hbWUgb2YgY3VycmVudCBsYW5ndWFnZS5cblx0ICogQHJldHVybnMge3N0cmluZ30gVGhlIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRva2VuIG9yIHRva2VuIHN0cmVhbS5cblx0ICogQG1lbWJlcm9mIFRva2VuXG5cdCAqIEBzdGF0aWNcblx0ICovXG5cdFRva2VuLnN0cmluZ2lmeSA9IGZ1bmN0aW9uIHN0cmluZ2lmeShvLCBsYW5ndWFnZSkge1xuXHRcdGlmICh0eXBlb2YgbyA9PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIG87XG5cdFx0fVxuXHRcdGlmIChBcnJheS5pc0FycmF5KG8pKSB7XG5cdFx0XHR2YXIgcyA9ICcnO1xuXHRcdFx0by5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdHMgKz0gc3RyaW5naWZ5KGUsIGxhbmd1YWdlKTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHM7XG5cdFx0fVxuXG5cdFx0dmFyIGVudiA9IHtcblx0XHRcdHR5cGU6IG8udHlwZSxcblx0XHRcdGNvbnRlbnQ6IHN0cmluZ2lmeShvLmNvbnRlbnQsIGxhbmd1YWdlKSxcblx0XHRcdHRhZzogJ3NwYW4nLFxuXHRcdFx0Y2xhc3NlczogWyd0b2tlbicsIG8udHlwZV0sXG5cdFx0XHRhdHRyaWJ1dGVzOiB7fSxcblx0XHRcdGxhbmd1YWdlOiBsYW5ndWFnZVxuXHRcdH07XG5cblx0XHR2YXIgYWxpYXNlcyA9IG8uYWxpYXM7XG5cdFx0aWYgKGFsaWFzZXMpIHtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KGFsaWFzZXMpKSB7XG5cdFx0XHRcdEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGVudi5jbGFzc2VzLCBhbGlhc2VzKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVudi5jbGFzc2VzLnB1c2goYWxpYXNlcyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Xy5ob29rcy5ydW4oJ3dyYXAnLCBlbnYpO1xuXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSAnJztcblx0XHRmb3IgKHZhciBuYW1lIGluIGVudi5hdHRyaWJ1dGVzKSB7XG5cdFx0XHRhdHRyaWJ1dGVzICs9ICcgJyArIG5hbWUgKyAnPVwiJyArIChlbnYuYXR0cmlidXRlc1tuYW1lXSB8fCAnJykucmVwbGFjZSgvXCIvZywgJyZxdW90OycpICsgJ1wiJztcblx0XHR9XG5cblx0XHRyZXR1cm4gJzwnICsgZW52LnRhZyArICcgY2xhc3M9XCInICsgZW52LmNsYXNzZXMuam9pbignICcpICsgJ1wiJyArIGF0dHJpYnV0ZXMgKyAnPicgKyBlbnYuY29udGVudCArICc8LycgKyBlbnYudGFnICsgJz4nO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge1JlZ0V4cH0gcGF0dGVyblxuXHQgKiBAcGFyYW0ge251bWJlcn0gcG9zXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbG9va2JlaGluZFxuXHQgKiBAcmV0dXJucyB7UmVnRXhwRXhlY0FycmF5IHwgbnVsbH1cblx0ICovXG5cdGZ1bmN0aW9uIG1hdGNoUGF0dGVybihwYXR0ZXJuLCBwb3MsIHRleHQsIGxvb2tiZWhpbmQpIHtcblx0XHRwYXR0ZXJuLmxhc3RJbmRleCA9IHBvcztcblx0XHR2YXIgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWModGV4dCk7XG5cdFx0aWYgKG1hdGNoICYmIGxvb2tiZWhpbmQgJiYgbWF0Y2hbMV0pIHtcblx0XHRcdC8vIGNoYW5nZSB0aGUgbWF0Y2ggdG8gcmVtb3ZlIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIFByaXNtIGxvb2tiZWhpbmQgZ3JvdXBcblx0XHRcdHZhciBsb29rYmVoaW5kTGVuZ3RoID0gbWF0Y2hbMV0ubGVuZ3RoO1xuXHRcdFx0bWF0Y2guaW5kZXggKz0gbG9va2JlaGluZExlbmd0aDtcblx0XHRcdG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UobG9va2JlaGluZExlbmd0aCk7XG5cdFx0fVxuXHRcdHJldHVybiBtYXRjaDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuXHQgKiBAcGFyYW0ge0xpbmtlZExpc3Q8c3RyaW5nIHwgVG9rZW4+fSB0b2tlbkxpc3Rcblx0ICogQHBhcmFtIHthbnl9IGdyYW1tYXJcblx0ICogQHBhcmFtIHtMaW5rZWRMaXN0Tm9kZTxzdHJpbmcgfCBUb2tlbj59IHN0YXJ0Tm9kZVxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RhcnRQb3Ncblx0ICogQHBhcmFtIHtSZW1hdGNoT3B0aW9uc30gW3JlbWF0Y2hdXG5cdCAqIEByZXR1cm5zIHt2b2lkfVxuXHQgKiBAcHJpdmF0ZVxuXHQgKlxuXHQgKiBAdHlwZWRlZiBSZW1hdGNoT3B0aW9uc1xuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gY2F1c2Vcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IHJlYWNoXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXRjaEdyYW1tYXIodGV4dCwgdG9rZW5MaXN0LCBncmFtbWFyLCBzdGFydE5vZGUsIHN0YXJ0UG9zLCByZW1hdGNoKSB7XG5cdFx0Zm9yICh2YXIgdG9rZW4gaW4gZ3JhbW1hcikge1xuXHRcdFx0aWYgKCFncmFtbWFyLmhhc093blByb3BlcnR5KHRva2VuKSB8fCAhZ3JhbW1hclt0b2tlbl0pIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBwYXR0ZXJucyA9IGdyYW1tYXJbdG9rZW5dO1xuXHRcdFx0cGF0dGVybnMgPSBBcnJheS5pc0FycmF5KHBhdHRlcm5zKSA/IHBhdHRlcm5zIDogW3BhdHRlcm5zXTtcblxuXHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBwYXR0ZXJucy5sZW5ndGg7ICsraikge1xuXHRcdFx0XHRpZiAocmVtYXRjaCAmJiByZW1hdGNoLmNhdXNlID09IHRva2VuICsgJywnICsgaikge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBwYXR0ZXJuT2JqID0gcGF0dGVybnNbal07XG5cdFx0XHRcdHZhciBpbnNpZGUgPSBwYXR0ZXJuT2JqLmluc2lkZTtcblx0XHRcdFx0dmFyIGxvb2tiZWhpbmQgPSAhIXBhdHRlcm5PYmoubG9va2JlaGluZDtcblx0XHRcdFx0dmFyIGdyZWVkeSA9ICEhcGF0dGVybk9iai5ncmVlZHk7XG5cdFx0XHRcdHZhciBhbGlhcyA9IHBhdHRlcm5PYmouYWxpYXM7XG5cblx0XHRcdFx0aWYgKGdyZWVkeSAmJiAhcGF0dGVybk9iai5wYXR0ZXJuLmdsb2JhbCkge1xuXHRcdFx0XHRcdC8vIFdpdGhvdXQgdGhlIGdsb2JhbCBmbGFnLCBsYXN0SW5kZXggd29uJ3Qgd29ya1xuXHRcdFx0XHRcdHZhciBmbGFncyA9IHBhdHRlcm5PYmoucGF0dGVybi50b1N0cmluZygpLm1hdGNoKC9baW1zdXldKiQvKVswXTtcblx0XHRcdFx0XHRwYXR0ZXJuT2JqLnBhdHRlcm4gPSBSZWdFeHAocGF0dGVybk9iai5wYXR0ZXJuLnNvdXJjZSwgZmxhZ3MgKyAnZycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0LyoqIEB0eXBlIHtSZWdFeHB9ICovXG5cdFx0XHRcdHZhciBwYXR0ZXJuID0gcGF0dGVybk9iai5wYXR0ZXJuIHx8IHBhdHRlcm5PYmo7XG5cblx0XHRcdFx0Zm9yICggLy8gaXRlcmF0ZSB0aGUgdG9rZW4gbGlzdCBhbmQga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCB0b2tlbi9zdHJpbmcgcG9zaXRpb25cblx0XHRcdFx0XHR2YXIgY3VycmVudE5vZGUgPSBzdGFydE5vZGUubmV4dCwgcG9zID0gc3RhcnRQb3M7XG5cdFx0XHRcdFx0Y3VycmVudE5vZGUgIT09IHRva2VuTGlzdC50YWlsO1xuXHRcdFx0XHRcdHBvcyArPSBjdXJyZW50Tm9kZS52YWx1ZS5sZW5ndGgsIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUubmV4dFxuXHRcdFx0XHQpIHtcblxuXHRcdFx0XHRcdGlmIChyZW1hdGNoICYmIHBvcyA+PSByZW1hdGNoLnJlYWNoKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgc3RyID0gY3VycmVudE5vZGUudmFsdWU7XG5cblx0XHRcdFx0XHRpZiAodG9rZW5MaXN0Lmxlbmd0aCA+IHRleHQubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHQvLyBTb21ldGhpbmcgd2VudCB0ZXJyaWJseSB3cm9uZywgQUJPUlQsIEFCT1JUIVxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChzdHIgaW5zdGFuY2VvZiBUb2tlbikge1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIHJlbW92ZUNvdW50ID0gMTsgLy8gdGhpcyBpcyB0aGUgdG8gcGFyYW1ldGVyIG9mIHJlbW92ZUJldHdlZW5cblx0XHRcdFx0XHR2YXIgbWF0Y2g7XG5cblx0XHRcdFx0XHRpZiAoZ3JlZWR5KSB7XG5cdFx0XHRcdFx0XHRtYXRjaCA9IG1hdGNoUGF0dGVybihwYXR0ZXJuLCBwb3MsIHRleHQsIGxvb2tiZWhpbmQpO1xuXHRcdFx0XHRcdFx0aWYgKCFtYXRjaCB8fCBtYXRjaC5pbmRleCA+PSB0ZXh0Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0dmFyIGZyb20gPSBtYXRjaC5pbmRleDtcblx0XHRcdFx0XHRcdHZhciB0byA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoO1xuXHRcdFx0XHRcdFx0dmFyIHAgPSBwb3M7XG5cblx0XHRcdFx0XHRcdC8vIGZpbmQgdGhlIG5vZGUgdGhhdCBjb250YWlucyB0aGUgbWF0Y2hcblx0XHRcdFx0XHRcdHAgKz0gY3VycmVudE5vZGUudmFsdWUubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKGZyb20gPj0gcCkge1xuXHRcdFx0XHRcdFx0XHRjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHQ7XG5cdFx0XHRcdFx0XHRcdHAgKz0gY3VycmVudE5vZGUudmFsdWUubGVuZ3RoO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ly8gYWRqdXN0IHBvcyAoYW5kIHApXG5cdFx0XHRcdFx0XHRwIC09IGN1cnJlbnROb2RlLnZhbHVlLmxlbmd0aDtcblx0XHRcdFx0XHRcdHBvcyA9IHA7XG5cblx0XHRcdFx0XHRcdC8vIHRoZSBjdXJyZW50IG5vZGUgaXMgYSBUb2tlbiwgdGhlbiB0aGUgbWF0Y2ggc3RhcnRzIGluc2lkZSBhbm90aGVyIFRva2VuLCB3aGljaCBpcyBpbnZhbGlkXG5cdFx0XHRcdFx0XHRpZiAoY3VycmVudE5vZGUudmFsdWUgaW5zdGFuY2VvZiBUb2tlbikge1xuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gZmluZCB0aGUgbGFzdCBub2RlIHdoaWNoIGlzIGFmZmVjdGVkIGJ5IHRoaXMgbWF0Y2hcblx0XHRcdFx0XHRcdGZvciAoXG5cdFx0XHRcdFx0XHRcdHZhciBrID0gY3VycmVudE5vZGU7XG5cdFx0XHRcdFx0XHRcdGsgIT09IHRva2VuTGlzdC50YWlsICYmIChwIDwgdG8gfHwgdHlwZW9mIGsudmFsdWUgPT09ICdzdHJpbmcnKTtcblx0XHRcdFx0XHRcdFx0ayA9IGsubmV4dFxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdHJlbW92ZUNvdW50Kys7XG5cdFx0XHRcdFx0XHRcdHAgKz0gay52YWx1ZS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZW1vdmVDb3VudC0tO1xuXG5cdFx0XHRcdFx0XHQvLyByZXBsYWNlIHdpdGggdGhlIG5ldyBtYXRjaFxuXHRcdFx0XHRcdFx0c3RyID0gdGV4dC5zbGljZShwb3MsIHApO1xuXHRcdFx0XHRcdFx0bWF0Y2guaW5kZXggLT0gcG9zO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRtYXRjaCA9IG1hdGNoUGF0dGVybihwYXR0ZXJuLCAwLCBzdHIsIGxvb2tiZWhpbmQpO1xuXHRcdFx0XHRcdFx0aWYgKCFtYXRjaCkge1xuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5cdFx0XHRcdFx0dmFyIGZyb20gPSBtYXRjaC5pbmRleDtcblx0XHRcdFx0XHR2YXIgbWF0Y2hTdHIgPSBtYXRjaFswXTtcblx0XHRcdFx0XHR2YXIgYmVmb3JlID0gc3RyLnNsaWNlKDAsIGZyb20pO1xuXHRcdFx0XHRcdHZhciBhZnRlciA9IHN0ci5zbGljZShmcm9tICsgbWF0Y2hTdHIubGVuZ3RoKTtcblxuXHRcdFx0XHRcdHZhciByZWFjaCA9IHBvcyArIHN0ci5sZW5ndGg7XG5cdFx0XHRcdFx0aWYgKHJlbWF0Y2ggJiYgcmVhY2ggPiByZW1hdGNoLnJlYWNoKSB7XG5cdFx0XHRcdFx0XHRyZW1hdGNoLnJlYWNoID0gcmVhY2g7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIHJlbW92ZUZyb20gPSBjdXJyZW50Tm9kZS5wcmV2O1xuXG5cdFx0XHRcdFx0aWYgKGJlZm9yZSkge1xuXHRcdFx0XHRcdFx0cmVtb3ZlRnJvbSA9IGFkZEFmdGVyKHRva2VuTGlzdCwgcmVtb3ZlRnJvbSwgYmVmb3JlKTtcblx0XHRcdFx0XHRcdHBvcyArPSBiZWZvcmUubGVuZ3RoO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJlbW92ZVJhbmdlKHRva2VuTGlzdCwgcmVtb3ZlRnJvbSwgcmVtb3ZlQ291bnQpO1xuXG5cdFx0XHRcdFx0dmFyIHdyYXBwZWQgPSBuZXcgVG9rZW4odG9rZW4sIGluc2lkZSA/IF8udG9rZW5pemUobWF0Y2hTdHIsIGluc2lkZSkgOiBtYXRjaFN0ciwgYWxpYXMsIG1hdGNoU3RyKTtcblx0XHRcdFx0XHRjdXJyZW50Tm9kZSA9IGFkZEFmdGVyKHRva2VuTGlzdCwgcmVtb3ZlRnJvbSwgd3JhcHBlZCk7XG5cblx0XHRcdFx0XHRpZiAoYWZ0ZXIpIHtcblx0XHRcdFx0XHRcdGFkZEFmdGVyKHRva2VuTGlzdCwgY3VycmVudE5vZGUsIGFmdGVyKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAocmVtb3ZlQ291bnQgPiAxKSB7XG5cdFx0XHRcdFx0XHQvLyBhdCBsZWFzdCBvbmUgVG9rZW4gb2JqZWN0IHdhcyByZW1vdmVkLCBzbyB3ZSBoYXZlIHRvIGRvIHNvbWUgcmVtYXRjaGluZ1xuXHRcdFx0XHRcdFx0Ly8gdGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIGN1cnJlbnQgcGF0dGVybiBpcyBncmVlZHlcblxuXHRcdFx0XHRcdFx0LyoqIEB0eXBlIHtSZW1hdGNoT3B0aW9uc30gKi9cblx0XHRcdFx0XHRcdHZhciBuZXN0ZWRSZW1hdGNoID0ge1xuXHRcdFx0XHRcdFx0XHRjYXVzZTogdG9rZW4gKyAnLCcgKyBqLFxuXHRcdFx0XHRcdFx0XHRyZWFjaDogcmVhY2hcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRtYXRjaEdyYW1tYXIodGV4dCwgdG9rZW5MaXN0LCBncmFtbWFyLCBjdXJyZW50Tm9kZS5wcmV2LCBwb3MsIG5lc3RlZFJlbWF0Y2gpO1xuXG5cdFx0XHRcdFx0XHQvLyB0aGUgcmVhY2ggbWlnaHQgaGF2ZSBiZWVuIGV4dGVuZGVkIGJlY2F1c2Ugb2YgdGhlIHJlbWF0Y2hpbmdcblx0XHRcdFx0XHRcdGlmIChyZW1hdGNoICYmIG5lc3RlZFJlbWF0Y2gucmVhY2ggPiByZW1hdGNoLnJlYWNoKSB7XG5cdFx0XHRcdFx0XHRcdHJlbWF0Y2gucmVhY2ggPSBuZXN0ZWRSZW1hdGNoLnJlYWNoO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAdHlwZWRlZiBMaW5rZWRMaXN0Tm9kZVxuXHQgKiBAcHJvcGVydHkge1R9IHZhbHVlXG5cdCAqIEBwcm9wZXJ0eSB7TGlua2VkTGlzdE5vZGU8VD4gfCBudWxsfSBwcmV2IFRoZSBwcmV2aW91cyBub2RlLlxuXHQgKiBAcHJvcGVydHkge0xpbmtlZExpc3ROb2RlPFQ+IHwgbnVsbH0gbmV4dCBUaGUgbmV4dCBub2RlLlxuXHQgKiBAdGVtcGxhdGUgVFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblxuXHQvKipcblx0ICogQHRlbXBsYXRlIFRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGZ1bmN0aW9uIExpbmtlZExpc3QoKSB7XG5cdFx0LyoqIEB0eXBlIHtMaW5rZWRMaXN0Tm9kZTxUPn0gKi9cblx0XHR2YXIgaGVhZCA9IHsgdmFsdWU6IG51bGwsIHByZXY6IG51bGwsIG5leHQ6IG51bGwgfTtcblx0XHQvKiogQHR5cGUge0xpbmtlZExpc3ROb2RlPFQ+fSAqL1xuXHRcdHZhciB0YWlsID0geyB2YWx1ZTogbnVsbCwgcHJldjogaGVhZCwgbmV4dDogbnVsbCB9O1xuXHRcdGhlYWQubmV4dCA9IHRhaWw7XG5cblx0XHQvKiogQHR5cGUge0xpbmtlZExpc3ROb2RlPFQ+fSAqL1xuXHRcdHRoaXMuaGVhZCA9IGhlYWQ7XG5cdFx0LyoqIEB0eXBlIHtMaW5rZWRMaXN0Tm9kZTxUPn0gKi9cblx0XHR0aGlzLnRhaWwgPSB0YWlsO1xuXHRcdHRoaXMubGVuZ3RoID0gMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgbmV3IG5vZGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGxpc3QuXG5cdCAqXG5cdCAqIEBwYXJhbSB7TGlua2VkTGlzdDxUPn0gbGlzdFxuXHQgKiBAcGFyYW0ge0xpbmtlZExpc3ROb2RlPFQ+fSBub2RlXG5cdCAqIEBwYXJhbSB7VH0gdmFsdWVcblx0ICogQHJldHVybnMge0xpbmtlZExpc3ROb2RlPFQ+fSBUaGUgYWRkZWQgbm9kZS5cblx0ICogQHRlbXBsYXRlIFRcblx0ICovXG5cdGZ1bmN0aW9uIGFkZEFmdGVyKGxpc3QsIG5vZGUsIHZhbHVlKSB7XG5cdFx0Ly8gYXNzdW1lcyB0aGF0IG5vZGUgIT0gbGlzdC50YWlsICYmIHZhbHVlcy5sZW5ndGggPj0gMFxuXHRcdHZhciBuZXh0ID0gbm9kZS5uZXh0O1xuXG5cdFx0dmFyIG5ld05vZGUgPSB7IHZhbHVlOiB2YWx1ZSwgcHJldjogbm9kZSwgbmV4dDogbmV4dCB9O1xuXHRcdG5vZGUubmV4dCA9IG5ld05vZGU7XG5cdFx0bmV4dC5wcmV2ID0gbmV3Tm9kZTtcblx0XHRsaXN0Lmxlbmd0aCsrO1xuXG5cdFx0cmV0dXJuIG5ld05vZGU7XG5cdH1cblx0LyoqXG5cdCAqIFJlbW92ZXMgYGNvdW50YCBub2RlcyBhZnRlciB0aGUgZ2l2ZW4gbm9kZS4gVGhlIGdpdmVuIG5vZGUgd2lsbCBub3QgYmUgcmVtb3ZlZC5cblx0ICpcblx0ICogQHBhcmFtIHtMaW5rZWRMaXN0PFQ+fSBsaXN0XG5cdCAqIEBwYXJhbSB7TGlua2VkTGlzdE5vZGU8VD59IG5vZGVcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvdW50XG5cdCAqIEB0ZW1wbGF0ZSBUXG5cdCAqL1xuXHRmdW5jdGlvbiByZW1vdmVSYW5nZShsaXN0LCBub2RlLCBjb3VudCkge1xuXHRcdHZhciBuZXh0ID0gbm9kZS5uZXh0O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQgJiYgbmV4dCAhPT0gbGlzdC50YWlsOyBpKyspIHtcblx0XHRcdG5leHQgPSBuZXh0Lm5leHQ7XG5cdFx0fVxuXHRcdG5vZGUubmV4dCA9IG5leHQ7XG5cdFx0bmV4dC5wcmV2ID0gbm9kZTtcblx0XHRsaXN0Lmxlbmd0aCAtPSBpO1xuXHR9XG5cdC8qKlxuXHQgKiBAcGFyYW0ge0xpbmtlZExpc3Q8VD59IGxpc3Rcblx0ICogQHJldHVybnMge1RbXX1cblx0ICogQHRlbXBsYXRlIFRcblx0ICovXG5cdGZ1bmN0aW9uIHRvQXJyYXkobGlzdCkge1xuXHRcdHZhciBhcnJheSA9IFtdO1xuXHRcdHZhciBub2RlID0gbGlzdC5oZWFkLm5leHQ7XG5cdFx0d2hpbGUgKG5vZGUgIT09IGxpc3QudGFpbCkge1xuXHRcdFx0YXJyYXkucHVzaChub2RlLnZhbHVlKTtcblx0XHRcdG5vZGUgPSBub2RlLm5leHQ7XG5cdFx0fVxuXHRcdHJldHVybiBhcnJheTtcblx0fVxuXG5cblx0aWYgKCFfc2VsZi5kb2N1bWVudCkge1xuXHRcdGlmICghX3NlbGYuYWRkRXZlbnRMaXN0ZW5lcikge1xuXHRcdFx0Ly8gaW4gTm9kZS5qc1xuXHRcdFx0cmV0dXJuIF87XG5cdFx0fVxuXG5cdFx0aWYgKCFfLmRpc2FibGVXb3JrZXJNZXNzYWdlSGFuZGxlcikge1xuXHRcdFx0Ly8gSW4gd29ya2VyXG5cdFx0XHRfc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGV2dCkge1xuXHRcdFx0XHR2YXIgbWVzc2FnZSA9IEpTT04ucGFyc2UoZXZ0LmRhdGEpO1xuXHRcdFx0XHR2YXIgbGFuZyA9IG1lc3NhZ2UubGFuZ3VhZ2U7XG5cdFx0XHRcdHZhciBjb2RlID0gbWVzc2FnZS5jb2RlO1xuXHRcdFx0XHR2YXIgaW1tZWRpYXRlQ2xvc2UgPSBtZXNzYWdlLmltbWVkaWF0ZUNsb3NlO1xuXG5cdFx0XHRcdF9zZWxmLnBvc3RNZXNzYWdlKF8uaGlnaGxpZ2h0KGNvZGUsIF8ubGFuZ3VhZ2VzW2xhbmddLCBsYW5nKSk7XG5cdFx0XHRcdGlmIChpbW1lZGlhdGVDbG9zZSkge1xuXHRcdFx0XHRcdF9zZWxmLmNsb3NlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIGZhbHNlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gXztcblx0fVxuXG5cdC8vIEdldCBjdXJyZW50IHNjcmlwdCBhbmQgaGlnaGxpZ2h0XG5cdHZhciBzY3JpcHQgPSBfLnV0aWwuY3VycmVudFNjcmlwdCgpO1xuXG5cdGlmIChzY3JpcHQpIHtcblx0XHRfLmZpbGVuYW1lID0gc2NyaXB0LnNyYztcblxuXHRcdGlmIChzY3JpcHQuaGFzQXR0cmlidXRlKCdkYXRhLW1hbnVhbCcpKSB7XG5cdFx0XHRfLm1hbnVhbCA9IHRydWU7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gaGlnaGxpZ2h0QXV0b21hdGljYWxseUNhbGxiYWNrKCkge1xuXHRcdGlmICghXy5tYW51YWwpIHtcblx0XHRcdF8uaGlnaGxpZ2h0QWxsKCk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCFfLm1hbnVhbCkge1xuXHRcdC8vIElmIHRoZSBkb2N1bWVudCBzdGF0ZSBpcyBcImxvYWRpbmdcIiwgdGhlbiB3ZSdsbCB1c2UgRE9NQ29udGVudExvYWRlZC5cblx0XHQvLyBJZiB0aGUgZG9jdW1lbnQgc3RhdGUgaXMgXCJpbnRlcmFjdGl2ZVwiIGFuZCB0aGUgcHJpc20uanMgc2NyaXB0IGlzIGRlZmVycmVkLCB0aGVuIHdlJ2xsIGFsc28gdXNlIHRoZVxuXHRcdC8vIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBzb21lIHBsdWdpbnMgb3IgbGFuZ3VhZ2VzIHdoaWNoIGhhdmUgYWxzbyBiZWVuIGRlZmVycmVkIGFuZCB0aGV5XG5cdFx0Ly8gbWlnaHQgdGFrZSBsb25nZXIgb25lIGFuaW1hdGlvbiBmcmFtZSB0byBleGVjdXRlIHdoaWNoIGNhbiBjcmVhdGUgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSBvbmx5IHNvbWUgcGx1Z2lucyBoYXZlXG5cdFx0Ly8gYmVlbiBsb2FkZWQgd2hlbiBQcmlzbS5oaWdobGlnaHRBbGwoKSBpcyBleGVjdXRlZCwgZGVwZW5kaW5nIG9uIGhvdyBmYXN0IHJlc291cmNlcyBhcmUgbG9hZGVkLlxuXHRcdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vUHJpc21KUy9wcmlzbS9pc3N1ZXMvMjEwMlxuXHRcdHZhciByZWFkeVN0YXRlID0gZG9jdW1lbnQucmVhZHlTdGF0ZTtcblx0XHRpZiAocmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8IHJlYWR5U3RhdGUgPT09ICdpbnRlcmFjdGl2ZScgJiYgc2NyaXB0ICYmIHNjcmlwdC5kZWZlcikge1xuXHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGhpZ2hsaWdodEF1dG9tYXRpY2FsbHlDYWxsYmFjayk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG5cdFx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaGlnaGxpZ2h0QXV0b21hdGljYWxseUNhbGxiYWNrKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KGhpZ2hsaWdodEF1dG9tYXRpY2FsbHlDYWxsYmFjaywgMTYpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBfO1xuXG59KF9zZWxmKSk7XG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuXHRtb2R1bGUuZXhwb3J0cyA9IFByaXNtO1xufVxuXG4vLyBoYWNrIGZvciBjb21wb25lbnRzIHRvIHdvcmsgY29ycmVjdGx5IGluIG5vZGUuanNcbmlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuXHRnbG9iYWwuUHJpc20gPSBQcmlzbTtcbn1cblxuLy8gc29tZSBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24vdHlwZXNcblxuLyoqXG4gKiBUaGUgZXhwYW5zaW9uIG9mIGEgc2ltcGxlIGBSZWdFeHBgIGxpdGVyYWwgdG8gc3VwcG9ydCBhZGRpdGlvbmFsIHByb3BlcnRpZXMuXG4gKlxuICogQHR5cGVkZWYgR3JhbW1hclRva2VuXG4gKiBAcHJvcGVydHkge1JlZ0V4cH0gcGF0dGVybiBUaGUgcmVndWxhciBleHByZXNzaW9uIG9mIHRoZSB0b2tlbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvb2tiZWhpbmQ9ZmFsc2VdIElmIGB0cnVlYCwgdGhlbiB0aGUgZmlyc3QgY2FwdHVyaW5nIGdyb3VwIG9mIGBwYXR0ZXJuYCB3aWxsIChlZmZlY3RpdmVseSlcbiAqIGJlaGF2ZSBhcyBhIGxvb2tiZWhpbmQgZ3JvdXAgbWVhbmluZyB0aGF0IHRoZSBjYXB0dXJlZCB0ZXh0IHdpbGwgbm90IGJlIHBhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCBvZiB0aGUgbmV3IHRva2VuLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZ3JlZWR5PWZhbHNlXSBXaGV0aGVyIHRoZSB0b2tlbiBpcyBncmVlZHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ3xzdHJpbmdbXX0gW2FsaWFzXSBBbiBvcHRpb25hbCBhbGlhcyBvciBsaXN0IG9mIGFsaWFzZXMuXG4gKiBAcHJvcGVydHkge0dyYW1tYXJ9IFtpbnNpZGVdIFRoZSBuZXN0ZWQgZ3JhbW1hciBvZiB0aGlzIHRva2VuLlxuICpcbiAqIFRoZSBgaW5zaWRlYCBncmFtbWFyIHdpbGwgYmUgdXNlZCB0byB0b2tlbml6ZSB0aGUgdGV4dCB2YWx1ZSBvZiBlYWNoIHRva2VuIG9mIHRoaXMga2luZC5cbiAqXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIG1ha2UgbmVzdGVkIGFuZCBldmVuIHJlY3Vyc2l2ZSBsYW5ndWFnZSBkZWZpbml0aW9ucy5cbiAqXG4gKiBOb3RlOiBUaGlzIGNhbiBjYXVzZSBpbmZpbml0ZSByZWN1cnNpb24uIEJlIGNhcmVmdWwgd2hlbiB5b3UgZW1iZWQgZGlmZmVyZW50IGxhbmd1YWdlcyBvciBldmVuIHRoZSBzYW1lIGxhbmd1YWdlIGludG9cbiAqIGVhY2ggYW5vdGhlci5cbiAqIEBnbG9iYWxcbiAqIEBwdWJsaWNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdyYW1tYXJcbiAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBSZWdFeHAgfCBHcmFtbWFyVG9rZW4gfCBBcnJheTxSZWdFeHAgfCBHcmFtbWFyVG9rZW4+Pn1cbiAqIEBwcm9wZXJ0eSB7R3JhbW1hcn0gW3Jlc3RdIEFuIG9wdGlvbmFsIGdyYW1tYXIgb2JqZWN0IHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzIGdyYW1tYXIuXG4gKiBAZ2xvYmFsXG4gKiBAcHVibGljXG4gKi9cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHdoaWNoIHdpbGwgaW52b2tlZCBhZnRlciBhbiBlbGVtZW50IHdhcyBzdWNjZXNzZnVsbHkgaGlnaGxpZ2h0ZWQuXG4gKlxuICogQGNhbGxiYWNrIEhpZ2hsaWdodENhbGxiYWNrXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnQgc3VjY2Vzc2Z1bGx5IGhpZ2hsaWdodGVkLlxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAZ2xvYmFsXG4gKiBAcHVibGljXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSG9va0NhbGxiYWNrXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IGVudiBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9mIHRoZSBob29rLlxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAZ2xvYmFsXG4gKiBAcHVibGljXG4gKi9cbjtcblByaXNtLmxhbmd1YWdlcy5tYXJrdXAgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC88IS0tKD86KD8hPCEtLSlbXFxzXFxTXSkqPy0tPi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdwcm9sb2cnOiB7XG5cdFx0cGF0dGVybjogLzxcXD9bXFxzXFxTXSs/XFw/Pi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdkb2N0eXBlJzoge1xuXHRcdC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi94bWwvI05ULWRvY3R5cGVkZWNsXG5cdFx0cGF0dGVybjogLzwhRE9DVFlQRSg/OltePlwiJ1tcXF1dfFwiW15cIl0qXCJ8J1teJ10qJykrKD86XFxbKD86W148XCInXFxdXXxcIlteXCJdKlwifCdbXiddKid8PCg/ISEtLSl8PCEtLSg/OlteLV18LSg/IS0+KSkqLS0+KSpcXF1cXHMqKT8+L2ksXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVybmFsLXN1YnNldCc6IHtcblx0XHRcdFx0cGF0dGVybjogLyheW15cXFtdKlxcWylbXFxzXFxTXSsoPz1cXF0+JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXCJbXlwiXSpcInwnW14nXSonLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL148IXw+JHxbW1xcXV0vLFxuXHRcdFx0J2RvY3R5cGUtdGFnJzogL15ET0NUWVBFL2ksXG5cdFx0XHQnbmFtZSc6IC9bXlxcczw+J1wiXSsvXG5cdFx0fVxuXHR9LFxuXHQnY2RhdGEnOiB7XG5cdFx0cGF0dGVybjogLzwhXFxbQ0RBVEFcXFtbXFxzXFxTXSo/XFxdXFxdPi9pLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQndGFnJzoge1xuXHRcdHBhdHRlcm46IC88XFwvPyg/IVxcZClbXlxccz5cXC89JDwlXSsoPzpcXHMoPzpcXHMqW15cXHM+XFwvPV0rKD86XFxzKj1cXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFteXFxzJ1wiPj1dKyg/PVtcXHM+XSkpfCg/PVtcXHMvPl0pKSkrKT9cXHMqXFwvPz4vLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd0YWcnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9ePFxcLz9bXlxccz5cXC9dKy8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9ePFxcLz8vLFxuXHRcdFx0XHRcdCduYW1lc3BhY2UnOiAvXlteXFxzPlxcLzpdKzovXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnc3BlY2lhbC1hdHRyJzogW10sXG5cdFx0XHQnYXR0ci12YWx1ZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLz1cXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFteXFxzJ1wiPj1dKykvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9ePS8sXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAnYXR0ci1lcXVhbHMnXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMqKVtcIiddfFtcIiddJC8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFwvPz4vLFxuXHRcdFx0J2F0dHItbmFtZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL1teXFxzPlxcL10rLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J25hbWVzcGFjZSc6IC9eW15cXHM+XFwvOl0rOi9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0fVxuXHR9LFxuXHQnZW50aXR5JzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8mW1xcZGEtel17MSw4fTsvaSxcblx0XHRcdGFsaWFzOiAnbmFtZWQtZW50aXR5J1xuXHRcdH0sXG5cdFx0LyYjeD9bXFxkYS1mXXsxLDh9Oy9pXG5cdF1cbn07XG5cblByaXNtLmxhbmd1YWdlcy5tYXJrdXBbJ3RhZyddLmluc2lkZVsnYXR0ci12YWx1ZSddLmluc2lkZVsnZW50aXR5J10gPVxuXHRQcmlzbS5sYW5ndWFnZXMubWFya3VwWydlbnRpdHknXTtcblByaXNtLmxhbmd1YWdlcy5tYXJrdXBbJ2RvY3R5cGUnXS5pbnNpZGVbJ2ludGVybmFsLXN1YnNldCddLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5tYXJrdXA7XG5cbi8vIFBsdWdpbiB0byBtYWtlIGVudGl0eSB0aXRsZSBzaG93IHRoZSByZWFsIGVudGl0eSwgaWRlYSBieSBSb21hbiBLb21hcm92XG5QcmlzbS5ob29rcy5hZGQoJ3dyYXAnLCBmdW5jdGlvbiAoZW52KSB7XG5cblx0aWYgKGVudi50eXBlID09PSAnZW50aXR5Jykge1xuXHRcdGVudi5hdHRyaWJ1dGVzWyd0aXRsZSddID0gZW52LmNvbnRlbnQucmVwbGFjZSgvJmFtcDsvLCAnJicpO1xuXHR9XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFByaXNtLmxhbmd1YWdlcy5tYXJrdXAudGFnLCAnYWRkSW5saW5lZCcsIHtcblx0LyoqXG5cdCAqIEFkZHMgYW4gaW5saW5lZCBsYW5ndWFnZSB0byBtYXJrdXAuXG5cdCAqXG5cdCAqIEFuIGV4YW1wbGUgb2YgYW4gaW5saW5lZCBsYW5ndWFnZSBpcyBDU1Mgd2l0aCBgPHN0eWxlPmAgdGFncy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgVGhlIG5hbWUgb2YgdGhlIHRhZyB0aGF0IGNvbnRhaW5zIHRoZSBpbmxpbmVkIGxhbmd1YWdlLiBUaGlzIG5hbWUgd2lsbCBiZSB0cmVhdGVkIGFzXG5cdCAqIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsYW5nIFRoZSBsYW5ndWFnZSBrZXkuXG5cdCAqIEBleGFtcGxlXG5cdCAqIGFkZElubGluZWQoJ3N0eWxlJywgJ2NzcycpO1xuXHQgKi9cblx0dmFsdWU6IGZ1bmN0aW9uIGFkZElubGluZWQodGFnTmFtZSwgbGFuZykge1xuXHRcdHZhciBpbmNsdWRlZENkYXRhSW5zaWRlID0ge307XG5cdFx0aW5jbHVkZWRDZGF0YUluc2lkZVsnbGFuZ3VhZ2UtJyArIGxhbmddID0ge1xuXHRcdFx0cGF0dGVybjogLyhePCFcXFtDREFUQVxcWylbXFxzXFxTXSs/KD89XFxdXFxdPiQpL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXNbbGFuZ11cblx0XHR9O1xuXHRcdGluY2x1ZGVkQ2RhdGFJbnNpZGVbJ2NkYXRhJ10gPSAvXjwhXFxbQ0RBVEFcXFt8XFxdXFxdPiQvaTtcblxuXHRcdHZhciBpbnNpZGUgPSB7XG5cdFx0XHQnaW5jbHVkZWQtY2RhdGEnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC88IVxcW0NEQVRBXFxbW1xcc1xcU10qP1xcXVxcXT4vaSxcblx0XHRcdFx0aW5zaWRlOiBpbmNsdWRlZENkYXRhSW5zaWRlXG5cdFx0XHR9XG5cdFx0fTtcblx0XHRpbnNpZGVbJ2xhbmd1YWdlLScgKyBsYW5nXSA9IHtcblx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXNbbGFuZ11cblx0XHR9O1xuXG5cdFx0dmFyIGRlZiA9IHt9O1xuXHRcdGRlZlt0YWdOYW1lXSA9IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKDxfX1tePl0qPikoPzo8IVxcW0NEQVRBXFxbKD86W15cXF1dfFxcXSg/IVxcXT4pKSpcXF1cXF0+fCg/ITwhXFxbQ0RBVEFcXFspW1xcc1xcU10pKj8oPz08XFwvX18+KS8uc291cmNlLnJlcGxhY2UoL19fL2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRhZ05hbWU7IH0pLCAnaScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZTogaW5zaWRlXG5cdFx0fTtcblxuXHRcdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ21hcmt1cCcsICdjZGF0YScsIGRlZik7XG5cdH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFByaXNtLmxhbmd1YWdlcy5tYXJrdXAudGFnLCAnYWRkQXR0cmlidXRlJywge1xuXHQvKipcblx0ICogQWRkcyBhbiBwYXR0ZXJuIHRvIGhpZ2hsaWdodCBsYW5ndWFnZXMgZW1iZWRkZWQgaW4gSFRNTCBhdHRyaWJ1dGVzLlxuXHQgKlxuXHQgKiBBbiBleGFtcGxlIG9mIGFuIGlubGluZWQgbGFuZ3VhZ2UgaXMgQ1NTIHdpdGggYHN0eWxlYCBhdHRyaWJ1dGVzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYXR0ck5hbWUgVGhlIG5hbWUgb2YgdGhlIHRhZyB0aGF0IGNvbnRhaW5zIHRoZSBpbmxpbmVkIGxhbmd1YWdlLiBUaGlzIG5hbWUgd2lsbCBiZSB0cmVhdGVkIGFzXG5cdCAqIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsYW5nIFRoZSBsYW5ndWFnZSBrZXkuXG5cdCAqIEBleGFtcGxlXG5cdCAqIGFkZEF0dHJpYnV0ZSgnc3R5bGUnLCAnY3NzJyk7XG5cdCAqL1xuXHR2YWx1ZTogZnVuY3Rpb24gKGF0dHJOYW1lLCBsYW5nKSB7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzLm1hcmt1cC50YWcuaW5zaWRlWydzcGVjaWFsLWF0dHInXS5wdXNoKHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0LyhefFtcIidcXHNdKS8uc291cmNlICsgJyg/OicgKyBhdHRyTmFtZSArICcpJyArIC9cXHMqPVxccyooPzpcIlteXCJdKlwifCdbXiddKid8W15cXHMnXCI+PV0rKD89W1xccz5dKSkvLnNvdXJjZSxcblx0XHRcdFx0J2knXG5cdFx0XHQpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnYXR0ci1uYW1lJzogL15bXlxccz1dKy8sXG5cdFx0XHRcdCdhdHRyLXZhbHVlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC89W1xcc1xcU10rLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCd2YWx1ZSc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyhePVxccyooW1wiJ118KD8hW1wiJ10pKSlcXFNbXFxzXFxTXSooPz1cXDIkKS8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiBbbGFuZywgJ2xhbmd1YWdlLScgKyBsYW5nXSxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXNbbGFuZ11cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiBbXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXj0vLFxuXHRcdFx0XHRcdFx0XHRcdGFsaWFzOiAnYXR0ci1lcXVhbHMnXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdC9cInwnL1xuXHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmh0bWwgPSBQcmlzbS5sYW5ndWFnZXMubWFya3VwO1xuUHJpc20ubGFuZ3VhZ2VzLm1hdGhtbCA9IFByaXNtLmxhbmd1YWdlcy5tYXJrdXA7XG5QcmlzbS5sYW5ndWFnZXMuc3ZnID0gUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cDtcblxuUHJpc20ubGFuZ3VhZ2VzLnhtbCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ21hcmt1cCcsIHt9KTtcblByaXNtLmxhbmd1YWdlcy5zc21sID0gUHJpc20ubGFuZ3VhZ2VzLnhtbDtcblByaXNtLmxhbmd1YWdlcy5hdG9tID0gUHJpc20ubGFuZ3VhZ2VzLnhtbDtcblByaXNtLmxhbmd1YWdlcy5yc3MgPSBQcmlzbS5sYW5ndWFnZXMueG1sO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIHN0cmluZyA9IC8oPzpcIig/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteXCJcXFxcXFxyXFxuXSkqXCJ8Jyg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteJ1xcXFxcXHJcXG5dKSonKS87XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmNzcyA9IHtcblx0XHQnY29tbWVudCc6IC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0XHQnYXRydWxlJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCdAW1xcXFx3LV0oPzonICsgL1teO3tcXHNcIiddfFxccysoPyFcXHMpLy5zb3VyY2UgKyAnfCcgKyBzdHJpbmcuc291cmNlICsgJykqPycgKyAvKD86O3woPz1cXHMqXFx7KSkvLnNvdXJjZSksXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3J1bGUnOiAvXkBbXFx3LV0rLyxcblx0XHRcdFx0J3NlbGVjdG9yLWZ1bmN0aW9uLWFyZ3VtZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXFxic2VsZWN0b3JcXHMqXFwoXFxzKig/IVtcXHMpXSkpKD86W14oKVxcc118XFxzKyg/IVtcXHMpXSl8XFwoKD86W14oKV18XFwoW14oKV0qXFwpKSpcXCkpKyg/PVxccypcXCkpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnc2VsZWN0b3InXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdy1dKSg/OmFuZHxub3R8b25seXxvcikoPyFbXFx3LV0pLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gU2VlIHJlc3QgYmVsb3dcblx0XHRcdH1cblx0XHR9LFxuXHRcdCd1cmwnOiB7XG5cdFx0XHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXZhbHVlcy0zLyN1cmxzXG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJ1xcXFxidXJsXFxcXCgoPzonICsgc3RyaW5nLnNvdXJjZSArICd8JyArIC8oPzpbXlxcXFxcXHJcXG4oKVwiJ118XFxcXFtcXHNcXFNdKSovLnNvdXJjZSArICcpXFxcXCknLCAnaScpLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdmdW5jdGlvbic6IC9edXJsL2ksXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFwofFxcKSQvLFxuXHRcdFx0XHQnc3RyaW5nJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnXicgKyBzdHJpbmcuc291cmNlICsgJyQnKSxcblx0XHRcdFx0XHRhbGlhczogJ3VybCdcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3NlbGVjdG9yJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCcoXnxbe31cXFxcc10pW157fVxcXFxzXSg/Oltee307XCJcXCdcXFxcc118XFxcXHMrKD8hW1xcXFxze10pfCcgKyBzdHJpbmcuc291cmNlICsgJykqKD89XFxcXHMqXFxcXHspJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogc3RyaW5nLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQncHJvcGVydHknOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14tXFx3XFx4QTAtXFx1RkZGRl0pKD8hXFxzKVstX2EtelxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVstXFx3XFx4QTAtXFx1RkZGRl0pKig/PVxccyo6KS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2ltcG9ydGFudCc6IC8haW1wb3J0YW50XFxiL2ksXG5cdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteLWEtejAtOV0pWy1hLXowLTldKyg/PVxcKCkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKCl7fTs6LF0vXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmNzc1snYXRydWxlJ10uaW5zaWRlLnJlc3QgPSBQcmlzbS5sYW5ndWFnZXMuY3NzO1xuXG5cdHZhciBtYXJrdXAgPSBQcmlzbS5sYW5ndWFnZXMubWFya3VwO1xuXHRpZiAobWFya3VwKSB7XG5cdFx0bWFya3VwLnRhZy5hZGRJbmxpbmVkKCdzdHlsZScsICdjc3MnKTtcblx0XHRtYXJrdXAudGFnLmFkZEF0dHJpYnV0ZSgnc3R5bGUnLCAnY3NzJyk7XG5cdH1cblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuY2xpa2UgPSB7XG5cdCdjb21tZW50JzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXDpdKVxcL1xcLy4qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhbXCInXSkoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogLyhcXGIoPzpjbGFzc3xleHRlbmRzfGltcGxlbWVudHN8aW5zdGFuY2VvZnxpbnRlcmZhY2V8bmV3fHRyYWl0KVxccyt8XFxiY2F0Y2hcXHMrXFwoKVtcXHcuXFxcXF0rL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9bLlxcXFxdL1xuXHRcdH1cblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YnJlYWt8Y2F0Y2h8Y29udGludWV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnxpZnxpbnxpbnN0YW5jZW9mfG5ld3xudWxsfHJldHVybnx0aHJvd3x0cnl8d2hpbGUpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnZnVuY3Rpb24nOiAvXFxiXFx3Kyg/PVxcKCkvLFxuXHQnbnVtYmVyJzogL1xcYjB4W1xcZGEtZl0rXFxifCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzplWystXT9cXGQrKT8vaSxcblx0J29wZXJhdG9yJzogL1s8Pl09P3xbIT1dPT89P3wtLT98XFwrXFwrP3wmJj98XFx8XFx8P3xbPyovfl4lXS8sXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLC46XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdjbGFzcy1uYW1lJzogW1xuXHRcdFByaXNtLmxhbmd1YWdlcy5jbGlrZVsnY2xhc3MtbmFtZSddLFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXiRcXHdcXHhBMC1cXHVGRkZGXSkoPyFcXHMpW18kQS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqKD89XFwuKD86Y29uc3RydWN0b3J8cHJvdG90eXBlKSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J2tleXdvcmQnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLygoPzpefFxcfSlcXHMqKWNhdGNoXFxiLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXi5dfFxcLlxcLlxcLlxccyopXFxiKD86YXN8YXNzZXJ0KD89XFxzKlxceyl8YXN5bmMoPz1cXHMqKD86ZnVuY3Rpb25cXGJ8XFwofFskXFx3XFx4QTAtXFx1RkZGRl18JCkpfGF3YWl0fGJyZWFrfGNhc2V8Y2xhc3N8Y29uc3R8Y29udGludWV8ZGVidWdnZXJ8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxlbnVtfGV4cG9ydHxleHRlbmRzfGZpbmFsbHkoPz1cXHMqKD86XFx7fCQpKXxmb3J8ZnJvbSg/PVxccyooPzpbJ1wiXXwkKSl8ZnVuY3Rpb258KD86Z2V0fHNldCkoPz1cXHMqKD86WyNcXFskXFx3XFx4QTAtXFx1RkZGRl18JCkpfGlmfGltcGxlbWVudHN8aW1wb3J0fGlufGluc3RhbmNlb2Z8aW50ZXJmYWNlfGxldHxuZXd8bnVsbHxvZnxwYWNrYWdlfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xyZXR1cm58c3RhdGljfHN1cGVyfHN3aXRjaHx0aGlzfHRocm93fHRyeXx0eXBlb2Z8dW5kZWZpbmVkfHZhcnx2b2lkfHdoaWxlfHdpdGh8eWllbGQpXFxiLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRdLFxuXHQvLyBBbGxvdyBmb3IgYWxsIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIChTZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjAwODQ0NClcblx0J2Z1bmN0aW9uJzogLyM/KD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKig/PVxccyooPzpcXC5cXHMqKD86YXBwbHl8YmluZHxjYWxsKVxccyopP1xcKCkvLFxuXHQnbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdC8oXnxbXlxcdyRdKS8uc291cmNlICtcblx0XHRcdCcoPzonICtcblx0XHRcdChcblx0XHRcdFx0Ly8gY29uc3RhbnRcblx0XHRcdFx0L05hTnxJbmZpbml0eS8uc291cmNlICtcblx0XHRcdFx0J3wnICtcblx0XHRcdFx0Ly8gYmluYXJ5IGludGVnZXJcblx0XHRcdFx0LzBbYkJdWzAxXSsoPzpfWzAxXSspKm4/Ly5zb3VyY2UgK1xuXHRcdFx0XHQnfCcgK1xuXHRcdFx0XHQvLyBvY3RhbCBpbnRlZ2VyXG5cdFx0XHRcdC8wW29PXVswLTddKyg/Ol9bMC03XSspKm4/Ly5zb3VyY2UgK1xuXHRcdFx0XHQnfCcgK1xuXHRcdFx0XHQvLyBoZXhhZGVjaW1hbCBpbnRlZ2VyXG5cdFx0XHRcdC8wW3hYXVtcXGRBLUZhLWZdKyg/Ol9bXFxkQS1GYS1mXSspKm4/Ly5zb3VyY2UgK1xuXHRcdFx0XHQnfCcgK1xuXHRcdFx0XHQvLyBkZWNpbWFsIGJpZ2ludFxuXHRcdFx0XHQvXFxkKyg/Ol9cXGQrKSpuLy5zb3VyY2UgK1xuXHRcdFx0XHQnfCcgK1xuXHRcdFx0XHQvLyBkZWNpbWFsIG51bWJlciAoaW50ZWdlciBvciBmbG9hdCkgYnV0IG5vIGJpZ2ludFxuXHRcdFx0XHQvKD86XFxkKyg/Ol9cXGQrKSooPzpcXC4oPzpcXGQrKD86X1xcZCspKik/KT98XFwuXFxkKyg/Ol9cXGQrKSopKD86W0VlXVsrLV0/XFxkKyg/Ol9cXGQrKSopPy8uc291cmNlXG5cdFx0XHQpICtcblx0XHRcdCcpJyArXG5cdFx0XHQvKD8hW1xcdyRdKS8uc291cmNlXG5cdFx0KSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdvcGVyYXRvcic6IC8tLXxcXCtcXCt8XFwqXFwqPT98PT58JiY9P3xcXHxcXHw9P3xbIT1dPT18PDw9P3w+Pj4/PT98Wy0rKi8lJnxeIT08Pl09P3xcXC57M318XFw/XFw/PT98XFw/XFwuP3xbfjpdL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0WydjbGFzcy1uYW1lJ11bMF0ucGF0dGVybiA9IC8oXFxiKD86Y2xhc3N8ZXh0ZW5kc3xpbXBsZW1lbnRzfGluc3RhbmNlb2Z8aW50ZXJmYWNlfG5ldylcXHMrKVtcXHcuXFxcXF0rLztcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnamF2YXNjcmlwdCcsICdrZXl3b3JkJywge1xuXHQncmVnZXgnOiB7XG5cdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0Ly8gbG9va2JlaGluZFxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1kdXBlLWNoYXJhY3RlcnMtY2hhcmFjdGVyLWNsYXNzXG5cdFx0XHQvKCg/Ol58W14kXFx3XFx4QTAtXFx1RkZGRi5cIidcXF0pXFxzXXxcXGIoPzpyZXR1cm58eWllbGQpKVxccyopLy5zb3VyY2UgK1xuXHRcdFx0Ly8gUmVnZXggcGF0dGVybjpcblx0XHRcdC8vIFRoZXJlIGFyZSAyIHJlZ2V4IHBhdHRlcm5zIGhlcmUuIFRoZSBSZWdFeHAgc2V0IG5vdGF0aW9uIHByb3Bvc2FsIGFkZGVkIHN1cHBvcnQgZm9yIG5lc3RlZCBjaGFyYWN0ZXJcblx0XHRcdC8vIGNsYXNzZXMgaWYgdGhlIGB2YCBmbGFnIGlzIHByZXNlbnQuIFVuZm9ydHVuYXRlbHksIG5lc3RlZCBDQ3MgYXJlIGJvdGggY29udGV4dC1mcmVlIGFuZCBpbmNvbXBhdGlibGVcblx0XHRcdC8vIHdpdGggdGhlIG9ubHkgc3ludGF4LCBzbyB3ZSBoYXZlIHRvIGRlZmluZSAyIGRpZmZlcmVudCByZWdleCBwYXR0ZXJucy5cblx0XHRcdC9cXC8vLnNvdXJjZSArXG5cdFx0XHQnKD86JyArXG5cdFx0XHQvKD86XFxbKD86W15cXF1cXFxcXFxyXFxuXXxcXFxcLikqXFxdfFxcXFwufFteL1xcXFxcXFtcXHJcXG5dKStcXC9bZGdpbXl1c117MCw3fS8uc291cmNlICtcblx0XHRcdCd8JyArXG5cdFx0XHQvLyBgdmAgZmxhZyBzeW50YXguIFRoaXMgc3VwcG9ydHMgMyBsZXZlbHMgb2YgbmVzdGVkIGNoYXJhY3RlciBjbGFzc2VzLlxuXHRcdFx0Lyg/OlxcWyg/OlteW1xcXVxcXFxcXHJcXG5dfFxcXFwufFxcWyg/OlteW1xcXVxcXFxcXHJcXG5dfFxcXFwufFxcWyg/OlteW1xcXVxcXFxcXHJcXG5dfFxcXFwuKSpcXF0pKlxcXSkqXFxdfFxcXFwufFteL1xcXFxcXFtcXHJcXG5dKStcXC9bZGdpbXl1c117MCw3fXZbZGdpbXl1c117MCw3fS8uc291cmNlICtcblx0XHRcdCcpJyArXG5cdFx0XHQvLyBsb29rYWhlYWRcblx0XHRcdC8oPz0oPzpcXHN8XFwvXFwqKD86W14qXXxcXCooPyFcXC8pKSpcXCpcXC8pKig/OiR8W1xcclxcbiwuOzp9KVxcXV18XFwvXFwvKSkvLnNvdXJjZVxuXHRcdCksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncmVnZXgtc291cmNlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXihcXC8pW1xcc1xcU10rKD89XFwvW2Etel0qJCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLXJlZ2V4Jyxcblx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucmVnZXhcblx0XHRcdH0sXG5cdFx0XHQncmVnZXgtZGVsaW1pdGVyJzogL15cXC98XFwvJC8sXG5cdFx0XHQncmVnZXgtZmxhZ3MnOiAvXlthLXpdKyQvLFxuXHRcdH1cblx0fSxcblx0Ly8gVGhpcyBtdXN0IGJlIGRlY2xhcmVkIGJlZm9yZSBrZXl3b3JkIGJlY2F1c2Ugd2UgdXNlIFwiZnVuY3Rpb25cIiBpbnNpZGUgdGhlIGxvb2stZm9yd2FyZFxuXHQnZnVuY3Rpb24tdmFyaWFibGUnOiB7XG5cdFx0cGF0dGVybjogLyM/KD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKig/PVxccypbPTpdXFxzKig/OmFzeW5jXFxzKik/KD86XFxiZnVuY3Rpb25cXGJ8KD86XFwoKD86W14oKV18XFwoW14oKV0qXFwpKSpcXCl8KD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKilcXHMqPT4pKS8sXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J3BhcmFtZXRlcic6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKGZ1bmN0aW9uKD86XFxzKyg/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSopP1xccypcXChcXHMqKSg/IVxccykoPzpbXigpXFxzXXxcXHMrKD8hW1xccyldKXxcXChbXigpXSpcXCkpKyg/PVxccypcXCkpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14kXFx3XFx4QTAtXFx1RkZGRl0pKD8hXFxzKVtfJGEtelxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKig/PVxccyo9PikvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcKFxccyopKD8hXFxzKSg/OlteKClcXHNdfFxccysoPyFbXFxzKV0pfFxcKFteKCldKlxcKSkrKD89XFxzKlxcKVxccyo9PikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oKD86XFxifFxcc3xeKSg/ISg/OmFzfGFzeW5jfGF3YWl0fGJyZWFrfGNhc2V8Y2F0Y2h8Y2xhc3N8Y29uc3R8Y29udGludWV8ZGVidWdnZXJ8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxlbnVtfGV4cG9ydHxleHRlbmRzfGZpbmFsbHl8Zm9yfGZyb218ZnVuY3Rpb258Z2V0fGlmfGltcGxlbWVudHN8aW1wb3J0fGlufGluc3RhbmNlb2Z8aW50ZXJmYWNlfGxldHxuZXd8bnVsbHxvZnxwYWNrYWdlfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xyZXR1cm58c2V0fHN0YXRpY3xzdXBlcnxzd2l0Y2h8dGhpc3x0aHJvd3x0cnl8dHlwZW9mfHVuZGVmaW5lZHx2YXJ8dm9pZHx3aGlsZXx3aXRofHlpZWxkKSg/IVskXFx3XFx4QTAtXFx1RkZGRl0pKSg/Oig/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSpcXHMqKVxcKFxccyp8XFxdXFxzKlxcKFxccyopKD8hXFxzKSg/OlteKClcXHNdfFxccysoPyFbXFxzKV0pfFxcKFteKCldKlxcKSkrKD89XFxzKlxcKVxccypcXHspLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0fVxuXHRdLFxuXHQnY29uc3RhbnQnOiAvXFxiW0EtWl0oPzpbQS1aX118XFxkeD8pKlxcYi9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdqYXZhc2NyaXB0JywgJ3N0cmluZycsIHtcblx0J2hhc2hiYW5nJzoge1xuXHRcdHBhdHRlcm46IC9eIyEuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnY29tbWVudCdcblx0fSxcblx0J3RlbXBsYXRlLXN0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvYCg/OlxcXFxbXFxzXFxTXXxcXCRcXHsoPzpbXnt9XXxcXHsoPzpbXnt9XXxcXHtbXn1dKlxcfSkqXFx9KStcXH18KD8hXFwkXFx7KVteXFxcXGBdKSpgLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndGVtcGxhdGUtcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eYHxgJC8sXG5cdFx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdFx0fSxcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXFxcXSkoPzpcXFxcezJ9KSopXFwkXFx7KD86W157fV18XFx7KD86W157fV18XFx7W159XSpcXH0pKlxcfSkrXFx9Lyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcJFxce3xcXH0kLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRyZXN0OiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0fVxuXHR9LFxuXHQnc3RyaW5nLXByb3BlcnR5Jzoge1xuXHRcdHBhdHRlcm46IC8oKD86XnxbLHtdKVsgXFx0XSopKFtcIiddKSg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCg/IVxcMilbXlxcXFxcXHJcXG5dKSpcXDIoPz1cXHMqOikvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnamF2YXNjcmlwdCcsICdvcGVyYXRvcicsIHtcblx0J2xpdGVyYWwtcHJvcGVydHknOiB7XG5cdFx0cGF0dGVybjogLygoPzpefFsse10pWyBcXHRdKikoPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqKD89XFxzKjopL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxufSk7XG5cbmlmIChQcmlzbS5sYW5ndWFnZXMubWFya3VwKSB7XG5cdFByaXNtLmxhbmd1YWdlcy5tYXJrdXAudGFnLmFkZElubGluZWQoJ3NjcmlwdCcsICdqYXZhc2NyaXB0Jyk7XG5cblx0Ly8gYWRkIGF0dHJpYnV0ZSBzdXBwb3J0IGZvciBhbGwgRE9NIGV2ZW50cy5cblx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzI1N0YW5kYXJkX2V2ZW50c1xuXHRQcmlzbS5sYW5ndWFnZXMubWFya3VwLnRhZy5hZGRBdHRyaWJ1dGUoXG5cdFx0L29uKD86YWJvcnR8Ymx1cnxjaGFuZ2V8Y2xpY2t8Y29tcG9zaXRpb24oPzplbmR8c3RhcnR8dXBkYXRlKXxkYmxjbGlja3xlcnJvcnxmb2N1cyg/OmlufG91dCk/fGtleSg/OmRvd258dXApfGxvYWR8bW91c2UoPzpkb3dufGVudGVyfGxlYXZlfG1vdmV8b3V0fG92ZXJ8dXApfHJlc2V0fHJlc2l6ZXxzY3JvbGx8c2VsZWN0fHNsb3RjaGFuZ2V8c3VibWl0fHVubG9hZHx3aGVlbCkvLnNvdXJjZSxcblx0XHQnamF2YXNjcmlwdCdcblx0KTtcbn1cblxuUHJpc20ubGFuZ3VhZ2VzLmpzID0gUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHQ7XG5cblByaXNtLmxhbmd1YWdlcy5hYmFwID0ge1xuXHQnY29tbWVudCc6IC9eXFwqLiovbSxcblx0J3N0cmluZyc6IC8oYHwnKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHQnc3RyaW5nLXRlbXBsYXRlJzoge1xuXHRcdHBhdHRlcm46IC8oW3x9XSkoPzpcXFxcLnxbXlxcXFx8e1xcclxcbl0pKig/PVt8e10pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHR9LFxuXHQvKiBFbmQgT2YgTGluZSBjb21tZW50cyBzaG91bGQgbm90IGludGVyZmVyZSB3aXRoIHN0cmluZ3Mgd2hlbiB0aGVcblx0cXVvdGUgY2hhcmFjdGVyIG9jY3VycyB3aXRoaW4gdGhlbS4gV2UgYXNzdW1lIGEgc3RyaW5nIGJlaW5nIGhpZ2hsaWdodGVkXG5cdGluc2lkZSBhbiBFT0wgY29tbWVudCBpcyBtb3JlIGFjY2VwdGFibGUgdGhhbiB0aGUgb3Bwb3NpdGUuXG5cdCovXG5cdCdlb2wtY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58XFxzKVwiLiovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnY29tbWVudCdcblx0fSxcblx0J2tleXdvcmQnOiB7XG5cdFx0cGF0dGVybjogLyhcXHN8XFwufF4pKD86XFwqLUlOUFVUfFxcP1RPfEFCQVAtU09VUkNFfEFCQlJFVklBVEVEfEFCU3xBQlNUUkFDVHxBQ0NFUFR8QUNDRVBUSU5HfEFDQ0VTU1BPTElDWXxBQ0NPUkRJTkd8QUNPU3xBQ1RJVkFUSU9OfEFDVFVBTHxBRER8QURELUNPUlJFU1BPTkRJTkd8QURKQUNFTlR8QUZURVJ8QUxJQVN8QUxJQVNFU3xBTElHTnxBTEx8QUxMT0NBVEV8QUxQSEF8QU5BTFlTSVN8QU5BTFlaRVJ8QU5EfEFOWXxBUFBFTkR8QVBQRU5EQUdFfEFQUEVORElOR3xBUFBMSUNBVElPTnxBUkNISVZFfEFSRUF8QVJJVEhNRVRJQ3xBU3xBU0NFTkRJTkd8QVNJTnxBU1BFQ1R8QVNTRVJUfEFTU0lHTnxBU1NJR05FRHxBU1NJR05JTkd8QVNTT0NJQVRJT058QVNZTkNIUk9OT1VTfEFUfEFUQU58QVRUUklCVVRFU3xBVVRIT1JJVFl8QVVUSE9SSVRZLUNIRUNLfEFWR3xCQUNLfEJBQ0tHUk9VTkR8QkFDS1VQfEJBQ0tXQVJEfEJBREl8QkFTRXxCRUZPUkV8QkVHSU58QkVUV0VFTnxCSUd8QklOQVJZfEJJTkRJTkd8QklUfEJJVC1BTkR8QklULU5PVHxCSVQtT1J8QklULVhPUnxCTEFDS3xCTEFOS3xCTEFOS1N8QkxPQnxCTE9DS3xCTE9DS1N8QkxVRXxCT1VORHxCT1VOREFSSUVTfEJPVU5EU3xCT1hFRHxCUkVBSy1QT0lOVHxCVHxCVUZGRVJ8Qll8QllQQVNTSU5HfEJZVEV8QllURS1DQXxCWVRFLUNOfEJZVEUtQ098QllURS1DU3xCWVRFLU5BfEJZVEUtTlN8QllURS1PUkRFUnxDfENBfENBTEx8Q0FMTElOR3xDQVNFfENBU1R8Q0FTVElOR3xDQVRDSHxDRUlMfENFTlRFUnxDRU5URVJFRHxDSEFJTnxDSEFJTi1JTlBVVHxDSEFJTi1SRVFVRVNUfENIQU5HRXxDSEFOR0lOR3xDSEFOTkVMU3xDSEFSLVRPLUhFWHxDSEFSQUNURVJ8Q0hBUkxFTnxDSEVDS3xDSEVDS0JPWHxDSVJDVUxBUnxDSV98Q0xBU1N8Q0xBU1MtQ09ESU5HfENMQVNTLURBVEF8Q0xBU1MtRVZFTlRTfENMQVNTLU1FVEhPRFN8Q0xBU1MtUE9PTHxDTEVBTlVQfENMRUFSfENMSUVOVHxDTE9CfENMT0NLfENMT1NFfENOfENOVHxDT3xDT0FMRVNDRXxDT0RFfENPRElOR3xDT0xMRUNUfENPTE9SfENPTFVNTnxDT0xVTU5TfENPTF9CQUNLR1JPVU5EfENPTF9HUk9VUHxDT0xfSEVBRElOR3xDT0xfS0VZfENPTF9ORUdBVElWRXxDT0xfTk9STUFMfENPTF9QT1NJVElWRXxDT0xfVE9UQUx8Q09NTUVOVHxDT01NRU5UU3xDT01NSVR8Q09NTU9OfENPTU1VTklDQVRJT058Q09NUEFSSU5HfENPTVBPTkVOVHxDT01QT05FTlRTfENPTVBSRVNTSU9OfENPTVBVVEV8Q09OQ0FUfENPTkNBVEVOQVRFfENPTkR8Q09OREVOU0V8Q09ORElUSU9OfENPTk5FQ1R8Q09OTkVDVElPTnxDT05TVEFOVFN8Q09OVEVYVHxDT05URVhUU3xDT05USU5VRXxDT05UUk9MfENPTlRST0xTfENPTlZ8Q09OVkVSU0lPTnxDT05WRVJUfENPUElFU3xDT1BZfENPUlJFU1BPTkRJTkd8Q09TfENPU0h8Q09VTlR8Q09VTlRSWXxDT1ZFUnxDUHxDUEl8Q1JFQVRFfENSRUFUSU5HfENSSVRJQ0FMfENTfENVUlJFTkNZfENVUlJFTkNZX0NPTlZFUlNJT058Q1VSUkVOVHxDVVJTT1J8Q1VSU09SLVNFTEVDVElPTnxDVVNUT01FUnxDVVNUT01FUi1GVU5DVElPTnxEQU5HRVJPVVN8REFUQXxEQVRBQkFTRXxEQVRBSU5GT3xEQVRBU0VUfERBVEV8REFZTElHSFR8REJNQVhMRU58RERcXC9NTVxcL1lZfEREXFwvTU1cXC9ZWVlZfERETU1ZWXxERUFMTE9DQVRFfERFQ0lNQUxTfERFQ0lNQUxfU0hJRlR8REVDTEFSQVRJT05TfERFRVB8REVGQVVMVHxERUZFUlJFRHxERUZJTkV8REVGSU5JTkd8REVGSU5JVElPTnxERUxFVEV8REVMRVRJTkd8REVNQU5EfERFUEFSVE1FTlR8REVTQ0VORElOR3xERVNDUklCRXxERVNUSU5BVElPTnxERVRBSUx8RElBTE9HfERJUkVDVE9SWXxESVNDT05ORUNUfERJU1BMQVl8RElTUExBWS1NT0RFfERJU1RBTkNFfERJU1RJTkNUfERJVnxESVZJREV8RElWSURFLUNPUlJFU1BPTkRJTkd8RElWSVNJT058RE98RFVNTVl8RFVQTElDQVRFfERVUExJQ0FURVN8RFVSQVRJT058RFVSSU5HfERZTkFNSUN8RFlOUFJPfEV8RUFDSHxFRElUfEVESVRPUi1DQUxMfEVMU0V8RUxTRUlGfEVNUFRZfEVOQUJMRUR8RU5BQkxJTkd8RU5DT0RJTkd8RU5EfEVORC1FTkhBTkNFTUVOVC1TRUNUSU9OfEVORC1MSU5FU3xFTkQtT0YtREVGSU5JVElPTnxFTkQtT0YtRklMRXxFTkQtT0YtUEFHRXxFTkQtT0YtU0VMRUNUSU9OfEVOREFUfEVORENBU0V8RU5EQ0FUQ0h8RU5EQ0hBSU58RU5EQ0xBU1N8RU5ERE98RU5ERU5IQU5DRU1FTlR8RU5ERVhFQ3xFTkRGT1J8RU5ERk9STXxFTkRGVU5DVElPTnxFTkRJQU58RU5ESUZ8RU5ESU5HfEVORElOVEVSRkFDRXxFTkRMT09QfEVORE1FVEhPRHxFTkRNT0RVTEV8RU5ET058RU5EUFJPVklERXxFTkRTRUxFQ1R8RU5EVFJZfEVORFdISUxFfEVOR0lORUVSSU5HfEVOSEFOQ0VNRU5UfEVOSEFOQ0VNRU5ULVBPSU5UfEVOSEFOQ0VNRU5ULVNFQ1RJT058RU5IQU5DRU1FTlRTfEVOVFJJRVN8RU5UUll8RU5WSVJPTk1FTlR8RVF8RVFVQUx8RVFVSVZ8RVJST1JNRVNTQUdFfEVSUk9SU3xFU0NBUEV8RVNDQVBJTkd8RVZFTlR8RVZFTlRTfEVYQUNUfEVYQ0VQVHxFWENFUFRJT058RVhDRVBUSU9OLVRBQkxFfEVYQ0VQVElPTlN8RVhDTFVERXxFWENMVURJTkd8RVhFQ3xFWEVDVVRFfEVYSVNUU3xFWElUfEVYSVQtQ09NTUFORHxFWFB8RVhQQU5EfEVYUEFORElOR3xFWFBJUkFUSU9OfEVYUExJQ0lUfEVYUE9ORU5UfEVYUE9SVHxFWFBPUlRJTkd8RVhURU5EfEVYVEVOREVEfEVYVEVOU0lPTnxFWFRSQUNUfEZBSUx8RkVUQ0h8RklFTER8RklFTEQtR1JPVVBTfEZJRUxELVNZTUJPTHxGSUVMRC1TWU1CT0xTfEZJRUxEU3xGSUxFfEZJTFRFUnxGSUxURVItVEFCTEV8RklMVEVSU3xGSU5BTHxGSU5EfEZJUlNUfEZJUlNULUxJTkV8RklYRUQtUE9JTlR8RktFUXxGS0dFfEZMT09SfEZMVVNIfEZPTlR8Rk9SfEZPUk18Rk9STUFUfEZPUldBUkR8Rk9VTkR8RlJBQ3xGUkFNRXxGUkFNRVN8RlJFRXxGUklFTkRTfEZST018RlVOQ1RJT058RlVOQ1RJT04tUE9PTHxGVU5DVElPTkFMSVRZfEZVUlRIRVJ8R0FQU3xHRXxHRU5FUkFURXxHRVR8R0lWSU5HfEdLRVF8R0tHRXxHTE9CQUx8R1JBTlR8R1JFQVRFUnxHUkVFTnxHUk9VUHxHUk9VUFN8R1R8SEFORExFfEhBTkRMRVJ8SEFSTUxFU1N8SEFTSEVEfEhBVklOR3xIREJ8SEVBRC1MSU5FU3xIRUFERVJ8SEVBREVSU3xIRUFESU5HfEhFTFAtSUR8SEVMUC1SRVFVRVNUfEhJREV8SElHSHxISU5UfEhPTER8SE9UU1BPVHxJfElDT058SUR8SURFTlRJRklDQVRJT058SURFTlRJRklFUnxJRFN8SUZ8SUdOT1JFfElHTk9SSU5HfElNTUVESUFURUxZfElNUExFTUVOVEFUSU9OfElNUExFTUVOVEFUSU9OU3xJTVBMRU1FTlRFRHxJTVBMSUNJVHxJTVBPUlR8SU1QT1JUSU5HfElOfElOQUNUSVZFfElOQ0x8SU5DTFVERXxJTkNMVURFU3xJTkNMVURJTkd8SU5DUkVNRU5UfElOREVYfElOREVYLUxJTkV8SU5GT1RZUEVTfElOSEVSSVRJTkd8SU5JVHxJTklUSUFMfElOSVRJQUxJWkFUSU9OfElOTkVSfElOT1VUfElOUFVUfElOU0VSVHxJTlNUQU5DRVN8SU5URU5TSUZJRUR8SU5URVJGQUNFfElOVEVSRkFDRS1QT09MfElOVEVSRkFDRVN8SU5URVJOQUx8SU5URVJWQUxTfElOVE98SU5WRVJTRXxJTlZFUlRFRC1EQVRFfElTfElTT3xJVEVSQVRPUnxJVE5PfEpPQnxKT0lOfEtFRVB8S0VFUElOR3xLRVJORUx8S0VZfEtFWVN8S0VZV09SRFN8S0lORHxMQU5HVUFHRXxMQVNUfExBVEV8TEFZT1VUfExFfExFQURJTkd8TEVBVkV8TEVGVHxMRUZULUpVU1RJRklFRHxMRUZUUExVU3xMRUZUU1BBQ0V8TEVHQUNZfExFTkdUSHxMRVNTfExFVHxMRVZFTHxMRVZFTFN8TElLRXxMSU5FfExJTkUtQ09VTlR8TElORS1TRUxFQ1RJT058TElORS1TSVpFfExJTkVGRUVEfExJTkVTfExJU1R8TElTVC1QUk9DRVNTSU5HfExJU1RCT1h8TElUVExFfExMQU5HfExPQUR8TE9BRC1PRi1QUk9HUkFNfExPQnxMT0NBTHxMT0NBTEV8TE9DQVRPUnxMT0d8TE9HLVBPSU5UfExPRzEwfExPR0ZJTEV8TE9HSUNBTHxMT05HfExPT1B8TE9XfExPV0VSfExQQUR8TFBJfExUfE18TUFJTHxNQUlOfE1BSk9SLUlEfE1BUFBJTkd8TUFSR0lOfE1BUkt8TUFTS3xNQVRDSHxNQVRDSENPREV8TUFYfE1BWElNVU18TUVESVVNfE1FTUJFUlN8TUVNT1JZfE1FU0h8TUVTU0FHRXxNRVNTQUdFLUlEfE1FU1NBR0VTfE1FU1NBR0lOR3xNRVRIT0R8TUVUSE9EU3xNSU58TUlOSU1VTXxNSU5PUi1JRHxNTVxcL0REXFwvWVl8TU1cXC9ERFxcL1lZWVl8TU1ERFlZfE1PRHxNT0RFfE1PRElGfE1PRElGSUVSfE1PRElGWXxNT0RVTEV8TU9WRXxNT1ZFLUNPUlJFU1BPTkRJTkd8TVVMVElQTFl8TVVMVElQTFktQ09SUkVTUE9ORElOR3xOQXxOQU1FfE5BTUVUQUJ8TkFUSVZFfE5CfE5FfE5FU1RFRHxORVNUSU5HfE5FV3xORVctTElORXxORVctUEFHRXxORVctU0VDVElPTnxORVhUfE5PfE5PLURJU1BMQVl8Tk8tRVhURU5TSU9OfE5PLUdBUHxOTy1HQVBTfE5PLUdST1VQSU5HfE5PLUhFQURJTkd8Tk8tU0NST0xMSU5HfE5PLVNJR058Tk8tVElUTEV8Tk8tVE9QT0ZQQUdFfE5PLVpFUk98Tk9ERXxOT0RFU3xOT04tVU5JQ09ERXxOT04tVU5JUVVFfE5PVHxOUHxOU3xOVUxMfE5VTUJFUnxOVU1PRkNIQVJ8T3xPQkpFQ1R8T0JKRUNUU3xPQkxJR0FUT1JZfE9DQ1VSUkVOQ0V8T0NDVVJSRU5DRVN8T0NDVVJTfE9GfE9GRnxPRkZTRVR8T0xFfE9OfE9OTFl8T1BFTnxPUFRJT058T1BUSU9OQUx8T1BUSU9OU3xPUnxPUkRFUnxPVEhFUnxPVEhFUlN8T1VUfE9VVEVSfE9VVFBVVHxPVVRQVVQtTEVOR1RIfE9WRVJGTE9XfE9WRVJMQVl8UEFDS3xQQUNLQUdFfFBBRHxQQURESU5HfFBBR0V8UEFHRVN8UEFSQU1FVEVSfFBBUkFNRVRFUi1UQUJMRXxQQVJBTUVURVJTfFBBUlR8UEFSVElBTExZfFBBVFRFUk58UEVSQ0VOVEFHRXxQRVJGT1JNfFBFUkZPUk1JTkd8UEVSU09OfFBGfFBGLVNUQVRVU3xQSU5LfFBMQUNFU3xQT09MfFBPU0lUSU9OfFBPU19ISUdIfFBPU19MT1d8UFJBR01BU3xQUkVDT01QSUxFRHxQUkVGRVJSRUR8UFJFU0VSVklOR3xQUklNQVJZfFBSSU5UfFBSSU5ULUNPTlRST0x8UFJJT1JJVFl8UFJJVkFURXxQUk9DRURVUkV8UFJPQ0VTU3xQUk9HUkFNfFBST1BFUlRZfFBST1RFQ1RFRHxQUk9WSURFfFBVQkxJQ3xQVVNIQlVUVE9OfFBVVHxRVUVVRS1PTkxZfFFVSUNLSU5GT3xSQURJT0JVVFRPTnxSQUlTRXxSQUlTSU5HfFJBTkdFfFJBTkdFU3xSQVd8UkVBRHxSRUFELU9OTFl8UkVBREVSfFJFQ0VJVkV8UkVDRUlWRUR8UkVDRUlWRVJ8UkVDRUlWSU5HfFJFRHxSRURFRklOSVRJT058UkVEVUNFfFJFRFVDRUR8UkVGfFJFRkVSRU5DRXxSRUZSRVNIfFJFR0VYfFJFSkVDVHxSRU1PVEV8UkVOQU1JTkd8UkVQTEFDRXxSRVBMQUNFTUVOVHxSRVBMQUNJTkd8UkVQT1JUfFJFUVVFU1R8UkVRVUVTVEVEfFJFU0VSVkV8UkVTRVR8UkVTT0xVVElPTnxSRVNQRUNUSU5HfFJFU1BPTlNJQkxFfFJFU1VMVHxSRVNVTFRTfFJFU1VNQUJMRXxSRVNVTUV8UkVUUll8UkVUVVJOfFJFVFVSTkNPREV8UkVUVVJOSU5HfFJJR0hUfFJJR0hULUpVU1RJRklFRHxSSUdIVFBMVVN8UklHSFRTUEFDRXxSSVNLfFJNQ19DT01NVU5JQ0FUSU9OX0ZBSUxVUkV8Uk1DX0lOVkFMSURfU1RBVFVTfFJNQ19TWVNURU1fRkFJTFVSRXxST0xFfFJPTExCQUNLfFJPVU5EfFJPV1N8UlRUSXxSVU58U0FQfFNBUC1TUE9PTHxTQVZJTkd8U0NBTEVfUFJFU0VSVklOR3xTQ0FMRV9QUkVTRVJWSU5HX1NDSUVOVElGSUN8U0NBTnxTQ0lFTlRJRklDfFNDSUVOVElGSUNfV0lUSF9MRUFESU5HX1pFUk98U0NSRUVOfFNDUk9MTHxTQ1JPTEwtQk9VTkRBUll8U0NST0xMSU5HfFNFQVJDSHxTRUNPTkRBUll8U0VDT05EU3xTRUNUSU9OfFNFTEVDVHxTRUxFQ1QtT1BUSU9OU3xTRUxFQ1RJT058U0VMRUNUSU9OLVNDUkVFTnxTRUxFQ1RJT04tU0VUfFNFTEVDVElPTi1TRVRTfFNFTEVDVElPTi1UQUJMRXxTRUxFQ1RJT05TfFNFTEVDVE9SfFNFTkR8U0VQQVJBVEV8U0VQQVJBVEVEfFNFVHxTSEFSRUR8U0hJRlR8U0hPUlR8U0hPUlREVU1QLUlEfFNJR058U0lHTl9BU19QT1NURklYfFNJTVBMRXxTSU58U0lOR0xFfFNJTkh8U0laRXxTS0lQfFNLSVBQSU5HfFNNQVJUfFNPTUV8U09SVHxTT1JUQUJMRXxTT1JURUR8U09VUkNFfFNQQUNFfFNQRUNJRklFRHxTUExJVHxTUE9PTHxTUE9UU3xTUUx8U1FMU0NSSVBUfFNRUlR8U1RBQkxFfFNUQU1QfFNUQU5EQVJEfFNUQVJULU9GLVNFTEVDVElPTnxTVEFSVElOR3xTVEFURXxTVEFURU1FTlR8U1RBVEVNRU5UU3xTVEFUSUN8U1RBVElDU3xTVEFUVVNJTkZPfFNURVAtTE9PUHxTVE9QfFNUUkxFTnxTVFJVQ1RVUkV8U1RSVUNUVVJFU3xTVFlMRXxTVUJLRVl8U1VCTUFUQ0hFU3xTVUJNSVR8U1VCUk9VVElORXxTVUJTQ1JFRU58U1VCU1RSSU5HfFNVQlRSQUNUfFNVQlRSQUNULUNPUlJFU1BPTkRJTkd8U1VGRklYfFNVTXxTVU1NQVJZfFNVTU1JTkd8U1VQUExJRUR8U1VQUExZfFNVUFBSRVNTfFNXSVRDSHxTV0lUQ0hTVEFURVN8U1lNQk9MfFNZTkNQT0lOVFN8U1lOVEFYfFNZTlRBWC1DSEVDS3xTWU5UQVgtVFJBQ0V8U1lTVEVNLUNBTEx8U1lTVEVNLUVYQ0VQVElPTlN8U1lTVEVNLUVYSVR8VEFCfFRBQkJFRHxUQUJMRXxUQUJMRVN8VEFCTEVWSUVXfFRBQlNUUklQfFRBTnxUQU5IfFRBUkdFVHxUQVNLfFRBU0tTfFRFU1R8VEVTVElOR3xURVhUfFRFWFRQT09MfFRIRU58VEhST1d8VElNRXxUSU1FU3xUSU1FU1RBTVB8VElNRVpPTkV8VElUTEV8VElUTEUtTElORVN8VElUTEVCQVJ8VE98VE9LRU5JWkFUSU9OfFRPS0VOU3xUT1AtTElORVN8VE9QLU9GLVBBR0V8VFJBQ0UtRklMRXxUUkFDRS1UQUJMRXxUUkFJTElOR3xUUkFOU0FDVElPTnxUUkFOU0ZFUnxUUkFOU0ZPUk1BVElPTnxUUkFOU0xBVEV8VFJBTlNQT1JUSU5HfFRSTUFDfFRSVU5DfFRSVU5DQVRFfFRSVU5DQVRJT058VFJZfFRZUEV8VFlQRS1QT09MfFRZUEUtUE9PTFN8VFlQRVN8VUxJTkV8VU5BU1NJR058VU5ERVJ8VU5JQ09ERXxVTklPTnxVTklRVUV8VU5JVHxVTklUX0NPTlZFUlNJT058VU5JWHxVTlBBQ0t8VU5USUx8VU5XSU5EfFVQfFVQREFURXxVUFBFUnxVU0VSfFVTRVItQ09NTUFORHxVU0lOR3xVVEYtOHxWQUxJRHxWQUxVRXxWQUxVRS1SRVFVRVNUfFZBTFVFU3xWQVJZfFZBUllJTkd8VkVSSUZJQ0FUSU9OLU1FU1NBR0V8VkVSU0lPTnxWSUF8VklFV3xWSVNJQkxFfFdBSVR8V0FSTklOR3xXSEVOfFdIRU5FVkVSfFdIRVJFfFdISUxFfFdJRFRIfFdJTkRPV3xXSU5ET1dTfFdJVEh8V0lUSC1IRUFESU5HfFdJVEgtVElUTEV8V0lUSE9VVHxXT1JEfFdPUkt8V1JJVEV8V1JJVEVSfFh8WE1MfFhPUnxYU0R8WFNUUkxFTnxZRUxMT1d8WUVTfFlZTU1ERHxafFpFUk98Wk9ORSkoPyFbXFx3LV0pL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQvKiBOdW1iZXJzIGNhbiBiZSBvbmx5IGludGVnZXJzLiBEZWNpbWFsIG9yIEhleCBhcHBlYXIgb25seSBhcyBzdHJpbmdzICovXG5cdCdudW1iZXInOiAvXFxiXFxkK1xcYi8sXG5cdC8qIE9wZXJhdG9ycyBtdXN0IGFsd2F5cyBiZSBzdXJyb3VuZGVkIGJ5IHdoaXRlc3BhY2UsIHRoZXkgY2Fubm90IGJlIHB1dFxuXHRhZGphY2VudCB0byBvcGVyYW5kcy5cblx0Ki9cblx0J29wZXJhdG9yJzoge1xuXHRcdHBhdHRlcm46IC8oXFxzKSg/OlxcKlxcKj98PFs9Pl0/fD49P3xcXD89fFstK1xcLz1dKSg/PVxccykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3N0cmluZy1vcGVyYXRvcic6IHtcblx0XHRwYXR0ZXJuOiAvKFxccykmJj8oPz1cXHMpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdC8qIFRoZSBvZmZpY2lhbCBlZGl0b3IgaGlnaGxpZ2h0cyAqL1xuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J3Rva2VuLW9wZXJhdG9yJzogW3tcblx0XHQvKiBTcGVjaWFsIG9wZXJhdG9ycyB1c2VkIHRvIGFjY2VzcyBzdHJ1Y3R1cmUgY29tcG9uZW50cywgY2xhc3MgbWV0aG9kcy9hdHRyaWJ1dGVzLCBldGMuICovXG5cdFx0cGF0dGVybjogLyhcXHcpKD86LT4/fD0+fFt+fHt9XSkoPz1cXHcpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdH0sIHtcblx0XHQvKiBTcGVjaWFsIHRva2VucyB1c2VkIGRvIGRlbGltaXQgc3RyaW5nIHRlbXBsYXRlcyAqL1xuXHRcdHBhdHRlcm46IC9bfHt9XS8sXG5cdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0fV0sXG5cdCdwdW5jdHVhdGlvbic6IC9bLC46KCldL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBjb3JlUnVsZXMgPSAnKD86QUxQSEF8QklUfENIQVJ8Q1J8Q1JMRnxDVEx8RElHSVR8RFFVT1RFfEhFWERJR3xIVEFCfExGfExXU1B8T0NURVR8U1B8VkNIQVJ8V1NQKSc7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmFibmYgPSB7XG5cdFx0J2NvbW1lbnQnOiAvOy4qLyxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyg/OiVbaXNdKT9cIlteXCJcXG5cXHJdKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXiVbaXNdL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3JhbmdlJzoge1xuXHRcdFx0cGF0dGVybjogLyUoPzpiWzAxXSstWzAxXSt8ZFxcZCstXFxkK3x4W0EtRlxcZF0rLVtBLUZcXGRdKykvaSxcblx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdH0sXG5cdFx0J3Rlcm1pbmFsJzoge1xuXHRcdFx0cGF0dGVybjogLyUoPzpiWzAxXSsoPzpcXC5bMDFdKykqfGRcXGQrKD86XFwuXFxkKykqfHhbQS1GXFxkXSsoPzpcXC5bQS1GXFxkXSspKikvaSxcblx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdH0sXG5cdFx0J3JlcGV0aXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHctXSkoPzpcXGQqXFwqXFxkKnxcXGQrKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9LFxuXHRcdCdkZWZpbml0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKikoPzpbYS16XVtcXHctXSp8PFtePD5cXHJcXG5dKj4pKD89XFxzKj0pL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvPHw+L1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2NvcmUtcnVsZSc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnKD86KF58W148XFxcXHctXSknICsgY29yZVJ1bGVzICsgJ3w8JyArIGNvcmVSdWxlcyArICc+KSg/IVtcXFxcdy1dKScsICdpJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6IFsncnVsZScsICdjb25zdGFudCddLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC88fD4vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQncnVsZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXjxcXHctXSlbYS16XVtcXHctXSp8PFtePD5cXHJcXG5dKj4vaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzx8Pi9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdvcGVyYXRvcic6IC89XFwvP3xcXC8vLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKClcXFtcXF1dL1xuXHR9O1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5hY3Rpb25zY3JpcHQgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdqYXZhc2NyaXB0Jywge1xuXHQna2V5d29yZCc6IC9cXGIoPzphc3xicmVha3xjYXNlfGNhdGNofGNsYXNzfGNvbnN0fGRlZmF1bHR8ZGVsZXRlfGRvfGR5bmFtaWN8ZWFjaHxlbHNlfGV4dGVuZHN8ZmluYWx8ZmluYWxseXxmb3J8ZnVuY3Rpb258Z2V0fGlmfGltcGxlbWVudHN8aW1wb3J0fGlufGluY2x1ZGV8aW5zdGFuY2VvZnxpbnRlcmZhY2V8aW50ZXJuYWx8aXN8bmFtZXNwYWNlfG5hdGl2ZXxuZXd8bnVsbHxvdmVycmlkZXxwYWNrYWdlfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xyZXR1cm58c2V0fHN0YXRpY3xzdXBlcnxzd2l0Y2h8dGhpc3x0aHJvd3x0cnl8dHlwZW9mfHVzZXx2YXJ8dm9pZHx3aGlsZXx3aXRoKVxcYi8sXG5cdCdvcGVyYXRvcic6IC9cXCtcXCt8LS18KD86WytcXC0qXFwvJV5dfCYmP3xcXHxcXHw/fDw8P3w+Pj8+P3xbIT1dPT8pPT98W34/QF0vXG59KTtcblByaXNtLmxhbmd1YWdlcy5hY3Rpb25zY3JpcHRbJ2NsYXNzLW5hbWUnXS5hbGlhcyA9ICdmdW5jdGlvbic7XG5cbi8vIGRvZXNuJ3Qgd29yayB3aXRoIEFTIGJlY2F1c2UgQVMgaXMgdG9vIGNvbXBsZXhcbmRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMuYWN0aW9uc2NyaXB0WydwYXJhbWV0ZXInXTtcbmRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMuYWN0aW9uc2NyaXB0WydsaXRlcmFsLXByb3BlcnR5J107XG5cbmlmIChQcmlzbS5sYW5ndWFnZXMubWFya3VwKSB7XG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2FjdGlvbnNjcmlwdCcsICdzdHJpbmcnLCB7XG5cdFx0J3htbCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXi5dKTxcXC8/XFx3Kyg/OlxccytbXlxccz5cXC89XSs9KFwifCcpKD86XFxcXFtcXHNcXFNdfCg/IVxcMilbXlxcXFxdKSpcXDIpKlxccypcXC8/Pi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMubWFya3VwXG5cdFx0fVxuXHR9KTtcbn1cbjtcblByaXNtLmxhbmd1YWdlcy5hZGEgPSB7XG5cdCdjb21tZW50JzogLy0tLiovLFxuXHQnc3RyaW5nJzogL1wiKD86XCJcInxbXlwiXFxyXFxmXFxuXSkqXCIvLFxuXHQnbnVtYmVyJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGJcXGQoPzpfP1xcZCkqI1tcXGRBLUZdKD86Xz9bXFxkQS1GXSkqKD86XFwuW1xcZEEtRl0oPzpfP1tcXGRBLUZdKSopPyMoPzpFWystXT9cXGQoPzpfP1xcZCkqKT8vaVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYlxcZCg/Ol8/XFxkKSooPzpcXC5cXGQoPzpfP1xcZCkqKT8oPzpFWystXT9cXGQoPzpfP1xcZCkqKT9cXGIvaVxuXHRcdH1cblx0XSxcblx0J2F0dHJpYnV0ZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiJ1xcdysvLFxuXHRcdGFsaWFzOiAnYXR0ci1uYW1lJ1xuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzphYm9ydHxhYnN8YWJzdHJhY3R8YWNjZXB0fGFjY2Vzc3xhbGlhc2VkfGFsbHxhbmR8YXJyYXl8YXR8YmVnaW58Ym9keXxjYXNlfGNvbnN0YW50fGRlY2xhcmV8ZGVsYXl8ZGVsdGF8ZGlnaXRzfGRvfGVsc2V8ZWxzaWZ8ZW5kfGVudHJ5fGV4Y2VwdGlvbnxleGl0fGZvcnxmdW5jdGlvbnxnZW5lcmljfGdvdG98aWZ8aW58aW50ZXJmYWNlfGlzfGxpbWl0ZWR8bG9vcHxtb2R8bmV3fG5vdHxudWxsfG9mfG9yfG90aGVyc3xvdXR8b3ZlcnJpZGluZ3xwYWNrYWdlfHByYWdtYXxwcml2YXRlfHByb2NlZHVyZXxwcm90ZWN0ZWR8cmFpc2V8cmFuZ2V8cmVjb3JkfHJlbXxyZW5hbWVzfHJlcXVldWV8cmV0dXJufHJldmVyc2V8c2VsZWN0fHNlcGFyYXRlfHNvbWV8c3VidHlwZXxzeW5jaHJvbml6ZWR8dGFnZ2VkfHRhc2t8dGVybWluYXRlfHRoZW58dHlwZXx1bnRpbHx1c2V8d2hlbnx3aGlsZXx3aXRofHhvcilcXGIvaSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvaSxcblx0J29wZXJhdG9yJzogLzxbPT5dP3w+PT98PT4/fDo9fFxcLz0/fFxcKlxcKj98WyYrLV0vLFxuXHQncHVuY3R1YXRpb24nOiAvXFwuXFwuP3xbLDsoKTpdLyxcblx0J2NoYXInOiAvJy4nLyxcblx0J3ZhcmlhYmxlJzogL1xcYlthLXpdKD86XFx3KSpcXGIvaVxufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdFByaXNtLmxhbmd1YWdlcy5hZ2RhID0ge1xuXHRcdCdjb21tZW50JzogL1xcey1bXFxzXFxTXSo/KD86LVxcfXwkKXwtLS4qLyxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W15cXFxcXFxyXFxuXCJdKSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0fSxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpe31cdTI5ODNcdTI5ODQuO0BdLyxcblx0XHQnY2xhc3MtbmFtZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86ZGF0YXxyZWNvcmQpICspXFxTKy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdH0sXG5cdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKikoPyFcXHMpW146XFxyXFxuXSsoPz06KS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHR9LFxuXHRcdCdvcGVyYXRvcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXlxccyp8XFxzKSg/Ols9fDpcdTIyMDBcdTIxOTJcdTAzQkJcXFxcP19dfC0+KSg/PVxccykvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzogL1xcYig/OlNldHxhYnN0cmFjdHxjb25zdHJ1Y3RvcnxkYXRhfGV0YS1lcXVhbGl0eXxmaWVsZHxmb3JhbGx8aGlkaW5nfGltcG9ydHxpbnxpbmR1Y3RpdmV8aW5maXh8aW5maXhsfGluZml4cnxpbnN0YW5jZXxsZXR8bWFjcm98bW9kdWxlfG11dHVhbHxuby1ldGEtZXF1YWxpdHl8b3BlbnxvdmVybGFwfHBhdHRlcm58cG9zdHVsYXRlfHByaW1pdGl2ZXxwcml2YXRlfHB1YmxpY3xxdW90ZXxxdW90ZUNvbnRleHR8cXVvdGVHb2FsfHF1b3RlVGVybXxyZWNvcmR8cmVuYW1pbmd8cmV3cml0ZXxzeW50YXh8dGFjdGljfHVucXVvdGV8dW5xdW90ZURlY2x8dW5xdW90ZURlZnx1c2luZ3x2YXJpYWJsZXx3aGVyZXx3aXRoKVxcYi8sXG5cdH07XG59KFByaXNtKSk7XG5cbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvQUwvYmxvYi9tYXN0ZXIvZ3JhbW1hci9hbHN5bnRheC50bWxhbmd1YWdlXG5cblByaXNtLmxhbmd1YWdlcy5hbCA9IHtcblx0J2NvbW1lbnQnOiAvXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLycoPzonJ3xbXidcXHJcXG5dKSonKD8hJyl8XCIoPzpcIlwifFteXCJcXHJcXG5dKSpcIig/IVwiKS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYig/OmV2ZW50fHByb2NlZHVyZXx0cmlnZ2VyKVxccyt8KD86XnxbXi5dKVxcLlxccyopW2Etel9dXFx3Kig/PVxccypcXCgpL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IFtcblx0XHQvLyBrZXl3b3Jkc1xuXHRcdC9cXGIoPzphcnJheXxhc3NlcnRlcnJvcnxiZWdpbnxicmVha3xjYXNlfGRvfGRvd250b3xlbHNlfGVuZHxldmVudHxleGl0fGZvcnxmb3JlYWNofGZ1bmN0aW9ufGlmfGltcGxlbWVudHN8aW58aW5kYXRhc2V0fGludGVyZmFjZXxpbnRlcm5hbHxsb2NhbHxvZnxwcm9jZWR1cmV8cHJvZ3JhbXxwcm90ZWN0ZWR8cmVwZWF0fHJ1bm9uY2xpZW50fHNlY3VyaXR5ZmlsdGVyaW5nfHN1cHByZXNzZGlzcG9zZXx0ZW1wb3Jhcnl8dGhlbnx0b3x0cmlnZ2VyfHVudGlsfHZhcnx3aGlsZXx3aXRofHdpdGhldmVudHMpXFxiL2ksXG5cdFx0Ly8gb2JqZWN0cyBhbmQgbWV0YWRhdGEgdGhhdCBhcmUgdXNlZCBsaWtlIGtleXdvcmRzXG5cdFx0L1xcYig/OmFjdGlvbnxhY3Rpb25zfGFkZGFmdGVyfGFkZGJlZm9yZXxhZGRmaXJzdHxhZGRsYXN0fGFyZWF8YXNzZW1ibHl8Y2hhcnRwYXJ0fGNvZGV1bml0fGNvbHVtbnxjb250cm9sYWRkaW58Y3VlZ3JvdXB8Y3VzdG9taXplc3xkYXRhaXRlbXxkYXRhc2V0fGRvdG5ldHxlbGVtZW50c3xlbnVtfGVudW1leHRlbnNpb258ZXh0ZW5kc3xmaWVsZHxmaWVsZGF0dHJpYnV0ZXxmaWVsZGVsZW1lbnR8ZmllbGRncm91cHxmaWVsZGdyb3Vwc3xmaWVsZHN8ZmlsdGVyfGZpeGVkfGdyaWR8Z3JvdXB8a2V5fGtleXN8bGFiZWx8bGFiZWxzfGxheW91dHxtb2RpZnl8bW92ZWFmdGVyfG1vdmViZWZvcmV8bW92ZWZpcnN0fG1vdmVsYXN0fHBhZ2V8cGFnZWN1c3RvbWl6YXRpb258cGFnZWV4dGVuc2lvbnxwYXJ0fHByb2ZpbGV8cXVlcnl8cmVwZWF0ZXJ8cmVwb3J0fHJlcXVlc3RwYWdlfHNjaGVtYXxzZXBhcmF0b3J8c3lzdGVtcGFydHx0YWJsZXx0YWJsZWVsZW1lbnR8dGFibGVleHRlbnNpb258dGV4dGF0dHJpYnV0ZXx0ZXh0ZWxlbWVudHx0eXBlfHVzZXJjb250cm9sfHZhbHVlfHhtbHBvcnQpXFxiL2lcblx0XSxcblx0J251bWJlcic6IC9cXGIoPzoweFtcXGRhLWZdK3woPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/KSg/OkZ8TEw/fFUoPzpMTD8pPyk/XFxiL2ksXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiL2ksXG5cdCd2YXJpYWJsZSc6IC9cXGIoPzpDdXJyKD86RmllbGROb3xQYWdlfFJlcG9ydCl8eD9SZWN8UmVxdWVzdE9wdGlvbnNQYWdlKVxcYi8sXG5cdCdjbGFzcy1uYW1lJzogL1xcYig/OmF1dG9tYXRpb258YmlnaW50ZWdlcnxiaWd0ZXh0fGJsb2J8Ym9vbGVhbnxieXRlfGNoYXJ8Y2xpZW50dHlwZXxjb2RlfGNvbXBsZXRpb250cmlnZ2VyZXJyb3JsZXZlbHxjb25uZWN0aW9udHlwZXxkYXRhYmFzZXxkYXRhY2xhc3NpZmljYXRpb258ZGF0YXNjb3BlfGRhdGV8ZGF0ZWZvcm11bGF8ZGF0ZXRpbWV8ZGVjaW1hbHxkZWZhdWx0bGF5b3V0fGRpYWxvZ3xkaWN0aW9uYXJ5fGRvdG5ldGFzc2VtYmx5fGRvdG5ldHR5cGVkZWNsYXJhdGlvbnxkdXJhdGlvbnxlcnJvcmluZm98ZXJyb3J0eXBlfGV4ZWN1dGlvbmNvbnRleHR8ZXhlY3V0aW9ubW9kZXxmaWVsZGNsYXNzfGZpZWxkcmVmfGZpZWxkdHlwZXxmaWxlfGZpbHRlcnBhZ2VidWlsZGVyfGd1aWR8aHR0cGNsaWVudHxodHRwY29udGVudHxodHRwaGVhZGVyc3xodHRwcmVxdWVzdG1lc3NhZ2V8aHR0cHJlc3BvbnNlbWVzc2FnZXxpbnN0cmVhbXxpbnRlZ2VyfGpva2VyfGpzb25hcnJheXxqc29ub2JqZWN0fGpzb250b2tlbnxqc29udmFsdWV8a2V5cmVmfGxpc3R8bW9kdWxlZGVwZW5kZW5jeWluZm98bW9kdWxlaW5mb3xub25lfG5vdGlmaWNhdGlvbnxub3RpZmljYXRpb25zY29wZXxvYmplY3R0eXBlfG9wdGlvbnxvdXRzdHJlYW18cGFnZXJlc3VsdHxyZWNvcmR8cmVjb3JkaWR8cmVjb3JkcmVmfHJlcG9ydGZvcm1hdHxzZWN1cml0eWZpbHRlcnxzZXNzaW9uc2V0dGluZ3N8dGFibGVjb25uZWN0aW9udHlwZXx0YWJsZWZpbHRlcnx0ZXN0YWN0aW9ufHRlc3RmaWVsZHx0ZXN0ZmlsdGVyZmllbGR8dGVzdHBhZ2V8dGVzdHBlcm1pc3Npb25zfHRlc3RyZXF1ZXN0cGFnZXx0ZXh0fHRleHRidWlsZGVyfHRleHRjb25zdHx0ZXh0ZW5jb2Rpbmd8dGltZXx0cmFuc2FjdGlvbm1vZGVsfHRyYW5zYWN0aW9udHlwZXx2YXJpYW50fHZlcmJvc2l0eXx2ZXJzaW9ufHZpZXd8dmlld3N8d2Vic2VydmljZWFjdGlvbmNvbnRleHR8d2Vic2VydmljZWFjdGlvbnJlc3VsdGNvZGV8eG1sYXR0cmlidXRlfHhtbGF0dHJpYnV0ZWNvbGxlY3Rpb258eG1sY2RhdGF8eG1sY29tbWVudHx4bWxkZWNsYXJhdGlvbnx4bWxkb2N1bWVudHx4bWxkb2N1bWVudHR5cGV8eG1sZWxlbWVudHx4bWxuYW1lc3BhY2VtYW5hZ2VyfHhtbG5hbWV0YWJsZXx4bWxub2RlfHhtbG5vZGVsaXN0fHhtbHByb2Nlc3NpbmdpbnN0cnVjdGlvbnx4bWxyZWFkb3B0aW9uc3x4bWx0ZXh0fHhtbHdyaXRlb3B0aW9ucylcXGIvaSxcblx0J29wZXJhdG9yJzogL1xcLlxcLnw6Wz06XXxbLSsqL109P3w8PnxbPD5dPT98PXxcXGIoPzphbmR8ZGl2fG1vZHxub3R8b3J8eG9yKVxcYi9pLFxuXHQncHVuY3R1YXRpb24nOiAvWygpXFxbXFxde306LjssXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5hbnRscjQgPSB7XG5cdCdjb21tZW50JzogL1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCkvLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8nKD86XFxcXC58W15cXFxcJ1xcclxcbl0pKicvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2hhcmFjdGVyLWNsYXNzJzoge1xuXHRcdHBhdHRlcm46IC9cXFsoPzpcXFxcLnxbXlxcXFxcXF1cXHJcXG5dKSpcXF0vLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3JlZ2V4Jyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdyYW5nZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLyhbXltdfCg/Ol58W15cXFxcXSkoPzpcXFxcXFxcXCkqXFxcXFxcWyktKD8hXFxdKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHR9LFxuXHRcdFx0J2VzY2FwZSc6IC9cXFxcKD86dSg/OlthLWZBLUZcXGRdezR9fFxce1thLWZBLUZcXGRdK1xcfSl8W3BQXVxce1s9XFx3LV0rXFx9fFteXFxyXFxudXBQXSkvLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF1dL1xuXHRcdH1cblx0fSxcblx0J2FjdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvXFx7KD86W157fV18XFx7KD86W157fV18XFx7KD86W157fV18XFx7W157fV0qXFx9KSpcXH0pKlxcfSkqXFx9Lyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnY29udGVudCc6IHtcblx0XHRcdFx0Ly8gdGhpcyBtaWdodCBiZSBDLCBDKyssIFB5dGhvbiwgSmF2YSwgQyMsIG9yIGFueSBvdGhlciBsYW5ndWFnZSBBTlRMUjQgY29tcGlsZXMgdG9cblx0XHRcdFx0cGF0dGVybjogLyhcXHspW1xcc1xcU10rKD89XFx9KS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvW3t9XS9cblx0XHR9XG5cdH0sXG5cdCdjb21tYW5kJzoge1xuXHRcdHBhdHRlcm46IC8oLT5cXHMqKD8hXFxzKSkoPzpcXHMqKD86LFxccyopP1xcYlthLXpdXFx3Kig/OlxccypcXChbXigpXFxyXFxuXSpcXCkpPykrKD89XFxzKjspL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdmdW5jdGlvbic6IC9cXGJcXHcrKD89XFxzKig/OlssKF18JCkpLyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9bLCgpXS9cblx0XHR9XG5cdH0sXG5cdCdhbm5vdGF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9AXFx3Kyg/Ojo6XFx3KykqLyxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdsYWJlbCc6IHtcblx0XHRwYXR0ZXJuOiAvI1sgXFx0XSpcXHcrLyxcblx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpjYXRjaHxjaGFubmVsc3xmaW5hbGx5fGZyYWdtZW50fGdyYW1tYXJ8aW1wb3J0fGxleGVyfGxvY2Fsc3xtb2RlfG9wdGlvbnN8cGFyc2VyfHJldHVybnN8dGhyb3dzfHRva2VucylcXGIvLFxuXHQnZGVmaW5pdGlvbic6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiW2Etel1cXHcqKD89XFxzKjopLyxcblx0XHRcdGFsaWFzOiBbJ3J1bGUnLCAnY2xhc3MtbmFtZSddXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiW0EtWl1cXHcqKD89XFxzKjopLyxcblx0XHRcdGFsaWFzOiBbJ3Rva2VuJywgJ2NvbnN0YW50J11cblx0XHR9LFxuXHRdLFxuXHQnY29uc3RhbnQnOiAvXFxiW0EtWl1bQS1aX10qXFxiLyxcblx0J29wZXJhdG9yJzogL1xcLlxcLnwtPnxbfH5dfFsqKz9dXFw/Py8sXG5cdCdwdW5jdHVhdGlvbic6IC9bOzooKT1dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmc0ID0gUHJpc20ubGFuZ3VhZ2VzLmFudGxyNDtcblxuUHJpc20ubGFuZ3VhZ2VzLmFwYWNoZWNvbmYgPSB7XG5cdCdjb21tZW50JzogLyMuKi8sXG5cdCdkaXJlY3RpdmUtaW5saW5lJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopXFxiKD86QWNjZXB0RmlsdGVyfEFjY2VwdFBhdGhJbmZvfEFjY2Vzc0ZpbGVOYW1lfEFjdGlvbnxBZGQoPzpBbHR8QWx0QnlFbmNvZGluZ3xBbHRCeVR5cGV8Q2hhcnNldHxEZWZhdWx0Q2hhcnNldHxEZXNjcmlwdGlvbnxFbmNvZGluZ3xIYW5kbGVyfEljb258SWNvbkJ5RW5jb2Rpbmd8SWNvbkJ5VHlwZXxJbnB1dEZpbHRlcnxMYW5ndWFnZXxNb2R1bGVJbmZvfE91dHB1dEZpbHRlcnxPdXRwdXRGaWx0ZXJCeVR5cGV8VHlwZSl8QWxpYXN8QWxpYXNNYXRjaHxBbGxvdyg/OkNPTk5FQ1R8RW5jb2RlZFNsYXNoZXN8TWV0aG9kc3xPdmVycmlkZXxPdmVycmlkZUxpc3QpP3xBbm9ueW1vdXMoPzpfTG9nRW1haWx8X011c3RHaXZlRW1haWx8X05vVXNlcklEfF9WZXJpZnlFbWFpbCk/fEFzeW5jUmVxdWVzdFdvcmtlckZhY3RvcnxBdXRoKD86QmFzaWNBdXRob3JpdGF0aXZlfEJhc2ljRmFrZXxCYXNpY1Byb3ZpZGVyfEJhc2ljVXNlRGlnZXN0QWxnb3JpdGhtfERCRFVzZXJQV1F1ZXJ5fERCRFVzZXJSZWFsbVF1ZXJ5fERCTUdyb3VwRmlsZXxEQk1UeXBlfERCTVVzZXJGaWxlfERpZ2VzdCg/OkFsZ29yaXRobXxEb21haW58Tm9uY2VMaWZldGltZXxQcm92aWRlcnxRb3B8U2htZW1TaXplKXxGb3JtKD86QXV0aG9yaXRhdGl2ZXxCb2R5fERpc2FibGVOb1N0b3JlfEZha2VCYXNpY0F1dGh8TG9jYXRpb258TG9naW5SZXF1aXJlZExvY2F0aW9ufExvZ2luU3VjY2Vzc0xvY2F0aW9ufExvZ291dExvY2F0aW9ufE1ldGhvZHxNaW1ldHlwZXxQYXNzd29yZHxQcm92aWRlcnxTaXRlUGFzc3BocmFzZXxTaXplfFVzZXJuYW1lKXxHcm91cEZpbGV8TERBUCg/OkF1dGhvcml6ZVByZWZpeHxCaW5kQXV0aG9yaXRhdGl2ZXxCaW5kRE58QmluZFBhc3N3b3JkfENoYXJzZXRDb25maWd8Q29tcGFyZUFzVXNlcnxDb21wYXJlRE5PblNlcnZlcnxEZXJlZmVyZW5jZUFsaWFzZXN8R3JvdXBBdHRyaWJ1dGV8R3JvdXBBdHRyaWJ1dGVJc0ROfEluaXRpYWxCaW5kQXNVc2VyfEluaXRpYWxCaW5kUGF0dGVybnxNYXhTdWJHcm91cERlcHRofFJlbW90ZVVzZXJBdHRyaWJ1dGV8UmVtb3RlVXNlcklzRE58U2VhcmNoQXNVc2VyfFN1Ykdyb3VwQXR0cmlidXRlfFN1Ykdyb3VwQ2xhc3N8VXJsKXxNZXJnaW5nfE5hbWV8bkNhY2hlKD86Q29udGV4dHxFbmFibGV8UHJvdmlkZUZvcnxTT0NhY2hlfFRpbWVvdXQpfG56RmNnaUNoZWNrQXV0aG5Qcm92aWRlcnxuekZjZ2lEZWZpbmVQcm92aWRlcnxUeXBlfFVzZXJGaWxlfHpEQkRMb2dpblRvUmVmZXJlcnx6REJEUXVlcnl8ekRCRFJlZGlyZWN0UXVlcnl8ekRCTVR5cGV8elNlbmRGb3JiaWRkZW5PbkZhaWx1cmUpfEJhbGFuY2VyR3Jvd3RofEJhbGFuY2VySW5oZXJpdHxCYWxhbmNlck1lbWJlcnxCYWxhbmNlclBlcnNpc3R8QnJvd3Nlck1hdGNofEJyb3dzZXJNYXRjaE5vQ2FzZXxCdWZmZXJlZExvZ3N8QnVmZmVyU2l6ZXxDYWNoZSg/OkRlZmF1bHRFeHBpcmV8RGV0YWlsSGVhZGVyfERpckxlbmd0aHxEaXJMZXZlbHN8RGlzYWJsZXxFbmFibGV8RmlsZXxIZWFkZXJ8SWdub3JlQ2FjaGVDb250cm9sfElnbm9yZUhlYWRlcnN8SWdub3JlTm9MYXN0TW9kfElnbm9yZVF1ZXJ5U3RyaW5nfElnbm9yZVVSTFNlc3Npb25JZGVudGlmaWVyc3xLZXlCYXNlVVJMfExhc3RNb2RpZmllZEZhY3RvcnxMb2NrfExvY2tNYXhBZ2V8TG9ja1BhdGh8TWF4RXhwaXJlfE1heEZpbGVTaXplfE1pbkV4cGlyZXxNaW5GaWxlU2l6ZXxOZWdvdGlhdGVkRG9jc3xRdWlja0hhbmRsZXJ8UmVhZFNpemV8UmVhZFRpbWV8Um9vdHxTb2NhY2hlKD86TWF4U2l6ZXxNYXhUaW1lfE1pblRpbWV8UmVhZFNpemV8UmVhZFRpbWUpP3xTdGFsZU9uRXJyb3J8U3RvcmVFeHBpcmVkfFN0b3JlTm9TdG9yZXxTdG9yZVByaXZhdGUpfENHSURTY3JpcHRUaW1lb3V0fENHSU1hcEV4dGVuc2lvbnxDaGFyc2V0RGVmYXVsdHxDaGFyc2V0T3B0aW9uc3xDaGFyc2V0U291cmNlRW5jfENoZWNrQ2FzZU9ubHl8Q2hlY2tTcGVsbGluZ3xDaHJvb3REaXJ8Q29udGVudERpZ2VzdHxDb29raWVEb21haW58Q29va2llRXhwaXJlc3xDb29raWVOYW1lfENvb2tpZVN0eWxlfENvb2tpZVRyYWNraW5nfENvcmVEdW1wRGlyZWN0b3J5fEN1c3RvbUxvZ3xEYXZ8RGF2RGVwdGhJbmZpbml0eXxEYXZHZW5lcmljTG9ja0RCfERhdkxvY2tEQnxEYXZNaW5UaW1lb3V0fERCREV4cHRpbWV8REJESW5pdFNRTHxEQkRLZWVwfERCRE1heHxEQkRNaW58REJEUGFyYW1zfERCRFBlcnNpc3R8REJEUHJlcGFyZVNRTHxEQkRyaXZlcnxEZWZhdWx0SWNvbnxEZWZhdWx0TGFuZ3VhZ2V8RGVmYXVsdFJ1bnRpbWVEaXJ8RGVmYXVsdFR5cGV8RGVmaW5lfERlZmxhdGUoPzpCdWZmZXJTaXplfENvbXByZXNzaW9uTGV2ZWx8RmlsdGVyTm90ZXxJbmZsYXRlTGltaXRSZXF1ZXN0Qm9keXxJbmZsYXRlUmF0aW8oPzpCdXJzdHxMaW1pdCl8TWVtTGV2ZWx8V2luZG93U2l6ZSl8RGVueXxEaXJlY3RvcnlDaGVja0hhbmRsZXJ8RGlyZWN0b3J5SW5kZXh8RGlyZWN0b3J5SW5kZXhSZWRpcmVjdHxEaXJlY3RvcnlTbGFzaHxEb2N1bWVudFJvb3R8RFRyYWNlUHJpdmlsZWdlc3xEdW1wSU9JbnB1dHxEdW1wSU9PdXRwdXR8RW5hYmxlRXhjZXB0aW9uSG9va3xFbmFibGVNTUFQfEVuYWJsZVNlbmRmaWxlfEVycm9yfEVycm9yRG9jdW1lbnR8RXJyb3JMb2d8RXJyb3JMb2dGb3JtYXR8RXhhbXBsZXxFeHBpcmVzQWN0aXZlfEV4cGlyZXNCeVR5cGV8RXhwaXJlc0RlZmF1bHR8RXh0ZW5kZWRTdGF0dXN8RXh0RmlsdGVyRGVmaW5lfEV4dEZpbHRlck9wdGlvbnN8RmFsbGJhY2tSZXNvdXJjZXxGaWxlRVRhZ3xGaWx0ZXJDaGFpbnxGaWx0ZXJEZWNsYXJlfEZpbHRlclByb3RvY29sfEZpbHRlclByb3ZpZGVyfEZpbHRlclRyYWNlfEZvcmNlTGFuZ3VhZ2VQcmlvcml0eXxGb3JjZVR5cGV8Rm9yZW5zaWNMb2d8R3Byb2ZEaXJ8R3JhY2VmdWxTaHV0ZG93blRpbWVvdXR8R3JvdXB8SGVhZGVyfEhlYWRlck5hbWV8SGVhcnRiZWF0KD86QWRkcmVzc3xMaXN0ZW58TWF4U2VydmVyc3xTdG9yYWdlKXxIb3N0bmFtZUxvb2t1cHN8SWRlbnRpdHlDaGVja3xJZGVudGl0eUNoZWNrVGltZW91dHxJbWFwQmFzZXxJbWFwRGVmYXVsdHxJbWFwTWVudXxJbmNsdWRlfEluY2x1ZGVPcHRpb25hbHxJbmRleCg/OkhlYWRJbnNlcnR8SWdub3JlfElnbm9yZVJlc2V0fE9wdGlvbnN8T3JkZXJEZWZhdWx0fFN0eWxlU2hlZXQpfElucHV0U2VkfElTQVBJKD86QXBwZW5kTG9nVG9FcnJvcnN8QXBwZW5kTG9nVG9RdWVyeXxDYWNoZUZpbGV8RmFrZUFzeW5jfExvZ05vdFN1cHBvcnRlZHxSZWFkQWhlYWRCdWZmZXIpfEtlZXBBbGl2ZXxLZWVwQWxpdmVUaW1lb3V0fEtlcHRCb2R5U2l6ZXxMYW5ndWFnZVByaW9yaXR5fExEQVAoPzpDYWNoZUVudHJpZXN8Q2FjaGVUVEx8Q29ubmVjdGlvblBvb2xUVEx8Q29ubmVjdGlvblRpbWVvdXR8TGlicmFyeURlYnVnfE9wQ2FjaGVFbnRyaWVzfE9wQ2FjaGVUVEx8UmVmZXJyYWxIb3BMaW1pdHxSZWZlcnJhbHN8UmV0cmllc3xSZXRyeURlbGF5fFNoYXJlZENhY2hlRmlsZXxTaGFyZWRDYWNoZVNpemV8VGltZW91dHxUcnVzdGVkQ2xpZW50Q2VydHxUcnVzdGVkR2xvYmFsQ2VydHxUcnVzdGVkTW9kZXxWZXJpZnlTZXJ2ZXJDZXJ0KXxMaW1pdCg/OkludGVybmFsUmVjdXJzaW9ufFJlcXVlc3QoPzpCb2R5fEZpZWxkc3xGaWVsZFNpemV8TGluZSl8WE1MUmVxdWVzdEJvZHkpfExpc3RlbnxMaXN0ZW5CYWNrTG9nfExvYWRGaWxlfExvYWRNb2R1bGV8TG9nRm9ybWF0fExvZ0xldmVsfExvZ01lc3NhZ2V8THVhQXV0aHpQcm92aWRlcnxMdWFDb2RlQ2FjaGV8THVhKD86SG9vayg/OkFjY2Vzc0NoZWNrZXJ8QXV0aENoZWNrZXJ8Q2hlY2tVc2VySUR8Rml4dXBzfEluc2VydEZpbHRlcnxMb2d8TWFwVG9TdG9yYWdlfFRyYW5zbGF0ZU5hbWV8VHlwZUNoZWNrZXIpfEluaGVyaXR8SW5wdXRGaWx0ZXJ8TWFwSGFuZGxlcnxPdXRwdXRGaWx0ZXJ8UGFja2FnZUNQYXRofFBhY2thZ2VQYXRofFF1aWNrSGFuZGxlcnxSb290fFNjb3BlKXxNYXgoPzpDb25uZWN0aW9uc1BlckNoaWxkfEtlZXBBbGl2ZVJlcXVlc3RzfE1lbUZyZWV8UmFuZ2VPdmVybGFwc3xSYW5nZVJldmVyc2Fsc3xSYW5nZXN8UmVxdWVzdFdvcmtlcnN8U3BhcmVTZXJ2ZXJzfFNwYXJlVGhyZWFkc3xUaHJlYWRzKXxNZXJnZVRyYWlsZXJzfE1ldGFEaXJ8TWV0YUZpbGVzfE1ldGFTdWZmaXh8TWltZU1hZ2ljRmlsZXxNaW5TcGFyZVNlcnZlcnN8TWluU3BhcmVUaHJlYWRzfE1NYXBGaWxlfE1vZGVtU3RhbmRhcmR8TW9kTWltZVVzZVBhdGhJbmZvfE11bHRpdmlld3NNYXRjaHxNdXRleHxOYW1lVmlydHVhbEhvc3R8Tm9Qcm94eXxOV1NTTFRydXN0ZWRDZXJ0c3xOV1NTTFVwZ3JhZGVhYmxlfE9wdGlvbnN8T3JkZXJ8T3V0cHV0U2VkfFBhc3NFbnZ8UGlkRmlsZXxQcml2aWxlZ2VzTW9kZXxQcm90b2NvbHxQcm90b2NvbEVjaG98UHJveHkoPzpBZGRIZWFkZXJzfEJhZEhlYWRlcnxCbG9ja3xEb21haW58RXJyb3JPdmVycmlkZXxFeHByZXNzREJNRmlsZXxFeHByZXNzREJNVHlwZXxFeHByZXNzRW5hYmxlfEZ0cERpckNoYXJzZXR8RnRwRXNjYXBlV2lsZGNhcmRzfEZ0cExpc3RPbldpbGRjYXJkfEhUTUwoPzpCdWZTaXplfENoYXJzZXRPdXR8RG9jVHlwZXxFbmFibGV8RXZlbnRzfEV4dGVuZGVkfEZpeHVwc3xJbnRlcnB8TGlua3N8TWV0YXxTdHJpcENvbW1lbnRzfFVSTE1hcCl8SU9CdWZmZXJTaXplfE1heEZvcndhcmRzfFBhc3MoPzpJbmhlcml0fEludGVycG9sYXRlRW52fE1hdGNofFJldmVyc2V8UmV2ZXJzZUNvb2tpZURvbWFpbnxSZXZlcnNlQ29va2llUGF0aCk/fFByZXNlcnZlSG9zdHxSZWNlaXZlQnVmZmVyU2l6ZXxSZW1vdGV8UmVtb3RlTWF0Y2h8UmVxdWVzdHN8U0NHSUludGVybmFsUmVkaXJlY3R8U0NHSVNlbmRmaWxlfFNldHxTb3VyY2VBZGRyZXNzfFN0YXR1c3xUaW1lb3V0fFZpYSl8UmVhZG1lTmFtZXxSZWNlaXZlQnVmZmVyU2l6ZXxSZWRpcmVjdHxSZWRpcmVjdE1hdGNofFJlZGlyZWN0UGVybWFuZW50fFJlZGlyZWN0VGVtcHxSZWZsZWN0b3JIZWFkZXJ8UmVtb3RlSVAoPzpIZWFkZXJ8SW50ZXJuYWxQcm94eXxJbnRlcm5hbFByb3h5TGlzdHxQcm94aWVzSGVhZGVyfFRydXN0ZWRQcm94eXxUcnVzdGVkUHJveHlMaXN0KXxSZW1vdmVDaGFyc2V0fFJlbW92ZUVuY29kaW5nfFJlbW92ZUhhbmRsZXJ8UmVtb3ZlSW5wdXRGaWx0ZXJ8UmVtb3ZlTGFuZ3VhZ2V8UmVtb3ZlT3V0cHV0RmlsdGVyfFJlbW92ZVR5cGV8UmVxdWVzdEhlYWRlcnxSZXF1ZXN0UmVhZFRpbWVvdXR8UmVxdWlyZXxSZXdyaXRlKD86QmFzZXxDb25kfEVuZ2luZXxNYXB8T3B0aW9uc3xSdWxlKXxSTGltaXRDUFV8UkxpbWl0TUVNfFJMaW1pdE5QUk9DfFNhdGlzZnl8U2NvcmVCb2FyZEZpbGV8U2NyaXB0KD86QWxpYXN8QWxpYXNNYXRjaHxJbnRlcnByZXRlclNvdXJjZXxMb2d8TG9nQnVmZmVyfExvZ0xlbmd0aHxTb2NrKT98U2VjdXJlTGlzdGVufFNlZVJlcXVlc3RUYWlsfFNlbmRCdWZmZXJTaXplfFNlcnZlcig/OkFkbWlufEFsaWFzfExpbWl0fE5hbWV8UGF0aHxSb290fFNpZ25hdHVyZXxUb2tlbnMpfFNlc3Npb24oPzpDb29raWUoPzpOYW1lfE5hbWUyfFJlbW92ZSl8Q3J5cHRvKD86Q2lwaGVyfERyaXZlcnxQYXNzcGhyYXNlfFBhc3NwaHJhc2VGaWxlKXxEQkQoPzpDb29raWVOYW1lfENvb2tpZU5hbWUyfENvb2tpZVJlbW92ZXxEZWxldGVMYWJlbHxJbnNlcnRMYWJlbHxQZXJVc2VyfFNlbGVjdExhYmVsfFVwZGF0ZUxhYmVsKXxFbnZ8RXhjbHVkZXxIZWFkZXJ8SW5jbHVkZXxNYXhBZ2UpP3xTZXRFbnZ8U2V0RW52SWZ8U2V0RW52SWZFeHByfFNldEVudklmTm9DYXNlfFNldEhhbmRsZXJ8U2V0SW5wdXRGaWx0ZXJ8U2V0T3V0cHV0RmlsdGVyfFNTSUVuZFRhZ3xTU0lFcnJvck1zZ3xTU0lFVGFnfFNTSUxhc3RNb2RpZmllZHxTU0lMZWdhY3lFeHByUGFyc2VyfFNTSVN0YXJ0VGFnfFNTSVRpbWVGb3JtYXR8U1NJVW5kZWZpbmVkRWNob3xTU0woPzpDQUNlcnRpZmljYXRlRmlsZXxDQUNlcnRpZmljYXRlUGF0aHxDQUROUmVxdWVzdEZpbGV8Q0FETlJlcXVlc3RQYXRofENBUmV2b2NhdGlvbkNoZWNrfENBUmV2b2NhdGlvbkZpbGV8Q0FSZXZvY2F0aW9uUGF0aHxDZXJ0aWZpY2F0ZUNoYWluRmlsZXxDZXJ0aWZpY2F0ZUZpbGV8Q2VydGlmaWNhdGVLZXlGaWxlfENpcGhlclN1aXRlfENvbXByZXNzaW9ufENyeXB0b0RldmljZXxFbmdpbmV8RklQU3xIb25vckNpcGhlck9yZGVyfEluc2VjdXJlUmVuZWdvdGlhdGlvbnxPQ1NQKD86RGVmYXVsdFJlc3BvbmRlcnxFbmFibGV8T3ZlcnJpZGVSZXNwb25kZXJ8UmVzcG9uZGVyVGltZW91dHxSZXNwb25zZU1heEFnZXxSZXNwb25zZVRpbWVTa2V3fFVzZVJlcXVlc3ROb25jZSl8T3BlblNTTENvbmZDbWR8T3B0aW9uc3xQYXNzUGhyYXNlRGlhbG9nfFByb3RvY29sfFByb3h5KD86Q0FDZXJ0aWZpY2F0ZUZpbGV8Q0FDZXJ0aWZpY2F0ZVBhdGh8Q0FSZXZvY2F0aW9uKD86Q2hlY2t8RmlsZXxQYXRoKXxDaGVja1BlZXIoPzpDTnxFeHBpcmV8TmFtZSl8Q2lwaGVyU3VpdGV8RW5naW5lfE1hY2hpbmVDZXJ0aWZpY2F0ZSg/OkNoYWluRmlsZXxGaWxlfFBhdGgpfFByb3RvY29sfFZlcmlmeXxWZXJpZnlEZXB0aCl8UmFuZG9tU2VlZHxSZW5lZ0J1ZmZlclNpemV8UmVxdWlyZXxSZXF1aXJlU1NMfFNlc3Npb24oPzpDYWNoZXxDYWNoZVRpbWVvdXR8VGlja2V0S2V5RmlsZXxUaWNrZXRzKXxTUlBVbmtub3duVXNlclNlZWR8U1JQVmVyaWZpZXJGaWxlfFN0YXBsaW5nKD86Q2FjaGV8RXJyb3JDYWNoZVRpbWVvdXR8RmFrZVRyeUxhdGVyfEZvcmNlVVJMfFJlc3BvbmRlclRpbWVvdXR8UmVzcG9uc2VNYXhBZ2V8UmVzcG9uc2VUaW1lU2tld3xSZXR1cm5SZXNwb25kZXJFcnJvcnN8U3RhbmRhcmRDYWNoZVRpbWVvdXQpfFN0cmljdFNOSVZIb3N0Q2hlY2t8VXNlck5hbWV8VXNlU3RhcGxpbmd8VmVyaWZ5Q2xpZW50fFZlcmlmeURlcHRoKXxTdGFydFNlcnZlcnN8U3RhcnRUaHJlYWRzfFN1YnN0aXR1dGV8U3VleGVjfFN1ZXhlY1VzZXJHcm91cHxUaHJlYWRMaW1pdHxUaHJlYWRzUGVyQ2hpbGR8VGhyZWFkU3RhY2tTaXplfFRpbWVPdXR8VHJhY2VFbmFibGV8VHJhbnNmZXJMb2d8VHlwZXNDb25maWd8VW5EZWZpbmV8VW5kZWZNYWNyb3xVbnNldEVudnxVc2V8VXNlQ2Fub25pY2FsTmFtZXxVc2VDYW5vbmljYWxQaHlzaWNhbFBvcnR8VXNlcnxVc2VyRGlyfFZIb3N0Q0dJTW9kZXxWSG9zdENHSVByaXZzfFZIb3N0R3JvdXB8Vkhvc3RQcml2c3xWSG9zdFNlY3VyZXxWSG9zdFVzZXJ8VmlydHVhbCg/OkRvY3VtZW50Um9vdHxTY3JpcHRBbGlhcykoPzpJUCk/fFdhdGNoZG9nSW50ZXJ2YWx8WEJpdEhhY2t8eG1sMkVuY0FsaWFzfHhtbDJFbmNEZWZhdWx0fHhtbDJTdGFydFBhcnNlKVxcYi9pbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cdCdkaXJlY3RpdmUtYmxvY2snOiB7XG5cdFx0cGF0dGVybjogLzxcXC8/XFxiKD86QXV0aFtuel1Qcm92aWRlckFsaWFzfERpcmVjdG9yeXxEaXJlY3RvcnlNYXRjaHxFbHNlfEVsc2VJZnxGaWxlc3xGaWxlc01hdGNofElmfElmRGVmaW5lfElmTW9kdWxlfElmVmVyc2lvbnxMaW1pdHxMaW1pdEV4Y2VwdHxMb2NhdGlvbnxMb2NhdGlvbk1hdGNofE1hY3JvfFByb3h5fFJlcXVpcmUoPzpBbGx8QW55fE5vbmUpfFZpcnR1YWxIb3N0KVxcYi4qPi9pLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2RpcmVjdGl2ZS1ibG9jayc6IHtcblx0XHRcdFx0cGF0dGVybjogL148XFwvP1xcdysvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXjxcXC8/L1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRhbGlhczogJ3RhZydcblx0XHRcdH0sXG5cdFx0XHQnZGlyZWN0aXZlLWJsb2NrLXBhcmFtZXRlcic6IHtcblx0XHRcdFx0cGF0dGVybjogLy4qW14+XS8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC86Lyxcblx0XHRcdFx0XHQnc3RyaW5nJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLyhcInwnKS4qXFwxLyxcblx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHQndmFyaWFibGUnOiAvWyQlXVxcez8oPzpcXHdcXC4/Wy0rOl0/KStcXH0/L1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0YWxpYXM6ICdhdHRyLXZhbHVlJ1xuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC8+L1xuXHRcdH0sXG5cdFx0YWxpYXM6ICd0YWcnXG5cdH0sXG5cdCdkaXJlY3RpdmUtZmxhZ3MnOiB7XG5cdFx0cGF0dGVybjogL1xcWyg/OltcXHc9XSw/KStcXF0vLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFwifCcpLipcXDEvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3ZhcmlhYmxlJzogL1skJV1cXHs/KD86XFx3XFwuP1stKzpdPykrXFx9Py9cblx0XHR9XG5cdH0sXG5cdCd2YXJpYWJsZSc6IC9bJCVdXFx7Pyg/Olxcd1xcLj9bLSs6XT8pK1xcfT8vLFxuXHQncmVnZXgnOiAvXFxePy4qXFwkfFxcXi4qXFwkPy9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5zcWwgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSg/OlxcL1xcKltcXHNcXFNdKj9cXCpcXC98KD86LS18XFwvXFwvfCMpLiopLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCd2YXJpYWJsZSc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvQChbXCInYF0pKD86XFxcXFtcXHNcXFNdfCg/IVxcMSlbXlxcXFxdKStcXDEvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQvQFtcXHcuJF0rL1xuXHRdLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXkBcXFxcXSkoXCJ8JykoPzpcXFxcW1xcc1xcU118KD8hXFwyKVteXFxcXF18XFwyXFwyKSpcXDIvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdpZGVudGlmaWVyJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXkBcXFxcXSlgKD86XFxcXFtcXHNcXFNdfFteYFxcXFxdfGBgKSpgLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9eYHxgJC9cblx0XHR9XG5cdH0sXG5cdCdmdW5jdGlvbic6IC9cXGIoPzpBVkd8Q09VTlR8RklSU1R8Rk9STUFUfExBU1R8TENBU0V8TEVOfE1BWHxNSUR8TUlOfE1PRHxOT1d8Uk9VTkR8U1VNfFVDQVNFKSg/PVxccypcXCgpL2ksIC8vIFNob3VsZCB3ZSBoaWdobGlnaHQgdXNlciBkZWZpbmVkIGZ1bmN0aW9ucyB0b28/XG5cdCdrZXl3b3JkJzogL1xcYig/OkFDVElPTnxBRER8QUZURVJ8QUxHT1JJVEhNfEFMTHxBTFRFUnxBTkFMWVpFfEFOWXxBUFBMWXxBU3xBU0N8QVVUSE9SSVpBVElPTnxBVVRPX0lOQ1JFTUVOVHxCQUNLVVB8QkRCfEJFR0lOfEJFUktFTEVZREJ8QklHSU5UfEJJTkFSWXxCSVR8QkxPQnxCT09MfEJPT0xFQU58QlJFQUt8QlJPV1NFfEJUUkVFfEJVTEt8Qll8Q0FMTHxDQVNDQURFRD98Q0FTRXxDSEFJTnxDSEFSKD86QUNURVJ8U0VUKT98Q0hFQ0soPzpQT0lOVCk/fENMT1NFfENMVVNURVJFRHxDT0FMRVNDRXxDT0xMQVRFfENPTFVNTlM/fENPTU1FTlR8Q09NTUlUKD86VEVEKT98Q09NUFVURXxDT05ORUNUfENPTlNJU1RFTlR8Q09OU1RSQUlOVHxDT05UQUlOUyg/OlRBQkxFKT98Q09OVElOVUV8Q09OVkVSVHxDUkVBVEV8Q1JPU1N8Q1VSUkVOVCg/Ol9EQVRFfF9USU1FfF9USU1FU1RBTVB8X1VTRVIpP3xDVVJTT1J8Q1lDTEV8REFUQSg/OkJBU0VTPyk/fERBVEUoPzpUSU1FKT98REFZfERCQ0N8REVBTExPQ0FURXxERUN8REVDSU1BTHxERUNMQVJFfERFRkFVTFR8REVGSU5FUnxERUxBWUVEfERFTEVURXxERUxJTUlURVJTP3xERU5ZfERFU0N8REVTQ1JJQkV8REVURVJNSU5JU1RJQ3xESVNBQkxFfERJU0NBUkR8RElTS3xESVNUSU5DVHxESVNUSU5DVFJPV3xESVNUUklCVVRFRHxET3xET1VCTEV8RFJPUHxEVU1NWXxEVU1QKD86RklMRSk/fERVUExJQ0FURXxFTFNFKD86SUYpP3xFTkFCTEV8RU5DTE9TRUR8RU5EfEVOR0lORXxFTlVNfEVSUkxWTHxFUlJPUlN8RVNDQVBFRD98RVhDRVBUfEVYRUMoPzpVVEUpP3xFWElTVFN8RVhJVHxFWFBMQUlOfEVYVEVOREVEfEZFVENIfEZJRUxEU3xGSUxFfEZJTExGQUNUT1J8RklSU1R8RklYRUR8RkxPQVR8Rk9MTE9XSU5HfEZPUig/OiBFQUNIIFJPVyk/fEZPUkNFfEZPUkVJR058RlJFRVRFWFQoPzpUQUJMRSk/fEZST018RlVMTHxGVU5DVElPTnxHRU9NRVRSWSg/OkNPTExFQ1RJT04pP3xHTE9CQUx8R09UT3xHUkFOVHxHUk9VUHxIQU5ETEVSfEhBU0h8SEFWSU5HfEhPTERMT0NLfEhPVVJ8SURFTlRJVFkoPzpDT0x8X0lOU0VSVCk/fElGfElHTk9SRXxJTVBPUlR8SU5ERVh8SU5GSUxFfElOTkVSfElOTk9EQnxJTk9VVHxJTlNFUlR8SU5UfElOVEVHRVJ8SU5URVJTRUNUfElOVEVSVkFMfElOVE98SU5WT0tFUnxJU09MQVRJT058SVRFUkFURXxKT0lOfEtFWVM/fEtJTEx8TEFOR1VBR0V8TEFTVHxMRUFWRXxMRUZUfExFVkVMfExJTUlUfExJTkVOT3xMSU5FU3xMSU5FU1RSSU5HfExPQUR8TE9DQUx8TE9DS3xMT05HKD86QkxPQnxURVhUKXxMT09QfE1BVENIKD86RUQpP3xNRURJVU0oPzpCTE9CfElOVHxURVhUKXxNRVJHRXxNSURETEVJTlR8TUlOVVRFfE1PREV8TU9ESUZJRVN8TU9ESUZZfE1PTlRIfE1VTFRJKD86TElORVNUUklOR3xQT0lOVHxQT0xZR09OKXxOQVRJT05BTHxOQVRVUkFMfE5DSEFSfE5FWFR8Tk98Tk9OQ0xVU1RFUkVEfE5VTExJRnxOVU1FUklDfE9GRj98T0ZGU0VUUz98T058T1BFTig/OkRBVEFTT1VSQ0V8UVVFUll8Uk9XU0VUKT98T1BUSU1JWkV8T1BUSU9OKD86QUxMWSk/fE9SREVSfE9VVCg/OkVSfEZJTEUpP3xPVkVSfFBBUlRJQUx8UEFSVElUSU9OfFBFUkNFTlR8UElWT1R8UExBTnxQT0lOVHxQT0xZR09OfFBSRUNFRElOR3xQUkVDSVNJT058UFJFUEFSRXxQUkVWfFBSSU1BUll8UFJJTlR8UFJJVklMRUdFU3xQUk9DKD86RURVUkUpP3xQVUJMSUN8UFVSR0V8UVVJQ0t8UkFJU0VSUk9SfFJFQURTP3xSRUFMfFJFQ09ORklHVVJFfFJFRkVSRU5DRVN8UkVMRUFTRXxSRU5BTUV8UkVQRUFUKD86QUJMRSk/fFJFUExBQ0V8UkVQTElDQVRJT058UkVRVUlSRXxSRVNJR05BTHxSRVNUT1JFfFJFU1RSSUNUfFJFVFVSTig/OklOR3xTKT98UkVWT0tFfFJJR0hUfFJPTExCQUNLfFJPVVRJTkV8Uk9XKD86Q09VTlR8R1VJRENPTHxTKT98UlRSRUV8UlVMRXxTQVZFKD86UE9JTlQpP3xTQ0hFTUF8U0VDT05EfFNFTEVDVHxTRVJJQUwoPzpJWkFCTEUpP3xTRVNTSU9OKD86X1VTRVIpP3xTRVQoPzpVU0VSKT98U0hBUkV8U0hPV3xTSFVURE9XTnxTSU1QTEV8U01BTExJTlR8U05BUFNIT1R8U09NRXxTT05BTUV8U1FMfFNUQVJUKD86SU5HKT98U1RBVElTVElDU3xTVEFUVVN8U1RSSVBFRHxTWVNURU1fVVNFUnxUQUJMRVM/fFRBQkxFU1BBQ0V8VEVNUCg/Ok9SQVJZfFRBQkxFKT98VEVSTUlOQVRFRHxURVhUKD86U0laRSk/fFRIRU58VElNRSg/OlNUQU1QKT98VElOWSg/OkJMT0J8SU5UfFRFWFQpfFRPUD98VFJBTig/OlNBQ1RJT05TPyk/fFRSSUdHRVJ8VFJVTkNBVEV8VFNFUVVBTHxUWVBFUz98VU5CT1VOREVEfFVOQ09NTUlUVEVEfFVOREVGSU5FRHxVTklPTnxVTklRVUV8VU5MT0NLfFVOUElWT1R8VU5TSUdORUR8VVBEQVRFKD86VEVYVCk/fFVTQUdFfFVTRXxVU0VSfFVTSU5HfFZBTFVFUz98VkFSKD86QklOQVJZfENIQVJ8Q0hBUkFDVEVSfFlJTkcpfFZJRVd8V0FJVEZPUnxXQVJOSU5HU3xXSEVOfFdIRVJFfFdISUxFfFdJVEgoPzogUk9MTFVQfElOKT98V09SS3xXUklURSg/OlRFWFQpP3xZRUFSKVxcYi9pLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpGQUxTRXxOVUxMfFRSVUUpXFxiL2ksXG5cdCdudW1iZXInOiAvXFxiMHhbXFxkYS1mXStcXGJ8XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrXFxiL2ksXG5cdCdvcGVyYXRvcic6IC9bLSsqXFwvPSVefl18JiY/fFxcfFxcfD98IT0/fDwoPzo9Pj98PHw+KT98Pls+PV0/fFxcYig/OkFORHxCRVRXRUVOfERJVnxJTElLRXxJTnxJU3xMSUtFfE5PVHxPUnxSRUdFWFB8UkxJS0V8U09VTkRTIExJS0V8WE9SKVxcYi9pLFxuXHQncHVuY3R1YXRpb24nOiAvWztbXFxdKClgLC5dL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBrZXl3b3JkcyA9IC9cXGIoPzooPzphZnRlcnxiZWZvcmUpKD89XFxzK1thLXpdKXxhYnN0cmFjdHxhY3RpdmF0ZXxhbmR8YW55fGFycmF5fGFzfGFzY3xhdXRvbm9tb3VzfGJlZ2lufGJpZ2RlY2ltYWx8YmxvYnxib29sZWFufGJyZWFrfGJ1bGt8Ynl8Ynl0ZXxjYXNlfGNhc3R8Y2F0Y2h8Y2hhcnxjbGFzc3xjb2xsZWN0fGNvbW1pdHxjb25zdHxjb250aW51ZXxjdXJyZW5jeXxkYXRlfGRhdGV0aW1lfGRlY2ltYWx8ZGVmYXVsdHxkZWxldGV8ZGVzY3xkb3xkb3VibGV8ZWxzZXxlbmR8ZW51bXxleGNlcHRpb258ZXhpdHxleHBvcnR8ZXh0ZW5kc3xmaW5hbHxmaW5hbGx5fGZsb2F0fGZvcnxmcm9tfGdldCg/PVxccypbe307XSl8Z2xvYmFsfGdvdG98Z3JvdXB8aGF2aW5nfGhpbnR8aWZ8aW1wbGVtZW50c3xpbXBvcnR8aW58aW5uZXJ8aW5zZXJ0fGluc3RhbmNlb2Z8aW50fGludGVnZXJ8aW50ZXJmYWNlfGludG98am9pbnxsaWtlfGxpbWl0fGxpc3R8bG9uZ3xsb29wfG1hcHxtZXJnZXxuZXd8bm90fG51bGx8bnVsbHN8bnVtYmVyfG9iamVjdHxvZnxvbnxvcnxvdXRlcnxvdmVycmlkZXxwYWNrYWdlfHBhcmFsbGVsfHByYWdtYXxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8cmV0cmlldmV8cmV0dXJufHJvbGxiYWNrfHNlbGVjdHxzZXR8c2hvcnR8c09iamVjdHxzb3J0fHN0YXRpY3xzdHJpbmd8c3VwZXJ8c3dpdGNofHN5bmNocm9uaXplZHxzeXN0ZW18dGVzdG1ldGhvZHx0aGVufHRoaXN8dGhyb3d8dGltZXx0cmFuc2FjdGlvbnx0cmFuc2llbnR8dHJpZ2dlcnx0cnl8dW5kZWxldGV8dXBkYXRlfHVwc2VydHx1c2luZ3x2aXJ0dWFsfHZvaWR8d2Vic2VydmljZXx3aGVufHdoZXJlfHdoaWxlfCg/OmluaGVyaXRlZHx3aXRofHdpdGhvdXQpXFxzK3NoYXJpbmcpXFxiL2k7XG5cblx0dmFyIGNsYXNzTmFtZSA9IC9cXGIoPzooPz1bYS16X11cXHcqXFxzKls8XFxbXSl8KD8hPGtleXdvcmQ+KSlbQS1aX11cXHcqKD86XFxzKlxcLlxccypbQS1aX11cXHcqKSpcXGIoPzpcXHMqKD86XFxbXFxzKlxcXXw8KD86W148Pl18PCg/OltePD5dfDxbXjw+XSo+KSo+KSo+KSkqLy5zb3VyY2Vcblx0XHQucmVwbGFjZSgvPGtleXdvcmQ+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGtleXdvcmRzLnNvdXJjZTsgfSk7XG5cdC8qKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVybiAqL1xuXHRmdW5jdGlvbiBpbnNlcnRDbGFzc05hbWUocGF0dGVybikge1xuXHRcdHJldHVybiBSZWdFeHAocGF0dGVybi5yZXBsYWNlKC88Q0xBU1MtTkFNRT4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gY2xhc3NOYW1lOyB9KSwgJ2knKTtcblx0fVxuXG5cdHZhciBjbGFzc05hbWVJbnNpZGUgPSB7XG5cdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpXFxbXFxde307LDouPD5dL1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5hcGV4ID0ge1xuXHRcdCdjb21tZW50JzogUHJpc20ubGFuZ3VhZ2VzLmNsaWtlLmNvbW1lbnQsXG5cdFx0J3N0cmluZyc6IFByaXNtLmxhbmd1YWdlcy5jbGlrZS5zdHJpbmcsXG5cdFx0J3NxbCc6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86Wz0sKHs6XXxcXGJyZXR1cm4pXFxzKilcXFtbXlxcW1xcXV0qXFxdL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1zcWwnLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuc3FsXG5cdFx0fSxcblxuXHRcdCdhbm5vdGF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogL0BcXHcrXFxiLyxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQnY2xhc3MtbmFtZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogaW5zZXJ0Q2xhc3NOYW1lKC8oXFxiKD86Y2xhc3N8ZW51bXxleHRlbmRzfGltcGxlbWVudHN8aW5zdGFuY2VvZnxpbnRlcmZhY2V8bmV3fHRyaWdnZXJcXHMrXFx3K1xccytvbilcXHMrKTxDTEFTUy1OQU1FPi8uc291cmNlKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBjbGFzc05hbWVJbnNpZGVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGNhc3Rcblx0XHRcdFx0cGF0dGVybjogaW5zZXJ0Q2xhc3NOYW1lKC8oXFwoXFxzKik8Q0xBU1MtTkFNRT4oPz1cXHMqXFwpXFxzKltcXHcoXSkvLnNvdXJjZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogY2xhc3NOYW1lSW5zaWRlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyB2YXJpYWJsZS9wYXJhbWV0ZXIgZGVjbGFyYXRpb24gYW5kIHJldHVybiB0eXBlc1xuXHRcdFx0XHRwYXR0ZXJuOiBpbnNlcnRDbGFzc05hbWUoLzxDTEFTUy1OQU1FPig/PVxccypcXHcrXFxzKls7PSwoKXs6XSkvLnNvdXJjZSksXG5cdFx0XHRcdGluc2lkZTogY2xhc3NOYW1lSW5zaWRlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQndHJpZ2dlcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxidHJpZ2dlclxccyspXFx3K1xcYi9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvaSxcblxuXHRcdCdudW1iZXInOiAvKD86XFxCXFwuXFxkK3xcXGJcXGQrKD86XFwuXFxkK3xMKT8pXFxiL2ksXG5cdFx0J29wZXJhdG9yJzogL1shPV0oPzo9PT8pP3xcXD9cXC4/fCYmfFxcfFxcfHwtLXxcXCtcXCt8Wy0rKi9eJnxdPT98Onw8PD89P3w+ezEsM309Py8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKVxcW1xcXXt9OywuXS9cblx0fTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuYXBsID0ge1xuXHQnY29tbWVudCc6IC8oPzpcdTIzNUR8I1shIF0pLiokL20sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLycoPzpbXidcXHJcXG5dfCcnKSonLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J251bWJlcic6IC9cdTAwQUY/KD86XFxkKlxcLj9cXGJcXGQrKD86ZVsrXHUwMEFGXT9cXGQrKT98XHUwMEFGfFx1MjIxRSkoPzpqXHUwMEFGPyg/Oig/OlxcZCsoPzpcXC5cXGQrKT98XFwuXFxkKykoPzplWytcdTAwQUZdP1xcZCspP3xcdTAwQUZ8XHUyMjFFKSk/L2ksXG5cdCdzdGF0ZW1lbnQnOiAvOltBLVpdW2Etel1bQS1aYS16XSpcXGIvLFxuXHQnc3lzdGVtLWZ1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9cdTIzOTVbQS1aXSsvaSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQnY29uc3RhbnQnOiAvW1x1MjM2Q1x1MjMzRSNcdTIzOTVcdTIzNUVdLyxcblx0J2Z1bmN0aW9uJzogL1stK1x1MDBEN1x1MDBGN1x1MjMwOFx1MjMwQVx1MjIyM3xcdTIzNzNcdTIzNzg/Klx1MjM1Rlx1MjVDQiFcdTIzMzk8XHUyMjY0PT5cdTIyNjVcdTIyNjBcdTIyNjFcdTIyNjJcdTIyMEFcdTIzNzdcdTIyMkFcdTIyMjl+XHUyMjI4XHUyMjI3XHUyMzcxXHUyMzcyXHUyMzc0LFx1MjM2QVx1MjMzRFx1MjI5Nlx1MjM0OVx1MjE5MVx1MjE5M1x1MjI4Mlx1MjI4M1x1MjI4Nlx1MjI4N1x1MjMzN1x1MjM0Qlx1MjM1Mlx1MjJBNFx1MjJBNVx1MjM1NVx1MjM0RVx1MjJBM1x1MjJBMlx1MjM0MVx1MjM0Mlx1MjI0OFx1MjM2Rlx1MjE5N1x1MDBBNFx1MjE5Ml0vLFxuXHQnbW9uYWRpYy1vcGVyYXRvcic6IHtcblx0XHRwYXR0ZXJuOiAvW1xcXFxcXC9cdTIzM0ZcdTIzNDBcdTAwQThcdTIzNjhcdTIzMzYmXHUyMjI1XS8sXG5cdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0fSxcblx0J2R5YWRpYy1vcGVyYXRvcic6IHtcblx0XHRwYXR0ZXJuOiAvWy5cdTIzNjNcdTIzNjBcdTIzNjRcdTIyMThcdTIzMzhAXHUyMzNBXHUyMzY1XS8sXG5cdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0fSxcblx0J2Fzc2lnbm1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1x1MjE5MC8sXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvW1xcWztcXF0oKVx1MjVDN1x1MjJDNF0vLFxuXHQnZGZuJzoge1xuXHRcdHBhdHRlcm46IC9be31cdTIzN0FcdTIzNzVcdTIzNzZcdTIzNzlcdTIyMDdcdTIzNkI6XS8sXG5cdFx0YWxpYXM6ICdidWlsdGluJ1xuXHR9XG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuYXBwbGVzY3JpcHQgPSB7XG5cdCdjb21tZW50JzogW1xuXHRcdC8vIEFsbG93IG9uZSBsZXZlbCBvZiBuZXN0aW5nXG5cdFx0L1xcKFxcKig/OlxcKFxcKig/OlteKl18XFwqKD8hXFwpKSkqXFwqXFwpfCg/IVxcKFxcKilbXFxzXFxTXSkqP1xcKlxcKS8sXG5cdFx0Ly0tLisvLFxuXHRcdC8jLisvXG5cdF0sXG5cdCdzdHJpbmcnOiAvXCIoPzpcXFxcLnxbXlwiXFxcXFxcclxcbl0pKlwiLyxcblx0J251bWJlcic6IC8oPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86ZS0/XFxkKyk/XFxiL2ksXG5cdCdvcGVyYXRvcic6IFtcblx0XHQvWyY9XHUyMjYwXHUyMjY0XHUyMjY1KitcXC1cXC9cdTAwRjdeXXxbPD5dPT8vLFxuXHRcdC9cXGIoPzooPzpiZWdpbnxlbmR8c3RhcnQpcz8gd2l0aHwoPzpjb250YWlucz98KD86ZG9lcyBub3R8ZG9lc24ndCkgY29udGFpbil8KD86aXN8aXNuJ3R8aXMgbm90KSAoPzpjb250YWluZWQgYnl8aW4pfCg/Oig/OmlzfGlzbid0fGlzIG5vdCkgKT8oPzpncmVhdGVyfGxlc3MpIHRoYW4oPzogb3IgZXF1YWwpPyg/OiB0byk/fCg/OmNvbWVzfCg/OmRvZXMgbm90fGRvZXNuJ3QpIGNvbWUpICg/OmFmdGVyfGJlZm9yZSl8KD86aXN8aXNuJ3R8aXMgbm90KSBlcXVhbCg/OiB0byk/fCg/Oig/OmRvZXMgbm90fGRvZXNuJ3QpIGVxdWFsfGVxdWFsIHRvfGVxdWFsc3xpcyBub3R8aXNuJ3QpfCg/OmEgKT8oPzpyZWYoPzogdG8pP3xyZWZlcmVuY2UgdG8pfCg/OmFuZHxhc3xkaXZ8bW9kfG5vdHxvcikpXFxiL1xuXHRdLFxuXHQna2V5d29yZCc6IC9cXGIoPzphYm91dHxhYm92ZXxhZnRlcnxhZ2FpbnN0fGFwYXJ0IGZyb218YXJvdW5kfGFzaWRlIGZyb218YXR8YmFja3xiZWZvcmV8YmVnaW5uaW5nfGJlaGluZHxiZWxvd3xiZW5lYXRofGJlc2lkZXxiZXR3ZWVufGJ1dHxieXxjb25zaWRlcmluZ3xjb250aW51ZXxjb3B5fGRvZXN8ZWlnaHRofGVsc2V8ZW5kfGVxdWFsfGVycm9yfGV2ZXJ5fGV4aXR8ZmFsc2V8ZmlmdGh8Zmlyc3R8Zm9yfGZvdXJ0aHxmcm9tfGZyb250fGdldHxnaXZlbnxnbG9iYWx8aWZ8aWdub3Jpbmd8aW58aW5zdGVhZCBvZnxpbnRvfGlzfGl0fGl0c3xsYXN0fGxvY2FsfG1lfG1pZGRsZXxteXxuaW50aHxvZnxvbnxvbnRvfG91dCBvZnxvdmVyfHByb3B8cHJvcGVydHl8cHV0fHJlcGVhdHxyZXR1cm58cmV0dXJuaW5nfHNlY29uZHxzZXR8c2V2ZW50aHxzaW5jZXxzaXh0aHxzb21lfHRlbGx8dGVudGh8dGhhdHx0aGV8dGhlbnx0aGlyZHx0aHJvdWdofHRocnV8dGltZW91dHx0aW1lc3x0b3x0cmFuc2FjdGlvbnx0cnVlfHRyeXx1bnRpbHx3aGVyZXx3aGlsZXx3aG9zZXx3aXRofHdpdGhvdXQpXFxiLyxcblx0J2NsYXNzLW5hbWUnOiAvXFxiKD86UE9TSVggZmlsZXxSR0IgY29sb3J8YWxpYXN8YXBwbGljYXRpb258Ym9vbGVhbnxjZW50aW1ldGVyc3xjZW50aW1ldHJlc3xjbGFzc3xjb25zdGFudHxjdWJpYyBjZW50aW1ldGVyc3xjdWJpYyBjZW50aW1ldHJlc3xjdWJpYyBmZWV0fGN1YmljIGluY2hlc3xjdWJpYyBtZXRlcnN8Y3ViaWMgbWV0cmVzfGN1YmljIHlhcmRzfGRhdGV8ZGVncmVlcyBDZWxzaXVzfGRlZ3JlZXMgRmFocmVuaGVpdHxkZWdyZWVzIEtlbHZpbnxmZWV0fGZpbGV8Z2FsbG9uc3xncmFtc3xpbmNoZXN8aW50ZWdlcnxraWxvZ3JhbXN8a2lsb21ldGVyc3xraWxvbWV0cmVzfGxpc3R8bGl0ZXJzfGxpdHJlc3xtZXRlcnN8bWV0cmVzfG1pbGVzfG51bWJlcnxvdW5jZXN8cG91bmRzfHF1YXJ0c3xyZWFsfHJlY29yZHxyZWZlcmVuY2V8c2NyaXB0fHNxdWFyZSBmZWV0fHNxdWFyZSBraWxvbWV0ZXJzfHNxdWFyZSBraWxvbWV0cmVzfHNxdWFyZSBtZXRlcnN8c3F1YXJlIG1ldHJlc3xzcXVhcmUgbWlsZXN8c3F1YXJlIHlhcmRzfHRleHR8eWFyZHMpXFxiLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fSgpOixcdTAwQUNcdTAwQUJcdTAwQkJcdTMwMEFcdTMwMEJdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmFxbCA9IHtcblx0J2NvbW1lbnQnOiAvXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdCdwcm9wZXJ0eSc6IHtcblx0XHRwYXR0ZXJuOiAvKFt7LF1cXHMqKSg/Oig/IVxcZClcXHcrfChbXCInXHUwMEI0YF0pKD86KD8hXFwyKVteXFxcXFxcclxcbl18XFxcXC4pKlxcMikoPz1cXHMqOikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhbXCInXSkoPzooPyFcXDEpW15cXFxcXFxyXFxuXXxcXFxcLikqXFwxLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2lkZW50aWZpZXInOiB7XG5cdFx0cGF0dGVybjogLyhbXHUwMEI0YF0pKD86KD8hXFwxKVteXFxcXFxcclxcbl18XFxcXC4pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCd2YXJpYWJsZSc6IC9AQD9cXHcrLyxcblx0J2tleXdvcmQnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhcXGJXSVRIXFxzKylDT1VOVCg/PVxccytJTlRPXFxiKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0L1xcYig/OkFHR1JFR0FURXxBTEx8QU5EfEFOWXxBU0N8Q09MTEVDVHxERVNDfERJU1RJTkNUfEZJTFRFUnxGT1J8R1JBUEh8SU58SU5CT1VORHxJTlNFUlR8SU5UT3xLX1BBVEhTfEtfU0hPUlRFU1RfUEFUSFN8TEVUfExJS0V8TElNSVR8Tk9ORXxOT1R8TlVMTHxPUnxPVVRCT1VORHxSRU1PVkV8UkVQTEFDRXxSRVRVUk58U0hPUlRFU1RfUEFUSHxTT1JUfFVQREFURXxVUFNFUlR8V0lORE9XfFdJVEgpXFxiL2ksXG5cdFx0Ly8gcHNldWRvIGtleXdvcmRzIGdldCBhIGxvb2tiZWhpbmQgdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVzXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3LltdKSg/OktFRVB8UFJVTkV8U0VBUkNIfFRPKVxcYi9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3LltdKSg/OkNVUlJFTlR8TkVXfE9MRClcXGIvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYk9QVElPTlMoPz1cXHMqXFx7KS9pXG5cdFx0fVxuXHRdLFxuXHQnZnVuY3Rpb24nOiAvXFxiKD8hXFxkKVxcdysoPz1cXHMqXFwoKS8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiL2ksXG5cdCdyYW5nZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFwuXFwuLyxcblx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHR9LFxuXHQnbnVtYmVyJzogW1xuXHRcdC9cXGIwYlswMV0rL2ksXG5cdFx0L1xcYjB4WzAtOWEtZl0rL2ksXG5cdFx0Lyg/OlxcQlxcLlxcZCt8XFxiKD86MHxbMS05XVxcZCopKD86XFwuXFxkKyk/KSg/OmVbKy1dP1xcZCspPy9pXG5cdF0sXG5cdCdvcGVyYXRvcic6IC9cXCp7Mix9fFs9IV1+fFshPTw+XT0/fCYmfFxcfFxcfHxbLSsqLyVdLyxcblx0J3B1bmN0dWF0aW9uJzogLzo6fFs/LjosOygpW1xcXXt9XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5jID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXC8oPzpbXlxcclxcblxcXFxdfFxcXFwoPzpcXHJcXG4/fFxcbnwoPyFbXFxyXFxuXSkpKSp8XFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0Ly8gaHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvYy9sYW5ndWFnZS9zdHJpbmdfbGl0ZXJhbFxuXHRcdHBhdHRlcm46IC9cIig/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteXCJcXFxcXFxyXFxuXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYig/OmVudW18c3RydWN0KVxccysoPzpfX2F0dHJpYnV0ZV9fXFxzKlxcKFxcKFtcXHNcXFNdKj9cXClcXClcXHMqKT8pXFx3K3xcXGJbYS16XVxcdypfdFxcYi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpfQWxpZ25hc3xfQWxpZ25vZnxfQXRvbWljfF9Cb29sfF9Db21wbGV4fF9HZW5lcmljfF9JbWFnaW5hcnl8X05vcmV0dXJufF9TdGF0aWNfYXNzZXJ0fF9UaHJlYWRfbG9jYWx8X19hdHRyaWJ1dGVfX3xhc218YXV0b3xicmVha3xjYXNlfGNoYXJ8Y29uc3R8Y29udGludWV8ZGVmYXVsdHxkb3xkb3VibGV8ZWxzZXxlbnVtfGV4dGVybnxmbG9hdHxmb3J8Z290b3xpZnxpbmxpbmV8aW50fGxvbmd8cmVnaXN0ZXJ8cmV0dXJufHNob3J0fHNpZ25lZHxzaXplb2Z8c3RhdGljfHN0cnVjdHxzd2l0Y2h8dHlwZWRlZnx0eXBlb2Z8dW5pb258dW5zaWduZWR8dm9pZHx2b2xhdGlsZXx3aGlsZSlcXGIvLFxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpL2ksXG5cdCdudW1iZXInOiAvKD86XFxiMHgoPzpbXFxkYS1mXSsoPzpcXC5bXFxkYS1mXSopP3xcXC5bXFxkYS1mXSspKD86cFsrLV0/XFxkKyk/fCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzplWystXT9cXGQrKT8pW2Z1bF17MCw0fS9pLFxuXHQnb3BlcmF0b3InOiAvPj49P3w8PD0/fC0+fChbLSsmfDpdKVxcMXxbPzp+XXxbLSsqLyUmfF4hPTw+XT0/L1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2MnLCAnc3RyaW5nJywge1xuXHQnY2hhcic6IHtcblx0XHQvLyBodHRwczovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jL2xhbmd1YWdlL2NoYXJhY3Rlcl9jb25zdGFudFxuXHRcdHBhdHRlcm46IC8nKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W14nXFxcXFxcclxcbl0pezAsMzJ9Jy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjJywgJ3N0cmluZycsIHtcblx0J21hY3JvJzoge1xuXHRcdC8vIGFsbG93IGZvciBtdWx0aWxpbmUgbWFjcm8gZGVmaW5pdGlvbnNcblx0XHQvLyBzcGFjZXMgYWZ0ZXIgdGhlICMgY2hhcmFjdGVyIGNvbXBpbGUgZmluZSB3aXRoIGdjY1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopI1xccypbYS16XSg/OlteXFxyXFxuXFxcXC9dfFxcLyg/IVxcKil8XFwvXFwqKD86W14qXXxcXCooPyFcXC8pKSpcXCpcXC98XFxcXCg/OlxcclxcbnxbXFxzXFxTXSkpKi9pbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3Byb3BlcnR5Jyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdzdHJpbmcnOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvLyBoaWdobGlnaHQgdGhlIHBhdGggb2YgdGhlIGluY2x1ZGUgc3RhdGVtZW50IGFzIGEgc3RyaW5nXG5cdFx0XHRcdFx0cGF0dGVybjogL14oI1xccyppbmNsdWRlXFxzKik8W14+XSs+Lyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdFByaXNtLmxhbmd1YWdlcy5jWydzdHJpbmcnXVxuXHRcdFx0XSxcblx0XHRcdCdjaGFyJzogUHJpc20ubGFuZ3VhZ2VzLmNbJ2NoYXInXSxcblx0XHRcdCdjb21tZW50JzogUHJpc20ubGFuZ3VhZ2VzLmNbJ2NvbW1lbnQnXSxcblx0XHRcdCdtYWNyby1uYW1lJzogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheI1xccypkZWZpbmVcXHMrKVxcdytcXGIoPyFcXCgpL2ksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheI1xccypkZWZpbmVcXHMrKVxcdytcXGIoPz1cXCgpL2ksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdFx0XHR9XG5cdFx0XHRdLFxuXHRcdFx0Ly8gaGlnaGxpZ2h0IG1hY3JvIGRpcmVjdGl2ZXMgYXMga2V5d29yZHNcblx0XHRcdCdkaXJlY3RpdmUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKCNcXHMqKVthLXpdKy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdH0sXG5cdFx0XHQnZGlyZWN0aXZlLWhhc2gnOiAvXiMvLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogLyMjfFxcXFwoPz1bXFxyXFxuXSkvLFxuXHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXFNbXFxzXFxTXSovLFxuXHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5jXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnYycsICdmdW5jdGlvbicsIHtcblx0Ly8gaGlnaGxpZ2h0IHByZWRlZmluZWQgbWFjcm9zIGFzIGNvbnN0YW50c1xuXHQnY29uc3RhbnQnOiAvXFxiKD86RU9GfE5VTEx8U0VFS19DVVJ8U0VFS19FTkR8U0VFS19TRVR8X19EQVRFX198X19GSUxFX198X19MSU5FX198X19USU1FU1RBTVBfX3xfX1RJTUVfX3xfX2Z1bmNfX3xzdGRlcnJ8c3RkaW58c3Rkb3V0KVxcYi9cbn0pO1xuXG5kZWxldGUgUHJpc20ubGFuZ3VhZ2VzLmNbJ2Jvb2xlYW4nXTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBrZXl3b3JkID0gL1xcYig/OmFsaWduYXN8YWxpZ25vZnxhc218YXV0b3xib29sfGJyZWFrfGNhc2V8Y2F0Y2h8Y2hhcnxjaGFyMTZfdHxjaGFyMzJfdHxjaGFyOF90fGNsYXNzfGNvX2F3YWl0fGNvX3JldHVybnxjb195aWVsZHxjb21wbHxjb25jZXB0fGNvbnN0fGNvbnN0X2Nhc3R8Y29uc3RldmFsfGNvbnN0ZXhwcnxjb25zdGluaXR8Y29udGludWV8ZGVjbHR5cGV8ZGVmYXVsdHxkZWxldGV8ZG98ZG91YmxlfGR5bmFtaWNfY2FzdHxlbHNlfGVudW18ZXhwbGljaXR8ZXhwb3J0fGV4dGVybnxmaW5hbHxmbG9hdHxmb3J8ZnJpZW5kfGdvdG98aWZ8aW1wb3J0fGlubGluZXxpbnR8aW50MTZfdHxpbnQzMl90fGludDY0X3R8aW50OF90fGxvbmd8bW9kdWxlfG11dGFibGV8bmFtZXNwYWNlfG5ld3xub2V4Y2VwdHxudWxscHRyfG9wZXJhdG9yfG92ZXJyaWRlfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xyZWdpc3RlcnxyZWludGVycHJldF9jYXN0fHJlcXVpcmVzfHJldHVybnxzaG9ydHxzaWduZWR8c2l6ZW9mfHN0YXRpY3xzdGF0aWNfYXNzZXJ0fHN0YXRpY19jYXN0fHN0cnVjdHxzd2l0Y2h8dGVtcGxhdGV8dGhpc3x0aHJlYWRfbG9jYWx8dGhyb3d8dHJ5fHR5cGVkZWZ8dHlwZWlkfHR5cGVuYW1lfHVpbnQxNl90fHVpbnQzMl90fHVpbnQ2NF90fHVpbnQ4X3R8dW5pb258dW5zaWduZWR8dXNpbmd8dmlydHVhbHx2b2lkfHZvbGF0aWxlfHdjaGFyX3R8d2hpbGUpXFxiLztcblx0dmFyIG1vZE5hbWUgPSAvXFxiKD8hPGtleXdvcmQ+KVxcdysoPzpcXHMqXFwuXFxzKlxcdyspKlxcYi8uc291cmNlLnJlcGxhY2UoLzxrZXl3b3JkPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBrZXl3b3JkLnNvdXJjZTsgfSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmNwcCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2MnLCB7XG5cdFx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKFxcYig/OmNsYXNzfGNvbmNlcHR8ZW51bXxzdHJ1Y3R8dHlwZW5hbWUpXFxzKykoPyE8a2V5d29yZD4pXFx3Ky8uc291cmNlXG5cdFx0XHRcdFx0LnJlcGxhY2UoLzxrZXl3b3JkPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBrZXl3b3JkLnNvdXJjZTsgfSkpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0Ly8gVGhpcyBpcyBpbnRlbmRlZCB0byBjYXB0dXJlIHRoZSBjbGFzcyBuYW1lIG9mIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgbGlrZTpcblx0XHRcdC8vICAgdm9pZCBmb286OmJhcigpIGNvbnN0IHt9XG5cdFx0XHQvLyBIb3dldmVyISBUaGUgYGZvb2AgaW4gdGhlIGFib3ZlIGV4YW1wbGUgY291bGQgYWxzbyBiZSBhIG5hbWVzcGFjZSwgc28gd2Ugb25seSBjYXB0dXJlIHRoZSBjbGFzcyBuYW1lIGlmXG5cdFx0XHQvLyBpdCBzdGFydHMgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyLiBUaGlzIGFwcHJveGltYXRpb24gc2hvdWxkIGdpdmUgZGVjZW50IHJlc3VsdHMuXG5cdFx0XHQvXFxiW0EtWl1cXHcqKD89XFxzKjo6XFxzKlxcdytcXHMqXFwoKS8sXG5cdFx0XHQvLyBUaGlzIHdpbGwgY2FwdHVyZSB0aGUgY2xhc3MgbmFtZSBiZWZvcmUgZGVzdHJ1Y3RvcnMgbGlrZTpcblx0XHRcdC8vICAgRm9vOjp+Rm9vKCkge31cblx0XHRcdC9cXGJbQS1aX11cXHcqKD89XFxzKjo6XFxzKn5cXHcrXFxzKlxcKCkvaSxcblx0XHRcdC8vIFRoaXMgYWxzbyBpbnRlbmRzIHRvIGNhcHR1cmUgdGhlIGNsYXNzIG5hbWUgb2YgbWV0aG9kIGltcGxlbWVudGF0aW9ucyBidXQgaGVyZSB0aGUgY2xhc3MgaGFzIHRlbXBsYXRlXG5cdFx0XHQvLyBwYXJhbWV0ZXJzLCBzbyBpdCBjYW4ndCBiZSBhIG5hbWVzcGFjZSAodW50aWwgQysrIGFkZHMgZ2VuZXJpYyBuYW1lc3BhY2VzKS5cblx0XHRcdC9cXGJcXHcrKD89XFxzKjwoPzpbXjw+XXw8KD86W148Pl18PFtePD5dKj4pKj4pKj5cXHMqOjpcXHMqXFx3K1xccypcXCgpL1xuXHRcdF0sXG5cdFx0J2tleXdvcmQnOiBrZXl3b3JkLFxuXHRcdCdudW1iZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKD86XFxiMGJbMDEnXSt8XFxiMHgoPzpbXFxkYS1mJ10rKD86XFwuW1xcZGEtZiddKik/fFxcLltcXGRhLWYnXSspKD86cFsrLV0/W1xcZCddKyk/fCg/OlxcYltcXGQnXSsoPzpcXC5bXFxkJ10qKT98XFxCXFwuW1xcZCddKykoPzplWystXT9bXFxkJ10rKT8pW2Z1bF17MCw0fS9pLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnb3BlcmF0b3InOiAvPj49P3w8PD0/fC0+fC0tfFxcK1xcK3wmJnxcXHxcXHx8Wz86fl18PD0+fFstKyovJSZ8XiE9PD5dPT98XFxiKD86YW5kfGFuZF9lcXxiaXRhbmR8Yml0b3J8bm90fG5vdF9lcXxvcnxvcl9lcXx4b3J8eG9yX2VxKVxcYi8sXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NwcCcsICdzdHJpbmcnLCB7XG5cdFx0J21vZHVsZSc6IHtcblx0XHRcdC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9sYW5ndWFnZS9tb2R1bGVzXG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdC8oXFxiKD86aW1wb3J0fG1vZHVsZSlcXHMrKS8uc291cmNlICtcblx0XHRcdFx0Jyg/OicgK1xuXHRcdFx0XHQvLyBoZWFkZXItbmFtZVxuXHRcdFx0XHQvXCIoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXlwiXFxcXFxcclxcbl0pKlwifDxbXjw+XFxyXFxuXSo+Ly5zb3VyY2UgK1xuXHRcdFx0XHQnfCcgK1xuXHRcdFx0XHQvLyBtb2R1bGUgbmFtZSBvciBwYXJ0aXRpb24gb3IgYm90aFxuXHRcdFx0XHQvPG1vZC1uYW1lPig/Olxccyo6XFxzKjxtb2QtbmFtZT4pP3w6XFxzKjxtb2QtbmFtZT4vLnNvdXJjZS5yZXBsYWNlKC88bW9kLW5hbWU+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1vZE5hbWU7IH0pICtcblx0XHRcdFx0JyknXG5cdFx0XHQpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnc3RyaW5nJzogL15bPFwiXVtcXHNcXFNdKy8sXG5cdFx0XHRcdCdvcGVyYXRvcic6IC86Lyxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdyYXctc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1JcIihbXigpXFxcXCBdezAsMTZ9KVxcKFtcXHNcXFNdKj9cXClcXDFcIi8sXG5cdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NwcCcsICdrZXl3b3JkJywge1xuXHRcdCdnZW5lcmljLWZ1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYig/IW9wZXJhdG9yXFxiKVthLXpfXVxcdypcXHMqPCg/OltePD5dfDxbXjw+XSo+KSo+KD89XFxzKlxcKCkvaSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZnVuY3Rpb24nOiAvXlxcdysvLFxuXHRcdFx0XHQnZ2VuZXJpYyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvPFtcXHNcXFNdKy8sXG5cdFx0XHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJyxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5jcHBcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY3BwJywgJ29wZXJhdG9yJywge1xuXHRcdCdkb3VibGUtY29sb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvOjovLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NwcCcsICdjbGFzcy1uYW1lJywge1xuXHRcdC8vIHRoZSBiYXNlIGNsYXVzZSBpcyBhbiBvcHRpb25hbCBsaXN0IG9mIHBhcmVudCBjbGFzc2VzXG5cdFx0Ly8gaHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbmd1YWdlL2NsYXNzXG5cdFx0J2Jhc2UtY2xhdXNlJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGIoPzpjbGFzc3xzdHJ1Y3QpXFxzK1xcdytcXHMqOlxccyopW147e31cIidcXHNdKyg/OlxccytbXjt7fVwiJ1xcc10rKSooPz1cXHMqWzt7XSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY3BwJywge30pXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdpbnNpZGUnLCAnZG91YmxlLWNvbG9uJywge1xuXHRcdC8vIEFsbCB1bnRva2VuaXplZCB3b3JkcyB0aGF0IGFyZSBub3QgbmFtZXNwYWNlcyBzaG91bGQgYmUgY2xhc3MgbmFtZXNcblx0XHQnY2xhc3MtbmFtZSc6IC9cXGJbYS16X11cXHcqXFxiKD8hXFxzKjo6KS9pXG5cdH0sIFByaXNtLmxhbmd1YWdlcy5jcHBbJ2Jhc2UtY2xhdXNlJ10pO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5hcmR1aW5vID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY3BwJywge1xuXHQna2V5d29yZCc6IC9cXGIoPzpTdHJpbmd8YXJyYXl8Ym9vbHxib29sZWFufGJyZWFrfGJ5dGV8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRvfGRvdWJsZXxlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufGdvdG98aWZ8aW58aW5zdGFuY2VvZnxpbnR8aW50ZWdlcnxsb25nfGxvb3B8bmV3fG51bGx8cmV0dXJufHNldHVwfHN0cmluZ3xzd2l0Y2h8dGhyb3d8dHJ5fHZvaWR8d2hpbGV8d29yZClcXGIvLFxuXHQnY29uc3RhbnQnOiAvXFxiKD86QU5BTE9HX01FU1NBR0V8REVGQVVMVHxESUdJVEFMX01FU1NBR0V8RVhURVJOQUx8RklSTUFUQV9TVFJJTkd8SElHSHxJTlBVVHxJTlBVVF9QVUxMVVB8SU5URVJOQUx8SU5URVJOQUwxVjF8SU5URVJOQUwyVjU2fExFRF9CVUlMVElOfExPV3xPVVRQVVR8UkVQT1JUX0FOQUxPR3xSRVBPUlRfRElHSVRBTHxTRVRfUElOX01PREV8U1lTRVhfU1RBUlR8U1lTVEVNX1JFU0VUKVxcYi8sXG5cdCdidWlsdGluJzogL1xcYig/OkF1ZGlvfEJTU0lEfEJyaWRnZXxDbGllbnR8Q29uc29sZXxFRVBST018RXNwbG9yYXxFc3Bsb3JhVEZUfEV0aGVybmV0fEV0aGVybmV0Q2xpZW50fEV0aGVybmV0U2VydmVyfEV0aGVybmV0VURQfEZpbGV8RmlsZUlPfEZpbGVTeXN0ZW18RmlybWF0YXxHUFJTfEdTTXxHU01CYW5kfEdTTUNsaWVudHxHU01Nb2RlbXxHU01QSU58R1NNU2Nhbm5lcnxHU01TZXJ2ZXJ8R1NNVm9pY2VDYWxsfEdTTV9TTVN8SHR0cENsaWVudHxJUEFkZHJlc3N8SVJyZWFkfEtleWJvYXJkfEtleWJvYXJkQ29udHJvbGxlcnxMaXF1aWRDcnlzdGFsfExpcXVpZENyeXN0YWxfSTJDfE1haWxib3h8TW91c2V8TW91c2VDb250cm9sbGVyfFBJbWFnZXxQcm9jZXNzfFJTU0l8Um9ib3RDb250cm9sfFJvYm90TW90b3J8U0R8U1BJfFNTSUR8U2NoZWR1bGVyfFNlcmlhbHxTZXJ2ZXJ8U2Vydm98U29mdHdhcmVTZXJpYWx8U3RlcHBlcnxTdHJlYW18VEZUfFRhc2t8VVNCSG9zdHxXaUZpfFdpRmlDbGllbnR8V2lGaVNlcnZlcnxXaUZpVURQfFdpcmV8WXVuQ2xpZW50fFl1blNlcnZlcnxhYnN8YWRkUGFyYW1ldGVyfGFuYWxvZ1JlYWR8YW5hbG9nUmVhZFJlc29sdXRpb258YW5hbG9nUmVmZXJlbmNlfGFuYWxvZ1dyaXRlfGFuYWxvZ1dyaXRlUmVzb2x1dGlvbnxhbnN3ZXJDYWxsfGF0dGFjaHxhdHRhY2hHUFJTfGF0dGFjaEludGVycnVwdHxhdHRhY2hlZHxhdXRvc2Nyb2xsfGF2YWlsYWJsZXxiYWNrZ3JvdW5kfGJlZXB8YmVnaW58YmVnaW5QYWNrZXR8YmVnaW5TRHxiZWdpblNNU3xiZWdpblNwZWFrZXJ8YmVnaW5URlR8YmVnaW5UcmFuc21pc3Npb258YmVnaW5Xcml0ZXxiaXR8Yml0Q2xlYXJ8Yml0UmVhZHxiaXRTZXR8Yml0V3JpdGV8Ymxpbmt8YmxpbmtWZXJzaW9ufGJ1ZmZlcnxjaGFuZ2VQSU58Y2hlY2tQSU58Y2hlY2tQVUt8Y2hlY2tSZWd8Y2lyY2xlfGNpdHlOYW1lUmVhZHxjaXR5TmFtZVdyaXRlfGNsZWFyfGNsZWFyU2NyZWVufGNsaWNrfGNsb3NlfGNvbXBhc3NSZWFkfGNvbmZpZ3xjb25uZWN0fGNvbm5lY3RlZHxjb25zdHJhaW58Y29zfGNvdW50cnlOYW1lUmVhZHxjb3VudHJ5TmFtZVdyaXRlfGNyZWF0ZUNoYXJ8Y3Vyc29yfGRlYnVnUHJpbnR8ZGVsYXl8ZGVsYXlNaWNyb3NlY29uZHN8ZGV0YWNofGRldGFjaEludGVycnVwdHxkaWdpdGFsUmVhZHxkaWdpdGFsV3JpdGV8ZGlzY29ubmVjdHxkaXNwbGF5fGRpc3BsYXlMb2dvc3xkcmF3Qk1QfGRyYXdDb21wYXNzfGVuY3J5cHRpb25UeXBlfGVuZHxlbmRQYWNrZXR8ZW5kU01TfGVuZFRyYW5zbWlzc2lvbnxlbmRXcml0ZXxleGlzdHN8ZXhpdFZhbHVlfGZpbGx8ZmluZHxmaW5kVW50aWx8Zmx1c2h8Z2F0ZXdheUlQfGdldHxnZXRBc3luY2hyb25vdXNseXxnZXRCYW5kfGdldEJ1dHRvbnxnZXRDdXJyZW50Q2FycmllcnxnZXRJTUVJfGdldEtleXxnZXRNb2RpZmllcnN8Z2V0T2VtS2V5fGdldFBJTlVzZWR8Z2V0UmVzdWx0fGdldFNpZ25hbFN0cmVuZ3RofGdldFNvY2tldHxnZXRWb2ljZUNhbGxTdGF0dXN8Z2V0WENoYW5nZXxnZXRZQ2hhbmdlfGhhbmdDYWxsfGhlaWdodHxoaWdoQnl0ZXxob21lfGltYWdlfGludGVycnVwdHN8aXNBY3Rpb25Eb25lfGlzRGlyZWN0b3J5fGlzTGlzdGVuaW5nfGlzUElOfGlzUHJlc3NlZHxpc1ZhbGlkfGtleVByZXNzZWR8a2V5UmVsZWFzZWR8a2V5Ym9hcmRSZWFkfGtub2JSZWFkfGxlZnRUb1JpZ2h0fGxpbmV8bGluZUZvbGxvd0NvbmZpZ3xsaXN0ZW58bGlzdGVuT25Mb2NhbGhvc3R8bG9hZEltYWdlfGxvY2FsSVB8bG93Qnl0ZXxtYWNBZGRyZXNzfG1haW50YWlufG1hcHxtYXh8bWVzc2FnZUF2YWlsYWJsZXxtaWNyb3N8bWlsbGlzfG1pbnxta2Rpcnxtb3RvcnNTdG9wfG1vdG9yc1dyaXRlfG1vdXNlRHJhZ2dlZHxtb3VzZU1vdmVkfG1vdXNlUHJlc3NlZHxtb3VzZVJlbGVhc2VkfG1vdmV8bm9BdXRvc2Nyb2xsfG5vQmxpbmt8bm9CdWZmZXJ8bm9DdXJzb3J8bm9EaXNwbGF5fG5vRmlsbHxub0ludGVycnVwdHN8bm9MaXN0ZW5PbkxvY2FsaG9zdHxub1N0cm9rZXxub1RvbmV8b25SZWNlaXZlfG9uUmVxdWVzdHxvcGVufG9wZW5OZXh0RmlsZXxvdmVyZmxvd3xwYXJzZUNvbW1hbmR8cGFyc2VGbG9hdHxwYXJzZUludHxwYXJzZVBhY2tldHxwYXVzZU1vZGV8cGVla3xwaW5Nb2RlfHBsYXlGaWxlfHBsYXlNZWxvZHl8cG9pbnR8cG9pbnRUb3xwb3NpdGlvbnxwb3d8cHJlcGFyZXxwcmVzc3xwcmludHxwcmludEZpcm13YXJlVmVyc2lvbnxwcmludFZlcnNpb258cHJpbnRsbnxwcm9jZXNzfHByb2Nlc3NJbnB1dHxwdWxzZUlufHB1dHxyYW5kb218cmFuZG9tU2VlZHxyZWFkfHJlYWRBY2NlbGVyb21ldGVyfHJlYWRCbHVlfHJlYWRCdXR0b258cmVhZEJ5dGVzfHJlYWRCeXRlc1VudGlsfHJlYWRHcmVlbnxyZWFkSm95c3RpY2tCdXR0b258cmVhZEpveXN0aWNrU3dpdGNofHJlYWRKb3lzdGlja1h8cmVhZEpveXN0aWNrWXxyZWFkTGlnaHRTZW5zb3J8cmVhZE1lc3NhZ2V8cmVhZE1pY3JvcGhvbmV8cmVhZE5ldHdvcmtzfHJlYWRSZWR8cmVhZFNsaWRlcnxyZWFkU3RyaW5nfHJlYWRTdHJpbmdVbnRpbHxyZWFkVGVtcGVyYXR1cmV8cmVhZHl8cmVjdHxyZWxlYXNlfHJlbGVhc2VBbGx8cmVtb3RlSVB8cmVtb3RlTnVtYmVyfHJlbW90ZVBvcnR8cmVtb3ZlfHJlcXVlc3RGcm9tfHJldHJpZXZlQ2FsbGluZ051bWJlcnxyZXdpbmREaXJlY3Rvcnl8cmlnaHRUb0xlZnR8cm1kaXJ8cm9ib3ROYW1lUmVhZHxyb2JvdE5hbWVXcml0ZXxydW58cnVuQXN5bmNocm9ub3VzbHl8cnVuU2hlbGxDb21tYW5kfHJ1blNoZWxsQ29tbWFuZEFzeW5jaHJvbm91c2x5fHJ1bm5pbmd8c2Nhbk5ldHdvcmtzfHNjcm9sbERpc3BsYXlMZWZ0fHNjcm9sbERpc3BsYXlSaWdodHxzZWVrfHNlbmRBbmFsb2d8c2VuZERpZ2l0YWxQb3J0UGFpcnxzZW5kRGlnaXRhbFBvcnRzfHNlbmRTdHJpbmd8c2VuZFN5c2V4fHNlcmlhbEV2ZW50fHNldEJhbmR8c2V0Qml0T3JkZXJ8c2V0Q2xvY2tEaXZpZGVyfHNldEN1cnNvcnxzZXRETlN8c2V0RGF0YU1vZGV8c2V0RmlybXdhcmVWZXJzaW9ufHNldE1vZGV8c2V0UElOVXNlZHxzZXRTcGVlZHxzZXRUZXh0U2l6ZXxzZXRUaW1lb3V0fHNoaWZ0SW58c2hpZnRPdXR8c2h1dGRvd258c2lufHNpemV8c3FydHxzdGFydExvb3B8c3RlcHxzdG9wfHN0cm9rZXxzdWJuZXRNYXNrfHN3aXRjaFBJTnx0YW58dGVtcG9Xcml0ZXx0ZXh0fHRvbmV8dHJhbnNmZXJ8dHVuZVdyaXRlfHR1cm58dXBkYXRlSVJ8dXNlck5hbWVSZWFkfHVzZXJOYW1lV3JpdGV8dm9pY2VDYWxsfHdhaXRDb250aW51ZXx3aWR0aHx3cml0ZXx3cml0ZUJsdWV8d3JpdGVHcmVlbnx3cml0ZUpTT058d3JpdGVNZXNzYWdlfHdyaXRlTWljcm9zZWNvbmRzfHdyaXRlUkdCfHdyaXRlUmVkfHlpZWxkKVxcYi9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5vID0gUHJpc20ubGFuZ3VhZ2VzLmFyZHVpbm87XG5cblByaXNtLmxhbmd1YWdlcy5hcmZmID0ge1xuXHQnY29tbWVudCc6IC8lLiovLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oW1wiJ10pKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL0AoPzphdHRyaWJ1dGV8ZGF0YXxlbmR8cmVsYXRpb24pXFxiL2ksXG5cdCdudW1iZXInOiAvXFxiXFxkKyg/OlxcLlxcZCspP1xcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC9be30sXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5hcm1hc20gPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC87LiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXCJcXHJcXG5dfFwiXCIpKlwiLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndmFyaWFibGUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXiRdKSg/OlxcJHsyfSkqKVxcJFxcdysvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQnY2hhcic6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OlteJ1xcclxcbl17MCw0fXwnJyknLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3ZlcnNpb24tc3ltYm9sJzoge1xuXHRcdHBhdHRlcm46IC9cXHxbXFx3QF0rXFx8Lyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblxuXHQnYm9vbGVhbic6IC9cXGIoPzpGQUxTRXxUUlVFKVxcYi8sXG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OkFMSUFTfEFMSUdOfEFSRUF8QVJNfEFTU0VSVHxBVFRSfENOfENPREV8Q09ERTE2fENPREUzMnxDT01NT058Q1B8REFUQXxEQ0J8RENEfERDRE98RENEVXxEQ0ZEfERDRkRVfERDSXxEQ1F8RENRVXxEQ1d8RENXVXxETnxFTElGfEVMU0V8RU5EfEVOREZVTkN8RU5ESUZ8RU5EUHxFTlRSWXxFUVV8RVhQT1JUfEVYUE9SVEFTfEVYVEVSTnxGSUVMRHxGSUxMfEZOfEZVTkNUSU9OfEdCTEF8R0JMTHxHQkxTfEdFVHxHTE9CQUx8SUZ8SU1QT1JUfElOQ0JJTnxJTkNMVURFfElORk98S0VFUHxMQ0xBfExDTEx8TENMU3xMVE9SR3xNQUNST3xNQVB8TUVORHxNRVhJVHxOT0ZQfE9QVHxQUkVTRVJWRTh8UFJPQ3xRTnxSRUFET05MWXxSRUxPQ3xSRVFVSVJFfFJFUVVJUkU4fFJMSVNUfFJPVVR8U0VUQXxTRVRMfFNFVFN8U058U1BBQ0V8U1VCVHxUSFVNQnxUSFVNQlh8VFRMfFdFTkR8V0hJTEUpXFxiLyxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXHQnaW5zdHJ1Y3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLygoPzpefCg/Ol58W15cXFxcXSkoPzpcXHJcXG4/fFxcbikpWyBcXHRdKig/Oig/OltBLVpdW0EtWjAtOV9dKlthLXpdXFx3KnxbYS16XVxcdyp8XFxkKylbIFxcdF0rKT8pXFxiW0EtWi5dK1xcYi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCd2YXJpYWJsZSc6IC9cXCRcXHcrLyxcblxuXHQnbnVtYmVyJzogLyg/OlxcYlsyLTldX1xcZCt8KD86XFxiXFxkKyg/OlxcLlxcZCspP3xcXEJcXC5cXGQrKSg/OmUtP1xcZCspP3xcXGIwKD86W2ZkXV98eClbMC05YS1mXSt8JlswLTlhLWZdKylcXGIvaSxcblxuXHQncmVnaXN0ZXInOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OnJcXGR8bHIpXFxiLyxcblx0XHRhbGlhczogJ3N5bWJvbCdcblx0fSxcblxuXHQnb3BlcmF0b3InOiAvPD58PDx8Pj58JiZ8XFx8XFx8fFs9ITw+L109P3xbK1xcLSolIz8mfF5dfDpbQS1aXSs6Lyxcblx0J3B1bmN0dWF0aW9uJzogL1soKVtcXF0sXS9cbn07XG5cblByaXNtLmxhbmd1YWdlc1snYXJtLWFzbSddID0gUHJpc20ubGFuZ3VhZ2VzLmFybWFzbTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IGxhbmdcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cblx0ICovXG5cdHZhciBjcmVhdGVMYW5ndWFnZVN0cmluZyA9IGZ1bmN0aW9uIChsYW5nLCBwYXR0ZXJuKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvXFx7IS8uc291cmNlICsgJyg/OicgKyAocGF0dGVybiB8fCBsYW5nKSArICcpJyArIC8kW1xcc1xcU10qXFx9Ly5zb3VyY2UsICdtJyksXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2VtYmVkZGVkJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXlxceyFcXHcrXFxiKVtcXHNcXFNdKyg/PVxcfSQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtJyArIGxhbmcsXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXNbbGFuZ11cblx0XHRcdFx0fSxcblx0XHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0XHR9XG5cdFx0fTtcblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuYXJ0dXJvID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLzsuKi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXG5cdFx0J2NoYXJhY3Rlcic6IHtcblx0XHRcdHBhdHRlcm46IC9gLmAvLFxuXHRcdFx0YWxpYXM6ICdjaGFyJyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cblx0XHQnbnVtYmVyJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYlxcZCsoPzpcXC5cXGQrKD86XFwuXFxkKyg/Oi1bXFx3Ky1dKyk/KT8pP1xcYi8sXG5cdFx0fSxcblxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxcXFxcclxcbl18XFxcXC4pKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cblx0XHQncmVnZXgnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFx7XFwvLio/XFwvXFx9Lyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cblx0XHQnaHRtbC1zdHJpbmcnOiBjcmVhdGVMYW5ndWFnZVN0cmluZygnaHRtbCcpLFxuXHRcdCdjc3Mtc3RyaW5nJzogY3JlYXRlTGFuZ3VhZ2VTdHJpbmcoJ2NzcycpLFxuXHRcdCdqcy1zdHJpbmcnOiBjcmVhdGVMYW5ndWFnZVN0cmluZygnanMnKSxcblx0XHQnbWQtc3RyaW5nJzogY3JlYXRlTGFuZ3VhZ2VTdHJpbmcoJ21kJyksXG5cdFx0J3NxbC1zdHJpbmcnOiBjcmVhdGVMYW5ndWFnZVN0cmluZygnc3FsJyksXG5cdFx0J3NoLXN0cmluZyc6IGNyZWF0ZUxhbmd1YWdlU3RyaW5nKCdzaGVsbCcsICdzaCcpLFxuXG5cdFx0J211bHRpc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1x1MDBCQi4qfFxcezpbXFxzXFxTXSo/OlxcfXxcXHtbXFxzXFxTXSo/XFx9fF4tezZ9JFtcXHNcXFNdKi9tLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblxuXHRcdCdsYWJlbCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXHcrXFxiXFw/PzovLFxuXHRcdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0XHR9LFxuXG5cdFx0J2xpdGVyYWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvJyg/OlxcdytcXGJcXD8/Oj8pLyxcblx0XHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdFx0fSxcblxuXHRcdCd0eXBlJzoge1xuXHRcdFx0cGF0dGVybjogLzooPzpcXHcrXFxiXFw/Pzo/KS8sXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdFx0fSxcblxuXHRcdCdjb2xvcic6IC8jXFx3Ky8sXG5cblx0XHQncHJlZGljYXRlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYig/OmFsbHxhbmR8YW55fGFzY2lpfGF0dHJ8YXR0cmlidXRlfGF0dHJpYnV0ZUxhYmVsfGJpbmFyeXxibG9ja3xjaGFyfGNvbnRhaW5zfGRhdGFiYXNlfGRhdGV8ZGljdGlvbmFyeXxlbXB0eXxlcXVhbHxldmVufGV2ZXJ5fGV4aXN0c3xmYWxzZXxmbG9hdGluZ3xmdW5jdGlvbnxncmVhdGVyfGdyZWF0ZXJPckVxdWFsfGlmfGlufGlubGluZXxpbnRlZ2VyfGlzfGtleXxsYWJlbHxsZWFwfGxlc3N8bGVzc09yRXF1YWx8bGl0ZXJhbHxsb2dpY2FsfGxvd2VyfG5hbmR8bmVnYXRpdmV8bm9yfG5vdHxub3RFcXVhbHxudWxsfG51bWVyaWN8b2RkfG9yfHBhdGh8cGF0aExhYmVsfHBvc2l0aXZlfHByZWZpeHxwcmltZXxyZWdleHxzYW1lfHNldHxzb21lfHNvcnRlZHxzdGFuZGFsb25lfHN0cmluZ3xzdWJzZXR8c3VmZml4fHN1cGVyc2V0fHN5bWJvbHxzeW1ib2xMaXRlcmFsfHRydWV8dHJ5fHR5cGV8dW5sZXNzfHVwcGVyfHdoZW58d2hpdGVzcGFjZXx3b3JkfHhub3J8eG9yfHplcm8pXFw/Lyxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXG5cdFx0J2J1aWx0aW4tZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86YWJzfGFjb3N8YWNvc2h8YWNzZWN8YWNzZWNofGFjdGFufGFjdGFuaHxhZGR8YWZ0ZXJ8YWxlcnR8YWxpYXN8YW5kfGFuZ2xlfGFwcGVuZHxhcmd8YXJnc3xhcml0eXxhcnJheXxhc3xhc2VjfGFzZWNofGFzaW58YXNpbmh8YXRhbnxhdGFuMnxhdGFuaHxhdHRyfGF0dHJzfGF2ZXJhZ2V8YmVmb3JlfGJlbmNobWFya3xibGVuZHxicmVha3xjYWxsfGNhcGl0YWxpemV8Y2FzZXxjZWlsfGNob3B8Y2xlYXJ8Y2xpcHxjbG9zZXxjb2xvcnxjb21iaW5lfGNvbmp8Y29udGludWV8Y29weXxjb3N8Y29zaHxjcmN8Y3NlY3xjc2VjaHxjdGFufGN0YW5ofGN1cnNvcnxkYXJrZW58ZGVjfGRlY29kZXxkZWZpbmV8ZGVsZXRlfGRlc2F0dXJhdGV8ZGV2aWF0aW9ufGRpYWxvZ3xkaWN0aW9uYXJ5fGRpZmZlcmVuY2V8ZGlnZXN0fGRpZ2l0c3xkaXZ8ZG98ZG93bmxvYWR8ZHJvcHxkdXB8ZXxlbHNlfGVtcHR5fGVuY29kZXxlbnN1cmV8ZW52fGVzY2FwZXxleGVjdXRlfGV4aXR8ZXhwfGV4dGVuZHxleHRyYWN0fGZhY3RvcnN8ZmRpdnxmaWx0ZXJ8Zmlyc3R8ZmxhdHRlbnxmbG9vcnxmb2xkfGZyb218ZnVuY3Rpb258Z2FtbWF8Z2NkfGdldHxnb3RvfGhhc2h8aHlwb3R8aWZ8aW5jfGluZGVudHxpbmRleHxpbmZpbml0eXxpbmZvfGlucHV0fGluc2VydHxpbnNwZWN0fGludGVyc2VjdGlvbnxpbnZlcnR8amFyb3xqb2lufGtleXN8a3VydG9zaXN8bGFzdHxsZXR8bGV2ZW5zaHRlaW58bGlnaHRlbnxsaXN0fGxufGxvZ3xsb29wfGxvd2VyfG1haWx8bWFwfG1hdGNofG1heHxtZWRpYW58bWlufG1vZHxtb2R1bGV8bXVsfG5hbmR8bmVnfG5ld3xub3J8bm9ybWFsaXplfG5vdHxub3d8bnVsbHxvcGVufG9yfG91dGRlbnR8cGFkfHBhbGV0dGV8cGFuaWN8cGF0aHxwYXVzZXxwZXJtaXNzaW9uc3xwZXJtdXRhdGV8cGl8cG9wfHBvcHVwfHBvd3xwb3dlcnNldHxwb3dtb2R8cHJlZml4fHByaW50fHByaW50c3xwcm9jZXNzfHByb2R1Y3R8cXVlcnl8cmFuZG9tfHJhbmdlfHJlYWR8cmVsYXRpdmV8cmVtb3ZlfHJlbmFtZXxyZW5kZXJ8cmVwZWF0fHJlcGxhY2V8cmVxdWVzdHxyZXR1cm58cmV2ZXJzZXxyb3VuZHxzYW1wbGV8c2F0dXJhdGV8c2NyaXB0fHNlY3xzZWNofHNlbGVjdHxzZXJ2ZXxzZXR8c2hsfHNocnxzaHVmZmxlfHNpbnxzaW5ofHNpemV8c2tld25lc3N8c2xpY2V8c29ydHxzcGlufHNwbGl0fHNxcnR8c3F1ZWV6ZXxzdGFja3xzdHJpcHxzdWJ8c3VmZml4fHN1bXxzd2l0Y2h8c3ltYm9sc3xzeW1saW5rfHN5c3x0YWtlfHRhbnx0YW5ofHRlcm1pbmFsfHRlcm1pbmF0ZXx0b3x0cnVuY2F0ZXx0cnl8dHlwZXx1bmNsaXB8dW5pb258dW5pcXVlfHVubGVzc3x1bnRpbHx1bnppcHx1cHBlcnx2YWx1ZXN8dmFyfHZhcmlhbmNlfHZvbHVtZXx3ZWJ2aWV3fHdoaWxlfHdpdGh8d29yZHdyYXB8d3JpdGV8eG5vcnx4b3J8emlwKVxcYi8sXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblxuXHRcdCdzdWdhcic6IHtcblx0XHRcdHBhdHRlcm46IC8tPnw9PnxcXHx8OjovLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9LFxuXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKVtcXF0sXS8sXG5cblx0XHQnc3ltYm9sJzoge1xuXHRcdFx0cGF0dGVybjogLzw6fC06fFx1MDBGOHxAfCN8XFwrfFxcfHxcXCp8XFwkfC0tLXwtfCV8XFwvfFxcLlxcLnxcXF58fnw9fDx8PnxcXFxcL1xuXHRcdH0sXG5cblx0XHQnYm9vbGVhbic6IHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzpmYWxzZXxtYXliZXx0cnVlKVxcYi9cblx0XHR9XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmFydCA9IFByaXNtLmxhbmd1YWdlc1snYXJ0dXJvJ107XG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgYXR0cmlidXRlcyA9IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKVxcWyg/IVxcWykoPzooW1wiJyRgXSkoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqXFwyfFxcWyg/OlteXFxbXFxdXFxcXF18XFxcXC4pKlxcXXxbXlxcW1xcXVxcXFxcIickYF18XFxcXC4pKlxcXS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncXVvdGVkJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFskYF0pKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKlxcMS8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eWyRgXXxbJGBdJC9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdpbnRlcnByZXRlZCc6IHtcblx0XHRcdFx0cGF0dGVybjogLycoPzpbXidcXFxcXXxcXFxcLikqJy8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eJ3wnJC9cblx0XHRcdFx0XHQvLyBTZWUgcmVzdCBiZWxvd1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IC9cIig/OlteXCJcXFxcXXxcXFxcLikqXCIvLFxuXHRcdFx0J3ZhcmlhYmxlJzogL1xcdysoPz09KS8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcW3xcXF0kfCwvLFxuXHRcdFx0J29wZXJhdG9yJzogLz0vLFxuXHRcdFx0Ly8gVGhlIG5lZ2F0aXZlIGxvb2stYWhlYWQgcHJldmVudHMgYmxhbmsgbWF0Y2hlc1xuXHRcdFx0J2F0dHItdmFsdWUnOiAvKD8hXlxccyskKS4rL1xuXHRcdH1cblx0fTtcblxuXHR2YXIgYXNjaWlkb2MgPSBQcmlzbS5sYW5ndWFnZXMuYXNjaWlkb2MgPSB7XG5cdFx0J2NvbW1lbnQtYmxvY2snOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXihcXC97NCx9KSg/Olxccj9cXG58XFxyKSg/OltcXHNcXFNdKig/Olxccj9cXG58XFxyKSk/P1xcMS9tLFxuXHRcdFx0YWxpYXM6ICdjb21tZW50J1xuXHRcdH0sXG5cdFx0J3RhYmxlJzoge1xuXHRcdFx0cGF0dGVybjogL15cXHw9ezMsfSg/Oig/Olxccj9cXG58XFxyKD8hXFxuKSkuKikqPyg/Olxccj9cXG58XFxyKVxcfD17Myx9JC9tLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdzcGVjaWZpZXJzJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oPzooPzooPzpcXGQrKD86XFwuXFxkKyk/fFxcLlxcZCspWysqXSg/Ols8Xj5dKD86XFwuWzxePl0pP3xcXC5bPF4+XSk/fFs8Xj5dKD86XFwuWzxePl0pP3xcXC5bPF4+XSlbYS16XSp8W2Etel0rKSg/PVxcfCkvLFxuXHRcdFx0XHRcdGFsaWFzOiAnYXR0ci12YWx1ZSdcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVt8IV09Ki8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFNlZSByZXN0IGJlbG93XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdwYXNzdGhyb3VnaC1ibG9jayc6IHtcblx0XHRcdHBhdHRlcm46IC9eKFxcK3s0LH0pKD86XFxyP1xcbnxcXHIpKD86W1xcc1xcU10qKD86XFxyP1xcbnxcXHIpKT8/XFwxJC9tLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFwrK3xcXCsrJC9cblx0XHRcdFx0Ly8gU2VlIHJlc3QgYmVsb3dcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8vIExpdGVyYWwgYmxvY2tzIGFuZCBsaXN0aW5nIGJsb2Nrc1xuXHRcdCdsaXRlcmFsLWJsb2NrJzoge1xuXHRcdFx0cGF0dGVybjogL14oLXs0LH18XFwuezQsfSkoPzpcXHI/XFxufFxccikoPzpbXFxzXFxTXSooPzpcXHI/XFxufFxccikpPz9cXDEkL20sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL14oPzotK3xcXC4rKXwoPzotK3xcXC4rKSQvXG5cdFx0XHRcdC8vIFNlZSByZXN0IGJlbG93XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvLyBTaWRlYmFyIGJsb2NrcywgcXVvdGUgYmxvY2tzLCBleGFtcGxlIGJsb2NrcyBhbmQgb3BlbiBibG9ja3Ncblx0XHQnb3RoZXItYmxvY2snOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXigtLXxcXCp7NCx9fF97NCx9fD17NCx9KSg/Olxccj9cXG58XFxyKSg/OltcXHNcXFNdKig/Olxccj9cXG58XFxyKSk/P1xcMSQvbSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXig/Oi0rfFxcKit8Xyt8PSspfCg/Oi0rfFxcKit8Xyt8PSspJC9cblx0XHRcdFx0Ly8gU2VlIHJlc3QgYmVsb3dcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gbGlzdC1wdW5jdHVhdGlvbiBhbmQgbGlzdC1sYWJlbCBtdXN0IGFwcGVhciBiZWZvcmUgaW5kZW50ZWQtYmxvY2tcblx0XHQnbGlzdC1wdW5jdHVhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopKD86LXxcXCp7MSw1fXxcXC57MSw1fXwoPzpbYS16XXxcXGQrKVxcLnxbeHZpXStcXCkpKD89ICkvaW0sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdsaXN0LWxhYmVsJzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKilbYS16XFxkXS4rKD86OnsyLDR9fDs7KSg/PVxccykvaW0sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdzeW1ib2wnXG5cdFx0fSxcblx0XHQnaW5kZW50ZWQtYmxvY2snOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKChcXHI/XFxufFxccilcXDIpKFsgXFx0XSspXFxTLiooPzooPzpcXHI/XFxufFxccilcXDMuKykqKD89XFwyezJ9fCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXG5cdFx0J2NvbW1lbnQnOiAvXlxcL1xcLy4qL20sXG5cdFx0J3RpdGxlJzoge1xuXHRcdFx0cGF0dGVybjogL14uKyg/Olxccj9cXG58XFxyKSg/Oj17Myx9fC17Myx9fH57Myx9fFxcXnszLH18XFwrezMsfSkkfF49ezEsNX0gLit8XlxcLig/IVtcXHMuXSkuKi9tLFxuXHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eKD86XFwufD0rKXwoPzo9K3wtK3x+K3xcXF4rfFxcKyspJC9cblx0XHRcdFx0Ly8gU2VlIHJlc3QgYmVsb3dcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdhdHRyaWJ1dGUtZW50cnknOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXjpbXjpcXHJcXG5dKzooPzogLio/KD86IFxcKyg/Olxccj9cXG58XFxyKS4qPykqKT8kL20sXG5cdFx0XHRhbGlhczogJ3RhZydcblx0XHR9LFxuXHRcdCdhdHRyaWJ1dGVzJzogYXR0cmlidXRlcyxcblx0XHQnaHInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXid7Myx9JC9tLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdwYWdlLWJyZWFrJzoge1xuXHRcdFx0cGF0dGVybjogL148ezMsfSQvbSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQnYWRtb25pdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC9eKD86Q0FVVElPTnxJTVBPUlRBTlR8Tk9URXxUSVB8V0FSTklORyk6L20sXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblx0XHQnY2FsbG91dCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyheWyBcXHRdKik8P1xcZCo+L20sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLzxcXGQrPi8sXG5cdFx0XHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J21hY3JvJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYlthLXpcXGRdW2EtelxcZC1dKjo6Pyg/OlteXFxzXFxbXFxdXSpcXFsoPzpbXlxcXVxcXFxcIiddfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqXFwxfFxcXFwuKSpcXF0pLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZnVuY3Rpb24nOiAvXlthLXpcXGQtXSsoPz06KS8sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eOjo/Lyxcblx0XHRcdFx0J2F0dHJpYnV0ZXMnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyg/OlxcWyg/OlteXFxdXFxcXFwiJ118KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSpcXDF8XFxcXC4pKlxcXSkvLFxuXHRcdFx0XHRcdGluc2lkZTogYXR0cmlidXRlcy5pbnNpZGVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2lubGluZSc6IHtcblx0XHRcdC8qXG5cdFx0XHRUaGUgaW5pdGlhbCBsb29rLWJlaGluZCBwcmV2ZW50cyB0aGUgaGlnaGxpZ2h0aW5nIG9mIGVzY2FwZWQgcXVvdGVkIHRleHQuXG5cblx0XHRcdFF1b3RlZCB0ZXh0IGNhbiBiZSBtdWx0aS1saW5lIGJ1dCBjYW5ub3Qgc3BhbiBhbiBlbXB0eSBsaW5lLlxuXHRcdFx0QWxsIHF1b3RlZCB0ZXh0IGNhbiBoYXZlIGF0dHJpYnV0ZXMgYmVmb3JlIFtmb29iYXIsICdmb29iYXInLCBiYXo9XCJiYXJcIl0uXG5cblx0XHRcdEZpcnN0LCB3ZSBoYW5kbGUgdGhlIGNvbnN0cmFpbmVkIHF1b3Rlcy5cblx0XHRcdFRob3NlIG11c3QgYmUgYm91bmRlZCBieSBub24td29yZCBjaGFycyBhbmQgY2Fubm90IGhhdmUgc3BhY2VzIGJldHdlZW4gdGhlIGRlbGltaXRlciBhbmQgdGhlIGZpcnN0IGNoYXIuXG5cdFx0XHRUaGV5IGFyZSwgaW4gb3JkZXI6IF9lbXBoYXNpc18sIGBgZG91YmxlIHF1b3RlcycnLCBgc2luZ2xlIHF1b3RlcycsIGBtb25vc3BhY2VgLCAnZW1waGFzaXMnLCAqc3Ryb25nKiwgK21vbm9zcGFjZSsgYW5kICN1bnF1b3RlZCNcblxuXHRcdFx0VGhlbiB3ZSBoYW5kbGUgdGhlIHVuY29uc3RyYWluZWQgcXVvdGVzLlxuXHRcdFx0VGhvc2UgZG8gbm90IGhhdmUgdGhlIHJlc3RyaWN0aW9ucyBvZiB0aGUgY29uc3RyYWluZWQgcXVvdGVzLlxuXHRcdFx0VGhleSBhcmUsIGluIG9yZGVyOiBfX2VtcGhhc2lzX18sICoqc3Ryb25nKiosICsrbW9ub3NwYWNlKyssICsrK3Bhc3N0aHJvdWdoKysrLCAjI3VucXVvdGVkIyMsICQkcGFzc3Rocm91Z2gkJCwgfnN1YnNjcmlwdH4sIF5zdXBlcnNjcmlwdF4sIHthdHRyaWJ1dGUtcmVmZXJlbmNlfSwgW1thbmNob3JdXSwgW1tbYmlibGlvZ3JhcGh5IGFuY2hvcl1dXSwgPDx4cmVmPj4sICgoKGluZGV4ZXMpKSkgYW5kICgoaW5kZXhlcykpXG5cdFx0XHQgKi9cblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSg/Oig/OlxcQlxcWyg/OlteXFxdXFxcXFwiJ118KFtcIiddKSg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSpcXDJ8XFxcXC4pKlxcXSk/KD86XFxiXyg/IVxccykoPzogX3xbXl9cXFxcXFxyXFxuXXxcXFxcLikrKD86KD86XFxyP1xcbnxcXHIpKD86IF98W15fXFxcXFxcclxcbl18XFxcXC4pKykqX1xcYnxcXEJgYCg/IVxccykuKz8oPzooPzpcXHI/XFxufFxccikuKz8pKicnXFxCfFxcQmAoPyFcXHMpKD86W15gJ1xcc118XFxzK1xcUykrWydgXVxcQnxcXEIoWycqKyNdKSg/IVxccykoPzogXFwzfCg/IVxcMylbXlxcXFxcXHJcXG5dfFxcXFwuKSsoPzooPzpcXHI/XFxufFxccikoPzogXFwzfCg/IVxcMylbXlxcXFxcXHJcXG5dfFxcXFwuKSspKlxcM1xcQil8KD86XFxbKD86W15cXF1cXFxcXCInXXwoW1wiJ10pKD86KD8hXFw0KVteXFxcXF18XFxcXC4pKlxcNHxcXFxcLikqXFxdKT8oPzooX198XFwqXFwqfFxcK1xcK1xcKz98IyN8XFwkXFwkfFt+Xl0pLis/KD86KD86XFxyP1xcbnxcXHIpLis/KSpcXDV8XFx7W159XFxyXFxuXStcXH18XFxbXFxbXFxbPy4rPyg/Oig/Olxccj9cXG58XFxyKS4rPykqXFxdP1xcXVxcXXw8PC4rPyg/Oig/Olxccj9cXG58XFxyKS4rPykqPj58XFwoXFwoXFwoPy4rPyg/Oig/Olxccj9cXG58XFxyKS4rPykqXFwpP1xcKVxcKSkpL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdhdHRyaWJ1dGVzJzogYXR0cmlidXRlcyxcblx0XHRcdFx0J3VybCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXig/OlxcW1xcW1xcWz8uKz9cXF0/XFxdXFxdfDw8Lis/Pj4pJC8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXig/OlxcW1xcW1xcWz98PDwpfCg/OlxcXVxcXVxcXT98Pj4pJC9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdhdHRyaWJ1dGUtcmVmJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eXFx7LitcXH0kLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCd2YXJpYWJsZSc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyheXFx7KVthLXpcXGQsK18tXSsvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J29wZXJhdG9yJzogL15bPT8hIyVAJF18ISg/PVs6fV0pLyxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFx7fFxcfSR8Ojo/L1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J2l0YWxpYyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXihbJ19dKVtcXHNcXFNdK1xcMSQvLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL14oPzonJz98X18/KXwoPzonJz98X18/KSQvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnYm9sZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcKltcXHNcXFNdK1xcKiQvLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0cHVuY3R1YXRpb246IC9eXFwqXFwqP3xcXCpcXCo/JC9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eKD86YGA/fFxcK3sxLDN9fCMjP3xcXCRcXCR8W35eXXxcXChcXChcXCg/KXwoPzonJz98XFwrezEsM318IyM/fFxcJFxcJHxbfl5gXXxcXCk/XFwpXFwpKSQvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQncmVwbGFjZW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwoKD86Q3xSfFRNKVxcKS8sXG5cdFx0XHRhbGlhczogJ2J1aWx0aW4nXG5cdFx0fSxcblx0XHQnZW50aXR5JzogLyYjP1tcXGRhLXpdezEsOH07L2ksXG5cdFx0J2xpbmUtY29udGludWF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhefCApXFwrJC9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fVxuXHR9O1xuXG5cblx0Ly8gQWxsb3cgc29tZSBuZXN0aW5nLiBUaGVyZSBpcyBubyByZWN1cnNpb24gdGhvdWdoLCBzbyBjbG9uaW5nIHNob3VsZCBub3QgYmUgbmVlZGVkLlxuXG5cdGZ1bmN0aW9uIGNvcHlGcm9tQXNjaWlEb2Moa2V5cykge1xuXHRcdGtleXMgPSBrZXlzLnNwbGl0KCcgJyk7XG5cblx0XHR2YXIgbyA9IHt9O1xuXHRcdGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdG9ba2V5c1tpXV0gPSBhc2NpaWRvY1trZXlzW2ldXTtcblx0XHR9XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRhdHRyaWJ1dGVzLmluc2lkZVsnaW50ZXJwcmV0ZWQnXS5pbnNpZGUucmVzdCA9IGNvcHlGcm9tQXNjaWlEb2MoJ21hY3JvIGlubGluZSByZXBsYWNlbWVudCBlbnRpdHknKTtcblxuXHRhc2NpaWRvY1sncGFzc3Rocm91Z2gtYmxvY2snXS5pbnNpZGUucmVzdCA9IGNvcHlGcm9tQXNjaWlEb2MoJ21hY3JvJyk7XG5cblx0YXNjaWlkb2NbJ2xpdGVyYWwtYmxvY2snXS5pbnNpZGUucmVzdCA9IGNvcHlGcm9tQXNjaWlEb2MoJ2NhbGxvdXQnKTtcblxuXHRhc2NpaWRvY1sndGFibGUnXS5pbnNpZGUucmVzdCA9IGNvcHlGcm9tQXNjaWlEb2MoJ2NvbW1lbnQtYmxvY2sgcGFzc3Rocm91Z2gtYmxvY2sgbGl0ZXJhbC1ibG9jayBvdGhlci1ibG9jayBsaXN0LXB1bmN0dWF0aW9uIGluZGVudGVkLWJsb2NrIGNvbW1lbnQgdGl0bGUgYXR0cmlidXRlLWVudHJ5IGF0dHJpYnV0ZXMgaHIgcGFnZS1icmVhayBhZG1vbml0aW9uIGxpc3QtbGFiZWwgY2FsbG91dCBtYWNybyBpbmxpbmUgcmVwbGFjZW1lbnQgZW50aXR5IGxpbmUtY29udGludWF0aW9uJyk7XG5cblx0YXNjaWlkb2NbJ290aGVyLWJsb2NrJ10uaW5zaWRlLnJlc3QgPSBjb3B5RnJvbUFzY2lpRG9jKCd0YWJsZSBsaXN0LXB1bmN0dWF0aW9uIGluZGVudGVkLWJsb2NrIGNvbW1lbnQgYXR0cmlidXRlLWVudHJ5IGF0dHJpYnV0ZXMgaHIgcGFnZS1icmVhayBhZG1vbml0aW9uIGxpc3QtbGFiZWwgbWFjcm8gaW5saW5lIHJlcGxhY2VtZW50IGVudGl0eSBsaW5lLWNvbnRpbnVhdGlvbicpO1xuXG5cdGFzY2lpZG9jWyd0aXRsZSddLmluc2lkZS5yZXN0ID0gY29weUZyb21Bc2NpaURvYygnbWFjcm8gaW5saW5lIHJlcGxhY2VtZW50IGVudGl0eScpO1xuXG5cblx0Ly8gUGx1Z2luIHRvIG1ha2UgZW50aXR5IHRpdGxlIHNob3cgdGhlIHJlYWwgZW50aXR5LCBpZGVhIGJ5IFJvbWFuIEtvbWFyb3Zcblx0UHJpc20uaG9va3MuYWRkKCd3cmFwJywgZnVuY3Rpb24gKGVudikge1xuXHRcdGlmIChlbnYudHlwZSA9PT0gJ2VudGl0eScpIHtcblx0XHRcdGVudi5hdHRyaWJ1dGVzWyd0aXRsZSddID0gZW52LmNvbnRlbnQucmVwbGFjZSgvJmFtcDsvLCAnJicpO1xuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmFkb2MgPSBQcmlzbS5sYW5ndWFnZXMuYXNjaWlkb2M7XG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvKipcblx0ICogUmVwbGFjZXMgYWxsIHBsYWNlaG9sZGVycyBcIjw8bj4+XCIgb2YgZ2l2ZW4gcGF0dGVybiB3aXRoIHRoZSBuLXRoIHJlcGxhY2VtZW50ICh6ZXJvIGJhc2VkKS5cblx0ICpcblx0ICogTm90ZTogVGhpcyBpcyBhIHNpbXBsZSB0ZXh0IGJhc2VkIHJlcGxhY2VtZW50LiBCZSBjYXJlZnVsIHdoZW4gdXNpbmcgYmFja3JlZmVyZW5jZXMhXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuIHRoZSBnaXZlbiBwYXR0ZXJuLlxuXHQgKiBAcGFyYW0ge3N0cmluZ1tdfSByZXBsYWNlbWVudHMgYSBsaXN0IG9mIHJlcGxhY2VtZW50IHdoaWNoIGNhbiBiZSBpbnNlcnRlZCBpbnRvIHRoZSBnaXZlbiBwYXR0ZXJuLlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgcGF0dGVybiB3aXRoIGFsbCBwbGFjZWhvbGRlcnMgcmVwbGFjZWQgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHJlcGxhY2VtZW50cy5cblx0ICogQGV4YW1wbGUgcmVwbGFjZSgvYTw8MD4+YS8uc291cmNlLCBbL2IrLy5zb3VyY2VdKSA9PT0gL2EoPzpiKylhLy5zb3VyY2Vcblx0ICovXG5cdGZ1bmN0aW9uIHJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnRzKSB7XG5cdFx0cmV0dXJuIHBhdHRlcm4ucmVwbGFjZSgvPDwoXFxkKyk+Pi9nLCBmdW5jdGlvbiAobSwgaW5kZXgpIHtcblx0XHRcdHJldHVybiAnKD86JyArIHJlcGxhY2VtZW50c1sraW5kZXhdICsgJyknO1xuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVyblxuXHQgKiBAcGFyYW0ge3N0cmluZ1tdfSByZXBsYWNlbWVudHNcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtmbGFnc11cblx0ICogQHJldHVybnMge1JlZ0V4cH1cblx0ICovXG5cdGZ1bmN0aW9uIHJlKHBhdHRlcm4sIHJlcGxhY2VtZW50cywgZmxhZ3MpIHtcblx0XHRyZXR1cm4gUmVnRXhwKHJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnRzKSwgZmxhZ3MgfHwgJycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXN0ZWQgcGF0dGVybiB3aGVyZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHN0cmluZyBgPDxzZWxmPj5gIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBwYXR0ZXJuIGl0c2VsZi5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cblx0ICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoTG9nMlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0ZnVuY3Rpb24gbmVzdGVkKHBhdHRlcm4sIGRlcHRoTG9nMikge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGVwdGhMb2cyOyBpKyspIHtcblx0XHRcdHBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UoLzw8c2VsZj4+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuICcoPzonICsgcGF0dGVybiArICcpJzsgfSk7XG5cdFx0fVxuXHRcdHJldHVybiBwYXR0ZXJuLnJlcGxhY2UoLzw8c2VsZj4+L2csICdbXlxcXFxzXFxcXFNdJyk7XG5cdH1cblxuXHQvLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9kb3RuZXQvY3NoYXJwL2xhbmd1YWdlLXJlZmVyZW5jZS9rZXl3b3Jkcy9cblx0dmFyIGtleXdvcmRLaW5kcyA9IHtcblx0XHQvLyBrZXl3b3JkcyB3aGljaCByZXByZXNlbnQgYSByZXR1cm4gb3IgdmFyaWFibGUgdHlwZVxuXHRcdHR5cGU6ICdib29sIGJ5dGUgY2hhciBkZWNpbWFsIGRvdWJsZSBkeW5hbWljIGZsb2F0IGludCBsb25nIG9iamVjdCBzYnl0ZSBzaG9ydCBzdHJpbmcgdWludCB1bG9uZyB1c2hvcnQgdmFyIHZvaWQnLFxuXHRcdC8vIGtleXdvcmRzIHdoaWNoIGFyZSB1c2VkIHRvIGRlY2xhcmUgYSB0eXBlXG5cdFx0dHlwZURlY2xhcmF0aW9uOiAnY2xhc3MgZW51bSBpbnRlcmZhY2UgcmVjb3JkIHN0cnVjdCcsXG5cdFx0Ly8gY29udGV4dHVhbCBrZXl3b3Jkc1xuXHRcdC8vIChcInZhclwiIGFuZCBcImR5bmFtaWNcIiBhcmUgbWlzc2luZyBiZWNhdXNlIHRoZXkgYXJlIHVzZWQgbGlrZSB0eXBlcylcblx0XHRjb250ZXh0dWFsOiAnYWRkIGFsaWFzIGFuZCBhc2NlbmRpbmcgYXN5bmMgYXdhaXQgYnkgZGVzY2VuZGluZyBmcm9tKD89XFxcXHMqKD86XFxcXHd8JCkpIGdldCBnbG9iYWwgZ3JvdXAgaW50byBpbml0KD89XFxcXHMqOykgam9pbiBsZXQgbmFtZW9mIG5vdCBub3RudWxsIG9uIG9yIG9yZGVyYnkgcGFydGlhbCByZW1vdmUgc2VsZWN0IHNldCB1bm1hbmFnZWQgdmFsdWUgd2hlbiB3aGVyZSB3aXRoKD89XFxcXHMqeyknLFxuXHRcdC8vIGFsbCBvdGhlciBrZXl3b3Jkc1xuXHRcdG90aGVyOiAnYWJzdHJhY3QgYXMgYmFzZSBicmVhayBjYXNlIGNhdGNoIGNoZWNrZWQgY29uc3QgY29udGludWUgZGVmYXVsdCBkZWxlZ2F0ZSBkbyBlbHNlIGV2ZW50IGV4cGxpY2l0IGV4dGVybiBmaW5hbGx5IGZpeGVkIGZvciBmb3JlYWNoIGdvdG8gaWYgaW1wbGljaXQgaW4gaW50ZXJuYWwgaXMgbG9jayBuYW1lc3BhY2UgbmV3IG51bGwgb3BlcmF0b3Igb3V0IG92ZXJyaWRlIHBhcmFtcyBwcml2YXRlIHByb3RlY3RlZCBwdWJsaWMgcmVhZG9ubHkgcmVmIHJldHVybiBzZWFsZWQgc2l6ZW9mIHN0YWNrYWxsb2Mgc3RhdGljIHN3aXRjaCB0aGlzIHRocm93IHRyeSB0eXBlb2YgdW5jaGVja2VkIHVuc2FmZSB1c2luZyB2aXJ0dWFsIHZvbGF0aWxlIHdoaWxlIHlpZWxkJ1xuXHR9O1xuXG5cdC8vIGtleXdvcmRzXG5cdGZ1bmN0aW9uIGtleXdvcmRzVG9QYXR0ZXJuKHdvcmRzKSB7XG5cdFx0cmV0dXJuICdcXFxcYig/OicgKyB3b3Jkcy50cmltKCkucmVwbGFjZSgvIC9nLCAnfCcpICsgJylcXFxcYic7XG5cdH1cblx0dmFyIHR5cGVEZWNsYXJhdGlvbktleXdvcmRzID0ga2V5d29yZHNUb1BhdHRlcm4oa2V5d29yZEtpbmRzLnR5cGVEZWNsYXJhdGlvbik7XG5cdHZhciBrZXl3b3JkcyA9IFJlZ0V4cChrZXl3b3Jkc1RvUGF0dGVybihrZXl3b3JkS2luZHMudHlwZSArICcgJyArIGtleXdvcmRLaW5kcy50eXBlRGVjbGFyYXRpb24gKyAnICcgKyBrZXl3b3JkS2luZHMuY29udGV4dHVhbCArICcgJyArIGtleXdvcmRLaW5kcy5vdGhlcikpO1xuXHR2YXIgbm9uVHlwZUtleXdvcmRzID0ga2V5d29yZHNUb1BhdHRlcm4oa2V5d29yZEtpbmRzLnR5cGVEZWNsYXJhdGlvbiArICcgJyArIGtleXdvcmRLaW5kcy5jb250ZXh0dWFsICsgJyAnICsga2V5d29yZEtpbmRzLm90aGVyKTtcblx0dmFyIG5vbkNvbnRleHR1YWxLZXl3b3JkcyA9IGtleXdvcmRzVG9QYXR0ZXJuKGtleXdvcmRLaW5kcy50eXBlICsgJyAnICsga2V5d29yZEtpbmRzLnR5cGVEZWNsYXJhdGlvbiArICcgJyArIGtleXdvcmRLaW5kcy5vdGhlcik7XG5cblx0Ly8gdHlwZXNcblx0dmFyIGdlbmVyaWMgPSBuZXN0ZWQoLzwoPzpbXjw+Oz0rXFwtKi8lJnxeXXw8PHNlbGY+PikqPi8uc291cmNlLCAyKTsgLy8gdGhlIGlkZWEgYmVoaW5kIHRoZSBvdGhlciBmb3JiaWRkZW4gY2hhcmFjdGVycyBpcyB0byBwcmV2ZW50IGZhbHNlIHBvc2l0aXZlcy4gU2FtZSBmb3IgdHVwbGVFbGVtZW50LlxuXHR2YXIgbmVzdGVkUm91bmQgPSBuZXN0ZWQoL1xcKCg/OlteKCldfDw8c2VsZj4+KSpcXCkvLnNvdXJjZSwgMik7XG5cdHZhciBuYW1lID0gL0A/XFxiW0EtWmEtel9dXFx3KlxcYi8uc291cmNlO1xuXHR2YXIgZ2VuZXJpY05hbWUgPSByZXBsYWNlKC88PDA+Pig/Olxccyo8PDE+Pik/Ly5zb3VyY2UsIFtuYW1lLCBnZW5lcmljXSk7XG5cdHZhciBpZGVudGlmaWVyID0gcmVwbGFjZSgvKD8hPDwwPj4pPDwxPj4oPzpcXHMqXFwuXFxzKjw8MT4+KSovLnNvdXJjZSwgW25vblR5cGVLZXl3b3JkcywgZ2VuZXJpY05hbWVdKTtcblx0dmFyIGFycmF5ID0gL1xcW1xccyooPzosXFxzKikqXFxdLy5zb3VyY2U7XG5cdHZhciB0eXBlRXhwcmVzc2lvbldpdGhvdXRUdXBsZSA9IHJlcGxhY2UoLzw8MD4+KD86XFxzKig/OlxcP1xccyopPzw8MT4+KSooPzpcXHMqXFw/KT8vLnNvdXJjZSwgW2lkZW50aWZpZXIsIGFycmF5XSk7XG5cdHZhciB0dXBsZUVsZW1lbnQgPSByZXBsYWNlKC9bXiwoKTw+W1xcXTs9K1xcLSovJSZ8Xl18PDwwPj58PDwxPj58PDwyPj4vLnNvdXJjZSwgW2dlbmVyaWMsIG5lc3RlZFJvdW5kLCBhcnJheV0pO1xuXHR2YXIgdHVwbGUgPSByZXBsYWNlKC9cXCg8PDA+PisoPzosPDwwPj4rKStcXCkvLnNvdXJjZSwgW3R1cGxlRWxlbWVudF0pO1xuXHR2YXIgdHlwZUV4cHJlc3Npb24gPSByZXBsYWNlKC8oPzo8PDA+Pnw8PDE+PikoPzpcXHMqKD86XFw/XFxzKik/PDwyPj4pKig/OlxccypcXD8pPy8uc291cmNlLCBbdHVwbGUsIGlkZW50aWZpZXIsIGFycmF5XSk7XG5cblx0dmFyIHR5cGVJbnNpZGUgPSB7XG5cdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHQncHVuY3R1YXRpb24nOiAvWzw+KCk/LC46W1xcXV0vXG5cdH07XG5cblx0Ly8gc3RyaW5ncyAmIGNoYXJhY3RlcnNcblx0Ly8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvZG90bmV0L2NzaGFycC9sYW5ndWFnZS1yZWZlcmVuY2UvbGFuZ3VhZ2Utc3BlY2lmaWNhdGlvbi9sZXhpY2FsLXN0cnVjdHVyZSNjaGFyYWN0ZXItbGl0ZXJhbHNcblx0Ly8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvZG90bmV0L2NzaGFycC9sYW5ndWFnZS1yZWZlcmVuY2UvbGFuZ3VhZ2Utc3BlY2lmaWNhdGlvbi9sZXhpY2FsLXN0cnVjdHVyZSNzdHJpbmctbGl0ZXJhbHNcblx0dmFyIGNoYXJhY3RlciA9IC8nKD86W15cXHJcXG4nXFxcXF18XFxcXC58XFxcXFtVdXhdW1xcZGEtZkEtRl17MSw4fSknLy5zb3VyY2U7IC8vIHNpbXBsaWZpZWQgcGF0dGVyblxuXHR2YXIgcmVndWxhclN0cmluZyA9IC9cIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCIvLnNvdXJjZTtcblx0dmFyIHZlcmJhdGltU3RyaW5nID0gL0BcIig/OlwiXCJ8XFxcXFtcXHNcXFNdfFteXFxcXFwiXSkqXCIoPyFcIikvLnNvdXJjZTtcblxuXG5cdFByaXNtLmxhbmd1YWdlcy5jc2hhcnAgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0XHQnc3RyaW5nJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiByZSgvKF58W14kXFxcXF0pPDwwPj4vLnNvdXJjZSwgW3ZlcmJhdGltU3RyaW5nXSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogcmUoLyhefFteQCRcXFxcXSk8PDA+Pi8uc291cmNlLCBbcmVndWxhclN0cmluZ10pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdjbGFzcy1uYW1lJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBVc2luZyBzdGF0aWNcblx0XHRcdFx0Ly8gdXNpbmcgc3RhdGljIFN5c3RlbS5NYXRoO1xuXHRcdFx0XHRwYXR0ZXJuOiByZSgvKFxcYnVzaW5nXFxzK3N0YXRpY1xccyspPDwwPj4oPz1cXHMqOykvLnNvdXJjZSwgW2lkZW50aWZpZXJdKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBVc2luZyBhbGlhcyAodHlwZSlcblx0XHRcdFx0Ly8gdXNpbmcgUHJvamVjdCA9IFBDLk15Q29tcGFueS5Qcm9qZWN0O1xuXHRcdFx0XHRwYXR0ZXJuOiByZSgvKFxcYnVzaW5nXFxzKzw8MD4+XFxzKj1cXHMqKTw8MT4+KD89XFxzKjspLy5zb3VyY2UsIFtuYW1lLCB0eXBlRXhwcmVzc2lvbl0pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFVzaW5nIGFsaWFzIChhbGlhcylcblx0XHRcdFx0Ly8gdXNpbmcgUHJvamVjdCA9IFBDLk15Q29tcGFueS5Qcm9qZWN0O1xuXHRcdFx0XHRwYXR0ZXJuOiByZSgvKFxcYnVzaW5nXFxzKyk8PDA+Pig/PVxccyo9KS8uc291cmNlLCBbbmFtZV0pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBUeXBlIGRlY2xhcmF0aW9uc1xuXHRcdFx0XHQvLyBjbGFzcyBGb288QSwgQj5cblx0XHRcdFx0Ly8gaW50ZXJmYWNlIEZvbzxvdXQgQSwgQj5cblx0XHRcdFx0cGF0dGVybjogcmUoLyhcXGI8PDA+PlxccyspPDwxPj4vLnNvdXJjZSwgW3R5cGVEZWNsYXJhdGlvbktleXdvcmRzLCBnZW5lcmljTmFtZV0pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFNpbmdsZSBjYXRjaCBleGNlcHRpb24gZGVjbGFyYXRpb25cblx0XHRcdFx0Ly8gY2F0Y2goRm9vKVxuXHRcdFx0XHQvLyAodGhpbmdzIGxpa2UgY2F0Y2goRm9vIGUpIGlzIGNvdmVyZWQgYnkgdmFyaWFibGUgZGVjbGFyYXRpb24pXG5cdFx0XHRcdHBhdHRlcm46IHJlKC8oXFxiY2F0Y2hcXHMqXFwoXFxzKik8PDA+Pi8uc291cmNlLCBbaWRlbnRpZmllcl0pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIE5hbWUgb2YgdGhlIHR5cGUgcGFyYW1ldGVyIG9mIGdlbmVyaWMgY29uc3RyYWludHNcblx0XHRcdFx0Ly8gd2hlcmUgRm9vIDogY2xhc3Ncblx0XHRcdFx0cGF0dGVybjogcmUoLyhcXGJ3aGVyZVxccyspPDwwPj4vLnNvdXJjZSwgW25hbWVdKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gQ2FzdHMgYW5kIGNoZWNrcyB2aWEgYXMgYW5kIGlzLlxuXHRcdFx0XHQvLyBhcyBGb288QT4sIGlzIEJhcjxCPlxuXHRcdFx0XHQvLyAodGhpbmdzIGxpa2UgaWYoYSBpcyBGb28gYikgaXMgY292ZXJlZCBieSB2YXJpYWJsZSBkZWNsYXJhdGlvbilcblx0XHRcdFx0cGF0dGVybjogcmUoLyhcXGIoPzppcyg/Olxccytub3QpP3xhcylcXHMrKTw8MD4+Ly5zb3VyY2UsIFt0eXBlRXhwcmVzc2lvbldpdGhvdXRUdXBsZV0pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFZhcmlhYmxlLCBmaWVsZCBhbmQgcGFyYW1ldGVyIGRlY2xhcmF0aW9uXG5cdFx0XHRcdC8vIChGb28gYmFyLCBCYXIgYmF6LCBGb29bLCxdIGJheSwgRm9vPEJhciwgRm9vQmFyPEJhcj4+IGJheClcblx0XHRcdFx0cGF0dGVybjogcmUoL1xcYjw8MD4+KD89XFxzKyg/ITw8MT4+fHdpdGhcXHMqXFx7KTw8Mj4+KD86XFxzKls9LDs6eylcXF1dfFxccysoPzppbnx3aGVuKVxcYikpLy5zb3VyY2UsIFt0eXBlRXhwcmVzc2lvbiwgbm9uQ29udGV4dHVhbEtleXdvcmRzLCBuYW1lXSksXG5cdFx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHQvLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9kb3RuZXQvY3NoYXJwL2xhbmd1YWdlLXJlZmVyZW5jZS9sYW5ndWFnZS1zcGVjaWZpY2F0aW9uL2xleGljYWwtc3RydWN0dXJlI2xpdGVyYWxzXG5cdFx0J251bWJlcic6IC8oPzpcXGIwKD86eFtcXGRhLWZfXSpbXFxkYS1mXXxiWzAxX10qWzAxXSl8KD86XFxCXFwuXFxkKyg/Ol8rXFxkKykqfFxcYlxcZCsoPzpfK1xcZCspKig/OlxcLlxcZCsoPzpfK1xcZCspKik/KSg/OmVbLStdP1xcZCsoPzpfK1xcZCspKik/KSg/OltkZmxtdV18bHV8dWwpP1xcYi9pLFxuXHRcdCdvcGVyYXRvcic6IC8+Pj0/fDw8PT98Wy09XT58KFstKyZ8XSlcXDF8fnxcXD9cXD89P3xbLSsqLyUmfF4hPTw+XT0/Lyxcblx0XHQncHVuY3R1YXRpb24nOiAvXFw/XFwuP3w6Onxbe31bXFxdOygpLC46XS9cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY3NoYXJwJywgJ251bWJlcicsIHtcblx0XHQncmFuZ2UnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwuXFwuLyxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjc2hhcnAnLCAncHVuY3R1YXRpb24nLCB7XG5cdFx0J25hbWVkLXBhcmFtZXRlcic6IHtcblx0XHRcdHBhdHRlcm46IHJlKC8oWygsXVxccyopPDwwPj4oPz1cXHMqOikvLnNvdXJjZSwgW25hbWVdKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY3NoYXJwJywgJ2NsYXNzLW5hbWUnLCB7XG5cdFx0J25hbWVzcGFjZSc6IHtcblx0XHRcdC8vIG5hbWVzcGFjZSBGb28uQmFyIHt9XG5cdFx0XHQvLyB1c2luZyBGb28uQmFyO1xuXHRcdFx0cGF0dGVybjogcmUoLyhcXGIoPzpuYW1lc3BhY2V8dXNpbmcpXFxzKyk8PDA+Pig/OlxccypcXC5cXHMqPDwwPj4pKig/PVxccypbO3tdKS8uc291cmNlLCBbbmFtZV0pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3R5cGUtZXhwcmVzc2lvbic6IHtcblx0XHRcdC8vIGRlZmF1bHQoRm9vKSwgdHlwZW9mKEZvbzxCYXI+KSwgc2l6ZW9mKGludClcblx0XHRcdHBhdHRlcm46IHJlKC8oXFxiKD86ZGVmYXVsdHxzaXplb2Z8dHlwZW9mKVxccypcXChcXHMqKD8hXFxzKSkoPzpbXigpXFxzXXxcXHMoPyFcXHMpfDw8MD4+KSooPz1cXHMqXFwpKS8uc291cmNlLCBbbmVzdGVkUm91bmRdKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnLFxuXHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0fSxcblx0XHQncmV0dXJuLXR5cGUnOiB7XG5cdFx0XHQvLyBGb288QmFyPiBGb3JCYXIoKTsgRm9vIElGb28uQmFyKCkgPT4gMFxuXHRcdFx0Ly8gaW50IHRoaXNbaW50IGluZGV4XSA9PiAwOyBUIElSZWFkT25seUxpc3Q8VD4udGhpc1tpbnQgaW5kZXhdID0+IHRoaXNbaW5kZXhdO1xuXHRcdFx0Ly8gaW50IEZvbyA9PiAwOyBpbnQgRm9vIHsgZ2V0OyBzZXQgfSA9IDA7XG5cdFx0XHRwYXR0ZXJuOiByZSgvPDwwPj4oPz1cXHMrKD86PDwxPj5cXHMqKD86PT58Wyh7XXxcXC5cXHMqdGhpc1xccypcXFspfHRoaXNcXHMqXFxbKSkvLnNvdXJjZSwgW3R5cGVFeHByZXNzaW9uLCBpZGVudGlmaWVyXSksXG5cdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGUsXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdFx0fSxcblx0XHQnY29uc3RydWN0b3ItaW52b2NhdGlvbic6IHtcblx0XHRcdC8vIG5ldyBMaXN0PEZvbzxCYXJbXT4+IHsgfVxuXHRcdFx0cGF0dGVybjogcmUoLyhcXGJuZXdcXHMrKTw8MD4+KD89XFxzKltbKHtdKS8uc291cmNlLCBbdHlwZUV4cHJlc3Npb25dKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGUsXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdFx0fSxcblx0XHQvKidleHBsaWNpdC1pbXBsZW1lbnRhdGlvbic6IHtcblx0XHRcdC8vIGludCBJRm9vPEZvbz4uQmFyID0+IDA7IHZvaWQgSUZvbzxGb288Rm9vPj4uRm9vPFQ+KCk7XG5cdFx0XHRwYXR0ZXJuOiByZXBsYWNlKC9cXGI8PDA+Pig/PVxcLjw8MT4+KS8sIGNsYXNzTmFtZSwgbWV0aG9kT3JQcm9wZXJ0eURlY2xhcmF0aW9uKSxcblx0XHRcdGluc2lkZTogY2xhc3NOYW1lSW5zaWRlLFxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHRcdH0sKi9cblx0XHQnZ2VuZXJpYy1tZXRob2QnOiB7XG5cdFx0XHQvLyBmb288QmFyPigpXG5cdFx0XHRwYXR0ZXJuOiByZSgvPDwwPj5cXHMqPDwxPj4oPz1cXHMqXFwoKS8uc291cmNlLCBbbmFtZSwgZ2VuZXJpY10pLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdmdW5jdGlvbic6IHJlKC9ePDwwPj4vLnNvdXJjZSwgW25hbWVdKSxcblx0XHRcdFx0J2dlbmVyaWMnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKGdlbmVyaWMpLFxuXHRcdFx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZScsXG5cdFx0XHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCd0eXBlLWxpc3QnOiB7XG5cdFx0XHQvLyBUaGUgbGlzdCBvZiB0eXBlcyBpbmhlcml0ZWQgb3Igb2YgZ2VuZXJpYyBjb25zdHJhaW50c1xuXHRcdFx0Ly8gY2xhc3MgRm9vPEY+IDogQmFyLCBJTGlzdDxGb29CYXI+XG5cdFx0XHQvLyB3aGVyZSBGIDogQmFyLCBJTGlzdDxpbnQ+XG5cdFx0XHRwYXR0ZXJuOiByZShcblx0XHRcdFx0L1xcYigoPzo8PDA+Plxccys8PDE+PnxyZWNvcmRcXHMrPDwxPj5cXHMqPDw1Pj58d2hlcmVcXHMrPDwyPj4pXFxzKjpcXHMqKSg/Ojw8Mz4+fDw8ND4+fDw8MT4+XFxzKjw8NT4+fDw8Nj4+KSg/OlxccyosXFxzKig/Ojw8Mz4+fDw8ND4+fDw8Nj4+KSkqKD89XFxzKig/OndoZXJlfFt7O118PT58JCkpLy5zb3VyY2UsXG5cdFx0XHRcdFt0eXBlRGVjbGFyYXRpb25LZXl3b3JkcywgZ2VuZXJpY05hbWUsIG5hbWUsIHR5cGVFeHByZXNzaW9uLCBrZXl3b3Jkcy5zb3VyY2UsIG5lc3RlZFJvdW5kLCAvXFxibmV3XFxzKlxcKFxccypcXCkvLnNvdXJjZV1cblx0XHRcdCksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdyZWNvcmQtYXJndW1lbnRzJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IHJlKC8oXig/IW5ld1xccypcXCgpPDwwPj5cXHMqKTw8MT4+Ly5zb3VyY2UsIFtnZW5lcmljTmFtZSwgbmVzdGVkUm91bmRdKSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5jc2hhcnBcblx0XHRcdFx0fSxcblx0XHRcdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHRcdFx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKHR5cGVFeHByZXNzaW9uKSxcblx0XHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bLCgpXS9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdwcmVwcm9jZXNzb3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSMuKi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHJvcGVydHknLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdC8vIGhpZ2hsaWdodCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBhcyBrZXl3b3Jkc1xuXHRcdFx0XHQnZGlyZWN0aXZlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oIylcXGIoPzpkZWZpbmV8ZWxpZnxlbHNlfGVuZGlmfGVuZHJlZ2lvbnxlcnJvcnxpZnxsaW5lfG51bGxhYmxlfHByYWdtYXxyZWdpb258dW5kZWZ8d2FybmluZylcXGIvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBhdHRyaWJ1dGVzXG5cdHZhciByZWd1bGFyU3RyaW5nT3JDaGFyYWN0ZXIgPSByZWd1bGFyU3RyaW5nICsgJ3wnICsgY2hhcmFjdGVyO1xuXHR2YXIgcmVndWxhclN0cmluZ0NoYXJhY3Rlck9yQ29tbWVudCA9IHJlcGxhY2UoL1xcLyg/IVsqL10pfFxcL1xcL1teXFxyXFxuXSpbXFxyXFxuXXxcXC9cXCooPzpbXipdfFxcKig/IVxcLykpKlxcKlxcL3w8PDA+Pi8uc291cmNlLCBbcmVndWxhclN0cmluZ09yQ2hhcmFjdGVyXSk7XG5cdHZhciByb3VuZEV4cHJlc3Npb24gPSBuZXN0ZWQocmVwbGFjZSgvW15cIicvKCldfDw8MD4+fFxcKDw8c2VsZj4+KlxcKS8uc291cmNlLCBbcmVndWxhclN0cmluZ0NoYXJhY3Rlck9yQ29tbWVudF0pLCAyKTtcblxuXHQvLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9kb3RuZXQvY3NoYXJwL3Byb2dyYW1taW5nLWd1aWRlL2NvbmNlcHRzL2F0dHJpYnV0ZXMvI2F0dHJpYnV0ZS10YXJnZXRzXG5cdHZhciBhdHRyVGFyZ2V0ID0gL1xcYig/OmFzc2VtYmx5fGV2ZW50fGZpZWxkfG1ldGhvZHxtb2R1bGV8cGFyYW18cHJvcGVydHl8cmV0dXJufHR5cGUpXFxiLy5zb3VyY2U7XG5cdHZhciBhdHRyID0gcmVwbGFjZSgvPDwwPj4oPzpcXHMqXFwoPDwxPj4qXFwpKT8vLnNvdXJjZSwgW2lkZW50aWZpZXIsIHJvdW5kRXhwcmVzc2lvbl0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NzaGFycCcsICdjbGFzcy1uYW1lJywge1xuXHRcdCdhdHRyaWJ1dGUnOiB7XG5cdFx0XHQvLyBBdHRyaWJ1dGVzXG5cdFx0XHQvLyBbRm9vXSwgW0ZvbygxKSwgQmFyKDIsIFByb3AgPSBcImZvb1wiKV0sIFtyZXR1cm46IEZvbygxKSwgQmFyKDIpXSwgW2Fzc2VtYmx5OiBGb28oQmFyKV1cblx0XHRcdHBhdHRlcm46IHJlKC8oKD86XnxbXlxcc1xcdz4pP10pXFxzKlxcW1xccyopKD86PDwwPj5cXHMqOlxccyopPzw8MT4+KD86XFxzKixcXHMqPDwxPj4pKig/PVxccypcXF0pLy5zb3VyY2UsIFthdHRyVGFyZ2V0LCBhdHRyXSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCd0YXJnZXQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogcmUoL148PDA+Pig/PVxccyo6KS8uc291cmNlLCBbYXR0clRhcmdldF0pLFxuXHRcdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdFx0fSxcblx0XHRcdFx0J2F0dHJpYnV0ZS1hcmd1bWVudHMnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogcmUoL1xcKDw8MD4+KlxcKS8uc291cmNlLCBbcm91bmRFeHByZXNzaW9uXSksXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuY3NoYXJwXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdjbGFzcy1uYW1lJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChpZGVudGlmaWVyKSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWzosXS9cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cblx0Ly8gc3RyaW5nIGludGVycG9sYXRpb25cblx0dmFyIGZvcm1hdFN0cmluZyA9IC86W159XFxyXFxuXSsvLnNvdXJjZTtcblx0Ly8gbXVsdGkgbGluZVxuXHR2YXIgbUludGVycG9sYXRpb25Sb3VuZCA9IG5lc3RlZChyZXBsYWNlKC9bXlwiJy8oKV18PDwwPj58XFwoPDxzZWxmPj4qXFwpLy5zb3VyY2UsIFtyZWd1bGFyU3RyaW5nQ2hhcmFjdGVyT3JDb21tZW50XSksIDIpO1xuXHR2YXIgbUludGVycG9sYXRpb24gPSByZXBsYWNlKC9cXHsoPyFcXHspKD86KD8hW306XSk8PDA+PikqPDwxPj4/XFx9Ly5zb3VyY2UsIFttSW50ZXJwb2xhdGlvblJvdW5kLCBmb3JtYXRTdHJpbmddKTtcblx0Ly8gc2luZ2xlIGxpbmVcblx0dmFyIHNJbnRlcnBvbGF0aW9uUm91bmQgPSBuZXN0ZWQocmVwbGFjZSgvW15cIicvKCldfFxcLyg/IVxcKil8XFwvXFwqKD86W14qXXxcXCooPyFcXC8pKSpcXCpcXC98PDwwPj58XFwoPDxzZWxmPj4qXFwpLy5zb3VyY2UsIFtyZWd1bGFyU3RyaW5nT3JDaGFyYWN0ZXJdKSwgMik7XG5cdHZhciBzSW50ZXJwb2xhdGlvbiA9IHJlcGxhY2UoL1xceyg/IVxceykoPzooPyFbfTpdKTw8MD4+KSo8PDE+Pj9cXH0vLnNvdXJjZSwgW3NJbnRlcnBvbGF0aW9uUm91bmQsIGZvcm1hdFN0cmluZ10pO1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZUludGVycG9sYXRpb25JbnNpZGUoaW50ZXJwb2xhdGlvbiwgaW50ZXJwb2xhdGlvblJvdW5kKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiByZSgvKCg/Ol58W157XSkoPzpcXHtcXHspKik8PDA+Pi8uc291cmNlLCBbaW50ZXJwb2xhdGlvbl0pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnZm9ybWF0LXN0cmluZyc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IHJlKC8oXlxceyg/Oig/IVt9Ol0pPDwwPj4pKik8PDE+Pig/PVxcfSQpLy5zb3VyY2UsIFtpbnRlcnBvbGF0aW9uUm91bmQsIGZvcm1hdFN0cmluZ10pLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXjovXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxce3xcXH0kLyxcblx0XHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1jc2hhcnAnLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuY3NoYXJwXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0fTtcblx0fVxuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NzaGFycCcsICdzdHJpbmcnLCB7XG5cdFx0J2ludGVycG9sYXRpb24tc3RyaW5nJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiByZSgvKF58W15cXFxcXSkoPzpcXCRAfEBcXCQpXCIoPzpcIlwifFxcXFxbXFxzXFxTXXxcXHtcXHt8PDwwPj58W15cXFxce1wiXSkqXCIvLnNvdXJjZSwgW21JbnRlcnBvbGF0aW9uXSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBjcmVhdGVJbnRlcnBvbGF0aW9uSW5zaWRlKG1JbnRlcnBvbGF0aW9uLCBtSW50ZXJwb2xhdGlvblJvdW5kKSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IHJlKC8oXnxbXkBcXFxcXSlcXCRcIig/OlxcXFwufFxce1xce3w8PDA+PnxbXlxcXFxcIntdKSpcIi8uc291cmNlLCBbc0ludGVycG9sYXRpb25dKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IGNyZWF0ZUludGVycG9sYXRpb25JbnNpZGUoc0ludGVycG9sYXRpb24sIHNJbnRlcnBvbGF0aW9uUm91bmQpLFxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2NoYXInOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoY2hhcmFjdGVyKSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmRvdG5ldCA9IFByaXNtLmxhbmd1YWdlcy5jcyA9IFByaXNtLmxhbmd1YWdlcy5jc2hhcnA7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmFzcG5ldCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ21hcmt1cCcsIHtcblx0J3BhZ2UtZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC88JVxccypALiolPi8sXG5cdFx0YWxpYXM6ICd0YWcnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3BhZ2UtZGlyZWN0aXZlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvPCVcXHMqQFxccyooPzpBc3NlbWJseXxDb250cm9sfEltcGxlbWVudHN8SW1wb3J0fE1hc3Rlcig/OlR5cGUpP3xPdXRwdXRDYWNoZXxQYWdlfFByZXZpb3VzUGFnZVR5cGV8UmVmZXJlbmNlfFJlZ2lzdGVyKT98JT4vaSxcblx0XHRcdFx0YWxpYXM6ICd0YWcnXG5cdFx0XHR9LFxuXHRcdFx0cmVzdDogUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cC50YWcuaW5zaWRlXG5cdFx0fVxuXHR9LFxuXHQnZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC88JS4qJT4vLFxuXHRcdGFsaWFzOiAndGFnJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdkaXJlY3RpdmUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC88JVxccyo/WyQ9JSM6XXswLDJ9fCU+Lyxcblx0XHRcdFx0YWxpYXM6ICd0YWcnXG5cdFx0XHR9LFxuXHRcdFx0cmVzdDogUHJpc20ubGFuZ3VhZ2VzLmNzaGFycFxuXHRcdH1cblx0fVxufSk7XG4vLyBSZWdleHAgY29waWVkIGZyb20gcHJpc20tbWFya3VwLCB3aXRoIGEgbmVnYXRpdmUgbG9vay1haGVhZCBhZGRlZFxuUHJpc20ubGFuZ3VhZ2VzLmFzcG5ldC50YWcucGF0dGVybiA9IC88KD8hJSlcXC8/W15cXHM+XFwvXSsoPzpcXHMrW15cXHM+XFwvPV0rKD86PSg/OihcInwnKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDEpW15cXFxcXSkqXFwxfFteXFxzJ1wiPj1dKykpPykqXFxzKlxcLz8+LztcblxuLy8gbWF0Y2ggZGlyZWN0aXZlcyBvZiBhdHRyaWJ1dGUgdmFsdWUgZm9vPVwiPCUgQmFyICU+XCJcblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2luc2lkZScsICdwdW5jdHVhdGlvbicsIHtcblx0J2RpcmVjdGl2ZSc6IFByaXNtLmxhbmd1YWdlcy5hc3BuZXRbJ2RpcmVjdGl2ZSddXG59LCBQcmlzbS5sYW5ndWFnZXMuYXNwbmV0LnRhZy5pbnNpZGVbJ2F0dHItdmFsdWUnXSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2FzcG5ldCcsICdjb21tZW50Jywge1xuXHQnYXNwLWNvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLzwlLS1bXFxzXFxTXSo/LS0lPi8sXG5cdFx0YWxpYXM6IFsnYXNwJywgJ2NvbW1lbnQnXVxuXHR9XG59KTtcblxuLy8gc2NyaXB0IHJ1bmF0PVwic2VydmVyXCIgY29udGFpbnMgY3NoYXJwLCBub3QgamF2YXNjcmlwdFxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnYXNwbmV0JywgUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHQgPyAnc2NyaXB0JyA6ICd0YWcnLCB7XG5cdCdhc3Atc2NyaXB0Jzoge1xuXHRcdHBhdHRlcm46IC8oPHNjcmlwdCg/PS4qcnVuYXQ9WydcIl0/c2VydmVyXFxiKVtePl0qPilbXFxzXFxTXSo/KD89PFxcL3NjcmlwdD4pL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogWydhc3AnLCAnc2NyaXB0J10sXG5cdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuY3NoYXJwIHx8IHt9XG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuYXNtNjUwMiA9IHtcblx0J2NvbW1lbnQnOiAvOy4qLyxcblx0J2RpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFwuXFx3Kyg/PSApLyxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXHQnc3RyaW5nJzogLyhbXCInYF0pKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdCdvcC1jb2RlJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpBREN8QU5EfEFTTHxCQ0N8QkNTfEJFUXxCSVR8Qk1JfEJORXxCUEx8QlJLfEJWQ3xCVlN8Q0xDfENMRHxDTEl8Q0xWfENNUHxDUFh8Q1BZfERFQ3xERVh8REVZfEVPUnxJTkN8SU5YfElOWXxKTVB8SlNSfExEQXxMRFh8TERZfExTUnxOT1B8T1JBfFBIQXxQSFB8UExBfFBMUHxST0x8Uk9SfFJUSXxSVFN8U0JDfFNFQ3xTRUR8U0VJfFNUQXxTVFh8U1RZfFRBWHxUQVl8VFNYfFRYQXxUWFN8VFlBfGFkY3xhbmR8YXNsfGJjY3xiY3N8YmVxfGJpdHxibWl8Ym5lfGJwbHxicmt8YnZjfGJ2c3xjbGN8Y2xkfGNsaXxjbHZ8Y21wfGNweHxjcHl8ZGVjfGRleHxkZXl8ZW9yfGluY3xpbnh8aW55fGptcHxqc3J8bGRhfGxkeHxsZHl8bHNyfG5vcHxvcmF8cGhhfHBocHxwbGF8cGxwfHJvbHxyb3J8cnRpfHJ0c3xzYmN8c2VjfHNlZHxzZWl8c3RhfHN0eHxzdHl8dGF4fHRheXx0c3h8dHhhfHR4c3x0eWEpXFxiLyxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdoZXgtbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8jP1xcJFtcXGRhLWZdezEsNH1cXGIvaSxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblx0J2JpbmFyeS1udW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyM/JVswMV0rXFxiLyxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblx0J2RlY2ltYWwtbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8jP1xcYlxcZCtcXGIvLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQncmVnaXN0ZXInOiB7XG5cdFx0cGF0dGVybjogL1xcYlt4eWFdXFxiL2ksXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fSxcblx0J3B1bmN0dWF0aW9uJzogL1soKSw6XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5hc21hdG1lbCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLzsuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhbXCInYF0pKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2NvbnN0YW50JzogL1xcYig/OlBPUlRbQS1aXXxERFJbQS1aXXwoPzpERHxQKVtBLVpdKD86XFxkfFswLTJdXFxkfDNbMDFdKSlcXGIvLFxuXG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogL1xcLlxcdysoPz0gKS8sXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblx0J3ItcmVnaXN0ZXInOiB7XG5cdFx0cGF0dGVybjogL1xcYnIoPzpcXGR8WzEyXVxcZHwzWzAxXSlcXGIvLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH0sXG5cdCdvcC1jb2RlJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpBREN8QUREfEFESVd8QU5EfEFOREl8QVNSfEJDTFJ8QkxEfEJSQkN8QlJCU3xCUkNDfEJSQ1N8QlJFQUt8QlJFUXxCUkdFfEJSSEN8QlJIU3xCUklEfEJSSUV8QlJMT3xCUkxUfEJSTUl8QlJORXxCUlBMfEJSU0h8QlJUQ3xCUlRTfEJSVkN8QlJWU3xCU0VUfEJTVHxDQUxMfENCSXxDQlJ8Q0xDfENMSHxDTEl8Q0xOfENMUnxDTFN8Q0xUfENMVnxDTFp8Q09NfENQfENQQ3xDUEl8Q1BTRXxERUN8REVTfEVJQ0FMTHxFSUpNUHxFTFBNfEVPUnxGTVVMfEZNVUxTfEZNVUxTVXxJQ0FMTHxJSk1QfElOfElOQ3xKTVB8TEFDfExBU3xMQVR8TER8TERbQS1aYS16MC05XXxMUE18TFNMfExTUnxNT1Z8TU9WV3xNVUx8TVVMU3xNVUxTVXxORUd8Tk9QfE9SfE9SSXxPVVR8UE9QfFBVU0h8UkNBTEx8UkVUfFJFVEl8UkpNUHxST0x8Uk9SfFNCQ3xTQkNJfFNCSXxTQklDfFNCSVN8U0JJV3xTQlJ8U0JSQ3xTQlJTfFNFQ3xTRUh8U0VJfFNFTnxTRVJ8U0VTfFNFVHxTRVZ8U0VafFNMRUVQfFNQTXxTVHxTVFtBLVowLTldfFNVQnxTVUJJfFNXQVB8VFNUfFdEUnxYQ0h8YWRjfGFkZHxhZGl3fGFuZHxhbmRpfGFzcnxiY2xyfGJsZHxicmJjfGJyYnN8YnJjY3xicmNzfGJyZWFrfGJyZXF8YnJnZXxicmhjfGJyaHN8YnJpZHxicmllfGJybG98YnJsdHxicm1pfGJybmV8YnJwbHxicnNofGJydGN8YnJ0c3xicnZjfGJydnN8YnNldHxic3R8Y2FsbHxjYml8Y2JyfGNsY3xjbGh8Y2xpfGNsbnxjbHJ8Y2xzfGNsdHxjbHZ8Y2x6fGNvbXxjcHxjcGN8Y3BpfGNwc2V8ZGVjfGRlc3xlaWNhbGx8ZWlqbXB8ZWxwbXxlb3J8Zm11bHxmbXVsc3xmbXVsc3V8aWNhbGx8aWptcHxpbnxpbmN8am1wfGxhY3xsYXN8bGF0fGxkfGxkW2EtejAtOV18bHBtfGxzbHxsc3J8bW92fG1vdnd8bXVsfG11bHN8bXVsc3V8bmVnfG5vcHxvcnxvcml8b3V0fHBvcHxwdXNofHJjYWxsfHJldHxyZXRpfHJqbXB8cm9sfHJvcnxzYmN8c2JjaXxzYml8c2JpY3xzYmlzfHNiaXd8c2JyfHNicmN8c2Jyc3xzZWN8c2VofHNlaXxzZW58c2VyfHNlc3xzZXR8c2V2fHNlenxzbGVlcHxzcG18c3R8c3RbYS16QS1aMC05XXxzdWJ8c3ViaXxzd2FwfHRzdHx3ZHJ8eGNoKVxcYi8sXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnaGV4LW51bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvIz9cXCRbXFxkYS1mXXsyLDR9XFxiL2ksXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdCdiaW5hcnktbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8jPyVbMDFdK1xcYi8sXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdCdkZWNpbWFsLW51bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvIz9cXGJcXGQrXFxiLyxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblx0J3JlZ2lzdGVyJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbYWN6bnZzaHRpeHldXFxiL2ksXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fSxcblx0J29wZXJhdG9yJzogLz4+PT98PDw9P3wmWyY9XT98XFx8W1xcfD1dP3xbLSsqLyVeIT08Pj9dPT8vLFxuXHQncHVuY3R1YXRpb24nOiAvWygpLDpdL1xufTtcblxuLy8gTk9URVMgLSBmb2xsb3dzIGZpcnN0LWZpcnN0IGhpZ2hsaWdodCBtZXRob2QsIGJsb2NrIGlzIGxvY2tlZCBhZnRlciBoaWdobGlnaHQsIGRpZmZlcmVudCBmcm9tIFN5bnRheEhsXG5QcmlzbS5sYW5ndWFnZXMuYXV0b2hvdGtleSA9IHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFxccyk7LiovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKilcXC9cXCooPzpbXFxyXFxuXSg/IVsgXFx0XSpcXCpcXC8pfFteXFxyXFxuXSkqKD86W1xcclxcbl1bIFxcdF0qXFwqXFwvKT8vbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cdCd0YWcnOiB7XG5cdFx0Ly8gbGFiZWxzXG5cdFx0cGF0dGVybjogL14oWyBcXHRdKilbXlxccyxgXCI6XSsoPz06WyBcXHRdKiQpL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzogL1wiKD86W15cIlxcblxccl18XCJcIikqXCIvLFxuXHQndmFyaWFibGUnOiAvJVxcdyslLyxcblx0J251bWJlcic6IC9cXGIweFtcXGRBLUZhLWZdK1xcYnwoPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86W0VlXS0/XFxkKyk/Lyxcblx0J29wZXJhdG9yJzogL1xcP3xcXC9cXC8/PT98Oj18XFx8Wz18XT98Jls9Jl0/fFxcK1s9K10/fC1bPS1dP3xcXCpbPSpdP3w8KD86PD0/fD58PSk/fD4+Pz0/fFsuXiE9fl09P3xcXGIoPzpBTkR8Tk9UfE9SKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblxuXHQnY29tbWFuZCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86QXV0b1RyaW18QmxvY2tJbnB1dHxCcmVha3xDbGlja3xDbGlwV2FpdHxDb250aW51ZXxDb250cm9sfENvbnRyb2xDbGlja3xDb250cm9sRm9jdXN8Q29udHJvbEdldHxDb250cm9sR2V0Rm9jdXN8Q29udHJvbEdldFBvc3xDb250cm9sR2V0VGV4dHxDb250cm9sTW92ZXxDb250cm9sU2VuZHxDb250cm9sU2VuZFJhd3xDb250cm9sU2V0VGV4dHxDb29yZE1vZGV8Q3JpdGljYWx8RGV0ZWN0SGlkZGVuVGV4dHxEZXRlY3RIaWRkZW5XaW5kb3dzfERyaXZlfERyaXZlR2V0fERyaXZlU3BhY2VGcmVlfEVudkFkZHxFbnZEaXZ8RW52R2V0fEVudk11bHR8RW52U2V0fEVudlN1YnxFbnZVcGRhdGV8RXhpdHxFeGl0QXBwfEZpbGVBcHBlbmR8RmlsZUNvcHl8RmlsZUNvcHlEaXJ8RmlsZUNyZWF0ZURpcnxGaWxlQ3JlYXRlU2hvcnRjdXR8RmlsZURlbGV0ZXxGaWxlRW5jb2Rpbmd8RmlsZUdldEF0dHJpYnxGaWxlR2V0U2hvcnRjdXR8RmlsZUdldFNpemV8RmlsZUdldFRpbWV8RmlsZUdldFZlcnNpb258RmlsZUluc3RhbGx8RmlsZU1vdmV8RmlsZU1vdmVEaXJ8RmlsZVJlYWR8RmlsZVJlYWRMaW5lfEZpbGVSZWN5Y2xlfEZpbGVSZWN5Y2xlRW1wdHl8RmlsZVJlbW92ZURpcnxGaWxlU2VsZWN0RmlsZXxGaWxlU2VsZWN0Rm9sZGVyfEZpbGVTZXRBdHRyaWJ8RmlsZVNldFRpbWV8Rm9ybWF0VGltZXxHZXRLZXlTdGF0ZXxHb3N1YnxHb3RvfEdyb3VwQWN0aXZhdGV8R3JvdXBBZGR8R3JvdXBDbG9zZXxHcm91cERlYWN0aXZhdGV8R3VpfEd1aUNvbnRyb2x8R3VpQ29udHJvbEdldHxIb3RrZXl8SW1hZ2VTZWFyY2h8SW5pRGVsZXRlfEluaVJlYWR8SW5pV3JpdGV8SW5wdXR8SW5wdXRCb3h8S2V5V2FpdHxMaXN0SG90a2V5c3xMaXN0TGluZXN8TGlzdFZhcnN8TG9vcHxNZW51fE1vdXNlQ2xpY2t8TW91c2VDbGlja0RyYWd8TW91c2VHZXRQb3N8TW91c2VNb3ZlfE1zZ0JveHxPbkV4aXR8T3V0cHV0RGVidWd8UGF1c2V8UGl4ZWxHZXRDb2xvcnxQaXhlbFNlYXJjaHxQb3N0TWVzc2FnZXxQcm9jZXNzfFByb2dyZXNzfFJhbmRvbXxSZWdEZWxldGV8UmVnUmVhZHxSZWdXcml0ZXxSZWxvYWR8UmVwZWF0fFJldHVybnxSdW58UnVuQXN8UnVuV2FpdHxTZW5kfFNlbmRFdmVudHxTZW5kSW5wdXR8U2VuZE1lc3NhZ2V8U2VuZE1vZGV8U2VuZFBsYXl8U2VuZFJhd3xTZXRCYXRjaExpbmVzfFNldENhcHNsb2NrU3RhdGV8U2V0Q29udHJvbERlbGF5fFNldERlZmF1bHRNb3VzZVNwZWVkfFNldEVudnxTZXRGb3JtYXR8U2V0S2V5RGVsYXl8U2V0TW91c2VEZWxheXxTZXROdW1sb2NrU3RhdGV8U2V0UmVnVmlld3xTZXRTY3JvbGxMb2NrU3RhdGV8U2V0U3RvcmVDYXBzbG9ja01vZGV8U2V0VGltZXJ8U2V0VGl0bGVNYXRjaE1vZGV8U2V0V2luRGVsYXl8U2V0V29ya2luZ0RpcnxTaHV0ZG93bnxTbGVlcHxTb3J0fFNvdW5kQmVlcHxTb3VuZEdldHxTb3VuZEdldFdhdmVWb2x1bWV8U291bmRQbGF5fFNvdW5kU2V0fFNvdW5kU2V0V2F2ZVZvbHVtZXxTcGxhc2hJbWFnZXxTcGxhc2hUZXh0T2ZmfFNwbGFzaFRleHRPbnxTcGxpdFBhdGh8U3RhdHVzQmFyR2V0VGV4dHxTdGF0dXNCYXJXYWl0fFN0cmluZ0Nhc2VTZW5zZXxTdHJpbmdHZXRQb3N8U3RyaW5nTGVmdHxTdHJpbmdMZW58U3RyaW5nTG93ZXJ8U3RyaW5nTWlkfFN0cmluZ1JlcGxhY2V8U3RyaW5nUmlnaHR8U3RyaW5nU3BsaXR8U3RyaW5nVHJpbUxlZnR8U3RyaW5nVHJpbVJpZ2h0fFN0cmluZ1VwcGVyfFN1c3BlbmR8U3lzR2V0fFRocmVhZHxUb29sVGlwfFRyYW5zZm9ybXxUcmF5VGlwfFVSTERvd25sb2FkVG9GaWxlfFdpbkFjdGl2YXRlfFdpbkFjdGl2YXRlQm90dG9tfFdpbkNsb3NlfFdpbkdldHxXaW5HZXRBY3RpdmVTdGF0c3xXaW5HZXRBY3RpdmVUaXRsZXxXaW5HZXRDbGFzc3xXaW5HZXRQb3N8V2luR2V0VGV4dHxXaW5HZXRUaXRsZXxXaW5IaWRlfFdpbktpbGx8V2luTWF4aW1pemV8V2luTWVudVNlbGVjdEl0ZW18V2luTWluaW1pemV8V2luTWluaW1pemVBbGx8V2luTWluaW1pemVBbGxVbmRvfFdpbk1vdmV8V2luUmVzdG9yZXxXaW5TZXR8V2luU2V0VGl0bGV8V2luU2hvd3xXaW5XYWl0fFdpbldhaXRBY3RpdmV8V2luV2FpdENsb3NlfFdpbldhaXROb3RBY3RpdmUpXFxiL2ksXG5cdFx0YWxpYXM6ICdzZWxlY3Rvcidcblx0fSxcblxuXHQnY29uc3RhbnQnOiAvXFxiKD86YV9haGtwYXRofGFfYWhrdmVyc2lvbnxhX2FwcGRhdGF8YV9hcHBkYXRhY29tbW9ufGFfYXV0b3RyaW18YV9iYXRjaGxpbmVzfGFfY2FyZXR4fGFfY2FyZXR5fGFfY29tcHV0ZXJuYW1lfGFfY29udHJvbGRlbGF5fGFfY3Vyc29yfGFfZGR8YV9kZGR8YV9kZGRkfGFfZGVmYXVsdG1vdXNlc3BlZWR8YV9kZXNrdG9wfGFfZGVza3RvcGNvbW1vbnxhX2RldGVjdGhpZGRlbnRleHR8YV9kZXRlY3RoaWRkZW53aW5kb3dzfGFfZW5kY2hhcnxhX2V2ZW50aW5mb3xhX2V4aXRyZWFzb258YV9maWxlZW5jb2Rpbmd8YV9mb3JtYXRmbG9hdHxhX2Zvcm1hdGludGVnZXJ8YV9ndWl8YV9ndWljb250cm9sfGFfZ3VpY29udHJvbGV2ZW50fGFfZ3VpZXZlbnR8YV9ndWloZWlnaHR8YV9ndWl3aWR0aHxhX2d1aXh8YV9ndWl5fGFfaG91cnxhX2ljb25maWxlfGFfaWNvbmhpZGRlbnxhX2ljb25udW1iZXJ8YV9pY29udGlwfGFfaW5kZXh8YV9pcGFkZHJlc3MxfGFfaXBhZGRyZXNzMnxhX2lwYWRkcmVzczN8YV9pcGFkZHJlc3M0fGFfaXM2NGJpdG9zfGFfaXNhZG1pbnxhX2lzY29tcGlsZWR8YV9pc2NyaXRpY2FsfGFfaXNwYXVzZWR8YV9pc3N1c3BlbmRlZHxhX2lzdW5pY29kZXxhX2tleWRlbGF5fGFfbGFuZ3VhZ2V8YV9sYXN0ZXJyb3J8YV9saW5lZmlsZXxhX2xpbmVudW1iZXJ8YV9sb29wZmllbGR8YV9sb29wZmlsZWF0dHJpYnxhX2xvb3BmaWxlZGlyfGFfbG9vcGZpbGVleHR8YV9sb29wZmlsZWZ1bGxwYXRofGFfbG9vcGZpbGVsb25ncGF0aHxhX2xvb3BmaWxlbmFtZXxhX2xvb3BmaWxlc2hvcnRuYW1lfGFfbG9vcGZpbGVzaG9ydHBhdGh8YV9sb29wZmlsZXNpemV8YV9sb29wZmlsZXNpemVrYnxhX2xvb3BmaWxlc2l6ZW1ifGFfbG9vcGZpbGV0aW1lYWNjZXNzZWR8YV9sb29wZmlsZXRpbWVjcmVhdGVkfGFfbG9vcGZpbGV0aW1lbW9kaWZpZWR8YV9sb29wcmVhZGxpbmV8YV9sb29wcmVna2V5fGFfbG9vcHJlZ25hbWV8YV9sb29wcmVnc3Via2V5fGFfbG9vcHJlZ3RpbWVtb2RpZmllZHxhX2xvb3ByZWd0eXBlfGFfbWRheXxhX21pbnxhX21tfGFfbW1tfGFfbW1tbXxhX21vbnxhX21vdXNlZGVsYXl8YV9tc2VjfGFfbXlkb2N1bWVudHN8YV9ub3d8YV9ub3d1dGN8YV9udW1iYXRjaGxpbmVzfGFfb3N0eXBlfGFfb3N2ZXJzaW9ufGFfcHJpb3Job3RrZXl8YV9wcmlvcmtleXxhX3Byb2dyYW1maWxlc3xhX3Byb2dyYW1zfGFfcHJvZ3JhbXNjb21tb258YV9wdHJzaXplfGFfcmVndmlld3xhX3NjcmVlbmRwaXxhX3NjcmVlbmhlaWdodHxhX3NjcmVlbndpZHRofGFfc2NyaXB0ZGlyfGFfc2NyaXB0ZnVsbHBhdGh8YV9zY3JpcHRod25kfGFfc2NyaXB0bmFtZXxhX3NlY3xhX3NwYWNlfGFfc3RhcnRtZW51fGFfc3RhcnRtZW51Y29tbW9ufGFfc3RhcnR1cHxhX3N0YXJ0dXBjb21tb258YV9zdHJpbmdjYXNlc2Vuc2V8YV90YWJ8YV90ZW1wfGFfdGhpc2Z1bmN8YV90aGlzaG90a2V5fGFfdGhpc2xhYmVsfGFfdGhpc21lbnV8YV90aGlzbWVudWl0ZW18YV90aGlzbWVudWl0ZW1wb3N8YV90aWNrY291bnR8YV90aW1laWRsZXxhX3RpbWVpZGxlcGh5c2ljYWx8YV90aW1lc2luY2VwcmlvcmhvdGtleXxhX3RpbWVzaW5jZXRoaXNob3RrZXl8YV90aXRsZW1hdGNobW9kZXxhX3RpdGxlbWF0Y2htb2Rlc3BlZWR8YV91c2VybmFtZXxhX3dkYXl8YV93aW5kZWxheXxhX3dpbmRpcnxhX3dvcmtpbmdkaXJ8YV95ZGF5fGFfeWVhcnxhX3l3ZWVrfGFfeXl5eXxjbGlwYm9hcmR8Y2xpcGJvYXJkYWxsfGNvbXNwZWN8ZXJyb3JsZXZlbHxwcm9ncmFtZmlsZXMpXFxiL2ksXG5cblx0J2J1aWx0aW4nOiAvXFxiKD86YWJzfGFjb3N8YXNjfGFzaW58YXRhbnxjZWlsfGNocnxjbGFzc3xjb21vYmphY3RpdmV8Y29tb2JqYXJyYXl8Y29tb2JqY29ubmVjdHxjb21vYmpjcmVhdGV8Y29tb2JqZXJyb3J8Y29tb2JqZmxhZ3N8Y29tb2JqZ2V0fGNvbW9ianF1ZXJ5fGNvbW9ianR5cGV8Y29tb2JqdmFsdWV8Y29zfGRsbGNhbGx8ZXhwfGZpbGVleGlzdHxGaWxlb3BlbnxmbG9vcnxmb3JtYXR8aWxfYWRkfGlsX2NyZWF0ZXxpbF9kZXN0cm95fGluc3RyfGlzZnVuY3xpc2xhYmVsfElzT2JqZWN0fGxufGxvZ3xsdHJpbXxsdl9hZGR8bHZfZGVsZXRlfGx2X2RlbGV0ZWNvbHxsdl9nZXRjb3VudHxsdl9nZXRuZXh0fGx2X2dldHRleHR8bHZfaW5zZXJ0fGx2X2luc2VydGNvbHxsdl9tb2RpZnl8bHZfbW9kaWZ5Y29sfGx2X3NldGltYWdlbGlzdHxtb2R8bnVtZ2V0fG51bXB1dHxvbm1lc3NhZ2V8cmVnZXhtYXRjaHxyZWdleHJlcGxhY2V8cmVnaXN0ZXJjYWxsYmFja3xyb3VuZHxydHJpbXxzYl9zZXRpY29ufHNiX3NldHBhcnRzfHNiX3NldHRleHR8c2lufHNxcnR8c3RybGVufHN0cnJlcGxhY2V8c3Ryc3BsaXR8c3Vic3RyfHRhbnx0dl9hZGR8dHZfZGVsZXRlfHR2X2dldHx0dl9nZXRjaGlsZHx0dl9nZXRjb3VudHx0dl9nZXRuZXh0fHR2X2dldHBhcmVudHx0dl9nZXRwcmV2fHR2X2dldHNlbGVjdGlvbnx0dl9nZXR0ZXh0fHR2X21vZGlmeXx2YXJzZXRjYXBhY2l0eXx3aW5hY3RpdmV8d2luZXhpc3R8X19DYWxsfF9fR2V0fF9fTmV3fF9fU2V0KVxcYi9pLFxuXG5cdCdzeW1ib2wnOiAvXFxiKD86YWx0fGFsdGRvd258YWx0dXB8YXBwc2tleXxiYWNrc3BhY2V8YnJvd3Nlcl9iYWNrfGJyb3dzZXJfZmF2b3JpdGVzfGJyb3dzZXJfZm9yd2FyZHxicm93c2VyX2hvbWV8YnJvd3Nlcl9yZWZyZXNofGJyb3dzZXJfc2VhcmNofGJyb3dzZXJfc3RvcHxic3xjYXBzbG9ja3xjdHJsfGN0cmxicmVha3xjdHJsZG93bnxjdHJsdXB8ZGVsfGRlbGV0ZXxkb3dufGVuZHxlbnRlcnxlc2N8ZXNjYXBlfGYxfGYxMHxmMTF8ZjEyfGYxM3xmMTR8ZjE1fGYxNnxmMTd8ZjE4fGYxOXxmMnxmMjB8ZjIxfGYyMnxmMjN8ZjI0fGYzfGY0fGY1fGY2fGY3fGY4fGY5fGhvbWV8aW5zfGluc2VydHxqb3kxfGpveTEwfGpveTExfGpveTEyfGpveTEzfGpveTE0fGpveTE1fGpveTE2fGpveTE3fGpveTE4fGpveTE5fGpveTJ8am95MjB8am95MjF8am95MjJ8am95MjN8am95MjR8am95MjV8am95MjZ8am95Mjd8am95Mjh8am95Mjl8am95M3xqb3kzMHxqb3kzMXxqb3kzMnxqb3k0fGpveTV8am95Nnxqb3k3fGpveTh8am95OXxqb3lheGVzfGpveWJ1dHRvbnN8am95aW5mb3xqb3luYW1lfGpveXBvdnxqb3lyfGpveXV8am95dnxqb3l4fGpveXl8am95enxsYWx0fGxhdW5jaF9hcHAxfGxhdW5jaF9hcHAyfGxhdW5jaF9tYWlsfGxhdW5jaF9tZWRpYXxsYnV0dG9ufGxjb250cm9sfGxjdHJsfGxlZnR8bHNoaWZ0fGx3aW58bHdpbmRvd258bHdpbnVwfG1idXR0b258bWVkaWFfbmV4dHxtZWRpYV9wbGF5X3BhdXNlfG1lZGlhX3ByZXZ8bWVkaWFfc3RvcHxudW1sb2NrfG51bXBhZDB8bnVtcGFkMXxudW1wYWQyfG51bXBhZDN8bnVtcGFkNHxudW1wYWQ1fG51bXBhZDZ8bnVtcGFkN3xudW1wYWQ4fG51bXBhZDl8bnVtcGFkYWRkfG51bXBhZGNsZWFyfG51bXBhZGRlbHxudW1wYWRkaXZ8bnVtcGFkZG90fG51bXBhZGRvd258bnVtcGFkZW5kfG51bXBhZGVudGVyfG51bXBhZGhvbWV8bnVtcGFkaW5zfG51bXBhZGxlZnR8bnVtcGFkbXVsdHxudW1wYWRwZ2RufG51bXBhZHBndXB8bnVtcGFkcmlnaHR8bnVtcGFkc3VifG51bXBhZHVwfHBnZG58cGd1cHxwcmludHNjcmVlbnxyYWx0fHJidXR0b258cmNvbnRyb2x8cmN0cmx8cmlnaHR8cnNoaWZ0fHJ3aW58cndpbmRvd258cndpbnVwfHNjcm9sbGxvY2t8c2hpZnR8c2hpZnRkb3dufHNoaWZ0dXB8c3BhY2V8dGFifHVwfHZvbHVtZV9kb3dufHZvbHVtZV9tdXRlfHZvbHVtZV91cHx3aGVlbGRvd258d2hlZWxsZWZ0fHdoZWVscmlnaHR8d2hlZWx1cHx4YnV0dG9uMXx4YnV0dG9uMilcXGIvaSxcblxuXHQnZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC8jW2Etel0rXFxiL2ksXG5cdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdH0sXG5cblx0J2tleXdvcmQnOiAvXFxiKD86QWJvcnR8QWJvdmVOb3JtYWx8QWRkfGFoa19jbGFzc3xhaGtfZXhlfGFoa19ncm91cHxhaGtfaWR8YWhrX3BpZHxBbGx8QWxudW18QWxwaGF8QWx0U3VibWl0fEFsdFRhYnxBbHRUYWJBbmRNZW51fEFsdFRhYk1lbnV8QWx0VGFiTWVudURpc21pc3N8QWx3YXlzT25Ub3B8QXV0b1NpemV8QmFja2dyb3VuZHxCYWNrZ3JvdW5kVHJhbnN8QmVsb3dOb3JtYWx8YmV0d2VlbnxCaXRBbmR8Qml0Tm90fEJpdE9yfEJpdFNoaWZ0TGVmdHxCaXRTaGlmdFJpZ2h0fEJpdFhPcnxCb2xkfEJvcmRlcnxCdXR0b258QnlSZWZ8Q2F0Y2h8Q2hlY2tib3h8Q2hlY2tlZHxDaGVja2VkR3JheXxDaG9vc2V8Q2hvb3NlU3RyaW5nfENsb3NlfENvbG9yfENvbWJvQm94fENvbnRhaW5zfENvbnRyb2xMaXN0fENvdW50fERhdGV8RGF0ZVRpbWV8RGF5c3xEREx8RGVmYXVsdHxEZWxldGVBbGx8RGVsaW1pdGVyfERlcmVmfERlc3Ryb3l8RGlnaXR8RGlzYWJsZXxEaXNhYmxlZHxEcm9wRG93bkxpc3R8RWRpdHxFamVjdHxFbHNlfEVuYWJsZXxFbmFibGVkfEVycm9yfEV4aXN0fEV4cGFuZHxFeFN0eWxlfEZpbGVTeXN0ZW18RmluYWxseXxGaXJzdHxGbGFzaHxGbG9hdHxGbG9hdEZhc3R8Rm9jdXN8Rm9udHxmb3J8Z2xvYmFsfEdyaWR8R3JvdXB8R3JvdXBCb3h8R3VpQ2xvc2V8R3VpQ29udGV4dE1lbnV8R3VpRHJvcEZpbGVzfEd1aUVzY2FwZXxHdWlTaXplfEhkcnxIaWRkZW58SGlkZXxIaWdofEhLQ0N8SEtDUnxIS0NVfEhLRVlfQ0xBU1NFU19ST09UfEhLRVlfQ1VSUkVOVF9DT05GSUd8SEtFWV9DVVJSRU5UX1VTRVJ8SEtFWV9MT0NBTF9NQUNISU5FfEhLRVlfVVNFUlN8SEtMTXxIS1V8SG91cnN8SFNjcm9sbHxJY29ufEljb25TbWFsbHxJRHxJRExhc3R8SWZ8SWZFcXVhbHxJZkV4aXN0fElmR3JlYXRlcnxJZkdyZWF0ZXJPckVxdWFsfElmSW5TdHJpbmd8SWZMZXNzfElmTGVzc09yRXF1YWx8SWZNc2dCb3h8SWZOb3RFcXVhbHxJZk5vdEV4aXN0fElmTm90SW5TdHJpbmd8SWZXaW5BY3RpdmV8SWZXaW5FeGlzdHxJZldpbk5vdEFjdGl2ZXxJZldpbk5vdEV4aXN0fElnbm9yZXxJbWFnZUxpc3R8aW58SW50ZWdlcnxJbnRlZ2VyRmFzdHxJbnRlcnJ1cHR8aXN8aXRhbGljfEpvaW58TGFiZWx8TGFzdEZvdW5kfExhc3RGb3VuZEV4aXN0fExpbWl0fExpbmVzfExpc3R8TGlzdEJveHxMaXN0Vmlld3xsb2NhbHxMb2NrfExvZ29mZnxMb3d8TG93ZXJ8TG93ZXJjYXNlfE1haW5XaW5kb3d8TWFyZ2lufE1heGltaXplfE1heGltaXplQm94fE1heFNpemV8TWluaW1pemV8TWluaW1pemVCb3h8TWluTWF4fE1pblNpemV8TWludXRlc3xNb250aENhbHxNb3VzZXxNb3ZlfE11bHRpfE5BfE5vfE5vQWN0aXZhdGV8Tm9EZWZhdWx0fE5vSGlkZXxOb0ljb258Tm9NYWluV2luZG93fG5vcm18Tm9ybWFsfE5vU29ydHxOb1NvcnRIZHJ8Tm9TdGFuZGFyZHxOb3R8Tm9UYWJ8Tm9UaW1lcnN8TnVtYmVyfE9mZnxPa3xPbnxPd25EaWFsb2dzfE93bmVyfFBhcnNlfFBhc3N3b3JkfFBpY3R1cmV8UGl4ZWx8UG9zfFBvd3xQcmlvcml0eXxQcm9jZXNzTmFtZXxSYWRpb3xSYW5nZXxSZWFkfFJlYWRPbmx5fFJlYWx0aW1lfFJlZHJhd3xSZWdpb258UkVHX0JJTkFSWXxSRUdfRFdPUkR8UkVHX0VYUEFORF9TWnxSRUdfTVVMVElfU1p8UkVHX1NafFJlbGF0aXZlfFJlbmFtZXxSZXBvcnR8UmVzaXplfFJlc3RvcmV8UmV0cnl8UkdCfFNjcmVlbnxTZWNvbmRzfFNlY3Rpb258U2VyaWFsfFNldExhYmVsfFNoaWZ0QWx0VGFifFNob3d8U2luZ2xlfFNsaWRlcnxTb3J0RGVzY3xTdGFuZGFyZHxzdGF0aWN8U3RhdHVzfFN0YXR1c0JhcnxTdGF0dXNDRHxzdHJpa2V8U3R5bGV8U3VibWl0fFN5c01lbnV8VGFiMnxUYWJTdG9wfFRleHR8VGhlbWV8VGhyb3d8VGlsZXxUb2dnbGVDaGVja3xUb2dnbGVFbmFibGV8VG9vbFdpbmRvd3xUb3B8VG9wbW9zdHxUcmFuc0NvbG9yfFRyYW5zcGFyZW50fFRyYXl8VHJlZVZpZXd8VHJ5fFRyeUFnYWlufFR5cGV8VW5DaGVja3x1bmRlcmxpbmV8VW5pY29kZXxVbmxvY2t8VW50aWx8VXBEb3dufFVwcGVyfFVwcGVyY2FzZXxVc2VFcnJvckxldmVsfFZpc3xWaXNGaXJzdHxWaXNpYmxlfFZTY3JvbGx8V2FpdHxXYWl0Q2xvc2V8V2FudEN0cmxBfFdhbnRGMnxXYW50UmV0dXJufFdoaWxlfFdyYXB8WGRpZ2l0fHhtfHhwfHhzfFllc3x5bXx5cHx5cylcXGIvaSxcblx0J2Z1bmN0aW9uJzogL1teKCk7IFxcdCxcXG4rKlxcLT0/PjpcXFxcXFwvPCYlXFxbXFxdXSsoPz1cXCgpLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF0oKTosXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5hdXRvaXQgPSB7XG5cdCdjb21tZW50JzogW1xuXHRcdC87LiovLFxuXHRcdHtcblx0XHRcdC8vIFRoZSBtdWx0aS1saW5lIGNvbW1lbnRzIGRlbGltaXRlcnMgY2FuIGFjdHVhbGx5IGJlIGNvbW1lbnRlZCBvdXQgd2l0aCBcIjtcIlxuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKikjKD86Y29tbWVudHMtc3RhcnR8Y3MpW1xcc1xcU10qP15bIFxcdF0qIyg/OmNlfGNvbW1lbnRzLWVuZCkvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCd1cmwnOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKiNpbmNsdWRlXFxzKykoPzo8W15cXHJcXG4+XSs+fFwiW15cXHJcXG5cIl0rXCIpL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oW1wiJ10pKD86XFwxXFwxfCg/IVxcMSlbXlxcclxcbl0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3ZhcmlhYmxlJzogLyhbJSRAXSlcXHcrXFwxL1xuXHRcdH1cblx0fSxcblx0J2RpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSNbXFx3LV0rL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdmdW5jdGlvbic6IC9cXGJcXHcrKD89XFwoKS8sXG5cdC8vIFZhcmlhYmxlcyBhbmQgbWFjcm9zXG5cdCd2YXJpYWJsZSc6IC9bJEBdXFx3Ky8sXG5cdCdrZXl3b3JkJzogL1xcYig/OkNhc2V8Q29uc3R8Q29udGludWUoPzpDYXNlfExvb3ApfERlZmF1bHR8RGltfERvfEVsc2UoPzpJZik/fEVuZCg/OkZ1bmN8SWZ8U2VsZWN0fFN3aXRjaHxXaXRoKXxFbnVtfEV4aXQoPzpMb29wKT98Rm9yfEZ1bmN8R2xvYmFsfElmfElufExvY2FsfE5leHR8TnVsbHxSZURpbXxTZWxlY3R8U3RhdGljfFN0ZXB8U3dpdGNofFRoZW58VG98VW50aWx8Vm9sYXRpbGV8V0VuZHxXaGlsZXxXaXRoKVxcYi9pLFxuXHQnbnVtYmVyJzogL1xcYig/OjB4W1xcZGEtZl0rfFxcZCsoPzpcXC5cXGQrKT8oPzplWystXT9cXGQrKT8pXFxiL2ksXG5cdCdib29sZWFuJzogL1xcYig/OkZhbHNlfFRydWUpXFxiL2ksXG5cdCdvcGVyYXRvcic6IC88Wz0+XT98Wy0rKlxcLz0mPl09P3xbP15dfFxcYig/OkFuZHxOb3R8T3IpXFxiL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxdKCkuLDpdL1xufTtcblxuLy8gaHR0cDovL2F2aXN5bnRoLm5sL2luZGV4LnBocC9UaGVfZnVsbF9BdmlTeW50aF9ncmFtbWFyXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0ZnVuY3Rpb24gcmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudHMpIHtcblx0XHRyZXR1cm4gcGF0dGVybi5yZXBsYWNlKC88PChcXGQrKT4+L2csIGZ1bmN0aW9uIChtLCBpbmRleCkge1xuXHRcdFx0cmV0dXJuIHJlcGxhY2VtZW50c1sraW5kZXhdO1xuXHRcdH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gcmUocGF0dGVybiwgcmVwbGFjZW1lbnRzLCBmbGFncykge1xuXHRcdHJldHVybiBSZWdFeHAocmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudHMpLCBmbGFncyB8fCAnJyk7XG5cdH1cblxuXHR2YXIgdHlwZXMgPSAvYm9vbHxjbGlwfGZsb2F0fGludHxzdHJpbmd8dmFsLy5zb3VyY2U7XG5cdHZhciBpbnRlcm5hbHMgPSBbXG5cdFx0Ly8gYm9vbHNcblx0XHQvaXMoPzpib29sfGNsaXB8ZmxvYXR8aW50fHN0cmluZyl8ZGVmaW5lZHwoPzooPzppbnRlcm5hbCk/ZnVuY3Rpb258dmFyKT9leGlzdHM/Ly5zb3VyY2UsXG5cdFx0Ly8gY29udHJvbFxuXHRcdC9hcHBseXxhc3NlcnR8ZGVmYXVsdHxldmFsfGltcG9ydHxub3B8c2VsZWN0fHVuZGVmaW5lZC8uc291cmNlLFxuXHRcdC8vIGdsb2JhbFxuXHRcdC9vcHRfKD86YWxsb3dmbG9hdGF1ZGlvfGF2aXBhZHNjYW5saW5lc3xkd2NoYW5uZWxtYXNrfGVuYWJsZV8oPzpiNjRhfHBsYW5hcnRvcGFja2VkcmdifHYyMTB8eTNfMTBfMTB8eTNfMTBfMTYpfHVzZXdhdmVleHRlbnNpYmxlfHZkdWJwbGFuYXJoYWNrKXxzZXQoPzpjYWNoZW1vZGV8bWF4Y3B1fG1lbW9yeW1heHxwbGFuYXJsZWdhY3lhbGlnbm1lbnR8d29ya2luZ2RpcikvLnNvdXJjZSxcblx0XHQvLyBjb252XG5cdFx0L2hleCg/OnZhbHVlKT98dmFsdWUvLnNvdXJjZSxcblx0XHQvLyBudW1lcmljXG5cdFx0L2Fic3xjZWlsfGNvbnRpbnVlZCg/OmRlbm9taW5hdG9yfG51bWVyYXRvcik/fGV4cHxmbG9vcnxmbW9kfGZyYWN8bG9nKD86MTApP3xtYXh8bWlufG11bGRpdnxwaXxwb3d8cmFuZHxyb3VuZHxzaWdufHNwbGluZXxzcXJ0Ly5zb3VyY2UsXG5cdFx0Ly8gdHJpZ1xuXHRcdC9hP3Npbmg/fGE/Y29zaD98YT90YW5bMmhdPy8uc291cmNlLFxuXHRcdC8vIGJpdFxuXHRcdC8oPzpiaXQoPzphbmR8bm90fHg/b3J8W2xyXT9zaGlmdFthc2x1XT98c2hbbHJdfHNhW2xyXXxbbHJdcm90YXRlbD98cm9bcmxdfHRlP3N0fHNldCg/OmNvdW50KT98Y2woPzplYSk/cnxjaCg/OmFuKT9nZT8pKS8uc291cmNlLFxuXHRcdC8vIHJ1bnRpbWVcblx0XHQvYXZlcmFnZSg/OltiZ3JdfGNocm9tYVt1dl18bHVtYSl8KD86W3JnYl18Y2hyb21hW3V2XXxsdW1hfHJnYnxbeXV2XSg/PWRpZmZlcmVuY2UoPzpmcm9tcHJldmlvdXN8dG9uZXh0KSkpZGlmZmVyZW5jZSg/OmZyb21wcmV2aW91c3x0b25leHQpP3xbeXV2cmdiXXBsYW5lKD86bWVkaWFufG1pbnxtYXh8bWlubWF4ZGlmZmVyZW5jZSkvLnNvdXJjZSxcblx0XHQvLyBzY3JpcHRcblx0XHQvZ2V0cHJvY2Vzc2luZm98bG9nbXNnfHNjcmlwdCg/OmRpcig/OnV0ZjgpP3xmaWxlKD86dXRmOCk/fG5hbWUoPzp1dGY4KT8pfHNldGxvZ3BhcmFtcy8uc291cmNlLFxuXHRcdC8vIHN0cmluZ1xuXHRcdC9jaHJ8KD86ZmlsbHxmaW5kfGxlZnR8bWlkfHJlcGxhY2V8cmV2fHJpZ2h0KXN0cnxmb3JtYXR8W2x1XWNhc2V8b3JkfHN0cig/OmNtcGk/fGZyb211dGY4fGxlbnx0b3V0ZjgpfHRpbWV8dHJpbSg/OmFsbHxsZWZ0fHJpZ2h0KS8uc291cmNlLFxuXHRcdC8vIHZlcnNpb25cblx0XHQvaXN2ZXJzaW9ub3JncmVhdGVyfHZlcnNpb24oPzpudW1iZXJ8c3RyaW5nKS8uc291cmNlLFxuXHRcdC8vIGhlbHBlclxuXHRcdC9idWlsZHBpeGVsdHlwZXxjb2xvcnNwYWNlbmFtZXRvcGl4ZWx0eXBlLy5zb3VyY2UsXG5cdFx0Ly8gYXZzcGx1c1xuXHRcdC9hZGRhdXRvbG9hZGRpcnxvbig/OmNwdXxjdWRhKXxwcmVmZXRjaHxzZXRmaWx0ZXJtdG1vZGUvLnNvdXJjZVxuXHRdLmpvaW4oJ3wnKTtcblx0dmFyIHByb3BlcnRpZXMgPSBbXG5cdFx0Ly8gY29udGVudFxuXHRcdC9oYXMoPzphdWRpb3x2aWRlbykvLnNvdXJjZSxcblx0XHQvLyByZXNvbHV0aW9uXG5cdFx0L2hlaWdodHx3aWR0aC8uc291cmNlLFxuXHRcdC8vIGZyYW1lcmF0ZVxuXHRcdC9mcmFtZSg/OmNvdW50fHJhdGUpfGZyYW1lcmF0ZSg/OmRlbm9taW5hdG9yfG51bWVyYXRvcikvLnNvdXJjZSxcblx0XHQvLyBpbnRlcmxhY2luZ1xuXHRcdC9nZXRwYXJpdHl8aXMoPzpmaWVsZHxmcmFtZSliYXNlZC8uc291cmNlLFxuXHRcdC8vIGNvbG9yIGZvcm1hdFxuXHRcdC9iaXRzcGVyY29tcG9uZW50fGNvbXBvbmVudHNpemV8aGFzYWxwaGF8aXMoPzpwbGFuYXIoPzpyZ2JhPyk/fGludGVybGVhdmVkfHJnYig/OjI0fDMyfDQ4fDY0KT98eSg/Ojh8dSg/OnZhP3x5MikpP3x5dig/OjEyfDE2fDI0fDQxMSl8NDIwfDQyMnw0NDR8cGFja2VkcmdiKXxudW1jb21wb25lbnRzfHBpeGVsdHlwZS8uc291cmNlLFxuXHRcdC8vIGF1ZGlvXG5cdFx0L2F1ZGlvKD86Yml0c3xjaGFubmVsc3xkdXJhdGlvbnxsZW5ndGgoPzpbZnNdfGhpfGxvKT98cmF0ZSl8aXNhdWRpbyg/OmZsb2F0fGludCkvLnNvdXJjZVxuXHRdLmpvaW4oJ3wnKTtcblx0dmFyIGZpbHRlcnMgPSBbXG5cdFx0Ly8gc291cmNlXG5cdFx0L2F2aSg/OmZpbGUpP3NvdXJjZXxkaXJlY3RzaG93c291cmNlfGltYWdlKD86cmVhZGVyfHNvdXJjZXxzb3VyY2VhbmltKXxvcGVuZG1sc291cmNlfHNlZ21lbnRlZCg/OmF2aXNvdXJjZXxkaXJlY3RzaG93c291cmNlKXx3YXZzb3VyY2UvLnNvdXJjZSxcblx0XHQvLyBjb2xvclxuXHRcdC9jb2xvcnl1dnxjb252ZXJ0YmFja3RveXV5Mnxjb252ZXJ0dG8oPzpSR0IoPzoyNHwzMnw0OHw2NCl8KD86cGxhbmFyKT9SR0JBP3xZOD98WVYoPzoxMnwxNnwyNHw0MTEpfFlVVkE/KD86NDExfDQyMHw0MjJ8NDQ0KXxZVVkyKXxmaXhsdW1pbmFuY2V8Z3JbYWVdeXNjYWxlfGludmVydHxsZXZlbHN8bGltaXRlcnxtZXJnZWE/cmdifG1lcmdlKD86Y2hyb21hfGx1bWEpfHJnYmFkanVzdHxzaG93KD86YWxwaGF8Ymx1ZXxncmVlbnxyZWQpfHN3YXB1dnx0d2Vha3xbdXZddG95OD98eXRvdXYvLnNvdXJjZSxcblx0XHQvLyBvdmVybGF5XG5cdFx0Lyg/OmNvbG9ya2V5fHJlc2V0KW1hc2t8bGF5ZXJ8bWFzayg/OmhzKT98bWVyZ2V8b3ZlcmxheXxzdWJ0cmFjdC8uc291cmNlLFxuXHRcdC8vIGdlb21ldHJ5XG5cdFx0L2FkZGJvcmRlcnN8KD86YmljdWJpY3xiaWxpbmVhcnxibGFja21hbnxnYXVzc3xsYW5jem9zNHxsYW5jem9zfHBvaW50fHNpbmN8c3BsaW5lKD86MTZ8MzZ8NjQpKXJlc2l6ZXxjcm9wKD86Ym90dG9tKT98ZmxpcCg/Omhvcml6b250YWx8dmVydGljYWwpfCg/Omhvcml6b250YWx8dmVydGljYWwpP3JlZHVjZWJ5MnxsZXR0ZXJib3h8c2tld3Jvd3N8dHVybig/OjE4MHxsZWZ0fHJpZ2h0KS8uc291cmNlLFxuXHRcdC8vIHBpeGVsXG5cdFx0L2JsdXJ8Zml4YnJva2VuY2hyb21hdXBzYW1wbGluZ3xnZW5lcmFsY29udm9sdXRpb258KD86c3BhdGlhbHx0ZW1wb3JhbClzb2Z0ZW58c2hhcnBlbi8uc291cmNlLFxuXHRcdC8vIHRpbWVsaW5lXG5cdFx0L3RyaW18KD86dW4pP2FsaWduZWRzcGxpY2V8KD86YXNzdW1lfGFzc3VtZXNjYWxlZHxjaGFuZ2V8Y29udmVydClGUFN8KD86ZGVsZXRlfGR1cGxpY2F0ZSlmcmFtZXxkaXNzb2x2ZXxmYWRlKD86aW58aW98b3V0KVswMl0/fGZyZWV6ZWZyYW1lfGludGVybGVhdmV8bG9vcHxyZXZlcnNlfHNlbGVjdCg/OmV2ZW58b2RkfCg/OnJhbmdlKT9ldmVyeSkvLnNvdXJjZSxcblx0XHQvLyBpbnRlcmxhY2Vcblx0XHQvYXNzdW1lW2J0XWZmfGFzc3VtZSg/OmZpZWxkfGZyYW1lKWJhc2VkfGJvYnxjb21wbGVtZW50cGFyaXR5fGRvdWJsZXdlYXZlfHBlY3VsaWFyYmxlbmR8cHVsbGRvd258c2VwYXJhdGUoPzpjb2x1bW5zfGZpZWxkc3xyb3dzKXxzd2FwZmllbGRzfHdlYXZlKD86Y29sdW1uc3xyb3dzKT8vLnNvdXJjZSxcblx0XHQvLyBhdWRpb1xuXHRcdC9hbXBsaWZ5KD86ZGIpP3xhc3N1bWVzYW1wbGVyYXRlfGF1ZGlvZHViKD86ZXgpP3xhdWRpb3RyaW18Y29udmVydGF1ZGlvdG8oPzooPzo4fDE2fDI0fDMyKWJpdHxmbG9hdCl8Y29udmVydHRvbW9ub3xkZWxheWF1ZGlvfGVuc3VyZXZicm1wM3N5bmN8Z2V0KD86bGVmdHxyaWdodCk/Y2hhbm5lbHxraWxsKD86YXVkaW98dmlkZW8pfG1lcmdlY2hhbm5lbHN8bWl4YXVkaW98bW9ub3Rvc3RlcmVvfG5vcm1hbGl6ZXxyZXNhbXBsZWF1ZGlvfHNzcmN8c3VwZXJlcXx0aW1lc3RyZXRjaC8uc291cmNlLFxuXHRcdC8vIGNvbmRpdGlvbmFsXG5cdFx0L2FuaW1hdGV8YXBwbHlyYW5nZXxjb25kaXRpb25hbCg/OmZpbHRlcnxyZWFkZXJ8c2VsZWN0KXxmcmFtZWV2YWx1YXRlfHNjcmlwdGNsaXB8dGNwKD86c2VydmVyfHNvdXJjZSl8d3JpdGVmaWxlKD86ZW5kfGlmfHN0YXJ0KT8vLnNvdXJjZSxcblx0XHQvLyBleHBvcnRcblx0XHQvaW1hZ2V3cml0ZXIvLnNvdXJjZSxcblx0XHQvLyBkZWJ1Z1xuXHRcdC9ibGFja25lc3N8YmxhbmtjbGlwfGNvbG9yYmFycyg/OmhkKT98Y29tcGFyZXxkdW1wZmlsdGVyZ3JhcGh8ZWNob3xoaXN0b2dyYW18aW5mb3xtZXNzYWdlY2xpcHxwcmVyb2xsfHNldGdyYXBoYW5hbHlzaXN8c2hvdyg/OmZyYW1lbnVtYmVyfHNtcHRlfHRpbWUpfHNob3dmaXZldmVyc2lvbnN8c3RhY2soPzpob3Jpem9udGFsfHZlcnRpY2FsKXxzdWJ0aXRsZXx0b25lfHZlcnNpb24vLnNvdXJjZVxuXHRdLmpvaW4oJ3wnKTtcblx0dmFyIGFsbGludGVybmFscyA9IFtpbnRlcm5hbHMsIHByb3BlcnRpZXMsIGZpbHRlcnNdLmpvaW4oJ3wnKTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuYXZpc3ludGggPSB7XG5cdFx0J2NvbW1lbnQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIE1hdGNoZXMgWyogKl0gbmVzdGFibGUgYmxvY2sgY29tbWVudHMsIGJ1dCBvbmx5IHN1cHBvcnRzIDEgbGV2ZWwgb2YgbmVzdGVkIGNvbW1lbnRzXG5cdFx0XHRcdC8vIC9cXFtcXCooPzpbXlxcWypdfFxcWyg/IVxcKil8XFwqKD8hXFxdKXw8c2VsZj4pKlxcKlxcXS9cblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFxbXFwqKD86W15cXFsqXXxcXFsoPyFcXCopfFxcKig/IVxcXSl8XFxbXFwqKD86W15cXFsqXXxcXFsoPyFcXCopfFxcKig/IVxcXSkpKlxcKlxcXSkqXFwqXFxdLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBNYXRjaGVzIC8qICovIGJsb2NrIGNvbW1lbnRzXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIE1hdGNoZXMgIyBjb21tZW50c1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcJF0pIy4qLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblxuXHRcdC8vIEhhbmRsZSBiZWZvcmUgc3RyaW5ncyBiZWNhdXNlIG9wdGlvbmFsIGFyZ3VtZW50cyBhcmUgc3Vycm91bmRlZCBieSBkb3VibGUgcXVvdGVzXG5cdFx0J2FyZ3VtZW50Jzoge1xuXHRcdFx0cGF0dGVybjogcmUoL1xcYig/Ojw8MD4+KVxccysoXCI/KVxcdytcXDEvLnNvdXJjZSwgW3R5cGVzXSwgJ2knKSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQna2V5d29yZCc6IC9eXFx3Ky9cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gT3B0aW9uYWwgYXJndW1lbnQgYXNzaWdubWVudFxuXHRcdCdhcmd1bWVudC1sYWJlbCc6IHtcblx0XHRcdHBhdHRlcm46IC8oWywoXVtcXHNcXFxcXSopXFx3K1xccyo9KD8hPSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnYXJndW1lbnQtbmFtZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcdysvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC89JC9cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J3N0cmluZyc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gdHJpcGxlIGRvdWJsZS1xdW90ZWRcblx0XHRcdFx0cGF0dGVybjogL1wiXCJcIltcXHNcXFNdKj9cIlwiXCIvLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBzaW5nbGUgZG91YmxlLXF1b3RlZFxuXHRcdFx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXlwiXFxcXFxcclxcbl0pKlwiLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnY29uc3RhbnQnOiB7XG5cdFx0XHRcdFx0XHQvLyBUaGVzZSAqYXJlKiBjYXNlLXNlbnNpdGl2ZSFcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9cXGIoPzpERUZBVUxUX01UX01PREV8KD86TUFJTlNDUklQVHxQUk9HUkFNfFNDUklQVClESVJ8KD86TUFDSElORXxVU0VSKV8oPzpDTEFTU0lDfFBMVVMpX1BMVUdJTlMpXFxiL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cblx0XHQvLyBUaGUgc3BlY2lhbCBcImxhc3RcIiB2YXJpYWJsZSB0aGF0IHRha2VzIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBpbXBsaWNpdGx5IHJldHVybmVkIGNsaXBcblx0XHQndmFyaWFibGUnOiAvXFxiKD86bGFzdClcXGIvaSxcblxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfG5vfHRydWV8eWVzKVxcYi9pLFxuXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86Y2F0Y2h8ZWxzZXxmb3J8ZnVuY3Rpb258Z2xvYmFsfGlmfHJldHVybnx0cnl8d2hpbGV8X19FTkRfXylcXGIvaSxcblxuXHRcdCdjb25zdGFudCc6IC9cXGJNVF8oPzpNVUxUSV9JTlNUQU5DRXxOSUNFX0ZJTFRFUnxTRVJJQUxJWkVEfFNQRUNJQUxfTVQpXFxiLyxcblxuXHRcdC8vIEF2aVN5bnRoJ3MgaW50ZXJuYWwgZnVuY3Rpb25zLCBmaWx0ZXJzLCBhbmQgcHJvcGVydGllc1xuXHRcdCdidWlsdGluLWZ1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogcmUoL1xcYig/Ojw8MD4+KVxcYi8uc291cmNlLCBbYWxsaW50ZXJuYWxzXSwgJ2knKSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblxuXHRcdCd0eXBlLWNhc3QnOiB7XG5cdFx0XHRwYXR0ZXJuOiByZSgvXFxiKD86PDwwPj4pKD89XFxzKlxcKCkvLnNvdXJjZSwgW3R5cGVzXSwgJ2knKSxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXG5cdFx0Ly8gRXh0ZXJuYWwvdXNlci1kZWZpbmVkIGZpbHRlcnNcblx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpfChcXC4pW2Etel9dXFx3KlxcYi9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQvLyBNYXRjaGVzIGEgXFwgYXMgdGhlIGZpcnN0IG9yIGxhc3QgY2hhcmFjdGVyIG9uIGEgbGluZVxuXHRcdCdsaW5lLWNvbnRpbnVhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopXFxcXHxcXFxcKD89WyBcXHRdKiQpL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXG5cdFx0J251bWJlcic6IC9cXEJcXCQoPzpbXFxkYS1mXXs2fXxbXFxkYS1mXXs4fSlcXGJ8KD86KD86XFxifFxcQi0pXFxkKyg/OlxcLlxcZCopP1xcYnxcXEJcXC5cXGQrXFxiKS9pLFxuXG5cdFx0J29wZXJhdG9yJzogL1xcK1xcKz98WyE9PD5dPT98JiZ8XFx8XFx8fFs/OiovJS1dLyxcblxuXHRcdCdwdW5jdHVhdGlvbic6IC9be31cXFtcXF0oKTssLl0vXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmF2cyA9IFByaXNtLmxhbmd1YWdlcy5hdmlzeW50aDtcblxufShQcmlzbSkpO1xuXG4vLyBHaXRIdWI6IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvYXZyb1xuLy8gRG9jczogaHR0cHM6Ly9hdnJvLmFwYWNoZS5vcmcvZG9jcy9jdXJyZW50L2lkbC5odG1sXG5cblByaXNtLmxhbmd1YWdlc1snYXZyby1pZGwnXSA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVwiKD86W15cXHJcXG5cIlxcXFxdfFxcXFwuKSpcIi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQnYW5ub3RhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvQCg/OlskXFx3Li1dfGBbXlxcclxcbmBdK2ApKy8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCdmdW5jdGlvbi1pZGVudGlmaWVyJzoge1xuXHRcdHBhdHRlcm46IC9gW15cXHJcXG5gXStgKD89XFxzKlxcKCkvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQnaWRlbnRpZmllcic6IHtcblx0XHRwYXR0ZXJuOiAvYFteXFxyXFxuYF0rYC8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogLyhcXGIoPzplbnVtfGVycm9yfHByb3RvY29sfHJlY29yZHx0aHJvd3MpXFxiXFxzKylbJFxcd10rLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzphcnJheXxib29sZWFufGJ5dGVzfGRhdGV8ZGVjaW1hbHxkb3VibGV8ZW51bXxlcnJvcnxmYWxzZXxmaXhlZHxmbG9hdHxpZGx8aW1wb3J0fGludHxsb2NhbF90aW1lc3RhbXBfbXN8bG9uZ3xtYXB8bnVsbHxvbmV3YXl8cHJvdG9jb2x8cmVjb3JkfHNjaGVtYXxzdHJpbmd8dGhyb3dzfHRpbWVfbXN8dGltZXN0YW1wX21zfHRydWV8dW5pb258dXVpZHx2b2lkKVxcYi8sXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCkvaSxcblxuXHQnbnVtYmVyJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdy5dKS0/KD86KD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKSg/OmVbKy1dP1xcZCspP3wweCg/OlthLWYwLTldKyg/OlxcLlthLWYwLTldKik/fFxcLlthLWYwLTldKykoPzpwWystXT9cXGQrKT8pW2RmbF0/KD8hW1xcdy5dKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0Ly0/XFxiKD86SW5maW5pdHl8TmFOKVxcYi9cblx0XSxcblxuXHQnb3BlcmF0b3InOiAvPS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKClcXFtcXF17fTw+LjosOy1dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmF2ZGwgPSBQcmlzbS5sYW5ndWFnZXNbJ2F2cm8taWRsJ107XG5cblByaXNtLmxhbmd1YWdlcy5hd2sgPSB7XG5cdCdoYXNoYmFuZyc6IHtcblx0XHRwYXR0ZXJuOiAvXiMhLiovLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdH0sXG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8jLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVwiKD86W15cXFxcXCJcXHJcXG5dfFxcXFwuKSpcIi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3JlZ2V4Jzoge1xuXHRcdHBhdHRlcm46IC8oKD86XnxbXlxcd1xccyldKVxccyopXFwvKD86W15cXC9cXFxcXFxyXFxuXXxcXFxcLikqXFwvLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCd2YXJpYWJsZSc6IC9cXCRcXHcrLyxcblx0J2tleXdvcmQnOiAvXFxiKD86QkVHSU58QkVHSU5GSUxFfEVORHxFTkRGSUxFfGJyZWFrfGNhc2V8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxleGl0fGZvcnxmdW5jdGlvbnxnZXRsaW5lfGlmfGlufG5leHR8bmV4dGZpbGV8cHJpbnRmP3xyZXR1cm58c3dpdGNofHdoaWxlKVxcYnxAKD86aW5jbHVkZXxsb2FkKVxcYi8sXG5cblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXHQnbnVtYmVyJzogL1xcYig/OlxcZCsoPzpcXC5cXGQrKT8oPzplWystXT9cXGQrKT98MHhbYS1mQS1GMC05XSspXFxiLyxcblxuXHQnb3BlcmF0b3InOiAvLS18XFwrXFwrfCE/fnw+Jnw+Pnw8PHwoPzpcXCpcXCp8Wzw+IT0rXFwtKi8lXl0pPT98JiZ8XFx8W3wmXXxbPzpdLyxcblx0J3B1bmN0dWF0aW9uJzogL1soKVtcXF17fSw7XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5nYXdrID0gUHJpc20ubGFuZ3VhZ2VzLmF3aztcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHQvLyAkIHNldCB8IGdyZXAgJ15bQS1aXVteWzpzcGFjZTpdXSo9JyB8IGN1dCAtZD0gLWYxIHwgdHIgJ1xcbicgJ3wnXG5cdC8vICsgTENfQUxMLCBSQU5ET00sIFJFUExZLCBTRUNPTkRTLlxuXHQvLyArIG1ha2Ugc3VyZSBQUzEuLjQgYXJlIGhlcmUgYXMgdGhleSBhcmUgbm90IGFsd2F5cyBzZXQsXG5cdC8vIC0gc29tZSB1c2VsZXNzIHRoaW5ncy5cblx0dmFyIGVudlZhcnMgPSAnXFxcXGIoPzpCQVNIfEJBU0hPUFRTfEJBU0hfQUxJQVNFU3xCQVNIX0FSR0N8QkFTSF9BUkdWfEJBU0hfQ01EU3xCQVNIX0NPTVBMRVRJT05fQ09NUEFUX0RJUnxCQVNIX0xJTkVOT3xCQVNIX1JFTUFUQ0h8QkFTSF9TT1VSQ0V8QkFTSF9WRVJTSU5GT3xCQVNIX1ZFUlNJT058Q09MT1JURVJNfENPTFVNTlN8Q09NUF9XT1JEQlJFQUtTfERCVVNfU0VTU0lPTl9CVVNfQUREUkVTU3xERUZBVUxUU19QQVRIfERFU0tUT1BfU0VTU0lPTnxESVJTVEFDS3xESVNQTEFZfEVVSUR8R0RNU0VTU0lPTnxHRE1fTEFOR3xHTk9NRV9LRVlSSU5HX0NPTlRST0x8R05PTUVfS0VZUklOR19QSUR8R1BHX0FHRU5UX0lORk98R1JPVVBTfEhJU1RDT05UUk9MfEhJU1RGSUxFfEhJU1RGSUxFU0laRXxISVNUU0laRXxIT01FfEhPU1ROQU1FfEhPU1RUWVBFfElGU3xJTlNUQU5DRXxKT0J8TEFOR3xMQU5HVUFHRXxMQ19BRERSRVNTfExDX0FMTHxMQ19JREVOVElGSUNBVElPTnxMQ19NRUFTVVJFTUVOVHxMQ19NT05FVEFSWXxMQ19OQU1FfExDX05VTUVSSUN8TENfUEFQRVJ8TENfVEVMRVBIT05FfExDX1RJTUV8TEVTU0NMT1NFfExFU1NPUEVOfExJTkVTfExPR05BTUV8TFNfQ09MT1JTfE1BQ0hUWVBFfE1BSUxDSEVDS3xNQU5EQVRPUllfUEFUSHxOT19BVF9CUklER0V8T0xEUFdEfE9QVEVSUnxPUFRJTkR8T1JCSVRfU09DS0VURElSfE9TVFlQRXxQQVBFUlNJWkV8UEFUSHxQSVBFU1RBVFVTfFBQSUR8UFMxfFBTMnxQUzN8UFM0fFBXRHxSQU5ET018UkVQTFl8U0VDT05EU3xTRUxJTlVYX0lOSVR8U0VTU0lPTnxTRVNTSU9OVFlQRXxTRVNTSU9OX01BTkFHRVJ8U0hFTEx8U0hFTExPUFRTfFNITFZMfFNTSF9BVVRIX1NPQ0t8VEVSTXxVSUR8VVBTVEFSVF9FVkVOVFN8VVBTVEFSVF9JTlNUQU5DRXxVUFNUQVJUX0pPQnxVUFNUQVJUX1NFU1NJT058VVNFUnxXSU5ET1dJRHxYQVVUSE9SSVRZfFhER19DT05GSUdfRElSU3xYREdfQ1VSUkVOVF9ERVNLVE9QfFhER19EQVRBX0RJUlN8WERHX0dSRUVURVJfREFUQV9ESVJ8WERHX01FTlVfUFJFRklYfFhER19SVU5USU1FX0RJUnxYREdfU0VBVHxYREdfU0VBVF9QQVRIfFhER19TRVNTSU9OX0RFU0tUT1B8WERHX1NFU1NJT05fSUR8WERHX1NFU1NJT05fUEFUSHxYREdfU0VTU0lPTl9UWVBFfFhER19WVE5SfFhNT0RJRklFUlMpXFxcXGInO1xuXG5cdHZhciBjb21tYW5kQWZ0ZXJIZXJlZG9jID0ge1xuXHRcdHBhdHRlcm46IC8oXihbXCInXT8pXFx3K1xcMilbIFxcdF0rXFxTLiovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdwdW5jdHVhdGlvbicsIC8vIHRoaXMgbG9va3MgcmVhc29uYWJseSB3ZWxsIGluIGFsbCB0aGVtZXNcblx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdH07XG5cblx0dmFyIGluc2lkZVN0cmluZyA9IHtcblx0XHQnYmFzaCc6IGNvbW1hbmRBZnRlckhlcmVkb2MsXG5cdFx0J2Vudmlyb25tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCdcXFxcJCcgKyBlbnZWYXJzKSxcblx0XHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdFx0fSxcblx0XHQndmFyaWFibGUnOiBbXG5cdFx0XHQvLyBbMF06IEFyaXRobWV0aWMgRW52aXJvbm1lbnRcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcJD9cXChcXChbXFxzXFxTXSs/XFwpXFwpLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhICQgc2lnbiBhdCB0aGUgYmVnaW5uaW5nIGhpZ2hsaWdodCAkKCggYW5kICkpIGFzIHZhcmlhYmxlXG5cdFx0XHRcdFx0J3ZhcmlhYmxlJzogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXCRcXChcXChbXFxzXFxTXSspXFwpXFwpLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdC9eXFwkXFwoXFwoL1xuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0J251bWJlcic6IC9cXGIweFtcXGRBLUZhLWZdK1xcYnwoPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86W0VlXS0/XFxkKyk/Lyxcblx0XHRcdFx0XHQvLyBPcGVyYXRvcnMgYWNjb3JkaW5nIHRvIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYmFzaC9tYW51YWwvYmFzaHJlZi5odG1sI1NoZWxsLUFyaXRobWV0aWNcblx0XHRcdFx0XHQnb3BlcmF0b3InOiAvLS18XFwrXFwrfFxcKlxcKj0/fDw8PT98Pj49P3wmJnxcXHxcXHx8Wz0hK1xcLSovJTw+XiZ8XT0/fFs/fjpdLyxcblx0XHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBubyAkIHNpZ24gYXQgdGhlIGJlZ2lubmluZyBoaWdobGlnaHQgKCggYW5kICkpIGFzIHB1bmN0dWF0aW9uXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcKFxcKD98XFwpXFwpP3wsfDsvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQvLyBbMV06IENvbW1hbmQgU3Vic3RpdHV0aW9uXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXCRcXCgoPzpcXChbXildK1xcKXxbXigpXSkrXFwpfGBbXmBdK2AvLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCd2YXJpYWJsZSc6IC9eXFwkXFwofF5gfFxcKSR8YCQvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQvLyBbMl06IEJyYWNlIGV4cGFuc2lvblxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwkXFx7W159XStcXH0vLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdvcGVyYXRvcic6IC86Wy09PytdP3xbIVxcL118IyM/fCUlP3xcXF5cXF4/fCwsPy8sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF1dLyxcblx0XHRcdFx0XHQnZW52aXJvbm1lbnQnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJyhcXFxceyknICsgZW52VmFycyksXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdjb25zdGFudCdcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQvXFwkKD86XFx3K3xbIz8qIUAkXSkvXG5cdFx0XSxcblx0XHQvLyBFc2NhcGUgc2VxdWVuY2VzIGZyb20gZWNobyBhbmQgcHJpbnRmJ3MgbWFudWFscywgYW5kIGVzY2FwZWQgcXVvdGVzLlxuXHRcdCdlbnRpdHknOiAvXFxcXCg/OlthYmNlRWZucnR2XFxcXFwiXXxPP1swLTddezEsM318VVswLTlhLWZBLUZdezh9fHVbMC05YS1mQS1GXXs0fXx4WzAtOWEtZkEtRl17MSwyfSkvXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmJhc2ggPSB7XG5cdFx0J3NoZWJhbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXiMhXFxzKlxcLy4qLyxcblx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdH0sXG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cIntcXFxcJF0pIy4qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdmdW5jdGlvbi1uYW1lJzogW1xuXHRcdFx0Ly8gYSkgZnVuY3Rpb24gZm9vIHtcblx0XHRcdC8vIGIpIGZvbygpIHtcblx0XHRcdC8vIGMpIGZ1bmN0aW9uIGZvbygpIHtcblx0XHRcdC8vIGJ1dCBub3QgXHUyMDFDZm9vIHtcdTIwMURcblx0XHRcdHtcblx0XHRcdFx0Ly8gYSkgYW5kIGMpXG5cdFx0XHRcdHBhdHRlcm46IC8oXFxiZnVuY3Rpb25cXHMrKVtcXHctXSsoPz0oPzpcXHMqXFwoPzpcXHMqXFwpKT9cXHMqXFx7KS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBiKVxuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiW1xcdy1dKyg/PVxccypcXChcXHMqXFwpXFxzKlxceykvLFxuXHRcdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdFx0fVxuXHRcdF0sXG5cdFx0Ly8gSGlnaGxpZ2h0IHZhcmlhYmxlIG5hbWVzIGFzIHZhcmlhYmxlcyBpbiBmb3IgYW5kIHNlbGVjdCBiZWdpbm5pbmdzLlxuXHRcdCdmb3Itb3Itc2VsZWN0Jzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGIoPzpmb3J8c2VsZWN0KVxccyspXFx3Kyg/PVxccytpblxccykvLFxuXHRcdFx0YWxpYXM6ICd2YXJpYWJsZScsXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvLyBIaWdobGlnaHQgdmFyaWFibGUgbmFtZXMgYXMgdmFyaWFibGVzIGluIHRoZSBsZWZ0LWhhbmQgcGFydFxuXHRcdC8vIG9mIGFzc2lnbm1lbnRzIChcdTIwMUM9XHUyMDFEIGFuZCBcdTIwMUMrPVx1MjAxRCkuXG5cdFx0J2Fzc2lnbi1sZWZ0Jzoge1xuXHRcdFx0cGF0dGVybjogLyhefFtcXHM7fCZdfFs8Pl1cXCgpXFx3Kyg/PVxcKz89KS8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2Vudmlyb25tZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnKF58W1xcXFxzO3wmXXxbPD5dXFxcXCgpJyArIGVudlZhcnMpLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdjb25zdGFudCdcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGFsaWFzOiAndmFyaWFibGUnLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IFtcblx0XHRcdC8vIFN1cHBvcnQgZm9yIEhlcmUtZG9jdW1lbnRzIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hlcmVfZG9jdW1lbnRcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFtePF0pPDwtP1xccyopKFxcdyspXFxzW1xcc1xcU10qPyg/Olxccj9cXG58XFxyKVxcMi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBpbnNpZGVTdHJpbmdcblx0XHRcdH0sXG5cdFx0XHQvLyBIZXJlLWRvY3VtZW50IHdpdGggcXVvdGVzIGFyb3VuZCB0aGUgdGFnXG5cdFx0XHQvLyBcdTIxOTIgTm8gZXhwYW5zaW9uIChzbyBubyBcdTIwMUNpbnNpZGVcdTIwMUQpLlxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W148XSk8PC0/XFxzKikoW1wiJ10pKFxcdyspXFwyXFxzW1xcc1xcU10qPyg/Olxccj9cXG58XFxyKVxcMy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2Jhc2gnOiBjb21tYW5kQWZ0ZXJIZXJlZG9jXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQvLyBcdTIwMUNOb3JtYWxcdTIwMUQgc3RyaW5nXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYmFzaC9tYW51YWwvaHRtbF9ub2RlL0RvdWJsZS1RdW90ZXMuaHRtbFxuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSg/OlxcXFxcXFxcKSopXCIoPzpcXFxcW1xcc1xcU118XFwkXFwoW14pXStcXCl8XFwkKD8hXFwoKXxgW15gXStgfFteXCJcXFxcYCRdKSpcIi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBpbnNpZGVTdHJpbmdcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYmFzaC9tYW51YWwvaHRtbF9ub2RlL1NpbmdsZS1RdW90ZXMuaHRtbFxuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W14kXFxcXF0pJ1teJ10qJy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9iYXNoL21hbnVhbC9odG1sX25vZGUvQU5TSV8wMDJkQy1RdW90aW5nLmh0bWxcblx0XHRcdFx0cGF0dGVybjogL1xcJCcoPzpbXidcXFxcXXxcXFxcW1xcc1xcU10pKicvLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdlbnRpdHknOiBpbnNpZGVTdHJpbmcuZW50aXR5XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCdlbnZpcm9ubWVudCc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnXFxcXCQ/JyArIGVudlZhcnMpLFxuXHRcdFx0YWxpYXM6ICdjb25zdGFudCdcblx0XHR9LFxuXHRcdCd2YXJpYWJsZSc6IGluc2lkZVN0cmluZy52YXJpYWJsZSxcblx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W1xcczt8Jl18Wzw+XVxcKCkoPzphZGR8YXByb3Bvc3xhcHR8YXB0LWNhY2hlfGFwdC1nZXR8YXB0aXR1ZGV8YXNwZWxsfGF1dG9teXNxbGJhY2t1cHxhd2t8YmFzZW5hbWV8YmFzaHxiY3xiY29uc29sZXxiZ3xiemlwMnxjYWx8Y2F0fGNmZGlza3xjaGdycHxjaGtjb25maWd8Y2htb2R8Y2hvd258Y2hyb290fGNrc3VtfGNsZWFyfGNtcHxjb2x1bW58Y29tbXxjb21wb3NlcnxjcHxjcm9ufGNyb250YWJ8Y3NwbGl0fGN1cmx8Y3V0fGRhdGV8ZGN8ZGR8ZGRyZXNjdWV8ZGVib290c3RyYXB8ZGZ8ZGlmZnxkaWZmM3xkaWd8ZGlyfGRpcmNvbG9yc3xkaXJuYW1lfGRpcnN8ZG1lc2d8ZG9ja2VyfGRvY2tlci1jb21wb3NlfGR1fGVncmVwfGVqZWN0fGVudnxldGh0b29sfGV4cGFuZHxleHBlY3R8ZXhwcnxmZGZvcm1hdHxmZGlza3xmZ3xmZ3JlcHxmaWxlfGZpbmR8Zm10fGZvbGR8Zm9ybWF0fGZyZWV8ZnNja3xmdHB8ZnVzZXJ8Z2F3a3xnaXR8Z3BhcnRlZHxncmVwfGdyb3VwYWRkfGdyb3VwZGVsfGdyb3VwbW9kfGdyb3Vwc3xncnViLW1rY29uZmlnfGd6aXB8aGFsdHxoZWFkfGhnfGhpc3Rvcnl8aG9zdHxob3N0bmFtZXxodG9wfGljb252fGlkfGlmY29uZmlnfGlmZG93bnxpZnVwfGltcG9ydHxpbnN0YWxsfGlwfGpvYnN8am9pbnxraWxsfGtpbGxhbGx8bGVzc3xsaW5rfGxufGxvY2F0ZXxsb2duYW1lfGxvZ3JvdGF0ZXxsb29rfGxwY3xscHJ8bHByaW50fGxwcmludGR8bHByaW50cXxscHJtfGxzfGxzb2Z8bHlueHxtYWtlfG1hbnxtY3xtZGFkbXxta2NvbmZpZ3xta2Rpcnxta2UyZnN8bWtmaWZvfG1rZnN8bWtpc29mc3xta25vZHxta3N3YXB8bW12fG1vcmV8bW9zdHxtb3VudHxtdG9vbHN8bXRyfG11dHR8bXZ8bmFub3xuY3xuZXRzdGF0fG5pY2V8bmx8bm9kZXxub2h1cHxub3RpZnktc2VuZHxucG18bnNsb29rdXB8b3B8b3BlbnxwYXJ0ZWR8cGFzc3dkfHBhc3RlfHBhdGhjaGt8cGluZ3xwa2lsbHxwbnBtfHBvZG1hbnxwb2RtYW4tY29tcG9zZXxwb3BkfHByfHByaW50Y2FwfHByaW50ZW52fHBzfHB1c2hkfHB2fHF1b3RhfHF1b3RhY2hlY2t8cXVvdGFjdGx8cmFtfHJhcnxyY3B8cmVib290fHJlbXN5bmN8cmVuYW1lfHJlbmljZXxyZXZ8cm18cm1kaXJ8cnBtfHJzeW5jfHNjcHxzY3JlZW58c2RpZmZ8c2VkfHNlbmRtYWlsfHNlcXxzZXJ2aWNlfHNmdHB8c2h8c2hlbGxjaGVja3xzaHVmfHNodXRkb3dufHNsZWVwfHNsb2NhdGV8c29ydHxzcGxpdHxzc2h8c3RhdHxzdHJhY2V8c3V8c3Vkb3xzdW18c3VzcGVuZHxzd2Fwb258c3luY3x0YWN8dGFpbHx0YXJ8dGVlfHRpbWV8dGltZW91dHx0b3B8dG91Y2h8dHJ8dHJhY2Vyb3V0ZXx0c29ydHx0dHl8dW1vdW50fHVuYW1lfHVuZXhwYW5kfHVuaXF8dW5pdHN8dW5yYXJ8dW5zaGFyfHVuemlwfHVwZGF0ZS1ncnVifHVwdGltZXx1c2VyYWRkfHVzZXJkZWx8dXNlcm1vZHx1c2Vyc3x1dWRlY29kZXx1dWVuY29kZXx2fHZjcGtnfHZkaXJ8dml8dmltfHZpcnNofHZtc3RhdHx3YWl0fHdhdGNofHdjfHdnZXR8d2hlcmVpc3x3aGljaHx3aG98d2hvYW1pfHdyaXRlfHhhcmdzfHhkZy1vcGVufHlhcm58eWVzfHplbml0eXx6aXB8enNofHp5cHBlcikoPz0kfFspXFxzO3wmXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W1xcczt8Jl18Wzw+XVxcKCkoPzpjYXNlfGRvfGRvbmV8ZWxpZnxlbHNlfGVzYWN8Zml8Zm9yfGZ1bmN0aW9ufGlmfGlufHNlbGVjdHx0aGVufHVudGlsfHdoaWxlKSg/PSR8WylcXHM7fCZdKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvLyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2Jhc2gvbWFudWFsL2h0bWxfbm9kZS9TaGVsbC1CdWlsdGluLUNvbW1hbmRzLmh0bWxcblx0XHQnYnVpbHRpbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXFxzO3wmXXxbPD5dXFwoKSg/OlxcLnw6fGFsaWFzfGJpbmR8YnJlYWt8YnVpbHRpbnxjYWxsZXJ8Y2R8Y29tbWFuZHxjb250aW51ZXxkZWNsYXJlfGVjaG98ZW5hYmxlfGV2YWx8ZXhlY3xleGl0fGV4cG9ydHxnZXRvcHRzfGhhc2h8aGVscHxsZXR8bG9jYWx8bG9nb3V0fG1hcGZpbGV8cHJpbnRmfHB3ZHxyZWFkfHJlYWRhcnJheXxyZWFkb25seXxyZXR1cm58c2V0fHNoaWZ0fHNob3B0fHNvdXJjZXx0ZXN0fHRpbWVzfHRyYXB8dHlwZXx0eXBlc2V0fHVsaW1pdHx1bWFza3x1bmFsaWFzfHVuc2V0KSg/PSR8WylcXHM7fCZdKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Ly8gQWxpYXMgYWRkZWQgdG8gbWFrZSB0aG9zZSBlYXNpZXIgdG8gZGlzdGluZ3Vpc2ggZnJvbSBzdHJpbmdzLlxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHRcdH0sXG5cdFx0J2Jvb2xlYW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W1xcczt8Jl18Wzw+XVxcKCkoPzpmYWxzZXx0cnVlKSg/PSR8WylcXHM7fCZdKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnZmlsZS1kZXNjcmlwdG9yJzoge1xuXHRcdFx0cGF0dGVybjogL1xcQiZcXGRcXGIvLFxuXHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0fSxcblx0XHQnb3BlcmF0b3InOiB7XG5cdFx0XHQvLyBMb3RzIG9mIHJlZGlyZWN0aW9ucyBoZXJlLCBidXQgbm90IGp1c3QgdGhhdC5cblx0XHRcdHBhdHRlcm46IC9cXGQ/PD58PlxcfHxcXCs9fD1bPX5dP3whPT98PDxbPC1dP3xbJlxcZF0/Pj58XFxkWzw+XSY/fFs8Pl1bJj1dP3wmWz4mXT98XFx8WyZ8XT8vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdmaWxlLWRlc2NyaXB0b3InOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15cXGQvLFxuXHRcdFx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQncHVuY3R1YXRpb24nOiAvXFwkP1xcKFxcKD98XFwpXFwpP3xcXC5cXC58W3t9W1xcXTtcXFxcXS8sXG5cdFx0J251bWJlcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXHMpKD86WzEtOV1cXGQqfDApKD86Wy4sXVxcZCspP1xcYi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHR9O1xuXG5cdGNvbW1hbmRBZnRlckhlcmVkb2MuaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLmJhc2g7XG5cblx0LyogUGF0dGVybnMgaW4gY29tbWFuZCBzdWJzdGl0dXRpb24uICovXG5cdHZhciB0b0JlQ29waWVkID0gW1xuXHRcdCdjb21tZW50Jyxcblx0XHQnZnVuY3Rpb24tbmFtZScsXG5cdFx0J2Zvci1vci1zZWxlY3QnLFxuXHRcdCdhc3NpZ24tbGVmdCcsXG5cdFx0J3N0cmluZycsXG5cdFx0J2Vudmlyb25tZW50Jyxcblx0XHQnZnVuY3Rpb24nLFxuXHRcdCdrZXl3b3JkJyxcblx0XHQnYnVpbHRpbicsXG5cdFx0J2Jvb2xlYW4nLFxuXHRcdCdmaWxlLWRlc2NyaXB0b3InLFxuXHRcdCdvcGVyYXRvcicsXG5cdFx0J3B1bmN0dWF0aW9uJyxcblx0XHQnbnVtYmVyJ1xuXHRdO1xuXHR2YXIgaW5zaWRlID0gaW5zaWRlU3RyaW5nLnZhcmlhYmxlWzFdLmluc2lkZTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0b0JlQ29waWVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0aW5zaWRlW3RvQmVDb3BpZWRbaV1dID0gUHJpc20ubGFuZ3VhZ2VzLmJhc2hbdG9CZUNvcGllZFtpXV07XG5cdH1cblxuXHRQcmlzbS5sYW5ndWFnZXMuc2hlbGwgPSBQcmlzbS5sYW5ndWFnZXMuYmFzaDtcbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmJhc2ljID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKD86IXxSRU1cXGIpLisvaSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdrZXl3b3JkJzogL15SRU0vaVxuXHRcdH1cblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpcIlwifFshIyQlJicoKSosXFwvOjs8PT4/XlxcdyArXFwtLl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J251bWJlcic6IC8oPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86RVsrLV0/XFxkKyk/L2ksXG5cdCdrZXl3b3JkJzogL1xcYig/OkFTfEJFRVB8QkxPQUR8QlNBVkV8Q0FMTCg/OiBBQlNPTFVURSk/fENBU0V8Q0hBSU58Q0hESVJ8Q0xFQVJ8Q0xPU0V8Q0xTfENPTXxDT01NT058Q09OU1R8REFUQXxERUNMQVJFfERFRig/OiBGTnwgU0VHfERCTHxJTlR8TE5HfFNOR3xTVFIpfERJTXxET3xET1VCTEV8RUxTRXxFTFNFSUZ8RU5EfEVOVklST058RVJBU0V8RVJST1J8RVhJVHxGSUVMRHxGSUxFU3xGT1J8RlVOQ1RJT058R0VUfEdPU1VCfEdPVE98SUZ8SU5QVVR8SU5URUdFUnxJT0NUTHxLRVl8S0lMTHxMSU5FIElOUFVUfExPQ0FURXxMT0NLfExPTkd8TE9PUHxMU0VUfE1LRElSfE5BTUV8TkVYVHxPRkZ8T04oPzogQ09NfCBFUlJPUnwgS0VZfCBUSU1FUik/fE9QRU58T1BUSU9OIEJBU0V8T1VUfFBPS0V8UFVUfFJFQUR8UkVESU18UkVNfFJFU1RPUkV8UkVTVU1FfFJFVFVSTnxSTURJUnxSU0VUfFJVTnxTRUxFQ1QgQ0FTRXxTSEFSRUR8U0hFTEx8U0lOR0xFfFNMRUVQfFNUQVRJQ3xTVEVQfFNUT1B8U1RSSU5HfFNVQnxTV0FQfFNZU1RFTXxUSEVOfFRJTUVSfFRPfFRST0ZGfFRST058VFlQRXxVTkxPQ0t8VU5USUx8VVNJTkd8VklFVyBQUklOVHxXQUlUfFdFTkR8V0hJTEV8V1JJVEUpKD86XFwkfFxcYikvaSxcblx0J2Z1bmN0aW9uJzogL1xcYig/OkFCU3xBQ0NFU1N8QUNPU3xBTkdMRXxBUkVBfEFSSVRITUVUSUN8QVJSQVl8QVNJTnxBU0t8QVR8QVROfEJBU0V8QkVHSU58QlJFQUt8Q0FVU0V8Q0VJTHxDSFJ8Q0xJUHxDT0xMQVRFfENPTE9SfENPTnxDT1N8Q09TSHxDT1R8Q1NDfERBVEV8REFUVU18REVCVUd8REVDSU1BTHxERUZ8REVHfERFR1JFRVN8REVMRVRFfERFVHxERVZJQ0V8RElTUExBWXxET1R8RUxBUFNFRHxFUFN8RVJBU0FCTEV8RVhMSU5FfEVYUHxFWFRFUk5BTHxFWFRZUEV8RklMRVRZUEV8RklYRUR8RlB8R098R1JBUEh8SEFORExFUnxJRE58SU1BR0V8SU58SU5UfElOVEVSTkFMfElQfElTfEtFWUVEfExCT1VORHxMQ0FTRXxMRUZUfExFTnxMRU5HVEh8TEVUfExJTkV8TElORVN8TE9HfExPRzEwfExPRzJ8TFRSSU18TUFSR0lOfE1BVHxNQVh8TUFYTlVNfE1JRHxNSU58TUlTU0lOR3xNT0R8TkFUSVZFfE5VTHxOVU1FUklDfE9GfE9QVElPTnxPUkR8T1JHQU5JWkFUSU9OfE9VVElOfE9VVFBVVHxQSXxQT0lOVHxQT0lOVEVSfFBPSU5UU3xQT1N8UFJJTlR8UFJPR1JBTXxQUk9NUFR8UkFEfFJBRElBTlN8UkFORE9NSVpFfFJFQ09SRHxSRUNTSVpFfFJFQ1RZUEV8UkVMQVRJVkV8UkVNQUlOREVSfFJFUEVBVHxSRVNUfFJFVFJZfFJFV1JJVEV8UklHSFR8Uk5EfFJPVU5EfFJUUklNfFNBTUV8U0VDfFNFTEVDVHxTRVFVRU5USUFMfFNFVHxTRVRURVJ8U0dOfFNJTnxTSU5IfFNJWkV8U0tJUHxTUVJ8U1RBTkRBUkR8U1RBVFVTfFNUUnxTVFJFQU18U1RZTEV8VEFCfFRBTnxUQU5IfFRFTVBMQVRFfFRFWFR8VEhFUkV8VElNRXxUSU1FT1VUfFRSQUNFfFRSQU5TRk9STXxUUlVOQ0FURXxVQk9VTkR8VUNBU0V8VVNFfFZBTHxWQVJJQUJMRXxWSUVXUE9SVHxXSEVOfFdJTkRPV3xXSVRIfFpFUnxaT05FV0lEVEgpKD86XFwkfFxcYikvaSxcblx0J29wZXJhdG9yJzogLzxbPT5dP3w+PT98WytcXC0qXFwvXj0mXXxcXGIoPzpBTkR8RVFWfElNUHxOT1R8T1J8WE9SKVxcYi9pLFxuXHQncHVuY3R1YXRpb24nOiAvWyw7OigpXS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0dmFyIHZhcmlhYmxlID0gLyUlP1t+Olxcd10rJT98IVxcUyshLztcblx0dmFyIHBhcmFtZXRlciA9IHtcblx0XHRwYXR0ZXJuOiAvXFwvW2Etej9dKyg/PVsgOl18JCk6P3wtW2Etel1cXGJ8LS1bYS16LV0rXFxiL2ltLFxuXHRcdGFsaWFzOiAnYXR0ci1uYW1lJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC86L1xuXHRcdH1cblx0fTtcblx0dmFyIHN0cmluZyA9IC9cIig/OltcXFxcXCJdXCJ8W15cIl0pKlwiKD8hXCIpLztcblx0dmFyIG51bWJlciA9IC8oPzpcXGJ8LSlcXGQrXFxiLztcblxuXHRQcmlzbS5sYW5ndWFnZXMuYmF0Y2ggPSB7XG5cdFx0J2NvbW1lbnQnOiBbXG5cdFx0XHQvXjo6LiovbSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFsmKF0pWyBcXHRdKilyZW1cXGIoPzpbXl4mKVxcclxcbl18XFxeKD86XFxyXFxufFtcXHNcXFNdKSkqL2ltLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnbGFiZWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXjouKi9tLFxuXHRcdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0XHR9LFxuXHRcdCdjb21tYW5kJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBGT1IgY29tbWFuZFxuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58WyYoXSlbIFxcdF0qKWZvcig/OiBcXC9bYS16P10oPzpbIDpdKD86XCJbXlwiXSpcInxbXlxcc1wiL11cXFMqKSk/KSogXFxTKyBpbiBcXChbXildK1xcKSBkby9pbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2tleXdvcmQnOiAvXFxiKD86ZG98aW4pXFxifF5mb3JcXGIvaSxcblx0XHRcdFx0XHQnc3RyaW5nJzogc3RyaW5nLFxuXHRcdFx0XHRcdCdwYXJhbWV0ZXInOiBwYXJhbWV0ZXIsXG5cdFx0XHRcdFx0J3ZhcmlhYmxlJzogdmFyaWFibGUsXG5cdFx0XHRcdFx0J251bWJlcic6IG51bWJlcixcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWygpJyxdL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBJRiBjb21tYW5kXG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbJihdKVsgXFx0XSopaWYoPzogXFwvW2Etej9dKD86WyA6XSg/OlwiW15cIl0qXCJ8W15cXHNcIi9dXFxTKikpPykqICg/Om5vdCApPyg/OmNtZGV4dHZlcnNpb24gXFxkK3xkZWZpbmVkIFxcdyt8ZXJyb3JsZXZlbCBcXGQrfGV4aXN0IFxcUyt8KD86XCJbXlwiXSpcInwoPyFcIikoPzooPyE9PSlcXFMpKyk/KD86PT18ICg/OmVxdXxnZXF8Z3RyfGxlcXxsc3N8bmVxKSApKD86XCJbXlwiXSpcInxbXlxcc1wiXVxcUyopKS9pbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2tleXdvcmQnOiAvXFxiKD86Y21kZXh0dmVyc2lvbnxkZWZpbmVkfGVycm9ybGV2ZWx8ZXhpc3R8bm90KVxcYnxeaWZcXGIvaSxcblx0XHRcdFx0XHQnc3RyaW5nJzogc3RyaW5nLFxuXHRcdFx0XHRcdCdwYXJhbWV0ZXInOiBwYXJhbWV0ZXIsXG5cdFx0XHRcdFx0J3ZhcmlhYmxlJzogdmFyaWFibGUsXG5cdFx0XHRcdFx0J251bWJlcic6IG51bWJlcixcblx0XHRcdFx0XHQnb3BlcmF0b3InOiAvXFxefD09fFxcYig/OmVxdXxnZXF8Z3RyfGxlcXxsc3N8bmVxKVxcYi9pXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEVMU0UgY29tbWFuZFxuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58WyYoKV0pWyBcXHRdKillbHNlXFxiL2ltLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQna2V5d29yZCc6IC9eZWxzZVxcYi9pXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFNFVCBjb21tYW5kXG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbJihdKVsgXFx0XSopc2V0KD86IFxcL1thLXpdKD86WyA6XSg/OlwiW15cIl0qXCJ8W15cXHNcIi9dXFxTKikpPykqICg/OlteXiYpXFxyXFxuXXxcXF4oPzpcXHJcXG58W1xcc1xcU10pKSovaW0sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdrZXl3b3JkJzogL15zZXRcXGIvaSxcblx0XHRcdFx0XHQnc3RyaW5nJzogc3RyaW5nLFxuXHRcdFx0XHRcdCdwYXJhbWV0ZXInOiBwYXJhbWV0ZXIsXG5cdFx0XHRcdFx0J3ZhcmlhYmxlJzogW1xuXHRcdFx0XHRcdFx0dmFyaWFibGUsXG5cdFx0XHRcdFx0XHQvXFx3Kyg/PSg/OlsqXFwvJStcXC0mXnxdfDw8fD4+KT89KS9cblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0XHRcdFx0J29wZXJhdG9yJzogL1sqXFwvJStcXC0mXnxdPT98PDw9P3w+Pj0/fFshfl89XS8sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1soKScsXS9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gT3RoZXIgY29tbWFuZHNcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFsmKF0pWyBcXHRdKkA/KVxcdytcXGIoPzpcIig/OltcXFxcXCJdXCJ8W15cIl0pKlwiKD8hXCIpfFteXCJeJilcXHJcXG5dfFxcXig/OlxcclxcbnxbXFxzXFxTXSkpKi9tLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQna2V5d29yZCc6IC9eXFx3K1xcYi8sXG5cdFx0XHRcdFx0J3N0cmluZyc6IHN0cmluZyxcblx0XHRcdFx0XHQncGFyYW1ldGVyJzogcGFyYW1ldGVyLFxuXHRcdFx0XHRcdCdsYWJlbCc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXlxccyopOlxcUysvbSxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3ZhcmlhYmxlJzogdmFyaWFibGUsXG5cdFx0XHRcdFx0J251bWJlcic6IG51bWJlcixcblx0XHRcdFx0XHQnb3BlcmF0b3InOiAvXFxeL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnb3BlcmF0b3InOiAvWyZAXS8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKSddL1xuXHR9O1xufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuYmJjb2RlID0ge1xuXHQndGFnJzoge1xuXHRcdHBhdHRlcm46IC9cXFtcXC8/W15cXHM9XFxdXSsoPzpcXHMqPVxccyooPzpcIlteXCJdKlwifCdbXiddKid8W15cXHMnXCJcXF09XSspKT8oPzpcXHMrW15cXHM9XFxdXStcXHMqPVxccyooPzpcIlteXCJdKlwifCdbXiddKid8W15cXHMnXCJcXF09XSspKSpcXHMqXFxdLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd0YWcnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eXFxbXFwvP1teXFxzPVxcXV0rLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXFtcXC8/L1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J2F0dHItdmFsdWUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC89XFxzKig/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXlxccydcIlxcXT1dKykvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiBbXG5cdFx0XHRcdFx0XHQvXj0vLFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMqKVtcIiddfFtcIiddJC8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFxdLyxcblx0XHRcdCdhdHRyLW5hbWUnOiAvW15cXHM9XFxdXSsvXG5cdFx0fVxuXHR9XG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuc2hvcnRjb2RlID0gUHJpc20ubGFuZ3VhZ2VzLmJiY29kZTtcblxuLy8gYmFzZWQgbG9vc2VseSB1cG9uOiBodHRwczovL2dpdGh1Yi5jb20vQXp1cmUvYmljZXAvYmxvYi9tYWluL3NyYy90ZXh0bWF0ZS9iaWNlcC50bWxhbmd1YWdlXG5QcmlzbS5sYW5ndWFnZXMuYmljZXAgPSB7XG5cdCdjb21tZW50JzogW1xuXHRcdHtcblx0XHRcdC8vIG11bHRpbGluZSBjb21tZW50cyBlZyAvKiBBU0RGICovXG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIHNpbmdsZWxpbmUgY29tbWVudHMgZWcgLy8gQVNERlxuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXDpdKVxcL1xcLy4qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cblx0J3Byb3BlcnR5JzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oW1xcclxcbl1bIFxcdF0qKVthLXpfXVxcdyooPz1bIFxcdF0qOikvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oW1xcclxcbl1bIFxcdF0qKScoPzpcXFxcLnxcXCQoPyFcXHspfFteJ1xcXFxcXHJcXG4kXSkqJyg/PVsgXFx0XSo6KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnc3RyaW5nJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8nJydbXiddW1xcc1xcU10qPycnJy8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFwnXSknKD86XFxcXC58XFwkKD8hXFx7KXxbXidcXFxcXFxyXFxuJF0pKicvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHR9XG5cdF0sXG5cdCdpbnRlcnBvbGF0ZWQtc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFwnXSknKD86XFxcXC58XFwkKD86KD8hXFx7KXxcXHtbXnt9XFxyXFxuXSpcXH0pfFteJ1xcXFxcXHJcXG4kXSkqJy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcJFxce1tee31cXHJcXG5dKlxcfS8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLyheXFwkXFx7KVtcXHNcXFNdKyg/PVxcfSQpLyxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFwkXFx7fFxcfSQvLFxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0fVxuXHR9LFxuXG5cdCdkYXRhdHlwZSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYig/Om91dHB1dHxwYXJhbSlcXGJbIFxcdF0rXFx3K1sgXFx0XSspXFx3K1xcYi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdH0sXG5cblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vQXp1cmUvYmljZXAvYmxvYi8xMTRhMzI1MWI0ZTZlMzAwODJhNTg3MjlmMTlhOGNjNGUzNzRmZmE2L3NyYy90ZXh0bWF0ZS9iaWNlcC50bWxhbmd1YWdlI0wxODRcblx0J2tleXdvcmQnOiAvXFxiKD86ZXhpc3Rpbmd8Zm9yfGlmfGlufG1vZHVsZXxudWxsfG91dHB1dHxwYXJhbXxyZXNvdXJjZXx0YXJnZXRTY29wZXx2YXIpXFxiLyxcblxuXHQnZGVjb3JhdG9yJzogL0BcXHcrXFxiLyxcblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1bIFxcdF0qXFwoKS9pLFxuXG5cdCdudW1iZXInOiAvKD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OkVbKy1dP1xcZCspPy9pLFxuXHQnb3BlcmF0b3InOiAvLS18XFwrXFwrfFxcKlxcKj0/fD0+fCYmPT98XFx8XFx8PT98WyE9XT09fDw8PT98Pj4+Pz0/fFstKyovJSZ8XiE9PD5dPT98XFwuezN9fFxcP1xcPz0/fFxcP1xcLj98W346XS8sXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLC46XS8sXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuYmljZXBbJ2ludGVycG9sYXRlZC1zdHJpbmcnXS5pbnNpZGVbJ2ludGVycG9sYXRpb24nXS5pbnNpZGVbJ2V4cHJlc3Npb24nXS5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuYmljZXA7XG5cblByaXNtLmxhbmd1YWdlcy5iaXJiID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL3I/KFwifCcpKD86XFxcXC58KD8hXFwxKVteXFxcXF0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjbGFzcy1uYW1lJzogW1xuXHRcdC9cXGJbQS1aXSg/OltcXGRfXSpbYS16QS1aXVxcdyopP1xcYi8sXG5cblx0XHQvLyBtYXRjaGVzIHZhcmlhYmxlIGFuZCBmdW5jdGlvbiByZXR1cm4gdHlwZXMgKHBhcmFtZXRlcnMgYXMgd2VsbCkuXG5cdFx0L1xcYig/OltBLVpdXFx3KnwoPyEoPzp2YXJ8dm9pZClcXGIpW2Etel1cXHcqKSg/PVxccytcXHcrXFxzKls7LD0oKV0pL1xuXHRdLFxuXHQna2V5d29yZCc6IC9cXGIoPzphc3NlcnR8YnJlYWt8Y2FzZXxjbGFzc3xjb25zdHxkZWZhdWx0fGVsc2V8ZW51bXxmaW5hbHxmb2xsb3dzfGZvcnxncmFifGlmfG5lc3R8bmV3fG5leHR8bm9TZWVifHJldHVybnxzdGF0aWN8c3dpdGNofHRocm93fHZhcnx2b2lkfHdoaWxlKVxcYi8sXG5cdCdvcGVyYXRvcic6IC9cXCtcXCt8LS18JiZ8XFx8XFx8fDw8PT98Pj49P3x+KD86XFwvPT8pP3xbK1xcLSpcXC8lJl58PSE8Pl09P3xcXD98Oi8sXG5cdCd2YXJpYWJsZSc6IC9cXGJbYS16X11cXHcqXFxiLyxcbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdiaXJiJywgJ2Z1bmN0aW9uJywge1xuXHQnbWV0YWRhdGEnOiB7XG5cdFx0cGF0dGVybjogLzxcXHcrPi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmJpc29uID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnYycsIHt9KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnYmlzb24nLCAnY29tbWVudCcsIHtcblx0J2Jpc29uJzoge1xuXHRcdC8vIFRoaXMgc2hvdWxkIG1hdGNoIGFsbCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlXG5cdFx0Ly8gaW5jbHVkaW5nIHRoZSBwcm9sb2d1ZShzKSwgdGhlIGJpc29uIGRlY2xhcmF0aW9ucyBhbmRcblx0XHQvLyB0aGUgZ3JhbW1hciBydWxlcy5cblx0XHRwYXR0ZXJuOiAvXig/OlteJV18JSg/ISUpKSolJVtcXHNcXFNdKj8lJS8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnYyc6IHtcblx0XHRcdFx0Ly8gQWxsb3cgZm9yIG9uZSBsZXZlbCBvZiBuZXN0ZWQgYnJhY2VzXG5cdFx0XHRcdHBhdHRlcm46IC8lXFx7W1xcc1xcU10qPyVcXH18XFx7KD86XFx7W159XSpcXH18W157fV0pKlxcfS8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXiU/XFx7fCU/XFx9JC8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J2Jpc29uLXZhcmlhYmxlJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1skQF0oPzo8W15cXHM+XSs+KT9bXFx3JF0rLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC88fD4vXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRyZXN0OiBQcmlzbS5sYW5ndWFnZXMuY1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J2NvbW1lbnQnOiBQcmlzbS5sYW5ndWFnZXMuYy5jb21tZW50LFxuXHRcdFx0J3N0cmluZyc6IFByaXNtLmxhbmd1YWdlcy5jLnN0cmluZyxcblx0XHRcdCdwcm9wZXJ0eSc6IC9cXFMrKD89OikvLFxuXHRcdFx0J2tleXdvcmQnOiAvJVxcdysvLFxuXHRcdFx0J251bWJlcic6IHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteQF0pXFxiKD86MHhbXFxkYS1mXSt8XFxkKykvaSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC8lWyU/XXxbfDo7XFxbXFxdPD5dL1xuXHRcdH1cblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5ibmYgPSB7XG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiW15cXHJcXG5cIl0qXCJ8J1teXFxyXFxuJ10qJy9cblx0fSxcblx0J2RlZmluaXRpb24nOiB7XG5cdFx0cGF0dGVybjogLzxbXjw+XFxyXFxuXFx0XSs+KD89XFxzKjo6PSkvLFxuXHRcdGFsaWFzOiBbJ3J1bGUnLCAna2V5d29yZCddLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL148fD4kL1xuXHRcdH1cblx0fSxcblx0J3J1bGUnOiB7XG5cdFx0cGF0dGVybjogLzxbXjw+XFxyXFxuXFx0XSs+Lyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9ePHw+JC9cblx0XHR9XG5cdH0sXG5cdCdvcGVyYXRvcic6IC86Oj18W3woKVtcXF17fSorP118XFwuezN9L1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnJibmYgPSBQcmlzbS5sYW5ndWFnZXMuYm5mO1xuXG5QcmlzbS5sYW5ndWFnZXMuYnJhaW5mdWNrID0ge1xuXHQncG9pbnRlcic6IHtcblx0XHRwYXR0ZXJuOiAvPHw+Lyxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdpbmNyZW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcKy8sXG5cdFx0YWxpYXM6ICdpbnNlcnRlZCdcblx0fSxcblx0J2RlY3JlbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvLS8sXG5cdFx0YWxpYXM6ICdkZWxldGVkJ1xuXHR9LFxuXHQnYnJhbmNoaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cXFt8XFxdLyxcblx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0fSxcblx0J29wZXJhdG9yJzogL1suLF0vLFxuXHQnY29tbWVudCc6IC9cXFMrL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmJyaWdodHNjcmlwdCA9IHtcblx0J2NvbW1lbnQnOiAvKD86XFxicmVtfCcpLiovaSxcblx0J2RpcmVjdGl2ZS1zdGF0ZW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKikjKD86Y29uc3R8ZWxzZSg/OltcXHQgXStpZik/fGVuZFtcXHQgXStpZnxlcnJvcnxpZikuKi9pbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAncHJvcGVydHknLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2Vycm9yLW1lc3NhZ2UnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXiNlcnJvcikuKy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQnZGlyZWN0aXZlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXiMoPzpjb25zdHxlbHNlKD86W1xcdCBdK2lmKT98ZW5kW1xcdCBdK2lmfGVycm9yfGlmKS8sXG5cdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdH0sXG5cdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdwcm9wZXJ0eSc6IHtcblx0XHRwYXR0ZXJuOiAvKFtcXHJcXG57LF1bXFx0IF0qKSg/Oig/IVxcZClcXHcrfFwiKD86W15cIlxcclxcbl18XCJcIikqXCIoPyFcIikpKD89WyBcXHRdKjopLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXCJcXHJcXG5dfFwiXCIpKlwiKD8hXCIpLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogLyhcXGJBc1tcXHQgXSspXFx3Ky9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86QXN8RGltfEVhY2h8RWxzZXxFbHNlaWZ8RW5kfEV4aXR8Rm9yfEZ1bmN0aW9ufEdvdG98SWZ8SW58UHJpbnR8UmV0dXJufFN0ZXB8U3RvcHxTdWJ8VGhlbnxUb3xXaGlsZSlcXGIvaSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvaSxcblx0J2Z1bmN0aW9uJzogL1xcYig/IVxcZClcXHcrKD89W1xcdCBdKlxcKCkvLFxuXHQnbnVtYmVyJzogLyg/OlxcYlxcZCsoPzpcXC5cXGQrKT8oPzpbZWRdWystXVxcZCspP3wmaFthLWZcXGRdKylcXGJbJSYhI10/L2ksXG5cdCdvcGVyYXRvcic6IC8tLXxcXCtcXCt8Pj49P3w8PD0/fDw+fFstKyovXFxcXDw+XT0/fFs6Xj0/XXxcXGIoPzphbmR8bW9kfG5vdHxvcilcXGIvaSxcblx0J3B1bmN0dWF0aW9uJzogL1suLDsoKVtcXF17fV0vLFxuXHQnY29uc3RhbnQnOiAvXFxiKD86TElORV9OVU0pXFxiL2lcbn07XG5cblByaXNtLmxhbmd1YWdlcy5icmlnaHRzY3JpcHRbJ2RpcmVjdGl2ZS1zdGF0ZW1lbnQnXS5pbnNpZGUuZXhwcmVzc2lvbi5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuYnJpZ2h0c2NyaXB0O1xuXG5QcmlzbS5sYW5ndWFnZXMuYnJvID0ge1xuXG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFwkXSkjLiovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaXRhbGljJzogL1xcYig/OkZJWE1FfFRPRE98WFhYKVxcYi9cblx0XHR9XG5cdH0sXG5cblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFtcIiddKSg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdib29sZWFuJzogL1xcYltURl1cXGIvLFxuXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYig/OmV2ZW50fGZ1bmN0aW9ufGhvb2spWyBcXHRdKylcXHcrKD86OjpcXHcrKT8vLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblxuXHQnYnVpbHRpbic6IC8oPzpAKD86bG9hZCg/Oi0oPzpwbHVnaW58c2lncykpP3x1bmxvYWR8cHJlZml4ZXN8aWZuP2RlZnxlbHNlfCg/OmVuZCk/aWZ8RElSfEZJTEVOQU1FKSl8KD86Jj8oPzphZGRfZnVuY3xjcmVhdGVfZXhwaXJlfGRlZmF1bHR8ZGVsZXRlX2Z1bmN8ZW5jcnlwdHxlcnJvcl9oYW5kbGVyfGV4cGlyZV9mdW5jfGdyb3VwfGxvZ3xtZXJnZWFibGV8b3B0aW9uYWx8cGVyc2lzdGVudHxwcmlvcml0eXxyYXdfb3V0cHV0fHJlYWRfZXhwaXJlfHJlZGVmfHJvdGF0ZV9pbnRlcnZhbHxyb3RhdGVfc2l6ZXxzeW5jaHJvbml6ZWR8dHlwZV9jb2x1bW58d3JpdGVfZXhwaXJlKSkvLFxuXG5cdCdjb25zdGFudCc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYmNvbnN0WyBcXHRdKylcXHcrL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXG5cdCdrZXl3b3JkJzogL1xcYig/OmFkZHxhZGRyfGFsYXJtfGFueXxib29sfGJyZWFrfGNvbnN0fGNvbnRpbnVlfGNvdW50fGRlbGV0ZXxkb3VibGV8ZWxzZXxlbnVtfGV2ZW50fGV4cG9ydHxmaWxlfGZvcnxmdW5jdGlvbnxnbG9iYWx8aG9va3xpZnxpbnxpbnR8aW50ZXJ2YWx8bG9jYWx8bW9kdWxlfG5leHR8b2Z8b3BhcXVlfHBhdHRlcm58cG9ydHxwcmludHxyZWNvcmR8cmV0dXJufHNjaGVkdWxlfHNldHxzdHJpbmd8c3VibmV0fHRhYmxlfHRpbWV8dGltZW91dHx1c2luZ3x2ZWN0b3J8d2hlbilcXGIvLFxuXG5cdCdvcGVyYXRvcic6IC8tLT98XFwrXFwrP3whPT89P3w8PT98Pj0/fD09Pz0/fCYmfFxcfFxcfD98XFw/fFxcKnxcXC98fnxcXF58JS8sXG5cblx0J251bWJlcic6IC9cXGIweFtcXGRhLWZdK1xcYnwoPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/L2ksXG5cblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksLjpdL1xufTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tbWlzbGVhZGluZy1jaGFyYWN0ZXItY2xhc3MgKi9cblxuLy8gMUM6RW50ZXJwcmlzZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0RpdmVyc3VzMjMvXG4vL1xuUHJpc20ubGFuZ3VhZ2VzLmJzbCA9IHtcblx0J2NvbW1lbnQnOiAvXFwvXFwvLiovLFxuXHQnc3RyaW5nJzogW1xuXHRcdC8vIFx1MDQyMVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzQVx1MDQzOFxuXHRcdC8vIFN0cmluZ3Ncblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXXxcIlwiKSpcIig/IVwiKS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdC8vIFx1MDQxNFx1MDQzMFx1MDQ0Mlx1MDQzMCBcdTA0MzggXHUwNDMyXHUwNDQwXHUwNDM1XHUwNDNDXHUwNDRGXG5cdFx0Ly8gRGF0ZSAmIHRpbWVcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvJyg/OlteJ1xcclxcblxcXFxdfFxcXFwuKSonL1xuXHRcdH1cblx0XSxcblx0J2tleXdvcmQnOiBbXG5cdFx0e1xuXHRcdFx0Ly8gUlVcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcd1xcdTA0MDAtXFx1MDQ4NFxcdTA0ODctXFx1MDUyZlxcdTFkMmJcXHUxZDc4XFx1MmRlMC1cXHUyZGZmXFx1YTY0MC1cXHVhNjlmXFx1ZmUyZVxcdWZlMmZdKSg/Olx1MDQzRlx1MDQzRVx1MDQzQVx1MDQzMHxcdTA0MzRcdTA0M0JcdTA0NEZ8XHUwNDNEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDM5fFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0Q3xcdTA0M0ZcdTA0M0VcdTA0M0ZcdTA0NEJcdTA0NDJcdTA0M0FcdTA0MzB8XHUwNDM4XHUwNDQxXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1fFx1MDQzMlx1MDQ0Qlx1MDQzN1x1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0Q1x1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNXxcdTA0MzhcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzV8XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDQ2XHUwNDNGXHUwNDNFXHUwNDNGXHUwNDRCXHUwNDQyXHUwNDNBXHUwNDM4fFx1MDQzRFx1MDQzNVx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRXxcdTA0NDRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0MzhcdTA0NEZ8XHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNDfFx1MDQzMlx1MDQzRVx1MDQzN1x1MDQzMlx1MDQ0MFx1MDQzMFx1MDQ0MnxcdTA0M0FcdTA0M0VcdTA0M0RcdTA0MzVcdTA0NDZcdTA0NDRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0MzhcdTA0Mzh8XHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4fFx1MDQzOFx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOHxcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDZcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NDBcdTA0MzB8XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDQ2XHUwNDNGXHUwNDQwXHUwNDNFXHUwNDQ2XHUwNDM1XHUwNDM0XHUwNDQzXHUwNDQwXHUwNDRCfFx1MDQ0Mlx1MDQzRVx1MDQzM1x1MDQzNFx1MDQzMHxcdTA0MzdcdTA0M0RcdTA0MzBcdTA0NDd8XHUwNDREXHUwNDNBXHUwNDQxXHUwNDNGXHUwNDNFXHUwNDQwXHUwNDQyfFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzNVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOHxcdTA0MzhcdTA0Mzd8XHUwNDNBXHUwNDMwXHUwNDM2XHUwNDM0XHUwNDNFXHUwNDMzXHUwNDNFfFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzRFx1MDQzMHxcdTA0M0JcdTA0M0VcdTA0MzZcdTA0NEN8XHUwNDNGXHUwNDNFfFx1MDQ0Nlx1MDQzOFx1MDQzQVx1MDQzQnxcdTA0M0FcdTA0M0VcdTA0M0RcdTA0MzVcdTA0NDZcdTA0NDZcdTA0MzhcdTA0M0FcdTA0M0JcdTA0MzB8XHUwNDMyXHUwNDRCXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNEXHUwNDM4XHUwNDQyXHUwNDRDKSg/IVtcXHdcXHUwNDAwLVxcdTA0ODRcXHUwNDg3LVxcdTA1MmZcXHUxZDJiXFx1MWQ3OFxcdTJkZTAtXFx1MmRmZlxcdWE2NDAtXFx1YTY5ZlxcdWZlMmVcXHVmZTJmXSkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIEVOXG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86YnJlYWt8ZG98ZWFjaHxlbHNlfGVsc2VpZnxlbmRkb3xlbmRmdW5jdGlvbnxlbmRpZnxlbmRwcm9jZWR1cmV8ZW5kdHJ5fGV4Y2VwdHxleGVjdXRlfGV4cG9ydHxmYWxzZXxmb3J8ZnVuY3Rpb258aWZ8aW58bmV3fG51bGx8cHJvY2VkdXJlfHJhaXNlfHJldHVybnx0aGVufHRvfHRydWV8dHJ5fHVuZGVmaW5lZHx2YWx8dmFyfHdoaWxlKVxcYi9pXG5cdFx0fVxuXHRdLFxuXHQnbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8oXig/PVxcZCl8W15cXHdcXHUwNDAwLVxcdTA0ODRcXHUwNDg3LVxcdTA1MmZcXHUxZDJiXFx1MWQ3OFxcdTJkZTAtXFx1MmRmZlxcdWE2NDAtXFx1YTY5ZlxcdWZlMmVcXHVmZTJmXSkoPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86RVsrLV0/XFxkKyk/L2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnb3BlcmF0b3InOiBbXG5cdFx0L1s8PitcXC0qL109P3xbJT1dLyxcblx0XHQvLyBSVVxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcd1xcdTA0MDAtXFx1MDQ4NFxcdTA0ODctXFx1MDUyZlxcdTFkMmJcXHUxZDc4XFx1MmRlMC1cXHUyZGZmXFx1YTY0MC1cXHVhNjlmXFx1ZmUyZVxcdWZlMmZdKSg/Olx1MDQzOHxcdTA0MzhcdTA0M0JcdTA0Mzh8XHUwNDNEXHUwNDM1KSg/IVtcXHdcXHUwNDAwLVxcdTA0ODRcXHUwNDg3LVxcdTA1MmZcXHUxZDJiXFx1MWQ3OFxcdTJkZTAtXFx1MmRmZlxcdWE2NDAtXFx1YTY5ZlxcdWZlMmVcXHVmZTJmXSkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC8vIEVOXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYig/OmFuZHxub3R8b3IpXFxiL2lcblx0XHR9XG5cdF0sXG5cdCdwdW5jdHVhdGlvbic6IC9cXChcXC58XFwuXFwpfFsoKVxcW1xcXTo7LC5dLyxcblx0J2RpcmVjdGl2ZSc6IFtcblx0XHQvLyBcdTA0MjJcdTA0MzVcdTA0MzNcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDNGXHUwNDQwXHUwNDNFXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwIFx1MDQzMlx1MDQzOFx1MDQzNFx1MDQzMCAmXHUwNDFBXHUwNDNCXHUwNDM4XHUwNDM1XHUwNDNEXHUwNDQyLCAmXHUwNDIxXHUwNDM1XHUwNDQwXHUwNDMyXHUwNDM1XHUwNDQwLCAuLi5cblx0XHQvLyBQcmVwcm9jZXNzb3IgdGFncyBvZiB0aGUgdHlwZSAmQ2xpZW50LCAmU2VydmVyLCAuLi5cblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXihbIFxcdF0qKSYuKi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdH0sXG5cdFx0Ly8gXHUwNDE4XHUwNDNEXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNBXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQ0Nlx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzRVx1MDQ0MFx1MDQzMCBcdTA0MzJcdTA0MzhcdTA0MzRcdTA0MzA6XG5cdFx0Ly8gI1x1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0MjFcdTA0MzVcdTA0NDBcdTA0MzJcdTA0MzVcdTA0NDAgXHUwNDIyXHUwNDNFXHUwNDMzXHUwNDM0XHUwNDMwXG5cdFx0Ly8gLi4uXG5cdFx0Ly8gI1x1MDQxQVx1MDQzRVx1MDQzRFx1MDQzNVx1MDQ0Nlx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOFxuXHRcdC8vIFByZXByb2Nlc3NvciBpbnN0cnVjdGlvbnMgb2YgdGhlIGZvcm06XG5cdFx0Ly8gI0lmIFNlcnZlciBUaGVuXG5cdFx0Ly8gLi4uXG5cdFx0Ly8gI0VuZElmXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL14oWyBcXHRdKikjLiovZ20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0fVxuXHRdXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMub3NjcmlwdCA9IFByaXNtLmxhbmd1YWdlc1snYnNsJ107XG5cbi8vIGh0dHBzOi8vY2Zkb2NzLm9yZy9zY3JpcHRcblByaXNtLmxhbmd1YWdlcy5jZnNjcmlwdCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnY29tbWVudCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2Fubm90YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyg/Ol58W14uXSlAW1xcd1xcLl0rLyxcblx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcOl0pXFwvXFwvLiovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J2tleXdvcmQnOiAvXFxiKD86YWJzdHJhY3R8YnJlYWt8Y2F0Y2h8Y29tcG9uZW50fGNvbnRpbnVlfGRlZmF1bHR8ZG98ZWxzZXxleHRlbmRzfGZpbmFsfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufGlmfGlufGluY2x1ZGV8cGFja2FnZXxwcml2YXRlfHByb3BlcnR5fHB1YmxpY3xyZW1vdGV8cmVxdWlyZWR8cmV0aHJvd3xyZXR1cm58c3RhdGljfHN3aXRjaHx0aHJvd3x0cnl8dmFyfHdoaWxlfHhtbClcXGIoPyFcXHMqPSkvLFxuXHQnb3BlcmF0b3InOiBbXG5cdFx0L1xcK1xcK3wtLXwmJnxcXHxcXHx8Ojp8PT58WyE9XT09fFstKyovJSZ8XiE9PD5dPT98XFw/KD86XFwufDopP3w6Lyxcblx0XHQvXFxiKD86YW5kfGNvbnRhaW5zfGVxfGVxdWFsfGVxdnxndHxndGV8aW1wfGlzfGx0fGx0ZXxtb2R8bm90fG9yfHhvcilcXGIvXG5cdF0sXG5cdCdzY29wZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86YXBwbGljYXRpb258YXJndW1lbnRzfGNnaXxjbGllbnR8Y29va2llfGxvY2FsfHNlc3Npb258c3VwZXJ8dGhpc3x2YXJpYWJsZXMpXFxiLyxcblx0XHRhbGlhczogJ2dsb2JhbCdcblx0fSxcblx0J3R5cGUnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OmFueXxhcnJheXxiaW5hcnl8Ym9vbGVhbnxkYXRlfGd1aWR8bnVtZXJpY3xxdWVyeXxzdHJpbmd8c3RydWN0fHV1aWR8dm9pZHx4bWwpXFxiLyxcblx0XHRhbGlhczogJ2J1aWx0aW4nXG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjZnNjcmlwdCcsICdrZXl3b3JkJywge1xuXHQvLyBUaGlzIG11c3QgYmUgZGVjbGFyZWQgYmVmb3JlIGtleXdvcmQgYmVjYXVzZSB3ZSB1c2UgXCJmdW5jdGlvblwiIGluc2lkZSB0aGUgbG9va2FoZWFkXG5cdCdmdW5jdGlvbi12YXJpYWJsZSc6IHtcblx0XHRwYXR0ZXJuOiAvW18kYS16QS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqKD89XFxzKls9Ol1cXHMqKD86XFxiZnVuY3Rpb25cXGJ8KD86XFwoKD86W14oKV18XFwoW14oKV0qXFwpKSpcXCl8KD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKilcXHMqPT4pKS8sXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fVxufSk7XG5cbmRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMuY2ZzY3JpcHRbJ2NsYXNzLW5hbWUnXTtcblByaXNtLmxhbmd1YWdlcy5jZmMgPSBQcmlzbS5sYW5ndWFnZXNbJ2Nmc2NyaXB0J107XG5cblByaXNtLmxhbmd1YWdlcy5jaGFpc2NyaXB0ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pJyg/OlteJ1xcXFxdfFxcXFxbXFxzXFxTXSkqJy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0e1xuXHRcdFx0Ly8gZS5nLiBjbGFzcyBSZWN0YW5nbGUgeyAuLi4gfVxuXHRcdFx0cGF0dGVybjogLyhcXGJjbGFzc1xccyspXFx3Ky8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBlLmcuIGF0dHIgUmVjdGFuZ2xlOjpoZWlnaHQsIGRlZiBSZWN0YW5nbGU6OmFyZWEoKSB7IC4uLiB9XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmF0dHJ8ZGVmKVxccyspXFx3Kyg/PVxccyo6OikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J2tleXdvcmQnOiAvXFxiKD86YXR0cnxhdXRvfGJyZWFrfGNhc2V8Y2F0Y2h8Y2xhc3N8Y29udGludWV8ZGVmfGRlZmF1bHR8ZWxzZXxmaW5hbGx5fGZvcnxmdW58Z2xvYmFsfGlmfHJldHVybnxzd2l0Y2h8dGhpc3x0cnl8dmFyfHdoaWxlKVxcYi8sXG5cdCdudW1iZXInOiBbXG5cdFx0UHJpc20ubGFuZ3VhZ2VzLmNwcC5udW1iZXIsXG5cdFx0L1xcYig/OkluZmluaXR5fE5hTilcXGIvXG5cdF0sXG5cdCdvcGVyYXRvcic6IC8+Pj0/fDw8PT98XFx8XFx8fCYmfDpbOj1dP3wtLXxcXCtcXCt8Wz0hPD4rXFwtKi8lfCZeXT0/fFs/fl18YFteYFxcclxcbl17MSw0fWAvLFxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NoYWlzY3JpcHQnLCAnb3BlcmF0b3InLCB7XG5cdCdwYXJhbWV0ZXItdHlwZSc6IHtcblx0XHQvLyBlLmcuIGRlZiBmb28oaW50IHgsIFZlY3RvciB5KSB7Li4ufVxuXHRcdHBhdHRlcm46IC8oWywoXVxccyopXFx3Kyg/PVxccytcXHcpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0fSxcbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjaGFpc2NyaXB0JywgJ3N0cmluZycsIHtcblx0J3N0cmluZy1pbnRlcnBvbGF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVwiKD86W15cIiRcXFxcXXxcXFxcW1xcc1xcU118XFwkKD8hXFx7KXxcXCRcXHsoPzpbXnt9XXxcXHsoPzpbXnt9XXxcXHtbXnt9XSpcXH0pKlxcfSkqXFx9KSpcIi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFteXFxcXF0pKD86XFxcXHsyfSkqKVxcJFxceyg/Oltee31dfFxceyg/Oltee31dfFxce1tee31dKlxcfSkqXFx9KSpcXH0vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbi1leHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLyheXFwkXFx7KVtcXHNcXFNdKyg/PVxcfSQpLyxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5jaGFpc2NyaXB0XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eXFwkXFx7fFxcfSQvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHR9XG5cdH0sXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmNpbCA9IHtcblx0J2NvbW1lbnQnOiAvXFwvXFwvLiovLFxuXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhbXCInXSkoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQnZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC8oXnxcXFcpXFwuW2Etel0rKD89XFxzKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdH0sXG5cblx0Ly8gQWN0dWFsbHkgYW4gYXNzZW1ibHkgcmVmZXJlbmNlXG5cdCd2YXJpYWJsZSc6IC9cXFtbXFx3XFwuXStcXF0vLFxuXG5cblx0J2tleXdvcmQnOiAvXFxiKD86YWJzdHJhY3R8YW5zaXxhc3NlbWJseXxhdXRvfGF1dG9jaGFyfGJlZm9yZWZpZWxkaW5pdHxib29sfGJzdHJ8Ynl2YWxzdHJ8Y2F0Y2h8Y2hhcnxjaWx8Y2xhc3N8Y3VycmVuY3l8ZGF0ZXxkZWNpbWFsfGRlZmF1bHR8ZW51bXxlcnJvcnxleHBsaWNpdHxleHRlbmRzfGV4dGVybnxmYW1hbmRhc3NlbXxmYW1pbHl8ZmFtb3Jhc3NlbXxmaW5hbCg/Omx5KT98ZmxvYXQzMnxmbG9hdDY0fGhpZGVieXNpZ3x1P2ludCg/Ojh8MTZ8MzJ8NjQpP3xpYW50fGlkaXNwYXRjaHxpbXBsZW1lbnRzfGltcG9ydHxpbml0b25seXxpbnN0YW5jZXxpbnRlcmZhY2V8aXVua25vd258bGl0ZXJhbHxscHN0cnxscHN0cnVjdHxscHRzdHJ8bHB3c3RyfG1hbmFnZWR8bWV0aG9kfG5hdGl2ZSg/OlR5cGUpP3xuZXN0ZWR8bmV3c2xvdHxvYmplY3QoPzpyZWYpP3xwaW52b2tlaW1wbHxwcml2YXRlfHByaXZhdGVzY29wZXxwdWJsaWN8cmVxc2Vjb2JqfHJ0c3BlY2lhbG5hbWV8cnVudGltZXxzZWFsZWR8c2VxdWVudGlhbHxzZXJpYWxpemFibGV8c3BlY2lhbG5hbWV8c3RhdGljfHN0cmluZ3xzdHJ1Y3R8c3lzY2hhcnx0YnN0cnx1bmljb2RlfHVubWFuYWdlZGV4cHx1bnNpZ25lZHx2YWx1ZSg/OnR5cGUpP3x2YXJpYW50fHZpcnR1YWx8dm9pZClcXGIvLFxuXG5cdCdmdW5jdGlvbic6IC9cXGIoPzooPzpjb25zdHJhaW5lZHxub3xyZWFkb25seXx0YWlsfHVuYWxpZ25lZHx2b2xhdGlsZSlcXC4pPyg/OmNvbnZcXC4oPzpbaXVdWzEyNDhdP3xvdmZcXC5baXVdWzEyNDhdPyg/OlxcLnVuKT98clxcLnVufHI0fHI4KXxsZGNcXC4oPzppNCg/OlxcLlxcZCt8XFwuW21NXTF8XFwucyk/fGk4fHI0fHI4KXxsZGVsZW0oPzpcXC5baXVdWzEyNDhdP3xcXC5yWzQ4XXxcXC5yZWZ8YSk/fGxkaW5kXFwuKD86W2l1XVsxMjQ4XT98cls0OF18cmVmKXxzdGVsZW1cXC4/KD86aVsxMjQ4XT98cls0OF18cmVmKT98c3RpbmRcXC4oPzppWzEyNDhdP3xyWzQ4XXxyZWYpP3xlbmQoPzpmYXVsdHxmaWx0ZXJ8ZmluYWxseSl8bGRhcmcoPzpcXC5bMC0zc118YSg/OlxcLnMpPyk/fGxkbG9jKD86XFwuXFxkK3xcXC5zKT98c3ViKD86XFwub3ZmKD86XFwudW4pPyk/fG11bCg/OlxcLm92Zig/OlxcLnVuKT8pP3xhZGQoPzpcXC5vdmYoPzpcXC51bik/KT98c3Rsb2MoPzpcXC5bMC0zc10pP3xyZWZhbnkoPzp0eXBlfHZhbCl8Ymx0KD86XFwudW4pPyg/OlxcLnMpP3xibGUoPzpcXC51bik/KD86XFwucyk/fGJndCg/OlxcLnVuKT8oPzpcXC5zKT98YmdlKD86XFwudW4pPyg/OlxcLnMpP3x1bmJveCg/OlxcLmFueSk/fGluaXQoPzpibGt8b2JqKXxjYWxsKD86aXx2aXJ0KT98YnJmYWxzZSg/OlxcLnMpP3xibmVcXC51big/OlxcLnMpP3xsZGxvY2EoPzpcXC5zKT98YnJ6ZXJvKD86XFwucyk/fGJydHJ1ZSg/OlxcLnMpP3xicm51bGwoPzpcXC5zKT98YnJpbnN0KD86XFwucyk/fHN0YXJnKD86XFwucyk/fGxlYXZlKD86XFwucyk/fHNocig/OlxcLnVuKT98cmVtKD86XFwudW4pP3xkaXYoPzpcXC51bik/fGNsdCg/OlxcLnVuKT98YWxpZ25tZW50fGNhc3RjbGFzc3xsZHZpcnRmdG58YmVxKD86XFwucyk/fGNrZmluaXRlfGxkc2ZsZGF8bGR0b2tlbnxsb2NhbGxvY3xta3JlZmFueXxyZXRocm93fGNndFxcLnVufGFyZ2xpc3R8c3dpdGNofHN0c2ZsZHxzaXplb2Z8bmV3b2JqfG5ld2FycnxsZHNmbGR8bGRudWxsfGxkZmxkYXxpc2luc3R8dGhyb3d8c3RvYmp8c3RmbGR8bGRzdHJ8bGRvYmp8bGRsZW58bGRmdG58bGRmbGR8Y3BvYmp8Y3BibGt8YnJlYWt8YnJcXC5zfHhvcnxzaGx8cmV0fHBvcHxub3R8bm9wfG5lZ3xqbXB8ZHVwfGNndHxjZXF8Ym94fGFuZHxvcnxicilcXGIvLFxuXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J251bWJlcic6IC9cXGItPyg/OjB4WzAtOWEtZl0rfFxcZCspKD86XFwuWzAtOWEtZl0rKT9cXGIvaSxcblxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSw6PV18SUxfWzAtOUEtWmEtel0rL1xufTtcblxuLy8gQ29waWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2plbHVhcmQvcHJpc20tY2xvanVyZVxuUHJpc20ubGFuZ3VhZ2VzLmNsb2p1cmUgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC87LiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXCJcXFxcXXxcXFxcLikqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2hhcic6IC9cXFxcXFx3Ky8sXG5cdCdzeW1ib2wnOiB7XG5cdFx0cGF0dGVybjogLyhefFtcXHMoKVxcW1xcXXt9LF0pOjo/W1xcdyorIT8nPD49Ly4tXSsvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiB7XG5cdFx0cGF0dGVybjogLyhcXCgpKD86LXwtPnwtPj58XFwufFxcLlxcLnxcXCp8XFwvfFxcK3w8fDw9fD18PT18Pnw+PXxhY2Nlc3NvcnxhZ2VudHxhZ2VudC1lcnJvcnN8YWdldHxhbGVuZ3RofGFsbC1uc3xhbHRlcnxhbmR8YXBwZW5kLWNoaWxkfGFwcGx5fGFycmF5LW1hcHxhc2V0fGFzZXQtYm9vbGVhbnxhc2V0LWJ5dGV8YXNldC1jaGFyfGFzZXQtZG91YmxlfGFzZXQtZmxvYXR8YXNldC1pbnR8YXNldC1sb25nfGFzZXQtc2hvcnR8YXNzZXJ0fGFzc29jfGF3YWl0fGF3YWl0LWZvcnxiZWFufGJpbmRpbmd8Yml0LWFuZHxiaXQtbm90fGJpdC1vcnxiaXQtc2hpZnQtbGVmdHxiaXQtc2hpZnQtcmlnaHR8Yml0LXhvcnxib29sZWFufGJyYW5jaFxcP3xidXRsYXN0fGJ5dGV8Y2FzdHxjaGFyfGNoaWxkcmVufGNsYXNzfGNsZWFyLWFnZW50LWVycm9yc3xjb21tZW50fGNvbW11dGV8Y29tcHxjb21wYXJhdG9yfGNvbXBsZW1lbnR8Y29uY2F0fGNvbmR8Y29uanxjb25zfGNvbnN0YW50bHl8Y29uc3RydWN0LXByb3h5fGNvbnRhaW5zXFw/fGNvdW50fGNyZWF0ZS1uc3xjcmVhdGUtc3RydWN0fGN5Y2xlfGRlY3xkZWNsYXJlfGRlZnxkZWYtfGRlZmlubGluZXxkZWZpbnRlcmZhY2V8ZGVmbWFjcm98ZGVmbWV0aG9kfGRlZm11bHRpfGRlZm58ZGVmbi18ZGVmb25jZXxkZWZwcm9qZWN0fGRlZnByb3RvY29sfGRlZnJlY29yZHxkZWZzdHJ1Y3R8ZGVmdHlwZXxkZXJlZnxkaWZmZXJlbmNlfGRpc2p8ZGlzc29jfGRpc3RpbmN0fGRvfGRvYWxsfGRvY3xkb3J1bnxkb3NlcXxkb3N5bmN8ZG90aW1lc3xkb3RvfGRvdWJsZXxkb3dufGRyb3B8ZHJvcC13aGlsZXxlZGl0fGVuZFxcP3xlbnN1cmV8ZXZhbHxldmVyeVxcP3xmYWxzZVxcP3xmZmlyc3R8ZmlsZS1zZXF8ZmlsdGVyfGZpbmR8ZmluZC1kb2N8ZmluZC1uc3xmaW5kLXZhcnxmaXJzdHxmbG9hdHxmbHVzaHxmbnxmbnNlcXxmb3J8ZnJlc3R8Z2Vuc3ltfGdldHxnZXQtcHJveHktY2xhc3N8aGFzaC1tYXB8aGFzaC1zZXR8aWRlbnRpY2FsXFw/fGlkZW50aXR5fGlmfGlmLWxldHxpZi1ub3R8aW1wb3J0fGluLW5zfGluY3xpbmRleHxpbnNlcnQtY2hpbGR8aW5zZXJ0LWxlZnR8aW5zZXJ0LXJpZ2h0fGluc3BlY3QtdGFibGV8aW5zcGVjdC10cmVlfGluc3RhbmNlXFw/fGludHxpbnRlcmxlYXZlfGludGVyc2VjdGlvbnxpbnRvfGludG8tYXJyYXl8aXRlcmF0ZXxqb2lufGtleXxrZXlzfGtleXdvcmR8a2V5d29yZFxcP3xsYXN0fGxhenktY2F0fGxhenktY29uc3xsZWZ0fGxlZnRzfGxldHxsaW5lLXNlcXxsaXN0fGxpc3RcXCp8bG9hZHxsb2FkLWZpbGV8bG9ja2luZ3xsb25nfGxvb3B8bWFjcm9leHBhbmR8bWFjcm9leHBhbmQtMXxtYWtlLWFycmF5fG1ha2Utbm9kZXxtYXB8bWFwLWludmVydHxtYXBcXD98bWFwY2F0fG1heHxtYXgta2V5fG1lbWZufG1lcmdlfG1lcmdlLXdpdGh8bWV0YXxtaW58bWluLWtleXxtb25pdG9yLWVudGVyfG5hbWV8bmFtZXNwYWNlfG5lZ1xcP3xuZXd8bmV3bGluZXxuZXh0fG5pbFxcP3xub2RlfG5vdHxub3QtYW55XFw/fG5vdC1ldmVyeVxcP3xub3Q9fG5zfG5zLWltcG9ydHN8bnMtaW50ZXJuc3xucy1tYXB8bnMtbmFtZXxucy1wdWJsaWNzfG5zLXJlZmVyc3xucy1yZXNvbHZlfG5zLXVubWFwfG50aHxudGhyZXN0fG9yfHBhcnNlfHBhcnRpYWx8cGF0aHxwZWVrfHBvcHxwb3NcXD98cHJ8cHItc3RyfHByaW50fHByaW50LXN0cnxwcmludGxufHByaW50bG4tc3RyfHBybnxwcm4tc3RyfHByb2plY3R8cHJveHl8cHJveHktbWFwcGluZ3N8cXVvdHxxdW90ZXxyYW5kfHJhbmQtaW50fHJhbmdlfHJlLWZpbmR8cmUtZ3JvdXBzfHJlLW1hdGNoZXJ8cmUtbWF0Y2hlc3xyZS1wYXR0ZXJufHJlLXNlcXxyZWFkfHJlYWQtbGluZXxyZWN1cnxyZWR1Y2V8cmVmfHJlZi1zZXR8cmVmZXJ8cmVtfHJlbW92ZXxyZW1vdmUtbWV0aG9kfHJlbW92ZS1uc3xyZW5hbWV8cmVuYW1lLWtleXN8cmVwZWF0fHJlcGxhY2V8cmVwbGljYXRlfHJlc29sdmV8cmVzdHxyZXN1bHRzZXQtc2VxfHJldmVyc2V8cmZpcnN0fHJpZ2h0fHJpZ2h0c3xyb290fHJyZXN0fHJzZXF8c2Vjb25kfHNlbGVjdHxzZWxlY3Qta2V5c3xzZW5kfHNlbmQtb2ZmfHNlcXxzZXEtemlwfHNlcVxcP3xzZXR8c2V0IXxzaG9ydHxzbHVycHxzb21lfHNvcnR8c29ydC1ieXxzb3J0ZWQtbWFwfHNvcnRlZC1tYXAtYnl8c29ydGVkLXNldHxzcGVjaWFsLXN5bWJvbFxcP3xzcGxpdC1hdHxzcGxpdC13aXRofHN0cnxzdHJpbmdcXD98c3RydWN0fHN0cnVjdC1tYXB8c3Vic3xzdWJ2ZWN8c3ltYm9sfHN5bWJvbFxcP3xzeW5jfHRha2V8dGFrZS1udGh8dGFrZS13aGlsZXx0ZXN0fHRocm93fHRpbWV8dG8tYXJyYXl8dG8tYXJyYXktMmR8dHJlZS1zZXF8dHJ1ZVxcP3x0cnl8dW5pb258dXB8dXBkYXRlLXByb3h5fHZhbHx2YWxzfHZhcnx2YXItZ2V0fHZhci1zZXR8dmFyXFw/fHZlY3Rvcnx2ZWN0b3ItemlwfHZlY3RvclxcP3x3aGVufHdoZW4tZmlyc3R8d2hlbi1sZXR8d2hlbi1ub3R8d2l0aC1sb2NhbC12YXJzfHdpdGgtbWV0YXx3aXRoLW9wZW58d2l0aC1vdXQtc3RyfHhtbC1zZXF8eG1sLXppcHx6ZXJvXFw/fHppcG1hcHx6aXBwZXIpKD89W1xccyldfCQpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfG5pbHx0cnVlKVxcYi8sXG5cdCdudW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFx3JEBdKSg/OlxcZCsoPzpbLy5dXFxkKyk/KD86ZVsrLV0/XFxkKyk/fDB4W2EtZjAtOV0rfFsxLTldXFxkP3JbYS16MC05XSspW2xtbl0/KD8hW1xcdyRAXSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58W14nXSlcXCgpW1xcdyorIT8nPD49Ly4tXSsoPz1bXFxzKV18JCkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J29wZXJhdG9yJzogL1sjQF5gfl0vLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9XFxbXFxdKCksXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5jbWFrZSA9IHtcblx0J2NvbW1lbnQnOiAvIy4qLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlxcXFxcIl18XFxcXC4pKlwiLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcJFxceyg/Oltee30kXXxcXCRcXHtbXnt9JF0qXFx9KSpcXH0vLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwkXFx7fFxcfS8sXG5cdFx0XHRcdFx0J3ZhcmlhYmxlJzogL1xcdysvXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCd2YXJpYWJsZSc6IC9cXGIoPzpDTUFLRV9cXHcrfFxcdytfKD86KD86QklOQVJZfFNPVVJDRSlfRElSfERFU0NSSVBUSU9OfEhPTUVQQUdFX1VSTHxST09UfFZFUlNJT04oPzpfTUFKT1J8X01JTk9SfF9QQVRDSHxfVFdFQUspPyl8KD86QU5EUk9JRHxBUFBMRXxCT1JMQU5EfEJVSUxEX1NIQVJFRF9MSUJTfENBQ0hFfENQQUNLXyg/OkFCU09MVVRFX0RFU1RJTkFUSU9OX0ZJTEVTfENPTVBPTkVOVF9JTkNMVURFX1RPUExFVkVMX0RJUkVDVE9SWXxFUlJPUl9PTl9BQlNPTFVURV9JTlNUQUxMX0RFU1RJTkFUSU9OfElOQ0xVREVfVE9QTEVWRUxfRElSRUNUT1JZfElOU1RBTExfREVGQVVMVF9ESVJFQ1RPUllfUEVSTUlTU0lPTlN8SU5TVEFMTF9TQ1JJUFR8UEFDS0FHSU5HX0lOU1RBTExfUFJFRklYfFNFVF9ERVNURElSfFdBUk5fT05fQUJTT0xVVEVfSU5TVEFMTF9ERVNUSU5BVElPTil8Q1RFU1RfKD86QklOQVJZX0RJUkVDVE9SWXxCVUlMRF9DT01NQU5EfEJVSUxEX05BTUV8QlpSX0NPTU1BTkR8QlpSX1VQREFURV9PUFRJT05TfENIQU5HRV9JRHxDSEVDS09VVF9DT01NQU5EfENPTkZJR1VSQVRJT05fVFlQRXxDT05GSUdVUkVfQ09NTUFORHxDT1ZFUkFHRV9DT01NQU5EfENPVkVSQUdFX0VYVFJBX0ZMQUdTfENVUkxfT1BUSU9OU3xDVVNUT01fKD86Q09WRVJBR0VfRVhDTFVERXxFUlJPUl9FWENFUFRJT058RVJST1JfTUFUQ0h8RVJST1JfUE9TVF9DT05URVhUfEVSUk9SX1BSRV9DT05URVhUfE1BWElNVU1fRkFJTEVEX1RFU1RfT1VUUFVUX1NJWkV8TUFYSU1VTV9OVU1CRVJfT0ZfKD86RVJST1JTfFdBUk5JTkdTKXxNQVhJTVVNX1BBU1NFRF9URVNUX09VVFBVVF9TSVpFfE1FTUNIRUNLX0lHTk9SRXxQT1NUX01FTUNIRUNLfFBPU1RfVEVTVHxQUkVfTUVNQ0hFQ0t8UFJFX1RFU1R8VEVTVFNfSUdOT1JFfFdBUk5JTkdfRVhDRVBUSU9OfFdBUk5JTkdfTUFUQ0gpfENWU19DSEVDS09VVHxDVlNfQ09NTUFORHxDVlNfVVBEQVRFX09QVElPTlN8RFJPUF9MT0NBVElPTnxEUk9QX01FVEhPRHxEUk9QX1NJVEV8RFJPUF9TSVRFX0NEQVNIfERST1BfU0lURV9QQVNTV09SRHxEUk9QX1NJVEVfVVNFUnxFWFRSQV9DT1ZFUkFHRV9HTE9CfEdJVF9DT01NQU5EfEdJVF9JTklUX1NVQk1PRFVMRVN8R0lUX1VQREFURV9DVVNUT018R0lUX1VQREFURV9PUFRJT05TfEhHX0NPTU1BTkR8SEdfVVBEQVRFX09QVElPTlN8TEFCRUxTX0ZPUl9TVUJQUk9KRUNUU3xNRU1PUllDSEVDS18oPzpDT01NQU5EfENPTU1BTkRfT1BUSU9OU3xTQU5JVElaRVJfT1BUSU9OU3xTVVBQUkVTU0lPTlNfRklMRXxUWVBFKXxOSUdIVExZX1NUQVJUX1RJTUV8UDRfQ0xJRU5UfFA0X0NPTU1BTkR8UDRfT1BUSU9OU3xQNF9VUERBVEVfT1BUSU9OU3xSVU5fQ1VSUkVOVF9TQ1JJUFR8U0NQX0NPTU1BTkR8U0lURXxTT1VSQ0VfRElSRUNUT1JZfFNVQk1JVF9VUkx8U1ZOX0NPTU1BTkR8U1ZOX09QVElPTlN8U1ZOX1VQREFURV9PUFRJT05TfFRFU1RfTE9BRHxURVNUX1RJTUVPVVR8VFJJR0dFUl9TSVRFfFVQREFURV9DT01NQU5EfFVQREFURV9PUFRJT05TfFVQREFURV9WRVJTSU9OX09OTFl8VVNFX0xBVU5DSEVSUyl8Q1lHV0lOfEVOVnxFWEVDVVRBQkxFX09VVFBVVF9QQVRIfEdIUy1NVUxUSXxJT1N8TElCUkFSWV9PVVRQVVRfUEFUSHxNSU5HV3xNU1ZDKD86MTB8MTF8MTJ8MTR8NjB8NzB8NzF8ODB8OTB8X0lERXxfVE9PTFNFVF9WRVJTSU9OfF9WRVJTSU9OKT98TVNZU3xQUk9KRUNUX05BTUV8VU5JWHxXSU4zMnxXSU5DRXxXSU5ET1dTX1BIT05FfFdJTkRPV1NfU1RPUkV8WENPREUpKVxcYi8sXG5cdCdwcm9wZXJ0eSc6IC9cXGIoPzpjeHhfXFx3K3woPzpBUkNISVZFX09VVFBVVF8oPzpESVJFQ1RPUll8TkFNRSl8Q09NUElMRV9ERUZJTklUSU9OU3xDT01QSUxFX1BEQl9OQU1FfENPTVBJTEVfUERCX09VVFBVVF9ESVJFQ1RPUll8RVhDTFVERV9GUk9NX0RFRkFVTFRfQlVJTER8SU1QT1JURURfKD86SU1QTElCfExJQk5BTUV8TElOS19ERVBFTkRFTlRfTElCUkFSSUVTfExJTktfSU5URVJGQUNFX0xBTkdVQUdFU3xMSU5LX0lOVEVSRkFDRV9MSUJSQVJJRVN8TElOS19JTlRFUkZBQ0VfTVVMVElQTElDSVRZfExPQ0FUSU9OfE5PX1NPTkFNRXxPQkpFQ1RTfFNPTkFNRSl8SU5URVJQUk9DRURVUkFMX09QVElNSVpBVElPTnxMSUJSQVJZX09VVFBVVF9ESVJFQ1RPUll8TElCUkFSWV9PVVRQVVRfTkFNRXxMSU5LX0ZMQUdTfExJTktfSU5URVJGQUNFX0xJQlJBUklFU3xMSU5LX0lOVEVSRkFDRV9NVUxUSVBMSUNJVFl8TE9DQVRJT058TUFQX0lNUE9SVEVEX0NPTkZJR3xPU1hfQVJDSElURUNUVVJFU3xPVVRQVVRfTkFNRXxQREJfTkFNRXxQREJfT1VUUFVUX0RJUkVDVE9SWXxSVU5USU1FX09VVFBVVF9ESVJFQ1RPUll8UlVOVElNRV9PVVRQVVRfTkFNRXxTVEFUSUNfTElCUkFSWV9GTEFHU3xWU19DU0hBUlB8VlNfRE9UTkVUX1JFRkVSRU5DRVBST1B8VlNfRE9UTkVUX1JFRkVSRU5DRXxWU19HTE9CQUxfU0VDVElPTl9QT1NUfFZTX0dMT0JBTF9TRUNUSU9OX1BSRXxWU19HTE9CQUx8WENPREVfQVRUUklCVVRFKV9cXHcrfFxcdytfKD86Q0xBTkdfVElEWXxDT01QSUxFUl9MQVVOQ0hFUnxDUFBDSEVDS3xDUFBMSU5UfElOQ0xVREVfV0hBVF9ZT1VfVVNFfE9VVFBVVF9OQU1FfFBPU1RGSVh8VklTSUJJTElUWV9QUkVTRVQpfEFCU1RSQUNUfEFERElUSU9OQUxfTUFLRV9DTEVBTl9GSUxFU3xBRFZBTkNFRHxBTElBU0VEX1RBUkdFVHxBTExPV19EVVBMSUNBVEVfQ1VTVE9NX1RBUkdFVFN8QU5EUk9JRF8oPzpBTlRfQURESVRJT05BTF9PUFRJT05TfEFQSXxBUElfTUlOfEFSQ0h8QVNTRVRTX0RJUkVDVE9SSUVTfEdVSXxKQVJfREVQRU5ERU5DSUVTfE5BVElWRV9MSUJfREVQRU5ERU5DSUVTfE5BVElWRV9MSUJfRElSRUNUT1JJRVN8UFJPQ0VTU19NQVh8UFJPR1VBUkR8UFJPR1VBUkRfQ09ORklHX1BBVEh8U0VDVVJFX1BST1BTX1BBVEh8U0tJUF9BTlRfU1RFUHxTVExfVFlQRSl8QVJDSElWRV9PVVRQVVRfRElSRUNUT1JZfEFUVEFDSEVEX0ZJTEVTfEFUVEFDSEVEX0ZJTEVTX09OX0ZBSUx8QVVUT0dFTl8oPzpCVUlMRF9ESVJ8T1JJR0lOX0RFUEVORFN8UEFSQUxMRUx8U09VUkNFX0dST1VQfFRBUkdFVFNfRk9MREVSfFRBUkdFVF9ERVBFTkRTKXxBVVRPTU9DfEFVVE9NT0NfKD86Q09NUElMRVJfUFJFREVGSU5FU3xERVBFTkRfRklMVEVSU3xFWEVDVVRBQkxFfE1BQ1JPX05BTUVTfE1PQ19PUFRJT05TfFNPVVJDRV9HUk9VUHxUQVJHRVRTX0ZPTERFUil8QVVUT1JDQ3xBVVRPUkNDX0VYRUNVVEFCTEV8QVVUT1JDQ19PUFRJT05TfEFVVE9SQ0NfU09VUkNFX0dST1VQfEFVVE9VSUN8QVVUT1VJQ19FWEVDVVRBQkxFfEFVVE9VSUNfT1BUSU9OU3xBVVRPVUlDX1NFQVJDSF9QQVRIU3xCSU5BUllfRElSfEJVSUxEU1lTVEVNX1RBUkdFVFN8QlVJTERfUlBBVEh8QlVJTERfUlBBVEhfVVNFX09SSUdJTnxCVUlMRF9XSVRIX0lOU1RBTExfTkFNRV9ESVJ8QlVJTERfV0lUSF9JTlNUQUxMX1JQQVRIfEJVTkRMRXxCVU5ETEVfRVhURU5TSU9OfENBQ0hFX1ZBUklBQkxFU3xDTEVBTl9OT19DVVNUT018Q09NTU9OX0xBTkdVQUdFX1JVTlRJTUV8Q09NUEFUSUJMRV9JTlRFUkZBQ0VfKD86Qk9PTHxOVU1CRVJfTUFYfE5VTUJFUl9NSU58U1RSSU5HKXxDT01QSUxFXyg/OkRFRklOSVRJT05TfEZFQVRVUkVTfEZMQUdTfE9QVElPTlN8UERCX05BTUV8UERCX09VVFBVVF9ESVJFQ1RPUlkpfENPU1R8Q1BBQ0tfREVTS1RPUF9TSE9SVENVVFN8Q1BBQ0tfTkVWRVJfT1ZFUldSSVRFfENQQUNLX1BFUk1BTkVOVHxDUEFDS19TVEFSVFVQX1NIT1JUQ1VUU3xDUEFDS19TVEFSVF9NRU5VX1NIT1JUQ1VUU3xDUEFDS19XSVhfQUNMfENST1NTQ09NUElMSU5HX0VNVUxBVE9SfENVREFfRVhURU5TSU9OU3xDVURBX1BUWF9DT01QSUxBVElPTnxDVURBX1JFU09MVkVfREVWSUNFX1NZTUJPTFN8Q1VEQV9TRVBBUkFCTEVfQ09NUElMQVRJT058Q1VEQV9TVEFOREFSRHxDVURBX1NUQU5EQVJEX1JFUVVJUkVEfENYWF9FWFRFTlNJT05TfENYWF9TVEFOREFSRHxDWFhfU1RBTkRBUkRfUkVRVUlSRUR8Q19FWFRFTlNJT05TfENfU1RBTkRBUkR8Q19TVEFOREFSRF9SRVFVSVJFRHxERUJVR19DT05GSUdVUkFUSU9OU3xERUZJTkVfU1lNQk9MfERFRklOSVRJT05TfERFUEVORFN8REVQTE9ZTUVOVF9BRERJVElPTkFMX0ZJTEVTfERFUExPWU1FTlRfUkVNT1RFX0RJUkVDVE9SWXxESVNBQkxFRHxESVNBQkxFRF9GRUFUVVJFU3xFQ0xJUFNFX0VYVFJBX0NQUk9KRUNUX0NPTlRFTlRTfEVDTElQU0VfRVhUUkFfTkFUVVJFU3xFTkFCTEVEX0ZFQVRVUkVTfEVOQUJMRURfTEFOR1VBR0VTfEVOQUJMRV9FWFBPUlRTfEVOVklST05NRU5UfEVYQ0xVREVfRlJPTV9BTEx8RVhDTFVERV9GUk9NX0RFRkFVTFRfQlVJTER8RVhQT1JUX05BTUV8RVhQT1JUX1BST1BFUlRJRVN8RVhURVJOQUxfT0JKRUNUfEVjaG9TdHJpbmd8RkFJTF9SRUdVTEFSX0VYUFJFU1NJT058RklORF9MSUJSQVJZX1VTRV9MSUIzMl9QQVRIU3xGSU5EX0xJQlJBUllfVVNFX0xJQjY0X1BBVEhTfEZJTkRfTElCUkFSWV9VU0VfTElCWDMyX1BBVEhTfEZJTkRfTElCUkFSWV9VU0VfT1BFTkJTRF9WRVJTSU9OSU5HfEZJWFRVUkVTX0NMRUFOVVB8RklYVFVSRVNfUkVRVUlSRUR8RklYVFVSRVNfU0VUVVB8Rk9MREVSfEZSQU1FV09SS3xGb3J0cmFuX0ZPUk1BVHxGb3J0cmFuX01PRFVMRV9ESVJFQ1RPUll8R0VORVJBVEVEfEdFTkVSQVRPUl9GSUxFX05BTUV8R0VORVJBVE9SX0lTX01VTFRJX0NPTkZJR3xHSFNfSU5URUdSSVRZX0FQUHxHSFNfTk9fU09VUkNFX0dST1VQX0ZJTEV8R0xPQkFMX0RFUEVORFNfREVCVUdfTU9ERXxHTE9CQUxfREVQRU5EU19OT19DWUNMRVN8R05VdG9NU3xIQVNfQ1hYfEhFQURFUl9GSUxFX09OTFl8SEVMUFNUUklOR3xJTVBMSUNJVF9ERVBFTkRTX0lOQ0xVREVfVFJBTlNGT1JNfElNUE9SVEVEfElNUE9SVEVEXyg/OkNPTU1PTl9MQU5HVUFHRV9SVU5USU1FfENPTkZJR1VSQVRJT05TfEdMT0JBTHxJTVBMSUJ8TElCTkFNRXxMSU5LX0RFUEVOREVOVF9MSUJSQVJJRVN8TElOS19JTlRFUkZBQ0VfKD86TEFOR1VBR0VTfExJQlJBUklFU3xNVUxUSVBMSUNJVFkpfExPQ0FUSU9OfE5PX1NPTkFNRXxPQkpFQ1RTfFNPTkFNRSl8SU1QT1JUX1BSRUZJWHxJTVBPUlRfU1VGRklYfElOQ0xVREVfRElSRUNUT1JJRVN8SU5DTFVERV9SRUdVTEFSX0VYUFJFU1NJT058SU5TVEFMTF9OQU1FX0RJUnxJTlNUQUxMX1JQQVRIfElOU1RBTExfUlBBVEhfVVNFX0xJTktfUEFUSHxJTlRFUkZBQ0VfKD86QVVUT1VJQ19PUFRJT05TfENPTVBJTEVfREVGSU5JVElPTlN8Q09NUElMRV9GRUFUVVJFU3xDT01QSUxFX09QVElPTlN8SU5DTFVERV9ESVJFQ1RPUklFU3xMSU5LX0RFUEVORFN8TElOS19ESVJFQ1RPUklFU3xMSU5LX0xJQlJBUklFU3xMSU5LX09QVElPTlN8UE9TSVRJT05fSU5ERVBFTkRFTlRfQ09ERXxTT1VSQ0VTfFNZU1RFTV9JTkNMVURFX0RJUkVDVE9SSUVTKXxJTlRFUlBST0NFRFVSQUxfT1BUSU1JWkFUSU9OfElOX1RSWV9DT01QSUxFfElPU19JTlNUQUxMX0NPTUJJTkVEfEpPQl9QT09MU3xKT0JfUE9PTF9DT01QSUxFfEpPQl9QT09MX0xJTkt8S0VFUF9FWFRFTlNJT058TEFCRUxTfExBTkdVQUdFfExJQlJBUllfT1VUUFVUX0RJUkVDVE9SWXxMSU5LRVJfTEFOR1VBR0V8TElOS18oPzpERVBFTkRTfERFUEVORFNfTk9fU0hBUkVEfERJUkVDVE9SSUVTfEZMQUdTfElOVEVSRkFDRV9MSUJSQVJJRVN8SU5URVJGQUNFX01VTFRJUExJQ0lUWXxMSUJSQVJJRVN8T1BUSU9OU3xTRUFSQ0hfRU5EX1NUQVRJQ3xTRUFSQ0hfU1RBUlRfU1RBVElDfFdIQVRfWU9VX1VTRSl8TElTVEZJTEVfU1RBQ0t8TE9DQVRJT058TUFDT1NYX0JVTkRMRXxNQUNPU1hfQlVORExFX0lORk9fUExJU1R8TUFDT1NYX0ZSQU1FV09SS19JTkZPX1BMSVNUfE1BQ09TWF9QQUNLQUdFX0xPQ0FUSU9OfE1BQ09TWF9SUEFUSHxNQUNST1N8TUFOVUFMTFlfQURERURfREVQRU5ERU5DSUVTfE1FQVNVUkVNRU5UfE1PRElGSUVEfE5BTUV8Tk9fU09OQU1FfE5PX1NZU1RFTV9GUk9NX0lNUE9SVEVEfE9CSkVDVF9ERVBFTkRTfE9CSkVDVF9PVVRQVVRTfE9TWF9BUkNISVRFQ1RVUkVTfE9VVFBVVF9OQU1FfFBBQ0tBR0VTX0ZPVU5EfFBBQ0tBR0VTX05PVF9GT1VORHxQQVJFTlRfRElSRUNUT1JZfFBBU1NfUkVHVUxBUl9FWFBSRVNTSU9OfFBEQl9OQU1FfFBEQl9PVVRQVVRfRElSRUNUT1JZfFBPU0lUSU9OX0lOREVQRU5ERU5UX0NPREV8UE9TVF9JTlNUQUxMX1NDUklQVHxQUkVERUZJTkVEX1RBUkdFVFNfRk9MREVSfFBSRUZJWHxQUkVfSU5TVEFMTF9TQ1JJUFR8UFJJVkFURV9IRUFERVJ8UFJPQ0VTU09SU3xQUk9DRVNTT1JfQUZGSU5JVFl8UFJPSkVDVF9MQUJFTHxQVUJMSUNfSEVBREVSfFJFUE9SVF9VTkRFRklORURfUFJPUEVSVElFU3xSRVFVSVJFRF9GSUxFU3xSRVNPVVJDRXxSRVNPVVJDRV9MT0NLfFJVTEVfTEFVTkNIX0NPTVBJTEV8UlVMRV9MQVVOQ0hfQ1VTVE9NfFJVTEVfTEFVTkNIX0xJTkt8UlVMRV9NRVNTQUdFU3xSVU5USU1FX09VVFBVVF9ESVJFQ1RPUll8UlVOX1NFUklBTHxTS0lQX0FVVE9HRU58U0tJUF9BVVRPTU9DfFNLSVBfQVVUT1JDQ3xTS0lQX0FVVE9VSUN8U0tJUF9CVUlMRF9SUEFUSHxTS0lQX1JFVFVSTl9DT0RFfFNPVVJDRVN8U09VUkNFX0RJUnxTT1ZFUlNJT058U1RBVElDX0xJQlJBUllfRkxBR1N8U1RBVElDX0xJQlJBUllfT1BUSU9OU3xTVFJJTkdTfFNVQkRJUkVDVE9SSUVTfFNVRkZJWHxTWU1CT0xJQ3xUQVJHRVRfQVJDSElWRVNfTUFZX0JFX1NIQVJFRF9MSUJTfFRBUkdFVF9NRVNTQUdFU3xUQVJHRVRfU1VQUE9SVFNfU0hBUkVEX0xJQlN8VEVTVFN8VEVTVF9JTkNMVURFX0ZJTEV8VEVTVF9JTkNMVURFX0ZJTEVTfFRJTUVPVVR8VElNRU9VVF9BRlRFUl9NQVRDSHxUWVBFfFVTRV9GT0xERVJTfFZBTFVFfFZBUklBQkxFU3xWRVJTSU9OfFZJU0lCSUxJVFlfSU5MSU5FU19ISURERU58VlNfKD86Q09ORklHVVJBVElPTl9UWVBFfENPUFlfVE9fT1VUX0RJUnxERUJVR0dFUl8oPzpDT01NQU5EfENPTU1BTkRfQVJHVU1FTlRTfEVOVklST05NRU5UfFdPUktJTkdfRElSRUNUT1JZKXxERVBMT1lNRU5UX0NPTlRFTlR8REVQTE9ZTUVOVF9MT0NBVElPTnxET1RORVRfUkVGRVJFTkNFU3xET1RORVRfUkVGRVJFTkNFU19DT1BZX0xPQ0FMfElOQ0xVREVfSU5fVlNJWHxJT1RfU1RBUlRVUF9UQVNLfEtFWVdPUkR8UkVTT1VSQ0VfR0VORVJBVE9SfFNDQ19BVVhQQVRIfFNDQ19MT0NBTFBBVEh8U0NDX1BST0pFQ1ROQU1FfFNDQ19QUk9WSURFUnxTREtfUkVGRVJFTkNFU3xTSEFERVJfKD86RElTQUJMRV9PUFRJTUlaQVRJT05TfEVOQUJMRV9ERUJVR3xFTlRSWVBPSU5UfEZMQUdTfE1PREVMfE9CSkVDVF9GSUxFX05BTUV8T1VUUFVUX0hFQURFUl9GSUxFfFRZUEV8VkFSSUFCTEVfTkFNRSl8U1RBUlRVUF9QUk9KRUNUfFRPT0xfT1ZFUlJJREV8VVNFUl9QUk9QU3xXSU5SVF9DT01QT05FTlR8V0lOUlRfRVhURU5TSU9OU3xXSU5SVF9SRUZFUkVOQ0VTfFhBTUxfVFlQRSl8V0lMTF9GQUlMfFdJTjMyX0VYRUNVVEFCTEV8V0lORE9XU19FWFBPUlRfQUxMX1NZTUJPTFN8V09SS0lOR19ESVJFQ1RPUll8V1JBUF9FWENMVURFfFhDT0RFXyg/OkVNSVRfRUZGRUNUSVZFX1BMQVRGT1JNX05BTUV8RVhQTElDSVRfRklMRV9UWVBFfEZJTEVfQVRUUklCVVRFU3xMQVNUX0tOT1dOX0ZJTEVfVFlQRXxQUk9EVUNUX1RZUEV8U0NIRU1FXyg/OkFERFJFU1NfU0FOSVRJWkVSfEFERFJFU1NfU0FOSVRJWkVSX1VTRV9BRlRFUl9SRVRVUk58QVJHVU1FTlRTfERJU0FCTEVfTUFJTl9USFJFQURfQ0hFQ0tFUnxEWU5BTUlDX0xJQlJBUllfTE9BRFN8RFlOQU1JQ19MSU5LRVJfQVBJX1VTQUdFfEVOVklST05NRU5UfEVYRUNVVEFCTEV8R1VBUkRfTUFMTE9DfE1BSU5fVEhSRUFEX0NIRUNLRVJfU1RPUHxNQUxMT0NfR1VBUkRfRURHRVN8TUFMTE9DX1NDUklCQkxFfE1BTExPQ19TVEFDS3xUSFJFQURfU0FOSVRJWkVSKD86X1NUT1ApP3xVTkRFRklORURfQkVIQVZJT1VSX1NBTklUSVpFUig/Ol9TVE9QKT98Wk9NQklFX09CSkVDVFMpKXxYQ1RFU1QpXFxiLyxcblx0J2tleXdvcmQnOiAvXFxiKD86YWRkX2NvbXBpbGVfZGVmaW5pdGlvbnN8YWRkX2NvbXBpbGVfb3B0aW9uc3xhZGRfY3VzdG9tX2NvbW1hbmR8YWRkX2N1c3RvbV90YXJnZXR8YWRkX2RlZmluaXRpb25zfGFkZF9kZXBlbmRlbmNpZXN8YWRkX2V4ZWN1dGFibGV8YWRkX2xpYnJhcnl8YWRkX2xpbmtfb3B0aW9uc3xhZGRfc3ViZGlyZWN0b3J5fGFkZF90ZXN0fGF1eF9zb3VyY2VfZGlyZWN0b3J5fGJyZWFrfGJ1aWxkX2NvbW1hbmR8YnVpbGRfbmFtZXxjbWFrZV9ob3N0X3N5c3RlbV9pbmZvcm1hdGlvbnxjbWFrZV9taW5pbXVtX3JlcXVpcmVkfGNtYWtlX3BhcnNlX2FyZ3VtZW50c3xjbWFrZV9wb2xpY3l8Y29uZmlndXJlX2ZpbGV8Y29udGludWV8Y3JlYXRlX3Rlc3Rfc291cmNlbGlzdHxjdGVzdF9idWlsZHxjdGVzdF9jb25maWd1cmV8Y3Rlc3RfY292ZXJhZ2V8Y3Rlc3RfZW1wdHlfYmluYXJ5X2RpcmVjdG9yeXxjdGVzdF9tZW1jaGVja3xjdGVzdF9yZWFkX2N1c3RvbV9maWxlc3xjdGVzdF9ydW5fc2NyaXB0fGN0ZXN0X3NsZWVwfGN0ZXN0X3N0YXJ0fGN0ZXN0X3N1Ym1pdHxjdGVzdF90ZXN0fGN0ZXN0X3VwZGF0ZXxjdGVzdF91cGxvYWR8ZGVmaW5lX3Byb3BlcnR5fGVsc2V8ZWxzZWlmfGVuYWJsZV9sYW5ndWFnZXxlbmFibGVfdGVzdGluZ3xlbmRmb3JlYWNofGVuZGZ1bmN0aW9ufGVuZGlmfGVuZG1hY3JvfGVuZHdoaWxlfGV4ZWNfcHJvZ3JhbXxleGVjdXRlX3Byb2Nlc3N8ZXhwb3J0fGV4cG9ydF9saWJyYXJ5X2RlcGVuZGVuY2llc3xmaWxlfGZpbmRfZmlsZXxmaW5kX2xpYnJhcnl8ZmluZF9wYWNrYWdlfGZpbmRfcGF0aHxmaW5kX3Byb2dyYW18Zmx0a193cmFwX3VpfGZvcmVhY2h8ZnVuY3Rpb258Z2V0X2NtYWtlX3Byb3BlcnR5fGdldF9kaXJlY3RvcnlfcHJvcGVydHl8Z2V0X2ZpbGVuYW1lX2NvbXBvbmVudHxnZXRfcHJvcGVydHl8Z2V0X3NvdXJjZV9maWxlX3Byb3BlcnR5fGdldF90YXJnZXRfcHJvcGVydHl8Z2V0X3Rlc3RfcHJvcGVydHl8aWZ8aW5jbHVkZXxpbmNsdWRlX2RpcmVjdG9yaWVzfGluY2x1ZGVfZXh0ZXJuYWxfbXNwcm9qZWN0fGluY2x1ZGVfZ3VhcmR8aW5jbHVkZV9yZWd1bGFyX2V4cHJlc3Npb258aW5zdGFsbHxpbnN0YWxsX2ZpbGVzfGluc3RhbGxfcHJvZ3JhbXN8aW5zdGFsbF90YXJnZXRzfGxpbmtfZGlyZWN0b3JpZXN8bGlua19saWJyYXJpZXN8bGlzdHxsb2FkX2NhY2hlfGxvYWRfY29tbWFuZHxtYWNyb3xtYWtlX2RpcmVjdG9yeXxtYXJrX2FzX2FkdmFuY2VkfG1hdGh8bWVzc2FnZXxvcHRpb258b3V0cHV0X3JlcXVpcmVkX2ZpbGVzfHByb2plY3R8cXRfd3JhcF9jcHB8cXRfd3JhcF91aXxyZW1vdmV8cmVtb3ZlX2RlZmluaXRpb25zfHJldHVybnxzZXBhcmF0ZV9hcmd1bWVudHN8c2V0fHNldF9kaXJlY3RvcnlfcHJvcGVydGllc3xzZXRfcHJvcGVydHl8c2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzfHNldF90YXJnZXRfcHJvcGVydGllc3xzZXRfdGVzdHNfcHJvcGVydGllc3xzaXRlX25hbWV8c291cmNlX2dyb3VwfHN0cmluZ3xzdWJkaXJfZGVwZW5kc3xzdWJkaXJzfHRhcmdldF9jb21waWxlX2RlZmluaXRpb25zfHRhcmdldF9jb21waWxlX2ZlYXR1cmVzfHRhcmdldF9jb21waWxlX29wdGlvbnN8dGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXN8dGFyZ2V0X2xpbmtfZGlyZWN0b3JpZXN8dGFyZ2V0X2xpbmtfbGlicmFyaWVzfHRhcmdldF9saW5rX29wdGlvbnN8dGFyZ2V0X3NvdXJjZXN8dHJ5X2NvbXBpbGV8dHJ5X3J1bnx1bnNldHx1c2VfbWFuZ2xlZF9tZXNhfHV0aWxpdHlfc291cmNlfHZhcmlhYmxlX3JlcXVpcmVzfHZhcmlhYmxlX3dhdGNofHdoaWxlfHdyaXRlX2ZpbGUpKD89XFxzKlxcKClcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpGQUxTRXxPRkZ8T058VFJVRSlcXGIvLFxuXHQnbmFtZXNwYWNlJzogL1xcYig/OklOVEVSRkFDRXxQUklWQVRFfFBST1BFUlRJRVN8UFVCTElDfFNIQVJFRHxTVEFUSUN8VEFSR0VUX09CSkVDVFMpXFxiLyxcblx0J29wZXJhdG9yJzogL1xcYig/OkFORHxERUZJTkVEfEVRVUFMfEdSRUFURVJ8TEVTU3xNQVRDSEVTfE5PVHxPUnxTVFJFUVVBTHxTVFJHUkVBVEVSfFNUUkxFU1N8VkVSU0lPTl9FUVVBTHxWRVJTSU9OX0dSRUFURVJ8VkVSU0lPTl9MRVNTKVxcYi8sXG5cdCdpbnNlcnRlZCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiXFx3Kzo6XFx3K1xcYi8sXG5cdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHR9LFxuXHQnbnVtYmVyJzogL1xcYlxcZCsoPzpcXC5cXGQrKSpcXGIvLFxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpXFxiL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9bKCk+fV18XFwkWzx7XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5jb2JvbCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcKj4uKnwoXlsgXFx0XSopXFwqLiovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9beHpnbl0/KD86XCIoPzpbXlxcclxcblwiXXxcIlwiKSpcIig/IVwiKXwnKD86W15cXHJcXG4nXXwnJykqJyg/IScpKS9pLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdsZXZlbCc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKVxcZCtcXGIvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblxuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vYW50bHIvZ3JhbW1hcnMtdjQvYmxvYi80MmVkZDViNjg3ZDE4M2I1ZmE2NzllODU4YTgyMjk3YmQyNzE0MWU3L2NvYm9sODUvQ29ib2w4NS5nNCNMMTAxNVxuXHRcdHBhdHRlcm46IC8oXFxicGljKD86dHVyZSk/XFxzKykoPzooPzpbLVxcdyQvLDoqKzw+XXxcXC4oPyFcXHN8JCkpKD86XFwoXFxkK1xcKSk/KSsvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J251bWJlcic6IHtcblx0XHRcdFx0cGF0dGVybjogLyhcXCgpXFxkKy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvWygpXS9cblx0XHR9XG5cdH0sXG5cblx0J2tleXdvcmQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFx3LV0pKD86QUJPUlR8QUNDRVBUfEFDQ0VTU3xBRER8QUREUkVTU3xBRFZBTkNJTkd8QUZURVJ8QUxJR05FRHxBTEx8QUxQSEFCRVR8QUxQSEFCRVRJQ3xBTFBIQUJFVElDLUxPV0VSfEFMUEhBQkVUSUMtVVBQRVJ8QUxQSEFOVU1FUklDfEFMUEhBTlVNRVJJQy1FRElURUR8QUxTT3xBTFRFUnxBTFRFUk5BVEV8QU5ZfEFSRXxBUkVBfEFSRUFTfEFTfEFTQ0VORElOR3xBU0NJSXxBU1NJR058QVNTT0NJQVRFRC1EQVRBfEFTU09DSUFURUQtREFUQS1MRU5HVEh8QVR8QVRUUklCVVRFfEFVVEhPUnxBVVRPfEFVVE8tU0tJUHxCQUNLR1JPVU5ELUNPTE9SfEJBQ0tHUk9VTkQtQ09MT1VSfEJBU0lTfEJFRVB8QkVGT1JFfEJFR0lOTklOR3xCRUxMfEJJTkFSWXxCSVR8QkxBTkt8QkxJTkt8QkxPQ0t8Qk9UVE9NfEJPVU5EU3xCWXxCWUZVTkNUSU9OfEJZVElUTEV8Q0FMTHxDQU5DRUx8Q0FQQUJMRXxDQ1NWRVJTSU9OfENEfENGfENIfENIQUlOSU5HfENIQU5HRUR8Q0hBTk5FTHxDSEFSQUNURVJ8Q0hBUkFDVEVSU3xDTEFTU3xDTEFTUy1JRHxDTE9DSy1VTklUU3xDTE9TRXxDTE9TRS1ESVNQT1NJVElPTnxDT0JPTHxDT0RFfENPREUtU0VUfENPTHxDT0xMQVRJTkd8Q09MVU1OfENPTS1SRUd8Q09NTUF8Q09NTUlUTUVOVHxDT01NT058Q09NTVVOSUNBVElPTnxDT01QfENPTVAtMXxDT01QLTJ8Q09NUC0zfENPTVAtNHxDT01QLTV8Q09NUFVUQVRJT05BTHxDT01QVVRBVElPTkFMLTF8Q09NUFVUQVRJT05BTC0yfENPTVBVVEFUSU9OQUwtM3xDT01QVVRBVElPTkFMLTR8Q09NUFVUQVRJT05BTC01fENPTVBVVEV8Q09ORklHVVJBVElPTnxDT05UQUlOU3xDT05URU5UfENPTlRJTlVFfENPTlRST0x8Q09OVFJPTC1QT0lOVHxDT05UUk9MU3xDT05WRU5USU9OfENPTlZFUlRJTkd8Q09QWXxDT1JSfENPUlJFU1BPTkRJTkd8Q09VTlR8Q1JVTkNIfENVUlJFTkNZfENVUlNPUnxEQVRBfERBVEEtQkFTRXxEQVRFfERBVEUtQ09NUElMRUR8REFURS1XUklUVEVOfERBWXxEQVktT0YtV0VFS3xEQkNTfERFfERFQlVHLUNPTlRFTlRTfERFQlVHLUlURU18REVCVUctTElORXxERUJVRy1OQU1FfERFQlVHLVNVQi0xfERFQlVHLVNVQi0yfERFQlVHLVNVQi0zfERFQlVHR0lOR3xERUNJTUFMLVBPSU5UfERFQ0xBUkFUSVZFU3xERUZBVUxUfERFRkFVTFQtRElTUExBWXxERUZJTklUSU9OfERFTEVURXxERUxJTUlURUR8REVMSU1JVEVSfERFUEVORElOR3xERVNDRU5ESU5HfERFU1RJTkFUSU9OfERFVEFJTHxERkhSRVNQfERGSFZBTFVFfERJU0FCTEV8RElTS3xESVNQTEFZfERJU1BMQVktMXxESVZJREV8RElWSVNJT058RE9OVENBUkV8RE9VQkxFfERPV058RFVQTElDQVRFU3xEWU5BTUlDfEVCQ0RJQ3xFR0NTfEVHSXxFTFNFfEVNSXxFTVBUWS1DSEVDS3xFTkFCTEV8RU5EfEVORC1BQ0NFUFR8RU5ELUFERHxFTkQtQ0FMTHxFTkQtQ09NUFVURXxFTkQtREVMRVRFfEVORC1ESVZJREV8RU5ELUVWQUxVQVRFfEVORC1JRnxFTkQtTVVMVElQTFl8RU5ELU9GLVBBR0V8RU5ELVBFUkZPUk18RU5ELVJFQUR8RU5ELVJFQ0VJVkV8RU5ELVJFVFVSTnxFTkQtUkVXUklURXxFTkQtU0VBUkNIfEVORC1TVEFSVHxFTkQtU1RSSU5HfEVORC1TVUJUUkFDVHxFTkQtVU5TVFJJTkd8RU5ELVdSSVRFfEVORElOR3xFTlRFUnxFTlRSWXxFTlRSWS1QUk9DRURVUkV8RU5WSVJPTk1FTlR8RU9MfEVPUHxFT1N8RVJBU0V8RVJST1J8RVNDQVBFfEVTSXxFVkFMVUFURXxFVkVOVHxFVkVSWXxFWENFUFRJT058RVhDTFVTSVZFfEVYSElCSVR8RVhJVHxFWFBPUlR8RVhURU5EfEVYVEVOREVEfEVYVEVSTkFMfEZEfEZJTEV8RklMRS1DT05UUk9MfEZJTExFUnxGSU5BTHxGSVJTVHxGT09USU5HfEZPUnxGT1JFR1JPVU5ELUNPTE9SfEZPUkVHUk9VTkQtQ09MT1VSfEZST018RlVMTHxGVU5DVElPTnxGVU5DVElPTi1QT0lOVEVSfEZVTkNUSU9OTkFNRXxHRU5FUkFURXxHSVZJTkd8R0xPQkFMfEdPfEdPQkFDS3xHUklEfEdST1VQfEhFQURJTkd8SElHSC1WQUxVRXxISUdILVZBTFVFU3xISUdITElHSFR8SS1PfEktTy1DT05UUk9MfElEfElERU5USUZJQ0FUSU9OfElGfElNUExJQ0lUfElNUE9SVHxJTnxJTkRFWHxJTkRFWEVEfElORElDQVRFfElOSVRJQUx8SU5JVElBTElaRXxJTklUSUFURXxJTlBVVHxJTlBVVC1PVVRQVVR8SU5TUEVDVHxJTlNUQUxMQVRJT058SU5URUdFUnxJTlRPfElOVkFMSUR8SU5WT0tFfElTfEpVU1R8SlVTVElGSUVEfEtBTkpJfEtFUFR8S0VZfEtFWUJPQVJEfExBQkVMfExBTkdVQUdFfExBU1R8TEJ8TER8TEVBRElOR3xMRUZUfExFRlRMSU5FfExFTkdUSHxMRU5HVEgtQ0hFQ0t8TElCQUNDRVNTfExJQlBBUkFNRVRFUnxMSUJSQVJZfExJTUlUfExJTUlUU3xMSU5BR0V8TElOQUdFLUNPVU5URVJ8TElORXxMSU5FLUNPVU5URVJ8TElORVN8TElOS0FHRXxMSVNUfExPQ0FMfExPQ0FMLVNUT1JBR0V8TE9DS3xMT05HLURBVEV8TE9ORy1USU1FfExPVy1WQUxVRXxMT1ctVkFMVUVTfExPV0VSfExPV0xJR0hUfE1FTU9SWXxNRVJHRXxNRVNTQUdFfE1NRERZWVlZfE1PREV8TU9EVUxFU3xNT1JFLUxBQkVMU3xNT1ZFfE1VTFRJUExFfE1VTFRJUExZfE5BTUVEfE5BVElPTkFMfE5BVElPTkFMLUVESVRFRHxOQVRJVkV8TkVHQVRJVkV8TkVUV09SS3xORVhUfE5PfE5PLUVDSE98TlVMTHxOVUxMU3xOVU1CRVJ8TlVNRVJJQ3xOVU1FUklDLURBVEV8TlVNRVJJQy1FRElURUR8TlVNRVJJQy1USU1FfE9CSkVDVC1DT01QVVRFUnxPQ0NVUlN8T0RUfE9GfE9GRnxPTUlUVEVEfE9OfE9QRU58T1BUSU9OQUx8T1JERVJ8T1JERVJMWXxPUkdBTklaQVRJT058T1RIRVJ8T1VUUFVUfE9WRVJGTE9XfE9WRVJMSU5FfE9XTnxQQUNLRUQtREVDSU1BTHxQQURESU5HfFBBR0V8UEFHRS1DT1VOVEVSfFBBU1NXT1JEfFBFUkZPUk18UEZ8UEh8UElDfFBJQ1RVUkV8UExVU3xQT0lOVEVSfFBPUlR8UE9TSVRJT058UE9TSVRJVkV8UFJJTlRFUnxQUklOVElOR3xQUklWQVRFfFBST0NFRFVSRXxQUk9DRURVUkUtUE9JTlRFUnxQUk9DRURVUkVTfFBST0NFRUR8UFJPQ0VTU3xQUk9HUkFNfFBST0dSQU0tSUR8UFJPR1JBTS1MSUJSQVJZfFBST01QVHxQVVJHRXxRVUVVRXxRVU9URXxRVU9URVN8UkFORE9NfFJEfFJFQUR8UkVBREVSfFJFQUx8UkVDRUlWRXxSRUNFSVZFRHxSRUNPUkR8UkVDT1JESU5HfFJFQ09SRFN8UkVDVVJTSVZFfFJFREVGSU5FU3xSRUVMfFJFRnxSRUZFUkVOQ0V8UkVGRVJFTkNFU3xSRUxBVElWRXxSRUxFQVNFfFJFTUFJTkRFUnxSRU1BUktTfFJFTU9URXxSRU1PVkFMfFJFTU9WRXxSRU5BTUVTfFJFUExBQ0V8UkVQTEFDSU5HfFJFUE9SVHxSRVBPUlRJTkd8UkVQT1JUU3xSRVFVSVJFRHxSRVJVTnxSRVNFUlZFfFJFU0VUfFJFVFVSTnxSRVRVUk4tQ09ERXxSRVRVUk5JTkd8UkVWRVJTRS1WSURFT3xSRVZFUlNFRHxSRVdJTkR8UkVXUklURXxSRnxSSHxSSUdIVHxST1VOREVEfFJVTnxTQU1FfFNBVkV8U0NSRUVOfFNEfFNFQVJDSHxTRUNUSU9OfFNFQ1VSRXxTRUNVUklUWXxTRUdNRU5UfFNFR01FTlQtTElNSVR8U0VMRUNUfFNFTkR8U0VOVEVOQ0V8U0VQQVJBVEV8U0VRVUVOQ0V8U0VRVUVOVElBTHxTRVR8U0hBUkVEfFNIQVJFREJZQUxMfFNIQVJFREJZUlVOVU5JVHxTSEFSSU5HfFNISUZULUlOfFNISUZULU9VVHxTSE9SVC1EQVRFfFNJR058U0laRXxTT1JUfFNPUlQtQ09OVFJPTHxTT1JULUNPUkUtU0laRXxTT1JULUZJTEUtU0laRXxTT1JULU1FUkdFfFNPUlQtTUVTU0FHRXxTT1JULU1PREUtU0laRXxTT1JULVJFVFVSTnxTT1VSQ0V8U09VUkNFLUNPTVBVVEVSfFNQQUNFfFNQQUNFU3xTUEVDSUFMLU5BTUVTfFNUQU5EQVJEfFNUQU5EQVJELTF8U1RBTkRBUkQtMnxTVEFSVHxTVEFUVVN8U1RPUHxTVFJJTkd8U1VCLVFVRVVFLTF8U1VCLVFVRVVFLTJ8U1VCLVFVRVVFLTN8U1VCVFJBQ1R8U1VNfFNVUFBSRVNTfFNZTUJPTHxTWU1CT0xJQ3xTWU5DfFNZTkNIUk9OSVpFRHxUQUJMRXxUQUxMWXxUQUxMWUlOR3xUQVBFfFRBU0t8VEVSTUlOQUx8VEVSTUlOQVRFfFRFU1R8VEVYVHxUSEVOfFRIUkVBRHxUSFJFQUQtTE9DQUx8VEhST1VHSHxUSFJVfFRJTUV8VElNRVJ8VElNRVN8VElUTEV8VE98VE9EQVlTLURBVEV8VE9EQVlTLU5BTUV8VE9QfFRSQUlMSU5HfFRSVU5DQVRFRHxUWVBFfFRZUEVERUZ8VU5ERVJMSU5FfFVOSVR8VU5TVFJJTkd8VU5USUx8VVB8VVBPTnxVU0FHRXxVU0V8VVNJTkd8VkFMVUV8VkFMVUVTfFZBUllJTkd8VklSVFVBTHxXQUlUfFdIRU58V0hFTi1DT01QSUxFRHxXSVRIfFdPUkRTfFdPUktJTkctU1RPUkFHRXxXUklURXxZRUFSfFlZWVlERER8WVlZWU1NRER8WkVSTy1GSUxMfFpFUk9FU3xaRVJPUykoPyFbXFx3LV0pL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXG5cdCdib29sZWFuJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcdy1dKSg/OmZhbHNlfHRydWUpKD8hW1xcdy1dKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J251bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXHctXSkoPzpbKy1dPyg/Oig/OlxcZCsoPzpbLixdXFxkKyk/fFsuLF1cXGQrKSg/OmVbKy1dP1xcZCspP3x6ZXJvKSkoPyFbXFx3LV0pL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnb3BlcmF0b3InOiBbXG5cdFx0Lzw+fFs8Pl09P3xbPSsqLyZdLyxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHctXSkoPzotfGFuZHxlcXVhbHxncmVhdGVyfGxlc3N8bm90fG9yfHRoYW4pKD8hW1xcdy1dKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J3B1bmN0dWF0aW9uJzogL1suOiwoKV0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0Ly8gSWdub3JlIGNvbW1lbnRzIHN0YXJ0aW5nIHdpdGggeyB0byBwcml2aWxlZ2Ugc3RyaW5nIGludGVycG9sYXRpb24gaGlnaGxpZ2h0aW5nXG5cdHZhciBjb21tZW50ID0gLyMoPyFcXHspLisvO1xuXHR2YXIgaW50ZXJwb2xhdGlvbiA9IHtcblx0XHRwYXR0ZXJuOiAvI1xce1tefV0rXFx9Lyxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5jb2ZmZWVzY3JpcHQgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdqYXZhc2NyaXB0Jywge1xuXHRcdCdjb21tZW50JzogY29tbWVudCxcblx0XHQnc3RyaW5nJzogW1xuXG5cdFx0XHQvLyBTdHJpbmdzIGFyZSBtdWx0aWxpbmVcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLycoPzpcXFxcW1xcc1xcU118W15cXFxcJ10pKicvLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cblx0XHRcdHtcblx0XHRcdFx0Ly8gU3RyaW5ncyBhcmUgbXVsdGlsaW5lXG5cdFx0XHRcdHBhdHRlcm46IC9cIig/OlxcXFxbXFxzXFxTXXxbXlxcXFxcIl0pKlwiLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IGludGVycG9sYXRpb25cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86YW5kfGJyZWFrfGJ5fGNhdGNofGNsYXNzfGNvbnRpbnVlfGRlYnVnZ2VyfGRlbGV0ZXxkb3xlYWNofGVsc2V8ZXh0ZW5kfGV4dGVuZHN8ZmFsc2V8ZmluYWxseXxmb3J8aWZ8aW58aW5zdGFuY2VvZnxpc3xpc250fGxldHxsb29wfG5hbWVzcGFjZXxuZXd8bm98bm90fG51bGx8b2Z8b2ZmfG9ufG9yfG93bnxyZXR1cm58c3VwZXJ8c3dpdGNofHRoZW58dGhpc3x0aHJvd3x0cnVlfHRyeXx0eXBlb2Z8dW5kZWZpbmVkfHVubGVzc3x1bnRpbHx3aGVufHdoaWxlfHdpbmRvd3x3aXRofHllc3x5aWVsZClcXGIvLFxuXHRcdCdjbGFzcy1tZW1iZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvQCg/IVxcZClcXHcrLyxcblx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjb2ZmZWVzY3JpcHQnLCAnY29tbWVudCcsIHtcblx0XHQnbXVsdGlsaW5lLWNvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvIyMjW1xcc1xcU10rPyMjIy8sXG5cdFx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdFx0fSxcblxuXHRcdC8vIEJsb2NrIHJlZ2V4cCBjYW4gY29udGFpbiBjb21tZW50cyBhbmQgaW50ZXJwb2xhdGlvblxuXHRcdCdibG9jay1yZWdleCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXC97M31bXFxzXFxTXSo/XFwvezN9Lyxcblx0XHRcdGFsaWFzOiAncmVnZXgnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjb21tZW50JzogY29tbWVudCxcblx0XHRcdFx0J2ludGVycG9sYXRpb24nOiBpbnRlcnBvbGF0aW9uXG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjb2ZmZWVzY3JpcHQnLCAnc3RyaW5nJywge1xuXHRcdCdpbmxpbmUtamF2YXNjcmlwdCc6IHtcblx0XHRcdHBhdHRlcm46IC9gKD86XFxcXFtcXHNcXFNdfFteXFxcXGBdKSpgLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eYHxgJC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0fSxcblx0XHRcdFx0J3NjcmlwdCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLWphdmFzY3JpcHQnLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBCbG9jayBzdHJpbmdzXG5cdFx0J211bHRpbGluZS1zdHJpbmcnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8nJydbXFxzXFxTXSo/JycnLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cIlwiXCJbXFxzXFxTXSo/XCJcIlwiLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdGludGVycG9sYXRpb246IGludGVycG9sYXRpb25cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF1cblxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjb2ZmZWVzY3JpcHQnLCAna2V5d29yZCcsIHtcblx0XHQvLyBPYmplY3QgcHJvcGVydHlcblx0XHQncHJvcGVydHknOiAvKD8hXFxkKVxcdysoPz1cXHMqOig/ITopKS9cblx0fSk7XG5cblx0ZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5jb2ZmZWVzY3JpcHRbJ3RlbXBsYXRlLXN0cmluZyddO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5jb2ZmZWUgPSBQcmlzbS5sYW5ndWFnZXMuY29mZmVlc2NyaXB0O1xufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuY29uY3VybmFzID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkoPzpcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpfFxcL1xcLy4qKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2xhbmdleHQnOiB7XG5cdFx0cGF0dGVybjogL1xcYlxcdytcXHMqXFx8XFx8W1xcc1xcU10rP1xcfFxcfC8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2NsYXNzLW5hbWUnOiAvXlxcdysvLFxuXHRcdFx0J3N0cmluZyc6IHtcblx0XHRcdFx0cGF0dGVybjogLyheXFxzKlxcfFxcfClbXFxzXFxTXSsoPz1cXHxcXHwkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFx8XFx8L1xuXHRcdH1cblx0fSxcblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oKD86XnxcXHMpZGVmWyBcXHRdKylbYS16QS1aX11cXHcqKD89XFxzKlxcKCkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YWJzdHJhY3R8YWN0b3J8YWxzb3xhbm5vdGF0aW9ufGFzc2VydHxhc3luY3xhd2FpdHxib29sfGJvb2xlYW58YnJlYWt8Ynl0ZXxjYXNlfGNhdGNofGNoYW5nZWR8Y2hhcnxjbGFzc3xjbG9zZWR8Y29uc3RhbnR8Y29udGludWV8ZGVmfGRlZmF1bHR8ZGVsfGRvdWJsZXxlbGlmfGVsc2V8ZW51bXxldmVyeXxleHRlbmRzfGZhbHNlfGZpbmFsbHl8ZmxvYXR8Zm9yfGZyb218Z2xvYmFsfGdwdWRlZnxncHVrZXJuZWx8aWZ8aW1wb3J0fGlufGluaXR8aW5qZWN0fGludHxsYW1iZGF8bG9jYWx8bG9uZ3xsb29wfG1hdGNofG5ld3xub2RlZmF1bHR8bnVsbHxvZnxvbmNoYW5nZXxvcGVufG91dHxvdmVycmlkZXxwYWNrYWdlfHBhcmZvcnxwYXJmb3JzeW5jfHBvc3R8cHJlfHByaXZhdGV8cHJvdGVjdGVkfHByb3ZpZGV8cHJvdmlkZXJ8cHVibGljfHJldHVybnxzaGFyZWR8c2hvcnR8c2luZ2xlfHNpemVfdHxzaXplb2Z8c3VwZXJ8c3luY3x0aGlzfHRocm93fHRyYWl0fHRyYW5zfHRyYW5zaWVudHx0cnVlfHRyeXx0eXBlZGVmfHVuY2hlY2tlZHx1c2luZ3x2YWx8dmFyfHZvaWR8d2hpbGV8d2l0aClcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdudW1iZXInOiAvXFxiMGJbMDFdWzAxX10qTD9cXGJ8XFxiMHgoPzpbXFxkYS1mX10qXFwuKT9bXFxkYS1mX3ArLV0rXFxifCg/OlxcYlxcZFtcXGRfXSooPzpcXC5bXFxkX10qKT98XFxCXFwuXFxkW1xcZF9dKikoPzplWystXT9cXGRbXFxkX10qKT9bZGZsc10/L2ksXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLC46XS8sXG5cdCdvcGVyYXRvcic6IC88PT18Pj09fD0+fC0+fDwtfDw+fCY9PXwmPD58XFw/Oj98XFwuXFw/fFxcK1xcK3wtLXxbLSsqLz08Pl09P3xbIV5+XXxcXGIoPzphbmR8YXN8YmFuZHxib3J8Ynhvcnxjb21wfGlzfGlzbm90fG1vZHxvcilcXGI9Py8sXG5cdCdhbm5vdGF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9AKD86XFx3KzopPyg/Olxcdyt8XFxbW15cXF1dK1xcXSk/Lyxcblx0XHRhbGlhczogJ2J1aWx0aW4nXG5cdH1cbn07XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NvbmN1cm5hcycsICdsYW5nZXh0Jywge1xuXHQncmVnZXgtbGl0ZXJhbCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxicihcInwnKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXFxcXSkoPzpcXFxcezJ9KSopXFx7KD86W157fV18XFx7KD86W157fV18XFx7W159XSpcXH0pKlxcfSkrXFx9Lyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuY29uY3VybmFzXG5cdFx0XHR9LFxuXHRcdFx0J3JlZ2V4JzogL1tcXHNcXFNdKy9cblx0XHR9XG5cdH0sXG5cdCdzdHJpbmctbGl0ZXJhbCc6IHtcblx0XHRwYXR0ZXJuOiAvKD86XFxCfFxcYnMpKFwifCcpKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXlxcXFxdKSg/OlxcXFx7Mn0pKilcXHsoPzpbXnt9XXxcXHsoPzpbXnt9XXxcXHtbXn1dKlxcfSkqXFx9KStcXH0vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5jb25jdXJuYXNcblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHR9XG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuY29uYyA9IFByaXNtLmxhbmd1YWdlcy5jb25jdXJuYXM7XG5cbi8qKlxuICogT3JpZ2luYWwgYnkgU2NvdHQgSGVsbWUuXG4gKlxuICogUmVmZXJlbmNlOiBodHRwczovL3Njb3R0aGVsbWUuY28udWsvY3NwLWNoZWF0LXNoZWV0L1xuICpcbiAqIFN1cHBvcnRzIHRoZSBmb2xsb3dpbmc6XG4gKiAgLSBodHRwczovL3d3dy53My5vcmcvVFIvQ1NQMS9cbiAqICAtIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1AyL1xuICogIC0gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUDMvXG4gKi9cblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlXG5cdCAqIEByZXR1cm5zIHtSZWdFeHB9XG5cdCAqL1xuXHRmdW5jdGlvbiB2YWx1ZShzb3VyY2UpIHtcblx0XHRyZXR1cm4gUmVnRXhwKC8oWyBcXHRdKS8uc291cmNlICsgJyg/OicgKyBzb3VyY2UgKyAnKScgKyAvKD89W1xccztdfCQpLy5zb3VyY2UsICdpJyk7XG5cdH1cblxuXHRQcmlzbS5sYW5ndWFnZXMuY3NwID0ge1xuXHRcdCdkaXJlY3RpdmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W1xccztdKSg/OmJhc2UtdXJpfGJsb2NrLWFsbC1taXhlZC1jb250ZW50fCg/OmNoaWxkfGNvbm5lY3R8ZGVmYXVsdHxmb250fGZyYW1lfGltZ3xtYW5pZmVzdHxtZWRpYXxvYmplY3R8cHJlZmV0Y2h8c2NyaXB0fHN0eWxlfHdvcmtlciktc3JjfGRpc293bi1vcGVuZXJ8Zm9ybS1hY3Rpb258ZnJhbWUtKD86YW5jZXN0b3JzfG9wdGlvbnMpfGlucHV0LXByb3RlY3Rpb24oPzotKD86Y2xpcHxzZWxlY3RvcnMpKT98bmF2aWdhdGUtdG98cGx1Z2luLXR5cGVzfHBvbGljeS11cml8cmVmZXJyZXJ8cmVmbGVjdGVkLXhzc3xyZXBvcnQtKD86dG98dXJpKXxyZXF1aXJlLXNyaS1mb3J8c2FuZGJveHwoPzpzY3JpcHR8c3R5bGUpLXNyYy0oPzphdHRyfGVsZW0pfHVwZ3JhZGUtaW5zZWN1cmUtcmVxdWVzdHMpKD89W1xccztdfCQpL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0XHR9LFxuXHRcdCdzY2hlbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiB2YWx1ZSgvW2Etel1bYS16MC05ListXSo6Ly5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J25vbmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiB2YWx1ZSgvJ25vbmUnLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXHRcdCdub25jZSc6IHtcblx0XHRcdHBhdHRlcm46IHZhbHVlKC8nbm9uY2UtWy0rL1xcdz1dKycvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0fSxcblx0XHQnaGFzaCc6IHtcblx0XHRcdHBhdHRlcm46IHZhbHVlKC8nc2hhKD86MjU2fDM4NHw1MTIpLVstKy9cXHc9XSsnLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdH0sXG5cdFx0J2hvc3QnOiB7XG5cdFx0XHRwYXR0ZXJuOiB2YWx1ZShcblx0XHRcdFx0L1thLXpdW2EtejAtOS4rLV0qOlxcL1xcL1teXFxzOywnXSovLnNvdXJjZSArXG5cdFx0XHRcdCd8JyArXG5cdFx0XHRcdC9cXCpbXlxcczssJ10qLy5zb3VyY2UgK1xuXHRcdFx0XHQnfCcgK1xuXHRcdFx0XHQvW2EtejAtOS1dKyg/OlxcLlthLXowLTktXSspKyg/OjpbXFxkKl0rKT8oPzpcXC9bXlxcczssJ10qKT8vLnNvdXJjZVxuXHRcdFx0KSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3VybCcsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ltcG9ydGFudCc6IC9cXCovXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQna2V5d29yZCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogdmFsdWUoLyd1bnNhZmUtW2Etei1dKycvLnNvdXJjZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAndW5zYWZlJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogdmFsdWUoLydbYS16LV0rJy8uc291cmNlKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdzYWZlJ1xuXHRcdFx0fSxcblx0XHRdLFxuXHRcdCdwdW5jdHVhdGlvbic6IC87L1xuXHR9O1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nvb2tsYW5nL3NwZWMvYmxvYi9tYWluL0VCTkYubWRcblxuXHR2YXIgc2luZ2xlX3Rva2VuX3N1ZmZpeCA9IC8oPzooPyFcXHMpW1xcZCQrPD1hLXpBLVpcXHg4MC1cXHVGRkZGXSkrLy5zb3VyY2U7XG5cdHZhciBtdWx0aV90b2tlbl9pbmZpeCA9IC9bXnt9QCNdKy8uc291cmNlO1xuXHR2YXIgbXVsdGlfdG9rZW5fc3VmZml4ID0gL1xce1tefSNAXSpcXH0vLnNvdXJjZTtcblxuXHR2YXIgbXVsdGlfdG9rZW4gPSBtdWx0aV90b2tlbl9pbmZpeCArIG11bHRpX3Rva2VuX3N1ZmZpeDtcblxuXHR2YXIgdGltZXJfdW5pdHMgPSAvKD86aHxob3Vyc3xocnN8bXxtaW58bWludXRlcykvLnNvdXJjZTtcblxuXHR2YXIgYW1vdW50X2dyb3VwX2ltcGwgPSB7XG5cdFx0cGF0dGVybjogL1xce1tee31dKlxcfS8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnYW1vdW50Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFtcXHt8XSlbXnt9fColXSsvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ251bWJlcicsXG5cdFx0XHR9LFxuXHRcdFx0J3VuaXQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oJSlbXn1dKy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnc3ltYm9sJyxcblx0XHRcdH0sXG5cdFx0XHQnc2VydmluZ3Mtc2NhbGVyJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwqLyxcblx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcicsXG5cdFx0XHR9LFxuXHRcdFx0J3NlcnZpbmdzLWFsdGVybmF0aXZlLXNlcGFyYXRvcic6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcfC8sXG5cdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InLFxuXHRcdFx0fSxcblx0XHRcdCd1bml0LXNlcGFyYXRvcic6IHtcblx0XHRcdFx0cGF0dGVybjogLyg/OiV8KFxcKiklKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InLFxuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9be31dLyxcblx0XHR9XG5cdH07XG5cblxuXHRQcmlzbS5sYW5ndWFnZXMuY29va2xhbmcgPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHQvLyBbLSBjb21tZW50IC1dXG5cdFx0XHQvLyAtLSBjb21tZW50XG5cdFx0XHRwYXR0ZXJuOiAvXFxbLVtcXHNcXFNdKj8tXFxdfC0tLiovLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdH0sXG5cdFx0J21ldGEnOiB7IC8vID4+IGtleTogdmFsdWVcblx0XHRcdHBhdHRlcm46IC8+Pi4qOi4qLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHJvcGVydHknOiB7IC8vIGtleTpcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKD4+XFxzKilbXlxcczpdKD86W146XSpbXlxcczpdKT8vLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdjb29rd2FyZS1ncm91cCc6IHsgLy8gIy4uLnsuLi59LCAjLi4uXG5cdFx0XHRwYXR0ZXJuOiBuZXcgUmVnRXhwKCcjKD86J1xuXHRcdFx0XHQrIG11bHRpX3Rva2VuXG5cdFx0XHRcdCsgJ3wnXG5cdFx0XHRcdCsgc2luZ2xlX3Rva2VuX3N1ZmZpeFxuXHRcdFx0XHQrICcpJ1xuXHRcdFx0KSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY29va3dhcmUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogbmV3IFJlZ0V4cCgnKF4jKSg/Oidcblx0XHRcdFx0XHRcdCsgbXVsdGlfdG9rZW5faW5maXhcblx0XHRcdFx0XHRcdCsgJyknXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnY29va3dhcmUta2V5d29yZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXiMvLFxuXHRcdFx0XHRcdGFsaWFzOiAna2V5d29yZCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdxdWFudGl0eS1ncm91cCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBuZXcgUmVnRXhwKC9cXHtbXnt9QCNdKlxcfS8pLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3F1YW50aXR5Jzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiBuZXcgUmVnRXhwKC8oXlxceykvLnNvdXJjZSArIG11bHRpX3Rva2VuX2luZml4KSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICdudW1iZXInLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9be31dLyxcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0fSxcblx0XHQnaW5ncmVkaWVudC1ncm91cCc6IHsgLy8gQC4uLnsuLi59LCBALi4uXG5cdFx0XHRwYXR0ZXJuOiBuZXcgUmVnRXhwKCdAKD86J1xuXHRcdFx0XHQrIG11bHRpX3Rva2VuXG5cdFx0XHRcdCsgJ3wnXG5cdFx0XHRcdCsgc2luZ2xlX3Rva2VuX3N1ZmZpeFxuXHRcdFx0XHQrICcpJyksXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2luZ3JlZGllbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogbmV3IFJlZ0V4cCgnKF5AKSg/Oidcblx0XHRcdFx0XHRcdCsgbXVsdGlfdG9rZW5faW5maXhcblx0XHRcdFx0XHRcdCsgJyknKSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnaW5ncmVkaWVudC1rZXl3b3JkJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eQC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0J2Ftb3VudC1ncm91cCc6IGFtb3VudF9ncm91cF9pbXBsLFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3RpbWVyLWdyb3VwJzogeyAvLyB+dGltZXJ7Li4ufVxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zb3J0LWFsdGVybmF0aXZlc1xuXHRcdFx0cGF0dGVybjogL34oPyFcXHMpW15AI357fV0qXFx7W157fV0qXFx9Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQndGltZXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhefilbXntdKy8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0J2R1cmF0aW9uLWdyb3VwJzogeyAvLyB7Li4ufVxuXHRcdFx0XHRcdHBhdHRlcm46IC9cXHtbXnt9XSpcXH0vLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1t7fV0vLFxuXHRcdFx0XHRcdFx0J3VuaXQnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IG5ldyBSZWdFeHAoLyglXFxzKikvLnNvdXJjZSArIHRpbWVyX3VuaXRzICsgL1xcYi8uc291cmNlKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICdzeW1ib2wnLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdvcGVyYXRvcic6IC8lLyxcblx0XHRcdFx0XHRcdCdkdXJhdGlvbic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL1xcZCsvLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ251bWJlcicsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J3RpbWVyLWtleXdvcmQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15+Lyxcblx0XHRcdFx0XHRhbGlhczogJ2tleXdvcmQnLFxuXHRcdFx0XHR9LFxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jb3EvY29xXG5cblx0dmFyIGNvbW1lbnRTb3VyY2UgPSAvXFwoXFwqKD86W14oKl18XFwoKD8hXFwqKXxcXCooPyFcXCkpfDxzZWxmPikqXFwqXFwpLy5zb3VyY2U7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgMjsgaSsrKSB7XG5cdFx0Y29tbWVudFNvdXJjZSA9IGNvbW1lbnRTb3VyY2UucmVwbGFjZSgvPHNlbGY+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbW1lbnRTb3VyY2U7IH0pO1xuXHR9XG5cdGNvbW1lbnRTb3VyY2UgPSBjb21tZW50U291cmNlLnJlcGxhY2UoLzxzZWxmPi9nLCAnW10nKTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuY29xID0ge1xuXHRcdCdjb21tZW50JzogUmVnRXhwKGNvbW1lbnRTb3VyY2UpLFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXXxcIlwiKSpcIig/IVwiKS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdhdHRyaWJ1dGUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0XHQvI1xcWyg/OlteXFxbXFxdKFwiXXxcIig/OlteXCJdfFwiXCIpKlwiKD8hXCIpfFxcKCg/IVxcKil8PGNvbW1lbnQ+KSpcXF0vLnNvdXJjZVxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoLzxjb21tZW50Pi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBjb21tZW50U291cmNlOyB9KVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnYXR0ci1uYW1lJyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2NvbW1lbnQnOiBSZWdFeHAoY29tbWVudFNvdXJjZSksXG5cdFx0XHRcdFx0J3N0cmluZyc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9cIig/OlteXCJdfFwiXCIpKlwiKD8hXCIpLyxcblx0XHRcdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHQnb3BlcmF0b3InOiAvPS8sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL14jXFxbfFxcXSR8WywoKV0vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXGIoPzpDdW11bGF0aXZlfEdsb2JhbHxMb2NhbHxNb25vbW9ycGhpY3xOb25DdW11bGF0aXZlfFBvbHltb3JwaGljfFByaXZhdGV8UHJvZ3JhbSlcXGIvLFxuXHRcdFx0XHRhbGlhczogJ2F0dHItbmFtZSdcblx0XHRcdH1cblx0XHRdLFxuXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86QWJvcnR8QWJvdXR8QWRkfEFkbWl0fEFkbWl0dGVkfEFsbHxBcmd1bWVudHN8QXN8QXNzdW1wdGlvbnN8QXhpb218QXhpb21zfEJhY2t8QmFja1RvfEJhY2t0cmFjZXxCaW5PcHxCaW5PcFNwZWN8QmluUmVsfEJpbmR8QmxhY2tsaXN0fENhbm9uaWNhbHxDYXNlfENkfENoZWNrfENsYXNzfENsYXNzZXN8Q2xvc2V8Q29GaXhwb2ludHxDb0luZHVjdGl2ZXxDb2VyY2lvbnxDb2VyY2lvbnN8Q29sbGVjdGlvbnxDb21iaW5lZHxDb21wdXRlfENvbmplY3R1cmV8Q29uamVjdHVyZXN8Q29uc3RhbnR8Q29uc3RhbnRzfENvbnN0cmFpbnR8Q29uc3RydWN0b3JzfENvbnRleHR8Q29yb2xsYXJ5fENyZWF0ZXxDc3RPcHxDdXN0b218Q3V0fERlYnVnfERlY2xhcmV8RGVmaW5lZHxEZWZpbml0aW9ufERlbGltaXR8RGVwZW5kZW5jaWVzfERlcGVuZGVudHxEZXJpdmV8RGlmZnN8RHJvcHxFbGltaW5hdGlvbnxFbmR8RW50cnl8RXF1YWxpdHl8RXZhbHxFeGFtcGxlfEV4aXN0ZW50aWFsfEV4aXN0ZW50aWFsc3xFeGlzdGluZ3xFeHBvcnR8RXh0ZXJufEV4dHJhY3Rpb258RmFjdHxGYWlsfEZpZWxkfEZpbGV8Rmlyc3RvcmRlcnxGaXhwb2ludHxGbGFnc3xGb2N1c3xGcm9tfEZ1bmNsYXNzfEZ1bmN0aW9ufEZ1bmN0aW9uYWx8R0N8R2VuZXJhbGl6YWJsZXxHb2FsfEdyYWJ8R3JhbW1hcnxHcmFwaHxHdWFyZGVkfEhhc2tlbGx8SGVhcHxIaWRlfEhpbnR8SGludERifEhpbnRzfEh5cG90aGVzZXN8SHlwb3RoZXNpc3xJRnxJZGVudGl0eXxJbW1lZGlhdGV8SW1wbGljaXR8SW1wbGljaXRzfEltcG9ydHxJbmNsdWRlfEluZHVjdGlvbnxJbmR1Y3RpdmV8SW5maXh8SW5mb3xJbml0aWFsfElualR5cHxJbmxpbmV8SW5zcGVjdHxJbnN0YW5jZXxJbnN0YW5jZXN8SW50cm98SW50cm9zfEludmVyc2lvbnxJbnZlcnNpb25fY2xlYXJ8SlNPTnxMYW5ndWFnZXxMZWZ0fExlbW1hfExldHxMaWF8TGlicmFyaWVzfExpYnJhcnl8TG9hZHxMb2FkUGF0aHxMb2NhdGV8THRhY3xMdGFjMnxNTHxNYXRjaHxNZXRob2R8TWluaW1hbGl0eXxNb2R1bGV8TW9kdWxlc3xNb3JwaGlzbXxOZXh0fE5vSW5saW5lfE5vdGF0aW9ufE51bWJlcnxPQ2FtbHxPYmxpZ2F0aW9ufE9ibGlnYXRpb25zfE9wYXF1ZXxPcGVufE9wdGltaXplfFBhcmFtZXRlcnxQYXJhbWV0ZXJzfFBhcmFtZXRyaWN8UGF0aHxQYXRoc3xQcmVuZXh8UHJldGVybXxQcmltaXRpdmV8UHJpbnR8UHJvZmlsZXxQcm9qZWN0aW9uc3xQcm9vZnxQcm9wfFByb3BCaW5PcHxQcm9wT3B8UHJvcFVPcHxQcm9wZXJ0eXxQcm9wb3NpdGlvbnxQd2R8UWVkfFF1aXR8UmVjfFJlY29yZHxSZWN1cnNpdmV8UmVkaXJlY3R8UmVkdWN0aW9ufFJlZ2lzdGVyfFJlbGF0aW9ufFJlbWFya3xSZW1vdmV8UmVxdWlyZXxSZXNlcnZlZHxSZXNldHxSZXNvbHZlfFJlc3RhcnR8UmV3cml0ZXxSaWdodHxSaW5nfFJpbmdzfFNQcm9wfFNhdHVyYXRlfFNhdmV8U2NoZW1lfFNjb3BlfFNjb3Blc3xTZWFyY2h8U2VhcmNoSGVhZHxTZWFyY2hQYXR0ZXJufFNlYXJjaFJld3JpdGV8U2VjdGlvbnxTZXBhcmF0ZXxTZXR8U2V0b2lkfFNob3d8U2lnbmF0dXJlc3xTb2x2ZXxTb2x2ZXJ8U29ydHxTb3J0Y2xhc3N8U29ydGVkfFNwZWN8U3RlcHxTdHJhdGVnaWVzfFN0cmF0ZWd5fFN0cmluZ3xTdHJ1Y3R1cmV8U3ViQ2xhc3N8U3ViZ3JhcGh8U3VjaFRoYXR8VGFjdGljfFRlcm18VGVzdENvbXBpbGV8VGhlb3JlbXxUaW1lfFRpbWVvdXR8VG98VHJhbnNwYXJlbnR8VHlwZXxUeXBlY2xhc3Nlc3xUeXBlc3xUeXBpbmd8VW5PcHxVbk9wU3BlY3xVbmRlbGltaXR8VW5kb3xVbmZvY3VzfFVuZm9jdXNlZHxVbmZvbGR8VW5pdmVyc2V8VW5pdmVyc2VzfFVuc2hlbHZlfFZhcmlhYmxlfFZhcmlhYmxlc3xWYXJpYW50fFZlcmJvc2V8Vmlld3xWaXNpYmlsaXR5fFppZnl8X3xhcHBseXxhc3xhdHxieXxjb2ZpeHxlbHNlfGVuZHxleGlzdHN8ZXhpc3RzMnxmaXh8Zm9yfGZvcmFsbHxmdW58aWZ8aW58bGV0fG1hdGNofG1lYXN1cmV8bW92ZXxyZW1vdmVkfHJldHVybnxzdHJ1Y3R8dGhlbnx1c2luZ3x3Znx3aGVyZXx3aXRoKVxcYi8sXG5cblx0XHQnbnVtYmVyJzogL1xcYig/OjB4W2EtZjAtOV1bYS1mMC05X10qKD86XFwuW2EtZjAtOV9dKyk/KD86cFsrLV0/XFxkW1xcZF9dKik/fFxcZFtcXGRfXSooPzpcXC5bXFxkX10rKT8oPzplWystXT9cXGRbXFxkX10qKT8pXFxiL2ksXG5cblx0XHQncHVuY3QnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvQFxce3xcXHtcXHx8XFxbPXw6Pi8sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J29wZXJhdG9yJzogL1xcL1xcXFx8XFxcXFxcL3xcXC57MiwzfXw6ezEsMn09fFxcKlxcKnxbLT1dPnw8KD86LT4/fFsrOj0+XXw8Oil8Pig/Oj18LT4pfFxcfFstfF0/fFstISUmKisvPD0+P0BefiddLyxcblx0XHQncHVuY3R1YXRpb24nOiAvXFwuXFwofGBcXCh8QFxce3xgXFx7fFxce1xcfHxcXFs9fDo+fFs6Liw7KCl7fVxcW1xcXV0vXG5cdH07XG5cbn0oUHJpc20pKTtcblxuLyoqXG4gKiBPcmlnaW5hbCBieSBTYW11ZWwgRmxvcmVzXG4gKlxuICogQWRkcyB0aGUgZm9sbG93aW5nIG5ldyB0b2tlbiBjbGFzc2VzOlxuICogICAgIGNvbnN0YW50LCBidWlsdGluLCB2YXJpYWJsZSwgc3ltYm9sLCByZWdleFxuICovXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdFByaXNtLmxhbmd1YWdlcy5ydWJ5ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvIy4qfF49YmVnaW5cXHNbXFxzXFxTXSo/Xj1lbmQvbSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmNsYXNzfG1vZHVsZSlcXHMrfFxcYmNhdGNoXFxzK1xcKClbXFx3LlxcXFxdK3xcXGJbQS1aX11cXHcqKD89XFxzKlxcLlxccypuZXdcXGIpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1suXFxcXF0vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQna2V5d29yZCc6IC9cXGIoPzpCRUdJTnxFTkR8YWxpYXN8YW5kfGJlZ2lufGJyZWFrfGNhc2V8Y2xhc3N8ZGVmfGRlZmluZV9tZXRob2R8ZGVmaW5lZHxkb3xlYWNofGVsc2V8ZWxzaWZ8ZW5kfGVuc3VyZXxleHRlbmR8Zm9yfGlmfGlufGluY2x1ZGV8bW9kdWxlfG5ld3xuZXh0fG5pbHxub3R8b3J8cHJlcGVuZHxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8cmFpc2V8cmVkb3xyZXF1aXJlfHJlc2N1ZXxyZXRyeXxyZXR1cm58c2VsZnxzdXBlcnx0aGVufHRocm93fHVuZGVmfHVubGVzc3x1bnRpbHx3aGVufHdoaWxlfHlpZWxkKVxcYi8sXG5cdFx0J29wZXJhdG9yJzogL1xcLnsyLDN9fCZcXC58PT09fDw/PT58WyE9XT9+fCg/OiYmfFxcfFxcfHw8PHw+PnxcXCpcXCp8WytcXC0qLyU8PiFeJnw9XSk9P3xbPzpdLyxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpe31bXFxdLiw7XS8sXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3J1YnknLCAnb3BlcmF0b3InLCB7XG5cdFx0J2RvdWJsZS1jb2xvbic6IHtcblx0XHRcdHBhdHRlcm46IC86Oi8sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdH0pO1xuXG5cdHZhciBpbnRlcnBvbGF0aW9uID0ge1xuXHRcdHBhdHRlcm46IC8oKD86XnxbXlxcXFxdKSg/OlxcXFx7Mn0pKikjXFx7KD86W157fV18XFx7W157fV0qXFx9KSpcXH0vLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnY29udGVudCc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oI1xceylbXFxzXFxTXSsoPz1cXH0kKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnJ1Ynlcblx0XHRcdH0sXG5cdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXiNcXHt8XFx9JC8sXG5cdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdGRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMucnVieS5mdW5jdGlvbjtcblxuXHR2YXIgcGVyY2VudEV4cHJlc3Npb24gPSAnKD86JyArIFtcblx0XHQvKFteYS16QS1aMC05XFxzeyhcXFs8PV0pKD86KD8hXFwxKVteXFxcXF18XFxcXFtcXHNcXFNdKSpcXDEvLnNvdXJjZSxcblx0XHQvXFwoKD86W14oKVxcXFxdfFxcXFxbXFxzXFxTXXxcXCgoPzpbXigpXFxcXF18XFxcXFtcXHNcXFNdKSpcXCkpKlxcKS8uc291cmNlLFxuXHRcdC9cXHsoPzpbXnt9XFxcXF18XFxcXFtcXHNcXFNdfFxceyg/Oltee31cXFxcXXxcXFxcW1xcc1xcU10pKlxcfSkqXFx9Ly5zb3VyY2UsXG5cdFx0L1xcWyg/OlteXFxbXFxdXFxcXF18XFxcXFtcXHNcXFNdfFxcWyg/OlteXFxbXFxdXFxcXF18XFxcXFtcXHNcXFNdKSpcXF0pKlxcXS8uc291cmNlLFxuXHRcdC88KD86W148PlxcXFxdfFxcXFxbXFxzXFxTXXw8KD86W148PlxcXFxdfFxcXFxbXFxzXFxTXSkqPikqPi8uc291cmNlXG5cdF0uam9pbignfCcpICsgJyknO1xuXG5cdHZhciBzeW1ib2xOYW1lID0gLyg/OlwiKD86XFxcXC58W15cIlxcXFxcXHJcXG5dKSpcInwoPzpcXGJbYS16QS1aX11cXHcqfFteXFxzXFwwLVxceDdGXSspWz8hXT98XFwkLikvLnNvdXJjZTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdydWJ5JywgJ2tleXdvcmQnLCB7XG5cdFx0J3JlZ2V4LWxpdGVyYWwnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvJXIvLnNvdXJjZSArIHBlcmNlbnRFeHByZXNzaW9uICsgL1tlZ2ltbm9zdXhdezAsNn0vLnNvdXJjZSksXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24nOiBpbnRlcnBvbGF0aW9uLFxuXHRcdFx0XHRcdCdyZWdleCc6IC9bXFxzXFxTXSsvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXi9dKVxcLyg/IVxcLykoPzpcXFtbXlxcclxcblxcXV0rXFxdfFxcXFwufFteWy9cXFxcXFxyXFxuXSkrXFwvW2VnaW1ub3N1eF17MCw2fSg/PVxccyooPzokfFtcXHJcXG4sLjt9KSNdKSkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzogaW50ZXJwb2xhdGlvbixcblx0XHRcdFx0XHQncmVnZXgnOiAvW1xcc1xcU10rL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQndmFyaWFibGUnOiAvW0AkXStbYS16QS1aX11cXHcqKD86Wz8hXXxcXGIpLyxcblx0XHQnc3ltYm9sJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhefFteOl0pOi8uc291cmNlICsgc3ltYm9sTmFtZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oW1xcclxcbnsoLF1bIFxcdF0qKS8uc291cmNlICsgc3ltYm9sTmFtZSArIC8oPz06KD8hOikpLy5zb3VyY2UpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XSxcblx0XHQnbWV0aG9kLWRlZmluaXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYmRlZlxccyspXFx3Kyg/OlxccypcXC5cXHMqXFx3Kyk/Lyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2Z1bmN0aW9uJzogL1xcYlxcdyskLyxcblx0XHRcdFx0J2tleXdvcmQnOiAvXnNlbGZcXGIvLFxuXHRcdFx0XHQnY2xhc3MtbmFtZSc6IC9eXFx3Ky8sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdydWJ5JywgJ3N0cmluZycsIHtcblx0XHQnc3RyaW5nLWxpdGVyYWwnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvJVtxUWlJd1dzXT8vLnNvdXJjZSArIHBlcmNlbnRFeHByZXNzaW9uKSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IGludGVycG9sYXRpb24sXG5cdFx0XHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXCJ8JykoPzojXFx7W159XStcXH18Iyg/IVxceyl8XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8KD8hXFwxKVteXFxcXCNcXHJcXG5dKSpcXDEvLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzogaW50ZXJwb2xhdGlvbixcblx0XHRcdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLzw8Wy1+XT8oW2Etel9dXFx3KilbXFxyXFxuXSg/Oi4qW1xcclxcbl0pKj9bXFx0IF0qXFwxL2ksXG5cdFx0XHRcdGFsaWFzOiAnaGVyZWRvYy1zdHJpbmcnLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXjw8Wy1+XT9bYS16X11cXHcqfFxcYlthLXpfXVxcdyokL2ksXG5cdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0J3N5bWJvbCc6IC9cXGJcXHcrLyxcblx0XHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL148PFstfl0/L1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24nOiBpbnRlcnBvbGF0aW9uLFxuXHRcdFx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvPDxbLX5dPycoW2Etel9dXFx3KiknW1xcclxcbl0oPzouKltcXHJcXG5dKSo/W1xcdCBdKlxcMS9pLFxuXHRcdFx0XHRhbGlhczogJ2hlcmVkb2Mtc3RyaW5nJyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL148PFstfl0/J1thLXpfXVxcdyonfFxcYlthLXpfXVxcdyokL2ksXG5cdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0J3N5bWJvbCc6IC9cXGJcXHcrLyxcblx0XHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL148PFstfl0/J3wnJC8sXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2NvbW1hbmQtbGl0ZXJhbCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8leC8uc291cmNlICsgcGVyY2VudEV4cHJlc3Npb24pLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzogaW50ZXJwb2xhdGlvbixcblx0XHRcdFx0XHQnY29tbWFuZCc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvYCg/OiNcXHtbXn1dK1xcfXwjKD8hXFx7KXxcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXlxcXFxgI1xcclxcbl0pKmAvLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzogaW50ZXJwb2xhdGlvbixcblx0XHRcdFx0XHQnY29tbWFuZCc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XVxuXHR9KTtcblxuXHRkZWxldGUgUHJpc20ubGFuZ3VhZ2VzLnJ1Ynkuc3RyaW5nO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3J1YnknLCAnbnVtYmVyJywge1xuXHRcdCdidWlsdGluJzogL1xcYig/OkFycmF5fEJpZ251bXxCaW5kaW5nfENsYXNzfENvbnRpbnVhdGlvbnxEaXJ8RXhjZXB0aW9ufEZhbHNlQ2xhc3N8RmlsZXxGaXhudW18RmxvYXR8SGFzaHxJT3xJbnRlZ2VyfE1hdGNoRGF0YXxNZXRob2R8TW9kdWxlfE5pbENsYXNzfE51bWVyaWN8T2JqZWN0fFByb2N8UmFuZ2V8UmVnZXhwfFN0YXR8U3RyaW5nfFN0cnVjdHxTeW1ib2x8VE1TfFRocmVhZHxUaHJlYWRHcm91cHxUaW1lfFRydWVDbGFzcylcXGIvLFxuXHRcdCdjb25zdGFudCc6IC9cXGJbQS1aXVtBLVowLTlfXSooPzpbPyFdfFxcYikvXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5yYiA9IFByaXNtLmxhbmd1YWdlcy5ydWJ5O1xufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdFByaXNtLmxhbmd1YWdlcy5jcnlzdGFsID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgncnVieScsIHtcblx0XHQna2V5d29yZCc6IFtcblx0XHRcdC9cXGIoPzpfX0RJUl9ffF9fRU5EX0xJTkVfX3xfX0ZJTEVfX3xfX0xJTkVfX3xhYnN0cmFjdHxhbGlhc3xhbm5vdGF0aW9ufGFzfGFzbXxiZWdpbnxicmVha3xjYXNlfGNsYXNzfGRlZnxkb3xlbHNlfGVsc2lmfGVuZHxlbnN1cmV8ZW51bXxleHRlbmR8Zm9yfGZ1bnxpZnxpZmRlZnxpbmNsdWRlfGluc3RhbmNlX3NpemVvZnxsaWJ8bWFjcm98bW9kdWxlfG5leHR8b2Z8b3V0fHBvaW50ZXJvZnxwcml2YXRlfHByb3RlY3RlZHxwdHJ8cmVxdWlyZXxyZXNjdWV8cmV0dXJufHNlbGVjdHxzZWxmfHNpemVvZnxzdHJ1Y3R8c3VwZXJ8dGhlbnx0eXBlfHR5cGVvZnx1bmRlZnx1bmluaXRpYWxpemVkfHVuaW9ufHVubGVzc3x1bnRpbHx3aGVufHdoaWxlfHdpdGh8eWllbGQpXFxiLyxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXC5cXHMqKSg/OmlzX2F8cmVzcG9uZHNfdG8pXFw/Lyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J251bWJlcic6IC9cXGIoPzowYlswMV9dKlswMV18MG9bMC03X10qWzAtN118MHhbXFxkYS1mQS1GX10qW1xcZGEtZkEtRl18KD86XFxkKD86W1xcZF9dKlxcZCk/KSg/OlxcLltcXGRfXSpcXGQpPyg/OltlRV1bKy1dP1tcXGRfXSpcXGQpPykoPzpfKD86W3VpZl0oPzo4fDE2fDMyfDY0KSk/KT9cXGIvLFxuXHRcdCdvcGVyYXRvcic6IFtcblx0XHRcdC8tPi8sXG5cdFx0XHRQcmlzbS5sYW5ndWFnZXMucnVieS5vcGVyYXRvcixcblx0XHRdLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKCl7fVtcXF0uLDtcXFxcXS8sXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NyeXN0YWwnLCAnc3RyaW5nLWxpdGVyYWwnLCB7XG5cdFx0J2F0dHJpYnV0ZSc6IHtcblx0XHRcdHBhdHRlcm46IC9AXFxbLio/XFxdLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eQFxcW3xcXF0kLyxcblx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnYXR0cmlidXRlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKFxccyopXFx3Ky8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdhcmdzJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXFMoPzpbXFxzXFxTXSpcXFMpPy8sXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuY3J5c3RhbFxuXHRcdFx0XHR9LFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2V4cGFuc2lvbic6IHtcblx0XHRcdHBhdHRlcm46IC9cXHsoPzpcXHsuKj9cXH18JS4qPyUpXFx9Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY29udGVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHsuKVtcXHNcXFNdKyg/PS5cXH0kKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5jcnlzdGFsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15cXHtbXFx7JV18W1xcfSVdXFx9JC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2NoYXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvJyg/OlteXFxcXFxcclxcbl17MSwyfXxcXFxcKD86Lnx1KD86W0EtRmEtZjAtOV17MSw0fXxcXHtbQS1GYS1mMC05XXsxLDZ9XFx9KSkpJy8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgc3RyaW5nID0gLyhcInwnKSg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvO1xuXHR2YXIgc2VsZWN0b3JJbnNpZGU7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmNzcy5zZWxlY3RvciA9IHtcblx0XHRwYXR0ZXJuOiBQcmlzbS5sYW5ndWFnZXMuY3NzLnNlbGVjdG9yLnBhdHRlcm4sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHNlbGVjdG9ySW5zaWRlID0ge1xuXHRcdFx0J3BzZXVkby1lbGVtZW50JzogLzooPzphZnRlcnxiZWZvcmV8Zmlyc3QtbGV0dGVyfGZpcnN0LWxpbmV8c2VsZWN0aW9uKXw6OlstXFx3XSsvLFxuXHRcdFx0J3BzZXVkby1jbGFzcyc6IC86Wy1cXHddKy8sXG5cdFx0XHQnY2xhc3MnOiAvXFwuWy1cXHddKy8sXG5cdFx0XHQnaWQnOiAvI1stXFx3XSsvLFxuXHRcdFx0J2F0dHJpYnV0ZSc6IHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKCdcXFxcWyg/OlteW1xcXFxdXCJcXCddfCcgKyBzdHJpbmcuc291cmNlICsgJykqXFxcXF0nKSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcW3xcXF0kLyxcblx0XHRcdFx0XHQnY2FzZS1zZW5zaXRpdml0eSc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXFxzKVtzaV0kL2ksXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J25hbWVzcGFjZSc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eKFxccyopKD86KD8hXFxzKVstKlxcd1xceEEwLVxcdUZGRkZdKSpcXHwoPyE9KS8sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXHwkL1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J2F0dHItbmFtZSc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eKFxccyopKD86KD8hXFxzKVstXFx3XFx4QTAtXFx1RkZGRl0pKy8sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQnYXR0ci12YWx1ZSc6IFtcblx0XHRcdFx0XHRcdHN0cmluZyxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyg9XFxzKikoPzooPyFcXHMpWy1cXHdcXHhBMC1cXHVGRkZGXSkrKD89XFxzKiQpLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0J29wZXJhdG9yJzogL1t8fipeJF0/PS9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCduLXRoJzogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhcXChcXHMqKVsrLV0/XFxkKltcXGRuXSg/OlxccypbKy1dXFxzKlxcZCspPyg/PVxccypcXCkpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J251bWJlcic6IC9bXFxkbl0rLyxcblx0XHRcdFx0XHRcdCdvcGVyYXRvcic6IC9bKy1dL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXFwoXFxzKikoPzpldmVufG9kZCkoPz1cXHMqXFwpKS9pLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0XSxcblx0XHRcdCdjb21iaW5hdG9yJzogLz58XFwrfH58XFx8XFx8LyxcblxuXHRcdFx0Ly8gdGhlIGB0YWdgIHRva2VuIGhhcyBiZWVuIGV4aXN0ZWQgYW5kIHJlbW92ZWQuXG5cdFx0XHQvLyBiZWNhdXNlIHdlIGNhbid0IGZpbmQgYSBwZXJmZWN0IHRva2VuaXplIHRvIG1hdGNoIGl0LlxuXHRcdFx0Ly8gaWYgeW91IHdhbnQgdG8gYWRkIGl0LCBwbGVhc2UgcmVhZCBodHRwczovL2dpdGh1Yi5jb20vUHJpc21KUy9wcmlzbS9wdWxsLzIzNzMgZmlyc3QuXG5cblx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKCksXS8sXG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5jc3NbJ2F0cnVsZSddLmluc2lkZVsnc2VsZWN0b3ItZnVuY3Rpb24tYXJndW1lbnQnXS5pbnNpZGUgPSBzZWxlY3Rvckluc2lkZTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjc3MnLCAncHJvcGVydHknLCB7XG5cdFx0J3ZhcmlhYmxlJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteLVxcd1xceEEwLVxcdUZGRkZdKS0tKD8hXFxzKVstX2EtelxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVstXFx3XFx4QTAtXFx1RkZGRl0pKi9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0fSk7XG5cblx0dmFyIHVuaXQgPSB7XG5cdFx0cGF0dGVybjogLyhcXGJcXGQrKSg/OiV8W2Etel0rKD8hW1xcdy1dKSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fTtcblx0Ly8gMTIzIC0xMjMgLjEyMyAtLjEyMyAxMi4zIC0xMi4zXG5cdHZhciBudW1iZXIgPSB7XG5cdFx0cGF0dGVybjogLyhefFteXFx3Li1dKS0/KD86XFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NzcycsICdmdW5jdGlvbicsIHtcblx0XHQnb3BlcmF0b3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxccylbK1xcLSpcXC9dKD89XFxzKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvLyBDQVJFRlVMIVxuXHRcdC8vIFByZXZpZXdlcnMgYW5kIElubGluZSBjb2xvciB1c2UgaGV4Y29kZSBhbmQgY29sb3IuXG5cdFx0J2hleGNvZGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxCI1tcXGRhLWZdezMsOH1cXGIvaSxcblx0XHRcdGFsaWFzOiAnY29sb3InXG5cdFx0fSxcblx0XHQnY29sb3InOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdy1dKSg/OkFsaWNlQmx1ZXxBbnRpcXVlV2hpdGV8QXF1YXxBcXVhbWFyaW5lfEF6dXJlfEJlaWdlfEJpc3F1ZXxCbGFja3xCbGFuY2hlZEFsbW9uZHxCbHVlfEJsdWVWaW9sZXR8QnJvd258QnVybHlXb29kfENhZGV0Qmx1ZXxDaGFydHJldXNlfENob2NvbGF0ZXxDb3JhbHxDb3JuZmxvd2VyQmx1ZXxDb3Juc2lsa3xDcmltc29ufEN5YW58RGFya0JsdWV8RGFya0N5YW58RGFya0dvbGRlblJvZHxEYXJrR3JbYWVdeXxEYXJrR3JlZW58RGFya0toYWtpfERhcmtNYWdlbnRhfERhcmtPbGl2ZUdyZWVufERhcmtPcmFuZ2V8RGFya09yY2hpZHxEYXJrUmVkfERhcmtTYWxtb258RGFya1NlYUdyZWVufERhcmtTbGF0ZUJsdWV8RGFya1NsYXRlR3JbYWVdeXxEYXJrVHVycXVvaXNlfERhcmtWaW9sZXR8RGVlcFBpbmt8RGVlcFNreUJsdWV8RGltR3JbYWVdeXxEb2RnZXJCbHVlfEZpcmVCcmlja3xGbG9yYWxXaGl0ZXxGb3Jlc3RHcmVlbnxGdWNoc2lhfEdhaW5zYm9yb3xHaG9zdFdoaXRlfEdvbGR8R29sZGVuUm9kfEdyW2FlXXl8R3JlZW58R3JlZW5ZZWxsb3d8SG9uZXlEZXd8SG90UGlua3xJbmRpYW5SZWR8SW5kaWdvfEl2b3J5fEtoYWtpfExhdmVuZGVyfExhdmVuZGVyQmx1c2h8TGF3bkdyZWVufExlbW9uQ2hpZmZvbnxMaWdodEJsdWV8TGlnaHRDb3JhbHxMaWdodEN5YW58TGlnaHRHb2xkZW5Sb2RZZWxsb3d8TGlnaHRHclthZV15fExpZ2h0R3JlZW58TGlnaHRQaW5rfExpZ2h0U2FsbW9ufExpZ2h0U2VhR3JlZW58TGlnaHRTa3lCbHVlfExpZ2h0U2xhdGVHclthZV15fExpZ2h0U3RlZWxCbHVlfExpZ2h0WWVsbG93fExpbWV8TGltZUdyZWVufExpbmVufE1hZ2VudGF8TWFyb29ufE1lZGl1bUFxdWFNYXJpbmV8TWVkaXVtQmx1ZXxNZWRpdW1PcmNoaWR8TWVkaXVtUHVycGxlfE1lZGl1bVNlYUdyZWVufE1lZGl1bVNsYXRlQmx1ZXxNZWRpdW1TcHJpbmdHcmVlbnxNZWRpdW1UdXJxdW9pc2V8TWVkaXVtVmlvbGV0UmVkfE1pZG5pZ2h0Qmx1ZXxNaW50Q3JlYW18TWlzdHlSb3NlfE1vY2Nhc2lufE5hdmFqb1doaXRlfE5hdnl8T2xkTGFjZXxPbGl2ZXxPbGl2ZURyYWJ8T3JhbmdlfE9yYW5nZVJlZHxPcmNoaWR8UGFsZUdvbGRlblJvZHxQYWxlR3JlZW58UGFsZVR1cnF1b2lzZXxQYWxlVmlvbGV0UmVkfFBhcGF5YVdoaXB8UGVhY2hQdWZmfFBlcnV8UGlua3xQbHVtfFBvd2RlckJsdWV8UHVycGxlfFJlYmVjY2FQdXJwbGV8UmVkfFJvc3lCcm93bnxSb3lhbEJsdWV8U2FkZGxlQnJvd258U2FsbW9ufFNhbmR5QnJvd258U2VhR3JlZW58U2VhU2hlbGx8U2llbm5hfFNpbHZlcnxTa3lCbHVlfFNsYXRlQmx1ZXxTbGF0ZUdyW2FlXXl8U25vd3xTcHJpbmdHcmVlbnxTdGVlbEJsdWV8VGFufFRlYWx8VGhpc3RsZXxUb21hdG98VHJhbnNwYXJlbnR8VHVycXVvaXNlfFZpb2xldHxXaGVhdHxXaGl0ZXxXaGl0ZVNtb2tlfFllbGxvd3xZZWxsb3dHcmVlbikoPyFbXFx3LV0pL2ksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXGIoPzpoc2x8cmdiKVxcKFxccypcXGR7MSwzfVxccyosXFxzKlxcZHsxLDN9JT9cXHMqLFxccypcXGR7MSwzfSU/XFxzKlxcKVxcQnxcXGIoPzpoc2x8cmdiKWFcXChcXHMqXFxkezEsM31cXHMqLFxccypcXGR7MSwzfSU/XFxzKixcXHMqXFxkezEsM30lP1xccyosXFxzKig/OjB8MD9cXC5cXGQrfDEpXFxzKlxcKVxcQi9pLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQndW5pdCc6IHVuaXQsXG5cdFx0XHRcdFx0J251bWJlcic6IG51bWJlcixcblx0XHRcdFx0XHQnZnVuY3Rpb24nOiAvW1xcdy1dKyg/PVxcKCkvLFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKCksXS9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0Ly8gaXQncyBpbXBvcnRhbnQgdGhhdCB0aGVyZSBpcyBubyBib3VuZGFyeSBhc3NlcnRpb24gYWZ0ZXIgdGhlIGhleCBkaWdpdHNcblx0XHQnZW50aXR5JzogL1xcXFxbXFxkYS1mXXsxLDh9L2ksXG5cdFx0J3VuaXQnOiB1bml0LFxuXHRcdCdudW1iZXInOiBudW1iZXJcblx0fSk7XG5cbn0oUHJpc20pKTtcblxuLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQxODBcblxuUHJpc20ubGFuZ3VhZ2VzLmNzdiA9IHtcblx0J3ZhbHVlJzogL1teXFxyXFxuLFwiXSt8XCIoPzpbXlwiXXxcIlwiKSpcIig/IVwiKS8sXG5cdCdwdW5jdHVhdGlvbic6IC8sL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8vIGh0dHBzOi8vY3VlbGFuZy5vcmcvZG9jcy9yZWZlcmVuY2VzL3NwZWMvXG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0dmFyIHN0cmluZ0VzY2FwZSA9IC9cXFxcKD86KD8hXFwyKXxcXDIoPzpbXigpXFxyXFxuXXxcXChbXigpXSpcXCkpKS8uc291cmNlO1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHR2YXIgc3RyaW5nVHlwZXMgPSAvXCJcIlwiKD86W15cXFxcXCJdfFwiKD8hXCJcIlxcMil8PGVzYz4pKlwiXCJcIi8uc291cmNlICtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHRcdCd8JyArIC8nJycoPzpbXlxcXFwnXXwnKD8hJydcXDIpfDxlc2M+KSonJycvLnNvdXJjZSArXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0XHQnfCcgKyAvXCIoPzpbXlxcXFxcXHJcXG5cIl18XCIoPyFcXDIpfDxlc2M+KSpcIi8uc291cmNlICtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHRcdCd8JyArIC8nKD86W15cXFxcXFxyXFxuJ118Jyg/IVxcMil8PGVzYz4pKicvLnNvdXJjZTtcblx0dmFyIHN0cmluZ0xpdGVyYWwgPSAnKD86JyArIHN0cmluZ1R5cGVzLnJlcGxhY2UoLzxlc2M+L2csIHN0cmluZ0VzY2FwZSkgKyAnKSc7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmN1ZSA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXC9cXC8uKi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdzdHJpbmctbGl0ZXJhbCc6IHtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhefFteI1wiJ1xcXFxdKSgjKikvLnNvdXJjZSArIHN0cmluZ0xpdGVyYWwgKyAvKD8hW1wiJ10pXFwyLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQvLyBJJ20gdXNpbmcgZGlydHkgaGFjayBoZXJlLiBXZSBoYXZlIHRvIGtub3cgdGhlIG51bWJlciBoYXNoZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcgc29tZWhvdyxcblx0XHRcdFx0Ly8gYnV0IHdlIGNhbid0IGxvb2sgYmFjay4gU28gaW5zdGVhZCwgd2Ugd2lsbCB1c2UgYSBsb29rYWhlYWQsIGdvIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZywgYW5kXG5cdFx0XHRcdC8vIGNhcHR1cmUgdGhlIGhhc2hlcyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuXG5cdFx0XHRcdCdlc2NhcGUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyg/PVtcXHNcXFNdKltcIiddKCMqKSQpXFxcXFxcMSg/OlVbYS1mQS1GMC05XXsxLDh9fHVbYS1mQS1GMC05XXsxLDR9fHhbYS1mQS1GMC05XXsxLDJ9fFxcZHsyLDN9fFteKF0pLyxcblx0XHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oPz1bXFxzXFxTXSpbXCInXSgjKikkKVxcXFxcXDFcXChbXigpXSpcXCkvLFxuXHRcdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFxcXCMqXFwofFxcKSQvLFxuXHRcdFx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IG51bGxcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQna2V5d29yZCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdyRdKSg/OmZvcnxpZnxpbXBvcnR8aW58bGV0fG51bGx8cGFja2FnZSkoPyFbXFx3JF0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdib29sZWFuJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3JF0pKD86ZmFsc2V8dHJ1ZSkoPyFbXFx3JF0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdidWlsdGluJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3JF0pKD86Ym9vbHxieXRlc3xmbG9hdHxmbG9hdCg/OjMyfDY0KXx1P2ludCg/Ojh8MTZ8MzJ8NjR8MTI4KT98bnVtYmVyfHJ1bmV8c3RyaW5nKSg/IVtcXHckXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQnYXR0cmlidXRlJzoge1xuXHRcdFx0cGF0dGVybjogL0BbXFx3JF0rKD89XFxzKlxcKCkvLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdyRdKVthLXpfJF1bXFx3JF0qKD89XFxzKlxcKCkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXG5cdFx0J251bWJlcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdyQuXSkoPzowYlswMV0rKD86X1swMV0rKSp8MG9bMC03XSsoPzpfWzAtN10rKSp8MFt4WF1bMC05QS1GYS1mXSsoPzpfWzAtOUEtRmEtZl0rKSp8KD86XFxkKyg/Ol9cXGQrKSooPzpcXC4oPzpcXGQrKD86X1xcZCspKik/KT98XFwuXFxkKyg/Ol9cXGQrKSopKD86W2VFXVsrLV0/XFxkKyg/Ol9cXGQrKSopPyg/OltLTUdUUF1pPyk/KSg/IVtcXHckXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQnb3BlcmF0b3InOiAvXFwuezN9fF9cXHxffCYmP3xcXHxcXHw/fFs9IV1+fFs8Pj0hXT0/fFsrXFwtKi8/XS8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKVtcXF17fSwuOl0vXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmN1ZVsnc3RyaW5nLWxpdGVyYWwnXS5pbnNpZGUuaW50ZXJwb2xhdGlvbi5pbnNpZGUuZXhwcmVzc2lvbi5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuY3VlO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5jeXBoZXIgPSB7XG5cdC8vIGh0dHBzOi8vbmVvNGouY29tL2RvY3MvY3lwaGVyLW1hbnVhbC9jdXJyZW50L3N5bnRheC9jb21tZW50cy9cblx0J2NvbW1lbnQnOiAvXFwvXFwvLiovLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXCJcXFxcXFxyXFxuXXxcXFxcLikqXCJ8Jyg/OlteJ1xcXFxcXHJcXG5dfFxcXFwuKSonLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogLyg6XFxzKikoPzpcXHcrfGAoPzpbXmBcXFxcXFxyXFxuXSkqYCkoPz1cXHMqW3spOl0pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQncmVsYXRpb25zaGlwJzoge1xuXHRcdHBhdHRlcm46IC8oLVxcW1xccyooPzpcXHcrXFxzKnxgKD86W15gXFxcXFxcclxcbl0pKmBcXHMqKT86XFxzKnxcXHxcXHMqOlxccyopKD86XFx3K3xgKD86W15gXFxcXFxcclxcbl0pKmApLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXHQnaWRlbnRpZmllcic6IHtcblx0XHRwYXR0ZXJuOiAvYCg/OlteYFxcXFxcXHJcXG5dKSpgLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQndmFyaWFibGUnOiAvXFwkXFx3Ky8sXG5cblx0Ly8gaHR0cHM6Ly9uZW80ai5jb20vZG9jcy9jeXBoZXItbWFudWFsL2N1cnJlbnQvc3ludGF4L3Jlc2VydmVkL1xuXHQna2V5d29yZCc6IC9cXGIoPzpBRER8QUxMfEFORHxBU3xBU0N8QVNDRU5ESU5HfEFTU0VSVHxCWXxDQUxMfENBU0V8Q09NTUlUfENPTlNUUkFJTlR8Q09OVEFJTlN8Q1JFQVRFfENTVnxERUxFVEV8REVTQ3xERVNDRU5ESU5HfERFVEFDSHxESVNUSU5DVHxET3xEUk9QfEVMU0V8RU5EfEVORFN8RVhJU1RTfEZPUnxGT1JFQUNIfElOfElOREVYfElTfEpPSU58S0VZfExJTUlUfExPQUR8TUFOREFUT1JZfE1BVENIfE1FUkdFfE5PREV8Tk9UfE9GfE9OfE9QVElPTkFMfE9SfE9SREVSKD89XFxzK0JZKXxQRVJJT0RJQ3xSRU1PVkV8UkVRVUlSRXxSRVRVUk58U0NBTEFSfFNDQU58U0VUfFNLSVB8U1RBUlR8U1RBUlRTfFRIRU58VU5JT058VU5JUVVFfFVOV0lORHxVU0lOR3xXSEVOfFdIRVJFfFdJVEh8WE9SfFlJRUxEKVxcYi9pLFxuXG5cdCdmdW5jdGlvbic6IC9cXGJcXHcrXFxiKD89XFxzKlxcKCkvLFxuXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfG51bGx8dHJ1ZSlcXGIvaSxcblx0J251bWJlcic6IC9cXGIoPzoweFtcXGRhLWZBLUZdK3xcXGQrKD86XFwuXFxkKyk/KD86W2VFXVsrLV0/XFxkKyk/KVxcYi8sXG5cdC8vIGh0dHBzOi8vbmVvNGouY29tL2RvY3MvY3lwaGVyLW1hbnVhbC9jdXJyZW50L3N5bnRheC9vcGVyYXRvcnMvXG5cdCdvcGVyYXRvcic6IC86fDwtLT98LS0/Pj98PD58PX4/fFs8Pl09P3xbKyovJV58XXxcXC5cXC5cXC4/Lyxcblx0J3B1bmN0dWF0aW9uJzogL1soKVtcXF17fSw7Ll0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuZCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnY29tbWVudCc6IFtcblx0XHR7XG5cdFx0XHQvLyBTaGViYW5nXG5cdFx0XHRwYXR0ZXJuOiAvXlxccyojIS4rLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXnxbXlxcXFxdKS8uc291cmNlICsgJyg/OicgKyBbXG5cdFx0XHRcdC8vIC8rIGNvbW1lbnQgKy9cblx0XHRcdFx0Ly8gQWxsb3cgb25lIGxldmVsIG9mIG5lc3Rpbmdcblx0XHRcdFx0L1xcL1xcKyg/OlxcL1xcKyg/OlteK118XFwrKD8hXFwvKSkqXFwrXFwvfCg/IVxcL1xcKylbXFxzXFxTXSkqP1xcK1xcLy8uc291cmNlLFxuXHRcdFx0XHQvLyAvLyBjb21tZW50XG5cdFx0XHRcdC9cXC9cXC8uKi8uc291cmNlLFxuXHRcdFx0XHQvLyAvKiBjb21tZW50ICovXG5cdFx0XHRcdC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvLy5zb3VyY2Vcblx0XHRcdF0uam9pbignfCcpICsgJyknKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdzdHJpbmcnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKFtcblx0XHRcdFx0Ly8gclwiXCIsIHhcIlwiXG5cdFx0XHRcdC9cXGJbcnhdXCIoPzpcXFxcW1xcc1xcU118W15cXFxcXCJdKSpcIltjd2RdPy8uc291cmNlLFxuXG5cdFx0XHRcdC8vIHFcIltdXCIsIHFcIigpXCIsIHFcIjw+XCIsIHFcInt9XCJcblx0XHRcdFx0L1xcYnFcIig/OlxcW1tcXHNcXFNdKj9cXF18XFwoW1xcc1xcU10qP1xcKXw8W1xcc1xcU10qPz58XFx7W1xcc1xcU10qP1xcfSlcIi8uc291cmNlLFxuXG5cdFx0XHRcdC8vIHFcIklERU5UXG5cdFx0XHRcdC8vIC4uLlxuXHRcdFx0XHQvLyBJREVOVFwiXG5cdFx0XHRcdC9cXGJxXCIoKD8hXFxkKVxcdyspJFtcXHNcXFNdKj9eXFwxXCIvLnNvdXJjZSxcblxuXHRcdFx0XHQvLyBxXCIvL1wiLCBxXCJ8fFwiLCBldGMuXG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdFx0XHRcdC9cXGJxXCIoLilbXFxzXFxTXSo/XFwyXCIvLnNvdXJjZSxcblxuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHRcdFx0XHQvKFtcImBdKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDMpW15cXFxcXSkqXFwzW2N3ZF0/Ly5zb3VyY2Vcblx0XHRcdF0uam9pbignfCcpLCAnbScpLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxicVxceyg/Olxce1tee31dKlxcfXxbXnt9XSkqXFx9Lyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAndG9rZW4tc3RyaW5nJ1xuXHRcdH1cblx0XSxcblxuXHQvLyBJbiBvcmRlcjogJCwga2V5d29yZHMgYW5kIHNwZWNpYWwgdG9rZW5zLCBnbG9iYWxseSBkZWZpbmVkIHN5bWJvbHNcblx0J2tleXdvcmQnOiAvXFwkfFxcYig/Ol9fKD86KD86REFURXxFT0Z8RklMRXxGVU5DVElPTnxMSU5FfE1PRFVMRXxQUkVUVFlfRlVOQ1RJT058VElNRVNUQU1QfFRJTUV8VkVORE9SfFZFUlNJT04pX198Z3NoYXJlZHxwYXJhbWV0ZXJzfHRyYWl0c3x2ZWN0b3IpfGFic3RyYWN0fGFsaWFzfGFsaWdufGFzbXxhc3NlcnR8YXV0b3xib2R5fGJvb2x8YnJlYWt8Ynl0ZXxjYXNlfGNhc3R8Y2F0Y2h8Y2RvdWJsZXxjZW50fGNmbG9hdHxjaGFyfGNsYXNzfGNvbnN0fGNvbnRpbnVlfGNyZWFsfGRjaGFyfGRlYnVnfGRlZmF1bHR8ZGVsZWdhdGV8ZGVsZXRlfGRlcHJlY2F0ZWR8ZG98ZG91YmxlfGRzdHJpbmd8ZWxzZXxlbnVtfGV4cG9ydHxleHRlcm58ZmFsc2V8ZmluYWx8ZmluYWxseXxmbG9hdHxmb3J8Zm9yZWFjaHxmb3JlYWNoX3JldmVyc2V8ZnVuY3Rpb258Z290b3xpZG91YmxlfGlmfGlmbG9hdHxpbW11dGFibGV8aW1wb3J0fGlub3V0fGludHxpbnRlcmZhY2V8aW52YXJpYW50fGlyZWFsfGxhenl8bG9uZ3xtYWNyb3xtaXhpbnxtb2R1bGV8bmV3fG5vdGhyb3d8bnVsbHxvdXR8b3ZlcnJpZGV8cGFja2FnZXxwcmFnbWF8cHJpdmF0ZXxwcm90ZWN0ZWR8cHRyZGlmZl90fHB1YmxpY3xwdXJlfHJlYWx8cmVmfHJldHVybnxzY29wZXxzaGFyZWR8c2hvcnR8c2l6ZV90fHN0YXRpY3xzdHJpbmd8c3RydWN0fHN1cGVyfHN3aXRjaHxzeW5jaHJvbml6ZWR8dGVtcGxhdGV8dGhpc3x0aHJvd3x0cnVlfHRyeXx0eXBlZGVmfHR5cGVpZHx0eXBlb2Z8dWJ5dGV8dWNlbnR8dWludHx1bG9uZ3x1bmlvbnx1bml0dGVzdHx1c2hvcnR8dmVyc2lvbnx2b2lkfHZvbGF0aWxlfHdjaGFyfHdoaWxlfHdpdGh8d3N0cmluZylcXGIvLFxuXG5cdCdudW1iZXInOiBbXG5cdFx0Ly8gVGhlIGxvb2tiZWhpbmQgYW5kIHRoZSBuZWdhdGl2ZSBsb29rLWFoZWFkIHRyeSB0byBwcmV2ZW50IGJhZCBoaWdobGlnaHRpbmcgb2YgdGhlIC4uIG9wZXJhdG9yXG5cdFx0Ly8gSGV4YWRlY2ltYWwgbnVtYmVycyBtdXN0IGJlIGhhbmRsZWQgc2VwYXJhdGVseSB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGV4cG9uZW50IFwiZVwiXG5cdFx0L1xcYjB4XFwuP1thLWZcXGRfXSsoPzooPyFcXC5cXC4pXFwuW2EtZlxcZF9dKik/KD86cFsrLV0/W2EtZlxcZF9dKyk/W3VsZmldezAsNH0vaSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/OlxcLlxcLik/KSg/OlxcYjBiXFwuP3xcXGJ8XFwuKVxcZFtcXGRfXSooPzooPyFcXC5cXC4pXFwuW1xcZF9dKik/KD86ZVsrLV0/XFxkW1xcZF9dKik/W3VsZmldezAsNH0vaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cblx0J29wZXJhdG9yJzogL1xcfFt8PV0/fCZbJj1dP3xcXCtbKz1dP3wtWy09XT98XFwuP1xcLlxcLnw9Wz49XT98ISg/OmlbbnNdXFxifDw+Pz0/fD49P3w9KT98XFxiaVtuc11cXGJ8KD86PFs8Pl0/fD4+Pz4/fFxcXlxcXnxbKlxcLyVefl0pPT8vXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZCcsICdzdHJpbmcnLCB7XG5cdC8vIENoYXJhY3RlcnNcblx0Ly8gJ2EnLCAnXFxcXCcsICdcXG4nLCAnXFx4RkYnLCAnXFwzNzcnLCAnXFx1RkZGRicsICdcXFUwMDEwRkZGRicsICdcXHF1b3QnXG5cdCdjaGFyJzogLycoPzpcXFxcKD86XFxXfFxcdyspfFteXFxcXF0pJy9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdkJywgJ2tleXdvcmQnLCB7XG5cdCdwcm9wZXJ0eSc6IC9cXEJAXFx3Ki9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdkJywgJ2Z1bmN0aW9uJywge1xuXHQncmVnaXN0ZXInOiB7XG5cdFx0Ly8gSWFzbSByZWdpc3RlcnNcblx0XHRwYXR0ZXJuOiAvXFxiKD86W0FCQ0RdW0xIWF18RT8oPzpCUHxESXxTSXxTUCl8W0JTXVBMfFtFQ1NER0ZdU3xDUlswMjM0XXxbRFNdSUx8RFJbMDEyMzY3XXxFW0FCQ0RdWHxYP01NWzAtN118Uig/OjFbMC01XXxbODldKVtCV0RdP3xSW0FCQ0RdWHxSW0JTXVB8UltEU11JfFRSWzMtN118WE1NKD86MVswLTVdfFs4OV0pfFlNTSg/OjFbMC01XXxcXGQpKVxcYnxcXGJTVCg/OlxcKFswLTddXFwpfFxcYikvLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH1cbn0pO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdHZhciBrZXl3b3JkcyA9IFtcblx0XHQvXFxiKD86YXN5bmN8c3luY3x5aWVsZClcXCovLFxuXHRcdC9cXGIoPzphYnN0cmFjdHxhc3NlcnR8YXN5bmN8YXdhaXR8YnJlYWt8Y2FzZXxjYXRjaHxjbGFzc3xjb25zdHxjb250aW51ZXxjb3ZhcmlhbnR8ZGVmYXVsdHxkZWZlcnJlZHxkb3xkeW5hbWljfGVsc2V8ZW51bXxleHBvcnR8ZXh0ZW5kc3xleHRlbnNpb258ZXh0ZXJuYWx8ZmFjdG9yeXxmaW5hbHxmaW5hbGx5fGZvcnxnZXR8aGlkZXxpZnxpbXBsZW1lbnRzfGltcG9ydHxpbnxpbnRlcmZhY2V8bGlicmFyeXxtaXhpbnxuZXd8bnVsbHxvbnxvcGVyYXRvcnxwYXJ0fHJldGhyb3d8cmV0dXJufHNldHxzaG93fHN0YXRpY3xzdXBlcnxzd2l0Y2h8c3luY3x0aGlzfHRocm93fHRyeXx0eXBlZGVmfHZhcnx2b2lkfHdoaWxlfHdpdGh8eWllbGQpXFxiL1xuXHRdO1xuXG5cdC8vIEhhbmRsZXMgbmFtZWQgaW1wb3J0cywgc3VjaCBhcyBodHRwLkNsaWVudFxuXHR2YXIgcGFja2FnZVByZWZpeCA9IC8oXnxbXlxcdy5dKSg/OlthLXpdXFx3KlxccypcXC5cXHMqKSooPzpbQS1aXVxcdypcXHMqXFwuXFxzKikqLy5zb3VyY2U7XG5cblx0Ly8gYmFzZWQgb24gdGhlIGRhcnQgbmFtaW5nIGNvbnZlbnRpb25zXG5cdHZhciBjbGFzc05hbWUgPSB7XG5cdFx0cGF0dGVybjogUmVnRXhwKHBhY2thZ2VQcmVmaXggKyAvW0EtWl0oPzpbXFxkX0EtWl0qW2Etel1cXHcqKT9cXGIvLnNvdXJjZSksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCduYW1lc3BhY2UnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eW2Etel1cXHcqKD86XFxzKlxcLlxccypbYS16XVxcdyopKig/OlxccypcXC4pPy8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5kYXJ0ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdFx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0XHRjbGFzc05hbWUsXG5cdFx0XHR7XG5cdFx0XHRcdC8vIHZhcmlhYmxlcyBhbmQgcGFyYW1ldGVyc1xuXHRcdFx0XHQvLyB0aGlzIHRvIHN1cHBvcnQgY2xhc3MgbmFtZXMgKG9yIGdlbmVyaWMgcGFyYW1ldGVycykgd2hpY2ggZG8gbm90IGNvbnRhaW4gYSBsb3dlciBjYXNlIGxldHRlciAoYWxzbyB3b3JrcyBmb3IgbWV0aG9kcylcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKHBhY2thZ2VQcmVmaXggKyAvW0EtWl1cXHcqKD89XFxzK1xcdytcXHMqWzssPSgpXSkvLnNvdXJjZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogY2xhc3NOYW1lLmluc2lkZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHQnb3BlcmF0b3InOiAvXFxiaXMhfFxcYig/OmFzfGlzKVxcYnxcXCtcXCt8LS18JiZ8XFx8XFx8fDw8PT98Pj49P3x+KD86XFwvPT8pP3xbK1xcLSpcXC8lJl58PSE8Pl09P3xcXD8vXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2RhcnQnLCAnc3RyaW5nJywge1xuXHRcdCdzdHJpbmctbGl0ZXJhbCc6IHtcblx0XHRcdHBhdHRlcm46IC9yPyg/OihcIlwiXCJ8JycnKVtcXHNcXFNdKj9cXDF8KFtcIiddKSg/OlxcXFwufCg/IVxcMilbXlxcXFxcXHJcXG5dKSpcXDIoPyFcXDIpKS8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLygoPzpefFteXFxcXF0pKD86XFxcXHsyfSkqKVxcJCg/Olxcdyt8XFx7KD86W157fV18XFx7W157fV0qXFx9KSpcXH0pLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXCRcXHs/fFxcfSQvLFxuXHRcdFx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5kYXJ0XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB1bmRlZmluZWRcblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZGFydCcsICdjbGFzcy1uYW1lJywge1xuXHRcdCdtZXRhZGF0YSc6IHtcblx0XHRcdHBhdHRlcm46IC9AXFx3Ky8sXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZGFydCcsICdjbGFzcy1uYW1lJywge1xuXHRcdCdnZW5lcmljcyc6IHtcblx0XHRcdHBhdHRlcm46IC88KD86W1xcd1xccywuJj9dfDwoPzpbXFx3XFxzLC4mP118PCg/OltcXHdcXHMsLiY/XXw8W1xcd1xccywuJj9dKj4pKj4pKj4pKj4vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjbGFzcy1uYW1lJzogY2xhc3NOYW1lLFxuXHRcdFx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWzw+KCksLjpdLyxcblx0XHRcdFx0J29wZXJhdG9yJzogL1s/JnxdL1xuXHRcdFx0fVxuXHRcdH0sXG5cdH0pO1xufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdFByaXNtLmxhbmd1YWdlcy5kYXRhd2VhdmUgPSB7XG5cdFx0J3VybCc6IC9cXGJbQS1aYS16XSs6XFwvXFwvW1xcdy86Lj89Ji1dK3xcXGJ1cm46W1xcdzouPz0mLV0rLyxcblx0XHQncHJvcGVydHknOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKD86XFxiXFx3KyMpPyg/OlwiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcInxcXGJcXHcrKSg/PVxccypbOkBdKS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFtcIidgXSkoPzpcXFxcW1xcc1xcU118KD8hXFwxKVteXFxcXF0pKlxcMS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdtaW1lLXR5cGUnOiAvXFxiKD86YXBwbGljYXRpb258YXVkaW98aW1hZ2V8bXVsdGlwYXJ0fHRleHR8dmlkZW8pXFwvW1xcdystXSsvLFxuXHRcdCdkYXRlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcfFtcXHc6Ky1dK1xcfC8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdjb21tZW50JzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcOl0pXFwvXFwvLiovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdyZWdleCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXC8oPzpbXlxcXFxcXC9cXHJcXG5dfFxcXFxbXlxcclxcbl0pK1xcLy8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzogL1xcYig/OmFuZHxhc3xhdHxjYXNlfGRvfGVsc2V8ZnVufGlmfGlucHV0fGlzfG1hdGNofG5vdHxuc3xudWxsfG9yfG91dHB1dHx0eXBlfHVubGVzc3x1cGRhdGV8dXNpbmd8dmFyKVxcYi8sXG5cdFx0J2Z1bmN0aW9uJzogL1xcYltBLVpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXHRcdCdudW1iZXInOiAvLT9cXGJcXGQrKD86XFwuXFxkKyk/KD86ZVsrLV0/XFxkKyk/XFxiL2ksXG5cdFx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksLjpAXS8sXG5cdFx0J29wZXJhdG9yJzogLzw8fD4+fC0+fFs8Pn49XT0/fCE9fC0tPy0/fFxcK1xcKz98IXxcXD8vLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0fTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuZGF4ID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkoPzpcXC9cXCpbXFxzXFxTXSo/XFwqXFwvfCg/Oi0tfFxcL1xcLykuKikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2RhdGEtZmllbGQnOiB7XG5cdFx0cGF0dGVybjogLycoPzpbXiddfCcnKSonKD8hJykoPzpcXFtbIFxcd1xceEEwLVxcdUZGRkZdK1xcXSk/fFxcdytcXFtbIFxcd1xceEEwLVxcdUZGRkZdK1xcXS8sXG5cdFx0YWxpYXM6ICdzeW1ib2wnXG5cdH0sXG5cdCdtZWFzdXJlJzoge1xuXHRcdHBhdHRlcm46IC9cXFtbIFxcd1xceEEwLVxcdUZGRkZdK1xcXS8sXG5cdFx0YWxpYXM6ICdjb25zdGFudCdcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXXxcIlwiKSpcIig/IVwiKS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdmdW5jdGlvbic6IC9cXGIoPzpBQlN8QUNPU3xBQ09TSHxBQ09UfEFDT1RIfEFERENPTFVNTlN8QURETUlTU0lOR0lURU1TfEFMTHxBTExDUk9TU0ZJTFRFUkVEfEFMTEVYQ0VQVHxBTExOT0JMQU5LUk9XfEFMTFNFTEVDVEVEfEFORHxBUFBST1hJTUFURURJU1RJTkNUQ09VTlR8QVNJTnxBU0lOSHxBVEFOfEFUQU5IfEFWRVJBR0V8QVZFUkFHRUF8QVZFUkFHRVh8QkVUQVxcLkRJU1R8QkVUQVxcLklOVnxCTEFOS3xDQUxDVUxBVEV8Q0FMQ1VMQVRFVEFCTEV8Q0FMRU5EQVJ8Q0FMRU5EQVJBVVRPfENFSUxJTkd8Q0hJU1FcXC5ESVNUfENISVNRXFwuRElTVFxcLlJUfENISVNRXFwuSU5WfENISVNRXFwuSU5WXFwuUlR8Q0xPU0lOR0JBTEFOQ0VNT05USHxDTE9TSU5HQkFMQU5DRVFVQVJURVJ8Q0xPU0lOR0JBTEFOQ0VZRUFSfENPQUxFU0NFfENPTUJJTnxDT01CSU5BfENPTUJJTkVWQUxVRVN8Q09OQ0FURU5BVEV8Q09OQ0FURU5BVEVYfENPTkZJREVOQ0VcXC5OT1JNfENPTkZJREVOQ0VcXC5UfENPTlRBSU5TfENPTlRBSU5TUk9XfENPTlRBSU5TU1RSSU5HfENPTlRBSU5TU1RSSU5HRVhBQ1R8Q09OVkVSVHxDT1N8Q09TSHxDT1R8Q09USHxDT1VOVHxDT1VOVEF8Q09VTlRBWHxDT1VOVEJMQU5LfENPVU5UUk9XU3xDT1VOVFh8Q1JPU1NGSUxURVJ8Q1JPU1NKT0lOfENVUlJFTkNZfENVUlJFTlRHUk9VUHxDVVNUT01EQVRBfERBVEFUQUJMRXxEQVRFfERBVEVBRER8REFURURJRkZ8REFURVNCRVRXRUVOfERBVEVTSU5QRVJJT0R8REFURVNNVER8REFURVNRVER8REFURVNZVER8REFURVZBTFVFfERBWXxERUdSRUVTfERFVEFJTFJPV1N8RElTVElOQ1R8RElTVElOQ1RDT1VOVHxESVNUSU5DVENPVU5UTk9CTEFOS3xESVZJREV8RUFSTElFUnxFQVJMSUVTVHxFREFURXxFTkRPRk1PTlRIfEVORE9GUVVBUlRFUnxFTkRPRllFQVJ8RU9NT05USHxFUlJPUnxFVkVOfEVYQUNUfEVYQ0VQVHxFWFB8RVhQT05cXC5ESVNUfEZBQ1R8RkFMU0V8RklMVEVSfEZJTFRFUlN8RklORHxGSVJTVERBVEV8RklSU1ROT05CTEFOS3xGSVJTVE5PTkJMQU5LVkFMVUV8RklYRUR8RkxPT1J8Rk9STUFUfEdDRHxHRU5FUkFURXxHRU5FUkFURUFMTHxHRU5FUkFURVNFUklFU3xHRU9NRUFOfEdFT01FQU5YfEdST1VQQll8SEFTT05FRklMVEVSfEhBU09ORVZBTFVFfEhPVVJ8SUZ8SUZcXC5FQUdFUnxJRkVSUk9SfElHTk9SRXxJTlR8SU5URVJTRUNUfElTQkxBTkt8SVNDUk9TU0ZJTFRFUkVEfElTRU1QVFl8SVNFUlJPUnxJU0VWRU58SVNGSUxURVJFRHxJU0lOU0NPUEV8SVNMT0dJQ0FMfElTTk9OVEVYVHxJU05VTUJFUnxJU09cXC5DRUlMSU5HfElTT0REfElTT05PUkFGVEVSfElTU0VMRUNURURNRUFTVVJFfElTU1VCVE9UQUx8SVNURVhUfEtFRVBGSUxURVJTfEtFWVdPUkRNQVRDSHxMQVNUREFURXxMQVNUTk9OQkxBTkt8TEFTVE5PTkJMQU5LVkFMVUV8TENNfExFRlR8TEVOfExOfExPR3xMT0cxMHxMT09LVVBWQUxVRXxMT1dFUnxNQVh8TUFYQXxNQVhYfE1FRElBTnxNRURJQU5YfE1JRHxNSU58TUlOQXxNSU5VVEV8TUlOWHxNT0R8TU9OVEh8TVJPVU5EfE5BVFVSQUxJTk5FUkpPSU58TkFUVVJBTExFRlRPVVRFUkpPSU58TkVYVERBWXxORVhUTU9OVEh8TkVYVFFVQVJURVJ8TkVYVFlFQVJ8Tk9OVklTVUFMfE5PUk1cXC5ESVNUfE5PUk1cXC5JTlZ8Tk9STVxcLlNcXC5ESVNUfE5PUk1cXC5TXFwuSU5WfE5PVHxOT1d8T0REfE9QRU5JTkdCQUxBTkNFTU9OVEh8T1BFTklOR0JBTEFOQ0VRVUFSVEVSfE9QRU5JTkdCQUxBTkNFWUVBUnxPUnxQQVJBTExFTFBFUklPRHxQQVRIfFBBVEhDT05UQUlOU3xQQVRISVRFTXxQQVRISVRFTVJFVkVSU0V8UEFUSExFTkdUSHxQRVJDRU5USUxFXFwuRVhDfFBFUkNFTlRJTEVcXC5JTkN8UEVSQ0VOVElMRVhcXC5FWEN8UEVSQ0VOVElMRVhcXC5JTkN8UEVSTVVUfFBJfFBPSVNTT05cXC5ESVNUfFBPV0VSfFBSRVZJT1VTREFZfFBSRVZJT1VTTU9OVEh8UFJFVklPVVNRVUFSVEVSfFBSRVZJT1VTWUVBUnxQUk9EVUNUfFBST0RVQ1RYfFFVQVJURVJ8UVVPVElFTlR8UkFESUFOU3xSQU5EfFJBTkRCRVRXRUVOfFJBTktcXC5FUXxSQU5LWHxSRUxBVEVEfFJFTEFURURUQUJMRXxSRU1PVkVGSUxURVJTfFJFUExBQ0V8UkVQVHxSSUdIVHxST0xMVVB8Uk9MTFVQQURESVNTVUJUT1RBTHxST0xMVVBHUk9VUHxST0xMVVBJU1NVQlRPVEFMfFJPVU5EfFJPVU5ERE9XTnxST1VORFVQfFJPV3xTQU1FUEVSSU9ETEFTVFlFQVJ8U0FNUExFfFNFQVJDSHxTRUNPTkR8U0VMRUNUQ09MVU1OU3xTRUxFQ1RFRE1FQVNVUkV8U0VMRUNURURNRUFTVVJFRk9STUFUU1RSSU5HfFNFTEVDVEVETUVBU1VSRU5BTUV8U0VMRUNURURWQUxVRXxTSUdOfFNJTnxTSU5IfFNRUlR8U1FSVFBJfFNUQVJUT0ZNT05USHxTVEFSVE9GUVVBUlRFUnxTVEFSVE9GWUVBUnxTVERFVlxcLlB8U1RERVZcXC5TfFNUREVWWFxcLlB8U1RERVZYXFwuU3xTVUJTVElUVVRFfFNVQlNUSVRVVEVXSVRISU5ERVh8U1VNfFNVTU1BUklaRXxTVU1NQVJJWkVDT0xVTU5TfFNVTVh8U1dJVENIfFRcXC5ESVNUfFRcXC5ESVNUXFwuMlR8VFxcLkRJU1RcXC5SVHxUXFwuSU5WfFRcXC5JTlZcXC4yVHxUQU58VEFOSHxUSU1FfFRJTUVWQUxVRXxUT0RBWXxUT1BOfFRPUE5QRVJMRVZFTHxUT1BOU0tJUHxUT1RBTE1URHxUT1RBTFFURHxUT1RBTFlURHxUUkVBVEFTfFRSSU18VFJVRXxUUlVOQ3xVTklDSEFSfFVOSUNPREV8VU5JT058VVBQRVJ8VVNFUkVMQVRJT05TSElQfFVTRVJOQU1FfFVTRVJPQkpFQ1RJRHxVU0VSUFJJTkNJUEFMTkFNRXxVVENOT1d8VVRDVE9EQVl8VkFMVUV8VkFMVUVTfFZBUlxcLlB8VkFSXFwuU3xWQVJYXFwuUHxWQVJYXFwuU3xXRUVLREFZfFdFRUtOVU18WElSUnxYTlBWfFlFQVJ8WUVBUkZSQUMpKD89XFxzKlxcKCkvaSxcblx0J2tleXdvcmQnOiAvXFxiKD86REVGSU5FfEVWQUxVQVRFfE1FQVNVUkV8T1JERVJcXHMrQll8UkVUVVJOfFZBUnxTVEFSVFxccytBVHxBU0N8REVTQylcXGIvaSxcblx0J2Jvb2xlYW4nOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OkZBTFNFfE5VTEx8VFJVRSlcXGIvaSxcblx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHR9LFxuXHQnbnVtYmVyJzogL1xcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkK1xcYi8sXG5cdCdvcGVyYXRvcic6IC86PXxbLSsqXFwvPV5dfCYmP3xcXHxcXHx8PCg/Oj0+P3w8fD4pP3w+Wz49XT98XFxiKD86SU58Tk9UKVxcYi9pLFxuXHQncHVuY3R1YXRpb24nOiAvWztcXFtcXF0oKXt9YCwuXS9cbn07XG5cbi8vIEFCTkYgZ3JhbW1hcjpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kaGFsbC1sYW5nL2RoYWxsLWxhbmcvYmxvYi9tYXN0ZXIvc3RhbmRhcmQvZGhhbGwuYWJuZlxuXG5QcmlzbS5sYW5ndWFnZXMuZGhhbGwgPSB7XG5cdC8vIE11bHRpLWxpbmUgY29tbWVudHMgY2FuIGJlIG5lc3RlZC4gRS5nLiB7LSBmb28gey0gYmFyIC19IC19XG5cdC8vIFRoZSBtdWx0aS1saW5lIHBhdHRlcm4gaXMgZXNzZW50aWFsbHkgdGhpczpcblx0Ly8gICBcXHstKD86W14te118LSg/IVxcfSl8XFx7KD8hLSl8PFNFTEY+KSotXFx9XG5cdCdjb21tZW50JzogLy0tLip8XFx7LSg/OlteLXtdfC0oPyFcXH0pfFxceyg/IS0pfFxcey0oPzpbXi17XXwtKD8hXFx9KXxcXHsoPyEtKSkqLVxcfSkqLVxcfS8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cIlxcXFxdfFxcXFwuKSpcInwnJyg/OlteJ118Jyg/IScpfCcnJ3wnJ1xcJFxceykqJycoPyEnfFxcJCkvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwkXFx7W157fV0qXFx9Lyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXCRcXHspW1xcc1xcU10rKD89XFx9JCkvLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtZGhhbGwnLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBibG93XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwkXFx7fFxcfS9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J2xhYmVsJzoge1xuXHRcdHBhdHRlcm46IC9gW15gXSpgLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3VybCc6IHtcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vZGhhbGwtbGFuZy9kaGFsbC1sYW5nL2Jsb2IvNWZkZThlZjFiZWFkNmZiNGU5OTlkM2MxZmZlNzA0NGNkMDE5ZDYzYS9zdGFuZGFyZC9kaGFsbC5hYm5mI0w1OTZcblx0XHRwYXR0ZXJuOiAvXFxiaHR0cHM/OlxcL1xcL1tcXHcuOiUhJCYnKis7PUB+LV0rKD86XFwvW1xcdy46JSEkJicqKzs9QH4tXSopKig/OlxcP1svP1xcdy46JSEkJicqKzs9QH4tXSopPy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdlbnYnOiB7XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2RoYWxsLWxhbmcvZGhhbGwtbGFuZy9ibG9iLzVmZGU4ZWYxYmVhZDZmYjRlOTk5ZDNjMWZmZTcwNDRjZDAxOWQ2M2Evc3RhbmRhcmQvZGhhbGwuYWJuZiNMNjYxXG5cdFx0cGF0dGVybjogL1xcYmVudjooPzooPyFcXGQpXFx3K3xcIig/OlteXCJcXFxcPV18XFxcXC4pKlwiKS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2Z1bmN0aW9uJzogL15lbnYvLFxuXHRcdFx0J29wZXJhdG9yJzogL146Lyxcblx0XHRcdCd2YXJpYWJsZSc6IC9bXFxzXFxTXSsvXG5cdFx0fVxuXHR9LFxuXHQnaGFzaCc6IHtcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vZGhhbGwtbGFuZy9kaGFsbC1sYW5nL2Jsb2IvNWZkZThlZjFiZWFkNmZiNGU5OTlkM2MxZmZlNzA0NGNkMDE5ZDYzYS9zdGFuZGFyZC9kaGFsbC5hYm5mI0w3MjVcblx0XHRwYXR0ZXJuOiAvXFxic2hhMjU2OltcXGRhLWZBLUZdezY0fVxcYi8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnZnVuY3Rpb24nOiAvc2hhMjU2Lyxcblx0XHRcdCdvcGVyYXRvcic6IC86Lyxcblx0XHRcdCdudW1iZXInOiAvW1xcZGEtZkEtRl17NjR9L1xuXHRcdH1cblx0fSxcblxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vZGhhbGwtbGFuZy9kaGFsbC1sYW5nL2Jsb2IvNWZkZThlZjFiZWFkNmZiNGU5OTlkM2MxZmZlNzA0NGNkMDE5ZDYzYS9zdGFuZGFyZC9kaGFsbC5hYm5mI0wzNTlcblx0J2tleXdvcmQnOiAvXFxiKD86YXN8YXNzZXJ0fGVsc2V8Zm9yYWxsfGlmfGlufGxldHxtZXJnZXxtaXNzaW5nfHRoZW58dG9NYXB8dXNpbmd8d2l0aClcXGJ8XFx1MjIwMC8sXG5cdCdidWlsdGluJzogL1xcYig/Ok5vbmV8U29tZSlcXGIvLFxuXG5cdCdib29sZWFuJzogL1xcYig/OkZhbHNlfFRydWUpXFxiLyxcblx0J251bWJlcic6IC9cXGJOYU5cXGJ8LT9cXGJJbmZpbml0eVxcYnxbKy1dP1xcYig/OjB4W1xcZGEtZkEtRl0rfFxcZCsoPzpcXC5cXGQrKT8oPzplWystXT9cXGQrKT8pXFxiLyxcblx0J29wZXJhdG9yJzogL1xcL1xcXFx8XFwvXFwvXFxcXFxcXFx8JiZ8XFx8XFx8fD09PXxbIT1dPXxcXC9cXC98LT58XFwrXFwrfDo6fFsrKiNAPTo/PD58XFxcXFxcdTIyMjdcXHUyYTUzXFx1MjI2MVxcdTJhZmRcXHUwM2JiXFx1MjE5Ml0vLFxuXHQncHVuY3R1YXRpb24nOiAvXFwuXFwufFt7fVxcW1xcXSgpLC4vXS8sXG5cblx0Ly8gd2UnbGwganVzdCBhc3N1bWUgdGhhdCBldmVyeSBjYXBpdGFsIHdvcmQgbGVmdCBpcyBhIHR5cGUgbmFtZVxuXHQnY2xhc3MtbmFtZSc6IC9cXGJbQS1aXVxcdypcXGIvXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuZGhhbGwuc3RyaW5nLmluc2lkZS5pbnRlcnBvbGF0aW9uLmluc2lkZS5leHByZXNzaW9uLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5kaGFsbDtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdFByaXNtLmxhbmd1YWdlcy5kaWZmID0ge1xuXHRcdCdjb29yZCc6IFtcblx0XHRcdC8vIE1hdGNoIGFsbCBraW5kcyBvZiBjb29yZCBsaW5lcyAocHJlZml4ZWQgYnkgXCIrKytcIiwgXCItLS1cIiBvciBcIioqKlwiKS5cblx0XHRcdC9eKD86XFwqezN9fC17M318XFwrezN9KS4qJC9tLFxuXHRcdFx0Ly8gTWF0Y2ggXCJAQCAuLi4gQEBcIiBjb29yZCBsaW5lcyBpbiB1bmlmaWVkIGRpZmYuXG5cdFx0XHQvXkBALipAQCQvbSxcblx0XHRcdC8vIE1hdGNoIGNvb3JkIGxpbmVzIGluIG5vcm1hbCBkaWZmIChzdGFydHMgd2l0aCBhIG51bWJlcikuXG5cdFx0XHQvXlxcZC4qJC9tXG5cdFx0XVxuXG5cdFx0Ly8gZGVsZXRlZCwgaW5zZXJ0ZWQsIHVuY2hhbmdlZCwgZGlmZlxuXHR9O1xuXG5cdC8qKlxuXHQgKiBBIG1hcCBmcm9tIHRoZSBuYW1lIG9mIGEgYmxvY2sgdG8gaXRzIGxpbmUgcHJlZml4LlxuXHQgKlxuXHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgc3RyaW5nPn1cblx0ICovXG5cdHZhciBQUkVGSVhFUyA9IHtcblx0XHQnZGVsZXRlZC1zaWduJzogJy0nLFxuXHRcdCdkZWxldGVkLWFycm93JzogJzwnLFxuXHRcdCdpbnNlcnRlZC1zaWduJzogJysnLFxuXHRcdCdpbnNlcnRlZC1hcnJvdyc6ICc+Jyxcblx0XHQndW5jaGFuZ2VkJzogJyAnLFxuXHRcdCdkaWZmJzogJyEnLFxuXHR9O1xuXG5cdC8vIGFkZCBhIHRva2VuIGZvciBlYWNoIHByZWZpeFxuXHRPYmplY3Qua2V5cyhQUkVGSVhFUykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuXHRcdHZhciBwcmVmaXggPSBQUkVGSVhFU1tuYW1lXTtcblxuXHRcdHZhciBhbGlhcyA9IFtdO1xuXHRcdGlmICghL15cXHcrJC8udGVzdChuYW1lKSkgeyAvLyBcImRlbGV0ZWQtc2lnblwiIC0+IFwiZGVsZXRlZFwiXG5cdFx0XHRhbGlhcy5wdXNoKC9cXHcrLy5leGVjKG5hbWUpWzBdKTtcblx0XHR9XG5cdFx0aWYgKG5hbWUgPT09ICdkaWZmJykge1xuXHRcdFx0YWxpYXMucHVzaCgnYm9sZCcpO1xuXHRcdH1cblxuXHRcdFByaXNtLmxhbmd1YWdlcy5kaWZmW25hbWVdID0ge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCdeKD86WycgKyBwcmVmaXggKyAnXS4qKD86XFxyXFxuP3xcXG58KD8hW1xcXFxzXFxcXFNdKSkpKycsICdtJyksXG5cdFx0XHRhbGlhczogYWxpYXMsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2xpbmUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyguKSg/PVtcXHNcXFNdKS4qKD86XFxyXFxuP3xcXG4pPy8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHJlZml4Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXS8sXG5cdFx0XHRcdFx0YWxpYXM6IC9cXHcrLy5leGVjKG5hbWUpWzBdXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdH0pO1xuXG5cdC8vIG1ha2UgcHJlZml4ZXMgYXZhaWxhYmxlIHRvIERpZmYgcGx1Z2luXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShQcmlzbS5sYW5ndWFnZXMuZGlmZiwgJ1BSRUZJWEVTJywge1xuXHRcdHZhbHVlOiBQUkVGSVhFU1xuXHR9KTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgaWQgYW5kIGluZGV4LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2Vcblx0ICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpbmRleFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0UGxhY2Vob2xkZXIobGFuZ3VhZ2UsIGluZGV4KSB7XG5cdFx0cmV0dXJuICdfX18nICsgbGFuZ3VhZ2UudG9VcHBlckNhc2UoKSArIGluZGV4ICsgJ19fXyc7XG5cdH1cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyhQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10gPSB7fSwge1xuXHRcdGJ1aWxkUGxhY2Vob2xkZXJzOiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRva2VuaXplIGFsbCBpbmxpbmUgdGVtcGxhdGluZyBleHByZXNzaW9ucyBtYXRjaGluZyBgcGxhY2Vob2xkZXJQYXR0ZXJuYC5cblx0XHRcdCAqXG5cdFx0XHQgKiBJZiBgcmVwbGFjZUZpbHRlcmAgaXMgcHJvdmlkZWQsIG9ubHkgbWF0Y2hlcyBvZiBgcGxhY2Vob2xkZXJQYXR0ZXJuYCBmb3Igd2hpY2ggYHJlcGxhY2VGaWx0ZXJgIHJldHVybnNcblx0XHRcdCAqIGB0cnVlYCB3aWxsIGJlIHJlcGxhY2VkLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7b2JqZWN0fSBlbnYgVGhlIGVudmlyb25tZW50IG9mIHRoZSBgYmVmb3JlLXRva2VuaXplYCBob29rLlxuXHRcdFx0ICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIFRoZSBsYW5ndWFnZSBpZC5cblx0XHRcdCAqIEBwYXJhbSB7UmVnRXhwfSBwbGFjZWhvbGRlclBhdHRlcm4gVGhlIG1hdGNoZXMgb2YgdGhpcyBwYXR0ZXJuIHdpbGwgYmUgcmVwbGFjZWQgYnkgcGxhY2Vob2xkZXJzLlxuXHRcdFx0ICogQHBhcmFtIHsobWF0Y2g6IHN0cmluZykgPT4gYm9vbGVhbn0gW3JlcGxhY2VGaWx0ZXJdXG5cdFx0XHQgKi9cblx0XHRcdHZhbHVlOiBmdW5jdGlvbiAoZW52LCBsYW5ndWFnZSwgcGxhY2Vob2xkZXJQYXR0ZXJuLCByZXBsYWNlRmlsdGVyKSB7XG5cdFx0XHRcdGlmIChlbnYubGFuZ3VhZ2UgIT09IGxhbmd1YWdlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHRva2VuU3RhY2sgPSBlbnYudG9rZW5TdGFjayA9IFtdO1xuXG5cdFx0XHRcdGVudi5jb2RlID0gZW52LmNvZGUucmVwbGFjZShwbGFjZWhvbGRlclBhdHRlcm4sIGZ1bmN0aW9uIChtYXRjaCkge1xuXHRcdFx0XHRcdGlmICh0eXBlb2YgcmVwbGFjZUZpbHRlciA9PT0gJ2Z1bmN0aW9uJyAmJiAhcmVwbGFjZUZpbHRlcihtYXRjaCkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBtYXRjaDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmFyIGkgPSB0b2tlblN0YWNrLmxlbmd0aDtcblx0XHRcdFx0XHR2YXIgcGxhY2Vob2xkZXI7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBmb3IgZXhpc3Rpbmcgc3RyaW5nc1xuXHRcdFx0XHRcdHdoaWxlIChlbnYuY29kZS5pbmRleE9mKHBsYWNlaG9sZGVyID0gZ2V0UGxhY2Vob2xkZXIobGFuZ3VhZ2UsIGkpKSAhPT0gLTEpIHtcblx0XHRcdFx0XHRcdCsraTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBDcmVhdGUgYSBzcGFyc2UgYXJyYXlcblx0XHRcdFx0XHR0b2tlblN0YWNrW2ldID0gbWF0Y2g7XG5cblx0XHRcdFx0XHRyZXR1cm4gcGxhY2Vob2xkZXI7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIFN3aXRjaCB0aGUgZ3JhbW1hciB0byBtYXJrdXBcblx0XHRcdFx0ZW52LmdyYW1tYXIgPSBQcmlzbS5sYW5ndWFnZXMubWFya3VwO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0dG9rZW5pemVQbGFjZWhvbGRlcnM6IHtcblx0XHRcdC8qKlxuXHRcdFx0ICogUmVwbGFjZSBwbGFjZWhvbGRlcnMgd2l0aCBwcm9wZXIgdG9rZW5zIGFmdGVyIHRva2VuaXppbmcuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtvYmplY3R9IGVudiBUaGUgZW52aXJvbm1lbnQgb2YgdGhlIGBhZnRlci10b2tlbml6ZWAgaG9vay5cblx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSBUaGUgbGFuZ3VhZ2UgaWQuXG5cdFx0XHQgKi9cblx0XHRcdHZhbHVlOiBmdW5jdGlvbiAoZW52LCBsYW5ndWFnZSkge1xuXHRcdFx0XHRpZiAoZW52Lmxhbmd1YWdlICE9PSBsYW5ndWFnZSB8fCAhZW52LnRva2VuU3RhY2spIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTd2l0Y2ggdGhlIGdyYW1tYXIgYmFja1xuXHRcdFx0XHRlbnYuZ3JhbW1hciA9IFByaXNtLmxhbmd1YWdlc1tsYW5ndWFnZV07XG5cblx0XHRcdFx0dmFyIGogPSAwO1xuXHRcdFx0XHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKGVudi50b2tlblN0YWNrKTtcblxuXHRcdFx0XHRmdW5jdGlvbiB3YWxrVG9rZW5zKHRva2Vucykge1xuXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHQvLyBhbGwgcGxhY2Vob2xkZXJzIGFyZSByZXBsYWNlZCBhbHJlYWR5XG5cdFx0XHRcdFx0XHRpZiAoaiA+PSBrZXlzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0dmFyIHRva2VuID0gdG9rZW5zW2ldO1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycgfHwgKHRva2VuLmNvbnRlbnQgJiYgdHlwZW9mIHRva2VuLmNvbnRlbnQgPT09ICdzdHJpbmcnKSkge1xuXHRcdFx0XHRcdFx0XHR2YXIgayA9IGtleXNbal07XG5cdFx0XHRcdFx0XHRcdHZhciB0ID0gZW52LnRva2VuU3RhY2tba107XG5cdFx0XHRcdFx0XHRcdHZhciBzID0gdHlwZW9mIHRva2VuID09PSAnc3RyaW5nJyA/IHRva2VuIDogdG9rZW4uY29udGVudDtcblx0XHRcdFx0XHRcdFx0dmFyIHBsYWNlaG9sZGVyID0gZ2V0UGxhY2Vob2xkZXIobGFuZ3VhZ2UsIGspO1xuXG5cdFx0XHRcdFx0XHRcdHZhciBpbmRleCA9IHMuaW5kZXhPZihwbGFjZWhvbGRlcik7XG5cdFx0XHRcdFx0XHRcdGlmIChpbmRleCA+IC0xKSB7XG5cdFx0XHRcdFx0XHRcdFx0KytqO1xuXG5cdFx0XHRcdFx0XHRcdFx0dmFyIGJlZm9yZSA9IHMuc3Vic3RyaW5nKDAsIGluZGV4KTtcblx0XHRcdFx0XHRcdFx0XHR2YXIgbWlkZGxlID0gbmV3IFByaXNtLlRva2VuKGxhbmd1YWdlLCBQcmlzbS50b2tlbml6ZSh0LCBlbnYuZ3JhbW1hciksICdsYW5ndWFnZS0nICsgbGFuZ3VhZ2UsIHQpO1xuXHRcdFx0XHRcdFx0XHRcdHZhciBhZnRlciA9IHMuc3Vic3RyaW5nKGluZGV4ICsgcGxhY2Vob2xkZXIubGVuZ3RoKTtcblxuXHRcdFx0XHRcdFx0XHRcdHZhciByZXBsYWNlbWVudCA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChiZWZvcmUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJlcGxhY2VtZW50LnB1c2guYXBwbHkocmVwbGFjZW1lbnQsIHdhbGtUb2tlbnMoW2JlZm9yZV0pKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cmVwbGFjZW1lbnQucHVzaChtaWRkbGUpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChhZnRlcikge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVwbGFjZW1lbnQucHVzaC5hcHBseShyZXBsYWNlbWVudCwgd2Fsa1Rva2VucyhbYWZ0ZXJdKSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRva2Vucy5zcGxpY2UuYXBwbHkodG9rZW5zLCBbaSwgMV0uY29uY2F0KHJlcGxhY2VtZW50KSk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRva2VuLmNvbnRlbnQgPSByZXBsYWNlbWVudDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodG9rZW4uY29udGVudCAvKiAmJiB0eXBlb2YgdG9rZW4uY29udGVudCAhPT0gJ3N0cmluZycgKi8pIHtcblx0XHRcdFx0XHRcdFx0d2Fsa1Rva2Vucyh0b2tlbi5jb250ZW50KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdG9rZW5zO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0d2Fsa1Rva2VucyhlbnYudG9rZW5zKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cbi8vIERqYW5nby9KaW5qYTIgc3ludGF4IGRlZmluaXRpb24gZm9yIFByaXNtLmpzIDxodHRwOi8vcHJpc21qcy5jb20+IHN5bnRheCBoaWdobGlnaHRlci5cbi8vIE1vc3RseSBpdCB3b3JrcyBPSyBidXQgY2FuIHBhaW50IGNvZGUgaW5jb3JyZWN0bHkgb24gY29tcGxleCBodG1sL3RlbXBsYXRlIHRhZyBjb21iaW5hdGlvbnMuXG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRQcmlzbS5sYW5ndWFnZXMuZGphbmdvID0ge1xuXHRcdCdjb21tZW50JzogL15cXHsjW1xcc1xcU10qPyNcXH0kLyxcblx0XHQndGFnJzoge1xuXHRcdFx0cGF0dGVybjogLyheXFx7JVsrLV0/XFxzKilcXHcrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0cGF0dGVybjogL15cXHtbeyVdWystXT98WystXT9bfSVdXFx9JC8sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXCJ8JykoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2ZpbHRlcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXFx8KVxcdysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblx0XHQndGVzdCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxiaXNcXHMrKD86bm90XFxzKyk/KSg/IW5vdFxcYilcXHcrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cdFx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdysoPz1cXHMqXFwoKS9pLFxuXHRcdCdrZXl3b3JkJzogL1xcYig/OmFuZHxhc3xieXxlbHNlfGZvcnxpZnxpbXBvcnR8aW58aXN8bG9vcHxub3R8b3J8cmVjdXJzaXZlfHdpdGh8d2l0aG91dClcXGIvLFxuXHRcdCdvcGVyYXRvcic6IC9bLSslPV09P3whPXxcXCpcXCo/PT98XFwvXFwvPz0/fDxbPD0+XT98Pls9Pl0/fFsmfF5+XS8sXG5cdFx0J251bWJlcic6IC9cXGJcXGQrKD86XFwuXFxkKyk/XFxiLyxcblx0XHQnYm9vbGVhbic6IC9bRmZdYWxzZXxbTm5db25lfFtUdF1ydWUvLFxuXHRcdCd2YXJpYWJsZSc6IC9cXGJcXHcrXFxiLyxcblx0XHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXSgpLC46O10vXG5cdH07XG5cblxuXHR2YXIgcGF0dGVybiA9IC9cXHtcXHtbXFxzXFxTXSo/XFx9XFx9fFxceyVbXFxzXFxTXSo/JVxcfXxcXHsjW1xcc1xcU10qPyNcXH0vZztcblx0dmFyIG1hcmt1cFRlbXBsYXRpbmcgPSBQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ107XG5cblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0bWFya3VwVGVtcGxhdGluZy5idWlsZFBsYWNlaG9sZGVycyhlbnYsICdkamFuZ28nLCBwYXR0ZXJuKTtcblx0fSk7XG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0bWFya3VwVGVtcGxhdGluZy50b2tlbml6ZVBsYWNlaG9sZGVycyhlbnYsICdkamFuZ28nKTtcblx0fSk7XG5cblx0Ly8gQWRkIGFuIEppbmphMiBhbGlhc1xuXHRQcmlzbS5sYW5ndWFnZXMuamluamEyID0gUHJpc20ubGFuZ3VhZ2VzLmRqYW5nbztcblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0bWFya3VwVGVtcGxhdGluZy5idWlsZFBsYWNlaG9sZGVycyhlbnYsICdqaW5qYTInLCBwYXR0ZXJuKTtcblx0fSk7XG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0bWFya3VwVGVtcGxhdGluZy50b2tlbml6ZVBsYWNlaG9sZGVycyhlbnYsICdqaW5qYTInKTtcblx0fSk7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzWydkbnMtem9uZS1maWxlJ10gPSB7XG5cdCdjb21tZW50JzogLzsuKi8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86XFxcXC58W15cIlxcXFxcXHJcXG5dKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCd2YXJpYWJsZSc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF5cXCRPUklHSU5bIFxcdF0rKVxcUysvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxzKUAoPz1cXHN8JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHR9XG5cdF0sXG5cdCdrZXl3b3JkJzogL15cXCQoPzpJTkNMVURFfE9SSUdJTnxUVEwpKD89XFxzfCQpL20sXG5cdCdjbGFzcyc6IHtcblx0XHQvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTAzNSNwYWdlLTEzXG5cdFx0cGF0dGVybjogLyhefFxccykoPzpDSHxDU3xIU3xJTikoPz1cXHN8JCkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQndHlwZSc6IHtcblx0XHQvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX0ROU19yZWNvcmRfdHlwZXNcblx0XHRwYXR0ZXJuOiAvKF58XFxzKSg/OkF8QTZ8QUFBQXxBRlNEQnxBUEx8QVRNQXxDQUF8Q0ROU0tFWXxDRFN8Q0VSVHxDTkFNRXxESENJRHxETFZ8RE5BTUV8RE5TS0VZfERTfEVJRHxHSUR8R1BPU3xISU5GT3xISVB8SVBTRUNLRVl8SVNETnxLRVl8S1h8TE9DfE1BSUxBfE1BSUxCfE1CfE1EfE1GfE1HfE1JTkZPfE1SfE1YfE5BUFRSfE5CfE5CU1RBVHxOSU1MT0N8TklORk98TlN8TlNBUHxOU0FQLVBUUnxOU0VDfE5TRUMzfE5TRUMzUEFSQU18TlVMTHxOWFR8T1BFTlBHUEtFWXxQVFJ8UFh8UktFWXxSUHxSUlNJR3xSVHxTSUd8U0lOS3xTTUlNRUF8U09BfFNQRnxTUlZ8U1NIRlB8VEF8VEtFWXxUTFNBfFRTSUd8VFhUfFVJRHxVSU5GT3xVTlNQRUN8VVJJfFdLU3xYMjUpKD89XFxzfCQpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J3B1bmN0dWF0aW9uJzogL1soKV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXNbJ2Rucy16b25lJ10gPSBQcmlzbS5sYW5ndWFnZXNbJ2Rucy16b25lLWZpbGUnXTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8vIE1hbnkgb2YgdGhlIGZvbGxvd2luZyByZWdleGVzIHdpbGwgY29udGFpbiBuZWdhdGVkIGxvb2thaGVhZHMgbGlrZSBgWyBcXHRdKyg/IVsgXFx0XSlgLiBUaGlzIGlzIGEgdHJpY2sgdG8gZW5zdXJlXG5cdC8vIHRoYXQgcXVhbnRpZmllcnMgYmVoYXZlICphdG9taWNhbGx5Ki4gQXRvbWljIHF1YW50aWZpZXJzIGFyZSBuZWNlc3NhcnkgdG8gcHJldmVudCBleHBvbmVudGlhbCBiYWNrdHJhY2tpbmcuXG5cblx0dmFyIHNwYWNlQWZ0ZXJCYWNrU2xhc2ggPSAvXFxcXFtcXHJcXG5dKD86XFxzfFxcXFxbXFxyXFxuXXwjLiooPyEuKSkqKD8hW1xccyNdfFxcXFxbXFxyXFxuXSkvLnNvdXJjZTtcblx0Ly8gQXQgbGVhc3Qgb25lIHNwYWNlLCBjb21tZW50LCBvciBsaW5lIGJyZWFrXG5cdHZhciBzcGFjZSA9IC8oPzpbIFxcdF0rKD8hWyBcXHRdKSg/OjxTUF9CUz4pP3w8U1BfQlM+KS8uc291cmNlXG5cdFx0LnJlcGxhY2UoLzxTUF9CUz4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gc3BhY2VBZnRlckJhY2tTbGFzaDsgfSk7XG5cblx0dmFyIHN0cmluZyA9IC9cIig/OlteXCJcXFxcXFxyXFxuXXxcXFxcKD86XFxyXFxufFtcXHNcXFNdKSkqXCJ8Jyg/OlteJ1xcXFxcXHJcXG5dfFxcXFwoPzpcXHJcXG58W1xcc1xcU10pKSonLy5zb3VyY2U7XG5cdHZhciBvcHRpb24gPSAvLS1bXFx3LV0rPSg/OjxTVFI+fCg/IVtcIiddKSg/OlteXFxzXFxcXF18XFxcXC4pKykvLnNvdXJjZS5yZXBsYWNlKC88U1RSPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBzdHJpbmc7IH0pO1xuXG5cdHZhciBzdHJpbmdSdWxlID0ge1xuXHRcdHBhdHRlcm46IFJlZ0V4cChzdHJpbmcpLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9O1xuXHR2YXIgY29tbWVudFJ1bGUgPSB7XG5cdFx0cGF0dGVybjogLyheWyBcXHRdKikjLiovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnc1xuXHQgKiBAcmV0dXJucyB7UmVnRXhwfVxuXHQgKi9cblx0ZnVuY3Rpb24gcmUoc291cmNlLCBmbGFncykge1xuXHRcdHNvdXJjZSA9IHNvdXJjZVxuXHRcdFx0LnJlcGxhY2UoLzxPUFQ+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9wdGlvbjsgfSlcblx0XHRcdC5yZXBsYWNlKC88U1A+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNwYWNlOyB9KTtcblxuXHRcdHJldHVybiBSZWdFeHAoc291cmNlLCBmbGFncyk7XG5cdH1cblxuXHRQcmlzbS5sYW5ndWFnZXMuZG9ja2VyID0ge1xuXHRcdCdpbnN0cnVjdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopKD86QUREfEFSR3xDTUR8Q09QWXxFTlRSWVBPSU5UfEVOVnxFWFBPU0V8RlJPTXxIRUFMVEhDSEVDS3xMQUJFTHxNQUlOVEFJTkVSfE9OQlVJTER8UlVOfFNIRUxMfFNUT1BTSUdOQUx8VVNFUnxWT0xVTUV8V09SS0RJUikoPz1cXHMpKD86XFxcXC58W15cXHJcXG5cXFxcXSkqKD86XFxcXCQoPzpcXHN8Iy4qJCkqKD8hW1xccyNdKSg/OlxcXFwufFteXFxyXFxuXFxcXF0pKikqL2ltLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnb3B0aW9ucyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiByZSgvKF4oPzpPTkJVSUxEPFNQPik/XFx3KzxTUD4pPE9QVD4oPzo8U1A+PE9QVD4pKi8uc291cmNlLCAnaScpLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3Byb3BlcnR5Jzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKS0tW1xcdy1dKy8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQnc3RyaW5nJzogW1xuXHRcdFx0XHRcdFx0XHRzdHJpbmdSdWxlLFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyg9KSg/IVtcIiddKSg/OlteXFxzXFxcXF18XFxcXC4pKy8sXG5cdFx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0J29wZXJhdG9yJzogL1xcXFwkL20sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvPS9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdrZXl3b3JkJzogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9yZWZlcmVuY2UvYnVpbGRlci8jaGVhbHRoY2hlY2tcblx0XHRcdFx0XHRcdHBhdHRlcm46IHJlKC8oXig/Ok9OQlVJTEQ8U1A+KT9IRUFMVEhDSEVDSzxTUD4oPzo8T1BUPjxTUD4pKikoPzpDTUR8Tk9ORSlcXGIvLnNvdXJjZSwgJ2knKSxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9yZWZlcmVuY2UvYnVpbGRlci8jZnJvbVxuXHRcdFx0XHRcdFx0cGF0dGVybjogcmUoLyheKD86T05CVUlMRDxTUD4pP0ZST008U1A+KD86PE9QVD48U1A+KSooPyEtLSlbXiBcXHRcXFxcXSs8U1A+KUFTLy5zb3VyY2UsICdpJyksXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQvLyBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL2J1aWxkZXIvI29uYnVpbGRcblx0XHRcdFx0XHRcdHBhdHRlcm46IHJlKC8oXk9OQlVJTEQ8U1A+KVxcdysvLnNvdXJjZSwgJ2knKSxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eXFx3Ky8sXG5cdFx0XHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdF0sXG5cdFx0XHRcdCdjb21tZW50JzogY29tbWVudFJ1bGUsXG5cdFx0XHRcdCdzdHJpbmcnOiBzdHJpbmdSdWxlLFxuXHRcdFx0XHQndmFyaWFibGUnOiAvXFwkKD86XFx3K3xcXHtbXnt9XCInXFxcXF0qXFx9KS8sXG5cdFx0XHRcdCdvcGVyYXRvcic6IC9cXFxcJC9tXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnY29tbWVudCc6IGNvbW1lbnRSdWxlXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmRvY2tlcmZpbGUgPSBQcmlzbS5sYW5ndWFnZXMuZG9ja2VyO1xuXG59KFByaXNtKSk7XG5cbi8vIGh0dHBzOi8vd3d3LmdyYXBodml6Lm9yZy9kb2MvaW5mby9sYW5nLmh0bWxcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBJRCA9ICcoPzonICsgW1xuXHRcdC8vIGFuIGlkZW50aWZpZXJcblx0XHQvW2EtekEtWl9cXHg4MC1cXHVGRkZGXVtcXHdcXHg4MC1cXHVGRkZGXSovLnNvdXJjZSxcblx0XHQvLyBhIG51bWJlclxuXHRcdC8tPyg/OlxcLlxcZCt8XFxkKyg/OlxcLlxcZCopPykvLnNvdXJjZSxcblx0XHQvLyBhIGRvdWJsZS1xdW90ZWQgc3RyaW5nXG5cdFx0L1wiW15cIlxcXFxdKig/OlxcXFxbXFxzXFxTXVteXCJcXFxcXSopKlwiLy5zb3VyY2UsXG5cdFx0Ly8gSFRNTC1saWtlIHN0cmluZ1xuXHRcdC88KD86W148Pl18KD8hPCEtLSk8KD86W148PlwiJ118XCJbXlwiXSpcInwnW14nXSonKSs+fDwhLS0oPzpbXi1dfC0oPyEtPikpKi0tPikqPi8uc291cmNlXG5cdF0uam9pbignfCcpICsgJyknO1xuXG5cdHZhciBJREluc2lkZSA9IHtcblx0XHQnbWFya3VwJzoge1xuXHRcdFx0cGF0dGVybjogLyhePClbXFxzXFxTXSsoPz0+JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiBbJ2xhbmd1YWdlLW1hcmt1cCcsICdsYW5ndWFnZS1odG1sJywgJ2xhbmd1YWdlLXhtbCddLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMubWFya3VwXG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnc1xuXHQgKiBAcmV0dXJucyB7UmVnRXhwfVxuXHQgKi9cblx0ZnVuY3Rpb24gd2l0aElEKHNvdXJjZSwgZmxhZ3MpIHtcblx0XHRyZXR1cm4gUmVnRXhwKHNvdXJjZS5yZXBsYWNlKC88SUQ+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIElEOyB9KSwgZmxhZ3MpO1xuXHR9XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmRvdCA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvfF4jLiovbSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2dyYXBoLW5hbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiB3aXRoSUQoLyhcXGIoPzpkaWdyYXBofGdyYXBofHN1YmdyYXBoKVsgXFx0XFxyXFxuXSspPElEPi8uc291cmNlLCAnaScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZScsXG5cdFx0XHRpbnNpZGU6IElESW5zaWRlXG5cdFx0fSxcblx0XHQnYXR0ci12YWx1ZSc6IHtcblx0XHRcdHBhdHRlcm46IHdpdGhJRCgvKD1bIFxcdFxcclxcbl0qKTxJRD4vLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBJREluc2lkZVxuXHRcdH0sXG5cdFx0J2F0dHItbmFtZSc6IHtcblx0XHRcdHBhdHRlcm46IHdpdGhJRCgvKFtcXFs7LCBcXHRcXHJcXG5dKTxJRD4oPz1bIFxcdFxcclxcbl0qPSkvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBJREluc2lkZVxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86ZGlncmFwaHxlZGdlfGdyYXBofG5vZGV8c3RyaWN0fHN1YmdyYXBoKVxcYi9pLFxuXHRcdCdjb21wYXNzLXBvaW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyg6WyBcXHRcXHJcXG5dKikoPzpbZXdjX118W25zXVtld10/KSg/IVtcXHdcXHg4MC1cXHVGRkZGXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnYnVpbHRpbidcblx0XHR9LFxuXHRcdCdub2RlJzoge1xuXHRcdFx0cGF0dGVybjogd2l0aElEKC8oXnxbXi0uXFx3XFx4ODAtXFx1RkZGRlxcXFxdKTxJRD4vLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBJREluc2lkZVxuXHRcdH0sXG5cdFx0J29wZXJhdG9yJzogL1s9Ol18LVstPl0vLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxde307LF0vXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmd2ID0gUHJpc20ubGFuZ3VhZ2VzLmRvdDtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuZWJuZiA9IHtcblx0J2NvbW1lbnQnOiAvXFwoXFwqW1xcc1xcU10qP1xcKlxcKS8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiW15cIlxcclxcbl0qXCJ8J1teJ1xcclxcbl0qJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzcGVjaWFsJzoge1xuXHRcdHBhdHRlcm46IC9cXD9bXj9cXHJcXG5dKlxcPy8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0fSxcblxuXHQnZGVmaW5pdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvXihbXFx0IF0qKVthLXpdXFx3Kig/OlsgXFx0XStbYS16XVxcdyopKig/PVxccyo9KS9pbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiBbJ3J1bGUnLCAna2V5d29yZCddXG5cdH0sXG5cdCdydWxlJzogL1xcYlthLXpdXFx3Kig/OlsgXFx0XStbYS16XVxcdyopKlxcYi9pLFxuXG5cdCdwdW5jdHVhdGlvbic6IC9cXChbOi9dfFs6L11cXCl8Wy4sOygpW1xcXXt9XS8sXG5cdCdvcGVyYXRvcic6IC9bLT18Ki8hXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5lZGl0b3Jjb25maWcgPSB7XG5cdC8vIGh0dHBzOi8vZWRpdG9yY29uZmlnLXNwZWNpZmljYXRpb24ucmVhZHRoZWRvY3MuaW9cblx0J2NvbW1lbnQnOiAvWzsjXS4qLyxcblx0J3NlY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLyheWyBcXHRdKilcXFsuK1xcXS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdzZWxlY3RvcicsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncmVnZXgnOiAvXFxcXFxcXFxbXFxbXFxde30sIT8uKl0vLCAvLyBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIHdpdGggJ1xcXFwnXG5cdFx0XHQnb3BlcmF0b3InOiAvWyE/XXxcXC5cXC58XFwqezEsMn0vLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF17fSxdL1xuXHRcdH1cblx0fSxcblx0J2tleSc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKVteXFxzPV0rKD89WyBcXHRdKj0pL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2F0dHItbmFtZSdcblx0fSxcblx0J3ZhbHVlJzoge1xuXHRcdHBhdHRlcm46IC89LiovLFxuXHRcdGFsaWFzOiAnYXR0ci12YWx1ZScsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXj0vXG5cdFx0fVxuXHR9XG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuZWlmZmVsID0ge1xuXHQnY29tbWVudCc6IC8tLS4qLyxcblx0J3N0cmluZyc6IFtcblx0XHQvLyBBbGlnbmVkLXZlcmJhdGltLXN0cmluZ3Ncblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoW15bXSopXFxbW1xcc1xcU10qP1xcXVxcMVwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0Ly8gTm9uLWFsaWduZWQtdmVyYmF0aW0tc3RyaW5nc1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cIihbXntdKilcXHtbXFxzXFxTXSo/XFx9XFwxXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQvLyBTaW5nbGUtbGluZSBzdHJpbmdcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoPzolKD86KD8hXFxuKVxccykqXFxuXFxzKiV8JVxcU3xbXiVcIlxcclxcbl0pKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblx0Ly8gbm9ybWFsIGNoYXIgfCBzcGVjaWFsIGNoYXIgfCBjaGFyIGNvZGVcblx0J2NoYXInOiAvJyg/OiUufFteJSdcXHJcXG5dKSsnLyxcblx0J2tleXdvcmQnOiAvXFxiKD86YWNyb3NzfGFnZW50fGFsaWFzfGFsbHxhbmR8YXN8YXNzaWdufGF0dGFjaGVkfGF0dHJpYnV0ZXxjaGVja3xjbGFzc3xjb252ZXJ0fGNyZWF0ZXxDdXJyZW50fGRlYnVnfGRlZmVycmVkfGRldGFjaGFibGV8ZG98ZWxzZXxlbHNlaWZ8ZW5kfGVuc3VyZXxleHBhbmRlZHxleHBvcnR8ZXh0ZXJuYWx8ZmVhdHVyZXxmcm9tfGZyb3plbnxpZnxpbXBsaWVzfGluaGVyaXR8aW5zcGVjdHxpbnZhcmlhbnR8bGlrZXxsb2NhbHxsb29wfG5vdHxub3RlfG9ic29sZXRlfG9sZHxvbmNlfG9yfFByZWN1cnNvcnxyZWRlZmluZXxyZW5hbWV8cmVxdWlyZXxyZXNjdWV8UmVzdWx0fHJldHJ5fHNlbGVjdHxzZXBhcmF0ZXxzb21lfHRoZW58dW5kZWZpbmV8dW50aWx8dmFyaWFudHxWb2lkfHdoZW58eG9yKVxcYi9pLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpGYWxzZXxUcnVlKVxcYi9pLFxuXHQvLyBDb252ZW50aW9uOiBjbGFzcy1uYW1lcyBhcmUgYWx3YXlzIGFsbCB1cHBlci1jYXNlIGNoYXJhY3RlcnNcblx0J2NsYXNzLW5hbWUnOiAvXFxiW0EtWl1bXFxkQS1aX10qXFxiLyxcblx0J251bWJlcic6IFtcblx0XHQvLyBoZXhhIHwgb2N0YWwgfCBiaW5cblx0XHQvXFxiMFt4Y2JdW1xcZGEtZl0oPzpfKltcXGRhLWZdKSpcXGIvaSxcblx0XHQvLyBEZWNpbWFsXG5cdFx0Lyg/OlxcYlxcZCg/Ol8qXFxkKSopP1xcLig/Oig/OlxcZCg/Ol8qXFxkKSopP2VbKy1dPyk/XFxkKD86XypcXGQpKlxcYnxcXGJcXGQoPzpfKlxcZCkqXFxiXFwuPy9pXG5cdF0sXG5cdCdwdW5jdHVhdGlvbic6IC86PXw8PHw+PnxcXChcXHx8XFx8XFwpfC0+fFxcLig/PVxcdyl8W3t9W1xcXTsoKSw6P10vLFxuXHQnb3BlcmF0b3InOiAvXFxcXFxcXFx8XFx8XFwuXFwuXFx8fFxcLlxcLnxcXC9bflxcLz1dP3xbPjxdPT98Wy0rKl49fl0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmVqcyA9IHtcblx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0cGF0dGVybjogL148JVstXz1dP3xbLV9dPyU+JC8sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J2NvbW1lbnQnOiAvXiNbXFxzXFxTXSovLFxuXHRcdCdsYW5ndWFnZS1qYXZhc2NyaXB0Jzoge1xuXHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdHZhciBlanNQYXR0ZXJuID0gLzwlKD8hJSlbXFxzXFxTXSs/JT4vZztcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10uYnVpbGRQbGFjZWhvbGRlcnMoZW52LCAnZWpzJywgZWpzUGF0dGVybik7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLnRva2VuaXplUGxhY2Vob2xkZXJzKGVudiwgJ2VqcycpO1xuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuZXRhID0gUHJpc20ubGFuZ3VhZ2VzLmVqcztcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuZWxpeGlyID0ge1xuXHQnZG9jJzoge1xuXHRcdHBhdHRlcm46IC9AKD86ZG9jfG1vZHVsZWRvYylcXHMrKD86KFwiXCJcInwnJycpW1xcc1xcU10qP1xcMXwoXCJ8JykoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXwoPyFcXDIpW15cXFxcXFxyXFxuXSkqXFwyKS8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnYXR0cmlidXRlJzogL15AXFx3Ky8sXG5cdFx0XHQnc3RyaW5nJzogL1snXCJdW1xcc1xcU10rL1xuXHRcdH1cblx0fSxcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyMuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdC8vIH5yXCJcIlwiZm9vXCJcIlwiIChtdWx0aS1saW5lKSwgfnInJydmb28nJycgKG11bHRpLWxpbmUpLCB+ci9mb28vLCB+cnxmb298LCB+clwiZm9vXCIsIH5yJ2ZvbycsIH5yKGZvbyksIH5yW2Zvb10sIH5ye2Zvb30sIH5yPGZvbz5cblx0J3JlZ2V4Jzoge1xuXHRcdHBhdHRlcm46IC9+W3JSXSg/OihcIlwiXCJ8JycnKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDEpW15cXFxcXSkrXFwxfChbXFwvfFwiJ10pKD86XFxcXC58KD8hXFwyKVteXFxcXFxcclxcbl0pK1xcMnxcXCgoPzpcXFxcLnxbXlxcXFwpXFxyXFxuXSkrXFwpfFxcWyg/OlxcXFwufFteXFxcXFxcXVxcclxcbl0pK1xcXXxcXHsoPzpcXFxcLnxbXlxcXFx9XFxyXFxuXSkrXFx9fDwoPzpcXFxcLnxbXlxcXFw+XFxyXFxuXSkrPilbdWlzbXhmcl0qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IFtcblx0XHR7XG5cdFx0XHQvLyB+c1wiXCJcImZvb1wiXCJcIiAobXVsdGktbGluZSksIH5zJycnZm9vJycnIChtdWx0aS1saW5lKSwgfnMvZm9vLywgfnN8Zm9vfCwgfnNcImZvb1wiLCB+cydmb28nLCB+cyhmb28pLCB+c1tmb29dLCB+c3tmb299ICh3aXRoIGludGVycG9sYXRpb24gY2FyZSksIH5zPGZvbz5cblx0XHRcdHBhdHRlcm46IC9+W2NDc1N3V10oPzooXCJcIlwifCcnJykoPzpcXFxcW1xcc1xcU118KD8hXFwxKVteXFxcXF0pK1xcMXwoW1xcL3xcIiddKSg/OlxcXFwufCg/IVxcMilbXlxcXFxcXHJcXG5dKStcXDJ8XFwoKD86XFxcXC58W15cXFxcKVxcclxcbl0pK1xcKXxcXFsoPzpcXFxcLnxbXlxcXFxcXF1cXHJcXG5dKStcXF18XFx7KD86XFxcXC58I1xce1tefV0rXFx9fCMoPyFcXHspfFteI1xcXFx9XFxyXFxuXSkrXFx9fDwoPzpcXFxcLnxbXlxcXFw+XFxyXFxuXSkrPilbY3NhXT8vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdC8vIFNlZSBpbnRlcnBvbGF0aW9uIGJlbG93XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFwiXCJcInwnJycpW1xcc1xcU10qP1xcMS8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0Ly8gU2VlIGludGVycG9sYXRpb24gYmVsb3dcblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIE11bHRpLWxpbmUgc3RyaW5ncyBhcmUgYWxsb3dlZFxuXHRcdFx0cGF0dGVybjogLyhcInwnKSg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdC8vIFNlZSBpbnRlcnBvbGF0aW9uIGJlbG93XG5cdFx0XHR9XG5cdFx0fVxuXHRdLFxuXHQnYXRvbSc6IHtcblx0XHQvLyBMb29rLWJlaGluZCBwcmV2ZW50cyBiYWQgaGlnaGxpZ2h0aW5nIG9mIHRoZSA6OiBvcGVyYXRvclxuXHRcdHBhdHRlcm46IC8oXnxbXjpdKTpcXHcrLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHR9LFxuXHQnbW9kdWxlJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbQS1aXVxcdypcXGIvLFxuXHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0fSxcblx0Ly8gTG9vay1haGVhZCBwcmV2ZW50cyBiYWQgaGlnaGxpZ2h0aW5nIG9mIHRoZSA6OiBvcGVyYXRvclxuXHQnYXR0ci1uYW1lJzogL1xcYlxcdytcXD8/Oig/ITopLyxcblx0J2FyZ3VtZW50Jzoge1xuXHRcdC8vIExvb2stYmVoaW5kIHByZXZlbnRzIGJhZCBoaWdobGlnaHRpbmcgb2YgdGhlICYmIG9wZXJhdG9yXG5cdFx0cGF0dGVybjogLyhefFteJl0pJlxcZCsvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fSxcblx0J2F0dHJpYnV0ZSc6IHtcblx0XHRwYXR0ZXJuOiAvQFxcdysvLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH0sXG5cdCdmdW5jdGlvbic6IC9cXGJbX2EtekEtWl1cXHcqWz8hXT8oPzooPz1cXHMqKD86XFwuXFxzKik/XFwoKXwoPz1cXC9cXGQpKS8sXG5cdCdudW1iZXInOiAvXFxiKD86MFtib3hdW2EtZlxcZF9dK3xcXGRbXFxkX10qKSg/OlxcLltcXGRfXSspPyg/OmVbKy1dP1tcXGRfXSspP1xcYi9pLFxuXHQna2V5d29yZCc6IC9cXGIoPzphZnRlcnxhbGlhc3xhbmR8Y2FzZXxjYXRjaHxjb25kfGRlZig/OmNhbGxiYWNrfGRlbGVnYXRlfGV4Y2VwdGlvbnxpbXBsfG1hY3JvfG1vZHVsZXxufG5wfHB8cHJvdG9jb2x8c3RydWN0KT98ZG98ZWxzZXxlbmR8Zm58Zm9yfGlmfGltcG9ydHxub3R8b3J8cXVvdGV8cmFpc2V8cmVxdWlyZXxyZXNjdWV8dHJ5fHVubGVzc3x1bnF1b3RlfHVzZXx3aGVuKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfG5pbHx0cnVlKVxcYi8sXG5cdCdvcGVyYXRvcic6IFtcblx0XHQvXFxiaW5cXGJ8JiY/fFxcfFt8Pl0/fFxcXFxcXFxcfDo6fFxcLlxcLlxcLj98XFwrXFwrP3wtWy0+XT98PFstPT5dfD49fCE9PT98XFxCIXw9KD86PT0/fFs+fl0pP3xbKlxcL15dLyxcblx0XHR7XG5cdFx0XHQvLyBXZSBkb24ndCB3YW50IHRvIG1hdGNoIDw8XG5cdFx0XHRwYXR0ZXJuOiAvKFtePF0pPCg/ITwpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIFdlIGRvbid0IHdhbnQgdG8gbWF0Y2ggPj5cblx0XHRcdHBhdHRlcm46IC8oW14+XSk+KD8hPikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J3B1bmN0dWF0aW9uJzogLzw8fD4+fFsuLCVcXFtcXF17fSgpXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5lbGl4aXIuc3RyaW5nLmZvckVhY2goZnVuY3Rpb24gKG8pIHtcblx0by5pbnNpZGUgPSB7XG5cdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvI1xce1tefV0rXFx9Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eI1xce3xcXH0kLyxcblx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRyZXN0OiBQcmlzbS5sYW5ndWFnZXMuZWxpeGlyXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5lbG0gPSB7XG5cdCdjb21tZW50JzogLy0tLip8XFx7LVtcXHNcXFNdKj8tXFx9Lyxcblx0J2NoYXInOiB7XG5cdFx0cGF0dGVybjogLycoPzpbXlxcXFwnXFxyXFxuXXxcXFxcKD86W2FiZm5ydHZcXFxcJ118XFxkK3x4WzAtOWEtZkEtRl0rfHVcXHtbMC05YS1mQS1GXStcXH0pKScvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzogW1xuXHRcdHtcblx0XHRcdC8vIE11bHRpbGluZSBzdHJpbmdzIGFyZSB3cmFwcGVkIGluIHRyaXBsZSBcIi4gUXVvdGVzIG1heSBhcHBlYXIgdW5lc2NhcGVkLlxuXHRcdFx0cGF0dGVybjogL1wiXCJcIltcXHNcXFNdKj9cIlwiXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoPzpbXlxcXFxcIlxcclxcbl18XFxcXC4pKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J2ltcG9ydC1zdGF0ZW1lbnQnOiB7XG5cdFx0Ly8gVGhlIGltcG9ydGVkIG9yIGhpZGRlbiBuYW1lcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoaXMgaW1wb3J0XG5cdFx0Ly8gc3RhdGVtZW50LiBUaGlzIGlzIGJlY2F1c2Ugd2Ugd2FudCB0byBoaWdobGlnaHQgdGhvc2UgZXhhY3RseSBsaWtlXG5cdFx0Ly8gd2UgZG8gZm9yIHRoZSBuYW1lcyBpbiB0aGUgcHJvZ3JhbS5cblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKWltcG9ydFxccytbQS1aXVxcdyooPzpcXC5bQS1aXVxcdyopKig/Olxccythc1xccysoPzpbQS1aXVxcdyopKD86XFwuW0EtWl1cXHcqKSopPyg/OlxccytleHBvc2luZ1xccyspPy9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQna2V5d29yZCc6IC9cXGIoPzphc3xleHBvc2luZ3xpbXBvcnQpXFxiL1xuXHRcdH1cblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YWxpYXN8YXN8Y2FzZXxlbHNlfGV4cG9zaW5nfGlmfGlufGluZml4bHxpbmZpeHJ8bGV0fG1vZHVsZXxvZnx0aGVufHR5cGUpXFxiLyxcblx0Ly8gVGhlc2UgYXJlIGJ1aWx0aW4gdmFyaWFibGVzIG9ubHkuIENvbnN0cnVjdG9ycyBhcmUgaGlnaGxpZ2h0ZWQgbGF0ZXIgYXMgYSBjb25zdGFudC5cblx0J2J1aWx0aW4nOiAvXFxiKD86YWJzfGFjb3N8YWx3YXlzfGFzaW58YXRhbnxhdGFuMnxjZWlsaW5nfGNsYW1wfGNvbXBhcmV8Y29zfGN1cnJ5fGRlZ3JlZXN8ZXxmbGlwfGZsb29yfGZyb21Qb2xhcnxpZGVudGl0eXxpc0luZmluaXRlfGlzTmFOfGxvZ0Jhc2V8bWF4fG1pbnxuZWdhdGV8bmV2ZXJ8bm90fHBpfHJhZGlhbnN8cmVtfHJvdW5kfHNpbnxzcXJ0fHRhbnx0b0Zsb2F0fHRvUG9sYXJ8dG9TdHJpbmd8dHJ1bmNhdGV8dHVybnN8dW5jdXJyeXx4b3IpXFxiLyxcblx0Ly8gZGVjaW1hbCBpbnRlZ2VycyBhbmQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyB8IGhleGFkZWNpbWFsIGludGVnZXJzXG5cdCdudW1iZXInOiAvXFxiKD86XFxkKyg/OlxcLlxcZCspPyg/OmVbKy1dP1xcZCspP3wweFswLTlhLWZdKylcXGIvaSxcblx0Ly8gTW9zdCBvZiB0aGlzIGlzIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBtZWFuaW5nIG9mIGEgc2luZ2xlICcuJy5cblx0Ly8gSWYgaXQgc3RhbmRzIGFsb25lIGZyZWVseSwgaXQgaXMgdGhlIGZ1bmN0aW9uIGNvbXBvc2l0aW9uLlxuXHQvLyBJdCBtYXkgYWxzbyBiZSBhIHNlcGFyYXRvciBiZXR3ZWVuIGEgbW9kdWxlIG5hbWUgYW5kIGFuIGlkZW50aWZpZXIgPT4gbm9cblx0Ly8gb3BlcmF0b3IuIElmIGl0IGNvbWVzIHRvZ2V0aGVyIHdpdGggb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzIGl0IGlzIGFuXG5cdC8vIG9wZXJhdG9yIHRvby5cblx0Ly8gVmFsaWQgb3BlcmF0b3IgY2hhcmFjdGVycyBpbiAwLjE4OiArLS8qPS4kPD46JnxePyUjQH4hXG5cdC8vIFJlZjogaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9mb3J1bS8jIW1zZy9lbG0tZGV2LzBBSFNuRGRrU2tRL0UwU1ZVNzBKRVFBSlxuXHQnb3BlcmF0b3InOiAvXFxzXFwuXFxzfFsrXFwtLyo9LiQ8PjomfF4/JSNAfiFdezIsfXxbK1xcLS8qPSQ8PjomfF4/JSNAfiFdLyxcblx0Ly8gSW4gRWxtLCBuZWFybHkgZXZlcnl0aGluZyBpcyBhIHZhcmlhYmxlLCBkbyBub3QgaGlnaGxpZ2h0IHRoZXNlLlxuXHQnaHZhcmlhYmxlJzogL1xcYig/OltBLVpdXFx3KlxcLikqW2Etel1cXHcqXFxiLyxcblx0J2NvbnN0YW50JzogL1xcYig/OltBLVpdXFx3KlxcLikqW0EtWl1cXHcqXFxiLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF18KCksLjpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmx1YSA9IHtcblx0J2NvbW1lbnQnOiAvXiMhLit8LS0oPzpcXFsoPSopXFxbW1xcc1xcU10qP1xcXVxcMVxcXXwuKikvbSxcblx0Ly8gXFx6IG1heSBiZSB1c2VkIHRvIHNraXAgdGhlIGZvbGxvd2luZyBzcGFjZVxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oW1wiJ10pKD86KD8hXFwxKVteXFxcXFxcclxcbl18XFxcXHooPzpcXHJcXG58XFxzKXxcXFxcKD86XFxyXFxufFteel0pKSpcXDF8XFxbKD0qKVxcW1tcXHNcXFNdKj9cXF1cXDJcXF0vLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnbnVtYmVyJzogL1xcYjB4W2EtZlxcZF0rKD86XFwuW2EtZlxcZF0qKT8oPzpwWystXT9cXGQrKT9cXGJ8XFxiXFxkKyg/OlxcLlxcQnwoPzpcXC5cXGQqKT8oPzplWystXT9cXGQrKT9cXGIpfFxcQlxcLlxcZCsoPzplWystXT9cXGQrKT9cXGIvaSxcblx0J2tleXdvcmQnOiAvXFxiKD86YW5kfGJyZWFrfGRvfGVsc2V8ZWxzZWlmfGVuZHxmYWxzZXxmb3J8ZnVuY3Rpb258Z290b3xpZnxpbnxsb2NhbHxuaWx8bm90fG9yfHJlcGVhdHxyZXR1cm58dGhlbnx0cnVlfHVudGlsfHdoaWxlKVxcYi8sXG5cdCdmdW5jdGlvbic6IC8oPyFcXGQpXFx3Kyg/PVxccyooPzpbKHtdKSkvLFxuXHQnb3BlcmF0b3InOiBbXG5cdFx0L1stKyolXiZ8I118XFwvXFwvP3w8Wzw9XT98Pls+PV0/fFs9fl09Py8sXG5cdFx0e1xuXHRcdFx0Ly8gTWF0Y2ggXCIuLlwiIGJ1dCBkb24ndCBicmVhayBcIi4uLlwiXG5cdFx0XHRwYXR0ZXJuOiAvKF58W14uXSlcXC5cXC4oPyFcXC4pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxdKCl7fSw7XXxcXC4rfDorL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdFByaXNtLmxhbmd1YWdlcy5ldGx1YSA9IHtcblx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0cGF0dGVybjogL148JVstPV0/fC0/JT4kLyxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQnbGFuZ3VhZ2UtbHVhJzoge1xuXHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5sdWFcblx0XHR9XG5cdH07XG5cblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0dmFyIHBhdHRlcm4gPSAvPCVbXFxzXFxTXSs/JT4vZztcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10uYnVpbGRQbGFjZWhvbGRlcnMoZW52LCAnZXRsdWEnLCBwYXR0ZXJuKTtcblx0fSk7XG5cblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10udG9rZW5pemVQbGFjZWhvbGRlcnMoZW52LCAnZXRsdWEnKTtcblx0fSk7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdFByaXNtLmxhbmd1YWdlcy5lcmIgPSB7XG5cdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdHBhdHRlcm46IC9eKFxccyopPCU9P3wlPig/PVxccyokKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdydWJ5Jzoge1xuXHRcdFx0cGF0dGVybjogL1xccypcXFNbXFxzXFxTXSovLFxuXHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1ydWJ5Jyxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnJ1Ynlcblx0XHR9XG5cdH07XG5cblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0dmFyIGVyYlBhdHRlcm4gPSAvPCU9Pyg/OlteXFxyXFxuXXxbXFxyXFxuXSg/IT1iZWdpbil8W1xcclxcbl09YmVnaW5cXHMoPzpbXlxcclxcbl18W1xcclxcbl0oPyE9ZW5kKSkqW1xcclxcbl09ZW5kKSs/JT4vZztcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10uYnVpbGRQbGFjZWhvbGRlcnMoZW52LCAnZXJiJywgZXJiUGF0dGVybik7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLnRva2VuaXplUGxhY2Vob2xkZXJzKGVudiwgJ2VyYicpO1xuXHR9KTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuZXJsYW5nID0ge1xuXHQnY29tbWVudCc6IC8lLisvLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQncXVvdGVkLWZ1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8nKD86XFxcXC58W15cXFxcJ1xcclxcbl0pKycoPz1cXCgpLyxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQncXVvdGVkLWF0b20nOiB7XG5cdFx0cGF0dGVybjogLycoPzpcXFxcLnxbXlxcXFwnXFxyXFxuXSkrJy8sXG5cdFx0YWxpYXM6ICdhdG9tJ1xuXHR9LFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFmdGVyfGJlZ2lufGNhc2V8Y2F0Y2h8ZW5kfGZ1bnxpZnxvZnxyZWNlaXZlfHRyeXx3aGVuKVxcYi8sXG5cdCdudW1iZXInOiBbXG5cdFx0L1xcJFxcXFw/Li8sXG5cdFx0L1xcYlxcZCsjW2EtejAtOV0rL2ksXG5cdFx0Lyg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzplWystXT9cXGQrKT8vaVxuXHRdLFxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel1bXFx3QF0qKD89XFwoKS8sXG5cdCd2YXJpYWJsZSc6IHtcblx0XHQvLyBMb29rLWJlaGluZCBpcyB1c2VkIHRvIHByZXZlbnQgd3JvbmcgaGlnaGxpZ2h0aW5nIG9mIGF0b21zIGNvbnRhaW5pbmcgXCJAXCJcblx0XHRwYXR0ZXJuOiAvKF58W15AXSkoPzpcXGJ8XFw/KVtBLVpfXVtcXHdAXSovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J29wZXJhdG9yJzogW1xuXHRcdC9bPVxcLzw+Ol09fD1bOlxcL109fFxcK1xcKz98LS0/fFs9KlxcLyFdfFxcYig/OmFuZHxhbmRhbHNvfGJhbmR8Ym5vdHxib3J8YnNsfGJzcnxieG9yfGRpdnxub3R8b3J8b3JlbHNlfHJlbXx4b3IpXFxiLyxcblx0XHR7XG5cdFx0XHQvLyBXZSBkb24ndCB3YW50IHRvIG1hdGNoIDw8XG5cdFx0XHRwYXR0ZXJuOiAvKF58W148XSk8KD8hPCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gV2UgZG9uJ3Qgd2FudCB0byBtYXRjaCA+PlxuXHRcdFx0cGF0dGVybjogLyhefFtePl0pPig/IT4pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdhdG9tJzogL1xcYlthLXpdW1xcd0BdKi8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKClbXFxde306OywuI3xdfDw8fD4+L1xuXG59O1xuXG5QcmlzbS5sYW5ndWFnZXNbJ2V4Y2VsLWZvcm11bGEnXSA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhcXGJOXFwoXFxzKilcIig/OlteXCJdfFwiXCIpKlwiKD89XFxzKlxcKSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXCJdfFwiXCIpKlwiKD8hXCIpLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3JlZmVyZW5jZSc6IHtcblx0XHQvLyBodHRwczovL3d3dy5hYmxlYml0cy5jb20vb2ZmaWNlLWFkZGlucy1ibG9nLzIwMTUvMTIvMDgvZXhjZWwtcmVmZXJlbmNlLWFub3RoZXItc2hlZXQtd29ya2Jvb2svXG5cblx0XHQvLyBTYWxlcyFCMlxuXHRcdC8vICdXaW50ZXIgc2FsZXMnIUIyXG5cdFx0Ly8gW1NhbGVzLnhsc3hdSmFuIUIyOkI1XG5cdFx0Ly8gRDpcXFJlcG9ydHNcXFtTYWxlcy54bHN4XUphbiFCMjpCNVxuXHRcdC8vICdbU2FsZXMueGxzeF1KYW4gc2FsZXMnIUIyOkI1XG5cdFx0Ly8gJ0Q6XFxSZXBvcnRzXFxbU2FsZXMueGxzeF1KYW4gc2FsZXMnIUIyOkI1XG5cblx0XHRwYXR0ZXJuOiAvKD86J1teJ10qJ3woPzpbXlxccygpW1xcXXt9PD4qP1wiJzssJCZdKlxcW1teXlxccygpW1xcXXt9PD4qP1wiJ10rXFxdKT9cXHcrKSEvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnb3BlcmF0b3InOiAvISQvLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogLycvLFxuXHRcdFx0J3NoZWV0Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvW15bXFxdXSskLyxcblx0XHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHRcdH0sXG5cdFx0XHQnZmlsZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcW1teW1xcXV0rXFxdJC8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bW1xcXV0vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQncGF0aCc6IC9bXFxzXFxTXSsvXG5cdFx0fVxuXHR9LFxuXHQnZnVuY3Rpb24tbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW0EtWl1cXHcqKD89XFwoKS9pLFxuXHRcdGFsaWFzOiAnYnVpbHRpbidcblx0fSxcblx0J3JhbmdlJzoge1xuXHRcdHBhdHRlcm46IC9cXCQ/XFxiKD86W0EtWl0rXFwkP1xcZCs6XFwkP1tBLVpdK1xcJD9cXGQrfFtBLVpdKzpcXCQ/W0EtWl0rfFxcZCs6XFwkP1xcZCspXFxiL2ksXG5cdFx0YWxpYXM6ICdzZWxlY3RvcicsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnb3BlcmF0b3InOiAvOi8sXG5cdFx0XHQnY2VsbCc6IC9cXCQ/W0EtWl0rXFwkP1xcZCsvaSxcblx0XHRcdCdjb2x1bW4nOiAvXFwkP1tBLVpdKy9pLFxuXHRcdFx0J3Jvdyc6IC9cXCQ/XFxkKy9cblx0XHR9XG5cdH0sXG5cdCdjZWxsJzoge1xuXHRcdC8vIEV4Y2VsIGlzIGNhc2UgaW5zZW5zaXRpdmUsIHNvIHRoZSBzdHJpbmcgXCJmb28xXCIgY291bGQgYmUgZWl0aGVyIGEgdmFyaWFibGUgb3IgYSBjZWxsLlxuXHRcdC8vIFRvIGNvbWJhdCB0aGlzLCB3ZSBtYXRjaCBjZWxscyBjYXNlIGluc2Vuc2l0aXZlLCBpZiB0aGUgY29udGFpbiBhdCBsZWFzdCBvbmUgXCIkXCIsIGFuZCBjYXNlIHNlbnNpdGl2ZSBvdGhlcndpc2UuXG5cdFx0cGF0dGVybjogL1xcYltBLVpdK1xcZCtcXGJ8XFwkW0EtWmEtel0rXFwkP1xcZCtcXGJ8XFxiW0EtWmEtel0rXFwkXFxkK1xcYi8sXG5cdFx0YWxpYXM6ICdzZWxlY3Rvcidcblx0fSxcblx0J251bWJlcic6IC8oPzpcXGJcXGQrKD86XFwuXFxkKyk/fFxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/XFxiL2ksXG5cdCdib29sZWFuJzogL1xcYig/OkZBTFNFfFRSVUUpXFxiL2ksXG5cdCdvcGVyYXRvcic6IC9bLSsqL14lPSYsXXw8Wz0+XT98Pj0/Lyxcblx0J3B1bmN0dWF0aW9uJzogL1tbXFxdKCk7e318XS9cbn07XG5cblByaXNtLmxhbmd1YWdlc1sneGxzeCddID0gUHJpc20ubGFuZ3VhZ2VzWyd4bHMnXSA9IFByaXNtLmxhbmd1YWdlc1snZXhjZWwtZm9ybXVsYSddO1xuXG5QcmlzbS5sYW5ndWFnZXMuZnNoYXJwID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdjb21tZW50JzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcKFxcKig/IVxcKSlbXFxzXFxTXSo/XFwqXFwpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFw6XSlcXC9cXC8uKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oPzpcIlwiXCJbXFxzXFxTXSo/XCJcIlwifEBcIig/OlwiXCJ8W15cIl0pKlwifFwiKD86XFxcXFtcXHNcXFNdfFteXFxcXFwiXSkqXCIpQj8vLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYig/OmV4Y2VwdGlvbnxpbmhlcml0fGludGVyZmFjZXxuZXd8b2Z8dHlwZSlcXHMrfFxcd1xccyo6XFxzKnxcXHM6XFw/Pz5cXHMqKVsuXFx3XStcXGIoPzpcXHMqKD86LT58XFwqKVxccypbLlxcd10rXFxiKSooPyFcXHMqWzouXSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnb3BlcmF0b3InOiAvLT58XFwqLyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0fVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpsZXR8cmV0dXJufHVzZXx5aWVsZCkoPzohXFxCfFxcYil8XFxiKD86YWJzdHJhY3R8YW5kfGFzfGFzcnxhc3NlcnR8YXRvbWljfGJhc2V8YmVnaW58YnJlYWt8Y2hlY2tlZHxjbGFzc3xjb21wb25lbnR8Y29uc3R8Y29uc3RyYWludHxjb25zdHJ1Y3Rvcnxjb250aW51ZXxkZWZhdWx0fGRlbGVnYXRlfGRvfGRvbmV8ZG93bmNhc3R8ZG93bnRvfGVhZ2VyfGVsaWZ8ZWxzZXxlbmR8ZXZlbnR8ZXhjZXB0aW9ufGV4dGVybnxleHRlcm5hbHxmYWxzZXxmaW5hbGx5fGZpeGVkfGZvcnxmdW58ZnVuY3Rpb258ZnVuY3RvcnxnbG9iYWx8aWZ8aW58aW5jbHVkZXxpbmhlcml0fGlubGluZXxpbnRlcmZhY2V8aW50ZXJuYWx8bGFuZHxsYXp5fGxvcnxsc2x8bHNyfGx4b3J8bWF0Y2h8bWVtYmVyfG1ldGhvZHxtaXhpbnxtb2R8bW9kdWxlfG11dGFibGV8bmFtZXNwYWNlfG5ld3xub3R8bnVsbHxvYmplY3R8b2Z8b3BlbnxvcnxvdmVycmlkZXxwYXJhbGxlbHxwcml2YXRlfHByb2Nlc3N8cHJvdGVjdGVkfHB1YmxpY3xwdXJlfHJlY3xzZWFsZWR8c2VsZWN0fHNpZ3xzdGF0aWN8c3RydWN0fHRhaWxjYWxsfHRoZW58dG98dHJhaXR8dHJ1ZXx0cnl8dHlwZXx1cGNhc3R8dmFsfHZpcnR1YWx8dm9pZHx2b2xhdGlsZXx3aGVufHdoaWxlfHdpdGgpXFxiLyxcblx0J251bWJlcic6IFtcblx0XHQvXFxiMHhbXFxkYS1mQS1GXSsoPzpMRnxsZnx1bik/XFxiLyxcblx0XHQvXFxiMGJbMDFdKyg/OnV5fHkpP1xcYi8sXG5cdFx0Lyg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpbZm1dfGVbKy1dP1xcZCspP1xcYi9pLFxuXHRcdC9cXGJcXGQrKD86W0lsTHN5XXxVTHx1W2xzeV0/KT9cXGIvXG5cdF0sXG5cdCdvcGVyYXRvcic6IC8oWzw+fiZeXSlcXDFcXDF8KFsqLjo8PiZdKVxcMnw8LXwtPnxbIT06XT18PD9cXHx7MSwzfT4/fFxcPz8oPzo8PXw+PXw8PnxbLSsqLyU9PD5dKVxcPz98WyE/XiZdfH5bK34tXXw6Pnw6XFw/Pj8vXG59KTtcblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2ZzaGFycCcsICdrZXl3b3JkJywge1xuXHQncHJlcHJvY2Vzc29yJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopIy4qL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3Byb3BlcnR5Jyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdkaXJlY3RpdmUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXiMpXFxiKD86ZWxzZXxlbmRpZnxpZnxsaWdodHxsaW5lfG5vd2FybilcXGIvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59KTtcblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2ZzaGFycCcsICdwdW5jdHVhdGlvbicsIHtcblx0J2NvbXB1dGF0aW9uLWV4cHJlc3Npb24nOiB7XG5cdFx0cGF0dGVybjogL1xcYltfYS16XVxcdyooPz1cXHMqXFx7KS9pLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fVxufSk7XG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdmc2hhcnAnLCAnc3RyaW5nJywge1xuXHQnYW5ub3RhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvXFxbPC4rPz5cXF0vLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFxbPHw+XFxdJC8sXG5cdFx0XHQnY2xhc3MtbmFtZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL15cXHcrJHwoXnw7XFxzKilbQS1aXVxcdyooPz1cXCgpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCdhbm5vdGF0aW9uLWNvbnRlbnQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5mc2hhcnBcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdjaGFyJzoge1xuXHRcdHBhdHRlcm46IC8nKD86W15cXFxcJ118XFxcXCg/Oi58XFxkezN9fHhbYS1mQS1GXFxkXXsyfXx1W2EtZkEtRlxcZF17NH18VVthLWZBLUZcXGRdezh9KSknQj8vLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9XG59KTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBjb21tZW50X2luc2lkZSA9IHtcblx0XHQnZnVuY3Rpb24nOiAvXFxiKD86QlVHUz98RklYKD86TUVTPyk/fE5PVEVTP3xUT0RPUz98WFgrfEhBQ0tTP3xXQVJOKD86SU5HKT98XFw/ezIsfXwhezIsfSlcXGIvXG5cdH07XG5cdHZhciBzdHJpbmdfaW5zaWRlID0ge1xuXHRcdCdudW1iZXInOiAvXFxcXFteXFxzJ118JVxcdy9cblx0fTtcblxuXHR2YXIgZmFjdG9yID0ge1xuXHRcdCdjb21tZW50JzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyAhIHNpbmdsZS1saW5lIGV4Y2xhbWF0aW9uIHBvaW50IGNvbW1lbnRzIHdpdGggd2hpdGVzcGFjZSBhZnRlci9hcm91bmQgdGhlICFcblx0XHRcdFx0cGF0dGVybjogLyhefFxccykoPzohIC4qfCEkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogY29tbWVudF9pbnNpZGVcblx0XHRcdH0sXG5cblx0XHRcdC8qIGZyb20gYmFzaXMvbXVsdGlsaW5lOiAqL1xuXHRcdFx0e1xuXHRcdFx0XHQvLyAvKiBjb21tZW50ICovLCAvKiBjb21tZW50Ki9cblx0XHRcdFx0cGF0dGVybjogLyhefFxccylcXC9cXCpcXHNbXFxzXFxTXSo/XFwqXFwvKD89XFxzfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IGNvbW1lbnRfaW5zaWRlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyAhW1sgY29tbWVudCBdXSAsICFbPT09WyBjb21tZW50XT09PV1cblx0XHRcdFx0cGF0dGVybjogLyhefFxccykhXFxbKD17MCw2fSlcXFtcXHNbXFxzXFxTXSo/XFxdXFwyXFxdKD89XFxzfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IGNvbW1lbnRfaW5zaWRlXG5cdFx0XHR9XG5cdFx0XSxcblxuXHRcdCdudW1iZXInOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGJhc2ljIGJhc2UgMTAgaW50ZWdlcnMgOSwgLTlcblx0XHRcdFx0cGF0dGVybjogLyhefFxccylbKy1dP1xcZCsoPz1cXHN8JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBiYXNlIHByZWZpeCBpbnRlZ2VycyAwYjAxMCAwbzcwIDB4YWQgMGQxMCAwWEFEIC0weGE5XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpWystXT8wKD86YlswMV0rfG9bMC03XSt8ZFxcZCt8eFtcXGRBLUZdKykoPz1cXHN8JCkvaSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gZnJhY3Rpb25hbCByYXRpb3MgMS81IC0xLzUgYW5kIHRoZSBsaXRlcmFsIGZsb2F0IGFwcHJveGltYXRpb25zIDEvNS4gLTEvNS5cblx0XHRcdFx0cGF0dGVybjogLyhefFxccylbKy1dP1xcZCtcXC9cXGQrXFwuPyg/PVxcc3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIHBvc2l0aXZlIG1peGVkIG51bWJlcnMgMjMrMS81ICsyMysxLzVcblx0XHRcdFx0cGF0dGVybjogLyhefFxccylcXCs/XFxkK1xcK1xcZCtcXC9cXGQrKD89XFxzfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gbmVnYXRpdmUgbWl4ZWQgbnVtYmVycyAtMjMtMS81XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpLVxcZCstXFxkK1xcL1xcZCsoPz1cXHN8JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBiYXNpYyBkZWNpbWFsIGZsb2F0cyAtMC4wMSAwLiAuMCAuMSAtLjEgLTEuIC0xMi4xMyArMTIuMTNcblx0XHRcdFx0Ly8gYW5kIHNjaWVudGlmaWMgbm90YXRpb24gd2l0aCBiYXNlIDEwIGV4cG9uZW50cyAzZTQgM2UtNCAuM2UtNFxuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVsrLV0/KD86XFxkKlxcLlxcZCt8XFxkK1xcLlxcZCp8XFxkKykoPzplWystXT9cXGQrKT8oPz1cXHN8JCkvaSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gTkFOIGxpdGVyYWwgc3ludGF4IE5BTjogODAwMDBkZWFkYmVlZiwgTkFOOiBhXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpTkFOOlxccytbXFxkYS1mQS1GXSsoPz1cXHN8JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvKlxuXHRcdFx0XHRcdGJhc2UgcHJlZml4IGZsb2F0cyAweDEuMHAzICg4LjApIDBiMS4wMTBwMiAoNS4wKSAweDEucDEgMGIxLjExMTExMTExcDExMTExLi4uXG5cdFx0XHRcdFx0XCJUaGUgbm9ybWFsaXplZCBoZXggZm9ybSBcdTAwQjEweDEuTU1NTU1NTU1NTU1NTVtwUF1cdTAwQjFFRUVFIGFsbG93cyBhbnkgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHRvIGJlIHNwZWNpZmllZCBwcmVjaXNlbHkuXG5cdFx0XHRcdFx0VGhlIHZhbHVlcyBvZiBNTU1NTU1NTU1NTU1NIGFuZCBFRUVFIG1hcCBkaXJlY3RseSB0byB0aGUgbWFudGlzc2EgYW5kIGV4cG9uZW50IGZpZWxkcyBvZiB0aGUgYmluYXJ5IElFRUUgNzU0IHJlcHJlc2VudGF0aW9uLlwiXG5cdFx0XHRcdFx0PGh0dHBzOi8vZG9jcy5mYWN0b3Jjb2RlLm9yZy9jb250ZW50L2FydGljbGUtc3ludGF4LWZsb2F0cy5odG1sPlxuXHRcdFx0XHQqL1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVsrLV0/MCg/OmIxXFwuWzAxXSp8bzFcXC5bMC03XSp8ZDFcXC5cXGQqfHgxXFwuW1xcZEEtRl0qKXBcXGQrKD89XFxzfCQpL2ksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXG5cdFx0Ly8gUi8gcmVnZXhwP1xcL1xcXFwvXG5cdFx0J3JlZ2V4cCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXHMpUlxcL1xccyg/OlxcXFxcXFN8W15cXFxcL10pKlxcLyg/OltpZG1zcl0qfFtpZG1zcl0rLVtpZG1zcl0rKSg/PVxcc3wkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdudW1iZXInLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCd2YXJpYWJsZSc6IC9cXFxcXFxTLyxcblx0XHRcdFx0J2tleXdvcmQnOiAvWys/KlxcW1xcXV4kKCl7fS58XS8sXG5cdFx0XHRcdCdvcGVyYXRvcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxcLylbaWRtc3JdKyg/Oi1baWRtc3JdKyk/Lyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J2Jvb2xlYW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVt0Zl0oPz1cXHN8JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQvLyBTQlVGXCIgYXNkXCIsIFVSTFwiIDovLy4uLlwiLCBQXCIgL2V0Yy9cIlxuXHRcdCdjdXN0b20tc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFxccylbQS1aMC05XFwtXStcIlxccyg/OlxcXFxcXFN8W15cIlxcXFxdKSpcIi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdudW1iZXInOiAvXFxcXFxcU3wlXFx3fFxcLy9cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J211bHRpbGluZS1zdHJpbmcnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFNUUklORzogbmFtZSBcXG4gY29udGVudCBcXG4gOyAtPiBDT05TVEFOVDogbmFtZSBcImNvbnRlbnRcIiAoc3ltYm9sKVxuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVNUUklORzpcXHMrXFxTKyg/OlxcbnxcXHJcXG4pLiooPzpcXG58XFxyXFxuKVxccyo7KD89XFxzfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdudW1iZXInOiBzdHJpbmdfaW5zaWRlLm51bWJlcixcblx0XHRcdFx0XHQvLyB0cmFpbGluZyBzZW1pY29sb24gb24gaXRzIG93biBsaW5lXG5cdFx0XHRcdFx0J3NlbWljb2xvbi1vci1zZXRsb2NhbCc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8oW1xcclxcbl1bIFxcdF0qKTsoPz1cXHN8JCkvLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBIRVJFRE9DOiBtYXJrZXIgXFxuIGNvbnRlbnQgXFxuIG1hcmtlciA7IC0+IFwiY29udGVudFwiIChpbW1lZGlhdGUpXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpSEVSRURPQzpcXHMrXFxTKyg/OlxcbnxcXHJcXG4pLiooPzpcXG58XFxyXFxuKVxccypcXFMrKD89XFxzfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRcdGluc2lkZTogc3RyaW5nX2luc2lkZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gW1sgc3RyaW5nIF1dLCBbPT1bIHN0cmluZ109PV1cblx0XHRcdFx0cGF0dGVybjogLyhefFxccylcXFsoPXswLDZ9KVxcW1xcc1tcXHNcXFNdKj9cXF1cXDJcXF0oPz1cXHN8JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdFx0aW5zaWRlOiBzdHJpbmdfaW5zaWRlXG5cdFx0XHR9XG5cdFx0XSxcblxuXHRcdCdzcGVjaWFsLXVzaW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFxccylVU0lORzooPzpcXHNcXFMrKSooPz1cXHMrOyg/Olxcc3wkKSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdC8vIHRoaXMgaXMgZXNzZW50aWFsbHkgYSByZWdleCBmb3Igdm9jYWIgbmFtZXMsIHdoaWNoIGkgZG9uJ3Qgd2FudCB0byBzcGVjaWZ5XG5cdFx0XHRcdC8vIGJ1dCB0aGUgVVNJTkc6IGdldHMgcGlja2VkIHVwIGFzIGEgdm9jYWIgbmFtZVxuXHRcdFx0XHQnc3RyaW5nJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXFxzKVteOlxcc10rLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0LyogdGhpcyBkZXNjcmlwdGlvbiBvZiBzdGFjayBlZmZlY3QgbGl0ZXJhbCBzeW50YXggaXMgbm90IGNvbXBsZXRlIGFuZCBub3QgYXMgc3BlY2lmaWMgYXMgdGhlb3JldGljYWxseSBwb3NzaWJsZVxuXHRcdFx0dHJ5aW5nIHRvIGRvIGJldHRlciBpcyBtb3JlIHdvcmsgYW5kIHJlZ2V4LWNvbXB1dGF0aW9uLXRpbWUgdGhhbiBpdCdzIHdvcnRoIHRob3VnaC5cblx0XHRcdC0gd2UnZCBsaWtlIHRvIGhhdmUgdGhlIFwiZGVsaW1pdGVyXCIgcGFydHMgb2YgdGhlIHN0YWNrIGVmZmVjdCBbICgsIC0tLCBhbmQgKSBdIGJlIGEgZGlmZmVyZW50IChsZXNzLWltcG9ydGFudCBvciBjb21tZW50LWxpa2UpIGNvbG91ciB0byB0aGUgc3RhY2sgZWZmZWN0IGNvbnRlbnRzXG5cdFx0XHQtIHdlJ2QgbGlrZSBpZiBuZXN0ZWQgc3RhY2sgZWZmZWN0cyB3ZXJlIHRyZWF0ZWQgYXMgc3VjaCByYXRoZXIgdGhhbiBqdXN0IGFwcGVhcmluZyBmbGF0ICh3aXRoIGBpbnNpZGVgKVxuXHRcdFx0LSB3ZSdkIGxpa2UgaWYgdGhlIGZvbGxvd2luZyB2YXJpYWJsZSBuYW1lIGNvbnZlbnRpb25zIHdlcmUgcmVjb2duaXNlZCBzcGVjaWZpY2FsbHk6XG5cdFx0XHRcdHNwZWNpYWwgcm93IHZhcmlhYmxlcyA9IC4uYSBiLi5cblx0XHRcdFx0dHlwZSBhbmQgc3RhY2sgZWZmZWN0IGFubm90YXRpb25zIGVuZCB3aXRoIGEgY29sb24gPSAoIHF1b3Q6ICggYTogKCAtLSApIC0tIGIgKSAtLSB4ICksICggeDogbnVtYmVyIC0tIClcblx0XHRcdFx0d29yZCB0aHJvd3MgdW5jb25kaXRpb25hbCBlcnJvciA9ICpcblx0XHRcdFx0YW55IG90aGVyIHdvcmQtbGlrZSB2YXJpYWJsZSBuYW1lID0gYSA/IHEnIGV0Y1xuXG5cdFx0XHRodHRwczovL2RvY3MuZmFjdG9yY29kZS5vcmcvY29udGVudC9hcnRpY2xlLWVmZmVjdHMuaHRtbFxuXG5cdFx0XHR0aGVzZSBhcmUgcHJldHR5IGNvbXBsaWNhdGVkIHRvIGhpZ2hsaWdodCBwcm9wZXJseSB3aXRob3V0IGEgcmVhbCBwYXJzZXIsIGFuZCB0aGVyZWZvcmUgb3V0IG9mIHNjb3BlXG5cdFx0XHR0aGUgb2xkIHBhdHRlcm4sIHdoaWNoIG1heSBiZSBsYXRlciB1c2VmdWwsIHdhczogKF58XFxzKSg/OmNhbGx8ZXhlY3V0ZXxldmFsKT9cXCgoPzpcXHMrW15cIlxcclxcblxcdCBdXFxTKikqP1xccystLSg/OlxccytbXlwiXFxuXFx0IF1cXFMqKSo/XFxzK1xcKSg/PVxcc3wkKVxuXHRcdCovXG5cblx0XHQvLyBjdXJyZW50IHNvbHV0aW9uIGlzIG5vdCBncmVhdFxuXHRcdCdzdGFjay1lZmZlY3QtZGVsaW1pdGVyJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBvcGVuaW5nIHBhcmVudGhlc2lzXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpKD86Y2FsbHxldmFsfGV4ZWN1dGUpP1xcKCg/PVxccykvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gbWlkZGxlIC0tXG5cdFx0XHRcdHBhdHRlcm46IC8oXFxzKS0tKD89XFxzKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBjbG9zaW5nIHBhcmVudGhlc2lzXG5cdFx0XHRcdHBhdHRlcm46IC8oXFxzKVxcKSg/PVxcc3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0XHR9XG5cdFx0XSxcblxuXHRcdCdjb21iaW5hdG9ycyc6IHtcblx0XHRcdHBhdHRlcm46IG51bGwsXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cblx0XHQna2VybmVsLWJ1aWx0aW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiBudWxsLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0fSxcblxuXHRcdCdzZXF1ZW5jZXMtYnVpbHRpbic6IHtcblx0XHRcdHBhdHRlcm46IG51bGwsXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHR9LFxuXG5cdFx0J21hdGgtYnVpbHRpbic6IHtcblx0XHRcdHBhdHRlcm46IG51bGwsXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHR9LFxuXG5cdFx0J2NvbnN0cnVjdG9yLXdvcmQnOiB7XG5cdFx0XHQvLyA8YXJyYXk+IGJ1dCBub3QgPD0+XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxzKTwoPyE9Kz58LSs+KVxcUys+KD89XFxzfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblxuXHRcdCdvdGhlci1idWlsdGluLXN5bnRheCc6IHtcblx0XHRcdHBhdHRlcm46IG51bGwsXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9LFxuXG5cdFx0Lypcblx0XHRcdGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWQgd29yZCBuYW1pbmcgY29udmVudGlvbnM6ICh0aGUgY29udmVudGlvbiBhcHBlYXJzIG91dHNpZGUgb2YgdGhlIFticmFja2V0c10pXG5cdFx0XHRcdHNldC1beF1cblx0XHRcdFx0Y2hhbmdlLVt4XVxuXHRcdFx0XHR3aXRoLVt4XVxuXHRcdFx0XHRuZXctW3hdXG5cdFx0XHRcdD5bc3RyaW5nXVxuXHRcdFx0XHRbYmFzZV0+XG5cdFx0XHRcdFtzdHJpbmddPltudW1iZXJdXG5cdFx0XHRcdCtbc3ltYm9sXStcblx0XHRcdFx0W2Jvb2xlYW4td29yZF0/XG5cdFx0XHRcdD9bb2ZdXG5cdFx0XHRcdFtzbG90LXJlYWRlcl0+PlxuXHRcdFx0XHQ+PltzbG90LXNldHRlcl1cblx0XHRcdFx0W3Nsb3Qtd3JpdGVyXTw8XG5cdFx0XHRcdChbaW1wbGVtZW50YXRpb24tZGV0YWlsXSlcblx0XHRcdFx0W211dGF0ZXJdIVxuXHRcdFx0XHRbdmFyaWFudF0qXG5cdFx0XHRcdFtwcmV0dHlwcmludF0uXG5cdFx0XHRcdCRbaGVscC1tYXJrdXBdXG5cblx0XHRcdDxjb25zdHJ1Y3RvcnM+LCBTWU5UQVg6LCBldGMgYXJlIHN1cHBvcnRlZCBieSB0aGVpciBvd24gcGF0dGVybnMuXG5cblx0XHRcdGB3aXRoYCBhbmQgYG5ld2AgZnJvbSBga2VybmVsYCBhcmUgdGhlaXIgb3duIGJ1aWx0aW5zLlxuXG5cdFx0XHRzZWUgPGh0dHBzOi8vZG9jcy5mYWN0b3Jjb2RlLm9yZy9jb250ZW50L2FydGljbGUtY29udmVudGlvbnMuaHRtbD5cblx0XHQqL1xuXHRcdCdjb252ZW50aW9uYWxseS1uYW1lZC13b3JkJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFxccykoPyFcIikoPzooPzpjaGFuZ2V8bmV3fHNldHx3aXRoKS1cXFMrfFxcJFxcUyt8PltePlxcc10rfFteOj5cXHNdKz58W14+XFxzXSs+W14+XFxzXSt8XFwrW14rXFxzXStcXCt8W14/XFxzXStcXD98XFw/W14/XFxzXSt8W14+XFxzXSs+Pnw+PltePlxcc10rfFtePFxcc10rPDx8XFwoW14oKVxcc10rXFwpfFteIVxcc10rIXxbXipcXHNdXFxTKlxcKnxbXi5cXHNdXFxTKlxcLikoPz1cXHN8JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXG5cdFx0J2NvbG9uLXN5bnRheCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXHMpKD86W0EtWjAtOVxcLV0rIz8pPzp7MSwyfVxccysoPzo7XFxTK3woPyE7KVxcUyspKD89XFxzfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cblx0XHQnc2VtaWNvbG9uLW9yLXNldGxvY2FsJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXHMpKD86O3w6PikoPz1cXHN8JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblxuXHRcdC8vIGRvIG5vdCBoaWdobGlnaHQgbGVhZGluZyB9IG9yIHRyYWlsaW5nIFh7IGF0IHRoZSBiZWdpbi9lbmQgb2YgdGhlIGZpbGUgYXMgaXQncyBpbnZhbGlkIHN5bnRheFxuXHRcdCdjdXJseS1icmFjZS1saXRlcmFsLWRlbGltaXRlcic6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gb3BlbmluZ1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVthLXpdKlxceyg/PVxccykvaSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGNsb3Npbmdcblx0XHRcdFx0cGF0dGVybjogLyhcXHMpXFx9KD89XFxzfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHRcdH0sXG5cblx0XHRdLFxuXG5cdFx0Ly8gZG8gbm90IGhpZ2hsaWdodCBsZWFkaW5nIF0gb3IgdHJhaWxpbmcgWyBhdCB0aGUgYmVnaW4vZW5kIG9mIHRoZSBmaWxlIGFzIGl0J3MgaW52YWxpZCBzeW50YXhcblx0XHQncXVvdGF0aW9uLWRlbGltaXRlcic6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gb3BlbmluZ1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVxcWyg/PVxccykvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gY2xvc2luZ1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxccylcXF0oPz1cXHN8JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdFx0fSxcblx0XHRdLFxuXG5cdFx0J25vcm1hbC13b3JkJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFxccylbXlwiXFxzXVxcUyooPz1cXHN8JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQvKlxuXHRcdFx0YmFzaWMgZmlyc3QtY2xhc3Mgc3RyaW5nIFwiYVwiXG5cdFx0XHRcdHdpdGggZXNjYXBlZCBkb3VibGUtcXVvdGUgXCJhXFxcIlwiXG5cdFx0XHRcdGVzY2FwZWQgYmFja3NsYXNoIFwiXFxcXFwiXG5cdFx0XHRcdGFuZCBnZW5lcmFsIGVzY2FwZXMgc2luY2UgRmFjdG9yIGhhcyBzbyBtYW55IFwiXFxOXCJcblxuXHRcdFx0c3ludGF4IHRoYXQgd29ya3MgaW4gdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzbid0IGZ1bGx5XG5cdFx0XHRzdXBwb3J0ZWQgYmVjYXVzZSBpdCdzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbDpcblx0XHRcdFx0XCJzdHJpbmcgMVwiXCJzdHJpbmcgMlwiIC0+IDIgc3RyaW5ncyAod29ya3MgYW55d2F5KVxuXHRcdFx0XHRcInN0cmluZ1wiNSAtPiBzdHJpbmcsIDVcblx0XHRcdFx0XCJzdHJpbmdcIlsgXSAtPiBzdHJpbmcsIHF1b3RhdGlvblxuXHRcdFx0XHR7IFwiYVwifSAtPiBhcnJheTxzdHJpbmc+XG5cblx0XHRcdHRoZSByZXN0IG9mIHRob3NlIGV4YW1wbGVzIGFsbCBwcm9wZXJseSByZWNvZ25pc2UgdGhlIHN0cmluZywgYnV0IG5vdFxuXHRcdFx0XHR0aGUgb3RoZXIgb2JqZWN0IChudW1iZXIsIHF1b3RhdGlvbiwgZXRjKVxuXHRcdFx0dGhpcyBpcyBmaW5lIGZvciBhIHJlZ2V4LW9ubHkgaW1wbGVtZW50YXRpb24uXG5cdFx0Ki9cblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiKD86XFxcXFxcU3xbXlwiXFxcXF0pKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZTogc3RyaW5nX2luc2lkZVxuXHRcdH1cblx0fTtcblxuXHR2YXIgZXNjYXBlID0gZnVuY3Rpb24gKHN0cikge1xuXHRcdHJldHVybiAoc3RyICsgJycpLnJlcGxhY2UoLyhbLj8qK1xcXiRcXFtcXF1cXFxcKCl7fXxcXC1dKS9nLCAnXFxcXCQxJyk7XG5cdH07XG5cblx0dmFyIGFyclRvV29yZHNSZWdFeHAgPSBmdW5jdGlvbiAoYXJyKSB7XG5cdFx0cmV0dXJuIG5ldyBSZWdFeHAoXG5cdFx0XHQnKF58XFxcXHMpKD86JyArIGFyci5tYXAoZXNjYXBlKS5qb2luKCd8JykgKyAnKSg/PVxcXFxzfCQpJ1xuXHRcdCk7XG5cdH07XG5cblx0dmFyIGJ1aWx0aW5zID0ge1xuXHRcdCdrZXJuZWwtYnVpbHRpbic6IFtcblx0XHRcdCdvcicsICcybmlwZCcsICc0ZHJvcCcsICd0dWNrJywgJ3dyYXBwZXInLCAnbmlwJywgJ3dyYXBwZXI/JywgJ2NhbGxzdGFjaz5hcnJheScsICdkaWUnLCAnZHVwZCcsICdjYWxsc3RhY2snLCAnY2FsbHN0YWNrPycsICczZHVwJywgJ2hhc2hjb2RlJywgJ3BpY2snLCAnNG5pcCcsICdidWlsZCcsICc+Ym9vbGVhbicsICduaXBkJywgJ2Nsb25lJywgJzVuaXAnLCAnZXE/JywgJz8nLCAnPScsICdzd2FwZCcsICcyb3ZlcicsICdjbGVhcicsICcyZHVwJywgJ2dldC1yZXRhaW5zdGFjaycsICdub3QnLCAndHVwbGU/JywgJ2R1cCcsICczbmlwZCcsICdjYWxsJywgJy1yb3RkJywgJ29iamVjdCcsICdkcm9wJywgJ2Fzc2VydD0nLCAnYXNzZXJ0PycsICctcm90JywgJ2V4ZWN1dGUnLCAnYm9hJywgJ2dldC1jYWxsc3RhY2snLCAnY3VycmllZD8nLCAnM2Ryb3AnLCAncGlja2QnLCAnb3ZlcmQnLCAnb3ZlcicsICdyb2xsJywgJzNuaXAnLCAnc3dhcCcsICdhbmQnLCAnMm5pcCcsICdyb3RkJywgJ3Rocm93JywgJyhjbG9uZSknLCAnaGFzaGNvZGUqJywgJ3NwaW4nLCAncmVhY2gnLCAnNGR1cCcsICdlcXVhbD8nLCAnZ2V0LWRhdGFzdGFjaycsICdhc3NlcnQnLCAnMmRyb3AnLCAnPHdyYXBwZXI+JywgJ2Jvb2xlYW4/JywgJ2lkZW50aXR5LWhhc2hjb2RlJywgJ2lkZW50aXR5LXR1cGxlPycsICdudWxsJywgJ2NvbXBvc2VkPycsICduZXcnLCAnNWRyb3AnLCAncm90JywgJy1yb2xsJywgJ3hvcicsICdpZGVudGl0eS10dXBsZScsICdib29sZWFuJ1xuXHRcdF0sXG5cdFx0J290aGVyLWJ1aWx0aW4tc3ludGF4JzogW1xuXHRcdFx0Ly8gc3ludGF4XG5cdFx0XHQnPT09PT09PScsICdyZWN1cnNpdmUnLCAnZmx1c2hhYmxlJywgJz4+JywgJzw8PDw8PCcsICdNXFxcXCcsICdCJywgJ1BSSVZBVEU+JywgJ1xcXFwnLCAnPT09PT09JywgJ2ZpbmFsJywgJ2lubGluZScsICdkZWxpbWl0ZXInLCAnZGVwcmVjYXRlZCcsICc8UFJJVkFURScsICc+Pj4+Pj4nLCAnPDw8PDw8PCcsICdwYXJzZS1jb21wbGV4JywgJ21hbGZvcm1lZC1jb21wbGV4JywgJ3JlYWQtb25seScsICc+Pj4+Pj4+JywgJ2NhbGwtbmV4dC1tZXRob2QnLCAnPDwnLCAnZm9sZGFibGUnLFxuXHRcdFx0Ly8gbGl0ZXJhbHNcblx0XHRcdCckJywgJyRbJywgJyR7J1xuXHRcdF0sXG5cdFx0J3NlcXVlbmNlcy1idWlsdGluJzogW1xuXHRcdFx0J21lbWJlci1lcT8nLCAnbWlzbWF0Y2gnLCAnYXBwZW5kJywgJ2Fzc2VydC1zZXF1ZW5jZT0nLCAnbG9uZ2VyJywgJ3JlcGV0aXRpb24nLCAnY2xvbmUtbGlrZScsICczc2VxdWVuY2UnLCAnYXNzZXJ0LXNlcXVlbmNlPycsICdsYXN0LWluZGV4LWZyb20nLCAncmV2ZXJzZWQnLCAnaW5kZXgtZnJvbScsICdjdXQqJywgJ3BhZC10YWlsJywgJ2pvaW4tYXMnLCAncmVtb3ZlLWVxIScsICdjb25jYXQtYXMnLCAnYnV0LWxhc3QnLCAnc25pcCcsICdudGhzJywgJ250aCcsICdzZXF1ZW5jZScsICdsb25nZXN0JywgJ3NsaWNlPycsICc8c2xpY2U+JywgJ3JlbW92ZS1udGgnLCAndGFpbC1zbGljZScsICdlbXB0eT8nLCAndGFpbConLCAnbWVtYmVyPycsICd2aXJ0dWFsLXNlcXVlbmNlPycsICdzZXQtbGVuZ3RoJywgJ2Ryb3AtcHJlZml4JywgJ2lvdGEnLCAndW5jbGlwJywgJ2JvdW5kcy1lcnJvcj8nLCAndW5jbGlwLWxhc3Qtc2xpY2UnLCAnbm9uLW5lZ2F0aXZlLWludGVnZXItZXhwZWN0ZWQnLCAnbm9uLW5lZ2F0aXZlLWludGVnZXItZXhwZWN0ZWQ/JywgJ21pZHBvaW50QCcsICdsb25nZXI/JywgJz9zZXQtbnRoJywgJz9maXJzdCcsICdyZXN0LXNsaWNlJywgJ3ByZXBlbmQtYXMnLCAncHJlcGVuZCcsICdmb3VydGgnLCAnc2lmdCcsICdzdWJzZXEtc3RhcnQnLCAnbmV3LXNlcXVlbmNlJywgJz9sYXN0JywgJ2xpa2UnLCAnZmlyc3Q0JywgJzFzZXF1ZW5jZScsICdyZXZlcnNlJywgJ3NsaWNlJywgJ3ZpcnR1YWxAJywgJ3JlcGV0aXRpb24/JywgJ3NldC1sYXN0JywgJ2luZGV4JywgJzRzZXF1ZW5jZScsICdtYXgtbGVuZ3RoJywgJ3NldC1zZWNvbmQnLCAnaW1tdXRhYmxlLXNlcXVlbmNlJywgJ2ZpcnN0MicsICdmaXJzdDMnLCAnc3VwcmVtdW0nLCAndW5jbGlwLXNsaWNlJywgJ3N1ZmZpeCEnLCAnaW5zZXJ0LW50aCcsICd0YWlsJywgJzNhcHBlbmQnLCAnc2hvcnQnLCAnc3VmZml4JywgJ2NvbmNhdCcsICdmbGlwJywgJ2ltbXV0YWJsZT8nLCAncmV2ZXJzZSEnLCAnMnNlcXVlbmNlJywgJ3N1bScsICdkZWxldGUtYWxsJywgJ2luZGljZXMnLCAnc25pcC1zbGljZScsICc8aW90YT4nLCAnY2hlY2stc2xpY2UnLCAnc2VxdWVuY2U/JywgJ2hlYWQnLCAnYXBwZW5kLWFzJywgJ2hhbHZlcycsICdzZXF1ZW5jZT0nLCAnY29sbGFwc2Utc2xpY2UnLCAnP3NlY29uZCcsICdzbGljZS1lcnJvcj8nLCAncHJvZHVjdCcsICdib3VuZHMtY2hlY2s/JywgJ2JvdW5kcy1jaGVjaycsICdpbW11dGFibGUnLCAndmlydHVhbC1leGVtcGxhcicsICdoYXJ2ZXN0JywgJ3JlbW92ZScsICdwYWQtaGVhZCcsICdsYXN0JywgJ3NldC1mb3VydGgnLCAnY2FydGVzaWFuLXByb2R1Y3QnLCAncmVtb3ZlLWVxJywgJ3Nob3J0ZW4nLCAnc2hvcnRlcicsICdyZXZlcnNlZD8nLCAnc2hvcnRlcj8nLCAnc2hvcnRlc3QnLCAnaGVhZC1zbGljZScsICdwb3AqJywgJ3RhaWwtc2xpY2UqJywgJ2J1dC1sYXN0LXNsaWNlJywgJ2lvdGE/JywgJ2FwcGVuZCEnLCAnY3V0LXNsaWNlJywgJ25ldy1yZXNpemFibGUnLCAnaGVhZC1zbGljZSonLCAnc2VxdWVuY2UtaGFzaGNvZGUnLCAncG9wJywgJ3NldC1udGgnLCAnP250aCcsICdzZWNvbmQnLCAnam9pbicsICdpbW11dGFibGUtc2VxdWVuY2U/JywgJzxyZXZlcnNlZD4nLCAnM2FwcGVuZC1hcycsICd2aXJ0dWFsLXNlcXVlbmNlJywgJ3N1YnNlcT8nLCAncmVtb3ZlLW50aCEnLCAnbGVuZ3RoJywgJ2xhc3QtaW5kZXgnLCAnbGVuZ3RoZW4nLCAnYXNzZXJ0LXNlcXVlbmNlJywgJ2NvcHknLCAnbW92ZScsICd0aGlyZCcsICdmaXJzdCcsICd0YWlsPycsICdzZXQtZmlyc3QnLCAncHJlZml4JywgJ2JvdW5kcy1lcnJvcicsICc8cmVwZXRpdGlvbj4nLCAnZXhjaGFuZ2UnLCAnc3Vycm91bmQnLCAnY3V0JywgJ21pbi1sZW5ndGgnLCAnc2V0LXRoaXJkJywgJ3B1c2gtYWxsJywgJ2hlYWQ/JywgJ3N1YnNlcS1zdGFydC1mcm9tJywgJ2RlbGV0ZS1zbGljZScsICdyZXN0JywgJ3N1bS1sZW5ndGhzJywgJ2hlYWQqJywgJ2luZmltdW0nLCAncmVtb3ZlIScsICdnbHVlJywgJ3NsaWNlLWVycm9yJywgJ3N1YnNlcScsICdwdXNoJywgJ3JlcGxhY2Utc2xpY2UnLCAnc3Vic2VxLWFzJywgJ3VuY2xpcC1sYXN0J1xuXHRcdF0sXG5cdFx0J21hdGgtYnVpbHRpbic6IFtcblx0XHRcdCdudW1iZXI9JywgJ25leHQtcG93ZXItb2YtMicsICc/MSsnLCAnZnAtc3BlY2lhbD8nLCAnaW1hZ2luYXJ5LXBhcnQnLCAnZmxvYXQ+Yml0cycsICdudW1iZXI/JywgJ2ZwLWluZmluaXR5PycsICdiaWdudW0/JywgJ2ZwLXNuYW4/JywgJ2Rlbm9taW5hdG9yJywgJ2djZCcsICcqJywgJysnLCAnZnAtYml0d2lzZT0nLCAnLScsICd1Pj0nLCAnLycsICc+PScsICdiaXRhbmQnLCAncG93ZXItb2YtMj8nLCAnbG9nMi1leHBlY3RzLXBvc2l0aXZlJywgJ25lZz8nLCAnPCcsICdsb2cyJywgJz4nLCAnaW50ZWdlcj8nLCAnbnVtYmVyJywgJ2JpdHM+ZG91YmxlJywgJzIvJywgJ3plcm8/JywgJ2JpdHM+ZmxvYXQnLCAnZmxvYXQ/JywgJ3NoaWZ0JywgJ3JhdGlvPycsICdyZWN0PicsICdldmVuPycsICdyYXRpbycsICdmcC1zaWduJywgJ2JpdG5vdCcsICc+Zml4bnVtJywgJ2NvbXBsZXg/JywgJy9pJywgJ2ludGVnZXI+Zml4bnVtJywgJy9mJywgJ3NnbicsICc+YmlnbnVtJywgJ25leHQtZmxvYXQnLCAndTwnLCAndT4nLCAnbW9kJywgJ3JlY2lwJywgJ3JhdGlvbmFsJywgJz5mbG9hdCcsICcyXicsICdpbnRlZ2VyJywgJ2ZpeG51bT8nLCAnbmVnJywgJ2ZpeG51bScsICdzcScsICdiaWdudW0nLCAnPnJlY3QnLCAnYml0PycsICdmcC1xbmFuPycsICdzaW1wbGUtZ2NkJywgJ2NvbXBsZXgnLCAnPGZwLW5hbj4nLCAncmVhbCcsICc+ZnJhY3Rpb24nLCAnZG91YmxlPmJpdHMnLCAnYml0b3InLCAncmVtJywgJ2ZwLW5hbi1wYXlsb2FkJywgJ3JlYWwtcGFydCcsICdsb2cyLWV4cGVjdHMtcG9zaXRpdmU/JywgJ3ByZXYtZmxvYXQnLCAnYWxpZ24nLCAndW5vcmRlcmVkPycsICdmbG9hdCcsICdmcC1uYW4/JywgJ2FicycsICdiaXR4b3InLCAnaW50ZWdlcj5maXhudW0tc3RyaWN0JywgJ3U8PScsICdvZGQ/JywgJzw9JywgJy9tb2QnLCAnPmludGVnZXInLCAncmVhbD8nLCAncmF0aW9uYWw/JywgJ251bWVyYXRvcidcblx0XHRdXG5cdFx0Ly8gdGhhdCdzIGFsbCBmb3Igbm93XG5cdH07XG5cblx0T2JqZWN0LmtleXMoYnVpbHRpbnMpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcblx0XHRmYWN0b3Jba10ucGF0dGVybiA9IGFyclRvV29yZHNSZWdFeHAoYnVpbHRpbnNba10pO1xuXHR9KTtcblxuXHR2YXIgY29tYmluYXRvcnMgPSBbXG5cdFx0Ly8ga2VybmVsXG5cdFx0JzJiaScsICd3aGlsZScsICcydHJpJywgJ2JpKicsICc0ZGlwJywgJ2JvdGg/JywgJ3NhbWU/JywgJ3RyaUAnLCAnY3VycnknLCAncHJlcG9zZScsICczYmknLCAnP2lmJywgJ3RyaSonLCAnMmtlZXAnLCAnM2tlZXAnLCAnY3VycmllZCcsICcya2VlcGQnLCAnd2hlbicsICcyYmkqJywgJzJ0cmkqJywgJzRrZWVwJywgJ2JpQCcsICdrZWVwZGQnLCAnZG8nLCAndW5sZXNzKicsICd0cmktY3VycnknLCAnaWYqJywgJ2xvb3AnLCAnYmktY3VycnkqJywgJ3doZW4qJywgJzJiaUAnLCAnMnRyaUAnLCAnd2l0aCcsICcyd2l0aCcsICdlaXRoZXI/JywgJ2JpJywgJ3VudGlsJywgJzNkaXAnLCAnM2N1cnJ5JywgJ3RyaS1jdXJyeSonLCAndHJpLWN1cnJ5QCcsICdiaS1jdXJyeScsICdrZWVwZCcsICdjb21wb3NlJywgJzJkaXAnLCAnaWYnLCAnM3RyaScsICd1bmxlc3MnLCAndHVwbGUnLCAna2VlcCcsICcyY3VycnknLCAndHJpJywgJ21vc3QnLCAnd2hpbGUqJywgJ2RpcCcsICdjb21wb3NlZCcsICdiaS1jdXJyeUAnLFxuXHRcdC8vIHNlcXVlbmNlc1xuXHRcdCdmaW5kLWxhc3QtZnJvbScsICd0cmltLWhlYWQtc2xpY2UnLCAnbWFwLWFzJywgJ2VhY2gtZnJvbScsICdub25lPycsICd0cmltLXRhaWwnLCAncGFydGl0aW9uJywgJ2lmLWVtcHR5JywgJ2FjY3VtdWxhdGUqJywgJ3JlamVjdCEnLCAnZmluZC1mcm9tJywgJ2FjY3VtdWxhdGUtYXMnLCAnY29sbGVjdG9yLWZvci1hcycsICdyZWplY3QnLCAnbWFwJywgJ21hcC1zdW0nLCAnYWNjdW11bGF0ZSEnLCAnMmVhY2gtZnJvbScsICdmb2xsb3cnLCAnc3VwcmVtdW0tYnknLCAnbWFwIScsICd1bmxlc3MtZW1wdHknLCAnY29sbGVjdG9yJywgJ3BhZGRpbmcnLCAncmVkdWNlLWluZGV4JywgJ3JlcGxpY2F0ZS1hcycsICdpbmZpbXVtLWJ5JywgJ3RyaW0tdGFpbC1zbGljZScsICdjb3VudCcsICdmaW5kLWluZGV4JywgJ2ZpbHRlcicsICdhY2N1bXVsYXRlKiEnLCAncmVqZWN0LWFzJywgJ21hcC1pbnRlZ2VycycsICdtYXAtZmluZCcsICdyZWR1Y2UnLCAnc2VsZWN0b3InLCAnaW50ZXJsZWF2ZScsICcybWFwJywgJ2ZpbHRlci1hcycsICdiaW5hcnktcmVkdWNlJywgJ21hcC1pbmRleC1hcycsICdmaW5kJywgJ3Byb2R1Y2UnLCAnZmlsdGVyIScsICdyZXBsaWNhdGUnLCAnY2FydGVzaWFuLW1hcCcsICdjYXJ0ZXNpYW4tZWFjaCcsICdmaW5kLWluZGV4LWZyb20nLCAnbWFwLWZpbmQtbGFzdCcsICczbWFwLWFzJywgJzNtYXAnLCAnZmluZC1sYXN0JywgJ3NlbGVjdG9yLWFzJywgJzJtYXAtYXMnLCAnMm1hcC1yZWR1Y2UnLCAnYWNjdW11bGF0ZScsICdlYWNoJywgJ2VhY2gtaW5kZXgnLCAnYWNjdW11bGF0ZSotYXMnLCAnd2hlbi1lbXB0eScsICdhbGw/JywgJ2NvbGxlY3Rvci1hcycsICdwdXNoLWVpdGhlcicsICduZXctbGlrZScsICdjb2xsZWN0b3ItZm9yJywgJzJzZWxlY3RvcicsICdwdXNoLWlmJywgJzJhbGw/JywgJ21hcC1yZWR1Y2UnLCAnM2VhY2gnLCAnYW55PycsICd0cmltLXNsaWNlJywgJzJyZWR1Y2UnLCAnY2hhbmdlLW50aCcsICdwcm9kdWNlLWFzJywgJzJlYWNoJywgJ3RyaW0nLCAndHJpbS1oZWFkJywgJ2NhcnRlc2lhbi1maW5kJywgJ21hcC1pbmRleCcsXG5cdFx0Ly8gbWF0aFxuXHRcdCdpZi16ZXJvJywgJ2VhY2gtaW50ZWdlcicsICd1bmxlc3MtemVybycsICcoZmluZC1pbnRlZ2VyKScsICd3aGVuLXplcm8nLCAnZmluZC1sYXN0LWludGVnZXInLCAnKGFsbC1pbnRlZ2Vycz8pJywgJ3RpbWVzJywgJyhlYWNoLWludGVnZXIpJywgJ2ZpbmQtaW50ZWdlcicsICdhbGwtaW50ZWdlcnM/Jyxcblx0XHQvLyBtYXRoLmNvbWJpbmF0b3JzXG5cdFx0J3VubGVzcy1uZWdhdGl2ZScsICdpZi1wb3NpdGl2ZScsICd3aGVuLXBvc2l0aXZlJywgJ3doZW4tbmVnYXRpdmUnLCAndW5sZXNzLXBvc2l0aXZlJywgJ2lmLW5lZ2F0aXZlJyxcblx0XHQvLyBjb21iaW5hdG9yc1xuXHRcdCdjYXNlJywgJzJjbGVhdmUnLCAnY29uZD5xdW90JywgJ2Nhc2U+cXVvdCcsICczY2xlYXZlJywgJ3dyb25nLXZhbHVlcycsICd0by1maXhlZC1wb2ludCcsICdhbGlzdD5xdW90JywgJ2NvbmQnLCAnY2xlYXZlJywgJ2NhbGwtZWZmZWN0JywgJ3JlY3Vyc2l2ZS1oYXNoY29kZScsICdzcHJlYWQnLCAnZGVlcC1zcHJlYWQ+cXVvdCcsXG5cdFx0Ly8gY29tYmluYXRvcnMuc2hvcnQtY2lyY3VpdFxuXHRcdCcyfHwnLCAnMHx8JywgJ258fCcsICcwJiYnLCAnMiYmJywgJzN8fCcsICcxfHwnLCAnMSYmJywgJ24mJicsICczJiYnLFxuXHRcdC8vIGNvbWJpbmF0b3JzLnNtYXJ0XG5cdFx0J3NtYXJ0LXVubGVzcyonLCAna2VlcC1pbnB1dHMnLCAncmVkdWNlLW91dHB1dHMnLCAnc21hcnQtd2hlbionLCAnY2xlYXZlPmFycmF5JywgJ3NtYXJ0LXdpdGgnLCAnc21hcnQtYXBwbHknLCAnc21hcnQtaWYnLCAnaW5wdXRzL291dHB1dHMnLCAnb3V0cHV0PnNlcXVlbmNlLW4nLCAnbWFwLW91dHB1dHMnLCAnbWFwLXJlZHVjZS1vdXRwdXRzJywgJ2Ryb3BwaW5nJywgJ291dHB1dD5hcnJheScsICdzbWFydC1tYXAtcmVkdWNlJywgJ3NtYXJ0LTJtYXAtcmVkdWNlJywgJ291dHB1dD5hcnJheS1uJywgJ251bGxhcnknLCAnaW5wdXQ8c2VxdWVuY2UnLCAnYXBwZW5kLW91dHB1dHMnLCAnZHJvcC1pbnB1dHMnLCAnaW5wdXRzJywgJ3NtYXJ0LTJyZWR1Y2UnLCAnZHJvcC1vdXRwdXRzJywgJ3NtYXJ0LXJlZHVjZScsICdwcmVzZXJ2aW5nJywgJ3NtYXJ0LXdoZW4nLCAnb3V0cHV0cycsICdhcHBlbmQtb3V0cHV0cy1hcycsICdzbWFydC11bmxlc3MnLCAnc21hcnQtaWYqJywgJ3N1bS1vdXRwdXRzJywgJ2lucHV0PHNlcXVlbmNlLXVuc2FmZScsICdvdXRwdXQ+c2VxdWVuY2UnLFxuXHRcdC8vIHRhZm5cblx0XTtcblxuXHRmYWN0b3IuY29tYmluYXRvcnMucGF0dGVybiA9IGFyclRvV29yZHNSZWdFeHAoY29tYmluYXRvcnMpO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5mYWN0b3IgPSBmYWN0b3I7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHQvKipcblx0ICogQmFzZWQgb24gdGhlIG1hbnVhbCBieSBXb3V0ZXIgdmFuIE9vcnRtZXJzc2VuLlxuXHQgKlxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vUHJpc21KUy9wcmlzbS9pc3N1ZXMvMjgwMSNpc3N1ZS04Mjk3MTc1MDR9XG5cdCAqL1xuXHRQcmlzbS5sYW5ndWFnZXNbJ2ZhbHNlJ10gPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFx7W159XSpcXH0vXG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiW15cIl0qXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnY2hhcmFjdGVyLWNvZGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvJyg/OlteXFxyXXxcXHJcXG4/KS8sXG5cdFx0XHRhbGlhczogJ251bWJlcidcblx0XHR9LFxuXHRcdCdhc3NlbWJsZXItY29kZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGQrYC8sXG5cdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHR9LFxuXHRcdCdudW1iZXInOiAvXFxkKy8sXG5cdFx0J29wZXJhdG9yJzogL1stISMkJSYnKissLi86Oz0+P0BcXFxcXl9gfH5cdTAwREZcdTAwRjhdLyxcblx0XHQncHVuY3R1YXRpb24nOiAvXFxbfFxcXS8sXG5cdFx0J3ZhcmlhYmxlJzogL1thLXpdLyxcblx0XHQnbm9uLXN0YW5kYXJkJzoge1xuXHRcdFx0cGF0dGVybjogL1soKTxCRE9cdTAwQUVdLyxcblx0XHRcdGFsaWFzOiAnYm9sZCdcblx0XHR9XG5cdH07XG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlc1snZmlyZXN0b3JlLXNlY3VyaXR5LXJ1bGVzJ10gPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J2NvbW1lbnQnOiAvXFwvXFwvLiovLFxuXHQna2V5d29yZCc6IC9cXGIoPzphbGxvd3xmdW5jdGlvbnxpZnxtYXRjaHxudWxsfHJldHVybnxydWxlc192ZXJzaW9ufHNlcnZpY2UpXFxiLyxcblx0J29wZXJhdG9yJzogLyYmfFxcfFxcfHxbPD4hPV09P3xbLSsqLyVdfFxcYig/OmlufGlzKVxcYi8sXG59KTtcblxuZGVsZXRlIFByaXNtLmxhbmd1YWdlc1snZmlyZXN0b3JlLXNlY3VyaXR5LXJ1bGVzJ11bJ2NsYXNzLW5hbWUnXTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZmlyZXN0b3JlLXNlY3VyaXR5LXJ1bGVzJywgJ2tleXdvcmQnLCB7XG5cdCdwYXRoJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXFxzKCksXSkoPzpcXC8oPzpbXFx3XFx4QTAtXFx1RkZGRl0rfFxce1tcXHdcXHhBMC1cXHVGRkZGXSsoPzo9XFwqXFwqKT9cXH18XFwkXFwoW1xcd1xceEEwLVxcdUZGRkYuXStcXCkpKSsvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3ZhcmlhYmxlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFx7W1xcd1xceEEwLVxcdUZGRkZdKyg/Oj1cXCpcXCopP1xcfXxcXCRcXChbXFx3XFx4QTAtXFx1RkZGRi5dK1xcKS8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdvcGVyYXRvcic6IC89Lyxcblx0XHRcdFx0XHQna2V5d29yZCc6IC9cXCpcXCovLFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bLiQoKXt9XS9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC8vXG5cdFx0fVxuXHR9LFxuXHQnbWV0aG9kJzoge1xuXHRcdC8vIHRvIG1ha2UgdGhlIHBhdHRlcm4gc2hvcnRlciwgdGhlIGFjdHVhbCBtZXRob2QgbmFtZXMgYXJlIG9taXR0ZWRcblx0XHRwYXR0ZXJuOiAvKFxcYmFsbG93XFxzKylbYS16XSsoPzpcXHMqLFxccypbYS16XSspKig/PVxccypbOjtdKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2J1aWx0aW4nLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogLywvXG5cdFx0fVxuXHR9LFxufSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0UHJpc20ubGFuZ3VhZ2VzLmZsb3cgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdqYXZhc2NyaXB0Jywge30pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2Zsb3cnLCAna2V5d29yZCcsIHtcblx0XHQndHlwZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcYig/OltCYl1vb2xlYW58RnVuY3Rpb258W05uXXVtYmVyfFtTc110cmluZ3xbU3NdeW1ib2x8YW55fG1peGVkfG51bGx8dm9pZClcXGIvLFxuXHRcdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdFx0XHR9XG5cdFx0XVxuXHR9KTtcblx0UHJpc20ubGFuZ3VhZ2VzLmZsb3dbJ2Z1bmN0aW9uLXZhcmlhYmxlJ10ucGF0dGVybiA9IC8oPyFcXHMpW18kYS16XFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqKD89XFxzKj1cXHMqKD86ZnVuY3Rpb25cXGJ8KD86XFwoW14oKV0qXFwpKD86XFxzKjpcXHMqXFx3Kyk/fCg/IVxccylbXyRhLXpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSopXFxzKj0+KSkvaTtcblx0ZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5mbG93WydwYXJhbWV0ZXInXTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdmbG93JywgJ29wZXJhdG9yJywge1xuXHRcdCdmbG93LXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogL1xce1xcfHxcXHxcXH0vLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9XG5cdH0pO1xuXG5cdGlmICghQXJyYXkuaXNBcnJheShQcmlzbS5sYW5ndWFnZXMuZmxvdy5rZXl3b3JkKSkge1xuXHRcdFByaXNtLmxhbmd1YWdlcy5mbG93LmtleXdvcmQgPSBbUHJpc20ubGFuZ3VhZ2VzLmZsb3cua2V5d29yZF07XG5cdH1cblx0UHJpc20ubGFuZ3VhZ2VzLmZsb3cua2V5d29yZC51bnNoaWZ0KFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXiRdXFxiKSg/OkNsYXNzfGRlY2xhcmV8b3BhcXVlfHR5cGUpXFxiKD8hXFwkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14kXVxcQilcXCQoPzpEaWZmfEVudW18RXhhY3R8S2V5c3xPYmpNYXB8UHJvcGVydHlUeXBlfFJlY29yZHxTaGFwZXxTdWJ0eXBlfFN1cGVydHlwZXxhd2FpdClcXGIoPyFcXCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdCk7XG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5mb3J0cmFuID0ge1xuXHQncXVvdGVkLW51bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvW0JPWl0oWydcIl0pW0EtRjAtOV0rXFwxL2ksXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyg/OlxcYlxcdytfKT8oWydcIl0pKD86XFwxXFwxfCYoPzpcXHJcXG4/fFxcbikoPzpbIFxcdF0qIS4qKD86XFxyXFxuP3xcXG4pfCg/IVsgXFx0XSohKSl8KD8hXFwxKS4pKig/OlxcMXwmKS8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnY29tbWVudCc6IHtcblx0XHRcdFx0cGF0dGVybjogLygmKD86XFxyXFxuP3xcXG4pXFxzKikhLiovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvIS4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2Jvb2xlYW4nOiAvXFwuKD86RkFMU0V8VFJVRSlcXC4oPzpfXFx3Kyk/L2ksXG5cdCdudW1iZXInOiAvKD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OltFRF1bKy1dP1xcZCspPyg/Ol9cXHcrKT8vaSxcblx0J2tleXdvcmQnOiBbXG5cdFx0Ly8gVHlwZXNcblx0XHQvXFxiKD86Q0hBUkFDVEVSfENPTVBMRVh8RE9VQkxFID9QUkVDSVNJT058SU5URUdFUnxMT0dJQ0FMfFJFQUwpXFxiL2ksXG5cdFx0Ly8gRU5EIHN0YXRlbWVudHNcblx0XHQvXFxiKD86RU5EID8pPyg/OkJMT0NLID9EQVRBfERPfEZJTEV8Rk9SQUxMfEZVTkNUSU9OfElGfElOVEVSRkFDRXxNT0RVTEUoPyEgUFJPQ0VEVVJFKXxQUk9HUkFNfFNFTEVDVHxTVUJST1VUSU5FfFRZUEV8V0hFUkUpXFxiL2ksXG5cdFx0Ly8gU3RhdGVtZW50c1xuXHRcdC9cXGIoPzpBTExPQ0FUQUJMRXxBTExPQ0FURXxCQUNLU1BBQ0V8Q0FMTHxDQVNFfENMT1NFfENPTU1PTnxDT05UQUlOU3xDT05USU5VRXxDWUNMRXxEQVRBfERFQUxMT0NBVEV8RElNRU5TSU9OfERPfEVORHxFUVVJVkFMRU5DRXxFWElUfEVYVEVSTkFMfEZPUk1BVHxHTyA/VE98SU1QTElDSVQoPzogTk9ORSk/fElOUVVJUkV8SU5URU5UfElOVFJJTlNJQ3xNT0RVTEUgUFJPQ0VEVVJFfE5BTUVMSVNUfE5VTExJRll8T1BFTnxPUFRJT05BTHxQQVJBTUVURVJ8UE9JTlRFUnxQUklOVHxQUklWQVRFfFBVQkxJQ3xSRUFEfFJFVFVSTnxSRVdJTkR8U0FWRXxTRUxFQ1R8U1RPUHxUQVJHRVR8V0hJTEV8V1JJVEUpXFxiL2ksXG5cdFx0Ly8gT3RoZXJzXG5cdFx0L1xcYig/OkFTU0lHTk1FTlR8REVGQVVMVHxFTEVNRU5UQUx8RUxTRXxFTFNFSUZ8RUxTRVdIRVJFfEVOVFJZfElOfElOQ0xVREV8SU5PVVR8S0lORHxOVUxMfE9OTFl8T1BFUkFUT1J8T1VUfFBVUkV8UkVDVVJTSVZFfFJFU1VMVHxTRVFVRU5DRXxTVEFUfFRIRU58VVNFKVxcYi9pXG5cdF0sXG5cdCdvcGVyYXRvcic6IFtcblx0XHQvXFwqXFwqfFxcL1xcL3w9PnxbPVxcL109fFs8Pl09P3w6OnxbK1xcLSo9JV18XFwuW0EtWl0rXFwuL2ksXG5cdFx0e1xuXHRcdFx0Ly8gVXNlIGxvb2tiZWhpbmQgdG8gcHJldmVudCBjb25mdXNpb24gd2l0aCAoLyAvKVxuXHRcdFx0cGF0dGVybjogLyhefCg/IVxcKCkuKVxcLyg/IVxcKSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J3B1bmN0dWF0aW9uJzogL1xcKFxcL3xcXC9cXCl8WygpLDs6Jl0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0Ly8gaHR0cHM6Ly9mcmVlbWFya2VyLmFwYWNoZS5vcmcvZG9jcy9kZ3VpX3RlbXBsYXRlX2V4cC5odG1sXG5cblx0Ly8gRlRMIGV4cHJlc3Npb24gd2l0aCA0IGxldmVscyBvZiBuZXN0aW5nIHN1cHBvcnRlZFxuXHR2YXIgRlRMX0VYUFIgPSAvW148KClcIiddfFxcKCg/OjxleHByPikqXFwpfDwoPyEjLS0pfDwjLS0oPzpbXi1dfC0oPyEtPikpKi0tPnxcIig/OlteXFxcXFwiXXxcXFxcLikqXCJ8Jyg/OlteXFxcXCddfFxcXFwuKSonLy5zb3VyY2U7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgMjsgaSsrKSB7XG5cdFx0RlRMX0VYUFIgPSBGVExfRVhQUi5yZXBsYWNlKC88ZXhwcj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gRlRMX0VYUFI7IH0pO1xuXHR9XG5cdEZUTF9FWFBSID0gRlRMX0VYUFIucmVwbGFjZSgvPGV4cHI+L2csIC9bXlxcc1xcU10vLnNvdXJjZSk7XG5cblx0dmFyIGZ0bCA9IHtcblx0XHQnY29tbWVudCc6IC88Iy0tW1xcc1xcU10qPy0tPi8sXG5cdFx0J3N0cmluZyc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gcmF3IHN0cmluZ1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxicihcInwnKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSpcXDEvLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKFwifCcpKD86KD8hXFwxfFxcJFxceylbXlxcXFxdfFxcXFwufFxcJFxceyg/Oig/IVxcfSkoPzo8ZXhwcj4pKSpcXH0pKlxcMS8uc291cmNlLnJlcGxhY2UoLzxleHByPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBGVExfRVhQUjsgfSkpLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oKD86XnxbXlxcXFxdKSg/OlxcXFxcXFxcKSopXFwkXFx7KD86KD8hXFx9KSg/OjxleHByPikpKlxcfS8uc291cmNlLnJlcGxhY2UoLzxleHByPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBGVExfRVhQUjsgfSkpLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcJFxce3xcXH0kLyxcblx0XHRcdFx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRyZXN0OiBudWxsXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQna2V5d29yZCc6IC9cXGIoPzphcylcXGIvLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0XHQnYnVpbHRpbi1mdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxbXj9dKVxcP1xccyopXFx3Ky8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXHRcdCdmdW5jdGlvbic6IC9cXGJcXHcrKD89XFxzKlxcKCkvLFxuXHRcdCdudW1iZXInOiAvXFxiXFxkKyg/OlxcLlxcZCspP1xcYi8sXG5cdFx0J29wZXJhdG9yJzogL1xcLlxcLls8KiFdP3wtPnwtLXxcXCtcXCt8JiZ8XFx8XFx8fFxcP3sxLDJ9fFstKyovJSE9PD5dPT98XFxiKD86Z3R8Z3RlfGx0fGx0ZSlcXGIvLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bLDsuOigpW1xcXXt9XS9cblx0fTtcblxuXHRmdGwuc3RyaW5nWzFdLmluc2lkZS5pbnRlcnBvbGF0aW9uLmluc2lkZS5yZXN0ID0gZnRsO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5mdGwgPSB7XG5cdFx0J2Z0bC1jb21tZW50Jzoge1xuXHRcdFx0Ly8gdGhlIHBhdHRlcm4gaXMgc2hvcnRlbmVkIHRvIGJlIG1vcmUgZWZmaWNpZW50XG5cdFx0XHRwYXR0ZXJuOiAvXjwjLS1bXFxzXFxTXSovLFxuXHRcdFx0YWxpYXM6ICdjb21tZW50J1xuXHRcdH0sXG5cdFx0J2Z0bC1kaXJlY3RpdmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXjxbXFxzXFxTXSs+JC8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2RpcmVjdGl2ZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF48XFwvPylbI0BdW2Etel1cXHcqL2ksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9ePFxcLz98XFwvPz4kLyxcblx0XHRcdFx0J2NvbnRlbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xccypcXFNbXFxzXFxTXSovLFxuXHRcdFx0XHRcdGFsaWFzOiAnZnRsJyxcblx0XHRcdFx0XHRpbnNpZGU6IGZ0bFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnZnRsLWludGVycG9sYXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXlxcJFxce1tcXHNcXFNdKlxcfSQvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFwkXFx7fFxcfSQvLFxuXHRcdFx0XHQnY29udGVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxzKlxcU1tcXHNcXFNdKi8sXG5cdFx0XHRcdFx0YWxpYXM6ICdmdGwnLFxuXHRcdFx0XHRcdGluc2lkZTogZnRsXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby11c2VsZXNzLWxhenlcblx0XHR2YXIgcGF0dGVybiA9IFJlZ0V4cCgvPCMtLVtcXHNcXFNdKj8tLT58PFxcLz9bI0BdW2EtekEtWl0oPzo8ZXhwcj4pKj8+fFxcJFxceyg/OjxleHByPikqP1xcfS8uc291cmNlLnJlcGxhY2UoLzxleHByPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBGVExfRVhQUjsgfSksICdnaScpO1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS5idWlsZFBsYWNlaG9sZGVycyhlbnYsICdmdGwnLCBwYXR0ZXJuKTtcblx0fSk7XG5cblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10udG9rZW5pemVQbGFjZWhvbGRlcnMoZW52LCAnZnRsJyk7XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5nYW1lbWFrZXJsYW5ndWFnZSA9IFByaXNtLmxhbmd1YWdlcy5nbWwgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J2tleXdvcmQnOiAvXFxiKD86YnJlYWt8Y2FzZXxjb250aW51ZXxkZWZhdWx0fGRvfGVsc2V8ZW51bXxleGl0fGZvcnxnbG9iYWx2YXJ8aWZ8cmVwZWF0fHJldHVybnxzd2l0Y2h8dW50aWx8dmFyfHdoaWxlKVxcYi8sXG5cdCdudW1iZXInOiAvKD86XFxiMHhbXFxkYS1mXSt8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspPylbdWxmXXswLDR9L2ksXG5cdCdvcGVyYXRvcic6IC8tLXxcXCtcXCt8Wy0rJS89XT0/fCE9fFxcKlxcKj89P3w8Wzw9Pl0/fD5bPT5dP3wmJj98XFxeXFxeP3xcXHxcXHw/fH58XFxiKD86YW5kfGF0fG5vdHxvcnx3aXRofHhvcilcXGIvLFxuXHQnY29uc3RhbnQnOiAvXFxiKD86R01fYnVpbGRfZGF0ZXxHTV92ZXJzaW9ufGFjdGlvbl8oPzpjb250aW51ZXxyZXN0YXJ0fHJldmVyc2V8c3RvcCl8YWxsfGdhbWVzcGVlZF8oPzpmcHN8bWljcm9zZWNvbmRzKXxnbG9iYWx8bG9jYWx8bm9vbmV8b3RoZXJ8cGl8cG9pbnRlcl8oPzppbnZhbGlkfG51bGwpfHNlbGZ8dGltZXpvbmVfKD86bG9jYWx8dXRjKXx1bmRlZmluZWR8ZXZfKD86Y3JlYXRlfGRlc3Ryb3l8c3RlcHxhbGFybXxrZXlib2FyZHxtb3VzZXxjb2xsaXNpb258b3RoZXJ8ZHJhd3xkcmF3Xyg/OmJlZ2lufGVuZHxwb3N0fHByZSl8a2V5cHJlc3N8a2V5cmVsZWFzZXx0cmlnZ2VyfCg/OmxlZnR8bWlkZGxlfG5vfHJpZ2h0KV9idXR0b258KD86bGVmdHxtaWRkbGV8cmlnaHQpX3ByZXNzfCg/OmxlZnR8bWlkZGxlfHJpZ2h0KV9yZWxlYXNlfG1vdXNlXyg/OmVudGVyfGxlYXZlfHdoZWVsX2Rvd258d2hlZWxfdXApfGdsb2JhbF8oPzpsZWZ0fG1pZGRsZXxyaWdodClfYnV0dG9ufGdsb2JhbF8oPzpsZWZ0fG1pZGRsZXxyaWdodClfcHJlc3N8Z2xvYmFsXyg/OmxlZnR8bWlkZGxlfHJpZ2h0KV9yZWxlYXNlfGpveXN0aWNrKD86MXwyKV8oPzpidXR0b24xfGJ1dHRvbjJ8YnV0dG9uM3xidXR0b240fGJ1dHRvbjV8YnV0dG9uNnxidXR0b243fGJ1dHRvbjh8ZG93bnxsZWZ0fHJpZ2h0fHVwKXxvdXRzaWRlfGJvdW5kYXJ5fGdhbWVfc3RhcnR8Z2FtZV9lbmR8cm9vbV9zdGFydHxyb29tX2VuZHxub19tb3JlX2xpdmVzfGFuaW1hdGlvbl9lbmR8ZW5kX29mX3BhdGh8bm9fbW9yZV9oZWFsdGh8dXNlclxcZHxndWl8Z3VpX2JlZ2lufGd1aV9lbmR8c3RlcF8oPzpiZWdpbnxlbmR8bm9ybWFsKSl8dmtfKD86YWx0fGFueWtleXxiYWNrc3BhY2V8Y29udHJvbHxkZWxldGV8ZG93bnxlbmR8ZW50ZXJ8ZXNjYXBlfGhvbWV8aW5zZXJ0fGxlZnR8bm9rZXl8cGFnZWRvd258cGFnZXVwfHBhdXNlfHByaW50c2NyZWVufHJldHVybnxyaWdodHxzaGlmdHxzcGFjZXx0YWJ8dXB8ZlxcZHxudW1wYWRcXGR8YWRkfGRlY2ltYWx8ZGl2aWRlfGxhbHR8bGNvbnRyb2x8bHNoaWZ0fG11bHRpcGx5fHJhbHR8cmNvbnRyb2x8cnNoaWZ0fHN1YnRyYWN0KXxhY2hpZXZlbWVudF8oPzpmaWx0ZXJfKD86YWxsX3BsYXllcnN8ZmF2b3JpdGVzX29ubHl8ZnJpZW5kc19vbmx5KXxmcmllbmRzX2luZm98aW5mb3xsZWFkZXJib2FyZF9pbmZvfG91cl9pbmZvfHBpY19sb2FkZWR8c2hvd18oPzphY2hpZXZlbWVudHxiYW5rfGZyaWVuZF9waWNrZXJ8bGVhZGVyYm9hcmR8cHJvZmlsZXxwdXJjaGFzZV9wcm9tcHR8dWkpfHR5cGVfY2hhbGxlbmdlfHR5cGVfc2NvcmVfY2hhbGxlbmdlKXxhc3NldF8oPzpmb250fG9iamVjdHxwYXRofHJvb218c2NyaXB0fHNoYWRlcnxzb3VuZHxzcHJpdGV8dGlsZXN8dGltZWxpbmV8dW5rbm93bil8YXVkaW9fKD86M2R8ZmFsbG9mZl8oPzpleHBvbmVudF9kaXN0YW5jZXxleHBvbmVudF9kaXN0YW5jZV9jbGFtcGVkfGludmVyc2VfZGlzdGFuY2V8aW52ZXJzZV9kaXN0YW5jZV9jbGFtcGVkfGxpbmVhcl9kaXN0YW5jZXxsaW5lYXJfZGlzdGFuY2VfY2xhbXBlZHxub25lKXxtb25vfG5ld19zeXN0ZW18b2xkX3N5c3RlbXxzdGVyZW8pfGJtXyg/OmFkZHxjb21wbGV4fGRlc3RfYWxwaGF8ZGVzdF9jb2xvcnxkZXN0X2NvbG91cnxpbnZfZGVzdF9hbHBoYXxpbnZfZGVzdF9jb2xvcnxpbnZfZGVzdF9jb2xvdXJ8aW52X3NyY19hbHBoYXxpbnZfc3JjX2NvbG9yfGludl9zcmNfY29sb3VyfG1heHxub3JtYWx8b25lfHNyY19hbHBoYXxzcmNfYWxwaGFfc2F0fHNyY19jb2xvcnxzcmNfY29sb3VyfHN1YnRyYWN0fHplcm8pfGJyb3dzZXJfKD86Y2hyb21lfGZpcmVmb3h8aWV8aWVfbW9iaWxlfG5vdF9hX2Jyb3dzZXJ8b3BlcmF8c2FmYXJpfHNhZmFyaV9tb2JpbGV8dGl6ZW58dW5rbm93bnx3aW5kb3dzX3N0b3JlKXxidWZmZXJfKD86Ym9vbHxmMTZ8ZjMyfGY2NHxmYXN0fGZpeGVkfGdlbmVyYWxlcnJvcnxncm93fGludmFsaWR0eXBlfG5ldHdvcmt8b3V0b2Zib3VuZHN8b3V0b2ZzcGFjZXxzMTZ8czMyfHM4fHNlZWtfZW5kfHNlZWtfcmVsYXRpdmV8c2Vla19zdGFydHxzdHJpbmd8dGV4dHx1MTZ8dTMyfHU2NHx1OHx2YnVmZmVyfHdyYXApfGNfKD86YXF1YXxibGFja3xibHVlfGRrZ3JheXxmdWNoc2lhfGdyYXl8Z3JlZW58bGltZXxsdGdyYXl8bWFyb29ufG5hdnl8b2xpdmV8b3JhbmdlfHB1cnBsZXxyZWR8c2lsdmVyfHRlYWx8d2hpdGV8eWVsbG93KXxjbXBmdW5jXyg/OmFsd2F5c3xlcXVhbHxncmVhdGVyfGdyZWF0ZXJlcXVhbHxsZXNzfGxlc3NlcXVhbHxuZXZlcnxub3RlcXVhbCl8Y3JfKD86YXBwc3RhcnR8YXJyb3d8YmVhbXxjcm9zc3xkZWZhdWx0fGRyYWd8aGFuZHBvaW50fGhvdXJnbGFzc3xub25lfHNpemVfYWxsfHNpemVfbmVzd3xzaXplX25zfHNpemVfbndzZXxzaXplX3dlfHVwYXJyb3cpfGN1bGxfKD86Y2xvY2t3aXNlfGNvdW50ZXJjbG9ja3dpc2V8bm9jdWxsaW5nKXxkZXZpY2VfKD86ZW11bGF0b3J8dGFibGV0KXxkZXZpY2VfaW9zXyg/OmlwYWR8aXBhZF9yZXRpbmF8aXBob25lfGlwaG9uZTV8aXBob25lNnxpcGhvbmU2cGx1c3xpcGhvbmVfcmV0aW5hfHVua25vd24pfGRpc3BsYXlfKD86bGFuZHNjYXBlfGxhbmRzY2FwZV9mbGlwcGVkfHBvcnRyYWl0fHBvcnRyYWl0X2ZsaXBwZWQpfGRsbF8oPzpjZGVjbHxjZGVsfHN0ZGNhbGwpfGRzX3R5cGVfKD86Z3JpZHxsaXN0fG1hcHxwcmlvcml0eXxxdWV1ZXxzdGFjayl8ZWZfKD86Y2xvdWR8ZWxsaXBzZXxleHBsb3Npb258ZmlyZXdvcmt8ZmxhcmV8cmFpbnxyaW5nfHNtb2tlfHNtb2tldXB8c25vd3xzcGFya3xzdGFyKXxmYV8oPzphcmNoaXZlfGJvdHRvbXxjZW50ZXJ8ZGlyZWN0b3J5fGhpZGRlbnxsZWZ0fG1pZGRsZXxyZWFkb25seXxyaWdodHxzeXNmaWxlfHRvcHx2b2x1bWVpZCl8ZmJfbG9naW5fKD86ZGVmYXVsdHxmYWxsYmFja190b193ZWJ2aWV3fGZvcmNpbmdfc2FmYXJpfGZvcmNpbmdfd2Vidmlld3xub19mYWxsYmFja190b193ZWJ2aWV3fHVzZV9zeXN0ZW1fYWNjb3VudCl8aWFwXyg/OmF2YWlsYWJsZXxjYW5jZWxlZHxldl9jb25zdW1lfGV2X3Byb2R1Y3R8ZXZfcHVyY2hhc2V8ZXZfcmVzdG9yZXxldl9zdG9yZWxvYWR8ZmFpbGVkfHB1cmNoYXNlZHxyZWZ1bmRlZHxzdGF0dXNfYXZhaWxhYmxlfHN0YXR1c19sb2FkaW5nfHN0YXR1c19wcm9jZXNzaW5nfHN0YXR1c19yZXN0b3Jpbmd8c3RhdHVzX3VuYXZhaWxhYmxlfHN0YXR1c191bmluaXRpYWxpc2VkfHN0b3JlbG9hZF9mYWlsZWR8c3RvcmVsb2FkX29rfHVuYXZhaWxhYmxlKXxsZWFkZXJib2FyZF90eXBlXyg/Om51bWJlcnx0aW1lX21pbnNfc2Vjcyl8bGlnaHR0eXBlXyg/OmRpcnxwb2ludCl8bWF0cml4Xyg/OnByb2plY3Rpb258dmlld3x3b3JsZCl8bWJfKD86YW55fGxlZnR8bWlkZGxlfG5vbmV8cmlnaHQpfG5ldHdvcmtfKD86Y29uZmlnXyg/OmNvbm5lY3RfdGltZW91dHxkaXNhYmxlX3JlbGlhYmxlX3VkcHxlbmFibGVfcmVsaWFibGVfdWRwfHVzZV9ub25fYmxvY2tpbmdfc29ja2V0KXxzb2NrZXRfKD86Ymx1ZXRvb3RofHRjcHx1ZHApfHR5cGVfKD86Y29ubmVjdHxkYXRhfGRpc2Nvbm5lY3R8bm9uX2Jsb2NraW5nX2Nvbm5lY3QpKXxvZl9jaGFsbGVuZ2VfKD86bG9zZXx0aWV8d2luKXxvc18oPzphbmRyb2lkfGlvc3xsaW51eHxtYWNvc3h8cHMzfHBzNHxwc3ZpdGF8dW5rbm93bnx1d3B8d2luMzJ8d2luOG5hdGl2ZXx3aW5kb3dzfHdpbnBob25lfHhib3hvbmUpfHBoeV9kZWJ1Z19yZW5kZXJfKD86YWFiYnxjb2xsaXNpb25fcGFpcnN8Y29tc3xjb3JlX3NoYXBlc3xqb2ludHN8b2JifHNoYXBlcyl8cGh5X2pvaW50Xyg/OmFuY2hvcl8xX3h8YW5jaG9yXzFfeXxhbmNob3JfMl94fGFuY2hvcl8yX3l8YW5nbGV8YW5nbGVfbGltaXRzfGRhbXBpbmdfcmF0aW98ZnJlcXVlbmN5fGxlbmd0aF8xfGxlbmd0aF8yfGxvd2VyX2FuZ2xlX2xpbWl0fG1heF9mb3JjZXxtYXhfbGVuZ3RofG1heF9tb3Rvcl9mb3JjZXxtYXhfbW90b3JfdG9ycXVlfG1heF90b3JxdWV8bW90b3JfZm9yY2V8bW90b3Jfc3BlZWR8bW90b3JfdG9ycXVlfHJlYWN0aW9uX2ZvcmNlX3h8cmVhY3Rpb25fZm9yY2VfeXxyZWFjdGlvbl90b3JxdWV8c3BlZWR8dHJhbnNsYXRpb258dXBwZXJfYW5nbGVfbGltaXQpfHBoeV9wYXJ0aWNsZV9kYXRhX2ZsYWdfKD86Y2F0ZWdvcnl8Y29sb3J8Y29sb3VyfHBvc2l0aW9ufHR5cGVmbGFnc3x2ZWxvY2l0eSl8cGh5X3BhcnRpY2xlX2ZsYWdfKD86Y29sb3JtaXhpbmd8Y29sb3VybWl4aW5nfGVsYXN0aWN8cG93ZGVyfHNwcmluZ3x0ZW5zaWxlfHZpc2NvdXN8d2FsbHx3YXRlcnx6b21iaWUpfHBoeV9wYXJ0aWNsZV9ncm91cF9mbGFnXyg/OnJpZ2lkfHNvbGlkKXxwcl8oPzpsaW5lbGlzdHxsaW5lc3RyaXB8cG9pbnRsaXN0fHRyaWFuZ2xlZmFufHRyaWFuZ2xlbGlzdHx0cmlhbmdsZXN0cmlwKXxwc18oPzpkaXN0cnxzaGFwZSlfKD86ZGlhbW9uZHxlbGxpcHNlfGdhdXNzaWFufGludmdhdXNzaWFufGxpbmV8bGluZWFyfHJlY3RhbmdsZSl8cHRfc2hhcGVfKD86Y2lyY2xlfGNsb3VkfGRpc2t8ZXhwbG9zaW9ufGZsYXJlfGxpbmV8cGl4ZWx8cmluZ3xzbW9rZXxzbm93fHNwYXJrfHNwaGVyZXxzcXVhcmV8c3Rhcil8dHlfKD86cmVhbHxzdHJpbmcpfGdwXyg/OmZhY2VcXGR8YXhpc2xofGF4aXNsdnxheGlzcmh8YXhpc3J2fHBhZGR8cGFkbHxwYWRyfHBhZHV8c2VsZWN0fHNob3VsZGVybHxzaG91bGRlcmxifHNob3VsZGVycnxzaG91bGRlcnJifHN0YXJ0fHN0aWNrbHxzdGlja3IpfGxiX2Rpc3BfKD86bm9uZXxudW1lcmljfHRpbWVfbXN8dGltZV9zZWMpfGxiX3NvcnRfKD86YXNjZW5kaW5nfGRlc2NlbmRpbmd8bm9uZSl8b3ZfKD86YWNoaWV2ZW1lbnRzfGNvbW11bml0eXxmcmllbmRzfGdhbWVncm91cHxwbGF5ZXJzfHNldHRpbmdzKXx1Z2NfKD86ZmlsZXR5cGVfKD86Y29tbXVuaXR5fG1pY3JvdHJhbnMpfGxpc3RfKD86RmF2b3JpdGVkfEZvbGxvd2VkfFB1Ymxpc2hlZHxTdWJzY3JpYmVkfFVzZWRPclBsYXllZHxWb3RlZERvd258Vm90ZWRPbnxWb3RlZFVwfFdpbGxWb3RlTGF0ZXIpfG1hdGNoXyg/OkFsbEd1aWRlc3xBcnR3b3JrfENvbGxlY3Rpb25zfENvbnRyb2xsZXJCaW5kaW5nc3xJbnRlZ3JhdGVkR3VpZGVzfEl0ZW1zfEl0ZW1zX010eHxJdGVtc19SZWFkeVRvVXNlfFNjcmVlbnNob3RzfFVzYWJsZUluR2FtZXxWaWRlb3N8V2ViR3VpZGVzKXxxdWVyeV8oPzpBY2NlcHRlZEZvckdhbWVSYW5rZWRCeUFjY2VwdGFuY2VEYXRlfENyZWF0ZWRCeUZyaWVuZHNSYW5rZWRCeVB1YmxpY2F0aW9uRGF0ZXxGYXZvcml0ZWRCeUZyaWVuZHNSYW5rZWRCeVB1YmxpY2F0aW9uRGF0ZXxOb3RZZXRSYXRlZCl8cXVlcnlfUmFua2VkQnkoPzpOdW1UaW1lc1JlcG9ydGVkfFB1YmxpY2F0aW9uRGF0ZXxUZXh0U2VhcmNofFRvdGFsVm90ZXNBc2N8VHJlbmR8Vm90ZXxWb3Rlc1VwKXxyZXN1bHRfc3VjY2Vzc3xzb3J0b3JkZXJfQ3JlYXRpb25PcmRlcig/OkFzY3xEZXNjKXxzb3J0b3JkZXJfKD86Rm9yTW9kZXJhdGlvbnxMYXN0VXBkYXRlZERlc2N8U3Vic2NyaXB0aW9uRGF0ZURlc2N8VGl0bGVBc2N8Vm90ZVNjb3JlRGVzYyl8dmlzaWJpbGl0eV8oPzpmcmllbmRzX29ubHl8cHJpdmF0ZXxwdWJsaWMpKXx2ZXJ0ZXhfdXNhZ2VfKD86Ymlub3JtYWx8YmxlbmRpbmRpY2VzfGJsZW5kd2VpZ2h0fGNvbG9yfGNvbG91cnxkZXB0aHxmb2d8bm9ybWFsfHBvc2l0aW9ufHBzaXplfHNhbXBsZXx0YW5nZW50fHRleGNvb3JkfHRleHRjb29yZCl8dmVydGV4X3R5cGVfKD86ZmxvYXRcXGR8Y29sb3J8Y29sb3VyfHVieXRlNCl8aW5wdXRfdHlwZXxsYXllcmVsZW1lbnR0eXBlXyg/OmJhY2tncm91bmR8aW5zdGFuY2V8b2xkdGlsZW1hcHxwYXJ0aWNsZXN5c3RlbXxzcHJpdGV8dGlsZXx0aWxlbWFwfHVuZGVmaW5lZCl8c2VfKD86Y2hvcnVzfGNvbXByZXNzb3J8ZWNob3xlcXVhbGl6ZXJ8ZmxhbmdlcnxnYXJnbGV8bm9uZXxyZXZlcmIpfHRleHRfdHlwZXx0aWxlXyg/OmZsaXB8aW5kZXhfbWFza3xtaXJyb3J8cm90YXRlKXwoPzpvYmp8cm18c2NyfHNwcilcXHcrKVxcYi8sXG5cdCd2YXJpYWJsZSc6IC9cXGIoPzphbGFybXxhcHBsaWNhdGlvbl9zdXJmYWNlfGFzeW5jX2xvYWR8YmFja2dyb3VuZF8oPzphbHBoYXxibGVuZHxjb2xvcnxjb2xvdXJ8Zm9yZWdyb3VuZHxoZWlnaHR8aHNwZWVkfGh0aWxlZHxpbmRleHxzaG93Y29sb3J8c2hvd2NvbG91cnx2aXNpYmxlfHZzcGVlZHx2dGlsZWR8d2lkdGh8eHx4c2NhbGV8eXx5c2NhbGUpfGJib3hfKD86Ym90dG9tfGxlZnR8cmlnaHR8dG9wKXxicm93c2VyXyg/OmhlaWdodHx3aWR0aCl8Y2FwdGlvbl8oPzpoZWFsdGh8bGl2ZXN8c2NvcmUpfGN1cnJlbnRfKD86ZGF5fGhvdXJ8bWludXRlfG1vbnRofHNlY29uZHx0aW1lfHdlZWtkYXl8eWVhcil8Y3Vyc29yX3Nwcml0ZXxkZWJ1Z19tb2RlfGRlbHRhX3RpbWV8ZGlyZWN0aW9ufGRpc3BsYXlfYWF8ZXJyb3JfKD86bGFzdHxvY2N1cnJlZCl8ZXZlbnRfKD86YWN0aW9ufG51bWJlcnxvYmplY3R8dHlwZSl8ZnBzfGZwc19yZWFsfGZyaWN0aW9ufGdhbWVfKD86ZGlzcGxheXxwcm9qZWN0fHNhdmUpXyg/OmlkfG5hbWUpfGdhbWVtYWtlcl8oPzpwcm98cmVnaXN0ZXJlZHx2ZXJzaW9uKXxncmF2aXR5fGdyYXZpdHlfZGlyZWN0aW9ufCg/Omh8dilzcGVlZHxoZWFsdGh8aWFwX2RhdGF8aWR8aW1hZ2VfKD86YWxwaGF8YW5nbGV8YmxlbmR8ZGVwdGh8aW5kZXh8bnVtYmVyfHNwZWVkfHhzY2FsZXx5c2NhbGUpfGluc3RhbmNlXyg/OmNvdW50fGlkKXxrZXlib2FyZF8oPzprZXl8bGFzdGNoYXJ8bGFzdGtleXxzdHJpbmcpfGxheWVyfGxpdmVzfG1hc2tfaW5kZXh8bW91c2VfKD86YnV0dG9ufGxhc3RidXR0b258eHx5KXxvYmplY3RfaW5kZXh8b3NfKD86YnJvd3NlcnxkZXZpY2V8dHlwZXx2ZXJzaW9uKXxwYXRoXyg/OmVuZGFjdGlvbnxpbmRleHxvcmllbnRhdGlvbnxwb3NpdGlvbnxwb3NpdGlvbnByZXZpb3VzfHNjYWxlfHNwZWVkKXxwZXJzaXN0ZW50fHBoeV8oPzpyb3RhdGlvbnwoPzpjb2xfbm9ybWFsfGNvbGxpc2lvbnxjb218bGluZWFyX3ZlbG9jaXR5fHBvc2l0aW9ufHNwZWVkKV8oPzp4fHkpfGFuZ3VsYXJfKD86ZGFtcGluZ3x2ZWxvY2l0eSl8cG9zaXRpb25fKD86eHx5KXByZXZpb3VzfHNwZWVkfGxpbmVhcl9kYW1waW5nfGJ1bGxldHxmaXhlZF9yb3RhdGlvbnxhY3RpdmV8bWFzc3xpbmVydGlhfGR5bmFtaWN8a2luZW1hdGljfHNsZWVwaW5nfGNvbGxpc2lvbl9wb2ludHMpfHBvaW50ZXJfKD86aW52YWxpZHxudWxsKXxyb29tfHJvb21fKD86Y2FwdGlvbnxmaXJzdHxoZWlnaHR8bGFzdHxwZXJzaXN0ZW50fHNwZWVkfHdpZHRoKXxzY29yZXxzZWN1cmVfbW9kZXxzaG93Xyg/OmhlYWx0aHxsaXZlc3xzY29yZSl8c29saWR8c3BlZWR8c3ByaXRlXyg/OmhlaWdodHxpbmRleHx3aWR0aHx4b2Zmc2V0fHlvZmZzZXQpfHRlbXBfZGlyZWN0b3J5fHRpbWVsaW5lXyg/OmluZGV4fGxvb3B8cG9zaXRpb258cnVubmluZ3xzcGVlZCl8dHJhbnNpdGlvbl8oPzpjb2xvcnxraW5kfHN0ZXBzKXx1bmRlZmluZWR8dmlld18oPzphbmdsZXxjdXJyZW50fGVuYWJsZWR8KD86aHx2KSg/OmJvcmRlcnxzcGVlZCl8KD86aHx3fHh8eSlwb3J0fCg/Omh8d3x4fHkpdmlld3xvYmplY3R8c3VyZmFjZV9pZHx2aXNpYmxlKXx2aXNpYmxlfHdlYmdsX2VuYWJsZWR8d29ya2luZ19kaXJlY3Rvcnl8KD86eHx5KSg/OnByZXZpb3VzfHN0YXJ0KXx4fHl8YXJndW1lbnQoPzpfcmVsaXRpdmV8X2NvdW50fFxcZCl8YXJndW1lbnR8Z2xvYmFsfGxvY2FsfG90aGVyfHNlbGYpXFxiL1xufSk7XG5cbi8vIGh0dHBzOi8vd3d3LmdhcC1zeXN0ZW0ub3JnL01hbnVhbHMvZG9jL3JlZi9jaGFwNC5odG1sXG4vLyBodHRwczovL3d3dy5nYXAtc3lzdGVtLm9yZy9NYW51YWxzL2RvYy9yZWYvY2hhcDI3Lmh0bWxcblxuUHJpc20ubGFuZ3VhZ2VzLmdhcCA9IHtcblx0J3NoZWxsJzoge1xuXHRcdHBhdHRlcm46IC9eZ2FwPltcXHNcXFNdKj8oPz1eZ2FwPnwkKD8hW1xcc1xcU10pKS9tLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdnYXAnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKGdhcD4pLisoPzooPzpcXHIoPzpcXG58KD8hXFxuKSl8XFxuKT4uKikqLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9eZ2FwPi9cblx0XHR9XG5cdH0sXG5cblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyMuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXCdcIl0pKD86Jyg/OlteXFxyXFxuXFxcXCddfFxcXFwuKXsxLDEwfSd8XCIoPzpbXlxcclxcblxcXFxcIl18XFxcXC4pKlwiKD8hXCIpfFwiXCJcIltcXHNcXFNdKj9cIlwiXCIpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdjb250aW51YXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oW1xcclxcbl0pPi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdCdrZXl3b3JkJzogL1xcYig/OkFzc2VydHxJbmZvfElzQm91bmR8UVVJVHxUcnlOZXh0TWV0aG9kfFVuYmluZHxhbmR8YXRvbWljfGJyZWFrfGNvbnRpbnVlfGRvfGVsaWZ8ZWxzZXxlbmR8Zml8Zm9yfGZ1bmN0aW9ufGlmfGlufGxvY2FsfG1vZHxub3R8b2R8b3J8cXVpdHxyZWFkb25seXxyZWFkd3JpdGV8cmVjfHJlcGVhdHxyZXR1cm58dGhlbnx1bnRpbHx3aGlsZSlcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXG5cdCdudW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFx3Ll18XFwuXFwuKSg/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzpbZUVdWystXT9cXGQrKT8oPzpfW2Etel0/KT8oPz0kfFteXFx3Ll18XFwuXFwuKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXG5cdCdjb250aW51YXRpb24nOiB7XG5cdFx0cGF0dGVybjogLyhbXFxyXFxuXSk+Lyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdH0sXG5cdCdvcGVyYXRvcic6IC8tPnxbLSsqL15+PSFdfDw+fFs8Pl09P3w6PXxcXC5cXC4vLFxuXHQncHVuY3R1YXRpb24nOiAvWygpW1xcXXt9LDsuOl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuZ2FwLnNoZWxsLmluc2lkZS5nYXAuaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLmdhcDtcblxuUHJpc20ubGFuZ3VhZ2VzLmdjb2RlID0ge1xuXHQnY29tbWVudCc6IC87Lip8XFxCXFwoLio/XFwpXFxCLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpcIlwifFteXCJdKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYltHTV1cXGQrKD86XFwuXFxkKyk/XFxiLyxcblx0J3Byb3BlcnR5JzogL1xcYltBLVpdLyxcblx0J2NoZWNrc3VtJzoge1xuXHRcdHBhdHRlcm46IC8oXFwqKVxcZCsvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdC8vIFQwOjA6MFxuXHQncHVuY3R1YXRpb24nOiAvWzoqXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5nZHNjcmlwdCA9IHtcblx0J2NvbW1lbnQnOiAvIy4qLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvQD8oPzooXCJ8JykoPzooPyFcXDEpW15cXG5cXFxcXXxcXFxcW1xcc1xcU10pKlxcMSg/IVwifCcpfFwiXCJcIig/OlteXFxcXF18XFxcXFtcXHNcXFNdKSo/XCJcIlwiKS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjbGFzcy1uYW1lJzoge1xuXHRcdC8vIGNsYXNzX25hbWUgRm9vLCBleHRlbmRzIEJhciwgY2xhc3MgSW5uZXJDbGFzc1xuXHRcdC8vIGV4cG9ydChpbnQpIHZhciBiYXosIGV4cG9ydChpbnQsIDApIHZhciBpXG5cdFx0Ly8gYXMgTm9kZVxuXHRcdC8vIGNvbnN0IEZPTzogaW50ID0gOSwgdmFyIGJhcjogYm9vbCA9IHRydWVcblx0XHQvLyBmdW5jIGFkZChyZWZlcmVuY2U6IEl0ZW0sIGFtb3VudDogaW50KSAtPiBJdGVtOlxuXHRcdHBhdHRlcm46IC8oXig/OmNsYXNzfGNsYXNzX25hbWV8ZXh0ZW5kcylbIFxcdF0rfF5leHBvcnRcXChbIFxcdF0qfFxcYmFzWyBcXHRdK3woPzpcXGIoPzpjb25zdHx2YXIpWyBcXHRdfFssKF0pWyBcXHRdKlxcdytbIFxcdF0qOlsgXFx0XSp8LT5bIFxcdF0qKVthLXpBLVpfXVxcdyovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFuZHxhc3xhc3NlcnR8YnJlYWt8YnJlYWtwb2ludHxjbGFzc3xjbGFzc19uYW1lfGNvbnN0fGNvbnRpbnVlfGVsaWZ8ZWxzZXxlbnVtfGV4cG9ydHxleHRlbmRzfGZvcnxmdW5jfGlmfGlufGlzfG1hc3RlcnxtYXN0ZXJzeW5jfG1hdGNofG5vdHxudWxsfG9ucmVhZHl8b3J8cGFzc3xwcmVsb2FkfHB1cHBldHxwdXBwZXRzeW5jfHJlbW90ZXxyZW1vdGVzeW5jfHJldHVybnxzZWxmfHNldGdldHxzaWduYWx8c3RhdGljfHRvb2x8dmFyfHdoaWxlfHlpZWxkKVxcYi8sXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89WyBcXHRdKlxcKCkvaSxcblx0J3ZhcmlhYmxlJzogL1xcJFxcdysvLFxuXHQnbnVtYmVyJzogW1xuXHRcdC9cXGIwYlswMV9dK1xcYnxcXGIweFtcXGRhLWZBLUZfXStcXGJ8KD86XFxiXFxkW1xcZF9dKig/OlxcLltcXGRfXSopP3xcXEJcXC5bXFxkX10rKSg/OmVbKy1dP1tcXGRfXSspP1xcYi8sXG5cdFx0L1xcYig/OklORnxOQU58UEl8VEFVKVxcYi9cblx0XSxcblx0J2NvbnN0YW50JzogL1xcYltBLVpdW0EtWl9cXGRdKlxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J29wZXJhdG9yJzogLy0+fDo9fCYmfFxcfFxcfHw8PHw+PnxbLSsqLyUmfCE8Pj1dPT98W35eXS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bLjosOygpW1xcXXt9XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5nZWRjb20gPSB7XG5cdCdsaW5lLXZhbHVlJzoge1xuXHRcdC8vIFByZWNlZGVkIGJ5IGxldmVsLCBvcHRpb25hbCBwb2ludGVyLCBhbmQgdGFnXG5cdFx0cGF0dGVybjogLyheW1xcdCBdKlxcZCsgKyg/OkBcXHdbXFx3IVwiJCUmJygpKissXFwtLi86Ozw9Pj9bXFxcXFxcXV5ge3x9flxceDgwLVxceGZlICNdKkAgKyk/XFx3KyApLisvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3BvaW50ZXInOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eQFxcd1tcXHchXCIkJSYnKCkqKyxcXC0uLzo7PD0+P1tcXFxcXFxdXmB7fH1+XFx4ODAtXFx4ZmUgI10qQCQvLFxuXHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J3JlY29yZCc6IHtcblx0XHQvLyBQcmVjZWRlZCBieSBsZXZlbCBhbmQgb3B0aW9uYWwgcG9pbnRlclxuXHRcdHBhdHRlcm46IC8oXltcXHQgXSpcXGQrICsoPzpAXFx3W1xcdyFcIiQlJicoKSorLFxcLS4vOjs8PT4/W1xcXFxcXF1eYHt8fX5cXHg4MC1cXHhmZSAjXSpAICspPylcXHcrL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3RhZydcblx0fSxcblx0J2xldmVsJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopXFxkKy9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdCdwb2ludGVyJzoge1xuXHRcdHBhdHRlcm46IC9AXFx3W1xcdyFcIiQlJicoKSorLFxcLS4vOjs8PT4/W1xcXFxcXF1eYHt8fX5cXHg4MC1cXHhmZSAjXSpALyxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9XG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuZ2V0dGV4dCA9IHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyMgLiovLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICd0cmFuc2xhdG9yLWNvbW1lbnQnXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvI1xcLi4qLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnZXh0cmFjdGVkLWNvbW1lbnQnXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvIzouKi8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ3JlZmVyZW5jZS1jb21tZW50J1xuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyMsLiovLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdmbGFnLWNvbW1lbnQnXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvI1xcfC4qLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHJldmlvdXNseS11bnRyYW5zbGF0ZWQtY29tbWVudCdcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8jLiovLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcIig/OlteXCJcXFxcXXxcXFxcLikqXCIvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL15tc2coPzpjdHh0fGlkfGlkX3BsdXJhbHxzdHIpXFxiL20sXG5cdCdudW1iZXInOiAvXFxiXFxkK1xcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxdXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5wbyA9IFByaXNtLmxhbmd1YWdlcy5nZXR0ZXh0O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIHRhYmxlUm93ID0gLyg/Olxccj9cXG58XFxyKVsgXFx0XSpcXHwuK1xcfCg/Oig/IVxcfCkuKSovLnNvdXJjZTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuZ2hlcmtpbiA9IHtcblx0XHQncHlzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFwiXCJcInwnJycpW1xcc1xcU10rP1xcMS8sXG5cdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHR9LFxuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKikjLiovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCd0YWcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKUBcXFMqL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnZmVhdHVyZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxcXHI/XFxufFxccilbIFxcdF0qKSg/OkFiaWxpdHl8QWhveSBtYXRleSF8QXJ3ZWRkfEFzcGVrdHxCZXNpZ2hlaWQgQmVob2VmdGV8QnVzaW5lc3MgTmVlZHxDYXJhY3RlcmlzdGljYXxDYXJhY3Rlclx1MDBFRHN0aWNhfEVnZW5za2FifEVnZW5za2FwfEVpZ2lubGVpa2l8RmVhdHVyZXxGXHUwMTJCXHUwMTBEYXxGaXR1cnxGb25jdGlvbm5hbGl0XHUwMEU5fEZvbmtzeW9uYWxpdGV8RnVuY2lvbmFsaWRhZGV8RnVuY2lvbmFsaXRhdHxGdW5jdGlvbmFsaXRhdGV8RnVuY1x1MDE2M2lvbmFsaXRhdGV8RnVuY1x1MDIxQmlvbmFsaXRhdGV8RnVuY3Rpb25hbGl0ZWl0fEZ1bmdzaXxGdW5rY2lhfEZ1bmtjaWphfEZ1bmtjaW9uYWxpdFx1MDEwMXRlfEZ1bmtjaW9uYWxub3N0fEZ1bmtjamF8RnVua3NpZXxGdW5rdGlvbmFsaXRcdTAwRTR0fEZ1bmt0aW9uYWxpdFx1MDBFOWl0fEZ1bnppb25hbGl0XHUwMEUwfEh3YWV0fEh3XHUwMEU2dHxKZWxsZW16XHUwMTUxfEthcmFrdGVyaXN0aWt8TGFzdG5vc3R8TWFrfE1vZ3Vjbm9zdHxsYUh8TW9ndVx1MDEwN25vc3R8TW96bm9zdGl8TW9cdTAxN0Vub3N0aXxPSCBIQUl8T21hZHVzfE9taW5haXN1dXN8T3NvYmluYXxcdTAwRDZ6ZWxsaWt8UG90cnplYmEgYml6bmVzb3dhfHBlcmJvZ2h8cG9RYm9naCBtYWxqYSd8UG9cdTAxN0VhZGF2ZWt8UG9cdTAxN0VpYWRhdmthfFByZXR0eSBtdWNofFFhcHxRdSdtZUggJ3V0fFNhdnliXHUwMTE3fFRcdTAwRURuaCBuXHUwMTAzbmd8VHJhanRvfFZlcm1vXHUwMEVCfFZsYXN0bm9zXHUwMTY1fFdcdTAxNDJhXHUwMTVCY2l3b1x1MDE1Qlx1MDEwN3xabmFcdTAxMERpbG5vc3R8XHUwMzk0XHUwM0M1XHUwM0JEXHUwM0IxXHUwM0M0XHUwM0NDXHUwM0M0XHUwM0I3XHUwM0M0XHUwM0IxfFx1MDM5Qlx1MDNCNVx1MDNCOVx1MDNDNFx1MDNCRlx1MDNDNVx1MDNDMVx1MDNCM1x1MDNBRlx1MDNCMXxcdTA0MUNcdTA0M0VcdTA0MzNcdTA0NDNcdTA0NUJcdTA0M0RcdTA0M0VcdTA0NDFcdTA0NDJ8XHUwNDFDXHUwNEU5XHUwNDNDXHUwNDNBXHUwNDM4XHUwNDNEXHUwNDNCXHUwNDM1XHUwNDNBfFx1MDQxRVx1MDQ0MVx1MDQzRVx1MDQzMVx1MDQzOFx1MDQzRFx1MDQzMHxcdTA0MjFcdTA0MzJcdTA0M0VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0M0V8XHUwNEFFXHUwNDM3XHUwNDM1XHUwNDNEXHUwNDQ3XHUwNEQ5XHUwNDNCXHUwNDM1XHUwNDNBXHUwNDNCXHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNBfFx1MDQyNFx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQzRVx1MDQzRFx1MDQzMFx1MDQzQnxcdTA0MjRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0MzhcdTA0M0VcdTA0M0RcdTA0MzBcdTA0M0JcdTA0M0RcdTA0M0VcdTA0NDFcdTA0NDJ8XHUwNDI0XHUwNDQzXHUwNDNEXHUwNDNBXHUwNDQ2XHUwNDM4XHUwNDRGfFx1MDQyNFx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Nlx1MDQ1Nlx1MDQzRVx1MDQzRFx1MDQzMFx1MDQzQnxcdTA1RUFcdTA1REJcdTA1RDVcdTA1RTBcdTA1RDR8XHUwNjJFXHUwNjI3XHUwNjM1XHUwNjRBXHUwNjI5fFx1MDYyRVx1MDYzNVx1MDY0OFx1MDYzNVx1MDZDQ1x1MDYyQXxcdTA2MzVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2Q0NcdTA2MkF8XHUwNkE5XHUwNjI3XHUwNjMxXHUwNjQ4XHUwNjI4XHUwNjI3XHUwNjMxIFx1MDZBOVx1MDZDQyBcdTA2MzZcdTA2MzFcdTA2NDhcdTA2MzFcdTA2MkF8XHUwNjQ4XHUwNjUwXHUwNkNDXHUwNjk4XHUwNkFGXHUwNkNDfFx1MDkzMFx1MDk0Mlx1MDkyQSBcdTA5MzJcdTA5NDdcdTA5MTZ8XHUwQTE2XHUwQTNFXHUwQTM4XHUwQTQwXHUwQTA1XHUwQTI0fFx1MEEyOFx1MEExNVx1MEEzNiBcdTBBMjhcdTBBNDFcdTBBMzlcdTBBM0VcdTBBMzB8XHUwQTJFXHUwQTQxXHUwQTM5XHUwQTNFXHUwQTAyXHUwQTI2XHUwQTMwXHUwQTNFfFx1MEMxN1x1MEM0MVx1MEMyM1x1MEMyRVx1MEM0MXxcdTBDQjlcdTBDQzZcdTBDOUFcdTBDQ0RcdTBDOUFcdTBDQjN8XHUwRTA0XHUwRTI3XHUwRTMyXHUwRTIxXHUwRTE1XHUwRTQ5XHUwRTJEXHUwRTA3XHUwRTAxXHUwRTMyXHUwRTIzXHUwRTE3XHUwRTMyXHUwRTA3XHUwRTE4XHUwRTM4XHUwRTIzXHUwRTAxXHUwRTM0XHUwRTA4fFx1MEUwNFx1MEUyN1x1MEUzMlx1MEUyMVx1MEUyQVx1MEUzMlx1MEUyMVx1MEUzMlx1MEUyM1x1MEUxNnxcdTBFNDJcdTBFMDRcdTBFMjNcdTBFMDdcdTBFMkJcdTBFMjVcdTBFMzFcdTBFMDF8XHVBRTMwXHVCMkE1fFx1MzBENVx1MzBBM1x1MzBGQ1x1MzBDMVx1MzBFM3xcdTUyOUZcdTgwRkR8XHU2QTVGXHU4MEZEKTooPzpbXjpcXHJcXG5dKyg/Olxccj9cXG58XFxyfCQpKSovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaW1wb3J0YW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oOilbXlxcclxcbl0rLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdrZXl3b3JkJzogL1teOlxcclxcbl0rOi9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdzY2VuYXJpbyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopKD86QWJzdHJhY3QgU2NlbmFyaW98QWJzdHJha3QgU2NlbmFyaW98QWNodGVyZ3JvbmR8QWVyfFx1MDBDNnJ8QWd0ZXJncm9uZHxBbGwgeSdhbGx8QW50ZWNlZGVudGVzfEFudGVjZWRlbnRzfEF0YnVyXHUwMEYwYXJcdTAwRTFzfEF0YnVyXHUwMEYwYXJcdTAwRTFzaXJ8QXd3dywgbG9vayBtYXRlfEI0fEJhY2tncm91bmR8QmFnZ3J1bmR8QmFrZ3J1bmR8QmFrZ3J1bm58QmFrZ3J1bm51cnxCZWlzcGllbGV8QmVpc3BpbGxlcnxCXHUxRUQxaSBjXHUxRUEzbmh8Q2VmbmRpcnxDZW5hcmlvfENlblx1MDBFMXJpb3xDZW5hcmlvIGRlIEZ1bmRvfENlblx1MDBFMXJpbyBkZSBGdW5kb3xDZW5hcmlvc3xDZW5cdTAwRTFyaW9zfENvbnRlc3RvfENvbnRleHR8Q29udGV4dGV8Q29udGV4dG98Q29udG98Q29udG9ofENvbnRvbmV8RFx1MDBFNm1pfERhc2FyfERlYWQgbWVuIHRlbGwgbm8gdGFsZXN8RGVsaW5lYWNhbyBkbyBDZW5hcmlvfERlbGluZWFcdTAwRTdcdTAwRTNvIGRvIENlblx1MDBFMXJpb3xEaXMgaXMgd2hhdCB3ZW50IGRvd258RFx1MUVFRiBsaVx1MUVDN3V8RHlhZ3JhbSBTZW5hcnlvfER5YWdyYW0gc2VuYXJ5b3xFZ3phbnB8RWplbXBsb3N8RWtzZW1wbGVyfEVremVtcGxvanxFbmdocmVpZmZ0aWF1fEVzYm96byBkbyBlc2NlbmFyaW98RXNjZW5hcml8RXNjZW5hcmlvfEVzZW1waXxFc3F1ZW1hIGRlIGwnZXNjZW5hcml8RXNxdWVtYSBkZWwgZXNjZW5hcmlvfEVzcXVlbWEgZG8gQ2VuYXJpb3xFc3F1ZW1hIGRvIENlblx1MDBFMXJpb3xFWEFNUExafEV4YW1wbGVzfEV4ZW1wZWx8RXhlbXBsZXxFeGVtcGxlc3xFeGVtcGxvc3xGaXJzdCBvZmZ8Rm9ub3xGb3JnYXRcdTAwRjNrXHUwMEY2bnl2fEZvcmdhdFx1MDBGM2tcdTAwRjZueXYgdlx1MDBFMXpsYXR8RnVuZG98R2VcdTAwRTdtaVx1MDE1RnxHcnVuZGxhZ2V8SGFubmVyZ3JvbmR8Z2hhbnRvSHxIXHUwMEUxdHRcdTAwRTlyfEhlYXZlIHRvfElzdG9yaWt8SnVodHVtaWR8S2VhZGFhbnxLaHVuZyBrXHUxRUNCY2ggYlx1MUVBM258S2h1bmcgdFx1MDBFQ25oIGh1XHUxRUQxbmd8S1x1MUVDQmNoIGJcdTFFQTNufEtvbmNlcHR8S29uc2VwIHNrZW5hcmlvfEtvbnRcdTAwRThrc3xLb250ZWtzdHxLb250ZWtzdGFzfEtvbnRla3N0c3xLb250ZXh0fEtvbnR1cm8gZGUgbGEgc2NlbmFyb3xMYXRhciBCZWxha2FuZ3xsdXQgY2hvdm5hdGxofGx1dHxsdXRtZXl8TFx1MDBGRHNpbmcgQXRidXJcdTAwRjBhclx1MDBFMXNhcnxMXHUwMEZEc2luZyBEXHUwMEU2bWF8TUlTSFVOIFNSU0xZfE1JU0hVTnxNZW5nZ2FyaXNrYW4gU2VuYXJpb3xtbyd8Tlx1MDBFMVx1MDEwRHJ0IFNjZW5cdTAwRTFyYXxOXHUwMEUxXHUwMTBEcnQgU2NcdTAwRTluXHUwMEUxXHUwMTU5ZXxOXHUwMEUxXHUwMTBEcnQgU2Nlblx1MDBFMXJ1fE9yaXMgc2NlbmFyaWphfFx1MDBENnJuZWtsZXJ8T3Nub3ZhfE9zbm92YSBTY2VuXHUwMEUxcmF8T3Nub3ZhIHNjXHUwMEU5blx1MDBFMVx1MDE1OWV8T3NudXRla3xPemFkamV8UGFyYXVnc3xQYXZ5emRcdTAxN0VpYWl8UFx1MDBFOWxkXHUwMEUxa3xQaWVtXHUwMTEzcml8UGxhbiBkdSBzY1x1MDBFOW5hcmlvfFBsYW4gZHUgU2NcdTAwRTluYXJpb3xQbGFuIFNlbmFyeW98UGxhbiBzZW5hcnlvfFBsYW5nIHZ1bSBTemVuYXJpb3xQb3phZFx1MDBFRHxQb3phZGllfFBvemFkaW5hfFByXHUwMEVEa2xhZHl8UFx1MDE1OVx1MDBFRGtsYWR5fFByaW1lcnxQcmltZXJpfFByaW1qZXJpfFByenlrXHUwMTQyYWR5fFJhYW1zdHNlbmFhcml1bXxSZWNrb24gaXQncyBsaWtlfFJlcmVmb25zfFNjZW5cdTAwRTFyfFNjXHUwMEU5blx1MDBFMVx1MDE1OXxTY2VuYXJpZXxTY2VuYXJpanxTY2VuYXJpamFpfFNjZW5hcmlqYXVzIFx1MDE2MWFibG9uYXN8U2NlbmFyaWppfFNjZW5cdTAxMDFyaWpzfFNjZW5cdTAxMDFyaWpzIHBcdTAxMTNjIHBhcmF1Z2F8U2NlbmFyaWp1c3xTY2VuYXJpb3xTY1x1MDBFOW5hcmlvfFNjZW5hcmlvIEFtbGluZWxsb2x8U2NlbmFyaW8gT3V0bGluZXxTY2VuYXJpbyBUZW1wbGF0ZXxTY2VuYXJpb21hbHxTY2VuYXJpb21hbGx8U2NlbmFyaW9zfFNjZW5hcml1fFNjZW5hcml1c3p8U2NlbmFyb3xTY2hlbWEgZGVsbG8gc2NlbmFyaW98U2UgXHUwMEYwZXxTZSB0aGV8U2UgXHUwMEZFZXxTZW5hcmlvfFNlbmFyeW8gRGVza3JpcHN5b258U2VuYXJ5byBkZXNrcmlwc3lvbnxTZW5hcnlvfFNlbmFyeW8gdGFzbGFcdTAxMUZcdTAxMzF8U2hpdmVyIG1lIHRpbWJlcnN8U2l0dVx1MDEwMWNpamF8U2l0dWFpfFNpdHVhc2llIFVpdGVlbnNldHRpbmd8U2l0dWFzaWV8U2tlbmFyaW8ga29uc2VwfFNrZW5hcmlvfFNraWNhfFN0cnVjdHVyYSBzY2VuYXJpdXxTdHJ1Y3R1clx1MDEwMyBzY2VuYXJpdXxTdHJ1a3R1cmEgc2NlbmFyaWphfFN0c2VuYWFyaXVtfFN3YSBod2FlciBzd2F8U3dhfFN3YSBod1x1MDBFNnIgc3dhfFN6YWJsb24gc2NlbmFyaXVzemF8U3plbmFyaW98U3plbmFyaW9ncnVuZHJpc3N8VGFwYXVrc2V0fFRhcGF1c3xUYXBhdXNhaWhpb3xUYXVzdHxUYXVzdGF8VGVtcGxhdGUgS2VhZGFhbnxUZW1wbGF0ZSBTZW5hcmlvfFRlbXBsYXRlIFNpdHVhaXxUaGUgdGhpbmcgb2YgaXQgaXN8VFx1MDBFQ25oIGh1XHUxRUQxbmd8VmFyaWFudGFpfFZvb3JiZWVsZGV8Vm9vcmJlZWxkZW58V2hhcnJpbWVhbiBpc3xZby1oby1ob3xZb3UnbGwgd2FubmF8WmFcdTAxNDJvXHUwMTdDZW5pYXxcdTAzQTBcdTAzQjFcdTAzQzFcdTAzQjFcdTAzQjRcdTAzQjVcdTAzQUZcdTAzQjNcdTAzQkNcdTAzQjFcdTAzQzRcdTAzQjF8XHUwM0EwXHUwM0I1XHUwM0MxXHUwM0I5XHUwM0IzXHUwM0MxXHUwM0IxXHUwM0M2XHUwM0FFIFx1MDNBM1x1MDNCNVx1MDNCRFx1MDNCMVx1MDNDMVx1MDNBRlx1MDNCRlx1MDNDNXxcdTAzQTNcdTAzQjVcdTAzQkRcdTAzQUNcdTAzQzFcdTAzQjlcdTAzQjF8XHUwM0EzXHUwM0I1XHUwM0JEXHUwM0FDXHUwM0MxXHUwM0I5XHUwM0JGfFx1MDNBNVx1MDNDMFx1MDNDQ1x1MDNCMlx1MDNCMVx1MDNCOFx1MDNDMVx1MDNCRnxcdTA0MUFcdTA0MzVcdTA0NDBcdTA0MzVcdTA0NDh8XHUwNDFBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyfFx1MDQxQVx1MDQzRVx1MDQzRFx1MDQ0Nlx1MDQzNVx1MDQzRlx1MDQ0MnxcdTA0MUNcdTA0MzhcdTA0NDFcdTA0MzBcdTA0M0JcdTA0M0JcdTA0MzBcdTA0NDB8XHUwNDFDXHUwNDM4XHUwNDQxXHUwNDNFXHUwNDNCXHUwNDNCXHUwNDMwXHUwNDQwfFx1MDQxRVx1MDQ0MVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzMHxcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDNcdTA0M0NcdTA0M0VcdTA0MzJcdTA0MzB8XHUwNDFGXHUwNDNFXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDM4XHUwNDNEXHUwNDMwfFx1MDQxRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0RnxcdTA0MUZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NEJcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NEZ8XHUwNDFGXHUwNDQwXHUwNDM4XHUwNDNBXHUwNDNCXHUwNDMwXHUwNDM0XHUwNDM4fFx1MDQxRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQ0MHxcdTA0MUZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDBcdTA0Mzh8XHUwNDFGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwXHUwNDRCfFx1MDQyMFx1MDQzMFx1MDQzQ1x1MDQzQVx1MDQzMCBcdTA0M0RcdTA0MzAgXHUwNDQxXHUwNDQ2XHUwNDM1XHUwNDNEXHUwNDMwXHUwNDQwXHUwNDM4XHUwNDM5fFx1MDQyMVx1MDQzQVx1MDQzOFx1MDQ0Nlx1MDQzMHxcdTA0MjFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M0FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0MzAgXHUwNDQxXHUwNDQ2XHUwNDM1XHUwNDNEXHUwNDMwXHUwNDQwXHUwNDM4XHUwNDU4XHUwNDMwfFx1MDQyMVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzQVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQzMCBcdTA0NDFcdTA0NDZcdTA0MzVcdTA0M0RcdTA0MzBcdTA0NDBcdTA0MzhcdTA0NEZ8XHUwNDIxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNBXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDMwIFx1MDQ0MVx1MDQ0Nlx1MDQzNVx1MDQzRFx1MDQzMFx1MDQ0MFx1MDQ1Nlx1MDQ0RXxcdTA0MjFcdTA0NDZcdTA0MzVcdTA0M0RcdTA0MzBcdTA0NDBcdTA0MzhcdTA0Mzl8XHUwNDIxXHUwNDQ2XHUwNDM1XHUwNDNEXHUwNDMwXHUwNDQwXHUwNDM4XHUwNDM5IFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzQVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQzOHxcdTA0MjFcdTA0NDZcdTA0MzVcdTA0M0RcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzlcdTA0M0RcdTA0NEJcdTA0QTMgXHUwNDQyXHUwNEU5XHUwNDM3XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDQ4XHUwNDM1fFx1MDQyMVx1MDQ0Nlx1MDQzNVx1MDQzRFx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQ1OFx1MDQzOHxcdTA0MjFcdTA0NDZcdTA0MzVcdTA0M0RcdTA0MzBcdTA0NDBcdTA0MzhcdTA0M0V8XHUwNDIxXHUwNDQ2XHUwNDM1XHUwNDNEXHUwNDMwXHUwNDQwXHUwNDU2XHUwNDM5fFx1MDQyMlx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQ0NXxcdTA0QUVcdTA0NDBcdTA0M0RcdTA0RDlcdTA0M0FcdTA0M0JcdTA0RDlcdTA0NDB8XHUwNUQzXHUwNUQ1XHUwNUQyXHUwNURFXHUwNUQwXHUwNUQ1XHUwNUVBfFx1MDVFOFx1MDVFN1x1MDVFMnxcdTA1RUFcdTA1RDFcdTA1RTBcdTA1RDlcdTA1RUEgXHUwNUVBXHUwNUU4XHUwNUQ3XHUwNUQ5XHUwNUU5fFx1MDVFQVx1MDVFOFx1MDVEN1x1MDVEOVx1MDVFOXxcdTA2MjdcdTA2NDRcdTA2MkVcdTA2NDRcdTA2NDFcdTA2NEFcdTA2Mjl8XHUwNjI3XHUwNjQ0XHUwNkFGXHUwNjQ4XHUwNkNDIFx1MDYzM1x1MDY0Nlx1MDYyN1x1MDYzMVx1MDZDQ1x1MDY0OHxcdTA2MjdcdTA2NDVcdTA2MkJcdTA2NDRcdTA2Mjl8XHUwNjdFXHUwNjMzIFx1MDY0NVx1MDY0Nlx1MDYzOFx1MDYzMXxcdTA2MzJcdTA2NDVcdTA2Q0NcdTA2NDZcdTA2NDd8XHUwNjMzXHUwNjQ2XHUwNjI3XHUwNjMxXHUwNkNDXHUwNjQ4fFx1MDYzM1x1MDY0QVx1MDY0Nlx1MDYyN1x1MDYzMVx1MDY0QVx1MDY0OHxcdTA2MzNcdTA2NEFcdTA2NDZcdTA2MjdcdTA2MzFcdTA2NEFcdTA2NDggXHUwNjQ1XHUwNjJFXHUwNjM3XHUwNjM3fFx1MDY0NVx1MDYyQlx1MDYyN1x1MDY0NFx1MDZDQ1x1MDZCQXxcdTA2NDVcdTA2NDZcdTA2MzhcdTA2MzEgXHUwNjQ2XHUwNjI3XHUwNjQ1XHUwNkQyIFx1MDZBOVx1MDYyNyBcdTA2MkVcdTA2MjdcdTA2QTlcdTA2QzF8XHUwNjQ1XHUwNjQ2XHUwNjM4XHUwNjMxXHUwNjQ2XHUwNjI3XHUwNjQ1XHUwNkMxfFx1MDY0Nlx1MDY0NVx1MDY0OFx1MDY0Nlx1MDY0NyBcdTA2NDdcdTA2Mjd8XHUwOTA5XHUwOTI2XHUwOTNFXHUwOTM5XHUwOTMwXHUwOTIzfFx1MDkyQVx1MDkzMFx1MDkzRlx1MDkyNlx1MDk0M1x1MDkzNlx1MDk0RFx1MDkyRnxcdTA5MkFcdTA5MzBcdTA5M0ZcdTA5MjZcdTA5NDNcdTA5MzZcdTA5NERcdTA5MkYgXHUwOTMwXHUwOTQyXHUwOTJBXHUwOTMwXHUwOTQ3XHUwOTE2XHUwOTNFfFx1MDkyQVx1MDk0M1x1MDkzN1x1MDk0RFx1MDkyMFx1MDkyRFx1MDk0Mlx1MDkyRVx1MDkzRnxcdTBBMDlcdTBBMjZcdTBBM0VcdTBBMzlcdTBBMzBcdTBBMjhcdTBBM0VcdTBBMDJ8XHUwQTJBXHUwQTFGXHUwQTE1XHUwQTI1XHUwQTNFfFx1MEEyQVx1MEExRlx1MEExNVx1MEEyNVx1MEEzRSBcdTBBMjJcdTBBM0VcdTBBMDJcdTBBMUFcdTBBM0V8XHUwQTJBXHUwQTFGXHUwQTE1XHUwQTI1XHUwQTNFIFx1MEEzMFx1MEE0Mlx1MEEyQSBcdTBBMzBcdTBBNDdcdTBBMTZcdTBBM0V8XHUwQTJBXHUwQTNGXHUwQTFCXHUwQTRCXHUwQTE1XHUwQTVDfFx1MEMwOVx1MEMyNlx1MEMzRVx1MEMzOVx1MEMzMFx1MEMyM1x1MEMzMlx1MEM0MXxcdTBDMTVcdTBDMjVcdTBDMjhcdTBDMDJ8XHUwQzI4XHUwQzQ3XHUwQzJBXHUwQzI1XHUwQzREXHUwQzJGXHUwQzAyfFx1MEMzOFx1MEMyOFx1MEM0RFx1MEMyOFx1MEMzRlx1MEMzNVx1MEM0N1x1MEMzNlx1MEMwMnxcdTBDODlcdTBDQTZcdTBDQkVcdTBDQjlcdTBDQjBcdTBDQTNcdTBDQzZcdTBDOTdcdTBDQjNcdTBDQzF8XHUwQzk1XHUwQ0E1XHUwQ0JFXHUwQ0I4XHUwQ0JFXHUwQ0IwXHUwQ0JFXHUwQzgyXHUwQ0I2fFx1MENCNVx1MENCRlx1MENCNVx1MENCMFx1MENBM1x1MENDNnxcdTBDQjlcdTBDQkZcdTBDQThcdTBDQ0RcdTBDQThcdTBDQzZcdTBDQjJcdTBDQzZ8XHUwRTQyXHUwRTA0XHUwRTIzXHUwRTA3XHUwRTJBXHUwRTIzXHUwRTQ5XHUwRTMyXHUwRTA3XHUwRTAyXHUwRTJEXHUwRTA3XHUwRTQwXHUwRTJCXHUwRTE1XHUwRTM4XHUwRTAxXHUwRTMyXHUwRTIzXHUwRTEzXHUwRTRDfFx1MEUwQVx1MEUzOFx1MEUxNFx1MEUwMlx1MEUyRFx1MEUwN1x1MEUxNVx1MEUzMVx1MEUyN1x1MEUyRFx1MEUyMlx1MEU0OFx1MEUzMlx1MEUwN3xcdTBFMEFcdTBFMzhcdTBFMTRcdTBFMDJcdTBFMkRcdTBFMDdcdTBFNDBcdTBFMkJcdTBFMTVcdTBFMzhcdTBFMDFcdTBFMzJcdTBFMjNcdTBFMTNcdTBFNEN8XHUwRTQxXHUwRTE5XHUwRTI3XHUwRTA0XHUwRTM0XHUwRTE0fFx1MEUyQVx1MEUyM1x1MEUzOFx1MEUxQlx1MEU0MFx1MEUyQlx1MEUxNVx1MEUzOFx1MEUwMVx1MEUzMlx1MEUyM1x1MEUxM1x1MEU0Q3xcdTBFNDBcdTBFMkJcdTBFMTVcdTBFMzhcdTBFMDFcdTBFMzJcdTBFMjNcdTBFMTNcdTBFNEN8XHVCQzMwXHVBQ0JEfFx1QzJEQ1x1QjA5OFx1QjlBQ1x1QzYyNHxcdUMyRENcdUIwOThcdUI5QUNcdUM2MjQgXHVBQzFDXHVDNjk0fFx1QzYwOHxcdTMwQjVcdTMwRjNcdTMwRDdcdTMwRUJ8XHUzMEI3XHUzMENBXHUzMEVBXHUzMEFBfFx1MzBCN1x1MzBDQVx1MzBFQVx1MzBBQVx1MzBBMlx1MzBBNlx1MzBDOFx1MzBFOVx1MzBBNFx1MzBGM3xcdTMwQjdcdTMwQ0FcdTMwRUFcdTMwQUFcdTMwQzZcdTMwRjNcdTMwRDdcdTMwRUN8XHUzMEI3XHUzMENBXHUzMEVBXHUzMEFBXHUzMEM2XHUzMEYzXHUzMEQ3XHUzMEVDXHUzMEZDXHUzMEM4fFx1MzBDNlx1MzBGM1x1MzBEN1x1MzBFQ3xcdTRGOEJ8XHU0RjhCXHU1QjUwfFx1NTI2N1x1NjcyQ3xcdTUyNjdcdTY3MkNcdTU5MjdcdTdFQjJ8XHU1Mjg3XHU2NzJDfFx1NTI4N1x1NjcyQ1x1NTkyN1x1N0RCMXxcdTU3M0FcdTY2NkZ8XHU1NzNBXHU2NjZGXHU1OTI3XHU3RUIyfFx1NTgzNFx1NjY2RnxcdTU4MzRcdTY2NkZcdTU5MjdcdTdEQjF8XHU4MENDXHU2NjZGKTpbXjpcXHJcXG5dKi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaW1wb3J0YW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oOilbXlxcclxcbl0qLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdrZXl3b3JkJzogL1teOlxcclxcbl0rOi9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCd0YWJsZS1ib2R5Jzoge1xuXHRcdFx0Ly8gTG9vay1iZWhpbmQgaXMgdXNlZCB0byBza2lwIHRoZSB0YWJsZSBoZWFkLCB3aGljaCBoYXMgdGhlIHNhbWUgZm9ybWF0IGFzIGFueSB0YWJsZSByb3dcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnKCcgKyB0YWJsZVJvdyArICcpKD86JyArIHRhYmxlUm93ICsgJykrJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdvdXRsaW5lJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC88W14+XSs+Lyxcblx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQndGQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xccypbXlxcc3xdW158XSovLFxuXHRcdFx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFx8L1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3RhYmxlLWhlYWQnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAodGFibGVSb3cpLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCd0aCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxzKlteXFxzfF1bXnxdKi8sXG5cdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcfC9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdhdHJ1bGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0rKSg/OidhfCdhY2h8J2VqfDd8YXxBIHRha1x1MDBFOXxBIHRha3RpZVx1MDE3RXxBIHRpZVx1MDE3RXxBIHpcdTAwRTFyb3ZlXHUwMTQ4fEFiZXJ8QWN8QWRvdHR8QWtrb3J8QWt8QWxlc2hvcmVzfEFsZXxBbGl8QWxsb3JhfEFsb3JzfEFsc3xBbWF8QW1lbm55aWJlbnxBbWlrb3J8QW1wYWt8YW58QU58QW5hbmdpbmd8QW5kIHknYWxsfEFuZHxBbmdlbm9tbWVufEFucmhlZ2VkaWcgYXxBbnxBcGFiaWxhfEF0XHUwMEU4c3xBdGVzYXxBdHVuY2l8QXZhc3QhfEF5ZXxBfGF3ZXJ8QmFnaXxCYW5qdXJ8QmV0fEJpXHUxRUJGdHxCbGltZXkhfEJ1aHxCdXQgYXQgdGhlIGVuZCBvZiB0aGUgZGF5IEkgcmVja29ufEJ1dCB5J2FsbHxCdXR8QlVUfENhbHxDXHUwMEUybmR8Q2FuZHxDYW5kb3xDZXxDdWFuZG98XHUwMTBDZXxcdTAwRDBhIFx1MDBGMGV8XHUwMEQwYXxEYWRhc3xEYWRhfERhZG9zfERhZG98RGFIIGdodScgYmVqbHUnfGRhbm58RGFubnxEYW5vfERhbnxEYXJ8RGF0IGZpaW5kfERhdGF8RGF0ZSBmaWluZHxEYXRlfERhdGkgZmlpbmR8RGF0aXxEYVx1MDE2M2kgZmlpbmR8RGFcdTAyMUJpIGZpaW5kfERFTnxEYXRvfERlfERlbiB5b3VzZSBnb3R0YXxEZW5nYW58RGliZXJpfERpeWVsaW0ga2l8RG9uYWRhfERvbmF0fERvbml0YVx1MDEzNW98RG98RHVufER1b3RhfFx1MDBEMHVyaHxFZWxkYWRlc3xFZnxFXHUwMTFGZXIga2l8RW50YW98RW50XHUwMEUzb3xFbnRcdTAwRjNufEV8RW58RW50b25jZXN8RXBpfFx1MDBDOXN8RXRhbnQgZG9ublx1MDBFOWV8RXRhbnQgZG9ublx1MDBFOXxFdHxcdTAwQzl0YW50IGRvbm5cdTAwRTllc3xcdTAwQzl0YW50IGRvbm5cdTAwRTllfFx1MDBDOXRhbnQgZG9ublx1MDBFOXxFdGFudCBkb25uXHUwMEU5ZXN8RXRhbnQgZG9ublx1MDBFOXN8XHUwMEM5dGFudCBkb25uXHUwMEU5c3xGYWthdHxHYW5nd2F5IXxHZHl8R2VnZWJlbiBzZWllbnxHZWdlYmVuIHNlaXxHZWdldmVufEdlZ2V3ZXxnaHUnIG5vYmx1J3xHaXR0fEdpdmVuIHknYWxsfEdpdmVufEdpdmV0fEdpdnVufEhhfENob3xJIENBTiBIQVp8SW58SXJ8SXQncyBqdXN0IHVuYmVsaWV2YWJsZXxJfEphfEplXHUwMTVCbGl8SmVcdTAxN0NlbGl8S2FkfEthZGF8S2FkYXJ8S2FpfEthanxLZHlcdTAxN0V8S2VcdTAxMEZ8S2VtdWRpYW58S2V0aWthfEtoaXxLaWVkeXxLb3xLdWlkfEt1aXxLdW58TGFufGxhdGxofExlIHNhIGF8TGV0IGdvIGFuZCBoYXVsfExlfExcdTAwRTggc2EgYXxMXHUwMEU4fExvZ298TG9yc3F1Jzx8TG9yc3F1ZXxtXHUwMEU0fE1hYXJ8TWFpc3xNYWpcdTAxMDVjfE1hfE1hamR8TWFrYXxNYW5hd2F8TWFzfE1lbnxNZW5hd2F8TXV0dGF8TmFsaWthfE5hbGlrYW5pbmd8TmFuZ2luZ3xOXHUwMEU1cnxOXHUwMEU0cnxOYXRvfE5oXHUwMUIwbmd8TmlpbnxOanVrfE8gemFtYW58T2NofE9nfE9sZXRldGFhbnxPbmR8T25kYXxPcmF6fFBha3xQZXJvfFBlclx1MDBGMnxQb2Rhbm98UG9raWFcdTAxM0V8UG9rdWR8UG90ZW18UG90b218UHJpdnpldG98UHJ5ZHxRdWFufFF1YW5kfFF1YW5kb3xxYVNESSd8U1x1MDBFNXxTZWR8U2V8U2lpc3xTaXBvemUga2V8U2lwb3plIEtlfFNpcG96ZXxTaXxcdTAxNUVpfFx1MDIxOGl8U29pdHxTdGVsfFRhZGF8VGFkfFRha3JhdHxUYWt8VGFwaXxUZXJ8VGV0YXBpfFRoYSB0aGV8VGhhfFRoZW4geSdhbGx8VGhlbnxUaFx1MDBFQ3xUaHVyaHxUb2RhfFRvbyByaWdodHxVbnxVbmR8dWdlaG9sbHxWXHUwMEUwfHZhanxWZW5kYXJ8VmV8d2FubnxXYW5uZWVyfFdFTnxXZW5ufFdoZW4geSdhbGx8V2hlbnxXdGVkeXxXdW58WSdrbm93fFllYWggbmFofFluYXxZb3VzZSBrbm93IGxpa2Ugd2hlbnxZb3VzZSBrbm93IHdoZW4geW91c2UgZ290fFl8WmEgcHJlZHBva2xhZHV8WmEgcFx1MDE1OWVkcG9rbGFkdXxaYWRhbnxaYWRhbml8WmFkYW5vfFphZGF0ZXxaYWRhdG98WmFrXHUwMTQyYWRhalx1MDEwNWN8WmFyYWRpfFphdGF0aXxcdTAwREVhIFx1MDBGRWV8XHUwMERFYXxcdTAwREVcdTAwRTF8XHUwMERFZWdhcnxcdTAwREV1cmh8XHUwMzkxXHUwM0JCXHUwM0JCXHUwM0FDfFx1MDM5NFx1MDNCNVx1MDNCNFx1MDNCRlx1MDNCQ1x1MDNBRFx1MDNCRFx1MDNCRlx1MDNDNXxcdTAzOUFcdTAzQjFcdTAzQjl8XHUwMzhDXHUwM0M0XHUwM0IxXHUwM0JEfFx1MDNBNFx1MDNDQ1x1MDNDNFx1MDNCNXxcdTA0MTAgXHUwNDQyXHUwNDMwXHUwNDNBXHUwNDNFXHUwNDM2fFx1MDQxMFx1MDQzM1x1MDQzMFx1MDQ0MHxcdTA0MTBcdTA0M0JcdTA0MzV8XHUwNDEwXHUwNDNCXHUwNDM4fFx1MDQxMFx1MDQzQ1x1MDQzQ1x1MDQzRXxcdTA0MTB8XHUwNEQ4XHUwNDMzXHUwNEQ5XHUwNDQwfFx1MDREOFx1MDQzOVx1MDQ0Mlx1MDQzOFx1MDQzQXxcdTA0RDhcdTA0M0NcdTA0M0NcdTA0MzB8XHUwNDExXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDNBfFx1MDQxMlx1MDQzMHxcdTA0MTJcdTA0RDl8XHUwNDE0XHUwNDMwXHUwNDM0XHUwNDM1XHUwNDNEXHUwNDNFfFx1MDQxNFx1MDQzMFx1MDQzRFx1MDQzRXxcdTA0MTRcdTA0M0VcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M0N8XHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4fFx1MDQxN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQzNXxcdTA0MTdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDJcdTA0Mzh8XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQyXHUwNDNFfFx1MDQxOHxcdTA0MDZ8XHUwNDFBIFx1MDQ0Mlx1MDQzRVx1MDQzQ1x1MDQ0MyBcdTA0MzZcdTA0MzV8XHUwNDFBXHUwNDMwXHUwNDM0XHUwNDMwfFx1MDQxQVx1MDQzMFx1MDQzNHxcdTA0MUFcdTA0M0VcdTA0MzNcdTA0MzBcdTA0NDJcdTA0M0V8XHUwNDFBXHUwNDNFXHUwNDMzXHUwNDM0XHUwNDMwfFx1MDQxQVx1MDQzRVx1MDQzQlx1MDQzOHxcdTA0MUJcdTA0RDlcdTA0M0FcdTA0MzhcdTA0M0R8XHUwNDFCXHUwNDM1XHUwNDNBXHUwNDM4XHUwNDNEfFx1MDQxRFx1MDREOVx1MDQ0Mlx1MDQzOFx1MDQ5N1x1MDREOVx1MDQzNFx1MDREOXxcdTA0MURcdTA0MzVcdTA0NDVcdTA0MzBcdTA0Mzl8XHUwNDFEXHUwNDNFfFx1MDQxRVx1MDQzRFx1MDQzNFx1MDQzMHxcdTA0MUZcdTA0NDBcdTA0MzhcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M0NcdTA0M0UsIFx1MDQ0OVx1MDQzRXxcdTA0MUZcdTA0NDBcdTA0MzhcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M0NcdTA0M0V8XHUwNDFGXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDRDfFx1MDQyMlx1MDQzMFx1MDQzQVx1MDQzNlx1MDQzNXxcdTA0MjJcdTA0MzB8XHUwNDIyXHUwNDNFXHUwNDMzXHUwNDM0XHUwNDMwfFx1MDQyMlx1MDQzRVx1MDQzNFx1MDQ1NnxcdTA0MjJcdTA0M0V8XHUwNDIzXHUwNDNEXHUwNDM0XHUwNDMwfFx1MDRCQVx1MDREOVx1MDQzQ3xcdTA0MkZcdTA0M0FcdTA0NDlcdTA0M0V8XHUwNUQwXHUwNUQxXHUwNURDfFx1MDVEMFx1MDVENlx1MDVEOXxcdTA1RDBcdTA1RDZ8XHUwNUQxXHUwNUQ0XHUwNUQ5XHUwNUUwXHUwNUVBXHUwNURGfFx1MDVENVx1MDVEMlx1MDVERHxcdTA1REJcdTA1RDBcdTA1RTlcdTA1RTh8XHUwNjIyXHUwNjQ2XHUwNkFGXHUwNjI3XHUwNjQ3fFx1MDYyN1x1MDYzMFx1MDYyN1x1MDY0QnxcdTA2MjdcdTA2QUZcdTA2MzF8XHUwNjI3XHUwNjQ1XHUwNjI3fFx1MDYyN1x1MDY0OFx1MDYzMXxcdTA2MjhcdTA2MjcgXHUwNjQxXHUwNjMxXHUwNjM2fFx1MDYyOFx1MDYyN1x1MDY0NFx1MDY0MVx1MDYzMVx1MDYzNnxcdTA2MjhcdTA2NDFcdTA2MzFcdTA2MzZ8XHUwNjdFXHUwNkJFXHUwNjMxfFx1MDYyQVx1MDYyOHxcdTA2MkJcdTA2NDV8XHUwNjJDXHUwNjI4fFx1MDYzOVx1MDY0Nlx1MDYyRlx1MDY0NVx1MDYyN3xcdTA2NDFcdTA2MzFcdTA2MzYgXHUwNkE5XHUwNkNDXHUwNjI3fFx1MDY0NFx1MDY0M1x1MDY0NnxcdTA2NDRcdTA2Q0NcdTA2QTlcdTA2NDZ8XHUwNjQ1XHUwNjJBXHUwNjQ5fFx1MDY0N1x1MDY0Nlx1MDZBRlx1MDYyN1x1MDY0NVx1MDZDQ3xcdTA2NDh8XHUwOTA1XHUwOTE3XHUwOTMwfFx1MDkxNFx1MDkzMHxcdTA5MTVcdTA5MjZcdTA5M0V8XHUwOTE1XHUwOTNGXHUwOTI4XHUwOTREXHUwOTI0XHUwOTQxfFx1MDkxQVx1MDk0Mlx1MDkwMlx1MDkxNVx1MDkzRnxcdTA5MUNcdTA5MkN8XHUwOTI0XHUwOTI1XHUwOTNFfFx1MDkyNFx1MDkyNlx1MDkzRXxcdTA5MjRcdTA5MkN8XHUwOTJBXHUwOTMwXHUwOTI4XHUwOTREXHUwOTI0XHUwOTQxfFx1MDkyQVx1MDkzMHxcdTA5MkZcdTA5MjZcdTA5M0Z8XHUwQTA1XHUwQTI0XHUwQTQ3fFx1MEExQ1x1MEEyNlx1MEE0Qlx1MEEwMnxcdTBBMUNcdTBBM0ZcdTBBMzVcdTBBNDdcdTBBMDIgXHUwQTE1XHUwQTNGfFx1MEExQ1x1MEE0N1x1MEExNVx1MEEzMHxcdTBBMjRcdTBBMjZ8XHUwQTJBXHUwQTMwfFx1MEMwNVx1MEMyQVx1MEM0RFx1MEMyQVx1MEM0MVx1MEMyMVx1MEM0MXxcdTBDMDggXHUwQzJBXHUwQzMwXHUwQzNGXHUwQzM4XHUwQzREXHUwQzI1XHUwQzNGXHUwQzI0XHUwQzNGXHUwQzMyXHUwQzRCfFx1MEMxNVx1MEMzRVx1MEMyOFx1MEMzRnxcdTBDMUFcdTBDNDZcdTBDMkFcdTBDNERcdTBDMkFcdTBDMkNcdTBDMjFcdTBDM0ZcdTBDMjhcdTBDMjZcdTBDM0Z8XHUwQzJFXHUwQzMwXHUwQzNGXHUwQzJGXHUwQzQxfFx1MEM4Nlx1MENBNlx1MENCMFx1MENDNnxcdTBDQThcdTBDODJcdTBDQTRcdTBDQjB8XHUwQ0E4XHUwQ0JGXHUwQ0Q1XHUwQ0ExXHUwQ0JGXHUwQ0E2fFx1MENBRVx1MENBNFx1MENDRFx1MENBNFx1MENDMXxcdTBDQjhcdTBDQ0RcdTBDQTVcdTBDQkZcdTBDQTRcdTBDQkZcdTBDQUZcdTBDQThcdTBDQ0RcdTBDQThcdTBDQzF8XHUwRTAxXHUwRTMzXHUwRTJCXHUwRTE5XHUwRTE0XHUwRTQzXHUwRTJCXHUwRTQ5fFx1MEUxNFx1MEUzMVx1MEUwN1x1MEUxOVx1MEUzMVx1MEU0OVx1MEUxOXxcdTBFNDFcdTBFMTVcdTBFNDh8XHUwRTQwXHUwRTIxXHUwRTM3XHUwRTQ4XHUwRTJEfFx1MEU0MVx1MEUyNVx1MEUzMHxcdUFERjhcdUI3RUNcdUJBNzQ8fFx1QURGOFx1QjlBQ1x1QUNFMDx8XHVCMkU4PHxcdUI5Q0NcdUM1N0Q8fFx1QjlDQ1x1Qzc3Qzx8XHVCQTNDXHVDODAwPHxcdUM4NzBcdUFDNzQ8fFx1RDU1OFx1QzlDMFx1QjlDQzx8XHUzMDRCXHUzMDY0PHxcdTMwNTdcdTMwNEJcdTMwNTc8fFx1MzA1Rlx1MzA2MFx1MzA1Nzx8XHUzMDZBXHUzMDg5XHUzMDcwPHxcdTMwODJcdTMwNTc8fFx1NEUyNlx1NEUxNDx8XHU0RjQ2XHUzMDU3PHxcdTRGNDZcdTY2MkY8fFx1NTA0N1x1NTk4Mjx8XHU1MDQ3XHU1QjlBPHxcdTUwNDdcdThBMkQ8fFx1NTA0N1x1OEJCRTx8XHU1MjREXHU2M0QwPHxcdTU0MENcdTY1RjY8fFx1NTQwQ1x1NjY0Mjx8XHU1RTc2XHU0RTE0PHxcdTVGNTM8fFx1NzU3Njx8XHU4MDBDXHU0RTE0PHxcdTkwQTNcdTRFNDg8fFx1OTBBM1x1OUVCQzwpKD89WyBcXHRdKS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIig/OlxcXFwufFteXCJcXFxcXFxyXFxuXSkqXCJ8Jyg/OlxcXFwufFteJ1xcXFxcXHJcXG5dKSonLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnb3V0bGluZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvPFtePl0rPi8sXG5cdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J291dGxpbmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvPFtePl0rPi8sXG5cdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdH1cblx0fTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuZ2l0ID0ge1xuXHQvKlxuXHQgKiBBIHNpbXBsZSBvbmUgbGluZSBjb21tZW50IGxpa2UgaW4gYSBnaXQgc3RhdHVzIGNvbW1hbmRcblx0ICogRm9yIGluc3RhbmNlOlxuXHQgKiAkIGdpdCBzdGF0dXNcblx0ICogIyBPbiBicmFuY2ggaW5maW5pdGUtc2Nyb2xsXG5cdCAqICMgWW91ciBicmFuY2ggYW5kICdvcmlnaW4vc2hhcmVkQnJhbmNoZXMvZnJvbnRlbmRUZWFtL2luZmluaXRlLXNjcm9sbCcgaGF2ZSBkaXZlcmdlZCxcblx0ICogIyBhbmQgaGF2ZSAxIGFuZCAyIGRpZmZlcmVudCBjb21taXRzIGVhY2gsIHJlc3BlY3RpdmVseS5cblx0ICogbm90aGluZyB0byBjb21taXQgKHdvcmtpbmcgZGlyZWN0b3J5IGNsZWFuKVxuXHQgKi9cblx0J2NvbW1lbnQnOiAvXiMuKi9tLFxuXG5cdC8qXG5cdCAqIFJlZ2V4cCB0byBtYXRjaCB0aGUgY2hhbmdlZCBsaW5lcyBpbiBhIGdpdCBkaWZmIG91dHB1dC4gQ2hlY2sgdGhlIGV4YW1wbGUgYmVsb3cuXG5cdCAqL1xuXHQnZGVsZXRlZCc6IC9eWy1cdTIwMTNdLiovbSxcblx0J2luc2VydGVkJzogL15cXCsuKi9tLFxuXG5cdC8qXG5cdCAqIGEgc3RyaW5nIChkb3VibGUgYW5kIHNpbXBsZSBxdW90ZSlcblx0ICovXG5cdCdzdHJpbmcnOiAvKFwifCcpKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cblx0Lypcblx0ICogYSBnaXQgY29tbWFuZC4gSXQgc3RhcnRzIHdpdGggYSByYW5kb20gcHJvbXB0IGZpbmlzaGluZyBieSBhICQsIHRoZW4gXCJnaXRcIiB0aGVuIHNvbWUgb3RoZXIgcGFyYW1ldGVyc1xuXHQgKiBGb3IgaW5zdGFuY2U6XG5cdCAqICQgZ2l0IGFkZCBmaWxlLnR4dFxuXHQgKi9cblx0J2NvbW1hbmQnOiB7XG5cdFx0cGF0dGVybjogL14uKlxcJCBnaXQgLiokL20sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQvKlxuXHRcdFx0ICogQSBnaXQgY29tbWFuZCBjYW4gY29udGFpbiBhIHBhcmFtZXRlciBzdGFydGluZyBieSBhIHNpbmdsZSBvciBhIGRvdWJsZSBkYXNoIGZvbGxvd2VkIGJ5IGEgc3RyaW5nXG5cdFx0XHQgKiBGb3IgaW5zdGFuY2U6XG5cdFx0XHQgKiAkIGdpdCBkaWZmIC0tY2FjaGVkXG5cdFx0XHQgKiAkIGdpdCBsb2cgLXBcblx0XHRcdCAqL1xuXHRcdFx0J3BhcmFtZXRlcic6IC9cXHMtLT9cXHcrL1xuXHRcdH1cblx0fSxcblxuXHQvKlxuXHQgKiBDb29yZGluYXRlcyBkaXNwbGF5ZWQgaW4gYSBnaXQgZGlmZiBjb21tYW5kXG5cdCAqIEZvciBpbnN0YW5jZTpcblx0ICogJCBnaXQgZGlmZlxuXHQgKiBkaWZmIC0tZ2l0IGZpbGUudHh0IGZpbGUudHh0XG5cdCAqIGluZGV4IDYyMTQ5NTMuLjFkNTRhNTIgMTAwNjQ0XG5cdCAqIC0tLSBmaWxlLnR4dFxuXHQgKiArKysgZmlsZS50eHRcblx0ICogQEAgLTEgKzEsMiBAQFxuXHQgKiAtSGVyZSdzIG15IHRldHggZmlsZVxuXHQgKiArSGVyZSdzIG15IHRleHQgZmlsZVxuXHQgKiArQW5kIHRoaXMgaXMgdGhlIHNlY29uZCBsaW5lXG5cdCAqL1xuXHQnY29vcmQnOiAvXkBALipAQCQvbSxcblxuXHQvKlxuXHQgKiBNYXRjaCBhIFwiY29tbWl0IFtTSEExXVwiIGxpbmUgaW4gYSBnaXQgbG9nIG91dHB1dC5cblx0ICogRm9yIGluc3RhbmNlOlxuXHQgKiAkIGdpdCBsb2dcblx0ICogY29tbWl0IGExMWExNGVmN2UyNmYyY2E2MmQ0YjM1ZWFjNDU1Y2U2MzZkMGRjMDlcblx0ICogQXV0aG9yOiBsZ2lyYXVkZWxcblx0ICogRGF0ZTogICBNb24gRmViIDE3IDExOjE4OjM0IDIwMTQgKzAxMDBcblx0ICpcblx0ICogICAgIEFkZCBvZiBhIG5ldyBsaW5lXG5cdCAqL1xuXHQnY29tbWl0LXNoYTEnOiAvXmNvbW1pdCBcXHd7NDB9JC9tXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuZ2xzbCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2MnLCB7XG5cdCdrZXl3b3JkJzogL1xcYig/OmFjdGl2ZXxhc218YXRvbWljX3VpbnR8YXR0cmlidXRlfFtpYmR1XT92ZWNbMjM0XXxib29sfGJyZWFrfGJ1ZmZlcnxjYXNlfGNhc3R8Y2VudHJvaWR8Y2xhc3N8Y29oZXJlbnR8Y29tbW9ufGNvbnN0fGNvbnRpbnVlfGQ/bWF0WzIzNF0oPzp4WzIzNF0pP3xkZWZhdWx0fGRpc2NhcmR8ZG98ZG91YmxlfGVsc2V8ZW51bXxleHRlcm58ZXh0ZXJuYWx8ZmFsc2V8ZmlsdGVyfGZpeGVkfGZsYXR8ZmxvYXR8Zm9yfGZ2ZWNbMjM0XXxnb3RvfGhhbGZ8aGlnaHB8aHZlY1syMzRdfFtpdV0/c2FtcGxlcjJETVMoPzpBcnJheSk/fFtpdV0/c2FtcGxlcjJEUmVjdHxbaXVdP3NhbXBsZXJCdWZmZXJ8W2l1XT9zYW1wbGVyQ3ViZXxbaXVdP3NhbXBsZXJDdWJlQXJyYXl8W2l1XT9zYW1wbGVyWzEyM11EfFtpdV0/c2FtcGxlclsxMl1EQXJyYXl8W2l1XT9pbWFnZTJETVMoPzpBcnJheSk/fFtpdV0/aW1hZ2UyRFJlY3R8W2l1XT9pbWFnZUJ1ZmZlcnxbaXVdP2ltYWdlQ3ViZXxbaXVdP2ltYWdlQ3ViZUFycmF5fFtpdV0/aW1hZ2VbMTIzXUR8W2l1XT9pbWFnZVsxMl1EQXJyYXl8aWZ8aW58aW5saW5lfGlub3V0fGlucHV0fGludHxpbnRlcmZhY2V8aW52YXJpYW50fGxheW91dHxsb25nfGxvd3B8bWVkaXVtcHxuYW1lc3BhY2V8bm9pbmxpbmV8bm9wZXJzcGVjdGl2ZXxvdXR8b3V0cHV0fHBhcnRpdGlvbnxwYXRjaHxwcmVjaXNlfHByZWNpc2lvbnxwdWJsaWN8cmVhZG9ubHl8cmVzb3VyY2V8cmVzdHJpY3R8cmV0dXJufHNhbXBsZXxzYW1wbGVyWzEyXURBcnJheVNoYWRvd3xzYW1wbGVyWzEyXURTaGFkb3d8c2FtcGxlcjJEUmVjdFNoYWRvd3xzYW1wbGVyM0RSZWN0fHNhbXBsZXJDdWJlQXJyYXlTaGFkb3d8c2FtcGxlckN1YmVTaGFkb3d8c2hhcmVkfHNob3J0fHNpemVvZnxzbW9vdGh8c3RhdGljfHN0cnVjdHxzdWJyb3V0aW5lfHN1cGVycHxzd2l0Y2h8dGVtcGxhdGV8dGhpc3x0cnVlfHR5cGVkZWZ8dWludHx1bmlmb3JtfHVuaW9ufHVuc2lnbmVkfHVzaW5nfHZhcnlpbmd8dm9pZHx2b2xhdGlsZXx3aGlsZXx3cml0ZW9ubHkpXFxiL1xufSk7XG5cbi8vIGh0dHBzOi8vZ24uZ29vZ2xlc291cmNlLmNvbS9nbi8rL3JlZnMvaGVhZHMvbWFpbi9kb2NzL3JlZmVyZW5jZS5tZCNncmFtbWFyXG5cblByaXNtLmxhbmd1YWdlcy5nbiA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyMuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmctbGl0ZXJhbCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXCJdKVwiKD86W15cXHJcXG5cIlxcXFxdfFxcXFwuKSpcIi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFteXFxcXF0pKD86XFxcXHsyfSkqKVxcJCg/Olxce1tcXHNcXFNdKj9cXH18W2EtekEtWl9dXFx3KnwweFthLWZBLUYwLTldezJ9KS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdudW1iZXInOiAvXlxcJDB4W1xcc1xcU117Mn0kLyxcblx0XHRcdFx0XHQndmFyaWFibGUnOiAvXlxcJFxcdyskLyxcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eXFwkXFx7fFxcfSQvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0fVxuXHR9LFxuXG5cdCdrZXl3b3JkJzogL1xcYig/OmVsc2V8aWYpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnYnVpbHRpbi1mdW5jdGlvbic6IHtcblx0XHQvLyBhIGZldyBmdW5jdGlvbnMgZ2V0IHNwZWNpYWwgaGlnaGxpZ2h0aW5nIHRvIGltcHJvdmUgcmVhZGFiaWxpdHlcblx0XHRwYXR0ZXJuOiAvXFxiKD86YXNzZXJ0fGRlZmluZWR8Zm9yZWFjaHxpbXBvcnR8cG9vbHxwcmludHx0ZW1wbGF0ZXx0b29sfHRvb2xjaGFpbikoPz1cXHMqXFwoKS9pLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXHQnY29uc3RhbnQnOiAvXFxiKD86Y3VycmVudF9jcHV8Y3VycmVudF9vc3xjdXJyZW50X3Rvb2xjaGFpbnxkZWZhdWx0X3Rvb2xjaGFpbnxob3N0X2NwdXxob3N0X29zfHJvb3RfYnVpbGRfZGlyfHJvb3RfZ2VuX2Rpcnxyb290X291dF9kaXJ8dGFyZ2V0X2NwdXx0YXJnZXRfZ2VuX2Rpcnx0YXJnZXRfb3N8dGFyZ2V0X291dF9kaXIpXFxiLyxcblxuXHQnbnVtYmVyJzogLy0/XFxiXFxkK1xcYi8sXG5cblx0J29wZXJhdG9yJzogL1stKyE9PD5dPT98JiZ8XFx8XFx8Lyxcblx0J3B1bmN0dWF0aW9uJzogL1soKXt9W1xcXSwuXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5nblsnc3RyaW5nLWxpdGVyYWwnXS5pbnNpZGVbJ2ludGVycG9sYXRpb24nXS5pbnNpZGVbJ2V4cHJlc3Npb24nXS5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuZ247XG5cblByaXNtLmxhbmd1YWdlcy5nbmkgPSBQcmlzbS5sYW5ndWFnZXMuZ247XG5cblByaXNtLmxhbmd1YWdlc1snbGlua2VyLXNjcmlwdCddID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58XFxzKVxcL1xcKltcXHNcXFNdKj8oPzokfFxcKlxcLykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdpZGVudGlmaWVyJzoge1xuXHRcdHBhdHRlcm46IC9cIlteXCJcXHJcXG5dKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQnbG9jYXRpb24tY291bnRlcic6IHtcblx0XHRwYXR0ZXJuOiAvXFxCXFwuXFxCLyxcblx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0fSxcblxuXHQnc2VjdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXHcqXSlcXC5cXHcrXFxiLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J2Z1bmN0aW9uJzogL1xcYltBLVpdW0EtWl9dKig/PVxccypcXCgpLyxcblxuXHQnbnVtYmVyJzogL1xcYig/OjBbeFhdW2EtZkEtRjAtOV0rfFxcZCspW0tNXT9cXGIvLFxuXG5cdCdvcGVyYXRvcic6IC8+Pj0/fDw8PT98LT58XFwrXFwrfC0tfCYmfFxcfFxcfHw6OnxbPzp+XXxbLSsqLyUmfF4hPTw+XT0/Lyxcblx0J3B1bmN0dWF0aW9uJzogL1soKXt9LDtdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzWydsZCddID0gUHJpc20ubGFuZ3VhZ2VzWydsaW5rZXItc2NyaXB0J107XG5cblByaXNtLmxhbmd1YWdlcy5nbyA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVwiKD86XFxcXC58W15cIlxcXFxcXHJcXG5dKSpcInxgW15gXSpgLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpicmVha3xjYXNlfGNoYW58Y29uc3R8Y29udGludWV8ZGVmYXVsdHxkZWZlcnxlbHNlfGZhbGx0aHJvdWdofGZvcnxmdW5jfGdvKD86dG8pP3xpZnxpbXBvcnR8aW50ZXJmYWNlfG1hcHxwYWNrYWdlfHJhbmdlfHJldHVybnxzZWxlY3R8c3RydWN0fHN3aXRjaHx0eXBlfHZhcilcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpffGZhbHNlfGlvdGF8bmlsfHRydWUpXFxiLyxcblx0J251bWJlcic6IFtcblx0XHQvLyBiaW5hcnkgYW5kIG9jdGFsIGludGVnZXJzXG5cdFx0L1xcYjAoPzpiWzAxX10rfG9bMC03X10rKWk/XFxiL2ksXG5cdFx0Ly8gaGV4YWRlY2ltYWwgaW50ZWdlcnMgYW5kIGZsb2F0c1xuXHRcdC9cXGIweCg/OlthLWZcXGRfXSsoPzpcXC5bYS1mXFxkX10qKT98XFwuW2EtZlxcZF9dKykoPzpwWystXT9cXGQrKD86X1xcZCspKik/aT8oPyFcXHcpL2ksXG5cdFx0Ly8gZGVjaW1hbCBpbnRlZ2VycyBhbmQgZmxvYXRzXG5cdFx0Lyg/OlxcYlxcZFtcXGRfXSooPzpcXC5bXFxkX10qKT98XFxCXFwuXFxkW1xcZF9dKikoPzplWystXT9bXFxkX10rKT9pPyg/IVxcdykvaVxuXHRdLFxuXHQnb3BlcmF0b3InOiAvWypcXC8lXiE9XT0/fFxcK1s9K10/fC1bPS1dP3xcXHxbPXxdP3wmKD86PXwmfFxcXj0/KT98Pig/Oj49P3w9KT98PCg/Ojw9P3w9fC0pP3w6PXxcXC5cXC5cXC4vLFxuXHQnYnVpbHRpbic6IC9cXGIoPzphcHBlbmR8Ym9vbHxieXRlfGNhcHxjbG9zZXxjb21wbGV4fGNvbXBsZXgoPzo2NHwxMjgpfGNvcHl8ZGVsZXRlfGVycm9yfGZsb2F0KD86MzJ8NjQpfHU/aW50KD86OHwxNnwzMnw2NCk/fGltYWd8bGVufG1ha2V8bmV3fHBhbmljfHByaW50KD86bG4pP3xyZWFsfHJlY292ZXJ8cnVuZXxzdHJpbmd8dWludHB0cilcXGIvXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZ28nLCAnc3RyaW5nJywge1xuXHQnY2hhcic6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OlxcXFwufFteJ1xcXFxcXHJcXG5dKXswLDEwfScvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9XG59KTtcblxuZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5nb1snY2xhc3MtbmFtZSddO1xuXG4vLyBodHRwczovL2dvLmRldi9yZWYvbW9kI2dvLW1vZC1maWxlLW1vZHVsZVxuXG5QcmlzbS5sYW5ndWFnZXNbJ2dvLW1vZCddID0gUHJpc20ubGFuZ3VhZ2VzWydnby1tb2R1bGUnXSA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcLy4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3ZlcnNpb24nOiB7XG5cdFx0cGF0dGVybjogLyhefFtcXHMoKVtcXF0sXSl2XFxkK1xcLlxcZCtcXC5cXGQrKD86WystXVstKy5cXHddKik/KD8hW15cXHMoKVtcXF0sXSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdCdnby12ZXJzaW9uJzoge1xuXHRcdHBhdHRlcm46IC8oKD86XnxcXHMpZ29cXHMrKVxcZCsoPzpcXC5cXGQrKXsxLDJ9Lyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQna2V5d29yZCc6IHtcblx0XHRwYXR0ZXJuOiAvXihbIFxcdF0qKSg/OmV4Y2x1ZGV8Z298bW9kdWxlfHJlcGxhY2V8cmVxdWlyZXxyZXRyYWN0KVxcYi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J29wZXJhdG9yJzogLz0+Lyxcblx0J3B1bmN0dWF0aW9uJzogL1soKVtcXF0sXS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0dmFyIGludGVycG9sYXRpb24gPSB7XG5cdFx0cGF0dGVybjogLygoPzpefFteXFxcXCRdKSg/OlxcXFx7Mn0pKilcXCQoPzpcXHcrfFxce1tee31dKlxcfSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL15cXCRcXHs/fFxcfSQvLFxuXHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJyxcblx0XHRcdH0sXG5cdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdGluc2lkZTogbnVsbCxcblx0XHRcdH0sXG5cdFx0fSxcblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuZ3JhZGxlID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC8nJycoPzpbXlxcXFxdfFxcXFxbXFxzXFxTXSkqPycnJ3wnKD86XFxcXC58W15cXFxcJ1xcclxcbl0pKicvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOlxuXHRcdFx0L1xcYig/OmFwcGx5fGRlZnxkZXBlbmRlbmNpZXN8ZWxzZXxpZnxpbXBsZW1lbnRhdGlvbnxpbXBvcnR8cGx1Z2lufHBsdWdpbnN8cHJvamVjdHxyZXBvc2l0b3JpZXN8cmVwb3NpdG9yeXxzb3VyY2VTZXRzfHRhc2tzfHZhbClcXGIvLFxuXHRcdCdudW1iZXInOiAvXFxiKD86MGJbMDFfXSt8MHhbXFxkYS1mX10rKD86XFwuW1xcZGEtZl9wXFwtXSspP3xbXFxkX10rKD86XFwuW1xcZF9dKyk/KD86ZVsrLV0/XFxkKyk/KVtnbGlkZl0/XFxiL2ksXG5cdFx0J29wZXJhdG9yJzoge1xuXHRcdFx0cGF0dGVybjpcblx0XHRcdFx0LyhefFteLl0pKD86fnw9PT9+P3xcXD9bLjpdP3xcXCooPzpbLj1dfFxcKj0/KT98XFwuW0AmXXxcXC5cXC48fFxcLlxcLig/IVxcLil8LVstPT5dP3xcXCtbKz1dP3whPT98PCg/Ojw9P3w9Pj8pP3w+KD86Pj4/PT98PSk/fCZbJj1dP3xcXHxbfD1dP3xcXC89P3xcXF49P3wlPT8pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0fSxcblx0XHQncHVuY3R1YXRpb24nOiAvXFwuK3xbe31bXFxdOygpLDokXS8sXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2dyYWRsZScsICdzdHJpbmcnLCB7XG5cdFx0J3NoZWJhbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvIyEuKy8sXG5cdFx0XHRhbGlhczogJ2NvbW1lbnQnLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdH0sXG5cdFx0J2ludGVycG9sYXRpb24tc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjpcblx0XHRcdFx0L1wiXCJcIig/OlteXFxcXF18XFxcXFtcXHNcXFNdKSo/XCJcIlwifChbXCIvXSkoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxfFxcJFxcLyg/OlteLyRdfFxcJCg/OlsvJF18KD8hWy8kXSkpfFxcLyg/IVxcJCkpKlxcL1xcJC8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ludGVycG9sYXRpb24nOiBpbnRlcnBvbGF0aW9uLFxuXHRcdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy8sXG5cdFx0XHR9LFxuXHRcdH0sXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2dyYWRsZScsICdwdW5jdHVhdGlvbicsIHtcblx0XHQnc3BvY2stYmxvY2snOiAvXFxiKD86YW5kfGNsZWFudXB8ZXhwZWN0fGdpdmVufHNldHVwfHRoZW58d2hlbnx3aGVyZSk6Lyxcblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZ3JhZGxlJywgJ2Z1bmN0aW9uJywge1xuXHRcdCdhbm5vdGF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteLl0pQFxcdysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nLFxuXHRcdH0sXG5cdH0pO1xuXG5cdGludGVycG9sYXRpb24uaW5zaWRlLmV4cHJlc3Npb24uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLmdyYWRsZTtcbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmdyYXBocWwgPSB7XG5cdCdjb21tZW50JzogLyMuKi8sXG5cdCdkZXNjcmlwdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKD86XCJcIlwiKD86W15cIl18KD8hXCJcIlwiKVwiKSpcIlwiXCJ8XCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwiKSg/PVxccypbYS16X10pL2ksXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdsYW5ndWFnZS1tYXJrZG93bic6IHtcblx0XHRcdFx0cGF0dGVybjogLyheXCIoPzpcIlwiKT8pKD8hXFwxKVtcXHNcXFNdKyg/PVxcMSQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMubWFya2Rvd25cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiXCJcIig/OlteXCJdfCg/IVwiXCJcIilcIikqXCJcIlwifFwiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdudW1iZXInOiAvKD86XFxCLXxcXGIpXFxkKyg/OlxcLlxcZCspPyg/OmVbKy1dP1xcZCspP1xcYi9pLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCd2YXJpYWJsZSc6IC9cXCRbYS16X11cXHcqL2ksXG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogL0BbYS16X11cXHcqL2ksXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J2F0dHItbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW2Etel9dXFx3Kig/PVxccyooPzpcXCgoPzpbXigpXCJdfFwiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcIikqXFwpKT86KS9pLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnYXRvbS1pbnB1dCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW0EtWl1cXHcqSW5wdXRcXGIvLFxuXHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0fSxcblx0J3NjYWxhcic6IC9cXGIoPzpCb29sZWFufEZsb2F0fElEfEludHxTdHJpbmcpXFxiLyxcblx0J2NvbnN0YW50JzogL1xcYltBLVpdW0EtWl9cXGRdKlxcYi8sXG5cdCdjbGFzcy1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiKD86ZW51bXxpbXBsZW1lbnRzfGludGVyZmFjZXxvbnxzY2FsYXJ8dHlwZXx1bmlvbilcXHMrfCZcXHMqfDpcXHMqfFxcWylbQS1aX11cXHcqLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdmcmFnbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYmZyYWdtZW50XFxzK3xcXC57M31cXHMqKD8hb25cXGIpKVthLXpBLVpfXVxcdyovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J2RlZmluaXRpb24tbXV0YXRpb24nOiB7XG5cdFx0cGF0dGVybjogLyhcXGJtdXRhdGlvblxccyspW2EtekEtWl9dXFx3Ki8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQnZGVmaW5pdGlvbi1xdWVyeSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYnF1ZXJ5XFxzKylbYS16QS1aX11cXHcqLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmRpcmVjdGl2ZXxlbnVtfGV4dGVuZHxmcmFnbWVudHxpbXBsZW1lbnRzfGlucHV0fGludGVyZmFjZXxtdXRhdGlvbnxvbnxxdWVyeXxyZXBlYXRhYmxlfHNjYWxhcnxzY2hlbWF8c3Vic2NyaXB0aW9ufHR5cGV8dW5pb24pXFxiLyxcblx0J29wZXJhdG9yJzogL1shPXwmXXxcXC57M30vLFxuXHQncHJvcGVydHktcXVlcnknOiAvXFx3Kyg/PVxccypcXCgpLyxcblx0J29iamVjdCc6IC9cXHcrKD89XFxzKlxceykvLFxuXHQncHVuY3R1YXRpb24nOiAvWyEoKXt9XFxbXFxdOj0sXS8sXG5cdCdwcm9wZXJ0eSc6IC9cXHcrL1xufTtcblxuUHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIGFmdGVyVG9rZW5pemVHcmFwaHFsKGVudikge1xuXHRpZiAoZW52Lmxhbmd1YWdlICE9PSAnZ3JhcGhxbCcpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvKipcblx0ICogZ2V0IHRoZSBncmFwaHFsIHRva2VuIHN0cmVhbSB0aGF0IHdlIHdhbnQgdG8gY3VzdG9taXplXG5cdCAqXG5cdCAqIEB0eXBlZGVmIHtJbnN0YW5jZVR5cGU8aW1wb3J0KFwiLi9wcmlzbS1jb3JlXCIpW1wiVG9rZW5cIl0+fSBUb2tlblxuXHQgKiBAdHlwZSB7VG9rZW5bXX1cblx0ICovXG5cdHZhciB2YWxpZFRva2VucyA9IGVudi50b2tlbnMuZmlsdGVyKGZ1bmN0aW9uICh0b2tlbikge1xuXHRcdHJldHVybiB0eXBlb2YgdG9rZW4gIT09ICdzdHJpbmcnICYmIHRva2VuLnR5cGUgIT09ICdjb21tZW50JyAmJiB0b2tlbi50eXBlICE9PSAnc2NhbGFyJztcblx0fSk7XG5cblx0dmFyIGN1cnJlbnRJbmRleCA9IDA7XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciB0aGUgdG9rZW4gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgaW5kZXggaGFzIHRoZSBnaXZlbiB0eXBlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG5cdCAqIEByZXR1cm5zIHtUb2tlbiB8IHVuZGVmaW5lZH1cblx0ICovXG5cdGZ1bmN0aW9uIGdldFRva2VuKG9mZnNldCkge1xuXHRcdHJldHVybiB2YWxpZFRva2Vuc1tjdXJyZW50SW5kZXggKyBvZmZzZXRdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciB0aGUgdG9rZW4gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgaW5kZXggaGFzIHRoZSBnaXZlbiB0eXBlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3JlYWRvbmx5IHN0cmluZ1tdfSB0eXBlc1xuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXVxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdGZ1bmN0aW9uIGlzVG9rZW5UeXBlKHR5cGVzLCBvZmZzZXQpIHtcblx0XHRvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgdG9rZW4gPSBnZXRUb2tlbihpICsgb2Zmc2V0KTtcblx0XHRcdGlmICghdG9rZW4gfHwgdG9rZW4udHlwZSAhPT0gdHlwZXNbaV0pIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY2xvc2luZyBicmFja2V0IHRvIGFuIG9wZW5pbmcgYnJhY2tldC5cblx0ICpcblx0ICogSXQgaXMgYXNzdW1lZCB0aGF0IGB0b2tlbltjdXJyZW50SW5kZXggLSAxXWAgaXMgYW4gb3BlbmluZyBicmFja2V0LlxuXHQgKlxuXHQgKiBJZiBubyBjbG9zaW5nIGJyYWNrZXQgY291bGQgYmUgZm91bmQsIGAtMWAgd2lsbCBiZSByZXR1cm5lZC5cblx0ICpcblx0ICogQHBhcmFtIHtSZWdFeHB9IG9wZW5cblx0ICogQHBhcmFtIHtSZWdFeHB9IGNsb3NlXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9XG5cdCAqL1xuXHRmdW5jdGlvbiBmaW5kQ2xvc2luZ0JyYWNrZXQob3BlbiwgY2xvc2UpIHtcblx0XHR2YXIgc3RhY2tIZWlnaHQgPSAxO1xuXG5cdFx0Zm9yICh2YXIgaSA9IGN1cnJlbnRJbmRleDsgaSA8IHZhbGlkVG9rZW5zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgdG9rZW4gPSB2YWxpZFRva2Vuc1tpXTtcblx0XHRcdHZhciBjb250ZW50ID0gdG9rZW4uY29udGVudDtcblxuXHRcdFx0aWYgKHRva2VuLnR5cGUgPT09ICdwdW5jdHVhdGlvbicgJiYgdHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdGlmIChvcGVuLnRlc3QoY29udGVudCkpIHtcblx0XHRcdFx0XHRzdGFja0hlaWdodCsrO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGNsb3NlLnRlc3QoY29udGVudCkpIHtcblx0XHRcdFx0XHRzdGFja0hlaWdodC0tO1xuXG5cdFx0XHRcdFx0aWYgKHN0YWNrSGVpZ2h0ID09PSAwKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gLTE7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhbiBhbGlhcyB0byB0aGUgZ2l2ZW4gdG9rZW4uXG5cdCAqXG5cdCAqIEBwYXJhbSB7VG9rZW59IHRva2VuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBhbGlhc1xuXHQgKiBAcmV0dXJucyB7dm9pZH1cblx0ICovXG5cdGZ1bmN0aW9uIGFkZEFsaWFzKHRva2VuLCBhbGlhcykge1xuXHRcdHZhciBhbGlhc2VzID0gdG9rZW4uYWxpYXM7XG5cdFx0aWYgKCFhbGlhc2VzKSB7XG5cdFx0XHR0b2tlbi5hbGlhcyA9IGFsaWFzZXMgPSBbXTtcblx0XHR9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGFsaWFzZXMpKSB7XG5cdFx0XHR0b2tlbi5hbGlhcyA9IGFsaWFzZXMgPSBbYWxpYXNlc107XG5cdFx0fVxuXHRcdGFsaWFzZXMucHVzaChhbGlhcyk7XG5cdH1cblxuXHRmb3IgKDsgY3VycmVudEluZGV4IDwgdmFsaWRUb2tlbnMubGVuZ3RoOykge1xuXHRcdHZhciBzdGFydFRva2VuID0gdmFsaWRUb2tlbnNbY3VycmVudEluZGV4KytdO1xuXG5cdFx0Ly8gYWRkIHNwZWNpYWwgYWxpYXNlcyBmb3IgbXV0YXRpb24gdG9rZW5zXG5cdFx0aWYgKHN0YXJ0VG9rZW4udHlwZSA9PT0gJ2tleXdvcmQnICYmIHN0YXJ0VG9rZW4uY29udGVudCA9PT0gJ211dGF0aW9uJykge1xuXHRcdFx0Ly8gYW55IGFycmF5IG9mIHRoZSBuYW1lcyBvZiBhbGwgaW5wdXQgdmFyaWFibGVzIChpZiBhbnkpXG5cdFx0XHR2YXIgaW5wdXRWYXJpYWJsZXMgPSBbXTtcblxuXHRcdFx0aWYgKGlzVG9rZW5UeXBlKFsnZGVmaW5pdGlvbi1tdXRhdGlvbicsICdwdW5jdHVhdGlvbiddKSAmJiBnZXRUb2tlbigxKS5jb250ZW50ID09PSAnKCcpIHtcblx0XHRcdFx0Ly8gZGVmaW5pdGlvblxuXG5cdFx0XHRcdGN1cnJlbnRJbmRleCArPSAyOyAvLyBza2lwICdkZWZpbml0aW9uLW11dGF0aW9uJyBhbmQgJ3B1bmN0dWF0aW9uJ1xuXG5cdFx0XHRcdHZhciBkZWZpbml0aW9uRW5kID0gZmluZENsb3NpbmdCcmFja2V0KC9eXFwoJC8sIC9eXFwpJC8pO1xuXHRcdFx0XHRpZiAoZGVmaW5pdGlvbkVuZCA9PT0gLTEpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGZpbmQgYWxsIGlucHV0IHZhcmlhYmxlc1xuXHRcdFx0XHRmb3IgKDsgY3VycmVudEluZGV4IDwgZGVmaW5pdGlvbkVuZDsgY3VycmVudEluZGV4KyspIHtcblx0XHRcdFx0XHR2YXIgdCA9IGdldFRva2VuKDApO1xuXHRcdFx0XHRcdGlmICh0LnR5cGUgPT09ICd2YXJpYWJsZScpIHtcblx0XHRcdFx0XHRcdGFkZEFsaWFzKHQsICd2YXJpYWJsZS1pbnB1dCcpO1xuXHRcdFx0XHRcdFx0aW5wdXRWYXJpYWJsZXMucHVzaCh0LmNvbnRlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGN1cnJlbnRJbmRleCA9IGRlZmluaXRpb25FbmQgKyAxO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXNUb2tlblR5cGUoWydwdW5jdHVhdGlvbicsICdwcm9wZXJ0eS1xdWVyeSddKSAmJiBnZXRUb2tlbigwKS5jb250ZW50ID09PSAneycpIHtcblx0XHRcdFx0Y3VycmVudEluZGV4Kys7IC8vIHNraXAgb3BlbmluZyBicmFja2V0XG5cblx0XHRcdFx0YWRkQWxpYXMoZ2V0VG9rZW4oMCksICdwcm9wZXJ0eS1tdXRhdGlvbicpO1xuXG5cdFx0XHRcdGlmIChpbnB1dFZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0dmFyIG11dGF0aW9uRW5kID0gZmluZENsb3NpbmdCcmFja2V0KC9eXFx7JC8sIC9eXFx9JC8pO1xuXHRcdFx0XHRcdGlmIChtdXRhdGlvbkVuZCA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIGdpdmUgcmVmZXJlbmNlcyB0byBpbnB1dCB2YXJpYWJsZXMgYSBzcGVjaWFsIGFsaWFzXG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IGN1cnJlbnRJbmRleDsgaSA8IG11dGF0aW9uRW5kOyBpKyspIHtcblx0XHRcdFx0XHRcdHZhciB2YXJUb2tlbiA9IHZhbGlkVG9rZW5zW2ldO1xuXHRcdFx0XHRcdFx0aWYgKHZhclRva2VuLnR5cGUgPT09ICd2YXJpYWJsZScgJiYgaW5wdXRWYXJpYWJsZXMuaW5kZXhPZih2YXJUb2tlbi5jb250ZW50KSA+PSAwKSB7XG5cdFx0XHRcdFx0XHRcdGFkZEFsaWFzKHZhclRva2VuLCAndmFyaWFibGUtaW5wdXQnKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGludGVycG9sYXRpb24gPSB7XG5cdFx0cGF0dGVybjogLygoPzpefFteXFxcXCRdKSg/OlxcXFx7Mn0pKilcXCQoPzpcXHcrfFxce1tee31dKlxcfSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL15cXCRcXHs/fFxcfSQvLFxuXHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0fSxcblx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuZ3Jvb3Z5ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdC8vIGh0dHBzOi8vZ3Jvb3Z5LWxhbmcub3JnL3N5bnRheC5odG1sI19kb2xsYXJfc2xhc2h5X3N0cmluZ1xuXHRcdFx0cGF0dGVybjogLycnJyg/OlteXFxcXF18XFxcXFtcXHNcXFNdKSo/JycnfCcoPzpcXFxcLnxbXlxcXFwnXFxyXFxuXSkqJy8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzogL1xcYig/OmFic3RyYWN0fGFzfGFzc2VydHxib29sZWFufGJyZWFrfGJ5dGV8Y2FzZXxjYXRjaHxjaGFyfGNsYXNzfGNvbnN0fGNvbnRpbnVlfGRlZnxkZWZhdWx0fGRvfGRvdWJsZXxlbHNlfGVudW18ZXh0ZW5kc3xmaW5hbHxmaW5hbGx5fGZsb2F0fGZvcnxnb3RvfGlmfGltcGxlbWVudHN8aW1wb3J0fGlufGluc3RhbmNlb2Z8aW50fGludGVyZmFjZXxsb25nfG5hdGl2ZXxuZXd8cGFja2FnZXxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8cmV0dXJufHNob3J0fHN0YXRpY3xzdHJpY3RmcHxzdXBlcnxzd2l0Y2h8c3luY2hyb25pemVkfHRoaXN8dGhyb3d8dGhyb3dzfHRyYWl0fHRyYW5zaWVudHx0cnl8dm9pZHx2b2xhdGlsZXx3aGlsZSlcXGIvLFxuXHRcdCdudW1iZXInOiAvXFxiKD86MGJbMDFfXSt8MHhbXFxkYS1mX10rKD86XFwuW1xcZGEtZl9wXFwtXSspP3xbXFxkX10rKD86XFwuW1xcZF9dKyk/KD86ZVsrLV0/XFxkKyk/KVtnbGlkZl0/XFxiL2ksXG5cdFx0J29wZXJhdG9yJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteLl0pKD86fnw9PT9+P3xcXD9bLjpdP3xcXCooPzpbLj1dfFxcKj0/KT98XFwuW0AmXXxcXC5cXC48fFxcLlxcLig/IVxcLil8LVstPT5dP3xcXCtbKz1dP3whPT98PCg/Ojw9P3w9Pj8pP3w+KD86Pj4/PT98PSk/fCZbJj1dP3xcXHxbfD1dP3xcXC89P3xcXF49P3wlPT8pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdwdW5jdHVhdGlvbic6IC9cXC4rfFt7fVtcXF07KCksOiRdL1xuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdncm9vdnknLCAnc3RyaW5nJywge1xuXHRcdCdzaGViYW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyMhLisvLFxuXHRcdFx0YWxpYXM6ICdjb21tZW50Jyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2ludGVycG9sYXRpb24tc3RyaW5nJzoge1xuXHRcdFx0Ly8gVE9ETzogU2xhc2ggc3RyaW5ncyAoZS5nLiAvZm9vLykgY2FuIGNvbnRhaW4gbGluZSBicmVha3MgYnV0IHRoaXMgd2lsbCBjYXVzZSBhIGxvdCBvZiB0cm91YmxlIHdpdGhcblx0XHRcdC8vIHNpbXBsZSBkaXZpc2lvbiAoc2VlIEpTIHJlZ2V4KSwgc28gZmluZCBhIGZpeCBtYXliZT9cblx0XHRcdHBhdHRlcm46IC9cIlwiXCIoPzpbXlxcXFxdfFxcXFxbXFxzXFxTXSkqP1wiXCJcInwoW1wiL10pKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMXxcXCRcXC8oPzpbXi8kXXxcXCQoPzpbLyRdfCg/IVsvJF0pKXxcXC8oPyFcXCQpKSpcXC9cXCQvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzogaW50ZXJwb2xhdGlvbixcblx0XHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdncm9vdnknLCAncHVuY3R1YXRpb24nLCB7XG5cdFx0J3Nwb2NrLWJsb2NrJzogL1xcYig/OmFuZHxjbGVhbnVwfGV4cGVjdHxnaXZlbnxzZXR1cHx0aGVufHdoZW58d2hlcmUpOi9cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZ3Jvb3Z5JywgJ2Z1bmN0aW9uJywge1xuXHRcdCdhbm5vdGF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteLl0pQFxcdysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fVxuXHR9KTtcblxuXHRpbnRlcnBvbGF0aW9uLmluc2lkZS5leHByZXNzaW9uLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5ncm9vdnk7XG5cbn0oUHJpc20pKTtcblxuLyogVE9ET1xuXHRIYW5kbGUgbXVsdGlsaW5lIGNvZGUgYWZ0ZXIgdGFnXG5cdCAgICAlZm9vPSBzb21lIHxcblx0XHRcdG11bHRpbGluZSB8XG5cdFx0XHRjb2RlIHxcbiovXG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaGFtbCA9IHtcblx0XHQvLyBNdWx0aWxpbmUgc3R1ZmYgc2hvdWxkIGFwcGVhciBiZWZvcmUgdGhlIHJlc3RcblxuXHRcdCdtdWx0aWxpbmUtY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxcXHI/XFxufFxccikoW1xcdCBdKikpKD86XFwvfC0jKS4qKD86KD86XFxyP1xcbnxcXHIpXFwyW1xcdCBdLispKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdjb21tZW50J1xuXHRcdH0sXG5cblx0XHQnbXVsdGlsaW5lLWNvZGUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxcXHI/XFxufFxccikoW1xcdCBdKikoPzpbfi1dfFsmIV0/PSkpLiosW1xcdCBdKig/Oig/Olxccj9cXG58XFxyKVxcMltcXHQgXS4qLFtcXHQgXSopKig/Oig/Olxccj9cXG58XFxyKVxcMltcXHQgXS4rKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnJ1Ynlcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxcXHI/XFxufFxccikoW1xcdCBdKikoPzpbfi1dfFsmIV0/PSkpLipcXHxbXFx0IF0qKD86KD86XFxyP1xcbnxcXHIpXFwyW1xcdCBdLipcXHxbXFx0IF0qKSovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5ydWJ5XG5cdFx0XHR9XG5cdFx0XSxcblxuXHRcdC8vIFNlZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGZvciBrbm93biBmaWx0ZXJzXG5cdFx0J2ZpbHRlcic6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxcXHI/XFxufFxccikoW1xcdCBdKikpOltcXHctXSsoPzooPzpcXHI/XFxufFxccikoPzpcXDJbXFx0IF0uK3xcXHMqPyg/PVxccj9cXG58XFxyKSkpKy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdmaWx0ZXItbmFtZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXjpbXFx3LV0rLyxcblx0XHRcdFx0XHRhbGlhczogJ3N5bWJvbCdcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQnbWFya3VwJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFxccj9cXG58XFxyKVtcXHQgXSopPC4rLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5tYXJrdXBcblx0XHR9LFxuXHRcdCdkb2N0eXBlJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFxccj9cXG58XFxyKVtcXHQgXSopISEhKD86IC4rKT8vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3RhZyc6IHtcblx0XHRcdC8vIEFsbG93cyBmb3Igb25lIG5lc3RlZCBncm91cCBvZiBicmFjZXNcblx0XHRcdHBhdHRlcm46IC8oKD86XnxcXHI/XFxufFxccilbXFx0IF0qKVslLiNdW1xcd1xcLSMuXSpbXFx3XFwtXSg/OlxcKFteKV0rXFwpfFxceyg/Olxce1tefV0rXFx9fFtee31dKStcXH18XFxbW15cXF1dK1xcXSkqW1xcLzw+XSovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnYXR0cmlidXRlcyc6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQvLyBMb29rYmVoaW5kIHRyaWVzIHRvIHByZXZlbnQgaW50ZXJwb2xhdGlvbnMgZnJvbSBicmVha2luZyBpdCBhbGxcblx0XHRcdFx0XHRcdC8vIEFsbG93cyBmb3Igb25lIG5lc3RlZCBncm91cCBvZiBicmFjZXNcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXnxbXiNdKVxceyg/Olxce1tefV0rXFx9fFtee31dKStcXH0vLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnJ1Ynlcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9cXChbXildK1xcKS8sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0J2F0dHItdmFsdWUnOiB7XG5cdFx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyg9XFxzKikoPzpcIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCJ8W14pXFxzXSspLyxcblx0XHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdCdhdHRyLW5hbWUnOiAvW1xcdzotXSsoPz1cXHMqIT89fFxccypbLCldKS8sXG5cdFx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bPSgpLF0vXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxbW15cXF1dK1xcXS8sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5ydWJ5XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRdLFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWzw+XS9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdjb2RlJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFxccj9cXG58XFxyKVtcXHQgXSooPzpbfi1dfFsmIV0/PSkpLisvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnJ1Ynlcblx0XHR9LFxuXHRcdC8vIEludGVycG9sYXRpb25zIGluIHBsYWluIHRleHRcblx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8jXFx7W159XStcXH0vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14jXFx7fFxcfSQvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdydWJ5Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnJ1Ynlcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3B1bmN0dWF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFxccj9cXG58XFxyKVtcXHQgXSopW349XFwtJiFdKy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHR9O1xuXG5cdHZhciBmaWx0ZXJfcGF0dGVybiA9ICcoKD86XnxcXFxccj9cXFxcbnxcXFxccikoW1xcXFx0IF0qKSk6e3tmaWx0ZXJfbmFtZX19KD86KD86XFxcXHI/XFxcXG58XFxcXHIpKD86XFxcXDJbXFxcXHQgXS4rfFxcXFxzKj8oPz1cXFxccj9cXFxcbnxcXFxccikpKSsnO1xuXG5cdC8vIE5vbiBleGhhdXN0aXZlIGxpc3Qgb2YgYXZhaWxhYmxlIGZpbHRlcnMgYW5kIGFzc29jaWF0ZWQgbGFuZ3VhZ2VzXG5cdHZhciBmaWx0ZXJzID0gW1xuXHRcdCdjc3MnLFxuXHRcdHsgZmlsdGVyOiAnY29mZmVlJywgbGFuZ3VhZ2U6ICdjb2ZmZWVzY3JpcHQnIH0sXG5cdFx0J2VyYicsXG5cdFx0J2phdmFzY3JpcHQnLFxuXHRcdCdsZXNzJyxcblx0XHQnbWFya2Rvd24nLFxuXHRcdCdydWJ5Jyxcblx0XHQnc2NzcycsXG5cdFx0J3RleHRpbGUnXG5cdF07XG5cdHZhciBhbGxfZmlsdGVycyA9IHt9O1xuXHRmb3IgKHZhciBpID0gMCwgbCA9IGZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0dmFyIGZpbHRlciA9IGZpbHRlcnNbaV07XG5cdFx0ZmlsdGVyID0gdHlwZW9mIGZpbHRlciA9PT0gJ3N0cmluZycgPyB7IGZpbHRlcjogZmlsdGVyLCBsYW5ndWFnZTogZmlsdGVyIH0gOiBmaWx0ZXI7XG5cdFx0aWYgKFByaXNtLmxhbmd1YWdlc1tmaWx0ZXIubGFuZ3VhZ2VdKSB7XG5cdFx0XHRhbGxfZmlsdGVyc1snZmlsdGVyLScgKyBmaWx0ZXIuZmlsdGVyXSA9IHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKGZpbHRlcl9wYXR0ZXJuLnJlcGxhY2UoJ3t7ZmlsdGVyX25hbWV9fScsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZpbHRlci5maWx0ZXI7IH0pKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ZpbHRlci1uYW1lJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL146W1xcdy1dKy8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3N5bWJvbCdcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd0ZXh0Jzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRhbGlhczogW2ZpbHRlci5sYW5ndWFnZSwgJ2xhbmd1YWdlLScgKyBmaWx0ZXIubGFuZ3VhZ2VdLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXNbZmlsdGVyLmxhbmd1YWdlXVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdoYW1sJywgJ2ZpbHRlcicsIGFsbF9maWx0ZXJzKTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmhhbmRsZWJhcnMgPSB7XG5cdFx0J2NvbW1lbnQnOiAvXFx7XFx7IVtcXHNcXFNdKj9cXH1cXH0vLFxuXHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXlxce1xce1xcez98XFx9XFx9XFx9PyQvLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiAvKFtcIiddKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdCdudW1iZXInOiAvXFxiMHhbXFxkQS1GYS1mXStcXGJ8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OltFZV1bKy1dP1xcZCspPy8sXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHRcdCdibG9jayc6IHtcblx0XHRcdHBhdHRlcm46IC9eKFxccyooPzp+XFxzKik/KVsjXFwvXVxcUys/KD89XFxzKig/On5cXHMqKT8kfFxccykvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXHRcdCdicmFja2V0cyc6IHtcblx0XHRcdHBhdHRlcm46IC9cXFtbXlxcXV0rXFxdLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRwdW5jdHVhdGlvbjogL1xcW3xcXF0vLFxuXHRcdFx0XHR2YXJpYWJsZTogL1tcXHNcXFNdKy9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bIVwiIyUmJzooKSorLC5cXC87PD0+QFxcW1xcXFxcXF1eYHt8fX5dLyxcblx0XHQndmFyaWFibGUnOiAvW14hXCIjJSYnKCkqKyxcXC87PD0+QFxcW1xcXFxcXF1eYHt8fX5cXHNdKy9cblx0fTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHR2YXIgaGFuZGxlYmFyc1BhdHRlcm4gPSAvXFx7XFx7XFx7W1xcc1xcU10rP1xcfVxcfVxcfXxcXHtcXHtbXFxzXFxTXSs/XFx9XFx9L2c7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLmJ1aWxkUGxhY2Vob2xkZXJzKGVudiwgJ2hhbmRsZWJhcnMnLCBoYW5kbGViYXJzUGF0dGVybik7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLnRva2VuaXplUGxhY2Vob2xkZXJzKGVudiwgJ2hhbmRsZWJhcnMnKTtcblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmhicyA9IFByaXNtLmxhbmd1YWdlcy5oYW5kbGViYXJzO1xuXHRQcmlzbS5sYW5ndWFnZXMubXVzdGFjaGUgPSBQcmlzbS5sYW5ndWFnZXMuaGFuZGxlYmFycztcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuaGFza2VsbCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteLSEjJCUqKz0/JkB8fi46PD5eXFxcXFxcL10pKD86LS0oPzooPz0uKVteLSEjJCUqKz0/JkB8fi46PD5eXFxcXFxcL10uKnwkKXxcXHstW1xcc1xcU10qPy1cXH0pL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnY2hhcic6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OlteXFxcXCddfFxcXFwoPzpbYWJmbnJ0dlxcXFxcIicmXXxcXF5bQS1aQFtcXF1eX118QUNLfEJFTHxCU3xDQU58Q1J8REMxfERDMnxEQzN8REM0fERFTHxETEV8RU18RU5RfEVPVHxFU0N8RVRCfEVUWHxGRnxGU3xHU3xIVHxMRnxOQUt8TlVMfFJTfFNJfFNPfFNPSHxTUHxTVFh8U1VCfFNZTnxVU3xWVHxcXGQrfG9bMC03XSt8eFswLTlhLWZBLUZdKykpJy8sXG5cdFx0YWxpYXM6ICdzdHJpbmcnXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cXFxcXCJdfFxcXFwoPzpcXFN8XFxzK1xcXFwpKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmNhc2V8Y2xhc3N8ZGF0YXxkZXJpdmluZ3xkb3xlbHNlfGlmfGlufGluZml4bHxpbmZpeHJ8aW5zdGFuY2V8bGV0fG1vZHVsZXxuZXd0eXBlfG9mfHByaW1pdGl2ZXx0aGVufHR5cGV8d2hlcmUpXFxiLyxcblx0J2ltcG9ydC1zdGF0ZW1lbnQnOiB7XG5cdFx0Ly8gVGhlIGltcG9ydGVkIG9yIGhpZGRlbiBuYW1lcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoaXMgaW1wb3J0XG5cdFx0Ly8gc3RhdGVtZW50LiBUaGlzIGlzIGJlY2F1c2Ugd2Ugd2FudCB0byBoaWdobGlnaHQgdGhvc2UgZXhhY3RseSBsaWtlXG5cdFx0Ly8gd2UgZG8gZm9yIHRoZSBuYW1lcyBpbiB0aGUgcHJvZ3JhbS5cblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKWltcG9ydFxccysoPzpxdWFsaWZpZWRcXHMrKT8oPzpbQS1aXVtcXHcnXSopKD86XFwuW0EtWl1bXFx3J10qKSooPzpcXHMrYXNcXHMrKD86W0EtWl1bXFx3J10qKSg/OlxcLltBLVpdW1xcdyddKikqKT8oPzpcXHMraGlkaW5nXFxiKT8vbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2tleXdvcmQnOiAvXFxiKD86YXN8aGlkaW5nfGltcG9ydHxxdWFsaWZpZWQpXFxiLyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0fVxuXHR9LFxuXHQvLyBUaGVzZSBhcmUgYnVpbHRpbiB2YXJpYWJsZXMgb25seS4gQ29uc3RydWN0b3JzIGFyZSBoaWdobGlnaHRlZCBsYXRlciBhcyBhIGNvbnN0YW50LlxuXHQnYnVpbHRpbic6IC9cXGIoPzphYnN8YWNvc3xhY29zaHxhbGx8YW5kfGFueXxhcHBlbmRGaWxlfGFwcHJveFJhdGlvbmFsfGFzVHlwZU9mfGFzaW58YXNpbmh8YXRhbnxhdGFuMnxhdGFuaHxiYXNpY0lPUnVufGJyZWFrfGNhdGNofGNlaWxpbmd8Y2hyfGNvbXBhcmV8Y29uY2F0fGNvbmNhdE1hcHxjb25zdHxjb3N8Y29zaHxjdXJyeXxjeWNsZXxkZWNvZGVGbG9hdHxkZW5vbWluYXRvcnxkaWdpdFRvSW50fGRpdnxkaXZNb2R8ZHJvcHxkcm9wV2hpbGV8ZWl0aGVyfGVsZW18ZW5jb2RlRmxvYXR8ZW51bUZyb218ZW51bUZyb21UaGVufGVudW1Gcm9tVGhlblRvfGVudW1Gcm9tVG98ZXJyb3J8ZXZlbnxleHB8ZXhwb25lbnR8ZmFpbHxmaWx0ZXJ8ZmxpcHxmbG9hdERpZ2l0c3xmbG9hdFJhZGl4fGZsb2F0UmFuZ2V8Zmxvb3J8Zm1hcHxmb2xkbHxmb2xkbDF8Zm9sZHJ8Zm9sZHIxfGZyb21Eb3VibGV8ZnJvbUVudW18ZnJvbUludHxmcm9tSW50ZWdlcnxmcm9tSW50ZWdyYWx8ZnJvbVJhdGlvbmFsfGZzdHxnY2R8Z2V0Q2hhcnxnZXRDb250ZW50c3xnZXRMaW5lfGdyb3VwfGhlYWR8aWR8aW5SYW5nZXxpbmRleHxpbml0fGludFRvRGlnaXR8aW50ZXJhY3R8aW9FcnJvcnxpc0FscGhhfGlzQWxwaGFOdW18aXNBc2NpaXxpc0NvbnRyb2x8aXNEZW5vcm1hbGl6ZWR8aXNEaWdpdHxpc0hleERpZ2l0fGlzSUVFRXxpc0luZmluaXRlfGlzTG93ZXJ8aXNOYU58aXNOZWdhdGl2ZVplcm98aXNPY3REaWdpdHxpc1ByaW50fGlzU3BhY2V8aXNVcHBlcnxpdGVyYXRlfGxhc3R8bGNtfGxlbmd0aHxsZXh8bGV4RGlnaXRzfGxleExpdENoYXJ8bGluZXN8bG9nfGxvZ0Jhc2V8bG9va3VwfG1hcHxtYXBNfG1hcE1ffG1heHxtYXhCb3VuZHxtYXhpbXVtfG1heWJlfG1pbnxtaW5Cb3VuZHxtaW5pbXVtfG1vZHxuZWdhdGV8bm90fG5vdEVsZW18bnVsbHxudW1lcmF0b3J8b2RkfG9yfG9yZHxvdGhlcndpc2V8cGFja3xwaXxwcmVkfHByaW1FeGl0V2l0aHxwcmludHxwcm9kdWN0fHByb3BlckZyYWN0aW9ufHB1dENoYXJ8cHV0U3RyfHB1dFN0ckxufHF1b3R8cXVvdFJlbXxyYW5nZXxyYW5nZVNpemV8cmVhZHxyZWFkRGVjfHJlYWRGaWxlfHJlYWRGbG9hdHxyZWFkSGV4fHJlYWRJT3xyZWFkSW50fHJlYWRMaXN0fHJlYWRMaXRDaGFyfHJlYWRMbnxyZWFkT2N0fHJlYWRQYXJlbnxyZWFkU2lnbmVkfHJlYWRzfHJlYWRzUHJlY3xyZWFsVG9GcmFjfHJlY2lwfHJlbXxyZXBlYXR8cmVwbGljYXRlfHJldHVybnxyZXZlcnNlfHJvdW5kfHNjYWxlRmxvYXR8c2Nhbmx8c2NhbmwxfHNjYW5yfHNjYW5yMXxzZXF8c2VxdWVuY2V8c2VxdWVuY2VffHNob3d8c2hvd0NoYXJ8c2hvd0ludHxzaG93TGlzdHxzaG93TGl0Q2hhcnxzaG93UGFyZW58c2hvd1NpZ25lZHxzaG93U3RyaW5nfHNob3dzfHNob3dzUHJlY3xzaWduaWZpY2FuZHxzaWdudW18c2lufHNpbmh8c25kfHNvcnR8c3BhbnxzcGxpdEF0fHNxcnR8c3VidHJhY3R8c3VjY3xzdW18dGFpbHx0YWtlfHRha2VXaGlsZXx0YW58dGFuaHx0aHJlYWRUb0lPUmVzdWx0fHRvRW51bXx0b0ludHx0b0ludGVnZXJ8dG9Mb3dlcnx0b1JhdGlvbmFsfHRvVXBwZXJ8dHJ1bmNhdGV8dW5jdXJyeXx1bmRlZmluZWR8dW5saW5lc3x1bnRpbHx1bndvcmRzfHVuemlwfHVuemlwM3x1c2VyRXJyb3J8d29yZHN8d3JpdGVGaWxlfHppcHx6aXAzfHppcFdpdGh8emlwV2l0aDMpXFxiLyxcblx0Ly8gZGVjaW1hbCBpbnRlZ2VycyBhbmQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyB8IG9jdGFsIGludGVnZXJzIHwgaGV4YWRlY2ltYWwgaW50ZWdlcnNcblx0J251bWJlcic6IC9cXGIoPzpcXGQrKD86XFwuXFxkKyk/KD86ZVsrLV0/XFxkKyk/fDBvWzAtN10rfDB4WzAtOWEtZl0rKVxcYi9pLFxuXHQnb3BlcmF0b3InOiBbXG5cdFx0e1xuXHRcdFx0Ly8gaW5maXggb3BlcmF0b3Jcblx0XHRcdHBhdHRlcm46IC9gKD86W0EtWl1bXFx3J10qXFwuKSpbX2Etel1bXFx3J10qYC8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIGZ1bmN0aW9uIGNvbXBvc2l0aW9uXG5cdFx0XHRwYXR0ZXJuOiAvKFxccylcXC4oPz1cXHMpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC8vIE1vc3Qgb2YgdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBvZiB0aGUgbWVhbmluZyBvZiBhIHNpbmdsZSAnLicuXG5cdFx0Ly8gSWYgaXQgc3RhbmRzIGFsb25lIGZyZWVseSwgaXQgaXMgdGhlIGZ1bmN0aW9uIGNvbXBvc2l0aW9uLlxuXHRcdC8vIEl0IG1heSBhbHNvIGJlIGEgc2VwYXJhdG9yIGJldHdlZW4gYSBtb2R1bGUgbmFtZSBhbmQgYW4gaWRlbnRpZmllciA9PiBub1xuXHRcdC8vIG9wZXJhdG9yLiBJZiBpdCBjb21lcyB0b2dldGhlciB3aXRoIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyBpdCBpcyBhblxuXHRcdC8vIG9wZXJhdG9yIHRvby5cblx0XHQvL1xuXHRcdC8vIFRoaXMgcmVnZXggbWVhbnM6IC9bLSEjJCUqKz0/JkB8fi46PD5eXFxcXFxcL10rLyB3aXRob3V0IC9cXC4vLlxuXHRcdC9bLSEjJCUqKz0/JkB8fjo8Pl5cXFxcXFwvXVstISMkJSorPT8mQHx+Ljo8Pl5cXFxcXFwvXSp8XFwuWy0hIyQlKis9PyZAfH4uOjw+XlxcXFxcXC9dKy8sXG5cdF0sXG5cdC8vIEluIEhhc2tlbGwsIG5lYXJseSBldmVyeXRoaW5nIGlzIGEgdmFyaWFibGUsIGRvIG5vdCBoaWdobGlnaHQgdGhlc2UuXG5cdCdodmFyaWFibGUnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OltBLVpdW1xcdyddKlxcLikqW19hLXpdW1xcdyddKi8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdH1cblx0fSxcblx0J2NvbnN0YW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpbQS1aXVtcXHcnXSpcXC4pKltBLVpdW1xcdyddKi8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdH1cblx0fSxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksLjpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmhzID0gUHJpc20ubGFuZ3VhZ2VzLmhhc2tlbGw7XG5cblByaXNtLmxhbmd1YWdlcy5oYXhlID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdzdHJpbmcnOiB7XG5cdFx0Ly8gU3RyaW5ncyBjYW4gYmUgbXVsdGktbGluZVxuXHRcdHBhdHRlcm46IC9cIig/OlteXCJcXFxcXXxcXFxcW1xcc1xcU10pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhcXGIoPzphYnN0cmFjdHxjbGFzc3xlbnVtfGV4dGVuZHN8aW1wbGVtZW50c3xpbnRlcmZhY2V8bmV3fHR5cGVkZWYpXFxzKylbQS1aX11cXHcqLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0fSxcblx0XHQvLyBiYXNlZCBvbiBuYW1pbmcgY29udmVudGlvblxuXHRcdC9cXGJbQS1aXVxcdyovXG5cdF0sXG5cdC8vIFRoZSBmaW5hbCBsb29rLWFoZWFkIHByZXZlbnRzIGhpZ2hsaWdodGluZyBvZiBrZXl3b3JkcyBpZiBleHByZXNzaW9ucyBzdWNoIGFzIFwiaGF4ZS5tYWNyby5FeHByXCJcblx0J2tleXdvcmQnOiAvXFxidGhpc1xcYnxcXGIoPzphYnN0cmFjdHxhc3xicmVha3xjYXNlfGNhc3R8Y2F0Y2h8Y2xhc3N8Y29udGludWV8ZGVmYXVsdHxkb3xkeW5hbWljfGVsc2V8ZW51bXxleHRlbmRzfGV4dGVybnxmaW5hbHxmb3J8ZnJvbXxmdW5jdGlvbnxpZnxpbXBsZW1lbnRzfGltcG9ydHxpbnxpbmxpbmV8aW50ZXJmYWNlfG1hY3JvfG5ld3xudWxsfG9wZXJhdG9yfG92ZXJsb2FkfG92ZXJyaWRlfHBhY2thZ2V8cHJpdmF0ZXxwdWJsaWN8cmV0dXJufHN0YXRpY3xzdXBlcnxzd2l0Y2h8dGhyb3d8dG98dHJ5fHR5cGVkZWZ8dW50eXBlZHx1c2luZ3x2YXJ8d2hpbGUpKD8hXFwuKVxcYi8sXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW2Etel9dXFx3Kig/PVxccyooPzo8W148Pl0qPlxccyopP1xcKCkvaSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J29wZXJhdG9yJzogL1xcLnszfXxcXCtcXCt8LS18JiZ8XFx8XFx8fC0+fD0+fCg/Ojw8P3w+ezEsM318Wy0rKi8lIT0mfF5dKT0/fFs/On5dL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2hheGUnLCAnc3RyaW5nJywge1xuXHQnc3RyaW5nLWludGVycG9sYXRpb24nOiB7XG5cdFx0cGF0dGVybjogLycoPzpbXidcXFxcXXxcXFxcW1xcc1xcU10pKicvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXCQoPzpcXHcrfFxce1tee31dK1xcfSkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eXFwkXFx7P3xcXH0kLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuaGF4ZVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHR9XG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdoYXhlJywgJ2NsYXNzLW5hbWUnLCB7XG5cdCdyZWdleCc6IHtcblx0XHRwYXR0ZXJuOiAvflxcLyg/OlteXFwvXFxcXFxcclxcbl18XFxcXC4pK1xcL1thLXpdKi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3JlZ2V4LWZsYWdzJzogL1xcYlthLXpdKyQvLFxuXHRcdFx0J3JlZ2V4LXNvdXJjZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oflxcLylbXFxzXFxTXSsoPz1cXC8kKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtcmVnZXgnLFxuXHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5yZWdleFxuXHRcdFx0fSxcblx0XHRcdCdyZWdleC1kZWxpbWl0ZXInOiAvXn5cXC98XFwvJC8sXG5cdFx0fVxuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnaGF4ZScsICdrZXl3b3JkJywge1xuXHQncHJlcHJvY2Vzc29yJzoge1xuXHRcdHBhdHRlcm46IC8jKD86ZWxzZXxlbHNlaWZ8ZW5kfGlmKVxcYi4qLyxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXHQnbWV0YWRhdGEnOiB7XG5cdFx0cGF0dGVybjogL0A6P1tcXHcuXSsvLFxuXHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHR9LFxuXHQncmVpZmljYXRpb24nOiB7XG5cdFx0cGF0dGVybjogL1xcJCg/Olxcdyt8KD89XFx7KSkvLFxuXHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmhjbCA9IHtcblx0J2NvbW1lbnQnOiAvKD86XFwvXFwvfCMpLip8XFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKS8sXG5cdCdoZXJlZG9jJzoge1xuXHRcdHBhdHRlcm46IC88PC0/KFxcdytcXGIpW1xcc1xcU10qP15bIFxcdF0qXFwxL20sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHR9LFxuXHQna2V5d29yZCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKD86ZGF0YXxyZXNvdXJjZSlcXHMrKD86XCIoPzpcXFxcW1xcc1xcU118W15cXFxcXCJdKSpcIikoPz1cXHMrXCJbXFx3LV0rXCJcXHMrXFx7KS9pLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCd0eXBlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8ocmVzb3VyY2V8ZGF0YXxcXHMrKSg/OlwiKD86XFxcXFtcXHNcXFNdfFteXFxcXFwiXSkqXCIpL2ksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKD86YmFja2VuZHxtb2R1bGV8b3V0cHV0fHByb3ZpZGVyfHByb3Zpc2lvbmVyfHZhcmlhYmxlKVxccysoPzpbXFx3LV0rfFwiKD86XFxcXFtcXHNcXFNdfFteXFxcXFwiXSkqXCIpXFxzKyg/PVxceykvaSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQndHlwZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKGJhY2tlbmR8bW9kdWxlfG91dHB1dHxwcm92aWRlcnxwcm92aXNpb25lcnx2YXJpYWJsZSlcXHMrKD86W1xcdy1dK3xcIig/OlxcXFxbXFxzXFxTXXxbXlxcXFxcIl0pKlwiKVxccysvaSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdC9bXFx3LV0rKD89XFxzK1xceykvXG5cdF0sXG5cdCdwcm9wZXJ0eSc6IFtcblx0XHQvWy1cXHdcXC5dKyg/PVxccyo9KD8hPSkpLyxcblx0XHQvXCIoPzpcXFxcW1xcc1xcU118W15cXFxcXCJdKStcIig/PVxccypbOj1dKS8sXG5cdF0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cXFxcJFwiXXxcXFxcW1xcc1xcU118XFwkKD86KD89XCIpfFxcJCsoPyFcXCQpfFteXCIke10pfFxcJFxceyg/Oltee31cIl18XCIoPzpbXlxcXFxcIl18XFxcXFtcXHNcXFNdKSpcIikqXFx9KSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXiRdKVxcJFxceyg/Oltee31cIl18XCIoPzpbXlxcXFxcIl18XFxcXFtcXHNcXFNdKSpcIikqXFx9Lyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3R5cGUnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmNvdW50fGRhdGF8bG9jYWx8bW9kdWxlfHBhdGh8c2VsZnx0ZXJyYWZvcm18dmFyKVxcYlxcLilbXFx3XFwqXSsvaSxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J2tleXdvcmQnOiAvXFxiKD86Y291bnR8ZGF0YXxsb2NhbHxtb2R1bGV8cGF0aHxzZWxmfHRlcnJhZm9ybXx2YXIpXFxiL2ksXG5cdFx0XHRcdFx0J2Z1bmN0aW9uJzogL1xcdysoPz1cXCgpLyxcblx0XHRcdFx0XHQnc3RyaW5nJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1wiKD86XFxcXFtcXHNcXFNdfFteXFxcXFwiXSkqXCIvLFxuXHRcdFx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J251bWJlcic6IC9cXGIweFtcXGRhLWZdK1xcYnxcXGJcXGQrKD86XFwuXFxkKik/KD86ZVsrLV0/XFxkKyk/L2ksXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1shXFwkIyUmJygpKissLlxcLzs8PT5AXFxbXFxcXFxcXV5ge3x9fj86XS8sXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0fVxuXHR9LFxuXHQnbnVtYmVyJzogL1xcYjB4W1xcZGEtZl0rXFxifFxcYlxcZCsoPzpcXC5cXGQqKT8oPzplWystXT9cXGQrKT8vaSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvaSxcblx0J3B1bmN0dWF0aW9uJzogL1s9XFxbXFxde31dLyxcbn07XG5cblByaXNtLmxhbmd1YWdlcy5obHNsID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnYycsIHtcblxuXHQvLyBSZWdhcmRpbmcga2V5d29yZHMgYW5kIGNsYXNzIG5hbWVzOlxuXHQvLyBUaGUgbGlzdCBvZiBhbGwga2V5d29yZHMgd2FzIHNwbGl0IGludG8gJ2tleXdvcmQnIGFuZCAnY2xhc3MtbmFtZScgdG9rZW5zIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBhcmUgY2FwaXRhbGl6ZWQuXG5cdC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3dpbmRvd3Mvd2luMzIvZGlyZWN0M2RobHNsL2R4LWdyYXBoaWNzLWhsc2wtYXBwZW5kaXgta2V5d29yZHNcblx0Ly8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG93cy93aW4zMi9kaXJlY3QzZGhsc2wvZHgtZ3JhcGhpY3MtaGxzbC1hcHBlbmRpeC1yZXNlcnZlZC13b3Jkc1xuXHQnY2xhc3MtbmFtZSc6IFtcblx0XHRQcmlzbS5sYW5ndWFnZXMuY1snY2xhc3MtbmFtZSddLFxuXHRcdC9cXGIoPzpBcHBlbmRTdHJ1Y3R1cmVkQnVmZmVyfEJsZW5kU3RhdGV8QnVmZmVyfEJ5dGVBZGRyZXNzQnVmZmVyfENvbXBpbGVTaGFkZXJ8Q29tcHV0ZVNoYWRlcnxDb25zdW1lU3RydWN0dXJlZEJ1ZmZlcnxEZXB0aFN0ZW5jaWxTdGF0ZXxEZXB0aFN0ZW5jaWxWaWV3fERvbWFpblNoYWRlcnxHZW9tZXRyeVNoYWRlcnxIdWxsc2hhZGVyfElucHV0UGF0Y2h8TGluZVN0cmVhbXxPdXRwdXRQYXRjaHxQaXhlbFNoYWRlcnxQb2ludFN0cmVhbXxSV0J1ZmZlcnxSV0J5dGVBZGRyZXNzQnVmZmVyfFJXU3RydWN0dXJlZEJ1ZmZlcnxSV1RleHR1cmUoPzoxRHwxREFycmF5fDJEfDJEQXJyYXl8M0QpfFJhc3Rlcml6ZXJTdGF0ZXxSZW5kZXJUYXJnZXRWaWV3fFNhbXBsZXJDb21wYXJpc29uU3RhdGV8U2FtcGxlclN0YXRlfFN0cnVjdHVyZWRCdWZmZXJ8VGV4dHVyZSg/OjFEfDFEQXJyYXl8MkR8MkRBcnJheXwyRE1TfDJETVNBcnJheXwzRHxDdWJlfEN1YmVBcnJheSl8VHJpYW5nbGVTdHJlYW18VmVydGV4U2hhZGVyKVxcYi9cblx0XSxcblx0J2tleXdvcmQnOiBbXG5cdFx0Ly8gSExTTCBrZXl3b3JkXG5cdFx0L1xcYig/OmFzbXxhc21fZnJhZ21lbnR8YXV0b3xicmVha3xjYXNlfGNhdGNofGNidWZmZXJ8Y2VudHJvaWR8Y2hhcnxjbGFzc3xjb2x1bW5fbWFqb3J8Y29tcGlsZXxjb21waWxlX2ZyYWdtZW50fGNvbnN0fGNvbnN0X2Nhc3R8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZGlzY2FyZHxkb3xkeW5hbWljX2Nhc3R8ZWxzZXxlbnVtfGV4cGxpY2l0fGV4cG9ydHxleHRlcm58Zm9yfGZyaWVuZHxmeGdyb3VwfGdvdG98Z3JvdXBzaGFyZWR8aWZ8aW58aW5saW5lfGlub3V0fGludGVyZmFjZXxsaW5lfGxpbmVhZGp8bGluZWFyfGxvbmd8bWF0cml4fG11dGFibGV8bmFtZXNwYWNlfG5ld3xub2ludGVycG9sYXRpb258bm9wZXJzcGVjdGl2ZXxvcGVyYXRvcnxvdXR8cGFja29mZnNldHxwYXNzfHBpeGVsZnJhZ21lbnR8cG9pbnR8cHJlY2lzZXxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8cmVnaXN0ZXJ8cmVpbnRlcnByZXRfY2FzdHxyZXR1cm58cm93X21ham9yfHNhbXBsZXxzYW1wbGVyfHNoYXJlZHxzaG9ydHxzaWduZWR8c2l6ZW9mfHNub3JtfHN0YXRlYmxvY2t8c3RhdGVibG9ja19zdGF0ZXxzdGF0aWN8c3RhdGljX2Nhc3R8c3RyaW5nfHN0cnVjdHxzd2l0Y2h8dGJ1ZmZlcnx0ZWNobmlxdWV8dGVjaG5pcXVlMTB8dGVjaG5pcXVlMTF8dGVtcGxhdGV8dGV4dHVyZXx0aGlzfHRocm93fHRyaWFuZ2xlfHRyaWFuZ2xlYWRqfHRyeXx0eXBlZGVmfHR5cGVuYW1lfHVuaWZvcm18dW5pb258dW5vcm18dW5zaWduZWR8dXNpbmd8dmVjdG9yfHZlcnRleGZyYWdtZW50fHZpcnR1YWx8dm9pZHx2b2xhdGlsZXx3aGlsZSlcXGIvLFxuXHRcdC8vIHNjYWxhciwgdmVjdG9yLCBhbmQgbWF0cml4IHR5cGVzXG5cdFx0L1xcYig/OmJvb2x8ZG91YmxlfGR3b3JkfGZsb2F0fGhhbGZ8aW50fG1pbig/OjEwZmxvYXR8MTJpbnR8MTYoPzpmbG9hdHxpbnR8dWludCkpfHVpbnQpKD86WzEtNF0oPzp4WzEtNF0pPyk/XFxiL1xuXHRdLFxuXHQvLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy93aW5kb3dzL3dpbjMyL2RpcmVjdDNkaGxzbC9keC1ncmFwaGljcy1obHNsLWFwcGVuZGl4LWdyYW1tYXIjZmxvYXRpbmctcG9pbnQtbnVtYmVyc1xuXHQnbnVtYmVyJzogLyg/Oig/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpbZUVdWystXT9cXGQrKT98XFxiMHhbXFxkYS1mQS1GXSspW2ZGaEhsTHVVXT9cXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaG9vbiA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLzo6LiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIlteXCJdKlwifCdbXiddKicvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY29uc3RhbnQnOiAvJSg/OlxcLltueV18W1xcdy1dKykvLFxuXHQnY2xhc3MtbmFtZSc6IC9AKD86W2EtejAtOS1dKlthLXowLTldKT98XFwqL2ksXG5cdCdmdW5jdGlvbic6IC8oPzpcXCtbLStdIHsyfSk/KD86W2Etel0oPzpbYS16MC05LV0qW2EtejAtOV0pPykvLFxuXHQna2V5d29yZCc6IC9cXC5bXFxeXFwrXFwqPVxcP118IVs+PDpcXC49XFw/IV18PVs+fDosXFwuXFwtXFxePCs7L35cXCpcXD9dfFxcP1s+fDpcXC5cXC1cXF48XFwrJn49QCFdfFxcfFtcXCRfJTpcXC5cXC1cXF5+XFwqPUBcXD9dfFxcK1t8XFwkXFwrXFwqXXw6W19cXC1cXF5cXCt+XFwqXXwlW186XFwuXFwtXFxeXFwrflxcKj1dfFxcXlt8OlxcLlxcLVxcKyZ+XFwqPVxcP118XFwkW3xfJTo8PlxcLVxcXiZ+QD1cXD9dfDtbOjxcXCs7XFwvflxcKj1dfH5bPnxcXCRfJTxcXCtcXC8mPVxcPyFdfC0tfD09L1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuXHQgKiBAcmV0dXJucyB7UmVnRXhwfVxuXHQgKi9cblx0ZnVuY3Rpb24gaGVhZGVyVmFsdWVPZihuYW1lKSB7XG5cdFx0cmV0dXJuIFJlZ0V4cCgnKF4oPzonICsgbmFtZSArICcpOlsgXFx0XSooPyFbIFxcdF0pKVteXSsnLCAnaScpO1xuXHR9XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmh0dHAgPSB7XG5cdFx0J3JlcXVlc3QtbGluZSc6IHtcblx0XHRcdHBhdHRlcm46IC9eKD86Q09OTkVDVHxERUxFVEV8R0VUfEhFQUR8T1BUSU9OU3xQQVRDSHxQT1NUfFBSSXxQVVR8U0VBUkNIfFRSQUNFKVxccyg/Omh0dHBzPzpcXC9cXC98XFwvKVxcUypcXHNIVFRQXFwvW1xcZC5dKy9tLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdC8vIEhUVFAgTWV0aG9kXG5cdFx0XHRcdCdtZXRob2QnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15bQS1aXStcXGIvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHJvcGVydHknXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFJlcXVlc3QgVGFyZ2V0IGUuZy4gaHR0cDovL2V4YW1wbGUuY29tLCAvcGF0aC90by9maWxlXG5cdFx0XHRcdCdyZXF1ZXN0LXRhcmdldCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMpKD86aHR0cHM/OlxcL1xcL3xcXC8pXFxTKig/PVxccykvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICd1cmwnLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnVyaVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBIVFRQIFZlcnNpb25cblx0XHRcdFx0J2h0dHAtdmVyc2lvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMpSFRUUFxcL1tcXGQuXSsvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0XHRcdFx0fSxcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdyZXNwb25zZS1zdGF0dXMnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXkhUVFBcXC9bXFxkLl0rIFxcZCsgLisvbSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQvLyBIVFRQIFZlcnNpb25cblx0XHRcdFx0J2h0dHAtdmVyc2lvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXkhUVFBcXC9bXFxkLl0rLyxcblx0XHRcdFx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBTdGF0dXMgQ29kZVxuXHRcdFx0XHQnc3RhdHVzLWNvZGUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oXFxzKVxcZCsoPz1cXHMpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBSZWFzb24gUGhyYXNlXG5cdFx0XHRcdCdyZWFzb24tcGhyYXNlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKFxccykuKy8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2hlYWRlcic6IHtcblx0XHRcdHBhdHRlcm46IC9eW1xcdy1dKzouKyg/Oig/Olxcclxcbj98XFxuKVsgXFx0XS4rKSovbSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaGVhZGVyLXZhbHVlJzogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IGhlYWRlclZhbHVlT2YoL0NvbnRlbnQtU2VjdXJpdHktUG9saWN5Ly5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGFsaWFzOiBbJ2NzcCcsICdsYW5ndWFnZXMtY3NwJ10sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5jc3Bcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IGhlYWRlclZhbHVlT2YoL1B1YmxpYy1LZXktUGlucyg/Oi1SZXBvcnQtT25seSk/Ly5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGFsaWFzOiBbJ2hwa3AnLCAnbGFuZ3VhZ2VzLWhwa3AnXSxcblx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmhwa3Bcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IGhlYWRlclZhbHVlT2YoL1N0cmljdC1UcmFuc3BvcnQtU2VjdXJpdHkvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0YWxpYXM6IFsnaHN0cycsICdsYW5ndWFnZXMtaHN0cyddLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuaHN0c1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cGF0dGVybjogaGVhZGVyVmFsdWVPZigvW146XSsvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRdLFxuXHRcdFx0XHQnaGVhZGVyLW5hbWUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15bXjpdKy8sXG5cdFx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXjovXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8vIENyZWF0ZSBhIG1hcHBpbmcgb2YgQ29udGVudC1UeXBlIGhlYWRlcnMgdG8gbGFuZ3VhZ2UgZGVmaW5pdGlvbnNcblx0dmFyIGxhbmdzID0gUHJpc20ubGFuZ3VhZ2VzO1xuXHR2YXIgaHR0cExhbmd1YWdlcyA9IHtcblx0XHQnYXBwbGljYXRpb24vamF2YXNjcmlwdCc6IGxhbmdzLmphdmFzY3JpcHQsXG5cdFx0J2FwcGxpY2F0aW9uL2pzb24nOiBsYW5ncy5qc29uIHx8IGxhbmdzLmphdmFzY3JpcHQsXG5cdFx0J2FwcGxpY2F0aW9uL3htbCc6IGxhbmdzLnhtbCxcblx0XHQndGV4dC94bWwnOiBsYW5ncy54bWwsXG5cdFx0J3RleHQvaHRtbCc6IGxhbmdzLmh0bWwsXG5cdFx0J3RleHQvY3NzJzogbGFuZ3MuY3NzLFxuXHRcdCd0ZXh0L3BsYWluJzogbGFuZ3MucGxhaW5cblx0fTtcblxuXHQvLyBEZWNsYXJlIHdoaWNoIHR5cGVzIGNhbiBhbHNvIGJlIHN1ZmZpeGVzXG5cdHZhciBzdWZmaXhUeXBlcyA9IHtcblx0XHQnYXBwbGljYXRpb24vanNvbic6IHRydWUsXG5cdFx0J2FwcGxpY2F0aW9uL3htbCc6IHRydWVcblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyBhIHBhdHRlcm4gZm9yIHRoZSBnaXZlbiBjb250ZW50IHR5cGUgd2hpY2ggbWF0Y2hlcyBpdCBhbmQgYW55IHR5cGUgd2hpY2ggaGFzIGl0IGFzIGEgc3VmZml4LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFR5cGVcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGZ1bmN0aW9uIGdldFN1ZmZpeFBhdHRlcm4oY29udGVudFR5cGUpIHtcblx0XHR2YXIgc3VmZml4ID0gY29udGVudFR5cGUucmVwbGFjZSgvXlthLXpdK1xcLy8sICcnKTtcblx0XHR2YXIgc3VmZml4UGF0dGVybiA9ICdcXFxcdysvKD86W1xcXFx3Li1dK1xcXFwrKSsnICsgc3VmZml4ICsgJyg/IVsrXFxcXHcuLV0pJztcblx0XHRyZXR1cm4gJyg/OicgKyBjb250ZW50VHlwZSArICd8JyArIHN1ZmZpeFBhdHRlcm4gKyAnKSc7XG5cdH1cblxuXHQvLyBJbnNlcnQgZWFjaCBjb250ZW50IHR5cGUgcGFyc2VyIHRoYXQgaGFzIGl0cyBhc3NvY2lhdGVkIGxhbmd1YWdlXG5cdC8vIGN1cnJlbnRseSBsb2FkZWQuXG5cdHZhciBvcHRpb25zO1xuXHRmb3IgKHZhciBjb250ZW50VHlwZSBpbiBodHRwTGFuZ3VhZ2VzKSB7XG5cdFx0aWYgKGh0dHBMYW5ndWFnZXNbY29udGVudFR5cGVdKSB7XG5cdFx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdFx0dmFyIHBhdHRlcm4gPSBzdWZmaXhUeXBlc1tjb250ZW50VHlwZV0gPyBnZXRTdWZmaXhQYXR0ZXJuKGNvbnRlbnRUeXBlKSA6IGNvbnRlbnRUeXBlO1xuXHRcdFx0b3B0aW9uc1tjb250ZW50VHlwZS5yZXBsYWNlKC9cXC8vZywgJy0nKV0gPSB7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0XHQnKCcgKyAvY29udGVudC10eXBlOlxccyovLnNvdXJjZSArIHBhdHRlcm4gKyAvKD86KD86XFxyXFxuP3xcXG4pW1xcdy1dLiopKig/Olxccig/OlxcbnwoPyFcXG4pKXxcXG4pLy5zb3VyY2UgKyAnKScgK1xuXHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBsaXR0bGUgaW50ZXJlc3Rpbmc6XG5cdFx0XHRcdFx0Ly8gVGhlIEhUVFAgZm9ybWF0IHNwZWMgcmVxdWlyZWQgMSBlbXB0eSBsaW5lIGJlZm9yZSB0aGUgYm9keSB0byBtYWtlIGV2ZXJ5dGhpbmcgdW5hbWJpZ3VvdXMuXG5cdFx0XHRcdFx0Ly8gSG93ZXZlciwgd2hlbiB3cml0aW5nIGNvZGUgYnkgaGFuZCAoZS5nLiB0byBkaXNwbGF5IG9uIGEgd2Vic2l0ZSkgcGVvcGxlIGNhbiBmb3JnZXQgYWJvdXQgdGhpcyxcblx0XHRcdFx0XHQvLyBzbyB3ZSB3YW50IHRvIGJlIGxpYmVyYWwgaGVyZS4gV2Ugd2lsbCBhbGxvdyB0aGUgZW1wdHkgbGluZSB0byBiZSBvbWl0dGVkIGlmIHRoZSBmaXJzdCBsaW5lIG9mXG5cdFx0XHRcdFx0Ly8gdGhlIGJvZHkgZG9lcyBub3Qgc3RhcnQgd2l0aCBhIFtcXHctXSBjaGFyYWN0ZXIgKGFzIGhlYWRlcnMgZG8pLlxuXHRcdFx0XHRcdC9bXiBcXHRcXHctXVtcXHNcXFNdKi8uc291cmNlLFxuXHRcdFx0XHRcdCdpJ1xuXHRcdFx0XHQpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IGh0dHBMYW5ndWFnZXNbY29udGVudFR5cGVdXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXHRpZiAob3B0aW9ucykge1xuXHRcdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2h0dHAnLCAnaGVhZGVyJywgb3B0aW9ucyk7XG5cdH1cblxufShQcmlzbSkpO1xuXG4vKipcbiAqIE9yaWdpbmFsIGJ5IFNjb3R0IEhlbG1lLlxuICpcbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9zY290dGhlbG1lLmNvLnVrL2hwa3AtY2hlYXQtc2hlZXQvXG4gKi9cblxuUHJpc20ubGFuZ3VhZ2VzLmhwa3AgPSB7XG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OmluY2x1ZGVTdWJEb21haW5zfG1heC1hZ2V8cGluLXNoYTI1NnxwcmVsb2FkfHJlcG9ydC10b3xyZXBvcnQtdXJpfHN0cmljdCkoPz1bXFxzOz1dfCQpL2ksXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblx0J29wZXJhdG9yJzogLz0vLFxuXHQncHVuY3R1YXRpb24nOiAvOy9cbn07XG5cbi8qKlxuICogT3JpZ2luYWwgYnkgU2NvdHQgSGVsbWUuXG4gKlxuICogUmVmZXJlbmNlOiBodHRwczovL3Njb3R0aGVsbWUuY28udWsvaHN0cy1jaGVhdC1zaGVldC9cbiAqL1xuXG5QcmlzbS5sYW5ndWFnZXMuaHN0cyA9IHtcblx0J2RpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86aW5jbHVkZVN1YkRvbWFpbnN8bWF4LWFnZXxwcmVsb2FkKSg/PVtcXHM7PV18JCkvaSxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXHQnb3BlcmF0b3InOiAvPS8sXG5cdCdwdW5jdHVhdGlvbic6IC87L1xufTtcblxuLy8gYWNjb3JkaW5nIHRvIHRoZSBvZmZpY2FsIHJlZmVyZW5jZSAoRU4pXG4vLyBodHRwczovL2ljaGlnb2phbS5uZXQvSWNoaWdvSmFtLWVuLmh0bWxcblByaXNtLmxhbmd1YWdlcy5pY2hpZ29qYW0gPSB7XG5cdCdjb21tZW50JzogLyg/OlxcQid8UkVNKSg/OlteXFxuXFxyXSopL2ksXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86XCJcInxbISMkJSYnKCkqLFxcLzo7PD0+P15cXHcgK1xcLS5dKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdudW1iZXInOiAvXFxCI1swLTlBLUZdK3xcXEJgWzAxXSt8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OkVbKy1dP1xcZCspPy9pLFxuXHQna2V5d29yZCc6IC9cXGIoPzpCRUVQfEJQU3xDQVNFfENMRUFSfENMS3xDTE98Q0xQfENMU3xDTFR8Q0xWfENPTlR8Q09QWXxFTFNFfEVORHxGSUxFfEZJTEVTfEZPUnxHT1NVQnxHT1RPfEdTQnxJRnxJTlBVVHxLQkR8TEVEfExFVHxMSVNUfExPQUR8TE9DQVRFfExSVU58TkVXfE5FWFR8T1VUfFBMQVl8UE9LRXxQUklOVHxQV018UkVNfFJFTlVNfFJFU0VUfFJFVFVSTnxSSUdIVHxSVE58UlVOfFNBVkV8U0NST0xMfFNMRUVQfFNSTkR8U1RFUHxTVE9QfFNVQnxURU1QT3xUSEVOfFRPfFVBUlR8VklERU98V0FJVCkoPzpcXCR8XFxiKS9pLFxuXHQnZnVuY3Rpb24nOiAvXFxiKD86QUJTfEFOQXxBU0N8QklOfEJUTnxERUN8RU5EfEZSRUV8SEVMUHxIRVh8STJDUnxJMkNXfElOfElOS0VZfExFTnxMSU5FfFBFRUt8Uk5EfFNDUnxTT1VORHxTVFJ8VElDS3xVU1J8VkVSfFZQRUVLfFpFUikoPzpcXCR8XFxiKS9pLFxuXHQnbGFiZWwnOiAvKD86XFxCQFxcUyspLyxcblx0J29wZXJhdG9yJzogLzxbPT5dP3w+PT98XFx8XFx8fCYmfFsrXFwtKlxcLz18Jl5+IV18XFxiKD86QU5EfE5PVHxPUilcXGIvaSxcblx0J3B1bmN0dWF0aW9uJzogL1tcXFssOzooKVxcXV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuaWNvbiA9IHtcblx0J2NvbW1lbnQnOiAvIy4qLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFtcIiddKSg/Oig/IVxcMSlbXlxcXFxcXHJcXG5fXXxcXFxcLnxfKD8hXFwxKSg/OlxcclxcbnxbXFxzXFxTXSkpKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdudW1iZXInOiAvXFxiKD86XFxkK3JbYS16XFxkXSt8XFxkKyg/OlxcLlxcZCspPyg/OmVbKy1dP1xcZCspPylcXGJ8XFwuXFxkK1xcYi9pLFxuXHQnYnVpbHRpbi1rZXl3b3JkJzoge1xuXHRcdHBhdHRlcm46IC8mKD86YWxsb2NhdGVkfGFzY2lpfGNsb2NrfGNvbGxlY3Rpb25zfGNzZXR8Y3VycmVudHxkYXRlfGRhdGVsaW5lfGRpZ2l0c3xkdW1wfGV8ZXJyb3IoPzpudW1iZXJ8dGV4dHx2YWx1ZSk/fGVycm91dHxmYWlsfGZlYXR1cmVzfGZpbGV8aG9zdHxpbnB1dHxsY2FzZXxsZXR0ZXJzfGxldmVsfGxpbmV8bWFpbnxudWxsfG91dHB1dHxwaGl8cGl8cG9zfHByb2duYW1lfHJhbmRvbXxyZWdpb25zfHNvdXJjZXxzdG9yYWdlfHN1YmplY3R8dGltZXx0cmFjZXx1Y2FzZXx2ZXJzaW9uKVxcYi8sXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fSxcblx0J2RpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFwkXFx3Ky8sXG5cdFx0YWxpYXM6ICdidWlsdGluJ1xuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpicmVha3xieXxjYXNlfGNyZWF0ZXxkZWZhdWx0fGRvfGVsc2V8ZW5kfGV2ZXJ5fGZhaWx8Z2xvYmFsfGlmfGluaXRpYWx8aW52b2NhYmxlfGxpbmt8bG9jYWx8bmV4dHxub3R8b2Z8cHJvY2VkdXJlfHJlY29yZHxyZXBlYXR8cmV0dXJufHN0YXRpY3xzdXNwZW5kfHRoZW58dG98dW50aWx8d2hpbGUpXFxiLyxcblx0J2Z1bmN0aW9uJzogL1xcYig/IVxcZClcXHcrKD89XFxzKlsoe118XFxzKiFcXHMqXFxbKS8sXG5cdCdvcGVyYXRvcic6IC9bKy1dOig/IT0pfCg/OltcXC8/QF4lJl18XFwrXFwrP3wtLT98PT0/PT98fj09Pz0/fFxcKlxcKj98XFx8XFx8XFx8P3w8KD86LT4/fDw/PT8pfD4+Pz0/KSg/Ojo9KT98Oig/Oj06Pyk/fFshLlxcXFx8fl0vLFxuXHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXSgpe30sO10vXG59O1xuXG4vLyBodHRwczovL3VuaWNvZGUtb3JnLmdpdGh1Yi5pby9pY3UvdXNlcmd1aWRlL2Zvcm1hdF9wYXJzZS9tZXNzYWdlcy9cbi8vIGh0dHBzOi8vdW5pY29kZS1vcmcuZ2l0aHViLmlvL2ljdS1kb2NzL2FwaWRvYy9yZWxlYXNlZC9pY3U0ai9jb20vaWJtL2ljdS90ZXh0L01lc3NhZ2VGb3JtYXQuaHRtbFxuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2Vcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxldmVsXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRmdW5jdGlvbiBuZXN0ZWQoc291cmNlLCBsZXZlbCkge1xuXHRcdGlmIChsZXZlbCA8PSAwKSB7XG5cdFx0XHRyZXR1cm4gL1tdLy5zb3VyY2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBzb3VyY2UucmVwbGFjZSgvPFNFTEY+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5lc3RlZChzb3VyY2UsIGxldmVsIC0gMSk7IH0pO1xuXHRcdH1cblx0fVxuXG5cdHZhciBzdHJpbmdQYXR0ZXJuID0gLydbe306PSxdKD86W14nXXwnJykqJyg/IScpLztcblxuXHR2YXIgZXNjYXBlID0ge1xuXHRcdHBhdHRlcm46IC8nJy8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdH07XG5cdHZhciBzdHJpbmcgPSB7XG5cdFx0cGF0dGVybjogc3RyaW5nUGF0dGVybixcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnZXNjYXBlJzogZXNjYXBlXG5cdFx0fVxuXHR9O1xuXG5cdHZhciBhcmd1bWVudFNvdXJjZSA9IG5lc3RlZChcblx0XHQvXFx7KD86W157fSddfCcoPyFbe30sJ10pfCcnfDxTVFI+fDxTRUxGPikqXFx9Ly5zb3VyY2Vcblx0XHRcdC5yZXBsYWNlKC88U1RSPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBzdHJpbmdQYXR0ZXJuLnNvdXJjZTsgfSksXG5cdFx0OFxuXHQpO1xuXG5cdHZhciBuZXN0ZWRNZXNzYWdlID0ge1xuXHRcdHBhdHRlcm46IFJlZ0V4cChhcmd1bWVudFNvdXJjZSksXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnbWVzc2FnZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oXFx7KVtcXHNcXFNdKyg/PVxcfSQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0fSxcblx0XHRcdCdtZXNzYWdlLWRlbGltaXRlcic6IHtcblx0XHRcdFx0cGF0dGVybjogLy4vLFxuXHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXNbJ2ljdS1tZXNzYWdlLWZvcm1hdCddID0ge1xuXHRcdCdhcmd1bWVudCc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChhcmd1bWVudFNvdXJjZSksXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NvbnRlbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oXFx7KVtcXHNcXFNdKyg/PVxcfSQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J2FyZ3VtZW50LW5hbWUnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9eKFxccyopW157fTo9LFxcc10rLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdjaG9pY2Utc3R5bGUnOiB7XG5cdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vdW5pY29kZS1vcmcuZ2l0aHViLmlvL2ljdS1kb2NzL2FwaWRvYy9yZWxlYXNlZC9pY3U0Yy9jbGFzc2ljdV8xXzFDaG9pY2VGb3JtYXQuaHRtbCNkZXRhaWxzXG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9eKFxccyosXFxzKmNob2ljZVxccyosXFxzKilcXFMoPzpbXFxzXFxTXSpcXFMpPy8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXHwvLFxuXHRcdFx0XHRcdFx0XHRcdCdyYW5nZSc6IHtcblx0XHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9eKFxccyopWystXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcdTIyMWUpXFxzKls8I1xcdTIyNjRdLyxcblx0XHRcdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0J29wZXJhdG9yJzogL1s8I1xcdTIyNjRdLyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0J251bWJlcic6IC9cXFMrL1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0cmVzdDogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdwbHVyYWwtc3R5bGUnOiB7XG5cdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vdW5pY29kZS1vcmcuZ2l0aHViLmlvL2ljdS1kb2NzL2FwaWRvYy9yZWxlYXNlZC9pY3U0ai9jb20vaWJtL2ljdS90ZXh0L1BsdXJhbEZvcm1hdC5odG1sIzp+OnRleHQ9UGF0dGVybnMlMjBhbmQlMjBUaGVpciUyMEludGVycHJldGF0aW9uXG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9eKFxccyosXFxzKig/OnBsdXJhbHxzZWxlY3RvcmRpbmFsKVxccyosXFxzKilcXFMoPzpbXFxzXFxTXSpcXFMpPy8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHRcdCdvZmZzZXQnOiAvXm9mZnNldDpcXHMqXFxkKy8sXG5cdFx0XHRcdFx0XHRcdFx0J25lc3RlZC1tZXNzYWdlJzogbmVzdGVkTWVzc2FnZSxcblx0XHRcdFx0XHRcdFx0XHQnc2VsZWN0b3InOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvPVxcZCt8W157fTo9LFxcc10rLyxcblx0XHRcdFx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQna2V5d29yZCc6IC9eKD86ZmV3fG1hbnl8b25lfG90aGVyfHR3b3x6ZXJvKSQvXG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3NlbGVjdC1zdHlsZSc6IHtcblx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly91bmljb2RlLW9yZy5naXRodWIuaW8vaWN1LWRvY3MvYXBpZG9jL3JlbGVhc2VkL2ljdTRqL2NvbS9pYm0vaWN1L3RleHQvU2VsZWN0Rm9ybWF0Lmh0bWwjOn46dGV4dD1QYXR0ZXJucyUyMGFuZCUyMFRoZWlyJTIwSW50ZXJwcmV0YXRpb25cblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL14oXFxzKixcXHMqc2VsZWN0XFxzKixcXHMqKVxcUyg/OltcXHNcXFNdKlxcUyk/Lyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdFx0J25lc3RlZC1tZXNzYWdlJzogbmVzdGVkTWVzc2FnZSxcblx0XHRcdFx0XHRcdFx0XHQnc2VsZWN0b3InOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvW157fTo9LFxcc10rLyxcblx0XHRcdFx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQna2V5d29yZCc6IC9eb3RoZXIkL1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdrZXl3b3JkJzogL1xcYig/OmNob2ljZXxwbHVyYWx8c2VsZWN0fHNlbGVjdG9yZGluYWwpXFxiLyxcblx0XHRcdFx0XHRcdCdhcmctdHlwZSc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL1xcYig/OmRhdGV8ZHVyYXRpb258bnVtYmVyfG9yZGluYWx8c3BlbGxvdXR8dGltZSlcXGIvLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J2FyZy1za2VsZXRvbic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLygsXFxzKik6Oltee306PSxcXHNdKy8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQnYXJnLXN0eWxlJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKCxcXHMqKSg/OmN1cnJlbmN5fGZ1bGx8aW50ZWdlcnxsb25nfG1lZGl1bXxwZXJjZW50fHNob3J0KSg/PVxccyokKS8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQnYXJnLXN0eWxlLXRleHQnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKF5cXHMqLFxccyooPz1cXFMpKS8uc291cmNlICsgbmVzdGVkKC8oPzpbXnt9J118J1teJ10qJ3xcXHsoPzo8U0VMRj4pP1xcfSkrLy5zb3VyY2UsIDgpICsgJyQnKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLywvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnYXJndW1lbnQtZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8uLyxcblx0XHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnZXNjYXBlJzogZXNjYXBlLFxuXHRcdCdzdHJpbmcnOiBzdHJpbmdcblx0fTtcblxuXHRuZXN0ZWRNZXNzYWdlLmluc2lkZS5tZXNzYWdlLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlc1snaWN1LW1lc3NhZ2UtZm9ybWF0J107XG5cdFByaXNtLmxhbmd1YWdlc1snaWN1LW1lc3NhZ2UtZm9ybWF0J10uYXJndW1lbnQuaW5zaWRlLmNvbnRlbnQuaW5zaWRlWydjaG9pY2Utc3R5bGUnXS5pbnNpZGUucmVzdCA9IFByaXNtLmxhbmd1YWdlc1snaWN1LW1lc3NhZ2UtZm9ybWF0J107XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmlkcmlzID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnaGFza2VsbCcsIHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyg/Oig/Oi0tfFxcfFxcfFxcfCkuKiR8XFx7LVtcXHNcXFNdKj8tXFx9KS9tLFxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpUeXBlfGNhc2V8Y2xhc3N8Y29kYXRhfGNvbnN0cnVjdG9yfGNvcmVjb3JkfGRhdGF8ZG98ZHNsfGVsc2V8ZXhwb3J0fGlmfGltcGxlbWVudGF0aW9ufGltcGxpY2l0fGltcG9ydHxpbXBvc3NpYmxlfGlufGluZml4fGluZml4bHxpbmZpeHJ8aW5zdGFuY2V8aW50ZXJmYWNlfGxldHxtb2R1bGV8bXV0dWFsfG5hbWVzcGFjZXxvZnxwYXJhbWV0ZXJzfHBhcnRpYWx8cG9zdHVsYXRlfHByaXZhdGV8cHJvb2Z8cHVibGljfHF1b3RlR29hbHxyZWNvcmR8cmV3cml0ZXxzeW50YXh8dGhlbnx0b3RhbHx1c2luZ3x3aGVyZXx3aXRoKVxcYi8sXG5cdCdidWlsdGluJzogdW5kZWZpbmVkXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnaWRyaXMnLCAna2V5d29yZCcsIHtcblx0J2ltcG9ydC1zdGF0ZW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyheXFxzKmltcG9ydFxccyspKD86W0EtWl1bXFx3J10qKSg/OlxcLltBLVpdW1xcdyddKikqL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0fVxuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmlkciA9IFByaXNtLmxhbmd1YWdlcy5pZHJpcztcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHRQcmlzbS5sYW5ndWFnZXMuaWdub3JlID0ge1xuXHRcdC8vIGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXRpZ25vcmVcblx0XHQnY29tbWVudCc6IC9eIy4qL20sXG5cdFx0J2VudHJ5Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcUyg/Oi4qKD86KD86XFxcXCApfFxcUykpPy8sXG5cdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J29wZXJhdG9yJzogL14hfFxcKlxcKj98XFw/Lyxcblx0XHRcdFx0J3JlZ2V4Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcW1teXFxbXFxdXSpcXF0vLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLy9cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmdpdGlnbm9yZSA9IFByaXNtLmxhbmd1YWdlcy5pZ25vcmU7XG5cdFByaXNtLmxhbmd1YWdlcy5oZ2lnbm9yZSA9IFByaXNtLmxhbmd1YWdlcy5pZ25vcmU7XG5cdFByaXNtLmxhbmd1YWdlcy5ucG1pZ25vcmUgPSBQcmlzbS5sYW5ndWFnZXMuaWdub3JlO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbmZvcm03ID0ge1xuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIlteXCJdKlwiLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdzdWJzdGl0dXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXFtbXlxcW1xcXV0rXFxdLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9cXFt8XFxdLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIFNlZSByZXN0IGJlbG93XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXFtbXlxcW1xcXV0rXFxdLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3RpdGxlJzoge1xuXHRcdHBhdHRlcm46IC9eWyBcXHRdKig/OmJvb2t8Y2hhcHRlcnxwYXJ0KD8hIG9mKXxzZWN0aW9ufHRhYmxlfHZvbHVtZSlcXGIuKy9pbSxcblx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0fSxcblx0J251bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W14tXSkoPzpcXGJcXGQrKD86XFwuXFxkKyk/KD86XFxeXFxkKyk/KD86KD8hXFxkKVxcdyspP3xcXGIoPzplaWdodHxlbGV2ZW58Zml2ZXxmb3VyfG5pbmV8b25lfHNldmVufHNpeHx0ZW58dGhyZWV8dHdlbHZlfHR3bykpXFxiKD8hLSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCd2ZXJiJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXi1dKVxcYig/OmFuc3dlcmluZ3xhcHBseWluZyB0b3xhcmV8YXNraW5nfGF0dGFja2luZ3xiZSg/OmluZyk/fGJ1cm5pbmd8YnV5aW5nfGNhbGxlZHxjYXJyaWVzfGNhcnJ5KD8hIG91dCl8Y2Fycnlpbmd8Y2xpbWJpbmd8Y2xvc2luZ3xjb25jZWFsKD86aW5nfHMpP3xjb25zdWx0aW5nfGNvbnRhaW4oPzppbmd8cyk/fGN1dHRpbmd8ZHJpbmtpbmd8ZHJvcHBpbmd8ZWF0aW5nfGVuY2xvcyg/OmVzP3xpbmcpfGVudGVyaW5nfGV4YW1pbmluZ3xleGl0aW5nfGdldHRpbmd8Z2l2aW5nfGdvaW5nfGhhKD86c3x2ZXx2aW5nKXxob2xkKD86aW5nfHMpP3xpbXBsKD86aWVzfHkpfGluY29ycG9yYXQoPzplcz98aW5nKXxpbnNlcnRpbmd8aXN8anVtcGluZ3xraXNzaW5nfGxpc3RlbmluZ3xsb2NraW5nfGxvb2tpbmd8bWVhbig/OmluZ3xzKT98b3BlbmluZ3xwcm92aWQoPzplcz98aW5nKXxwdWxsaW5nfHB1c2hpbmd8cHV0dGluZ3xyZWxhdCg/OmVzP3xpbmcpfHJlbW92aW5nfHNlYXJjaGluZ3xzZWUoPzppbmd8cyk/fHNldHRpbmd8c2hvd2luZ3xzaW5naW5nfHNsZWVwaW5nfHNtZWxsaW5nfHNxdWVlemluZ3xzdXBwb3J0KD86aW5nfHMpP3xzd2VhcmluZ3xzd2l0Y2hpbmd8dGFraW5nfHRhc3Rpbmd8dGVsbGluZ3x0aGlua2luZ3x0aHJvd2luZ3x0b3VjaGluZ3x0dXJuaW5nfHR5aW5nfHVubG9jayg/OmluZ3xzKT98dmFyKD86aWVzfHl8eWluZyl8d2FpdGluZ3x3YWtpbmd8d2F2aW5nfHdlYXIoPzppbmd8cyk/KVxcYig/IS0pL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHR9LFxuXHQna2V5d29yZCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W14tXSlcXGIoPzphZnRlcnxiZWZvcmV8Y2Fycnkgb3V0fGNoZWNrfGNvbnRpbnVlIHRoZSBhY3Rpb258ZGVmaW5pdGlvbig/PSAqOil8ZG8gbm90aGluZ3xlbHNlfGVuZCAoPzppZnx0aGUgc3Rvcnl8dW5sZXNzKXxldmVyeSB0dXJufGlmfGluY2x1ZGV8aW5zdGVhZCg/OiBvZik/fGxldHxtb3ZlfG5vfG5vd3xvdGhlcndpc2V8cmVwZWF0fHJlcG9ydHxyZXN1bWUgdGhlIHN0b3J5fHJ1bGUgZm9yfHJ1bm5pbmcgdGhyb3VnaHxzYXkoPzppbmcpP3xzdG9wIHRoZSBhY3Rpb258dGVzdHx0cnkoPzppbmcpP3x1bmRlcnN0YW5kfHVubGVzc3x1c2V8d2hlbnx3aGlsZXx5ZXMpXFxiKD8hLSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdwcm9wZXJ0eSc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W14tXSlcXGIoPzphZGphY2VudCg/ISB0byl8Y2FycmllZHxjbG9zZWR8Y29uY2VhbGVkfGNvbnRhaW5lZHxkYXJrfGRlc2NyaWJlZHxlZGlibGV8ZW1wdHl8ZW5jbG9zZWR8ZW50ZXJhYmxlfGV2ZW58ZmVtYWxlfGZpeGVkIGluIHBsYWNlfGZ1bGx8aGFuZGxlZHxoZWxkfGltcHJvcGVyLW5hbWVkfGluY29ycG9yYXRlZHxpbmVkaWJsZXxpbnZpc2libGV8bGlnaHRlZHxsaXR8bG9jayg/OmFibGV8ZWQpfG1hbGV8bWFya2VkIGZvciBsaXN0aW5nfG1lbnRpb25lZHxuZWdhdGl2ZXxuZXV0ZXJ8bm9uLSg/OmVtcHR5fGZ1bGx8cmVjdXJyaW5nKXxvZGR8b3BhcXVlfG9wZW4oPzphYmxlKT98cGx1cmFsLW5hbWVkfHBvcnRhYmxlfHBvc2l0aXZlfHByaXZhdGVseS1uYW1lZHxwcm9wZXItbmFtZWR8cHJvdmlkZWR8cHVibGljYWxseS1uYW1lZHxwdXNoYWJsZSBiZXR3ZWVuIHJvb21zfHJlY3VycmluZ3xyZWxhdGVkfHJ1YmJpbmd8c2NlbmVyeXxzZWVufHNpbmd1bGFyLW5hbWVkfHN1cHBvcnRlZHxzd2luZ2luZ3xzd2l0Y2goPzphYmxlfGVkKD86IG9mZnwgb24pPyl8dG91Y2goPzphYmxlfGVkKXx0cmFuc3BhcmVudHx1bmNvbmNlYWxlZHx1bmRlc2NyaWJlZHx1bmxpdHx1bmxvY2tlZHx1bm1hcmtlZCBmb3IgbGlzdGluZ3x1bm1lbnRpb25lZHx1bm9wZW5hYmxlfHVudG91Y2hhYmxlfHVudmlzaXRlZHx2YXJpYWJsZXx2aXNpYmxlfHZpc2l0ZWR8d2VhcmFibGV8d29ybilcXGIoPyEtKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdzeW1ib2wnXG5cdH0sXG5cdCdwb3NpdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W14tXSlcXGIoPzphYm92ZXxhZGphY2VudCB0b3xiYWNrIHNpZGUgb2Z8YmVsb3d8YmV0d2Vlbnxkb3dufGVhc3R8ZXZlcnl3aGVyZXxmcm9udCBzaWRlfGhlcmV8aW58aW5zaWRlKD86IGZyb20pP3xub3J0aCg/OmVhc3R8d2VzdCk/fG5vd2hlcmV8b24oPzogdG9wIG9mKT98b3RoZXIgc2lkZXxvdXRzaWRlKD86IGZyb20pP3xwYXJ0cz8gb2Z8cmVnaW9uYWxseSBpbnxzb3V0aCg/OmVhc3R8d2VzdCk/fHRocm91Z2h8dXB8d2VzdHx3aXRoaW4pXFxiKD8hLSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J3R5cGUnOiB7XG5cdFx0cGF0dGVybjogLyhefFteLV0pXFxiKD86YWN0aW9ucz98YWN0aXZpdCg/Omllc3x5KXxhY3RvcnM/fGFuaW1hbHM/fGJhY2tkcm9wcz98Y29udGFpbmVycz98ZGV2aWNlcz98ZGlyZWN0aW9ucz98ZG9vcnM/fGhvbGRlcnM/fGtpbmRzP3xsaXN0cz98bVthZV1ufG5vYm9keXxub3RoaW5nfG5vdW5zP3xudW1iZXJzP3xvYmplY3RzP3xwZW9wbGV8cGVyc29ucz98cGxheWVyKD86J3MgaG9sZGFsbCk/fHJlZ2lvbnM/fHJlbGF0aW9ucz98cm9vbXM/fHJ1bGUoPzpib29rKT9zP3xzY2VuZXM/fHNvbWVvbmV8c29tZXRoaW5nfHN1cHBvcnRlcnM/fHRhYmxlcz98dGV4dHM/fHRoaW5ncz98dGltZXx2ZWhpY2xlcz98d29tW2FlXW4pXFxiKD8hLSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC9bLiw6Oygpe31dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluZm9ybTdbJ3N0cmluZyddLmluc2lkZVsnc3Vic3RpdHV0aW9uJ10uaW5zaWRlLnJlc3QgPSBQcmlzbS5sYW5ndWFnZXMuaW5mb3JtNztcbi8vIFdlIGRvbid0IHdhbnQgdGhlIHJlbWFpbmluZyB0ZXh0IGluIHRoZSBzdWJzdGl0dXRpb24gdG8gYmUgaGlnaGxpZ2h0ZWQgYXMgdGhlIHN0cmluZy5cblByaXNtLmxhbmd1YWdlcy5pbmZvcm03WydzdHJpbmcnXS5pbnNpZGVbJ3N1YnN0aXR1dGlvbiddLmluc2lkZS5yZXN0LnRleHQgPSB7XG5cdHBhdHRlcm46IC9cXFMoPzpcXHMqXFxTKSovLFxuXHRhbGlhczogJ2NvbW1lbnQnXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5pID0ge1xuXG5cdC8qKlxuXHQgKiBUaGUgY29tcG9uZW50IG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgdGhlIFdpbjMyIEFQSSBwYXJzZXIuXG5cdCAqXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9QcmlzbUpTL3ByaXNtL2lzc3Vlcy8yNzc1I2lzc3VlY29tbWVudC03ODc0Nzc3MjN9XG5cdCAqL1xuXG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXlsgXFxmXFx0XFx2XSopWyM7XVteXFxuXFxyXSovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdzZWN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXlsgXFxmXFx0XFx2XSopXFxbW15cXG5cXHJcXF1dKlxcXT8vbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3NlY3Rpb24tbmFtZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLyheXFxbWyBcXGZcXHRcXHZdKilbXiBcXGZcXHRcXHZcXF1dKyg/OlsgXFxmXFx0XFx2XStbXiBcXGZcXHRcXHZcXF1dKykqLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdzZWxlY3Rvcidcblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFxbfFxcXS9cblx0XHR9XG5cdH0sXG5cdCdrZXknOiB7XG5cdFx0cGF0dGVybjogLyheWyBcXGZcXHRcXHZdKilbXiBcXGZcXG5cXHJcXHRcXHY9XSsoPzpbIFxcZlxcdFxcdl0rW14gXFxmXFxuXFxyXFx0XFx2PV0rKSooPz1bIFxcZlxcdFxcdl0qPSkvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnYXR0ci1uYW1lJ1xuXHR9LFxuXHQndmFsdWUnOiB7XG5cdFx0cGF0dGVybjogLyg9WyBcXGZcXHRcXHZdKilbXiBcXGZcXG5cXHJcXHRcXHZdKyg/OlsgXFxmXFx0XFx2XStbXiBcXGZcXG5cXHJcXHRcXHZdKykqLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnYXR0ci12YWx1ZScsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW5uZXItdmFsdWUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKFwifCcpLisoPz1cXDEkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC89L1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmlvID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkoPzpcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpfFxcL1xcLy4qfCMuKikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCd0cmlwbGUtcXVvdGVkLXN0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCJcIlwiKD86XFxcXFtcXHNcXFNdfCg/IVwiXCJcIilbXlxcXFxdKSpcIlwiXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3N0cmluZydcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcLnxbXlxcXFxcXHJcXG5cIl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YWN0aXZhdGV8YWN0aXZlQ29yb0NvdW50fGFzU3RyaW5nfGJsb2NrfGJyZWFrfGNhbGx8Y2F0Y2h8Y2xvbmV8Y29sbGVjdEdhcmJhZ2V8Y29tcGlsZVN0cmluZ3xjb250aW51ZXxkb3xkb0ZpbGV8ZG9NZXNzYWdlfGRvU3RyaW5nfGVsc2V8ZWxzZWlmfGV4aXR8Zm9yfGZvcmVhY2h8Zm9yd2FyZHxnZXRFbnZpcm9ubWVudFZhcmlhYmxlfGdldFNsb3R8aGFzU2xvdHxpZnxpZkZhbHNlfGlmTmlsfGlmTmlsRXZhbHxpZlRydWV8aXNBY3RpdmV8aXNOaWx8aXNSZXN1bWFibGV8bGlzdHxtZXNzYWdlfG1ldGhvZHxwYXJlbnR8cGFzc3xwYXVzZXxwZXJmb3JtfHBlcmZvcm1XaXRoQXJnTGlzdHxwcmludHxwcmludGxufHByb3RvfHJhaXNlfHJhaXNlUmVzdW1hYmxlfHJlbW92ZVNsb3R8cmVzZW5kfHJlc3VtZXxzY2hlZHVsZXJTbGVlcFNlY29uZHN8c2VsZnxzZW5kZXJ8c2V0U2NoZWR1bGVyU2xlZXBTZWNvbmRzfHNldFNsb3R8c2hhbGxvd0NvcHl8c2xvdE5hbWVzfHN1cGVyfHN5c3RlbXx0aGVufHRoaXNCbG9ja3x0aGlzQ29udGV4dHx0cnl8dHlwZXx1bmlxdWVJZHx1cGRhdGVTbG90fHdhaXR8d2hpbGV8d3JpdGV8eWllbGQpXFxiLyxcblx0J2J1aWx0aW4nOiAvXFxiKD86QXJyYXl8QXVkaW9EZXZpY2V8QXVkaW9NaXhlcnxCaWdOdW18QmxvY2t8Qm94fEJ1ZmZlcnxDRnVuY3Rpb258Q0dJfENvbG9yfEN1cnNlc3xEQk18RE5TUmVzb2x2ZXJ8RE9Db25uZWN0aW9ufERPUHJveHl8RE9TZXJ2ZXJ8RGF0ZXxEaXJlY3Rvcnl8RHVyYXRpb258RHluTGlifEVycm9yfEV4Y2VwdGlvbnxGRlR8RmlsZXxGbm1hdGNofEZvbnR8RnV0dXJlfEdMfEdMRXxHTFNjaXNzb3J8R0xVfEdMVUN5bGluZGVyfEdMVVF1YWRyaWN8R0xVU3BoZXJlfEdMVVR8SG9zdHxJbWFnZXxJbXBvcnRlcnxMaW5rTGlzdHxMaXN0fExvYmJ5fExvY2Fsc3xNRDV8TVAzRGVjb2RlcnxNUDNFbmNvZGVyfE1hcHxNZXNzYWdlfE1vdmllfE5vdGlmaWNhdGlvbnxOdW1iZXJ8T2JqZWN0fE9wZW5HTHxQb2ludHxQcm90b3N8UmFuZG9tfFJlZ2V4fFNHTUx8U0dNTEVsZW1lbnR8U0dNTFBhcnNlcnxTUUxpdGV8U2VxdWVuY2V8U2VydmVyfFNob3dNZXNzYWdlfFNsZWVweUNhdHxTbGVlcHlDYXRDdXJzb3J8U29ja2V0fFNvY2tldE1hbmFnZXJ8U291bmR8U291cHxTdG9yZXxTdHJpbmd8VHJlZXxVRFBTZW5kZXJ8VVBEUmVjZWl2ZXJ8VVJMfFVzZXJ8V2FybmluZ3xXZWFrTGluaylcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXxuaWx8dHJ1ZSlcXGIvLFxuXHQnbnVtYmVyJzogL1xcYjB4W1xcZGEtZl0rXFxifCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzplLT9cXGQrKT8vaSxcblx0J29wZXJhdG9yJzogL1s9ISovJStcXC1eJnxdPXw+Pj89P3w8PD89P3w6Pzo/PXxcXCtcXCs/fC0tP3xcXCpcXCo/fFxcL1xcLz98JXxcXHxcXHw/fCYmP3xcXGIoPzphbmR8bm90fG9yfHJldHVybilcXGJ8QEA/fFxcP1xcPz98XFwuXFwuLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksLjpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmogPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXGJOQlxcLi4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OicnfFteJ1xcclxcbl0pKicvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzooPzpDUnxMRnxhZHZlcmJ8Y29uanVuY3Rpb258ZGVmfGRlZmluZXxkeWFkfG1vbmFkfG5vdW58dmVyYilcXGJ8KD86YXNzZXJ0fGJyZWFrfGNhc2V8Y2F0Y2hbZHRdP3xjb250aW51ZXxkb3xlbHNlfGVsc2VpZnxlbmR8ZmNhc2V8Zm9yfGZvcl9cXHcrfGdvdG9fXFx3K3xpZnxsYWJlbF9cXHcrfHJldHVybnxzZWxlY3R8dGhyb3d8dHJ5fHdoaWxlfHdoaWxzdClcXC4pLyxcblx0J3ZlcmInOiB7XG5cdFx0Ly8gTmVnYXRpdmUgbG9vay1haGVhZCBwcmV2ZW50cyBiYWQgaGlnaGxpZ2h0aW5nXG5cdFx0Ly8gb2YgXjogOy4gPS4gPTogIS4gITpcblx0XHRwYXR0ZXJuOiAvKD8hXFxeOnw7XFwufFs9IV1bLjpdKSg/Olxceyg/OlxcLnw6Oj8pP3xwKD86XFwuXFwuP3w6KXxbPSFcXF1dfFs8PisqXFwtJSR8LCNdWy46XT98Wz9eXVxcLj98WztcXFtdOj98W359XCJpXVsuOl18W0FDZUVJakxvcl1cXC58KD86W19cXC9cXFxccXN1eF18Xz9cXGQpOikvLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J251bWJlcic6IC9cXGJfPyg/Oig/IVxcZDopXFxkKyg/OlxcLlxcZCspPyg/Oig/OmFkfGFyfFtlanB4XSlfP1xcZCsoPzpcXC5cXGQrKT8pKig/OmJfP1tcXGRhLXpdKyg/OlxcLltcXGRhLXpdKyk/KT98X1xcYig/IVxcLikpLyxcblx0J2FkdmVyYic6IHtcblx0XHRwYXR0ZXJuOiAvW359XXxbXFwvXFxcXF1cXC4/fFtiZk1dXFwufHRbLjpdLyxcblx0XHRhbGlhczogJ2J1aWx0aW4nXG5cdH0sXG5cdCdvcGVyYXRvcic6IC9bPWFdWy46XXxfXFwuLyxcblx0J2Nvbmp1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8mKD86XFwuOj98Oik/fFsuOkBdWy46XT98WyFEXVsuOl18WztkSFRdXFwufGA6P3xbXFxeTFNdOnxcIi8sXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fSxcblx0J3B1bmN0dWF0aW9uJzogL1soKV0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGtleXdvcmRzID0gL1xcYig/OmFic3RyYWN0fGFzc2VydHxib29sZWFufGJyZWFrfGJ5dGV8Y2FzZXxjYXRjaHxjaGFyfGNsYXNzfGNvbnN0fGNvbnRpbnVlfGRlZmF1bHR8ZG98ZG91YmxlfGVsc2V8ZW51bXxleHBvcnRzfGV4dGVuZHN8ZmluYWx8ZmluYWxseXxmbG9hdHxmb3J8Z290b3xpZnxpbXBsZW1lbnRzfGltcG9ydHxpbnN0YW5jZW9mfGludHxpbnRlcmZhY2V8bG9uZ3xtb2R1bGV8bmF0aXZlfG5ld3xub24tc2VhbGVkfG51bGx8b3BlbnxvcGVuc3xwYWNrYWdlfHBlcm1pdHN8cHJpdmF0ZXxwcm90ZWN0ZWR8cHJvdmlkZXN8cHVibGljfHJlY29yZCg/IVxccypbKCl7fVtcXF08Pj0lfi46LDs/K1xcLSovJnxeXSl8cmVxdWlyZXN8cmV0dXJufHNlYWxlZHxzaG9ydHxzdGF0aWN8c3RyaWN0ZnB8c3VwZXJ8c3dpdGNofHN5bmNocm9uaXplZHx0aGlzfHRocm93fHRocm93c3x0b3x0cmFuc2llbnR8dHJhbnNpdGl2ZXx0cnl8dXNlc3x2YXJ8dm9pZHx2b2xhdGlsZXx3aGlsZXx3aXRofHlpZWxkKVxcYi87XG5cblx0Ly8gZnVsbCBwYWNrYWdlIChvcHRpb25hbCkgKyBwYXJlbnQgY2xhc3NlcyAob3B0aW9uYWwpXG5cdHZhciBjbGFzc05hbWVQcmVmaXggPSAvKD86W2Etel1cXHcqXFxzKlxcLlxccyopKig/OltBLVpdXFx3KlxccypcXC5cXHMqKSovLnNvdXJjZTtcblxuXHQvLyBiYXNlZCBvbiB0aGUgamF2YSBuYW1pbmcgY29udmVudGlvbnNcblx0dmFyIGNsYXNzTmFtZSA9IHtcblx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhefFteXFx3Ll0pLy5zb3VyY2UgKyBjbGFzc05hbWVQcmVmaXggKyAvW0EtWl0oPzpbXFxkX0EtWl0qW2Etel1cXHcqKT9cXGIvLnNvdXJjZSksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCduYW1lc3BhY2UnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eW2Etel1cXHcqKD86XFxzKlxcLlxccypbYS16XVxcdyopKig/OlxccypcXC4pPy8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuamF2YSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcIig/OlxcXFwufFteXCJcXFxcXFxyXFxuXSkqXCIvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0XHRjbGFzc05hbWUsXG5cdFx0XHR7XG5cdFx0XHRcdC8vIHZhcmlhYmxlcywgcGFyYW1ldGVycywgYW5kIGNvbnN0cnVjdG9yIHJlZmVyZW5jZXNcblx0XHRcdFx0Ly8gdGhpcyB0byBzdXBwb3J0IGNsYXNzIG5hbWVzIChvciBnZW5lcmljIHBhcmFtZXRlcnMpIHdoaWNoIGRvIG5vdCBjb250YWluIGEgbG93ZXIgY2FzZSBsZXR0ZXIgKGFsc28gd29ya3MgZm9yIG1ldGhvZHMpXG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKF58W15cXHcuXSkvLnNvdXJjZSArIGNsYXNzTmFtZVByZWZpeCArIC9bQS1aXVxcdyooPz1cXHMrXFx3K1xccypbOyw9KCldfFxccyooPzpcXFtbXFxzLF0qXFxdXFxzKik/OjpcXHMqbmV3XFxiKS8uc291cmNlKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBjbGFzc05hbWUuaW5zaWRlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBjbGFzcyBuYW1lcyBiYXNlZCBvbiBrZXl3b3JkXG5cdFx0XHRcdC8vIHRoaXMgdG8gc3VwcG9ydCBjbGFzcyBuYW1lcyAob3IgZ2VuZXJpYyBwYXJhbWV0ZXJzKSB3aGljaCBkbyBub3QgY29udGFpbiBhIGxvd2VyIGNhc2UgbGV0dGVyIChhbHNvIHdvcmtzIGZvciBtZXRob2RzKVxuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhcXGIoPzpjbGFzc3xlbnVtfGV4dGVuZHN8aW1wbGVtZW50c3xpbnN0YW5jZW9mfGludGVyZmFjZXxuZXd8cmVjb3JkfHRocm93cylcXHMrKS8uc291cmNlICsgY2xhc3NOYW1lUHJlZml4ICsgL1tBLVpdXFx3KlxcYi8uc291cmNlKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBjbGFzc05hbWUuaW5zaWRlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdCdmdW5jdGlvbic6IFtcblx0XHRcdFByaXNtLmxhbmd1YWdlcy5jbGlrZS5mdW5jdGlvbixcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyg6OlxccyopW2Etel9dXFx3Ki8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdudW1iZXInOiAvXFxiMGJbMDFdWzAxX10qTD9cXGJ8XFxiMHgoPzpcXC5bXFxkYS1mX3ArLV0rfFtcXGRhLWZfXSsoPzpcXC5bXFxkYS1mX3ArLV0rKT8pXFxifCg/OlxcYlxcZFtcXGRfXSooPzpcXC5bXFxkX10qKT98XFxCXFwuXFxkW1xcZF9dKikoPzplWystXT9cXGRbXFxkX10qKT9bZGZsXT8vaSxcblx0XHQnb3BlcmF0b3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14uXSkoPzo8PD0/fD4+Pj89P3wtPnwtLXxcXCtcXCt8JiZ8XFx8XFx8fDo6fFs/On5dfFstKyovJSZ8XiE9PD5dPT8pL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdqYXZhJywgJ3N0cmluZycsIHtcblx0XHQndHJpcGxlLXF1b3RlZC1zdHJpbmcnOiB7XG5cdFx0XHQvLyBodHRwOi8vb3Blbmpkay5qYXZhLm5ldC9qZXBzLzM1NSNEZXNjcmlwdGlvblxuXHRcdFx0cGF0dGVybjogL1wiXCJcIlsgXFx0XSpbXFxyXFxuXSg/Oig/OlwifFwiXCIpPyg/OlxcXFwufFteXCJcXFxcXSkpKlwiXCJcIi8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHR9LFxuXHRcdCdjaGFyJzoge1xuXHRcdFx0cGF0dGVybjogLycoPzpcXFxcLnxbXidcXFxcXFxyXFxuXSl7MSw2fScvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdqYXZhJywgJ2NsYXNzLW5hbWUnLCB7XG5cdFx0J2Fubm90YXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14uXSlAXFx3Kyg/OlxccypcXC5cXHMqXFx3KykqLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J2dlbmVyaWNzJzoge1xuXHRcdFx0cGF0dGVybjogLzwoPzpbXFx3XFxzLC4/XXwmKD8hJil8PCg/OltcXHdcXHMsLj9dfCYoPyEmKXw8KD86W1xcd1xccywuP118Jig/ISYpfDwoPzpbXFx3XFxzLC4/XXwmKD8hJikpKj4pKj4pKj4pKj4vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjbGFzcy1uYW1lJzogY2xhc3NOYW1lLFxuXHRcdFx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWzw+KCksLjpdLyxcblx0XHRcdFx0J29wZXJhdG9yJzogL1s/JnxdL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2ltcG9ydCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXFxiaW1wb3J0XFxzKykvLnNvdXJjZSArIGNsYXNzTmFtZVByZWZpeCArIC8oPzpbQS1aXVxcdyp8XFwqKSg/PVxccyo7KS8uc291cmNlKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J25hbWVzcGFjZSc6IGNsYXNzTmFtZS5pbnNpZGUubmFtZXNwYWNlLFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vLFxuXHRcdFx0XHRcdCdvcGVyYXRvcic6IC9cXCovLFxuXHRcdFx0XHRcdCdjbGFzcy1uYW1lJzogL1xcdysvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKFxcYmltcG9ydFxccytzdGF0aWNcXHMrKS8uc291cmNlICsgY2xhc3NOYW1lUHJlZml4ICsgLyg/Olxcdyt8XFwqKSg/PVxccyo7KS8uc291cmNlKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdzdGF0aWMnLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnbmFtZXNwYWNlJzogY2xhc3NOYW1lLmluc2lkZS5uYW1lc3BhY2UsXG5cdFx0XHRcdFx0J3N0YXRpYyc6IC9cXGJcXHcrJC8sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi8sXG5cdFx0XHRcdFx0J29wZXJhdG9yJzogL1xcKi8sXG5cdFx0XHRcdFx0J2NsYXNzLW5hbWUnOiAvXFx3Ky9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J25hbWVzcGFjZSc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0LyhcXGIoPzpleHBvcnRzfGltcG9ydCg/OlxccytzdGF0aWMpP3xtb2R1bGV8b3BlbnxvcGVuc3xwYWNrYWdlfHByb3ZpZGVzfHJlcXVpcmVzfHRvfHRyYW5zaXRpdmV8dXNlc3x3aXRoKVxccyspKD8hPGtleXdvcmQ+KVthLXpdXFx3Kig/OlxcLlthLXpdXFx3KikqXFwuPy9cblx0XHRcdFx0XHQuc291cmNlLnJlcGxhY2UoLzxrZXl3b3JkPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBrZXl3b3Jkcy5zb3VyY2U7IH0pKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi8sXG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn0oUHJpc20pKTtcblxuLyoqXG4gKiBPcmlnaW5hbCBieSBBYXJvbiBIYXJ1bjogaHR0cDovL2FhaGFjcmVhdGl2ZS5jb20vMjAxMi8wNy8zMS9waHAtc3ludGF4LWhpZ2hsaWdodGluZy1wcmlzbS9cbiAqIE1vZGlmaWVkIGJ5IE1pbGVzIEpvaG5zb246IGh0dHA6Ly9taWxlc2oubWVcbiAqIFJld3JpdHRlbiBieSBUb20gUGF2ZWxlY1xuICpcbiAqIFN1cHBvcnRzIFBIUCA1LjMgLSA4LjBcbiAqL1xuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHR2YXIgY29tbWVudCA9IC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFxcL1xcLy4qfCMoPyFcXFspLiovO1xuXHR2YXIgY29uc3RhbnQgPSBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYig/OmZhbHNlfHRydWUpXFxiL2ksXG5cdFx0XHRhbGlhczogJ2Jvb2xlYW4nXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKDo6XFxzKilcXGJbYS16X11cXHcqXFxiKD8hXFxzKlxcKCkvaSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmNhc2V8Y29uc3QpXFxzKylcXGJbYS16X11cXHcqKD89XFxzKls7PV0pL2ksXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdH0sXG5cdFx0L1xcYig/Om51bGwpXFxiL2ksXG5cdFx0L1xcYltBLVpfXVtBLVowLTlfXSpcXGIoPyFcXHMqXFwoKS8sXG5cdF07XG5cdHZhciBudW1iZXIgPSAvXFxiMGJbMDFdKyg/Ol9bMDFdKykqXFxifFxcYjBvWzAtN10rKD86X1swLTddKykqXFxifFxcYjB4W1xcZGEtZl0rKD86X1tcXGRhLWZdKykqXFxifCg/OlxcYlxcZCsoPzpfXFxkKykqXFwuPyg/OlxcZCsoPzpfXFxkKykqKT98XFxCXFwuXFxkKykoPzplWystXT9cXGQrKT8vaTtcblx0dmFyIG9wZXJhdG9yID0gLzw/PT58XFw/XFw/PT98XFwuezN9fFxcPz8tPnxbIT1dPT89P3w6OnxcXCpcXCo9P3wtLXxcXCtcXCt8JiZ8XFx8XFx8fDw8fD4+fFs/fl18Wy9efCUqJjw+ListXT0/Lztcblx0dmFyIHB1bmN0dWF0aW9uID0gL1t7fVxcW1xcXSgpLDo7XS87XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnBocCA9IHtcblx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0cGF0dGVybjogL1xcPz4kfF48XFw/KD86cGhwKD89XFxzKXw9KT8vaSxcblx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdH0sXG5cdFx0J2NvbW1lbnQnOiBjb21tZW50LFxuXHRcdCd2YXJpYWJsZSc6IC9cXCQrKD86XFx3K1xcYnwoPz1cXHspKS8sXG5cdFx0J3BhY2thZ2UnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKG5hbWVzcGFjZVxccyt8dXNlXFxzKyg/OmZ1bmN0aW9uXFxzKyk/KSg/OlxcXFw/XFxiW2Etel9dXFx3KikrXFxiKD8hXFxcXCkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcXFwvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnY2xhc3MtbmFtZS1kZWZpbml0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGIoPzpjbGFzc3xlbnVtfGludGVyZmFjZXx0cmFpdClcXHMrKVxcYlthLXpfXVxcdyooPyFcXFxcKVxcYi9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0XHR9LFxuXHRcdCdmdW5jdGlvbi1kZWZpbml0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGJmdW5jdGlvblxccyspW2Etel9dXFx3Kig/PVxccypcXCgpL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcKFxccyopXFxiKD86YXJyYXl8Ym9vbHxib29sZWFufGZsb2F0fGludHxpbnRlZ2VyfG9iamVjdHxzdHJpbmcpXFxiKD89XFxzKlxcKSkvaSxcblx0XHRcdFx0YWxpYXM6ICd0eXBlLWNhc3RpbmcnLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oWygsP11cXHMqKVxcYig/OmFycmF5KD8hXFxzKlxcKCl8Ym9vbHxjYWxsYWJsZXwoPzpmYWxzZXxudWxsKSg/PVxccypcXHwpfGZsb2F0fGludHxpdGVyYWJsZXxtaXhlZHxvYmplY3R8c2VsZnxzdGF0aWN8c3RyaW5nKVxcYig/PVxccypcXCQpL2ksXG5cdFx0XHRcdGFsaWFzOiAndHlwZS1oaW50Jyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcKVxccyo6XFxzKig/OlxcP1xccyopPylcXGIoPzphcnJheSg/IVxccypcXCgpfGJvb2x8Y2FsbGFibGV8KD86ZmFsc2V8bnVsbCkoPz1cXHMqXFx8KXxmbG9hdHxpbnR8aXRlcmFibGV8bWl4ZWR8bmV2ZXJ8b2JqZWN0fHNlbGZ8c3RhdGljfHN0cmluZ3x2b2lkKVxcYi9pLFxuXHRcdFx0XHRhbGlhczogJ3JldHVybi10eXBlJyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiKD86YXJyYXkoPyFcXHMqXFwoKXxib29sfGZsb2F0fGludHxpdGVyYWJsZXxtaXhlZHxvYmplY3R8c3RyaW5nfHZvaWQpXFxiL2ksXG5cdFx0XHRcdGFsaWFzOiAndHlwZS1kZWNsYXJhdGlvbicsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXHxcXHMqKSg/OmZhbHNlfG51bGwpXFxifFxcYig/OmZhbHNlfG51bGwpKD89XFxzKlxcfCkvaSxcblx0XHRcdFx0YWxpYXM6ICd0eXBlLWRlY2xhcmF0aW9uJyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiKD86cGFyZW50fHNlbGZ8c3RhdGljKSg/PVxccyo6OikvaSxcblx0XHRcdFx0YWxpYXM6ICdzdGF0aWMtY29udGV4dCcsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8geWllbGQgZnJvbVxuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcYnlpZWxkXFxzKylmcm9tXFxiL2ksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQvLyBgY2xhc3NgIGlzIGFsd2F5cyBhIGtleXdvcmQgdW5saWtlIG90aGVyIGtleXdvcmRzXG5cdFx0XHQvXFxiY2xhc3NcXGIvaSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gaHR0cHM6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQua2V5d29yZHMucGhwXG5cdFx0XHRcdC8vXG5cdFx0XHRcdC8vIGtleXdvcmRzIGNhbm5vdCBiZSBwcmVjZWRlZCBieSBcIi0+XCJcblx0XHRcdFx0Ly8gdGhlIGNvbXBsZXggbG9va2JlaGluZCBtZWFucyBgKD88ISg/Oi0+fDo6KVxccyopYFxuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXHM+Ol18KD86XnxbXi1dKT58KD86XnxbXjpdKTopXFxzKilcXGIoPzphYnN0cmFjdHxhbmR8YXJyYXl8YXN8YnJlYWt8Y2FsbGFibGV8Y2FzZXxjYXRjaHxjbG9uZXxjb25zdHxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZGllfGRvfGVjaG98ZWxzZXxlbHNlaWZ8ZW1wdHl8ZW5kZGVjbGFyZXxlbmRmb3J8ZW5kZm9yZWFjaHxlbmRpZnxlbmRzd2l0Y2h8ZW5kd2hpbGV8ZW51bXxldmFsfGV4aXR8ZXh0ZW5kc3xmaW5hbHxmaW5hbGx5fGZufGZvcnxmb3JlYWNofGZ1bmN0aW9ufGdsb2JhbHxnb3RvfGlmfGltcGxlbWVudHN8aW5jbHVkZXxpbmNsdWRlX29uY2V8aW5zdGFuY2VvZnxpbnN0ZWFkb2Z8aW50ZXJmYWNlfGlzc2V0fGxpc3R8bWF0Y2h8bmFtZXNwYWNlfG5ldmVyfG5ld3xvcnxwYXJlbnR8cHJpbnR8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlYWRvbmx5fHJlcXVpcmV8cmVxdWlyZV9vbmNlfHJldHVybnxzZWxmfHN0YXRpY3xzd2l0Y2h8dGhyb3d8dHJhaXR8dHJ5fHVuc2V0fHVzZXx2YXJ8d2hpbGV8eG9yfHlpZWxkfF9faGFsdF9jb21waWxlcilcXGIvaSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2FyZ3VtZW50LW5hbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFsoLF1cXHMqKVxcYlthLXpfXVxcdyooPz1cXHMqOig/ITopKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFxiKD86ZXh0ZW5kc3xpbXBsZW1lbnRzfGluc3RhbmNlb2Z8bmV3KD8hXFxzK3NlbGZ8XFxzK3N0YXRpYykpXFxzK3xcXGJjYXRjaFxccypcXCgpXFxiW2Etel9dXFx3Kig/IVxcXFwpXFxiL2ksXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXHxcXHMqKVxcYlthLXpfXVxcdyooPyFcXFxcKVxcYi9pLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXGJbYS16X11cXHcqKD8hXFxcXClcXGIoPz1cXHMqXFx8KS9pLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFx8XFxzKikoPzpcXFxcP1xcYlthLXpfXVxcdyopK1xcYi9pLFxuXHRcdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUtZnVsbHktcXVhbGlmaWVkJyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFxcXC9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyg/OlxcXFw/XFxiW2Etel9dXFx3KikrXFxiKD89XFxzKlxcfCkvaSxcblx0XHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lLWZ1bGx5LXF1YWxpZmllZCcsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcXFwvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFxiKD86ZXh0ZW5kc3xpbXBsZW1lbnRzfGluc3RhbmNlb2Z8bmV3KD8hXFxzK3NlbGZcXGJ8XFxzK3N0YXRpY1xcYikpXFxzK3xcXGJjYXRjaFxccypcXCgpKD86XFxcXD9cXGJbYS16X11cXHcqKStcXGIoPyFcXFxcKS9pLFxuXHRcdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUtZnVsbHktcXVhbGlmaWVkJyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFxcXC9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwkKS9pLFxuXHRcdFx0XHRhbGlhczogJ3R5cGUtZGVjbGFyYXRpb24nLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oPzpcXFxcP1xcYlthLXpfXVxcdyopKyg/PVxccypcXCQpL2ksXG5cdFx0XHRcdGFsaWFzOiBbJ2NsYXNzLW5hbWUtZnVsbHktcXVhbGlmaWVkJywgJ3R5cGUtZGVjbGFyYXRpb24nXSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFxcXC9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcYlthLXpfXVxcdyooPz1cXHMqOjopL2ksXG5cdFx0XHRcdGFsaWFzOiAnc3RhdGljLWNvbnRleHQnLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oPzpcXFxcP1xcYlthLXpfXVxcdyopKyg/PVxccyo6OikvaSxcblx0XHRcdFx0YWxpYXM6IFsnY2xhc3MtbmFtZS1mdWxseS1xdWFsaWZpZWQnLCAnc3RhdGljLWNvbnRleHQnXSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFxcXC9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhbKCw/XVxccyopW2Etel9dXFx3Kig/PVxccypcXCQpL2ksXG5cdFx0XHRcdGFsaWFzOiAndHlwZS1oaW50Jyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFsoLD9dXFxzKikoPzpcXFxcP1xcYlthLXpfXVxcdyopKyg/PVxccypcXCQpL2ksXG5cdFx0XHRcdGFsaWFzOiBbJ2NsYXNzLW5hbWUtZnVsbHktcXVhbGlmaWVkJywgJ3R5cGUtaGludCddLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFxcL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcKVxccyo6XFxzKig/OlxcP1xccyopPylcXGJbYS16X11cXHcqKD8hXFxcXClcXGIvaSxcblx0XHRcdFx0YWxpYXM6ICdyZXR1cm4tdHlwZScsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXClcXHMqOlxccyooPzpcXD9cXHMqKT8pKD86XFxcXD9cXGJbYS16X11cXHcqKStcXGIoPyFcXFxcKS9pLFxuXHRcdFx0XHRhbGlhczogWydjbGFzcy1uYW1lLWZ1bGx5LXF1YWxpZmllZCcsICdyZXR1cm4tdHlwZSddLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFxcL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnY29uc3RhbnQnOiBjb25zdGFudCxcblx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXFx3XSlcXFxcP1thLXpfXSg/OltcXHdcXFxcXSpcXHcpPyg/PVxccypcXCgpL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFxcL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3Byb3BlcnR5Jzoge1xuXHRcdFx0cGF0dGVybjogLygtPlxccyopXFx3Ky8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdCdvcGVyYXRvcic6IG9wZXJhdG9yLFxuXHRcdCdwdW5jdHVhdGlvbic6IHB1bmN0dWF0aW9uXG5cdH07XG5cblx0dmFyIHN0cmluZ19pbnRlcnBvbGF0aW9uID0ge1xuXHRcdHBhdHRlcm46IC9cXHtcXCQoPzpcXHsoPzpcXHtbXnt9XStcXH18W157fV0rKVxcfXxbXnt9XSkrXFx9fChefFteXFxcXHtdKVxcJCsoPzpcXHcrKD86XFxbW15cXHJcXG5cXFtcXF1dK1xcXXwtPlxcdyspPykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucGhwXG5cdH07XG5cblx0dmFyIHN0cmluZyA9IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvPDw8JyhbXiddKyknW1xcclxcbl0oPzouKltcXHJcXG5dKSo/XFwxOy8sXG5cdFx0XHRhbGlhczogJ25vd2RvYy1zdHJpbmcnLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL148PDwnW14nXSsnfFthLXpfXVxcdyo7JC9pLFxuXHRcdFx0XHRcdGFsaWFzOiAnc3ltYm9sJyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9ePDw8Jz98Wyc7XSQvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvPDw8KD86XCIoW15cIl0rKVwiW1xcclxcbl0oPzouKltcXHJcXG5dKSo/XFwxO3woW2Etel9dXFx3KilbXFxyXFxuXSg/Oi4qW1xcclxcbl0pKj9cXDI7KS9pLFxuXHRcdFx0YWxpYXM6ICdoZXJlZG9jLXN0cmluZycsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXjw8PCg/OlwiW15cIl0rXCJ8W2Etel9dXFx3Kil8W2Etel9dXFx3KjskL2ksXG5cdFx0XHRcdFx0YWxpYXM6ICdzeW1ib2wnLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL148PDxcIj98W1wiO10kL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J2ludGVycG9sYXRpb24nOiBzdHJpbmdfaW50ZXJwb2xhdGlvblxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL2AoPzpcXFxcW1xcc1xcU118W15cXFxcYF0pKmAvLFxuXHRcdFx0YWxpYXM6ICdiYWNrdGljay1xdW90ZWQtc3RyaW5nJyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLycoPzpcXFxcW1xcc1xcU118W15cXFxcJ10pKicvLFxuXHRcdFx0YWxpYXM6ICdzaW5nbGUtcXVvdGVkLXN0cmluZycsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cIig/OlxcXFxbXFxzXFxTXXxbXlxcXFxcIl0pKlwiLyxcblx0XHRcdGFsaWFzOiAnZG91YmxlLXF1b3RlZC1zdHJpbmcnLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzogc3RyaW5nX2ludGVycG9sYXRpb25cblx0XHRcdH1cblx0XHR9XG5cdF07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncGhwJywgJ3ZhcmlhYmxlJywge1xuXHRcdCdzdHJpbmcnOiBzdHJpbmcsXG5cdFx0J2F0dHJpYnV0ZSc6IHtcblx0XHRcdHBhdHRlcm46IC8jXFxbKD86W15cIidcXC8jXXxcXC8oPyFbKi9dKXxcXC9cXC8uKiR8Iyg/IVxcWykuKiR8XFwvXFwqKD86W14qXXxcXCooPyFcXC8pKSpcXCpcXC98XCIoPzpcXFxcW1xcc1xcU118W15cXFxcXCJdKSpcInwnKD86XFxcXFtcXHNcXFNdfFteXFxcXCddKSonKStcXF0oPz1cXHMqW2EteiQjXSkvaW0sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2F0dHJpYnV0ZS1jb250ZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKCNcXFspW1xcc1xcU10rKD89XFxdJCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0Ly8gaW5zaWRlIGNhbiBhcHBlYXIgc3Vic2V0IG9mIHBocFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J2NvbW1lbnQnOiBjb21tZW50LFxuXHRcdFx0XHRcdFx0J3N0cmluZyc6IHN0cmluZyxcblx0XHRcdFx0XHRcdCdhdHRyaWJ1dGUtY2xhc3MtbmFtZSc6IFtcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oW146XXxeKVxcYlthLXpfXVxcdyooPyFcXFxcKVxcYi9pLFxuXHRcdFx0XHRcdFx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZScsXG5cdFx0XHRcdFx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oW146XXxeKSg/OlxcXFw/XFxiW2Etel9dXFx3KikrL2ksXG5cdFx0XHRcdFx0XHRcdFx0YWxpYXM6IFtcblx0XHRcdFx0XHRcdFx0XHRcdCdjbGFzcy1uYW1lJyxcblx0XHRcdFx0XHRcdFx0XHRcdCdjbGFzcy1uYW1lLWZ1bGx5LXF1YWxpZmllZCdcblx0XHRcdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcXFwvXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0J2NvbnN0YW50JzogY29uc3RhbnQsXG5cdFx0XHRcdFx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdFx0XHRcdFx0J29wZXJhdG9yJzogb3BlcmF0b3IsXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiBwdW5jdHVhdGlvblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXiNcXFt8XFxdJC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdGlmICghLzxcXD8vLnRlc3QoZW52LmNvZGUpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIHBocFBhdHRlcm4gPSAvPFxcPyg/OlteXCInLyNdfFxcLyg/IVsqL10pfChcInwnKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDEpW15cXFxcXSkqXFwxfCg/OlxcL1xcL3wjKD8hXFxbKSkoPzpbXj9cXG5cXHJdfFxcPyg/IT4pKSooPz0kfFxcPz58W1xcclxcbl0pfCNcXFt8XFwvXFwqKD86W14qXXxcXCooPyFcXC8pKSooPzpcXCpcXC98JCkpKj8oPzpcXD8+fCQpL2c7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLmJ1aWxkUGxhY2Vob2xkZXJzKGVudiwgJ3BocCcsIHBocFBhdHRlcm4pO1xuXHR9KTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS50b2tlbml6ZVBsYWNlaG9sZGVycyhlbnYsICdwaHAnKTtcblx0fSk7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBqYXZhRG9jTGlrZSA9IFByaXNtLmxhbmd1YWdlcy5qYXZhZG9jbGlrZSA9IHtcblx0XHQncGFyYW1ldGVyJzoge1xuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKig/OlxcL3szfXxcXCp8XFwvXFwqXFwqKVxccypAKD86YXJnfGFyZ3VtZW50c3xwYXJhbSlcXHMrKVxcdysvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0Ly8ga2V5d29yZHMgYXJlIHRoZSBmaXJzdCB3b3JkIGluIGEgbGluZSBwcmVjZWRlZCBiZSBhbiBgQGAgb3Igc3Vycm91bmRlZCBieSBjdXJseSBicmFjZXMuXG5cdFx0XHQvLyBAd29yZCwge0B3b3JkfVxuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKig/OlxcL3szfXxcXCp8XFwvXFwqXFwqKVxccyp8XFx7KUBbYS16XVthLXpBLVotXStcXGIvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdwdW5jdHVhdGlvbic6IC9be31dL1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIEFkZHMgZG9jIGNvbW1lbnQgc3VwcG9ydCB0byB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgYW5kIGNhbGxzIGEgZ2l2ZW4gY2FsbGJhY2sgb24gZWFjaCBkb2MgY29tbWVudCBwYXR0ZXJuLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZyB0aGUgbGFuZ3VhZ2UgYWRkIGRvYyBjb21tZW50IHN1cHBvcnQgdG8uXG5cdCAqIEBwYXJhbSB7KHBhdHRlcm46IHtpbnNpZGU6IHtyZXN0OiB1bmRlZmluZWR9fSkgPT4gdm9pZH0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIGVhY2ggZG9jIGNvbW1lbnQgcGF0dGVybiBhcyBhcmd1bWVudC5cblx0ICovXG5cdGZ1bmN0aW9uIGRvY0NvbW1lbnRTdXBwb3J0KGxhbmcsIGNhbGxiYWNrKSB7XG5cdFx0dmFyIHRva2VuTmFtZSA9ICdkb2MtY29tbWVudCc7XG5cblx0XHR2YXIgZ3JhbW1hciA9IFByaXNtLmxhbmd1YWdlc1tsYW5nXTtcblx0XHRpZiAoIWdyYW1tYXIpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dmFyIHRva2VuID0gZ3JhbW1hclt0b2tlbk5hbWVdO1xuXG5cdFx0aWYgKCF0b2tlbikge1xuXHRcdFx0Ly8gYWRkIGRvYyBjb21tZW50OiAvKiogKi9cblx0XHRcdHZhciBkZWZpbml0aW9uID0ge307XG5cdFx0XHRkZWZpbml0aW9uW3Rva2VuTmFtZV0gPSB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcL1xcKlxcKlteL11bXFxzXFxTXSo/KD86XFwqXFwvfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdjb21tZW50J1xuXHRcdFx0fTtcblxuXHRcdFx0Z3JhbW1hciA9IFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUobGFuZywgJ2NvbW1lbnQnLCBkZWZpbml0aW9uKTtcblx0XHRcdHRva2VuID0gZ3JhbW1hclt0b2tlbk5hbWVdO1xuXHRcdH1cblxuXHRcdGlmICh0b2tlbiBpbnN0YW5jZW9mIFJlZ0V4cCkgeyAvLyBjb252ZXJ0IHJlZ2V4IHRvIG9iamVjdFxuXHRcdFx0dG9rZW4gPSBncmFtbWFyW3Rva2VuTmFtZV0gPSB7IHBhdHRlcm46IHRva2VuIH07XG5cdFx0fVxuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodG9rZW4pKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMCwgbCA9IHRva2VuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRpZiAodG9rZW5baV0gaW5zdGFuY2VvZiBSZWdFeHApIHtcblx0XHRcdFx0XHR0b2tlbltpXSA9IHsgcGF0dGVybjogdG9rZW5baV0gfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjYWxsYmFjayh0b2tlbltpXSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNhbGxiYWNrKHRva2VuKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBkb2MtY29tbWVudCBzdXBwb3J0IHRvIHRoZSBnaXZlbiBsYW5ndWFnZXMgZm9yIHRoZSBnaXZlbiBkb2N1bWVudGF0aW9uIGxhbmd1YWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ1tdfHN0cmluZ30gbGFuZ3VhZ2VzXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkb2NMYW5ndWFnZVxuXHQgKi9cblx0ZnVuY3Rpb24gYWRkU3VwcG9ydChsYW5ndWFnZXMsIGRvY0xhbmd1YWdlKSB7XG5cdFx0aWYgKHR5cGVvZiBsYW5ndWFnZXMgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRsYW5ndWFnZXMgPSBbbGFuZ3VhZ2VzXTtcblx0XHR9XG5cblx0XHRsYW5ndWFnZXMuZm9yRWFjaChmdW5jdGlvbiAobGFuZykge1xuXHRcdFx0ZG9jQ29tbWVudFN1cHBvcnQobGFuZywgZnVuY3Rpb24gKHBhdHRlcm4pIHtcblx0XHRcdFx0aWYgKCFwYXR0ZXJuLmluc2lkZSkge1xuXHRcdFx0XHRcdHBhdHRlcm4uaW5zaWRlID0ge307XG5cdFx0XHRcdH1cblx0XHRcdFx0cGF0dGVybi5pbnNpZGUucmVzdCA9IGRvY0xhbmd1YWdlO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoamF2YURvY0xpa2UsICdhZGRTdXBwb3J0JywgeyB2YWx1ZTogYWRkU3VwcG9ydCB9KTtcblxuXHRqYXZhRG9jTGlrZS5hZGRTdXBwb3J0KFsnamF2YScsICdqYXZhc2NyaXB0JywgJ3BocCddLCBqYXZhRG9jTGlrZSk7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBjb2RlTGluZVBhdHRlcm4gPSAvKF4oPzpbXFx0IF0qKD86XFwqXFxzKikqKSlbXipcXHNdLiokL207XG5cblx0dmFyIG1lbWJlclJlZmVyZW5jZSA9IC8jXFxzKlxcdysoPzpcXHMqXFwoW14oKV0qXFwpKT8vLnNvdXJjZTtcblx0dmFyIHJlZmVyZW5jZSA9IC8oPzpcXGJbYS16QS1aXVxcdytcXHMqXFwuXFxzKikqXFxiW0EtWl1cXHcqKD86XFxzKjxtZW0+KT98PG1lbT4vLnNvdXJjZS5yZXBsYWNlKC88bWVtPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBtZW1iZXJSZWZlcmVuY2U7IH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5qYXZhZG9jID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnamF2YWRvY2xpa2UnLCB7fSk7XG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2phdmFkb2MnLCAna2V5d29yZCcsIHtcblx0XHQncmVmZXJlbmNlJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKC8oQCg/OmV4Y2VwdGlvbnxsaW5rfGxpbmtwbGFpbnxzZWV8dGhyb3dzfHZhbHVlKVxccysoPzpcXCpcXHMqKT8pLy5zb3VyY2UgKyAnKD86JyArIHJlZmVyZW5jZSArICcpJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKCNcXHMqKVxcdysoPz1cXHMqXFwoKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnZmllbGQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLygjXFxzKilcXHcrLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCduYW1lc3BhY2UnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xcYig/OlthLXpdXFx3KlxccypcXC5cXHMqKSsvLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdjbGFzcy1uYW1lJzogL1xcYltBLVpdXFx3Ki8sXG5cdFx0XHRcdCdrZXl3b3JkJzogUHJpc20ubGFuZ3VhZ2VzLmphdmEua2V5d29yZCxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1sjKClbXFxdLC5dL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0XHQvLyBAcGFyYW0gPFQ+IHRoZSBmaXJzdCBnZW5lcmljIHR5cGUgcGFyYW1ldGVyXG5cdFx0XHRwYXR0ZXJuOiAvKEBwYXJhbVxccyspPFtBLVpdXFx3Kj4vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWy48Pl0vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnY29kZS1zZWN0aW9uJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxce0Bjb2RlXFxzKyg/IVxccykpKD86W15cXHN7fV18XFxzKyg/IVtcXHN9XSl8XFx7KD86W157fV18XFx7KD86W157fV18XFx7KD86W157fV18XFx7W157fV0qXFx9KSpcXH0pKlxcfSkqXFx9KSsoPz1cXHMqXFx9KS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdjb2RlJzoge1xuXHRcdFx0XHRcdFx0Ly8gdGhlcmUgY2FuJ3QgYmUgYW55IEhUTUwgaW5zaWRlIG9mIHtAY29kZX0gdGFnc1xuXHRcdFx0XHRcdFx0cGF0dGVybjogY29kZUxpbmVQYXR0ZXJuLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmEsXG5cdFx0XHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLWphdmEnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKDwoY29kZXxwcmV8dHQpPig/ITxjb2RlPilcXHMqKVxcUyg/OlxcU3xcXHMrXFxTKSo/KD89XFxzKjxcXC9cXDI+KS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdsaW5lJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogY29kZUxpbmVQYXR0ZXJuLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHQvLyBoaWdobGlnaHQgSFRNTCB0YWdzIGFuZCBlbnRpdGllc1xuXHRcdFx0XHRcdFx0XHQndGFnJzogUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cC50YWcsXG5cdFx0XHRcdFx0XHRcdCdlbnRpdHknOiBQcmlzbS5sYW5ndWFnZXMubWFya3VwLmVudGl0eSxcblx0XHRcdFx0XHRcdFx0J2NvZGUnOiB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gZXZlcnl0aGluZyBlbHNlIGlzIEphdmEgY29kZVxuXHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8uKy8sXG5cdFx0XHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YSxcblx0XHRcdFx0XHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLWphdmEnXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCd0YWcnOiBQcmlzbS5sYW5ndWFnZXMubWFya3VwLnRhZyxcblx0XHQnZW50aXR5JzogUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cC5lbnRpdHksXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5qYXZhZG9jbGlrZS5hZGRTdXBwb3J0KCdqYXZhJywgUHJpc20ubGFuZ3VhZ2VzLmphdmFkb2MpO1xufShQcmlzbSkpO1xuXG4vLyBTcGVjaWZpY2F0aW9uOlxuLy8gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTMvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvbGFuZy9UaHJvd2FibGUuaHRtbCNwcmludFN0YWNrVHJhY2UoKVxuXG5QcmlzbS5sYW5ndWFnZXMuamF2YXN0YWNrdHJhY2UgPSB7XG5cblx0Ly8gamF2YS5zcWwuU1FMRXhjZXB0aW9uOiBWaW9sYXRpb24gb2YgdW5pcXVlIGNvbnN0cmFpbnQgTVlfRU5USVRZX1VLXzE6IGR1cGxpY2F0ZSB2YWx1ZShzKSBmb3IgY29sdW1uKHMpIE1ZX0NPTFVNTiBpbiBzdGF0ZW1lbnQgWy4uLl1cblx0Ly8gQ2F1c2VkIGJ5OiBqYXZhLnNxbC5TUUxFeGNlcHRpb246IFZpb2xhdGlvbiBvZiB1bmlxdWUgY29uc3RyYWludCBNWV9FTlRJVFlfVUtfMTogZHVwbGljYXRlIHZhbHVlKHMpIGZvciBjb2x1bW4ocykgTVlfQ09MVU1OIGluIHN0YXRlbWVudCBbLi4uXVxuXHQvLyBDYXVzZWQgYnk6IGNvbS5leGFtcGxlLm15cHJvamVjdC5NeVByb2plY3RTZXJ2bGV0RXhjZXB0aW9uXG5cdC8vIENhdXNlZCBieTogTWlkTGV2ZWxFeGNlcHRpb246IExvd0xldmVsRXhjZXB0aW9uXG5cdC8vIFN1cHByZXNzZWQ6IFJlc291cmNlJENsb3NlRmFpbEV4Y2VwdGlvbjogUmVzb3VyY2UgSUQgPSAwXG5cdCdzdW1tYXJ5Jzoge1xuXHRcdHBhdHRlcm46IC9eKFtcXHQgXSopKD86KD86Q2F1c2VkIGJ5OnxTdXBwcmVzc2VkOnxFeGNlcHRpb24gaW4gdGhyZWFkIFwiW15cIl0qXCIpW1xcdCBdKyk/W1xcdyQuXSsoPzo6LiopPyQvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKFtcXHQgXSopKD86KD86Q2F1c2VkIGJ5fFN1cHByZXNzZWQpKD89Oil8RXhjZXB0aW9uIGluIHRocmVhZCkvbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblxuXHRcdFx0Ly8gdGhlIGN1cnJlbnQgdGhyZWFkIGlmIHRoZSBzdW1tYXJ5IHN0YXJ0cyB3aXRoICdFeGNlcHRpb24gaW4gdGhyZWFkJ1xuXHRcdFx0J3N0cmluZyc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oXFxzKilcIlteXCJdKlwiLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCdleGNlcHRpb25zJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXig6P1xccyopW1xcdyQuXSsoPz06fCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2NsYXNzLW5hbWUnOiAvW1xcdyRdKyQvLFxuXHRcdFx0XHRcdCduYW1lc3BhY2UnOiAvXFxiW2Etel1cXHcqXFxiLyxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J21lc3NhZ2UnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oOlxccyopXFxTLiovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvOi9cblx0XHR9XG5cdH0sXG5cblx0Ly8gYXQgb3JnLm1vcnRiYXkuamV0dHkuc2VydmxldC5TZXJ2bGV0SGFuZGxlciRDYWNoZWRDaGFpbi5kb0ZpbHRlcihTZXJ2bGV0SGFuZGxlci5qYXZhOjExNjYpXG5cdC8vIGF0IG9yZy5oc3FsZGIuamRiYy5VdGlsLnRocm93RXJyb3IoVW5rbm93biBTb3VyY2UpIGhlcmUgY291bGQgYmUgc29tZSBub3Rlc1xuXHQvLyBhdCBqYXZhLmJhc2UvamF2YS5sYW5nLkNsYXNzLmZvck5hbWUwKE5hdGl2ZSBNZXRob2QpXG5cdC8vIGF0IFV0aWwuPGluaXQ+KFVua25vd24gU291cmNlKVxuXHQvLyBhdCBjb20uZm9vLmxvYWRlci9mb29AOS4wL2NvbS5mb28uTWFpbi5ydW4oTWFpbi5qYXZhOjEwMSlcblx0Ly8gYXQgY29tLmZvby5sb2FkZXIvL2NvbS5mb28uYmFyLkFwcC5ydW4oQXBwLmphdmE6MTIpXG5cdC8vIGF0IGFjbWVAMi4xL29yZy5hY21lLkxpYi50ZXN0KExpYi5qYXZhOjgwKVxuXHQvLyBhdCBNeUNsYXNzLm1hc2goTXlDbGFzcy5qYXZhOjkpXG5cdC8vXG5cdC8vIE1vcmUgaW5mb3JtYXRpb246XG5cdC8vIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzEzL2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL2xhbmcvU3RhY2tUcmFjZUVsZW1lbnQuaHRtbCN0b1N0cmluZygpXG5cdC8vXG5cdC8vIEEgdmFsaWQgSmF2YSBtb2R1bGUgbmFtZSBpcyBkZWZpbmVkIGFzOlxuXHQvLyAgIFwiQSBtb2R1bGUgbmFtZSBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBKYXZhIGlkZW50aWZpZXJzIChcdTAwQTczLjgpIHNlcGFyYXRlZCBieSBcIi5cIiB0b2tlbnMuXCJcblx0Ly8gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlL3NwZWNzL2pscy9zZTkvaHRtbC9qbHMtNi5odG1sI2pscy1Nb2R1bGVOYW1lXG5cdC8vXG5cdC8vIEEgSmF2YSBtb2R1bGUgdmVyc2lvbiBpcyBkZWZpbmVkIGJ5IHRoaXMgY2xhc3M6XG5cdC8vIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS85L2RvY3MvYXBpL2phdmEvbGFuZy9tb2R1bGUvTW9kdWxlRGVzY3JpcHRvci5WZXJzaW9uLmh0bWxcblx0Ly8gVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGBwYXJzZWAgbWV0aG9kIGluIEpESzEzOlxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vbWF0Y2RhYy9qZGsvYmxvYi8yMzA1ZGY3MWQxYjc3MTAyNjZhZTA5NTZkNzM5MjdhMjI1MTMyYzBmL3NyYy9qYXZhLmJhc2Uvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvbW9kdWxlL01vZHVsZURlc2NyaXB0b3IuamF2YSNMMTEwOFxuXHQvLyBIb3dldmVyLCB0byBrZWVwIHRoaXMgc2ltcGxlLCBhIHZlcnNpb24gd2lsbCBiZSBtYXRjaGVkIGJ5IHRoZSBwYXR0ZXJuIC9AW1xcdyQuKy1dKi8uXG5cdCdzdGFjay1mcmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvXihbXFx0IF0qKWF0ICg/OltcXHckLi9dfEBbXFx3JC4rLV0qXFwvKSsoPzo8aW5pdD4pP1xcKFteKCldKlxcKS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQna2V5d29yZCc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oXFxzKilhdCg/PSApLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCdzb3VyY2UnOiBbXG5cdFx0XHRcdC8vIChNYWluLmphdmE6MTUpXG5cdFx0XHRcdC8vIChNYWluLnNjYWxhOjE1KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhcXCgpXFx3K1xcLlxcdys6XFxkKyg/PVxcKSkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnZmlsZSc6IC9eXFx3K1xcLlxcdysvLFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzovLFxuXHRcdFx0XHRcdFx0J2xpbmUtbnVtYmVyJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxiXFxkK1xcYi8sXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gKFVua25vd24gU291cmNlKVxuXHRcdFx0XHQvLyAoTmF0aXZlIE1ldGhvZClcblx0XHRcdFx0Ly8gKC4uLnNvbWV0aGluZy4uLilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXFwoKVteKCldKig/PVxcKSkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQna2V5d29yZCc6IC9eKD86TmF0aXZlIE1ldGhvZHxVbmtub3duIFNvdXJjZSkkL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XSxcblx0XHRcdCdjbGFzcy1uYW1lJzogL1tcXHckXSsoPz1cXC4oPzo8aW5pdD58W1xcdyRdKylcXCgpLyxcblx0XHRcdCdmdW5jdGlvbic6IC8oPzo8aW5pdD58W1xcdyRdKykoPz1cXCgpLyxcblx0XHRcdCdjbGFzcy1sb2FkZXInOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFxzKVthLXpdXFx3Kig/OlxcLlthLXpdXFx3KikqKD89XFwvW1xcd0AkLl0qXFwvKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnbmFtZXNwYWNlJyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdtb2R1bGUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oW1xccy9dKVthLXpdXFx3Kig/OlxcLlthLXpdXFx3KikqKD86QFtcXHckListXSopPyg/PVxcLykvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQndmVyc2lvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8oQClbXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1tALl0vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnbmFtZXNwYWNlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKD86XFxiW2Etel1cXHcqXFwuKSsvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1soKS8uXS9cblx0XHR9XG5cdH0sXG5cblx0Ly8gLi4uIDMyIG1vcmVcblx0Ly8gLi4uIDMyIGNvbW1vbiBmcmFtZXMgb21pdHRlZFxuXHQnbW9yZSc6IHtcblx0XHRwYXR0ZXJuOiAvXihbXFx0IF0qKVxcLnszfSBcXGQrIFthLXpdKyg/OiBbYS16XSspKi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuezN9Lyxcblx0XHRcdCdudW1iZXInOiAvXFxkKy8sXG5cdFx0XHQna2V5d29yZCc6IC9cXGJbYS16XSsoPzogW2Etel0rKSpcXGIvXG5cdFx0fVxuXHR9XG5cbn07XG5cblByaXNtLmxhbmd1YWdlcy5qZXhsID0ge1xuXHQnc3RyaW5nJzogLyhbXCInXSkoPzpcXFxcW1xcc1xcU118KD8hXFwxKVteXFxcXF0pKlxcMS8sXG5cdCd0cmFuc2Zvcm0nOiB7XG5cdFx0cGF0dGVybjogLyhcXHxcXHMqKVthLXpBLVpcdTA0MzAtXHUwNDRGXHUwNDEwLVx1MDQyRl9cXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAwRkYkXVtcXHdcdTA0MzAtXHUwNDRGXHUwNDEwLVx1MDQyRlxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDBGRiRdKi8sXG5cdFx0YWxpYXM6ICdmdW5jdGlvbicsXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnZnVuY3Rpb24nOiAvW2EtekEtWlx1MDQzMC1cdTA0NEZcdTA0MTAtXHUwNDJGX1xcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDBGRiRdW1xcd1x1MDQzMC1cdTA0NEZcdTA0MTAtXHUwNDJGXFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMEZGJF0qXFxzKig/PVxcKCkvLFxuXHQnbnVtYmVyJzogL1xcYlxcZCsoPzpcXC5cXGQrKT9cXGJ8XFxCXFwuXFxkK1xcYi8sXG5cdCdvcGVyYXRvcic6IC9bPD4hXT0/fC18XFwrfCYmfD09fFxcfFxcfD98XFwvXFwvP3xbPzoqXiVdLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQna2V5d29yZCc6IC9cXGJpblxcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdKCksLl0vLFxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmpvbGllID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pXCIoPzpcXFxcW1xcc1xcU118W15cIlxcXFxdKSpcIi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogLygoPzpcXGIoPzphc3xjb3VyaWVyfGVtYmVkfGlufGlucHV0UG9ydHxvdXRwdXRQb3J0fHNlcnZpY2UpXFxifEApWyBcXHRdKilcXHcrLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFzfGNIfGNvbXB8Y29uY3VycmVudHxjb25zdGFudHN8Y291cmllcnxjc2V0fGNzZXRzfGRlZmF1bHR8ZGVmaW5lfGVsc2V8ZW1iZWR8ZW1iZWRkZWR8ZXhlY3V0aW9ufGV4aXR8ZXh0ZW5kZXJ8Zm9yfGZvcmVhY2h8Zm9yd2FyZHxmcm9tfGdsb2JhbHxpZnxpbXBvcnR8aW58aW5jbHVkZXxpbml0fGlucHV0UG9ydHxpbnN0YWxsfGluc3RhbmNlb2Z8aW50ZXJmYWNlfGlzX2RlZmluZWR8bGlua0lufGxpbmtPdXR8bWFpbnxuZXd8bnVsbFByb2Nlc3N8b3V0cHV0UG9ydHxvdmVyfHByaXZhdGV8cHJvdmlkZXxwdWJsaWN8c2NvcGV8c2VxdWVudGlhbHxzZXJ2aWNlfHNpbmdsZXxzcGF3bnxzeW5jaHJvbml6ZWR8dGhpc3x0aHJvd3x0aHJvd3N8dHlwZXx1bmRlZnx1bnRpbHx3aGlsZXx3aXRoKVxcYi8sXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89WyBcXHRdKltAKF0pL2ksXG5cdCdudW1iZXInOiAvKD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspP2w/L2ksXG5cdCdvcGVyYXRvcic6IC8tWy09Pl0/fFxcK1srPV0/fDxbPD1dP3xbPj0qIV09P3wmJnxcXHxcXHx8Wz9cXC8lXkB8XS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKClbXFxde30sOy46XS8sXG5cdCdidWlsdGluJzogL1xcYig/OkJ5dGV8YW55fGJvb2x8Y2hhcnxkb3VibGV8ZW51bXxmbG9hdHxpbnR8bGVuZ3RofGxvbmd8cmFuZ2VzfHJlZ2V4fHN0cmluZ3x1bmRlZmluZWR8dm9pZClcXGIvXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnam9saWUnLCAna2V5d29yZCcsIHtcblx0J2FnZ3JlZ2F0ZXMnOiB7XG5cdFx0cGF0dGVybjogLyhcXGJBZ2dyZWdhdGVzXFxzKjpcXHMqKSg/OlxcdysoPzpcXHMrd2l0aFxccytcXHcrKT9cXHMqLFxccyopKlxcdysoPzpcXHMrd2l0aFxccytcXHcrKT8vLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQna2V5d29yZCc6IC9cXGJ3aXRoXFxiLyxcblx0XHRcdCdjbGFzcy1uYW1lJzogL1xcdysvLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogLywvXG5cdFx0fVxuXHR9LFxuXHQncmVkaXJlY3RzJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiUmVkaXJlY3RzXFxzKjpcXHMqKSg/OlxcdytcXHMqPT5cXHMqXFx3K1xccyosXFxzKikqKD86XFx3K1xccyo9PlxccypcXHcrKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC8sLyxcblx0XHRcdCdjbGFzcy1uYW1lJzogL1xcdysvLFxuXHRcdFx0J29wZXJhdG9yJzogLz0+L1xuXHRcdH1cblx0fSxcblx0J3Byb3BlcnR5Jzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpBZ2dyZWdhdGVzfFtJaV1udGVyZmFjZXN8SmF2YXxKYXZhc2NyaXB0fEpvbGllfFtMbF1vY2F0aW9ufE9uZVdheXxbUHBdcm90b2NvbHxSZWRpcmVjdHN8UmVxdWVzdFJlc3BvbnNlKVxcYig/PVsgXFx0XSo6KS9cblx0fVxufSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgaW50ZXJwb2xhdGlvbiA9IC9cXFxcXFwoKD86W14oKV18XFwoW14oKV0qXFwpKSpcXCkvLnNvdXJjZTtcblx0dmFyIHN0cmluZyA9IFJlZ0V4cCgvKF58W15cXFxcXSlcIig/OlteXCJcXHJcXG5cXFxcXXxcXFxcW15cXHJcXG4oXXxfXykqXCIvLnNvdXJjZS5yZXBsYWNlKC9fXy9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBpbnRlcnBvbGF0aW9uOyB9KSk7XG5cdHZhciBzdHJpbmdJbnRlcnBvbGF0aW9uID0ge1xuXHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKC8oKD86XnxbXlxcXFxdKSg/OlxcXFx7Mn0pKikvLnNvdXJjZSArIGludGVycG9sYXRpb24pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY29udGVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXFxcXFwoKVtcXHNcXFNdKyg/PVxcKSQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXFxcXFwofFxcKSQvXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdHZhciBqcSA9IFByaXNtLmxhbmd1YWdlcy5qcSA9IHtcblx0XHQnY29tbWVudCc6IC8jLiovLFxuXHRcdCdwcm9wZXJ0eSc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChzdHJpbmcuc291cmNlICsgLyg/PVxccyo6KD8hOikpLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZTogc3RyaW5nSW50ZXJwb2xhdGlvblxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IHN0cmluZyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHN0cmluZ0ludGVycG9sYXRpb25cblx0XHR9LFxuXG5cdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGJkZWZcXHMrKVthLXpfXVxcdysvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXG5cdFx0J3ZhcmlhYmxlJzogL1xcQlxcJFxcdysvLFxuXHRcdCdwcm9wZXJ0eS1saXRlcmFsJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYlthLXpfXVxcdyooPz1cXHMqOig/ITopKS9pLFxuXHRcdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzogL1xcYig/OmFzfGJyZWFrfGNhdGNofGRlZnxlbGlmfGVsc2V8ZW5kfGZvcmVhY2h8aWZ8aW1wb3J0fGluY2x1ZGV8bGFiZWx8bW9kdWxlfG1vZHVsZW1ldGF8bnVsbHxyZWR1Y2V8dGhlbnx0cnl8d2hpbGUpXFxiLyxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdFx0J251bWJlcic6IC8oPzpcXGJcXGQrXFwufFxcQlxcLik/XFxiXFxkKyg/OltlRV1bKy1dP1xcZCspP1xcYi8sXG5cblx0XHQnb3BlcmF0b3InOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXHw9Py8sXG5cdFx0XHRcdGFsaWFzOiAncGlwZSdcblx0XHRcdH0sXG5cdFx0XHQvXFwuXFwufFshPTw+XT89fFxcP1xcL1xcL3xcXC9cXC89P3xbLSsqLyVdPT98Wzw+P118XFxiKD86YW5kfG5vdHxvcilcXGIvXG5cdFx0XSxcblx0XHQnYy1zdHlsZS1mdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCkvaSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblx0XHQncHVuY3R1YXRpb24nOiAvOjp8WygpXFxbXFxde30sOjtdfFxcLig/PVxccypbXFxbXFx3JF0pLyxcblx0XHQnZG90Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcLi8sXG5cdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHR9XG5cdH07XG5cblx0c3RyaW5nSW50ZXJwb2xhdGlvbi5pbnRlcnBvbGF0aW9uLmluc2lkZS5jb250ZW50Lmluc2lkZSA9IGpxO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRQcmlzbS5sYW5ndWFnZXMudHlwZXNjcmlwdCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2phdmFzY3JpcHQnLCB7XG5cdFx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmNsYXNzfGV4dGVuZHN8aW1wbGVtZW50c3xpbnN0YW5jZW9mfGludGVyZmFjZXxuZXd8dHlwZSlcXHMrKSg/IWtleW9mXFxiKSg/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSooPzpcXHMqPCg/OltePD5dfDwoPzpbXjw+XXw8W148Pl0qPikqPikqPik/Lyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0fSxcblx0XHQnYnVpbHRpbic6IC9cXGIoPzpBcnJheXxGdW5jdGlvbnxQcm9taXNlfGFueXxib29sZWFufGNvbnNvbGV8bmV2ZXJ8bnVtYmVyfHN0cmluZ3xzeW1ib2x8dW5rbm93bilcXGIvLFxuXHR9KTtcblxuXHQvLyBUaGUga2V5d29yZHMgVHlwZVNjcmlwdCBhZGRzIHRvIEphdmFTY3JpcHRcblx0UHJpc20ubGFuZ3VhZ2VzLnR5cGVzY3JpcHQua2V5d29yZC5wdXNoKFxuXHRcdC9cXGIoPzphYnN0cmFjdHxkZWNsYXJlfGlzfGtleW9mfHJlYWRvbmx5fHJlcXVpcmUpXFxiLyxcblx0XHQvLyBrZXl3b3JkcyB0aGF0IGhhdmUgdG8gYmUgZm9sbG93ZWQgYnkgYW4gaWRlbnRpZmllclxuXHRcdC9cXGIoPzphc3NlcnRzfGluZmVyfGludGVyZmFjZXxtb2R1bGV8bmFtZXNwYWNlfHR5cGUpXFxiKD89XFxzKig/Olt7XyRhLXpBLVpcXHhBMC1cXHVGRkZGXXwkKSkvLFxuXHRcdC8vIFRoaXMgaXMgZm9yIGBpbXBvcnQgdHlwZSAqLCB7fWBcblx0XHQvXFxidHlwZVxcYig/PVxccyooPzpbXFx7Kl18JCkpL1xuXHQpO1xuXG5cdC8vIGRvZXNuJ3Qgd29yayB3aXRoIFRTIGJlY2F1c2UgVFMgaXMgdG9vIGNvbXBsZXhcblx0ZGVsZXRlIFByaXNtLmxhbmd1YWdlcy50eXBlc2NyaXB0WydwYXJhbWV0ZXInXTtcblx0ZGVsZXRlIFByaXNtLmxhbmd1YWdlcy50eXBlc2NyaXB0WydsaXRlcmFsLXByb3BlcnR5J107XG5cblx0Ly8gYSB2ZXJzaW9uIG9mIHR5cGVzY3JpcHQgc3BlY2lmaWNhbGx5IGZvciBoaWdobGlnaHRpbmcgdHlwZXNcblx0dmFyIHR5cGVJbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCd0eXBlc2NyaXB0Jywge30pO1xuXHRkZWxldGUgdHlwZUluc2lkZVsnY2xhc3MtbmFtZSddO1xuXG5cdFByaXNtLmxhbmd1YWdlcy50eXBlc2NyaXB0WydjbGFzcy1uYW1lJ10uaW5zaWRlID0gdHlwZUluc2lkZTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCd0eXBlc2NyaXB0JywgJ2Z1bmN0aW9uJywge1xuXHRcdCdkZWNvcmF0b3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvQFskXFx3XFx4QTAtXFx1RkZGRl0rLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnYXQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15ALyxcblx0XHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnZnVuY3Rpb24nOiAvXltcXHNcXFNdKy9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdnZW5lcmljLWZ1bmN0aW9uJzoge1xuXHRcdFx0Ly8gZS5nLiBmb288VCBleHRlbmRzIFwiYmFyXCIgfCBcImJhelwiPiggLi4uXG5cdFx0XHRwYXR0ZXJuOiAvIz8oPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqXFxzKjwoPzpbXjw+XXw8KD86W148Pl18PFtePD5dKj4pKj4pKj4oPz1cXHMqXFwoKS8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2Z1bmN0aW9uJzogL14jPyg/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSovLFxuXHRcdFx0XHQnZ2VuZXJpYyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvPFtcXHNcXFNdKy8sIC8vIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IDxcblx0XHRcdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnLFxuXHRcdFx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMudHMgPSBQcmlzbS5sYW5ndWFnZXMudHlwZXNjcmlwdDtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGphdmFzY3JpcHQgPSBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdDtcblxuXHR2YXIgdHlwZSA9IC9cXHsoPzpbXnt9XXxcXHsoPzpbXnt9XXxcXHtbXnt9XSpcXH0pKlxcfSkrXFx9Ly5zb3VyY2U7XG5cdHZhciBwYXJhbWV0ZXJQcmVmaXggPSAnKEAoPzphcmd8YXJndW1lbnR8cGFyYW18cHJvcGVydHkpXFxcXHMrKD86JyArIHR5cGUgKyAnXFxcXHMrKT8pJztcblxuXHRQcmlzbS5sYW5ndWFnZXMuanNkb2MgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdqYXZhZG9jbGlrZScsIHtcblx0XHQncGFyYW1ldGVyJzoge1xuXHRcdFx0Ly8gQHBhcmFtIHtzdHJpbmd9IGZvbyAtIGZvbyBiYXJcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChwYXJhbWV0ZXJQcmVmaXggKyAvKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRi5dKSsoPz1cXHN8JCkvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdqc2RvYycsICdrZXl3b3JkJywge1xuXHRcdCdvcHRpb25hbC1wYXJhbWV0ZXInOiB7XG5cdFx0XHQvLyBAcGFyYW0ge3N0cmluZ30gW2Jhei5mb289XCJiYXJcIl0gZm9vIGJhclxuXHRcdFx0cGF0dGVybjogUmVnRXhwKHBhcmFtZXRlclByZWZpeCArIC9cXFsoPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGLl0pKyg/Oj1bXltcXF1dKyk/XFxdKD89XFxzfCQpLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncGFyYW1ldGVyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXlxcWylbJFxcd1xceEEwLVxcdUZGRkZcXC5dKy8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnY29kZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKD0pW1xcc1xcU10qKD89XFxdJCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiBqYXZhc2NyaXB0LFxuXHRcdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtamF2YXNjcmlwdCdcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1s9W1xcXV0vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnY2xhc3MtbmFtZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oQCg/OmF1Z21lbnRzfGNsYXNzfGV4dGVuZHN8aW50ZXJmYWNlfG1lbWJlcm9mIT98dGVtcGxhdGV8dGhpc3x0eXBlZGVmKVxccysoPzo8VFlQRT5cXHMrKT8pW0EtWl1cXHcqKD86XFwuW0EtWl1cXHcqKSovLnNvdXJjZS5yZXBsYWNlKC88VFlQRT4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdHlwZTsgfSkpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJyhAW2Etel0rXFxcXHMrKScgKyB0eXBlKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3N0cmluZyc6IGphdmFzY3JpcHQuc3RyaW5nLFxuXHRcdFx0XHRcdCdudW1iZXInOiBqYXZhc2NyaXB0Lm51bWJlcixcblx0XHRcdFx0XHQnYm9vbGVhbic6IGphdmFzY3JpcHQuYm9vbGVhbixcblx0XHRcdFx0XHQna2V5d29yZCc6IFByaXNtLmxhbmd1YWdlcy50eXBlc2NyaXB0LmtleXdvcmQsXG5cdFx0XHRcdFx0J29wZXJhdG9yJzogLz0+fFxcLlxcLlxcLnxbJnw/OipdLyxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWy4sOz08Pnt9KClbXFxdXS9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2V4YW1wbGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKEBleGFtcGxlXFxzKyg/IVxccykpKD86W15AXFxzXXxcXHMrKD8hXFxzKSkrPyg/PVxccyooPzpcXCpcXHMqKT8oPzpAXFx3fFxcKlxcLykpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NvZGUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oW1xcdCBdKig/OlxcKlxccyopPylcXFMuKiQvbSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZTogamF2YXNjcmlwdCxcblx0XHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLWphdmFzY3JpcHQnXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5qYXZhZG9jbGlrZS5hZGRTdXBwb3J0KCdqYXZhc2NyaXB0JywgUHJpc20ubGFuZ3VhZ2VzLmpzZG9jKTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnamF2YXNjcmlwdCcsICdmdW5jdGlvbi12YXJpYWJsZScsIHtcblx0XHQnbWV0aG9kLXZhcmlhYmxlJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCcoXFxcXC5cXFxccyopJyArIFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0WydmdW5jdGlvbi12YXJpYWJsZSddLnBhdHRlcm4uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogWydmdW5jdGlvbi12YXJpYWJsZScsICdtZXRob2QnLCAnZnVuY3Rpb24nLCAncHJvcGVydHktYWNjZXNzJ11cblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2phdmFzY3JpcHQnLCAnZnVuY3Rpb24nLCB7XG5cdFx0J21ldGhvZCc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnKFxcXFwuXFxcXHMqKScgKyBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFsnZnVuY3Rpb24nXS5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiBbJ2Z1bmN0aW9uJywgJ3Byb3BlcnR5LWFjY2VzcyddXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdqYXZhc2NyaXB0JywgJ2NvbnN0YW50Jywge1xuXHRcdCdrbm93bi1jbGFzcy1uYW1lJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBzdGFuZGFyZCBidWlsdC1pbnNcblx0XHRcdFx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHNcblx0XHRcdFx0cGF0dGVybjogL1xcYig/Oig/OkZsb2F0KD86MzJ8NjQpfCg/OkludHxVaW50KSg/Ojh8MTZ8MzIpfFVpbnQ4Q2xhbXBlZCk/QXJyYXl8QXJyYXlCdWZmZXJ8QmlnSW50fEJvb2xlYW58RGF0YVZpZXd8RGF0ZXxFcnJvcnxGdW5jdGlvbnxJbnRsfEpTT058KD86V2Vhayk/KD86TWFwfFNldCl8TWF0aHxOdW1iZXJ8T2JqZWN0fFByb21pc2V8UHJveHl8UmVmbGVjdHxSZWdFeHB8U3RyaW5nfFN5bWJvbHxXZWJBc3NlbWJseSlcXGIvLFxuXHRcdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBlcnJvcnNcblx0XHRcdFx0cGF0dGVybjogL1xcYig/OltBLVpdXFx3KilFcnJvclxcYi8sXG5cdFx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0XHRcdH1cblx0XHRdXG5cdH0pO1xuXG5cdC8qKlxuXHQgKiBSZXBsYWNlcyB0aGUgYDxJRD5gIHBsYWNlaG9sZGVyIGluIHRoZSBnaXZlbiBwYXR0ZXJuIHdpdGggYSBwYXR0ZXJuIGZvciBnZW5lcmFsIEpTIGlkZW50aWZpZXJzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhZ3NdXG5cdCAqIEByZXR1cm5zIHtSZWdFeHB9XG5cdCAqL1xuXHRmdW5jdGlvbiB3aXRoSWQoc291cmNlLCBmbGFncykge1xuXHRcdHJldHVybiBSZWdFeHAoXG5cdFx0XHRzb3VyY2UucmVwbGFjZSgvPElEPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiAvKD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKi8uc291cmNlOyB9KSxcblx0XHRcdGZsYWdzKTtcblx0fVxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdqYXZhc2NyaXB0JywgJ2tleXdvcmQnLCB7XG5cdFx0J2ltcG9ydHMnOiB7XG5cdFx0XHQvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWltcG9ydHNcblx0XHRcdHBhdHRlcm46IHdpdGhJZCgvKFxcYmltcG9ydFxcYlxccyopKD86PElEPig/OlxccyosXFxzKig/OlxcKlxccyphc1xccys8SUQ+fFxce1tee31dKlxcfSkpP3xcXCpcXHMqYXNcXHMrPElEPnxcXHtbXnt9XSpcXH0pKD89XFxzKlxcYmZyb21cXGIpLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHR9LFxuXHRcdCdleHBvcnRzJzoge1xuXHRcdFx0Ly8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1leHBvcnRzXG5cdFx0XHRwYXR0ZXJuOiB3aXRoSWQoLyhcXGJleHBvcnRcXGJcXHMqKSg/OlxcKig/Olxccyphc1xccys8SUQ+KT8oPz1cXHMqXFxiZnJvbVxcYil8XFx7W157fV0qXFx9KS8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFsna2V5d29yZCddLnVuc2hpZnQoXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYig/OmFzfGRlZmF1bHR8ZXhwb3J0fGZyb218aW1wb3J0KVxcYi8sXG5cdFx0XHRhbGlhczogJ21vZHVsZSdcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzphd2FpdHxicmVha3xjYXRjaHxjb250aW51ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGlmfHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHdoaWxlfHlpZWxkKVxcYi8sXG5cdFx0XHRhbGlhczogJ2NvbnRyb2wtZmxvdydcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGJudWxsXFxiLyxcblx0XHRcdGFsaWFzOiBbJ251bGwnLCAnbmlsJ11cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGJ1bmRlZmluZWRcXGIvLFxuXHRcdFx0YWxpYXM6ICduaWwnXG5cdFx0fVxuXHQpO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2phdmFzY3JpcHQnLCAnb3BlcmF0b3InLCB7XG5cdFx0J3NwcmVhZCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXC57M30vLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9LFxuXHRcdCdhcnJvdyc6IHtcblx0XHRcdHBhdHRlcm46IC89Pi8sXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnamF2YXNjcmlwdCcsICdwdW5jdHVhdGlvbicsIHtcblx0XHQncHJvcGVydHktYWNjZXNzJzoge1xuXHRcdFx0cGF0dGVybjogd2l0aElkKC8oXFwuXFxzKikjPzxJRD4vLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnbWF5YmUtY2xhc3MtbmFtZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXiRcXHdcXHhBMC1cXHVGRkZGXSlbQS1aXVskXFx3XFx4QTAtXFx1RkZGRl0rLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdkb20nOiB7XG5cdFx0XHQvLyB0aGlzIGNvbnRhaW5zIG9ubHkgYSBmZXcgY29tbW9ubHkgdXNlZCBET00gdmFyaWFibGVzXG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86ZG9jdW1lbnR8KD86bG9jYWx8c2Vzc2lvbilTdG9yYWdlfGxvY2F0aW9ufG5hdmlnYXRvcnxwZXJmb3JtYW5jZXx3aW5kb3cpXFxiLyxcblx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0fSxcblx0XHQnY29uc29sZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJjb25zb2xlKD89XFxzKlxcLikvLFxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHRcdH1cblx0fSk7XG5cblxuXHQvLyBhZGQgJ21heWJlLWNsYXNzLW5hbWUnIHRvIHRva2VucyB3aGljaCBtaWdodCBiZSBhIGNsYXNzIG5hbWVcblx0dmFyIG1heWJlQ2xhc3NOYW1lVG9rZW5zID0gWydmdW5jdGlvbicsICdmdW5jdGlvbi12YXJpYWJsZScsICdtZXRob2QnLCAnbWV0aG9kLXZhcmlhYmxlJywgJ3Byb3BlcnR5LWFjY2VzcyddO1xuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgbWF5YmVDbGFzc05hbWVUb2tlbnMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgdG9rZW4gPSBtYXliZUNsYXNzTmFtZVRva2Vuc1tpXTtcblx0XHR2YXIgdmFsdWUgPSBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFt0b2tlbl07XG5cblx0XHQvLyBjb252ZXJ0IHJlZ2V4IHRvIG9iamVjdFxuXHRcdGlmIChQcmlzbS51dGlsLnR5cGUodmFsdWUpID09PSAnUmVnRXhwJykge1xuXHRcdFx0dmFsdWUgPSBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFt0b2tlbl0gPSB7XG5cdFx0XHRcdHBhdHRlcm46IHZhbHVlXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIGtlZXAgaW4gbWluZCB0aGF0IHdlIGRvbid0IHN1cHBvcnQgYXJyYXlzXG5cblx0XHR2YXIgaW5zaWRlID0gdmFsdWUuaW5zaWRlIHx8IHt9O1xuXHRcdHZhbHVlLmluc2lkZSA9IGluc2lkZTtcblxuXHRcdGluc2lkZVsnbWF5YmUtY2xhc3MtbmFtZSddID0gL15bQS1aXVtcXHNcXFNdKi87XG5cdH1cblxufShQcmlzbSkpO1xuXG4vLyBodHRwczovL3d3dy5qc29uLm9yZy9qc29uLWVuLmh0bWxcblByaXNtLmxhbmd1YWdlcy5qc29uID0ge1xuXHQncHJvcGVydHknOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pXCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwiKD89XFxzKjopLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVwiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcIig/IVxccyo6KS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCkvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnbnVtYmVyJzogLy0/XFxiXFxkKyg/OlxcLlxcZCspPyg/OmVbKy1dP1xcZCspP1xcYi9pLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXSxdLyxcblx0J29wZXJhdG9yJzogLzovLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdudWxsJzoge1xuXHRcdHBhdHRlcm46IC9cXGJudWxsXFxiLyxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH1cbn07XG5cblByaXNtLmxhbmd1YWdlcy53ZWJtYW5pZmVzdCA9IFByaXNtLmxhbmd1YWdlcy5qc29uO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIHN0cmluZyA9IC8oXCJ8JykoPzpcXFxcKD86XFxyXFxuP3xcXG58Lil8KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS87XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmpzb241ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnanNvbicsIHtcblx0XHQncHJvcGVydHknOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChzdHJpbmcuc291cmNlICsgJyg/PVxcXFxzKjopJyksXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyg/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSooPz1cXHMqOikvLFxuXHRcdFx0XHRhbGlhczogJ3VucXVvdGVkJ1xuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IHN0cmluZyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J251bWJlcic6IC9bKy1dP1xcYig/Ok5hTnxJbmZpbml0eXwweFthLWZBLUZcXGRdKylcXGJ8WystXT8oPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86W2VFXVsrLV0/XFxkK1xcYik/L1xuXHR9KTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuanNvbnAgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdqc29uJywge1xuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXSgpOywuXS9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdqc29ucCcsICdwdW5jdHVhdGlvbicsIHtcblx0J2Z1bmN0aW9uJzogLyg/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSooPz1cXHMqXFwoKS9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuanNzdGFja3RyYWNlID0ge1xuXHQnZXJyb3ItbWVzc2FnZSc6IHtcblx0XHRwYXR0ZXJuOiAvXlxcUy4qL20sXG5cdFx0YWxpYXM6ICdzdHJpbmcnXG5cdH0sXG5cblx0J3N0YWNrLWZyYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oXlsgXFx0XSspYXRbIFxcdF0uKi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnbm90LW15LWNvZGUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eYXRbIFxcdF0rKD8hXFxzKSg/Om5vZGVcXC5qc3w8dW5rbm93bj58LiooPzpub2RlX21vZHVsZXN8XFwoPGFub255bW91cz5cXCl8XFwoPHVua25vd24+fDxhbm9ueW1vdXM+JHxcXChpbnRlcm5hbFxcL3xcXChub2RlXFwuanMpKS4qL20sXG5cdFx0XHRcdGFsaWFzOiAnY29tbWVudCdcblx0XHRcdH0sXG5cblx0XHRcdCdmaWxlbmFtZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLyhcXGJhdFxccysoPyFcXHMpfFxcKCkoPzpbYS16QS1aXTopP1teKCk6XSsoPz06KS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAndXJsJ1xuXHRcdFx0fSxcblxuXHRcdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcYmF0XFxzKyg/Om5ld1xccyspPykoPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRjxdWy4kXFx3XFx4QTAtXFx1RkZGRjw+XSovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvWygpXS8sXG5cblx0XHRcdCdrZXl3b3JkJzogL1xcYig/OmF0fG5ldylcXGIvLFxuXG5cdFx0XHQnYWxpYXMnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXFsoPzphc1xccyspPyg/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGXVskXFx3XFx4QTAtXFx1RkZGRl0qXFxdLyxcblx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHRcdH0sXG5cblx0XHRcdCdsaW5lLW51bWJlcic6IHtcblx0XHRcdFx0cGF0dGVybjogLzpcXGQrKD86OlxcZCspP1xcYi8sXG5cdFx0XHRcdGFsaWFzOiAnbnVtYmVyJyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzovXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHR9XG5cdH1cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgdGVtcGxhdGVTdHJpbmcgPSBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFsndGVtcGxhdGUtc3RyaW5nJ107XG5cblx0Ly8gc2VlIHRoZSBwYXR0ZXJuIGluIHByaXNtLWphdmFzY3JpcHQuanNcblx0dmFyIHRlbXBsYXRlTGl0ZXJhbFBhdHRlcm4gPSB0ZW1wbGF0ZVN0cmluZy5wYXR0ZXJuLnNvdXJjZTtcblx0dmFyIGludGVycG9sYXRpb25PYmplY3QgPSB0ZW1wbGF0ZVN0cmluZy5pbnNpZGVbJ2ludGVycG9sYXRpb24nXTtcblx0dmFyIGludGVycG9sYXRpb25QdW5jdHVhdGlvbk9iamVjdCA9IGludGVycG9sYXRpb25PYmplY3QuaW5zaWRlWydpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJ107XG5cdHZhciBpbnRlcnBvbGF0aW9uUGF0dGVybiA9IGludGVycG9sYXRpb25PYmplY3QucGF0dGVybi5zb3VyY2U7XG5cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBwYXR0ZXJuIHRvIG1hdGNoIGEgdGVtcGxhdGUgc3RyaW5nIHdpdGggYSBzcGVjaWFsIHRhZy5cblx0ICpcblx0ICogVGhpcyB3aWxsIHJldHVybiBgdW5kZWZpbmVkYCBpZiB0aGVyZSBpcyBubyBncmFtbWFyIHdpdGggdGhlIGdpdmVuIGxhbmd1YWdlIGlkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgVGhlIGxhbmd1YWdlIGlkIG9mIHRoZSBlbWJlZGRlZCBsYW5ndWFnZS4gRS5nLiBgbWFya2Rvd25gLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSByZWdleCBwYXR0ZXJuIHRvIG1hdGNoIHRoZSB0YWcuXG5cdCAqIEByZXR1cm5zIHtvYmplY3QgfCB1bmRlZmluZWR9XG5cdCAqIEBleGFtcGxlXG5cdCAqIGNyZWF0ZVRlbXBsYXRlKCdjc3MnLCAvXFxiY3NzLy5zb3VyY2UpO1xuXHQgKi9cblx0ZnVuY3Rpb24gY3JlYXRlVGVtcGxhdGUobGFuZ3VhZ2UsIHRhZykge1xuXHRcdGlmICghUHJpc20ubGFuZ3VhZ2VzW2xhbmd1YWdlXSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCcoKD86JyArIHRhZyArICcpXFxcXHMqKScgKyB0ZW1wbGF0ZUxpdGVyYWxQYXR0ZXJuKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3RlbXBsYXRlLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eYHxgJC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdlbWJlZGRlZC1jb2RlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdGFsaWFzOiBsYW5ndWFnZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cblx0UHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRbJ3RlbXBsYXRlLXN0cmluZyddID0gW1xuXHRcdC8vIHN0eWxlZC1qc3g6XG5cdFx0Ly8gICBjc3NgYSB7IGNvbG9yOiAjMjVGOyB9YFxuXHRcdC8vIHN0eWxlZC1jb21wb25lbnRzOlxuXHRcdC8vICAgc3R5bGVkLmgxYGNvbG9yOiByZWQ7YFxuXHRcdGNyZWF0ZVRlbXBsYXRlKCdjc3MnLCAvXFxiKD86c3R5bGVkKD86XFwoW14pXSpcXCkpPyg/OlxccypcXC5cXHMqXFx3Kyg/OlxcKFteKV0qXFwpKSopKnxjc3MoPzpcXHMqXFwuXFxzKig/Omdsb2JhbHxyZXNvbHZlKSk/fGNyZWF0ZUdsb2JhbFN0eWxlfGtleWZyYW1lcykvLnNvdXJjZSksXG5cblx0XHQvLyBodG1sYDxwPjwvcD5gXG5cdFx0Ly8gZGl2LmlubmVySFRNTCA9IGA8cD48L3A+YFxuXHRcdGNyZWF0ZVRlbXBsYXRlKCdodG1sJywgL1xcYmh0bWx8XFwuXFxzKig/OmlubmVyfG91dGVyKUhUTUxcXHMqXFwrPz0vLnNvdXJjZSksXG5cblx0XHQvLyBzdmdgPHBhdGggZmlsbD1cIiNmZmZcIiBkPVwiTTU1LjM3IC4uLlwiLz5gXG5cdFx0Y3JlYXRlVGVtcGxhdGUoJ3N2ZycsIC9cXGJzdmcvLnNvdXJjZSksXG5cblx0XHQvLyBtZGAjIGgxYCwgbWFya2Rvd25gIyMgaDJgXG5cdFx0Y3JlYXRlVGVtcGxhdGUoJ21hcmtkb3duJywgL1xcYig/Om1hcmtkb3dufG1kKS8uc291cmNlKSxcblxuXHRcdC8vIGdxbGAuLi5gLCBncmFwaHFsYC4uLmAsIGdyYXBocWwuZXhwZXJpbWVudGFsYC4uLmBcblx0XHRjcmVhdGVUZW1wbGF0ZSgnZ3JhcGhxbCcsIC9cXGIoPzpncWx8Z3JhcGhxbCg/OlxccypcXC5cXHMqZXhwZXJpbWVudGFsKT8pLy5zb3VyY2UpLFxuXG5cdFx0Ly8gc3FsYC4uLmBcblx0XHRjcmVhdGVUZW1wbGF0ZSgnc3FsJywgL1xcYnNxbC8uc291cmNlKSxcblxuXHRcdC8vIHZhbmlsbGEgdGVtcGxhdGUgc3RyaW5nXG5cdFx0dGVtcGxhdGVTdHJpbmdcblx0XS5maWx0ZXIoQm9vbGVhbik7XG5cblxuXHQvKipcblx0ICogUmV0dXJucyBhIHNwZWNpZmljIHBsYWNlaG9sZGVyIGxpdGVyYWwgZm9yIHRoZSBnaXZlbiBsYW5ndWFnZS5cblx0ICpcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvdW50ZXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRmdW5jdGlvbiBnZXRQbGFjZWhvbGRlcihjb3VudGVyLCBsYW5ndWFnZSkge1xuXHRcdHJldHVybiAnX19fJyArIGxhbmd1YWdlLnRvVXBwZXJDYXNlKCkgKyAnXycgKyBjb3VudGVyICsgJ19fXyc7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgdG9rZW5zIG9mIGBQcmlzbS50b2tlbml6ZWAgYnV0IGFsc28gcnVucyB0aGUgYGJlZm9yZS10b2tlbml6ZWAgYW5kIGBhZnRlci10b2tlbml6ZWAgaG9va3MuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG5cdCAqIEBwYXJhbSB7YW55fSBncmFtbWFyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZVxuXHQgKiBAcmV0dXJucyB7KHN0cmluZ3xUb2tlbilbXX1cblx0ICovXG5cdGZ1bmN0aW9uIHRva2VuaXplV2l0aEhvb2tzKGNvZGUsIGdyYW1tYXIsIGxhbmd1YWdlKSB7XG5cdFx0dmFyIGVudiA9IHtcblx0XHRcdGNvZGU6IGNvZGUsXG5cdFx0XHRncmFtbWFyOiBncmFtbWFyLFxuXHRcdFx0bGFuZ3VhZ2U6IGxhbmd1YWdlXG5cdFx0fTtcblx0XHRQcmlzbS5ob29rcy5ydW4oJ2JlZm9yZS10b2tlbml6ZScsIGVudik7XG5cdFx0ZW52LnRva2VucyA9IFByaXNtLnRva2VuaXplKGVudi5jb2RlLCBlbnYuZ3JhbW1hcik7XG5cdFx0UHJpc20uaG9va3MucnVuKCdhZnRlci10b2tlbml6ZScsIGVudik7XG5cdFx0cmV0dXJuIGVudi50b2tlbnM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgdG9rZW4gb2YgdGhlIGdpdmVuIEphdmFTY3JpcHQgaW50ZXJwb2xhdGlvbiBleHByZXNzaW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBUaGUgY29kZSBvZiB0aGUgZXhwcmVzc2lvbi4gRS5nLiBgXCIkezQyfVwiYFxuXHQgKiBAcmV0dXJucyB7VG9rZW59XG5cdCAqL1xuXHRmdW5jdGlvbiB0b2tlbml6ZUludGVycG9sYXRpb25FeHByZXNzaW9uKGV4cHJlc3Npb24pIHtcblx0XHR2YXIgdGVtcEdyYW1tYXIgPSB7fTtcblx0XHR0ZW1wR3JhbW1hclsnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbiddID0gaW50ZXJwb2xhdGlvblB1bmN0dWF0aW9uT2JqZWN0O1xuXG5cdFx0LyoqIEB0eXBlIHtBcnJheX0gKi9cblx0XHR2YXIgdG9rZW5zID0gUHJpc20udG9rZW5pemUoZXhwcmVzc2lvbiwgdGVtcEdyYW1tYXIpO1xuXHRcdGlmICh0b2tlbnMubGVuZ3RoID09PSAzKSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSB0b2tlbiBhcnJheSB3aWxsIGxvb2sgbGlrZSB0aGlzXG5cdFx0XHQgKiBbXG5cdFx0XHQgKiAgICAgW1wiaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvblwiLCBcIiR7XCJdXG5cdFx0XHQgKiAgICAgXCIuLi5cIiAvLyBKYXZhU2NyaXB0IGV4cHJlc3Npb24gb2YgdGhlIGludGVycG9sYXRpb25cblx0XHRcdCAqICAgICBbXCJpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uXCIsIFwifVwiXVxuXHRcdFx0ICogXVxuXHRcdFx0ICovXG5cblx0XHRcdHZhciBhcmdzID0gWzEsIDFdO1xuXHRcdFx0YXJncy5wdXNoLmFwcGx5KGFyZ3MsIHRva2VuaXplV2l0aEhvb2tzKHRva2Vuc1sxXSwgUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHQsICdqYXZhc2NyaXB0JykpO1xuXG5cdFx0XHR0b2tlbnMuc3BsaWNlLmFwcGx5KHRva2VucywgYXJncyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBQcmlzbS5Ub2tlbignaW50ZXJwb2xhdGlvbicsIHRva2VucywgaW50ZXJwb2xhdGlvbk9iamVjdC5hbGlhcywgZXhwcmVzc2lvbik7XG5cdH1cblxuXHQvKipcblx0ICogVG9rZW5pemVzIHRoZSBnaXZlbiBjb2RlIHdpdGggc3VwcG9ydCBmb3IgSmF2YVNjcmlwdCBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb25zIG1peGVkIGluLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGhhcyAzIHBoYXNlczpcblx0ICpcblx0ICogMS4gUmVwbGFjZSBhbGwgSmF2YVNjcmlwdCBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb24gd2l0aCBhIHBsYWNlaG9sZGVyLlxuXHQgKiAgICBUaGUgcGxhY2Vob2xkZXIgd2lsbCBoYXZlIHRoZSBzeW50YXggb2YgYSBpZGVudGlmeSBvZiB0aGUgdGFyZ2V0IGxhbmd1YWdlLlxuXHQgKiAyLiBUb2tlbml6ZSB0aGUgY29kZSB3aXRoIHBsYWNlaG9sZGVycy5cblx0ICogMy4gVG9rZW5pemUgdGhlIGludGVycG9sYXRpb24gZXhwcmVzc2lvbnMgYW5kIHJlLWluc2VydCB0aGVtIGludG8gdGhlIHRva2VuaXplIGNvZGUuXG5cdCAqICAgIFRoZSBpbnNlcnRpb24gb25seSB3b3JrcyBpZiBhIHBsYWNlaG9sZGVyIGhhc24ndCBiZWVuIFwicmlwcGVkIGFwYXJ0XCIgbWVhbmluZyB0aGF0IHRoZSBwbGFjZWhvbGRlciBoYXMgYmVlblxuXHQgKiAgICB0b2tlbml6ZWQgYXMgdHdvIHRva2VucyBieSB0aGUgZ3JhbW1hciBvZiB0aGUgZW1iZWRkZWQgbGFuZ3VhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBncmFtbWFyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZVxuXHQgKiBAcmV0dXJucyB7VG9rZW59XG5cdCAqL1xuXHRmdW5jdGlvbiB0b2tlbml6ZUVtYmVkZGVkKGNvZGUsIGdyYW1tYXIsIGxhbmd1YWdlKSB7XG5cdFx0Ly8gMS4gRmlyc3QgZmlsdGVyIG91dCBhbGwgaW50ZXJwb2xhdGlvbnNcblxuXHRcdC8vIGJlY2F1c2UgdGhleSBtaWdodCBiZSBlc2NhcGVkLCB3ZSBuZWVkIGEgbG9va2JlaGluZCwgc28gd2UgdXNlIFByaXNtXG5cdFx0LyoqIEB0eXBlIHsoVG9rZW58c3RyaW5nKVtdfSAqL1xuXHRcdHZhciBfdG9rZW5zID0gUHJpc20udG9rZW5pemUoY29kZSwge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChpbnRlcnBvbGF0aW9uUGF0dGVybiksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIHJlcGxhY2UgYWxsIGludGVycG9sYXRpb25zIHdpdGggYSBwbGFjZWhvbGRlciB3aGljaCBpcyBub3QgaW4gdGhlIGNvZGUgYWxyZWFkeVxuXHRcdHZhciBwbGFjZWhvbGRlckNvdW50ZXIgPSAwO1xuXHRcdC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgc3RyaW5nPn0gKi9cblx0XHR2YXIgcGxhY2Vob2xkZXJNYXAgPSB7fTtcblx0XHR2YXIgZW1iZWRkZWRDb2RlID0gX3Rva2Vucy5tYXAoZnVuY3Rpb24gKHRva2VuKSB7XG5cdFx0XHRpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRyZXR1cm4gdG9rZW47XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgaW50ZXJwb2xhdGlvbkV4cHJlc3Npb24gPSB0b2tlbi5jb250ZW50O1xuXG5cdFx0XHRcdHZhciBwbGFjZWhvbGRlcjtcblx0XHRcdFx0d2hpbGUgKGNvZGUuaW5kZXhPZihwbGFjZWhvbGRlciA9IGdldFBsYWNlaG9sZGVyKHBsYWNlaG9sZGVyQ291bnRlcisrLCBsYW5ndWFnZSkpICE9PSAtMSkgeyAvKiBub29wICovIH1cblx0XHRcdFx0cGxhY2Vob2xkZXJNYXBbcGxhY2Vob2xkZXJdID0gaW50ZXJwb2xhdGlvbkV4cHJlc3Npb247XG5cdFx0XHRcdHJldHVybiBwbGFjZWhvbGRlcjtcblx0XHRcdH1cblx0XHR9KS5qb2luKCcnKTtcblxuXG5cdFx0Ly8gMi4gVG9rZW5pemUgdGhlIGVtYmVkZGVkIGNvZGVcblxuXHRcdHZhciBlbWJlZGRlZFRva2VucyA9IHRva2VuaXplV2l0aEhvb2tzKGVtYmVkZGVkQ29kZSwgZ3JhbW1hciwgbGFuZ3VhZ2UpO1xuXG5cblx0XHQvLyAzLiBSZS1pbnNlcnQgdGhlIGludGVycG9sYXRpb25cblxuXHRcdHZhciBwbGFjZWhvbGRlcnMgPSBPYmplY3Qua2V5cyhwbGFjZWhvbGRlck1hcCk7XG5cdFx0cGxhY2Vob2xkZXJDb3VudGVyID0gMDtcblxuXHRcdC8qKlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHsoVG9rZW58c3RyaW5nKVtdfSB0b2tlbnNcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cblx0XHQgKi9cblx0XHRmdW5jdGlvbiB3YWxrVG9rZW5zKHRva2Vucykge1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHBsYWNlaG9sZGVyQ291bnRlciA+PSBwbGFjZWhvbGRlcnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHRva2VuID0gdG9rZW5zW2ldO1xuXG5cdFx0XHRcdGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0b2tlbi5jb250ZW50ID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdHZhciBwbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyc1twbGFjZWhvbGRlckNvdW50ZXJdO1xuXHRcdFx0XHRcdHZhciBzID0gdHlwZW9mIHRva2VuID09PSAnc3RyaW5nJyA/IHRva2VuIDogLyoqIEB0eXBlIHtzdHJpbmd9ICovICh0b2tlbi5jb250ZW50KTtcblxuXHRcdFx0XHRcdHZhciBpbmRleCA9IHMuaW5kZXhPZihwbGFjZWhvbGRlcik7XG5cdFx0XHRcdFx0aWYgKGluZGV4ICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0KytwbGFjZWhvbGRlckNvdW50ZXI7XG5cblx0XHRcdFx0XHRcdHZhciBiZWZvcmUgPSBzLnN1YnN0cmluZygwLCBpbmRleCk7XG5cdFx0XHRcdFx0XHR2YXIgbWlkZGxlID0gdG9rZW5pemVJbnRlcnBvbGF0aW9uRXhwcmVzc2lvbihwbGFjZWhvbGRlck1hcFtwbGFjZWhvbGRlcl0pO1xuXHRcdFx0XHRcdFx0dmFyIGFmdGVyID0gcy5zdWJzdHJpbmcoaW5kZXggKyBwbGFjZWhvbGRlci5sZW5ndGgpO1xuXG5cdFx0XHRcdFx0XHR2YXIgcmVwbGFjZW1lbnQgPSBbXTtcblx0XHRcdFx0XHRcdGlmIChiZWZvcmUpIHtcblx0XHRcdFx0XHRcdFx0cmVwbGFjZW1lbnQucHVzaChiZWZvcmUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmVwbGFjZW1lbnQucHVzaChtaWRkbGUpO1xuXHRcdFx0XHRcdFx0aWYgKGFmdGVyKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBhZnRlclRva2VucyA9IFthZnRlcl07XG5cdFx0XHRcdFx0XHRcdHdhbGtUb2tlbnMoYWZ0ZXJUb2tlbnMpO1xuXHRcdFx0XHRcdFx0XHRyZXBsYWNlbWVudC5wdXNoLmFwcGx5KHJlcGxhY2VtZW50LCBhZnRlclRva2Vucyk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0XHRcdHRva2Vucy5zcGxpY2UuYXBwbHkodG9rZW5zLCBbaSwgMV0uY29uY2F0KHJlcGxhY2VtZW50KSk7XG5cdFx0XHRcdFx0XHRcdGkgKz0gcmVwbGFjZW1lbnQubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHRva2VuLmNvbnRlbnQgPSByZXBsYWNlbWVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIGNvbnRlbnQgPSB0b2tlbi5jb250ZW50O1xuXHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpKSB7XG5cdFx0XHRcdFx0XHR3YWxrVG9rZW5zKGNvbnRlbnQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR3YWxrVG9rZW5zKFtjb250ZW50XSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHdhbGtUb2tlbnMoZW1iZWRkZWRUb2tlbnMpO1xuXG5cdFx0cmV0dXJuIG5ldyBQcmlzbS5Ub2tlbihsYW5ndWFnZSwgZW1iZWRkZWRUb2tlbnMsICdsYW5ndWFnZS0nICsgbGFuZ3VhZ2UsIGNvZGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBsYW5ndWFnZXMgZm9yIHdoaWNoIEpTIHRlbXBsYXRpbmcgd2lsbCBoYW5kbGUgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWxzLlxuXHQgKlxuXHQgKiBKUyB0ZW1wbGF0aW5nIGlzbid0IGFjdGl2ZSBmb3Igb25seSBKYXZhU2NyaXB0IGJ1dCBhbHNvIHJlbGF0ZWQgbGFuZ3VhZ2VzIGxpa2UgVHlwZVNjcmlwdCwgSlNYLCBhbmQgVFNYLlxuXHQgKi9cblx0dmFyIHN1cHBvcnRlZExhbmd1YWdlcyA9IHtcblx0XHQnamF2YXNjcmlwdCc6IHRydWUsXG5cdFx0J2pzJzogdHJ1ZSxcblx0XHQndHlwZXNjcmlwdCc6IHRydWUsXG5cdFx0J3RzJzogdHJ1ZSxcblx0XHQnanN4JzogdHJ1ZSxcblx0XHQndHN4JzogdHJ1ZSxcblx0fTtcblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRpZiAoIShlbnYubGFuZ3VhZ2UgaW4gc3VwcG9ydGVkTGFuZ3VhZ2VzKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEZpbmRzIGFuZCB0b2tlbml6ZXMgYWxsIHRlbXBsYXRlIHN0cmluZ3Mgd2l0aCBhbiBlbWJlZGRlZCBsYW5ndWFnZXMuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0geyhUb2tlbiB8IHN0cmluZylbXX0gdG9rZW5zXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gZmluZFRlbXBsYXRlU3RyaW5ncyh0b2tlbnMpIHtcblx0XHRcdGZvciAodmFyIGkgPSAwLCBsID0gdG9rZW5zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHR2YXIgdG9rZW4gPSB0b2tlbnNbaV07XG5cblx0XHRcdFx0aWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBjb250ZW50ID0gdG9rZW4uY29udGVudDtcblx0XHRcdFx0aWYgKCFBcnJheS5pc0FycmF5KGNvbnRlbnQpKSB7XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdFx0ZmluZFRlbXBsYXRlU3RyaW5ncyhbY29udGVudF0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0b2tlbi50eXBlID09PSAndGVtcGxhdGUtc3RyaW5nJykge1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIEEgSmF2YVNjcmlwdCB0ZW1wbGF0ZS1zdHJpbmcgdG9rZW4gd2lsbCBsb29rIGxpa2UgdGhpczpcblx0XHRcdFx0XHQgKlxuXHRcdFx0XHRcdCAqIFtcInRlbXBsYXRlLXN0cmluZ1wiLCBbXG5cdFx0XHRcdFx0ICogICAgIFtcInRlbXBsYXRlLXB1bmN0dWF0aW9uXCIsIFwiYFwiXSxcblx0XHRcdFx0XHQgKiAgICAgKFxuXHRcdFx0XHRcdCAqICAgICAgICAgQW4gYXJyYXkgb2YgXCJzdHJpbmdcIiBhbmQgXCJpbnRlcnBvbGF0aW9uXCIgdG9rZW5zLiBUaGlzIGlzIHRoZSBzaW1wbGUgc3RyaW5nIGNhc2UuXG5cdFx0XHRcdFx0ICogICAgICAgICBvclxuXHRcdFx0XHRcdCAqICAgICAgICAgW1wiZW1iZWRkZWQtY29kZVwiLCBcIi4uLlwiXSBUaGlzIGlzIHRoZSB0b2tlbiBjb250YWluaW5nIHRoZSBlbWJlZGRlZCBjb2RlLlxuXHRcdFx0XHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0IGFsc28gaGFzIGFuIGFsaWFzIHdoaWNoIGlzIHRoZSBsYW5ndWFnZSBvZiB0aGUgZW1iZWRkZWQgY29kZS5cblx0XHRcdFx0XHQgKiAgICAgKSxcblx0XHRcdFx0XHQgKiAgICAgW1widGVtcGxhdGUtcHVuY3R1YXRpb25cIiwgXCJgXCJdXG5cdFx0XHRcdFx0ICogXV1cblx0XHRcdFx0XHQgKi9cblxuXHRcdFx0XHRcdHZhciBlbWJlZGRlZCA9IGNvbnRlbnRbMV07XG5cdFx0XHRcdFx0aWYgKGNvbnRlbnQubGVuZ3RoID09PSAzICYmIHR5cGVvZiBlbWJlZGRlZCAhPT0gJ3N0cmluZycgJiYgZW1iZWRkZWQudHlwZSA9PT0gJ2VtYmVkZGVkLWNvZGUnKSB7XG5cdFx0XHRcdFx0XHQvLyBnZXQgc3RyaW5nIGNvbnRlbnRcblx0XHRcdFx0XHRcdHZhciBjb2RlID0gc3RyaW5nQ29udGVudChlbWJlZGRlZCk7XG5cblx0XHRcdFx0XHRcdHZhciBhbGlhcyA9IGVtYmVkZGVkLmFsaWFzO1xuXHRcdFx0XHRcdFx0dmFyIGxhbmd1YWdlID0gQXJyYXkuaXNBcnJheShhbGlhcykgPyBhbGlhc1swXSA6IGFsaWFzO1xuXG5cdFx0XHRcdFx0XHR2YXIgZ3JhbW1hciA9IFByaXNtLmxhbmd1YWdlc1tsYW5ndWFnZV07XG5cdFx0XHRcdFx0XHRpZiAoIWdyYW1tYXIpIHtcblx0XHRcdFx0XHRcdFx0Ly8gdGhlIGVtYmVkZGVkIGxhbmd1YWdlIGlzbid0IHJlZ2lzdGVyZWQuXG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjb250ZW50WzFdID0gdG9rZW5pemVFbWJlZGRlZChjb2RlLCBncmFtbWFyLCBsYW5ndWFnZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZpbmRUZW1wbGF0ZVN0cmluZ3MoY29udGVudCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRmaW5kVGVtcGxhdGVTdHJpbmdzKGVudi50b2tlbnMpO1xuXHR9KTtcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBzdHJpbmcgY29udGVudCBvZiBhIHRva2VuIG9yIHRva2VuIHN0cmVhbS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmcgfCBUb2tlbiB8IChzdHJpbmcgfCBUb2tlbilbXX0gdmFsdWVcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGZ1bmN0aW9uIHN0cmluZ0NvbnRlbnQodmFsdWUpIHtcblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiB2YWx1ZS5tYXAoc3RyaW5nQ29udGVudCkuam9pbignJyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBzdHJpbmdDb250ZW50KHZhbHVlLmNvbnRlbnQpO1xuXHRcdH1cblx0fVxuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5qdWxpYSA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0Ly8gc3VwcG9ydCBvbmUgbGV2ZWwgb2YgbmVzdGVkIGNvbW1lbnRzXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL0p1bGlhTGFuZy9qdWxpYS9wdWxsLzYxMjhcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkoPzojPSg/OlteIz1dfD0oPyEjKXwjKD8hPSl8Iz0oPzpbXiM9XXw9KD8hIyl8Iyg/IT0pKSo9IykqPSN8Iy4qKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQncmVnZXgnOiB7XG5cdFx0Ly8gaHR0cHM6Ly9kb2NzLmp1bGlhbGFuZy5vcmcvZW4vdjEvbWFudWFsL3N0cmluZ3MvI1JlZ3VsYXItRXhwcmVzc2lvbnMtMVxuXHRcdHBhdHRlcm46IC9yXCIoPzpcXFxcLnxbXlwiXFxcXFxcclxcbl0pKlwiW2ltc3hdezAsNH0vLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdC8vIGh0dHBzOi8vZG9jcy5qdWxpYWxhbmcub3JnL2VuL3YxL21hbnVhbC9zdHJpbmdzLyNTdHJpbmctQmFzaWNzLTFcblx0XHQvLyBodHRwczovL2RvY3MuanVsaWFsYW5nLm9yZy9lbi92MS9tYW51YWwvc3RyaW5ncy8jbm9uLXN0YW5kYXJkLXN0cmluZy1saXRlcmFscy0xXG5cdFx0Ly8gaHR0cHM6Ly9kb2NzLmp1bGlhbGFuZy5vcmcvZW4vdjEvbWFudWFsL3J1bm5pbmctZXh0ZXJuYWwtcHJvZ3JhbXMvI1J1bm5pbmctRXh0ZXJuYWwtUHJvZ3JhbXMtMVxuXHRcdHBhdHRlcm46IC9cIlwiXCJbXFxzXFxTXSs/XCJcIlwifCg/OlxcYlxcdyspP1wiKD86XFxcXC58W15cIlxcXFxcXHJcXG5dKSpcInxgKD86W15cXFxcYFxcclxcbl18XFxcXC4pKmAvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2hhcic6IHtcblx0XHQvLyBodHRwczovL2RvY3MuanVsaWFsYW5nLm9yZy9lbi92MS9tYW51YWwvc3RyaW5ncy8jbWFuLWNoYXJhY3RlcnMtMVxuXHRcdHBhdHRlcm46IC8oXnxbXlxcdyddKScoPzpcXFxcW15cXHJcXG5dW14nXFxyXFxuXSp8W15cXFxcXFxyXFxuXSknLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzphYnN0cmFjdHxiYXJlbW9kdWxlfGJlZ2lufGJpdHN0eXBlfGJyZWFrfGNhdGNofGNjYWxsfGNvbnN0fGNvbnRpbnVlfGRvfGVsc2V8ZWxzZWlmfGVuZHxleHBvcnR8ZmluYWxseXxmb3J8ZnVuY3Rpb258Z2xvYmFsfGlmfGltbXV0YWJsZXxpbXBvcnR8aW1wb3J0YWxsfGlufGxldHxsb2NhbHxtYWNyb3xtb2R1bGV8cHJpbnR8cHJpbnRsbnxxdW90ZXxyZXR1cm58c3RydWN0fHRyeXx0eXBlfHR5cGVhbGlhc3x1c2luZ3x3aGlsZSlcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdudW1iZXInOiAvKD86XFxiKD89XFxkKXxcXEIoPz1cXC4pKSg/OjBbYm94XSk/KD86W1xcZGEtZl0rKD86X1tcXGRhLWZdKykqKD86XFwuKD86XFxkKyg/Ol9cXGQrKSopPyk/fFxcLlxcZCsoPzpfXFxkKykqKSg/OltlZnBdWystXT9cXGQrKD86X1xcZCspKik/aj8vaSxcblx0Ly8gaHR0cHM6Ly9kb2NzLmp1bGlhbGFuZy5vcmcvZW4vdjEvbWFudWFsL21hdGhlbWF0aWNhbC1vcGVyYXRpb25zL1xuXHQvLyBodHRwczovL2RvY3MuanVsaWFsYW5nLm9yZy9lbi92MS9tYW51YWwvbWF0aGVtYXRpY2FsLW9wZXJhdGlvbnMvI09wZXJhdG9yLVByZWNlZGVuY2UtYW5kLUFzc29jaWF0aXZpdHktMVxuXHQnb3BlcmF0b3InOiAvJiZ8XFx8XFx8fFstKypeJVx1MDBGN1x1MjJCQiYkXFxcXF09P3xcXC9bXFwvPV0/fCE9Pz0/fFxcfFs9Pl0/fDwoPzo8PT98Wz06fF0pP3w+KD86PXw+Pj89Pyk/fD09Pz0/fFt+XHUyMjYwXHUyMjY0XHUyMjY1J1x1MjIxQVx1MjIxQl0vLFxuXHQncHVuY3R1YXRpb24nOiAvOjo/fFt7fVtcXF0oKTssLj9dLyxcblx0Ly8gaHR0cHM6Ly9kb2NzLmp1bGlhbGFuZy5vcmcvZW4vdjEvYmFzZS9udW1iZXJzLyNCYXNlLmltXG5cdCdjb25zdGFudCc6IC9cXGIoPzooPzpJbmZ8TmFOKSg/OjE2fDMyfDY0KT98aW18cGkpXFxifFtcdTAzQzBcdTIxMkZdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmtlZXBhbGl2ZWQgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9bIyFdLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSg/OlwiKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W15cIlxcXFxcXHJcXG5dKSpcInwnKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W14nXFxcXFxcclxcbl0pKicpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdC8vIHN1cHBvcnQgSVB2NCwgSVB2Niwgc3VibmV0IG1hc2tcblx0J2lwJzoge1xuXHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdC9cXGIoPzooPzooPzpbXFxkYS1mXXsxLDR9Oil7N31bXFxkYS1mXXsxLDR9fCg/OltcXGRhLWZdezEsNH06KXs2fTpbXFxkYS1mXXsxLDR9fCg/OltcXGRhLWZdezEsNH06KXs1fTooPzpbXFxkYS1mXXsxLDR9Oik/W1xcZGEtZl17MSw0fXwoPzpbXFxkYS1mXXsxLDR9Oil7NH06KD86W1xcZGEtZl17MSw0fTopezAsMn1bXFxkYS1mXXsxLDR9fCg/OltcXGRhLWZdezEsNH06KXszfTooPzpbXFxkYS1mXXsxLDR9Oil7MCwzfVtcXGRhLWZdezEsNH18KD86W1xcZGEtZl17MSw0fTopezJ9Oig/OltcXGRhLWZdezEsNH06KXswLDR9W1xcZGEtZl17MSw0fXwoPzpbXFxkYS1mXXsxLDR9Oil7Nn08aXB2ND58KD86W1xcZGEtZl17MSw0fTopezAsNX06PGlwdjQ+fDo6KD86W1xcZGEtZl17MSw0fTopezAsNX08aXB2ND58W1xcZGEtZl17MSw0fTo6KD86W1xcZGEtZl17MSw0fTopezAsNX1bXFxkYS1mXXsxLDR9fDo6KD86W1xcZGEtZl17MSw0fTopezAsNn1bXFxkYS1mXXsxLDR9fCg/OltcXGRhLWZdezEsNH06KXsxLDd9OikoPzpcXC9cXGR7MSwzfSk/fDxpcHY0Pig/OlxcL1xcZHsxLDJ9KT8pXFxiLy5zb3VyY2Vcblx0XHRcdFx0LnJlcGxhY2UoLzxpcHY0Pi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiAvKD86KD86KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XVxcZHxcXGQpXFwuKXszfSg/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV1cXGR8XFxkKSkvLnNvdXJjZTsgfSksXG5cdFx0XHQnaSdcblx0XHQpLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXG5cdC8vIHN1cHBvcnQgKm5peCAvIFdpbmRvd3MsIGRpcmVjdG9yeSAvIGZpbGVcblx0J3BhdGgnOiB7XG5cdFx0cGF0dGVybjogLyhcXHMpXFwvKD86W15cXC9cXHNdK1xcLykqW15cXC9cXHNdKnxcXGJbYS16QS1aXTpcXFxcKD86W15cXFxcXFxzXStcXFxcKSpbXlxcXFxcXHNdKi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3N0cmluZycsXG5cdH0sXG5cdCd2YXJpYWJsZSc6IC9cXCRcXHs/XFx3K1xcfT8vLFxuXHQnZW1haWwnOiB7XG5cdFx0cGF0dGVybjogL1tcXHctXStAW1xcdy1dKyg/OlxcLltcXHctXXsyLDN9KXsxLDJ9Lyxcblx0XHRhbGlhczogJ3N0cmluZycsXG5cdH0sXG5cdCdjb25kaXRpb25hbC1jb25maWd1cmF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9AXFxeP1tcXHctXSsvLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH0sXG5cdCdvcGVyYXRvcic6IC89LyxcblxuXHQncHJvcGVydHknOiAvXFxiKD86QkZEX0NIRUNLfEROU19DSEVDS3xGSUxFX0NIRUNLfEhUVFBfR0VUfE1JU0NfQ0hFQ0t8TkFNRXxQSU5HX0NIRUNLfFNDUklQVFN8U01UUF9DSEVDS3xTU0x8U1NMX0dFVHxUQ1BfQ0hFQ0t8VURQX0NIRUNLfGFjY2VwdHxhZHZlcnRfaW50fGFscGhhfGF1dGhfcGFzc3xhdXRoX3R5cGV8YXV0aGVudGljYXRpb258YmZkX2NwdV9hZmZpbml0eXxiZmRfaW5zdGFuY2V8YmZkX25vX3N3YXB8YmZkX3ByaW9yaXR5fGJmZF9wcm9jZXNzX25hbWV8YmZkX3JsaW1pdF9ydHRpbWV8YmZkX3J0X3ByaW9yaXR5fGJpbmRfaWZ8YmluZF9wb3J0fGJpbmR0b3xjYXxjZXJ0aWZpY2F0ZXxjaGVja191bmljYXN0X3NyY3xjaGVja2VyfGNoZWNrZXJfY3B1X2FmZmluaXR5fGNoZWNrZXJfbG9nX2FsbF9mYWlsdXJlc3xjaGVja2VyX25vX3N3YXB8Y2hlY2tlcl9wcmlvcml0eXxjaGVja2VyX3JsaW1pdF9ydHRpbWV8Y2hlY2tlcl9ydF9wcmlvcml0eXxjaGlsZF93YWl0X3RpbWV8Y29ubmVjdF9pcHxjb25uZWN0X3BvcnR8Y29ubmVjdF90aW1lb3V0fGRidXNfc2VydmljZV9uYW1lfGRlYnVnfGRlZmF1bHRfaW50ZXJmYWNlfGRlbGF5fGRlbGF5X2JlZm9yZV9yZXRyeXxkZWxheV9sb29wfGRpZ2VzdHxkb250X3RyYWNrX3ByaW1hcnl8ZHluYW1pY3xkeW5hbWljX2ludGVyZmFjZXN8ZW5hYmxlXyg/OmRidXN8c2NyaXB0X3NlY3VyaXR5fHNuaXxzbm1wX2NoZWNrZXJ8c25tcF9yZmN8c25tcF9yZmN2Mnxzbm1wX3JmY3YzfHNubXBfdnJycHx0cmFwcyl8ZW5kfGZhbGx8ZmFzdF9yZWNvdmVyeXxmaWxlfGZsYWctWzEyM118Zm9ya19kZWxheXxmdWxsX2NvbW1hbmR8ZndtYXJrfGdhcnBfZ3JvdXB8Z2FycF9pbnRlcnZhbHxnYXJwX2xvd2VyX3ByaW9fZGVsYXl8Z2FycF9sb3dlcl9wcmlvX3JlcGVhdHxnYXJwX21hc3Rlcl9kZWxheXxnYXJwX21hc3Rlcl9yZWZyZXNofGdhcnBfbWFzdGVyX3JlZnJlc2hfcmVwZWF0fGdhcnBfbWFzdGVyX3JlcGVhdHxnbG9iYWxfZGVmc3xnbG9iYWxfdHJhY2tpbmd8Z25hX2ludGVydmFsfGdyb3VwfGhhX3N1c3BlbmR8aGFzaGVkfGhlbG9fbmFtZXxoaWdoZXJfcHJpb19zZW5kX2FkdmVydHxob3BsaW1pdHxodHRwX3Byb3RvY29sfGh5c3RlcmVzaXN8aWRsZV90eHxpbmNsdWRlfGluaGliaXRfb25fZmFpbHVyZXxpbml0X2ZhaWx8aW5pdF9maWxlfGluc3RhbmNlfGludGVyZmFjZXxpbnRlcmZhY2VzfGludGVydmFsfGlwX2ZhbWlseXxpcHZzX3Byb2Nlc3NfbmFtZXxrZWVwYWxpdmVkLmNvbmZ8a2VybmVsX3J4X2J1Zl9zaXplfGtleXxsaW5rYmVhdF9pbnRlcmZhY2VzfGxpbmtiZWF0X3VzZV9wb2xsaW5nfGxvZ19hbGxfZmFpbHVyZXN8bG9nX3Vua25vd25fdnJpZHN8bG93ZXJfcHJpb19ub19hZHZlcnR8bHRocmVzaG9sZHxsdnNfZmx1c2h8bHZzX2ZsdXNoX29uc3RvcHxsdnNfbWV0aG9kfGx2c19uZXRsaW5rX2NtZF9yY3ZfYnVmc3xsdnNfbmV0bGlua19jbWRfcmN2X2J1ZnNfZm9yY2V8bHZzX25ldGxpbmtfbW9uaXRvcl9yY3ZfYnVmc3xsdnNfbmV0bGlua19tb25pdG9yX3Jjdl9idWZzX2ZvcmNlfGx2c19ub3RpZnlfZmlmb3xsdnNfbm90aWZ5X2ZpZm9fc2NyaXB0fGx2c19zY2hlZHxsdnNfc3luY19kYWVtb258bWF4X2F1dG9fcHJpb3JpdHl8bWF4X2hvcHN8bWNhc3Rfc3JjX2lwfG1oLWZhbGxiYWNrfG1oLXBvcnR8bWluX2F1dG9fcHJpb3JpdHlfZGVsYXl8bWluX3J4fG1pbl90eHxtaXNjX2R5bmFtaWN8bWlzY19wYXRofG1pc2NfdGltZW91dHxtdWx0aXBsaWVyfG5hbWV8bmFtZXNwYWNlX3dpdGhfaXBzZXRzfG5hdGl2ZV9pcHY2fG5laWdoYm9yX2lwfG5ldF9uYW1lc3BhY2V8bmV0X25hbWVzcGFjZV9pcHZzfG5mdGFibGVzfG5mdGFibGVzX2NvdW50ZXJzfG5mdGFibGVzX2lmaW5kZXh8bmZ0YWJsZXNfcHJpb3JpdHl8bm9fYWNjZXB0fG5vX2NoZWNrZXJfZW1haWxzfG5vX2VtYWlsX2ZhdWx0c3xub3ByZWVtcHR8bm90aWZpY2F0aW9uX2VtYWlsfG5vdGlmaWNhdGlvbl9lbWFpbF9mcm9tfG5vdGlmeXxub3RpZnlfYmFja3VwfG5vdGlmeV9kZWxldGVkfG5vdGlmeV9kb3dufG5vdGlmeV9mYXVsdHxub3RpZnlfZmlmb3xub3RpZnlfZmlmb19zY3JpcHR8bm90aWZ5X21hc3Rlcnxub3RpZnlfbWFzdGVyX3J4X2xvd2VyX3ByaXxub3RpZnlfcHJpb3JpdHlfY2hhbmdlc3xub3RpZnlfc3RvcHxub3RpZnlfdXB8b2xkX3VuaWNhc3RfY2hlY2tzdW18b21lZ2F8b3BzfHBhcmFtX21hdGNofHBhc3NpdmV8cGFzc3dvcmR8cGF0aHxwZXJzaXN0ZW5jZV9lbmdpbmV8cGVyc2lzdGVuY2VfZ3JhbnVsYXJpdHl8cGVyc2lzdGVuY2VfdGltZW91dHxwcmVlbXB0fHByZWVtcHRfZGVsYXl8cHJpb3JpdHl8cHJvY2Vzc3xwcm9jZXNzX21vbml0b3JfcmN2X2J1ZnN8cHJvY2Vzc19tb25pdG9yX3Jjdl9idWZzX2ZvcmNlfHByb2Nlc3NfbmFtZXxwcm9jZXNzX25hbWVzfHByb21vdGVfc2Vjb25kYXJpZXN8cHJvdG9jb2x8cHJveHlfYXJwfHByb3h5X2FycF9wdmxhbnxxdW9ydW18cXVvcnVtX2Rvd258cXVvcnVtX21heHxxdW9ydW1fdXB8cmFuZG9tX3NlZWR8cmVhbF9zZXJ2ZXJ8cmVnZXh8cmVnZXhfbWF4X29mZnNldHxyZWdleF9taW5fb2Zmc2V0fHJlZ2V4X25vX21hdGNofHJlZ2V4X29wdGlvbnN8cmVnZXhfc3RhY2t8cmVsb2FkX3JlcGVhdHxyZWxvYWRfdGltZV9maWxlfHJlcXVpcmVfcmVwbHl8cmV0cnl8cmlzZXxyb3V0ZXJfaWR8cnNfaW5pdF9ub3RpZmllc3xzY3JpcHR8c2NyaXB0X3VzZXJ8c2gtZmFsbGJhY2t8c2gtcG9ydHxzaHV0ZG93bl9zY3JpcHR8c2h1dGRvd25fc2NyaXB0X3RpbWVvdXR8c2tpcF9jaGVja19hZHZfYWRkcnxzbXRwX2FsZXJ0fHNtdHBfYWxlcnRfY2hlY2tlcnxzbXRwX2FsZXJ0X3ZycnB8c210cF9jb25uZWN0X3RpbWVvdXR8c210cF9oZWxvX25hbWV8c210cF9zZXJ2ZXJ8c25tcF9zb2NrZXR8c29ycnlfc2VydmVyfHNvcnJ5X3NlcnZlcl9pbmhpYml0fHNvcnJ5X3NlcnZlcl9sdnNfbWV0aG9kfHNvdXJjZV9pcHxzdGFydHxzdGFydHVwX3NjcmlwdHxzdGFydHVwX3NjcmlwdF90aW1lb3V0fHN0YXRlfHN0YXRpY19pcGFkZHJlc3N8c3RhdGljX3JvdXRlc3xzdGF0aWNfcnVsZXN8c3RhdHVzX2NvZGV8c3RlcHxzdHJpY3RfbW9kZXxzeW5jX2dyb3VwX3RyYWNraW5nX3dlaWdodHx0ZXJtaW5hdGVfZGVsYXl8dGltZW91dHx0cmFja19iZmR8dHJhY2tfZmlsZXx0cmFja19ncm91cHx0cmFja19pbnRlcmZhY2V8dHJhY2tfcHJvY2Vzc3x0cmFja19zY3JpcHR8dHJhY2tfc3JjX2lwfHR0bHx0eXBlfHVtYXNrfHVuaWNhc3RfcGVlcnx1bmljYXN0X3NyY19pcHx1bmljYXN0X3R0bHx1cmx8dXNlX2lwdmxhbnx1c2VfcGlkX2Rpcnx1c2Vfdm1hY3x1c2VyfHV0aHJlc2hvbGR8dmFsWzEyM118dmVyc2lvbnx2aXJ0dWFsX2lwYWRkcmVzc3x2aXJ0dWFsX2lwYWRkcmVzc19leGNsdWRlZHx2aXJ0dWFsX3JvdXRlcl9pZHx2aXJ0dWFsX3JvdXRlc3x2aXJ0dWFsX3J1bGVzfHZpcnR1YWxfc2VydmVyfHZpcnR1YWxfc2VydmVyX2dyb3VwfHZpcnR1YWxob3N0fHZtYWNfeG1pdF9iYXNlfHZycnB8dnJycF8oPzpjaGVja191bmljYXN0X3NyY3xjcHVfYWZmaW5pdHl8Z2FycF9pbnRlcnZhbHxnYXJwX2xvd2VyX3ByaW9fZGVsYXl8Z2FycF9sb3dlcl9wcmlvX3JlcGVhdHxnYXJwX21hc3Rlcl9kZWxheXxnYXJwX21hc3Rlcl9yZWZyZXNofGdhcnBfbWFzdGVyX3JlZnJlc2hfcmVwZWF0fGdhcnBfbWFzdGVyX3JlcGVhdHxnbmFfaW50ZXJ2YWx8aGlnaGVyX3ByaW9fc2VuZF9hZHZlcnR8aW5zdGFuY2V8aXBzZXRzfGlwdGFibGVzfGxvd2VyX3ByaW9fbm9fYWR2ZXJ0fG1jYXN0X2dyb3VwNHxtY2FzdF9ncm91cDZ8bWluX2dhcnB8bmV0bGlua19jbWRfcmN2X2J1ZnN8bmV0bGlua19jbWRfcmN2X2J1ZnNfZm9yY2V8bmV0bGlua19tb25pdG9yX3Jjdl9idWZzfG5ldGxpbmtfbW9uaXRvcl9yY3ZfYnVmc19mb3JjZXxub19zd2FwfG5vdGlmeV9maWZvfG5vdGlmeV9maWZvX3NjcmlwdHxub3RpZnlfcHJpb3JpdHlfY2hhbmdlc3xwcmlvcml0eXxwcm9jZXNzX25hbWV8cmxpbWl0X3J0dGltZXxydF9wcmlvcml0eXxyeF9idWZzX211bHRpcGxpZXJ8cnhfYnVmc19wb2xpY3l8c2NyaXB0fHNraXBfY2hlY2tfYWR2X2FkZHJ8c3RhcnR1cF9kZWxheXxzdHJpY3R8c3luY19ncm91cHx0cmFja19wcm9jZXNzfHZlcnNpb24pfHdhcm11cHx3ZWlnaHQpXFxiLyxcblxuXHQnY29uc3RhbnQnOiAvXFxiKD86QXxBQUFBfEFIfEJBQ0tVUHxDTkFNRXxEUnxNQVNURVJ8TVh8TkFUfE5TfFBBU1N8U0NUUHxTT0F8VENQfFRVTnxUWFR8VURQfGRofGZvfGxibGN8bGJsY3J8bGN8bWh8bnF8b3ZmfHJyfHNlZHxzaHx3bGN8d3JyKVxcYi8sXG5cblx0J251bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXHcuLV0pLT9cXGQrKD86XFwuXFxkKyk/Lyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8bm98b2ZmfG9ufHRydWV8eWVzKVxcYi8sXG5cblx0J3B1bmN0dWF0aW9uJzogL1tcXHtcXH1dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmtleW1hbiA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcYmMgLiovaSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCJbXlwiXFxyXFxuXSpcInwnW14nXFxyXFxuXSonLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3ZpcnR1YWwta2V5Jzoge1xuXHRcdHBhdHRlcm46IC9cXFtcXHMqKD86KD86QUxUfENBUFN8Q1RSTHxMQUxUfExDVFJMfE5DQVBTfFJBTFR8UkNUUkx8U0hJRlQpXFxzKykqKD86W1RLVV1fW1xcdz9dK3xbQS1FXVxcZFxcZD98XCJbXlwiXFxyXFxuXSpcInwnW14nXFxyXFxuXSonKVxccypcXF0vaSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdmdW5jdGlvbicgLy8gYWxpYXMgZm9yIHN0eWxlc1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vaGVscC5rZXltYW4uY29tL2RldmVsb3Blci9sYW5ndWFnZS9ndWlkZS9oZWFkZXJzXG5cdCdoZWFkZXIta2V5d29yZCc6IHtcblx0XHRwYXR0ZXJuOiAvJlxcdysvLFxuXHRcdGFsaWFzOiAnYm9sZCcgLy8gYWxpYXMgZm9yIHN0eWxlc1xuXHR9LFxuXHQnaGVhZGVyLXN0YXRlbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86Yml0bWFwfGJpdG1hcHN8Y2FwcyBhbHdheXMgb2ZmfGNhcHMgb24gb25seXxjb3B5cmlnaHR8aG90a2V5fGxhbmd1YWdlfGxheW91dHxtZXNzYWdlfG5hbWV8c2hpZnQgZnJlZXMgY2Fwc3x2ZXJzaW9uKVxcYi9pLFxuXHRcdGFsaWFzOiAnYm9sZCcgLy8gYWxpYXMgZm9yIHN0eWxlc1xuXHR9LFxuXG5cdCdydWxlLWtleXdvcmQnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OmFueXxiYXNlbGF5b3V0fGJlZXB8Y2FsbHxjb250ZXh0fGRlYWRrZXl8ZGt8aWZ8aW5kZXh8bGF5ZXJ8bm90YW55fG51bHxvdXRzfHBsYXRmb3JtfHJlc2V0fHJldHVybnxzYXZlfHNldHxzdG9yZXx1c2UpXFxiL2ksXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnc3RydWN0dXJhbC1rZXl3b3JkJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzphbnNpfGJlZ2lufGdyb3VwfG1hdGNofG5ld2NvbnRleHR8bm9tYXRjaHxwb3N0a2V5c3Ryb2tlfHJlYWRvbmx5fHVuaWNvZGV8dXNpbmcga2V5cylcXGIvaSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cblx0J2NvbXBpbGUtdGFyZ2V0Jzoge1xuXHRcdHBhdHRlcm46IC9cXCQoPzprZXltYW58a2V5bWFub25seXxrZXltYW53ZWJ8a21mbHx3ZWF2ZXIpOi9pLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cblx0Ly8gVSsjIyMjLCB4IyMjLCBkIyMjIGNoYXJhY3RlcnMgYW5kIG51bWJlcnNcblx0J251bWJlcic6IC9cXGIoPzpVXFwrW1xcZEEtRl0rfGRcXGQrfHhbXFxkYS1mXSt8XFxkKylcXGIvaSxcblx0J29wZXJhdG9yJzogL1srPlxcXFwkXXxcXC5cXC4vLFxuXHQncHVuY3R1YXRpb24nOiAvWygpPSxdL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHRQcmlzbS5sYW5ndWFnZXMua290bGluID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdFx0J2tleXdvcmQnOiB7XG5cdFx0XHQvLyBUaGUgbG9va2JlaGluZCBwcmV2ZW50cyB3cm9uZyBoaWdobGlnaHRpbmcgb2YgZS5nLiBrb3RsaW4ucHJvcGVydGllcy5nZXRcblx0XHRcdHBhdHRlcm46IC8oXnxbXi5dKVxcYig/OmFic3RyYWN0fGFjdHVhbHxhbm5vdGF0aW9ufGFzfGJyZWFrfGJ5fGNhdGNofGNsYXNzfGNvbXBhbmlvbnxjb25zdHxjb25zdHJ1Y3Rvcnxjb250aW51ZXxjcm9zc2lubGluZXxkYXRhfGRvfGR5bmFtaWN8ZWxzZXxlbnVtfGV4cGVjdHxleHRlcm5hbHxmaW5hbHxmaW5hbGx5fGZvcnxmdW58Z2V0fGlmfGltcG9ydHxpbnxpbmZpeHxpbml0fGlubGluZXxpbm5lcnxpbnRlcmZhY2V8aW50ZXJuYWx8aXN8bGF0ZWluaXR8bm9pbmxpbmV8bnVsbHxvYmplY3R8b3BlbnxvcGVyYXRvcnxvdXR8b3ZlcnJpZGV8cGFja2FnZXxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8cmVpZmllZHxyZXR1cm58c2VhbGVkfHNldHxzdXBlcnxzdXNwZW5kfHRhaWxyZWN8dGhpc3x0aHJvd3x0b3x0cnl8dHlwZWFsaWFzfHZhbHx2YXJ8dmFyYXJnfHdoZW58d2hlcmV8d2hpbGUpXFxiLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdmdW5jdGlvbic6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyg/OmBbXlxcclxcbmBdK2B8XFxiXFx3KykoPz1cXHMqXFwoKS8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXC4pKD86YFteXFxyXFxuYF0rYHxcXHcrKSg/PVxccypcXHspLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnbnVtYmVyJzogL1xcYig/OjBbeFhdW1xcZGEtZkEtRl0rKD86X1tcXGRhLWZBLUZdKykqfDBbYkJdWzAxXSsoPzpfWzAxXSspKnxcXGQrKD86X1xcZCspKig/OlxcLlxcZCsoPzpfXFxkKykqKT8oPzpbZUVdWystXT9cXGQrKD86X1xcZCspKik/W2ZGTF0/KVxcYi8sXG5cdFx0J29wZXJhdG9yJzogL1xcK1srPV0/fC1bLT0+XT98PT0/PT98ISg/OiF8PT0/KT98W1xcLyolPD5dPT98Wz86XTo/fFxcLlxcLnwmJnxcXHxcXHx8XFxiKD86YW5kfGludnxvcnxzaGx8c2hyfHVzaHJ8eG9yKVxcYi9cblx0fSk7XG5cblx0ZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5rb3RsaW5bJ2NsYXNzLW5hbWUnXTtcblxuXHR2YXIgaW50ZXJwb2xhdGlvbkluc2lkZSA9IHtcblx0XHQnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC9eXFwkXFx7P3xcXH0kLyxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMua290bGluXG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2tvdGxpbicsICdzdHJpbmcnLCB7XG5cdFx0Ly8gaHR0cHM6Ly9rb3RsaW5sYW5nLm9yZy9zcGVjL2V4cHJlc3Npb25zLmh0bWwjc3RyaW5nLWludGVycG9sYXRpb24tZXhwcmVzc2lvbnNcblx0XHQnc3RyaW5nLWxpdGVyYWwnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cIlwiXCIoPzpbXiRdfFxcJCg/Oig/IVxceyl8XFx7W157fV0qXFx9KSkqP1wiXCJcIi8sXG5cdFx0XHRcdGFsaWFzOiAnbXVsdGlsaW5lJyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXFwkKD86W2Etel9dXFx3KnxcXHtbXnt9XSpcXH0pL2ksXG5cdFx0XHRcdFx0XHRpbnNpZGU6IGludGVycG9sYXRpb25JbnNpZGVcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxcXFxcclxcbiRdfFxcXFwufFxcJCg/Oig/IVxceyl8XFx7W157fV0qXFx9KSkqXCIvLFxuXHRcdFx0XHRhbGlhczogJ3NpbmdsZWxpbmUnLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXlxcXFxdKSg/OlxcXFx7Mn0pKilcXCQoPzpbYS16X11cXHcqfFxce1tee31dKlxcfSkvaSxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRpbnNpZGU6IGludGVycG9sYXRpb25JbnNpZGVcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnY2hhcic6IHtcblx0XHRcdC8vIGh0dHBzOi8va290bGlubGFuZy5vcmcvc3BlYy9leHByZXNzaW9ucy5odG1sI2NoYXJhY3Rlci1saXRlcmFsc1xuXHRcdFx0cGF0dGVybjogLycoPzpbXidcXFxcXFxyXFxuXXxcXFxcKD86Lnx1W2EtZkEtRjAtOV17MCw0fSkpJy8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdH0pO1xuXG5cdGRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMua290bGluWydzdHJpbmcnXTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdrb3RsaW4nLCAna2V5d29yZCcsIHtcblx0XHQnYW5ub3RhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC9cXEJAKD86XFx3KzopPyg/OltBLVpdXFx3KnxcXFtbXlxcXV0rXFxdKS8sXG5cdFx0XHRhbGlhczogJ2J1aWx0aW4nXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdrb3RsaW4nLCAnZnVuY3Rpb24nLCB7XG5cdFx0J2xhYmVsJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYlxcdytAfEBcXHcrXFxiLyxcblx0XHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmt0ID0gUHJpc20ubGFuZ3VhZ2VzLmtvdGxpbjtcblx0UHJpc20ubGFuZ3VhZ2VzLmt0cyA9IFByaXNtLmxhbmd1YWdlcy5rb3RsaW47XG59KFByaXNtKSk7XG5cbi8qIGVzbGludC1kaXNhYmxlIHJlZ2V4cC9uby1kdXBlLWNoYXJhY3RlcnMtY2hhcmFjdGVyLWNsYXNzICovXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0LyoqXG5cdCAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgYWxsb3dlZCBpbiBpZGVudGlmaWVycy5cblx0ICpcblx0ICogQHR5cGUge3N0cmluZ31cblx0ICovXG5cdHZhciBub25JZCA9IC9cXHNcXHgwMC1cXHgxZlxceDIyLVxceDJmXFx4M2EtXFx4M2ZcXHg1Yi1cXHg1ZVxceDYwXFx4N2ItXFx4N2UvLnNvdXJjZTtcblxuXHQvKipcblx0ICogU3Vycm91bmQgYSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIElEcyB3aXRoIHBhdHRlcm5zIGZvciBub24tSUQgc2VxdWVuY2VzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVybiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgaWRlbnRpZmllcnMuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhZ3NdIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gZmxhZ3MuXG5cdCAqIEByZXR1cm5zIHtSZWdFeHB9IEEgd3JhcHBlZCByZWd1bGFyIGV4cHJlc3Npb24gZm9yIGlkZW50aWZpZXJzLlxuXHQgKi9cblx0ZnVuY3Rpb24gd3JhcElkKHBhdHRlcm4sIGZsYWdzKSB7XG5cdFx0cmV0dXJuIFJlZ0V4cChwYXR0ZXJuLnJlcGxhY2UoLzxub25JZD4vZywgbm9uSWQpLCBmbGFncyk7XG5cdH1cblxuXHRQcmlzbS5sYW5ndWFnZXMua3VtaXIgPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFx8LiovXG5cdFx0fSxcblxuXHRcdCdwcm9sb2cnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvIy4qLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiW15cXG5cXHJcIl0qXCJ8J1teXFxuXFxyJ10qJy8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXG5cdFx0J2Jvb2xlYW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiB3cmFwSWQoLyhefFs8bm9uSWQ+XSkoPzpcdTA0MzRcdTA0MzB8XHUwNDNEXHUwNDM1XHUwNDQyKSg/PVs8bm9uSWQ+XXwkKS8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXG5cdFx0J29wZXJhdG9yLXdvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiB3cmFwSWQoLyhefFs8bm9uSWQ+XSkoPzpcdTA0Mzh8XHUwNDM4XHUwNDNCXHUwNDM4fFx1MDQzRFx1MDQzNSkoPz1bPG5vbklkPl18JCkvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cblx0XHQnc3lzdGVtLXZhcmlhYmxlJzoge1xuXHRcdFx0cGF0dGVybjogd3JhcElkKC8oXnxbPG5vbklkPl0pXHUwNDM3XHUwNDNEXHUwNDMwXHUwNDQ3KD89Wzxub25JZD5dfCQpLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXG5cdFx0J3R5cGUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IHdyYXBJZCgvKF58Wzxub25JZD5dKSg/Olx1MDQzMlx1MDQzNVx1MDQ0OXxcdTA0M0JcdTA0MzhcdTA0NDJ8XHUwNDNCXHUwNDNFXHUwNDMzfFx1MDQ0MVx1MDQzOFx1MDQzQ3xcdTA0NDZcdTA0MzVcdTA0M0IpKD86XFx4MjAqXHUwNDQyXHUwNDMwXHUwNDMxKT8oPz1bPG5vbklkPl18JCkvLnNvdXJjZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnYnVpbHRpbidcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IHdyYXBJZCgvKF58Wzxub25JZD5dKSg/Olx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzQnxcdTA0NDFcdTA0M0FcdTA0MzBcdTA0M0RcdTA0M0FcdTA0M0VcdTA0MzR8XHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCfFx1MDQ0Nlx1MDQzMlx1MDQzNVx1MDQ0MikoPz1bPG5vbklkPl18JCkvLnNvdXJjZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdFx0fVxuXHRcdF0sXG5cblx0XHQvKipcblx0XHQgKiBTaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIHNlYXJjaGluZyBmb3IgdHlwZSBuYW1lcyBiZWNhdXNlIG9mIFwiXHUwNDQyXHUwNDMwXHUwNDMxXCIuXG5cdFx0ICogXCJcdTA0NDJcdTA0MzBcdTA0MzFcIiBpcyBhIHJlc2VydmVkIHdvcmQsIGJ1dCBuZXZlciB1c2VkIHdpdGhvdXQgYSBwcmVjZWRpbmcgdHlwZSBuYW1lLlxuXHRcdCAqIFwiXHUwNDFEXHUwNDEwXHUwNDE3XHUwNDFEXHUwNDEwXHUwNDI3XHUwNDE4XHUwNDIyXHUwNDJDXCIsIFwiXHUwNDI0XHUwNDMyXHUwNDMyXHUwNDNFXHUwNDM0XCIsIGFuZCBcIlx1MDQyNFx1MDQzMlx1MDQ0Qlx1MDQzMlx1MDQzRVx1MDQzNFwiIGFyZSBub3QgcmVzZXJ2ZWQgd29yZHMuXG5cdFx0ICovXG5cdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiB3cmFwSWQoLyhefFs8bm9uSWQ+XSkoPzpcdTA0MzBcdTA0M0JcdTA0MzN8XHUwNDMwXHUwNDQwXHUwNDMzKD86XFx4MjAqXHUwNDQwXHUwNDM1XHUwNDM3KT98XHUwNDMyXHUwNDMyXHUwNDNFXHUwNDM0fFx1MDQxMlx1MDQxQVx1MDQxQlx1MDQyRVx1MDQyN1x1MDQxOFx1MDQyMlx1MDQyQ3xcdTA0MzJcdTA0NDFbXHUwNDM1XHUwNDUxXXxcdTA0MzJcdTA0NEJcdTA0MzFcdTA0M0VcdTA0NDB8XHUwNDMyXHUwNDRCXHUwNDMyXHUwNDNFXHUwNDM0fFx1MDQzMlx1MDQ0Qlx1MDQ0NVx1MDQzRVx1MDQzNHxcdTA0MzRcdTA0MzBcdTA0M0RcdTA0M0V8XHUwNDM0XHUwNDNCXHUwNDRGfFx1MDQzNFx1MDQzRXxcdTA0MzRcdTA0NDF8XHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4fFx1MDQzOFx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzNXxcdTA0MzhcdTA0NDFcdTA0M0Z8XHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDfFx1MDQzQVx1MDQzRVx1MDQzRCg/Oig/OlxceDIwK3xfKVx1MDQzOFx1MDQ0MVx1MDQzRik/fFx1MDQzQVx1MDQ0Nig/Oig/OlxceDIwK3xfKVx1MDQzRlx1MDQ0MFx1MDQzOCk/fFx1MDQzRFx1MDQzMFx1MDQzNFx1MDQzRXxcdTA0M0RcdTA0MzBcdTA0NDd8XHUwNDNEXHUwNDQxfFx1MDQzRFx1MDQ0NnxcdTA0M0VcdTA0NDJ8XHUwNDNGXHUwNDMwXHUwNDQzXHUwNDM3XHUwNDMwfFx1MDQzRlx1MDQzRVx1MDQzQVx1MDQzMHxcdTA0M0ZcdTA0NDBcdTA0Mzh8XHUwNDQwXHUwNDMwXHUwNDM3XHUwNDMwP3xcdTA0NDBcdTA0MzVcdTA0Mzd8XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDNGfFx1MDQ0Mlx1MDQzMFx1MDQzMXxcdTA0NDJcdTA0M0V8XHUwNDQzXHUwNDQyXHUwNDMyfFx1MDQ0OFx1MDQzMFx1MDQzMykoPz1bPG5vbklkPl18JCkvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblxuXHRcdC8qKiBTaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIHNlYXJjaGluZyBmb3IgcmVzZXJ2ZWQgd29yZHMuICovXG5cdFx0J25hbWUnOiB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXN1cGVyLWxpbmVhci1iYWNrdHJhY2tpbmdcblx0XHRcdHBhdHRlcm46IHdyYXBJZCgvKF58Wzxub25JZD5dKVteXFxkPG5vbklkPl1bXjxub25JZD5dKig/OlxceDIwK1tePG5vbklkPl0rKSooPz1bPG5vbklkPl18JCkvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblxuXHRcdC8qKiBTaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIHNlYXJjaGluZyBmb3IgbmFtZXMuICovXG5cdFx0J251bWJlcic6IHtcblx0XHRcdHBhdHRlcm46IHdyYXBJZCgvKF58Wzxub25JZD5dKSg/OlxcQlxcJFtcXGRhLWZdK1xcYnwoPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/KSg/PVs8bm9uSWQ+XXwkKS8uc291cmNlLCAnaScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQvKiogU2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciBzZWFyY2hpbmcgZm9yIHdvcmRzLiAqL1xuXHRcdCdwdW5jdHVhdGlvbic6IC86PXxbKCksOjtcXFtcXF1dLyxcblxuXHRcdC8qKlxuXHRcdCAqIFNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgc2VhcmNoaW5nIGZvclxuXHRcdCAqIC0gbnVtZXJpYyBjb25zdGFudHMgKGJlY2F1c2Ugb2YgXCIrXCIgYW5kIFwiLVwiKTtcblx0XHQgKiAtIHB1bmN0dWF0aW9uIG1hcmtzIChiZWNhdXNlIG9mIFwiOj1cIiBhbmQgXCI9XCIpLlxuXHRcdCAqL1xuXHRcdCdvcGVyYXRvci1jaGFyJzoge1xuXHRcdFx0cGF0dGVybjogL1xcKlxcKj98PFs9Pl0/fD49P3xbLSsvPV0vLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmt1bSA9IFByaXNtLmxhbmd1YWdlcy5rdW1pcjtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMua3VzdG8gPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXC8uKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL2BgYFtcXHNcXFNdKj9gYGB8W2hIXT8oPzpcIig/OlteXFxyXFxuXFxcXFwiXXxcXFxcLikqXCJ8Jyg/OlteXFxyXFxuXFxcXCddfFxcXFwuKSonfEAoPzpcIlteXFxyXFxuXCJdKlwifCdbXlxcclxcbiddKicpKS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J3ZlcmInOiB7XG5cdFx0cGF0dGVybjogLyhcXHxcXHMqKVthLXpdW1xcdy1dKi9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXG5cdCdjb21tYW5kJzoge1xuXHRcdHBhdHRlcm46IC9cXC5bYS16XVthLXpcXGQtXSpcXGIvLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblxuXHQnY2xhc3MtbmFtZSc6IC9cXGIoPzpib29sfGRhdGV0aW1lfGRlY2ltYWx8ZHluYW1pY3xndWlkfGludHxsb25nfHJlYWx8c3RyaW5nfHRpbWVzcGFuKVxcYi8sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFjY2Vzc3xhbGlhc3xhbmR8YW50aXxhc3xhc2N8YXV0b3xiZXR3ZWVufGJ5fCg/OmNvbnRhaW5zfCg/OmVuZHN8c3RhcnRzKXdpdGh8aGFzKD86cGVyZml4fHN1ZmZpeCk/KSg/Ol9jcyk/fGRhdGFiYXNlfGRlY2xhcmV8ZGVzY3xleHRlcm5hbHxmcm9tfGZ1bGxvdXRlcnxoYXNfYWxsfGlufGluZ2VzdGlvbnxpbmxpbmV8aW5uZXJ8aW5uZXJ1bmlxdWV8aW50b3woPzpsZWZ0fHJpZ2h0KSg/OmFudGkoPzpzZW1pKT98aW5uZXJ8b3V0ZXJ8c2VtaSk/fGxldHxsaWtlfGxvY2FsfG5vdHxvZnxvbnxvcnxwYXR0ZXJufHByaW50fHF1ZXJ5X3BhcmFtZXRlcnN8cmFuZ2V8cmVzdHJpY3R8c2NoZW1hfHNldHxzdGVwfHRhYmxlfHRhYmxlc3x0b3x2aWV3fHdoZXJlfHdpdGh8bWF0Y2hlc1xccytyZWdleHxudWxsc1xccysoPzpmaXJzdHxsYXN0KSkoPyFbXFx3LV0pLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8bnVsbHx0cnVlKVxcYi8sXG5cblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKS8sXG5cblx0J2RhdGV0aW1lJzogW1xuXHRcdHtcblx0XHRcdC8vIFJGQyA4MjIgKyBSRkMgODUwXG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86KD86RnJpfEZyaWRheXxNb258TW9uZGF5fFNhdHxTYXR1cmRheXxTdW58U3VuZGF5fFRodXxUaHVyc2RheXxUdWV8VHVlc2RheXxXZWR8V2VkbmVzZGF5KVxccyosXFxzKik/XFxkezEsMn0oPzpcXHMrfC0pKD86QXByfEF1Z3xEZWN8RmVifEphbnxKdWx8SnVufE1hcnxNYXl8Tm92fE9jdHxTZXApKD86XFxzK3wtKVxcZHsyfVxccytcXGR7Mn06XFxkezJ9KD86OlxcZHsyfSk/KD86XFxzKig/OlxcYig/OltBLVpdfCg/OltFQ01UXVtEU118R018VSlUKXxbKy1dXFxkezR9KSk/XFxiLyxcblx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gSVNPIDg2MDFcblx0XHRcdHBhdHRlcm46IC9bKy1dP1xcYig/OlxcZHs0fS1cXGR7Mn0tXFxkezJ9KD86WyBUXVxcZHsyfTpcXGR7Mn0oPzo6XFxkezJ9KD86XFwuXFxkKyk/KT8pP3xcXGR7Mn06XFxkezJ9KD86OlxcZHsyfSg/OlxcLlxcZCspPyk/KVo/Lyxcblx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdH1cblx0XSxcblx0J251bWJlcic6IC9cXGIoPzoweFswLTlBLUZhLWZdK3xcXGQrKD86XFwuXFxkKyk/KD86W0VlXVsrLV0/XFxkKyk/KSg/Oig/Om1pbnxzZWN8W21uXHUwMEI1XXN8W2RobXNdfG1pY3Jvc2Vjb25kfHRpY2spXFxiKT98WystXT9cXGJpbmZcXGIvLFxuXG5cdCdvcGVyYXRvcic6IC89PnxbIT1dfnxbIT08Pl09P3xbLSsqLyV8XXxcXC5cXC4vLFxuXHQncHVuY3R1YXRpb24nOiAvWygpXFxbXFxde30sOy46XS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0dmFyIGZ1bmNQYXR0ZXJuID0gL1xcXFwoPzpbXmEteigpW1xcXV18W2EteipdKykvaTtcblx0dmFyIGluc2lkZUVxdSA9IHtcblx0XHQnZXF1YXRpb24tY29tbWFuZCc6IHtcblx0XHRcdHBhdHRlcm46IGZ1bmNQYXR0ZXJuLFxuXHRcdFx0YWxpYXM6ICdyZWdleCdcblx0XHR9XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmxhdGV4ID0ge1xuXHRcdCdjb21tZW50JzogLyUuKi8sXG5cdFx0Ly8gdGhlIHZlcmJhdGltIGVudmlyb25tZW50IHByaW50cyB3aGl0ZXNwYWNlIHRvIHRoZSBkb2N1bWVudFxuXHRcdCdjZGF0YSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxcXGJlZ2luXFx7KCg/OmxzdGxpc3Rpbmd8dmVyYmF0aW0pXFwqPylcXH0pW1xcc1xcU10qPyg/PVxcXFxlbmRcXHtcXDJcXH0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC8qXG5cdFx0ICogZXF1YXRpb25zIGNhbiBiZSBiZXR3ZWVuICQkICQkIG9yICQgJCBvciBcXCggXFwpIG9yIFxcWyBcXF1cblx0XHQgKiAoYWxsIGFyZSBtdWx0aWxpbmUpXG5cdFx0ICovXG5cdFx0J2VxdWF0aW9uJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwkXFwkKD86XFxcXFtcXHNcXFNdfFteXFxcXCRdKStcXCRcXCR8XFwkKD86XFxcXFtcXHNcXFNdfFteXFxcXCRdKStcXCR8XFxcXFxcKFtcXHNcXFNdKj9cXFxcXFwpfFxcXFxcXFtbXFxzXFxTXSo/XFxcXFxcXS8sXG5cdFx0XHRcdGluc2lkZTogaW5zaWRlRXF1LFxuXHRcdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFxcXGJlZ2luXFx7KCg/OmFsaWdufGVxbmFycmF5fGVxdWF0aW9ufGdhdGhlcnxtYXRofG11bHRsaW5lKVxcKj8pXFx9KVtcXHNcXFNdKj8oPz1cXFxcZW5kXFx7XFwyXFx9KS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogaW5zaWRlRXF1LFxuXHRcdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHRcdH1cblx0XHRdLFxuXHRcdC8qXG5cdFx0ICogYXJndW1lbnRzIHdoaWNoIGFyZSBrZXl3b3JkcyBvciByZWZlcmVuY2VzIGFyZSBoaWdobGlnaHRlZFxuXHRcdCAqIGFzIGtleXdvcmRzXG5cdFx0ICovXG5cdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcXFwoPzpiZWdpbnxjaXRlfGRvY3VtZW50Y2xhc3N8ZW5kfGxhYmVsfHJlZnx1c2VwYWNrYWdlKSg/OlxcW1teXFxdXStcXF0pP1xceylbXn1dKyg/PVxcfSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3VybCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxcXHVybFxceylbXn1dKyg/PVxcfSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0Lypcblx0XHQgKiBzZWN0aW9uIG9yIGNoYXB0ZXIgaGVhZGxpbmVzIGFyZSBoaWdobGlnaHRlZCBhcyBib2xkIHNvIHRoYXRcblx0XHQgKiB0aGV5IHN0YW5kIG91dCBtb3JlXG5cdFx0ICovXG5cdFx0J2hlYWRsaW5lJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXFxcKD86Y2hhcHRlcnxmcmFtZXRpdGxlfHBhcmFncmFwaHxwYXJ0fHNlY3Rpb258c3VicGFyYWdyYXBofHN1YnNlY3Rpb258c3Vic3VicGFyYWdyYXBofHN1YnN1YnNlY3Rpb258c3Vic3Vic3VicGFyYWdyYXBoKVxcKj8oPzpcXFtbXlxcXV0rXFxdKT9cXHspW159XSsoPz1cXH0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdFx0fSxcblx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiBmdW5jUGF0dGVybixcblx0XHRcdGFsaWFzOiAnc2VsZWN0b3InXG5cdFx0fSxcblx0XHQncHVuY3R1YXRpb24nOiAvW1tcXF17fSZdL1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy50ZXggPSBQcmlzbS5sYW5ndWFnZXMubGF0ZXg7XG5cdFByaXNtLmxhbmd1YWdlcy5jb250ZXh0ID0gUHJpc20ubGFuZ3VhZ2VzLmxhdGV4O1xufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdFByaXNtLmxhbmd1YWdlcy5sYXR0ZSA9IHtcblx0XHQnY29tbWVudCc6IC9eXFx7XFwqW1xcc1xcU10qLyxcblx0XHQnbGF0dGUtdGFnJzoge1xuXHRcdFx0Ly8gaHR0cHM6Ly9sYXR0ZS5uZXR0ZS5vcmcvZW4vdGFnc1xuXHRcdFx0cGF0dGVybjogLyheXFx7KD86XFwvKD89W2Etel0pKT8pKD86Wz1fXXxbYS16XVxcdypcXGIoPyFcXCgpKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdH0sXG5cdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdHBhdHRlcm46IC9eXFx7XFwvP3xcXH0kLyxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQncGhwJzoge1xuXHRcdFx0cGF0dGVybjogL1xcUyg/OltcXHNcXFNdKlxcUyk/Lyxcblx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtcGhwJyxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnBocFxuXHRcdH1cblx0fTtcblxuXHR2YXIgbWFya3VwTGF0dGUgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdtYXJrdXAnLCB7fSk7XG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2luc2lkZScsICdhdHRyLXZhbHVlJywge1xuXHRcdCduLWF0dHInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvbjpbXFx3LV0rKD86XFxzKj1cXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFteXFxzJ1wiPj1dKykpPy8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2F0dHItbmFtZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlteXFxzPV0rLyxcblx0XHRcdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHRcdFx0fSxcblx0XHRcdFx0J2F0dHItdmFsdWUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLz1bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogW1xuXHRcdFx0XHRcdFx0XHQvXj0vLFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0cGF0dGVybjogL14oXFxzKilbXCInXXxbXCInXSQvLFxuXHRcdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdCdwaHAnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9cXFMoPzpbXFxzXFxTXSpcXFMpPy8sXG5cdFx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnBocFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdH1cblx0XHR9LFxuXHR9LCBtYXJrdXBMYXR0ZS50YWcpO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdGlmIChlbnYubGFuZ3VhZ2UgIT09ICdsYXR0ZScpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dmFyIGxhdHRlUGF0dGVybiA9IC9cXHtcXCpbXFxzXFxTXSo/XFwqXFx9fFxce1teJ1wiXFxze30qXSg/OlteXCInL3t9XXxcXC8oPyFbKi9dKXwoXCJ8JykoPzpcXFxcW1xcc1xcU118KD8hXFwxKVteXFxcXF0pKlxcMXxcXC9cXCooPzpbXipdfFxcKig/IVxcLykpKlxcKlxcLykqXFx9L2c7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLmJ1aWxkUGxhY2Vob2xkZXJzKGVudiwgJ2xhdHRlJywgbGF0dGVQYXR0ZXJuKTtcblx0XHRlbnYuZ3JhbW1hciA9IG1hcmt1cExhdHRlO1xuXHR9KTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS50b2tlbml6ZVBsYWNlaG9sZGVycyhlbnYsICdsYXR0ZScpO1xuXHR9KTtcblxufShQcmlzbSkpO1xuXG4vKiBGSVhNRSA6XG4gOmV4dGVuZCgpIGlzIG5vdCBoYW5kbGVkIHNwZWNpZmljYWxseSA6IGl0cyBoaWdobGlnaHRpbmcgaXMgYnVnZ3kuXG4gTWl4aW4gdXNhZ2UgbXVzdCBiZSBpbnNpZGUgYSBydWxlc2V0IHRvIGJlIGhpZ2hsaWdodGVkLlxuIEF0LXJ1bGVzIChlLmcuIGltcG9ydCkgY29udGFpbmluZyBpbnRlcnBvbGF0aW9ucyBhcmUgYnVnZ3kuXG4gRGV0YWNoZWQgcnVsZXNldHMgYXJlIGhpZ2hsaWdodGVkIGFzIGF0LXJ1bGVzLlxuIEEgY29tbWVudCBiZWZvcmUgYSBtaXhpbiB1c2FnZSBwcmV2ZW50cyB0aGUgbGF0dGVyIHRvIGJlIHByb3Blcmx5IGhpZ2hsaWdodGVkLlxuICovXG5cblByaXNtLmxhbmd1YWdlcy5sZXNzID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY3NzJywge1xuXHQnY29tbWVudCc6IFtcblx0XHQvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFwvXFwvLiovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J2F0cnVsZSc6IHtcblx0XHRwYXR0ZXJuOiAvQFtcXHctXSg/OlxcKCg/OlteKCl7fV18XFwoW14oKXt9XSpcXCkpKlxcKXxbXigpe307XFxzXXxcXHMrKD8hXFxzKSkqPyg/PVxccypcXHspLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9bOigpXS9cblx0XHR9XG5cdH0sXG5cdC8vIHNlbGVjdG9ycyBhbmQgbWl4aW5zIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lXG5cdCdzZWxlY3Rvcic6IHtcblx0XHRwYXR0ZXJuOiAvKD86QFxce1tcXHctXStcXH18W157fTtcXHNAXSkoPzpAXFx7W1xcdy1dK1xcfXxcXCgoPzpbXigpe31dfFxcKFteKCl7fV0qXFwpKSpcXCl8W14oKXt9O0BcXHNdfFxccysoPyFcXHMpKSo/KD89XFxzKlxceykvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0Ly8gbWl4aW4gcGFyYW1ldGVyc1xuXHRcdFx0J3ZhcmlhYmxlJzogL0ArW1xcdy1dKy9cblx0XHR9XG5cdH0sXG5cblx0J3Byb3BlcnR5JzogLyg/OkBcXHtbXFx3LV0rXFx9fFtcXHctXSkrKD86XFwrXz8pPyg/PVxccyo6KS8sXG5cdCdvcGVyYXRvcic6IC9bK1xcLSpcXC9dL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2xlc3MnLCAncHJvcGVydHknLCB7XG5cdCd2YXJpYWJsZSc6IFtcblx0XHQvLyBWYXJpYWJsZSBkZWNsYXJhdGlvbiAodGhlIGNvbG9uIG11c3QgYmUgY29uc3VtZWQhKVxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9AW1xcdy1dK1xccyo6Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvOi9cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gVmFyaWFibGUgdXNhZ2Vcblx0XHQvQEA/W1xcdy1dKy9cblx0XSxcblx0J21peGluLXVzYWdlJzoge1xuXHRcdHBhdHRlcm46IC8oW3s7XVxccyopWy4jXSg/IVxcZClbXFx3LV0uKj8oPz1bKDtdKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9XG59KTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHRQcmlzbS5sYW5ndWFnZXMuc2NoZW1lID0ge1xuXHRcdC8vIHRoaXMgc3VwcG9ydHMgXCJub3JtYWxcIiBzaW5nbGUtbGluZSBjb21tZW50czpcblx0XHQvLyAgIDsgY29tbWVudFxuXHRcdC8vIGFuZCAocG90ZW50aWFsbHkgbmVzdGVkKSBtdWx0aWxpbmUgY29tbWVudHM6XG5cdFx0Ly8gICAjfCBjb21tZW50ICN8IG5lc3RlZCB8IyBzdGlsbCBjb21tZW50IHwjXG5cdFx0Ly8gKG9ubHkgMSBsZXZlbCBvZiBuZXN0aW5nIGlzIHN1cHBvcnRlZClcblx0XHQnY29tbWVudCc6IC87Lip8IztcXHMqKD86XFwoKD86W14oKV18XFwoW14oKV0qXFwpKSpcXCl8XFxbKD86W15cXFtcXF1dfFxcW1teXFxbXFxdXSpcXF0pKlxcXSl8I1xcfCg/OlteI3xdfCMoPyFcXHwpfFxcfCg/ISMpfCNcXHwoPzpbXiN8XXwjKD8hXFx8KXxcXHwoPyEjKSkqXFx8IykqXFx8Iy8sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIig/OlteXCJcXFxcXXxcXFxcLikqXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnc3ltYm9sJzoge1xuXHRcdFx0cGF0dGVybjogLydbXigpXFxbXFxdIydcXHNdKy8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdjaGFyJzoge1xuXHRcdFx0cGF0dGVybjogLyNcXFxcKD86W3V4XVthLWZBLUZcXGRdK1xcYnxbLWEtekEtWl0rXFxifFtcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl18XFxTKS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdsYW1iZGEtcGFyYW1ldGVyJzogW1xuXHRcdFx0Ly8gaHR0cHM6Ly93d3cuY3MuY211LmVkdS9Hcm91cHMvQUkvaHRtbC9yNHJzL3I0cnNfNi5odG1sI1NFQzMwXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXidgI10pWyhcXFtdbGFtYmRhXFxzKykoPzpbXnwoKVxcW1xcXSdcXHNdK3xcXHwoPzpbXlxcXFx8XXxcXFxcLikqXFx8KS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXidgI10pWyhcXFtdbGFtYmRhXFxzK1soXFxbXSlbXigpXFxbXFxdJ10rLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W14nYCNdKVsoXFxbXSkoPzpiZWdpbnxjYXNlKD86LWxhbWJkYSk/fGNvbmQoPzotZXhwYW5kKT98ZGVmaW5lKD86LWxpYnJhcnl8LW1hY3JvfC1yZWNvcmQtdHlwZXwtc3ludGF4fC12YWx1ZXMpP3xkZWZtYWNyb3xkZWxheSg/Oi1mb3JjZSk/fGRvfGVsc2V8ZXhjZXB0fGV4cG9ydHxndWFyZHxpZnxpbXBvcnR8aW5jbHVkZSg/Oi1jaXwtbGlicmFyeS1kZWNsYXJhdGlvbnMpP3xsYW1iZGF8bGV0KD86cmVjKT8oPzotc3ludGF4fC12YWx1ZXN8XFwqKT98bGV0XFwqLXZhbHVlc3xvbmx5fHBhcmFtZXRlcml6ZXxwcmVmaXh8KD86cXVhc2ktPyk/cXVvdGV8cmVuYW1lfHNldCF8c3ludGF4LSg/OmNhc2V8cnVsZXMpfHVubGVzc3x1bnF1b3RlKD86LXNwbGljaW5nKT98d2hlbikoPz1bKClcXFtcXF1cXHNdfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdidWlsdGluJzoge1xuXHRcdFx0Ly8gYWxsIGZ1bmN0aW9ucyBvZiB0aGUgYmFzZSBsaWJyYXJ5IG9mIFI3UlMgcGx1cyBzb21lIG9mIGJ1aWx0LWlucyBvZiBSNVJzXG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W14nYCNdKVsoXFxbXSkoPzphYnN8YW5kfGFwcGVuZHxhcHBseXxhc3NvY3xhc3NbcXZdfGJpbmFyeS1wb3J0XFw/fGJvb2xlYW49P1xcP3xieXRldmVjdG9yKD86LWFwcGVuZHwtY29weXwtY29weSF8LWxlbmd0aHwtdTgtcmVmfC11OC1zZXQhfFxcPyk/fGNhYXJ8Y2FkcnxjYWxsLXdpdGgtKD86Y3VycmVudC1jb250aW51YXRpb258cG9ydHx2YWx1ZXMpfGNhbGxcXC9jY3xjYXJ8Y2RhcnxjZGRyfGNkcnxjZWlsaW5nfGNoYXIoPzotPmludGVnZXJ8LXJlYWR5XFw/fFxcP3w8XFw/fDw9XFw/fD1cXD98PlxcP3w+PVxcPyl8Y2xvc2UtKD86aW5wdXQtcG9ydHxvdXRwdXQtcG9ydHxwb3J0KXxjb21wbGV4XFw/fGNvbnN8Y3VycmVudC0oPzplcnJvcnxpbnB1dHxvdXRwdXQpLXBvcnR8ZGVub21pbmF0b3J8ZHluYW1pYy13aW5kfGVvZi1vYmplY3RcXD8/fGVxXFw/fGVxdWFsXFw/fGVxdlxcP3xlcnJvcnxlcnJvci1vYmplY3QoPzotaXJyaXRhbnRzfC1tZXNzYWdlfFxcPyl8ZXZhbHxldmVuXFw/fGV4YWN0KD86LWludGVnZXItc3FydHwtaW50ZWdlclxcP3xcXD8pP3xleHB0fGZlYXR1cmVzfGZpbGUtZXJyb3JcXD98Zmxvb3IoPzotcXVvdGllbnR8LXJlbWFpbmRlcnxcXC8pP3xmbHVzaC1vdXRwdXQtcG9ydHxmb3ItZWFjaHxnY2R8Z2V0LW91dHB1dC0oPzpieXRldmVjdG9yfHN0cmluZyl8aW5leGFjdFxcPz98aW5wdXQtcG9ydCg/Oi1vcGVuXFw/fFxcPyl8aW50ZWdlcig/Oi0+Y2hhcnxcXD8pfGxjbXxsZW5ndGh8bGlzdCg/Oi0+c3RyaW5nfC0+dmVjdG9yfC1jb3B5fC1yZWZ8LXNldCF8LXRhaWx8XFw/KT98bWFrZS0oPzpieXRldmVjdG9yfGxpc3R8cGFyYW1ldGVyfHN0cmluZ3x2ZWN0b3IpfG1hcHxtYXh8bWVtYmVyfG1lbXF8bWVtdnxtaW58bW9kdWxvfG5lZ2F0aXZlXFw/fG5ld2xpbmV8bm90fG51bGxcXD98bnVtYmVyKD86LT5zdHJpbmd8XFw/KXxudW1lcmF0b3J8b2RkXFw/fG9wZW4tKD86aW5wdXR8b3V0cHV0KS0oPzpieXRldmVjdG9yfHN0cmluZyl8b3J8b3V0cHV0LXBvcnQoPzotb3BlblxcP3xcXD8pfHBhaXJcXD98cGVlay1jaGFyfHBlZWstdTh8cG9ydFxcP3xwb3NpdGl2ZVxcP3xwcm9jZWR1cmVcXD98cXVvdGllbnR8cmFpc2V8cmFpc2UtY29udGludWFibGV8cmF0aW9uYWxcXD98cmF0aW9uYWxpemV8cmVhZC0oPzpieXRldmVjdG9yfGJ5dGV2ZWN0b3IhfGNoYXJ8ZXJyb3JcXD98bGluZXxzdHJpbmd8dTgpfHJlYWxcXD98cmVtYWluZGVyfHJldmVyc2V8cm91bmR8c2V0LWNbYWRdciF8c3F1YXJlfHN0cmluZyg/Oi0+bGlzdHwtPm51bWJlcnwtPnN5bWJvbHwtPnV0Zjh8LT52ZWN0b3J8LWFwcGVuZHwtY29weXwtY29weSF8LWZpbGwhfC1mb3ItZWFjaHwtbGVuZ3RofC1tYXB8LXJlZnwtc2V0IXxcXD98PFxcP3w8PVxcP3w9XFw/fD5cXD98Pj1cXD8pP3xzdWJzdHJpbmd8c3ltYm9sKD86LT5zdHJpbmd8XFw/fD1cXD8pfHN5bnRheC1lcnJvcnx0ZXh0dWFsLXBvcnRcXD98dHJ1bmNhdGUoPzotcXVvdGllbnR8LXJlbWFpbmRlcnxcXC8pP3x1OC1yZWFkeVxcP3x1dGY4LT5zdHJpbmd8dmFsdWVzfHZlY3Rvcig/Oi0+bGlzdHwtPnN0cmluZ3wtYXBwZW5kfC1jb3B5fC1jb3B5IXwtZmlsbCF8LWZvci1lYWNofC1sZW5ndGh8LW1hcHwtcmVmfC1zZXQhfFxcPyk/fHdpdGgtZXhjZXB0aW9uLWhhbmRsZXJ8d3JpdGUtKD86Ynl0ZXZlY3RvcnxjaGFyfHN0cmluZ3x1OCl8emVyb1xcPykoPz1bKClcXFtcXF1cXHNdfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdvcGVyYXRvcic6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxbXidgI10pWyhcXFtdKSg/OlstKyolL118Wzw+XT0/fD0+PykoPz1bKClcXFtcXF1cXHNdfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdudW1iZXInOiB7XG5cdFx0XHQvLyBUaGUgbnVtYmVyIHBhdHRlcm4gZnJvbSBbdGhlIFI3UlMgc3BlY10oaHR0cHM6Ly9zbWFsbC5yN3JzLm9yZy9hdHRhY2htZW50L3I3cnMucGRmKS5cblx0XHRcdC8vXG5cdFx0XHQvLyA8bnVtYmVyPiAgICAgIDo9IDxudW0gMj58PG51bSA4Pnw8bnVtIDEwPnw8bnVtIDE2PlxuXHRcdFx0Ly8gPG51bSBSPiAgICAgICA6PSA8cHJlZml4IFI+PGNvbXBsZXggUj5cblx0XHRcdC8vIDxjb21wbGV4IFI+ICAgOj0gPHJlYWwgUj4oPzpAPHJlYWwgUj58PGltYWdpbmFyeSBSPik/fDxpbWFnaW5hcnkgUj5cblx0XHRcdC8vIDxpbWFnaW5hcnkgUj4gOj0gWystXSg/Ojx1cmVhbCBSPnwoPzppbmZ8bmFuKVxcLjApP2lcblx0XHRcdC8vIDxyZWFsIFI+ICAgICAgOj0gWystXT88dXJlYWwgUj58WystXSg/OmluZnxuYW4pXFwuMFxuXHRcdFx0Ly8gPHVyZWFsIFI+ICAgICA6PSA8dWludCBSPig/OlxcLzx1aW50IFI+KT9cblx0XHRcdC8vICAgICAgICAgICAgICAgIHwgPGRlY2ltYWwgUj5cblx0XHRcdC8vXG5cdFx0XHQvLyA8ZGVjaW1hbCAxMD4gIDo9ICg/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzplWystXT9cXGQrKT9cblx0XHRcdC8vIDx1aW50IFI+ICAgICAgOj0gPGRpZ2l0IFI+K1xuXHRcdFx0Ly8gPHByZWZpeCBSPiAgICA6PSA8cmFkaXggUj4oPzojW2VpXSk/fCg/OiNbZWldKT88cmFkaXggUj5cblx0XHRcdC8vIDxyYWRpeCAyPiAgICAgOj0gI2Jcblx0XHRcdC8vIDxyYWRpeCA4PiAgICAgOj0gI29cblx0XHRcdC8vIDxyYWRpeCAxMD4gICAgOj0gKD86I2QpP1xuXHRcdFx0Ly8gPHJhZGl4IDE2PiAgICA6PSAjeFxuXHRcdFx0Ly8gPGRpZ2l0IDI+ICAgICA6PSBbMDFdXG5cdFx0XHQvLyA8ZGlnaXQgOD4gICAgIDo9IFswLTddXG5cdFx0XHQvLyA8ZGlnaXQgMTA+ICAgIDo9IFxcZFxuXHRcdFx0Ly8gPGRpZ2l0IDE2PiAgICA6PSBbMC05YS1mXVxuXHRcdFx0Ly9cblx0XHRcdC8vIFRoZSBwcm9ibGVtIHdpdGggdGhpcyBncmFtbWFyIGlzIHRoYXQgdGhlIHJlc3VsdGluZyByZWdleCBpcyB3YXkgdG8gY29tcGxleCwgc28gd2Ugc2ltcGxpZnkgYnkgZ3JvdXBpbmcgYWxsXG5cdFx0XHQvLyBub24tZGVjaW1hbCBiYXNlcyB0b2dldGhlci4gVGhpcyByZXN1bHRzIGluIGEgZGVjaW1hbCAoZGVjKSBhbmQgY29tYmluZWQgYmluYXJ5LCBvY3RhbCwgYW5kIGhleGFkZWNpbWFsIChib3gpXG5cdFx0XHQvLyBwYXR0ZXJuOlxuXHRcdFx0cGF0dGVybjogUmVnRXhwKFNvcnRlZEJORih7XG5cdFx0XHRcdCc8dXJlYWwgZGVjPic6IC9cXGQrKD86XFwvXFxkKyl8KD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKSg/Oltlc2ZkbF1bKy1dP1xcZCspPy8uc291cmNlLFxuXHRcdFx0XHQnPHJlYWwgZGVjPic6IC9bKy1dPzx1cmVhbCBkZWM+fFsrLV0oPzppbmZ8bmFuKVxcLjAvLnNvdXJjZSxcblx0XHRcdFx0JzxpbWFnaW5hcnkgZGVjPic6IC9bKy1dKD86PHVyZWFsIGRlYz58KD86aW5mfG5hbilcXC4wKT9pLy5zb3VyY2UsXG5cdFx0XHRcdCc8Y29tcGxleCBkZWM+JzogLzxyZWFsIGRlYz4oPzpAPHJlYWwgZGVjPnw8aW1hZ2luYXJ5IGRlYz4pP3w8aW1hZ2luYXJ5IGRlYz4vLnNvdXJjZSxcblx0XHRcdFx0JzxudW0gZGVjPic6IC8oPzojZCg/OiNbZWldKT98I1tlaV0oPzojZCk/KT88Y29tcGxleCBkZWM+Ly5zb3VyY2UsXG5cblx0XHRcdFx0Jzx1cmVhbCBib3g+JzogL1swLTlhLWZdKyg/OlxcL1swLTlhLWZdKyk/Ly5zb3VyY2UsXG5cdFx0XHRcdCc8cmVhbCBib3g+JzogL1srLV0/PHVyZWFsIGJveD58WystXSg/OmluZnxuYW4pXFwuMC8uc291cmNlLFxuXHRcdFx0XHQnPGltYWdpbmFyeSBib3g+JzogL1srLV0oPzo8dXJlYWwgYm94PnwoPzppbmZ8bmFuKVxcLjApP2kvLnNvdXJjZSxcblx0XHRcdFx0Jzxjb21wbGV4IGJveD4nOiAvPHJlYWwgYm94Pig/OkA8cmVhbCBib3g+fDxpbWFnaW5hcnkgYm94Pik/fDxpbWFnaW5hcnkgYm94Pi8uc291cmNlLFxuXHRcdFx0XHQnPG51bSBib3g+JzogLyNbYm94XSg/OiNbZWldKT98KD86I1tlaV0pPyNbYm94XTxjb21wbGV4IGJveD4vLnNvdXJjZSxcblxuXHRcdFx0XHQnPG51bWJlcj4nOiAvKF58WygpXFxbXFxdXFxzXSkoPzo8bnVtIGRlYz58PG51bSBib3g+KSg/PVsoKVxcW1xcXVxcc118JCkvLnNvdXJjZSxcblx0XHRcdH0pLCAnaScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2Jvb2xlYW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58WygpXFxbXFxdXFxzXSkjKD86W2Z0XXxmYWxzZXx0cnVlKSg/PVsoKVxcW1xcXVxcc118JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFteJ2AjXSlbKFxcW10pKD86W158KClcXFtcXF0nXFxzXSt8XFx8KD86W15cXFxcfF18XFxcXC4pKlxcfCkoPz1bKClcXFtcXF1cXHNdfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdpZGVudGlmaWVyJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFsoKVxcW1xcXVxcc10pXFx8KD86W15cXFxcfF18XFxcXC4pKlxcfCg/PVsoKVxcW1xcXVxcc118JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKVxcW1xcXSddL1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHaXZlbiBhIHRvcG9sb2dpY2FsbHkgc29ydGVkIEJORiBncmFtbWFyLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBSZWdFeHAgc291cmNlIG9mIGxhc3QgcnVsZSBvZiB0aGUgZ3JhbW1hci5cblx0ICpcblx0ICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBncmFtbWFyXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRmdW5jdGlvbiBTb3J0ZWRCTkYoZ3JhbW1hcikge1xuXHRcdGZvciAodmFyIGtleSBpbiBncmFtbWFyKSB7XG5cdFx0XHRncmFtbWFyW2tleV0gPSBncmFtbWFyW2tleV0ucmVwbGFjZSgvPFtcXHdcXHNdKz4vZywgZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0XHRyZXR1cm4gJyg/OicgKyBncmFtbWFyW2tleV0udHJpbSgpICsgJyknO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIHJldHVybiB0aGUgbGFzdCBpdGVtXG5cdFx0cmV0dXJuIGdyYW1tYXJba2V5XTtcblx0fVxuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgc2NoZW1lRXhwcmVzc2lvbiA9IC9cXCgoPzpbXigpO1wiI1xcXFxdfFxcXFxbXFxzXFxTXXw7LiooPyEuKXxcIig/OlteXCJcXFxcXXxcXFxcLikqXCJ8Iyg/Olxceyg/Oig/ISNcXH0pW1xcc1xcU10pKiNcXH18W157XSl8PGV4cHI+KSpcXCkvLnNvdXJjZTtcblx0Ly8gYWxsb3cgZm9yIHVwIHRvIHBvdygyLCByZWN1cnNpdmVuZXNzTG9nMikgbWFueSBsZXZlbHMgb2YgcmVjdXJzaXZlIGJyYWNlIGV4cHJlc3Npb25zXG5cdC8vIEZvciBzb21lIHJlYXNvbiwgdGhpcyBjYW4ndCBiZSA0XG5cdHZhciByZWN1cnNpdmVuZXNzTG9nMiA9IDU7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgcmVjdXJzaXZlbmVzc0xvZzI7IGkrKykge1xuXHRcdHNjaGVtZUV4cHJlc3Npb24gPSBzY2hlbWVFeHByZXNzaW9uLnJlcGxhY2UoLzxleHByPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBzY2hlbWVFeHByZXNzaW9uOyB9KTtcblx0fVxuXHRzY2hlbWVFeHByZXNzaW9uID0gc2NoZW1lRXhwcmVzc2lvbi5yZXBsYWNlKC88ZXhwcj4vZywgL1teXFxzXFxTXS8uc291cmNlKTtcblxuXG5cdHZhciBsaWx5cG9uZCA9IFByaXNtLmxhbmd1YWdlcy5saWx5cG9uZCA9IHtcblx0XHQnY29tbWVudCc6IC8lKD86KD8hXFx7KS4qfFxce1tcXHNcXFNdKj8lXFx9KS8sXG5cdFx0J2VtYmVkZGVkLXNjaGVtZSc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKF58Wz1cXHNdKSMoPzpcIig/OlteXCJcXFxcXXxcXFxcLikqXCJ8W15cXHMoKVwiXSooPzpbXlxccygpXXw8ZXhwcj4pKS8uc291cmNlLnJlcGxhY2UoLzxleHByPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBzY2hlbWVFeHByZXNzaW9uOyB9KSwgJ20nKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3NjaGVtZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXigjKVtcXHNcXFNdKyQvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1zY2hlbWUnLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J2VtYmVkZGVkLWxpbHlwb25kJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvI1xce1tcXHNcXFNdKj8jXFx9Lyxcblx0XHRcdFx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXiNcXHt8I1xcfSQvLFxuXHRcdFx0XHRcdFx0XHRcdCdsaWx5cG9uZCc6IHtcblx0XHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1saWx5cG9uZCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0cmVzdDogUHJpc20ubGFuZ3VhZ2VzLnNjaGVtZVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLyMvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiKD86W15cIlxcXFxdfFxcXFwuKSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdjbGFzcy1uYW1lJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXFxcbmV3XFxzKylbXFx3LV0rLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0cGF0dGVybjogL1xcXFxbYS16XVstXFx3XSovaSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcXFwvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnb3BlcmF0b3InOiAvWz18XXw8PHw+Pi8sXG5cdFx0J3B1bmN0dWF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFthLXpcXGRdKSg/OicrfCwrfFtfXl0/LVtfXl0/KD86Wy0rXiE+Ll9dfCg/PVxcZCkpfFtfXl1cXC4/fFsuIV0pfFt7fSgpW1xcXTw+Xn5dfFxcXFxbKClbXFxdPD5cXFxcIV18LS18X18vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J251bWJlcic6IC9cXGJcXGQrKD86XFwvXFxkKyk/XFxiL1xuXHR9O1xuXG5cdGxpbHlwb25kWydlbWJlZGRlZC1zY2hlbWUnXS5pbnNpZGVbJ3NjaGVtZSddLmluc2lkZVsnZW1iZWRkZWQtbGlseXBvbmQnXS5pbnNpZGVbJ2xpbHlwb25kJ10uaW5zaWRlID0gbGlseXBvbmQ7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmx5ID0gbGlseXBvbmQ7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmxpcXVpZCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyheXFx7JVxccypjb21tZW50XFxzKiVcXH0pW1xcc1xcU10rKD89XFx7JVxccyplbmRjb21tZW50XFxzKiVcXH0kKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnZGVsaW1pdGVyJzoge1xuXHRcdHBhdHRlcm46IC9eXFx7KD86XFx7XFx7fFslXFx7XSktP3wtPyg/OlxcfVxcfXxbJVxcfV0pXFx9JC8sXG5cdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCJbXlwiXSpcInwnW14nXSonLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YXN8YXNzaWdufGJyZWFrfCg/OmVuZCk/KD86Y2FwdHVyZXxjYXNlfGNvbW1lbnR8Zm9yfGZvcm18aWZ8cGFnaW5hdGV8cmF3fHN0eWxlfHRhYmxlcm93fHVubGVzcyl8Y29udGludWV8Y3ljbGV8ZGVjcmVtZW50fGVjaG98ZWxzZXxlbHNpZnxpbnxpbmNsdWRlfGluY3JlbWVudHxsaW1pdHxsaXF1aWR8b2Zmc2V0fHJhbmdlfHJlbmRlcnxyZXZlcnNlZHxzZWN0aW9ufHdoZW58d2l0aClcXGIvLFxuXHQnb2JqZWN0JzogL1xcYig/OmFkZHJlc3N8YWxsX2NvdW50cnlfb3B0aW9uX3RhZ3N8YXJ0aWNsZXxibG9ja3xibG9nfGNhcnR8Y2hlY2tvdXR8Y29sbGVjdGlvbnxjb2xvcnxjb3VudHJ5fGNvdW50cnlfb3B0aW9uX3RhZ3N8Y3VycmVuY3l8Y3VycmVudF9wYWdlfGN1cnJlbnRfdGFnc3xjdXN0b21lcnxjdXN0b21lcl9hZGRyZXNzfGRhdGV8ZGlzY291bnRfYWxsb2NhdGlvbnxkaXNjb3VudF9hcHBsaWNhdGlvbnxleHRlcm5hbF92aWRlb3xmaWx0ZXJ8ZmlsdGVyX3ZhbHVlfGZvbnR8Zm9ybG9vcHxmdWxmaWxsbWVudHxnZW5lcmljX2ZpbGV8Z2lmdF9jYXJkfGdyb3VwfGhhbmRsZXxpbWFnZXxsaW5lX2l0ZW18bGlua3xsaW5rbGlzdHxsb2NhbGl6YXRpb258bG9jYXRpb258bWVhc3VyZW1lbnR8bWVkaWF8bWV0YWZpZWxkfG1vZGVsfG1vZGVsX3NvdXJjZXxvcmRlcnxwYWdlfHBhZ2VfZGVzY3JpcHRpb258cGFnZV9pbWFnZXxwYWdlX3RpdGxlfHBhcnR8cG9saWN5fHByb2R1Y3R8cHJvZHVjdF9vcHRpb258cmVjb21tZW5kYXRpb25zfHJlcXVlc3R8cm9ib3RzfHJvdXRlc3xydWxlfHNjcmlwdHxzZWFyY2h8c2VsbGluZ19wbGFufHNlbGxpbmdfcGxhbl9hbGxvY2F0aW9ufHNlbGxpbmdfcGxhbl9ncm91cHxzaGlwcGluZ19tZXRob2R8c2hvcHxzaG9wX2xvY2FsZXxzaXRlbWFwfHN0b3JlX2F2YWlsYWJpbGl0eXx0YXhfbGluZXx0ZW1wbGF0ZXx0aGVtZXx0cmFuc2FjdGlvbnx1bml0X3ByaWNlX21lYXN1cmVtZW50fHVzZXJfYWdlbnR8dmFyaWFudHx2aWRlb3x2aWRlb19zb3VyY2UpXFxiLyxcblx0J2Z1bmN0aW9uJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXFx8XFxzKilcXHcrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2ZpbHRlcidcblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIGFycmF5IGZ1bmN0aW9uc1xuXHRcdFx0cGF0dGVybjogLyhcXC5cXHMqKSg/OmZpcnN0fGxhc3R8c2l6ZSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8bmlsfHRydWUpXFxiLyxcblx0J3JhbmdlJzoge1xuXHRcdHBhdHRlcm46IC9cXC5cXC4vLFxuXHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdH0sXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9TaG9waWZ5L2xpcXVpZC9ibG9iLzY5OGY1ZTBkOTY3NDIzZTAxM2Y2MTY5ZDkxMTFiZDk2OWJkNzgzMzcvbGliL2xpcXVpZC9sZXhlci5yYiNMMjFcblx0J251bWJlcic6IC9cXGJcXGQrKD86XFwuXFxkKyk/XFxiLyxcblx0J29wZXJhdG9yJzogL1shPV09fDw+fFs8Pl09P3xbfD86PS1dfFxcYig/OmFuZHxjb250YWlucyg/PVxccyl8b3IpXFxiLyxcblx0J3B1bmN0dWF0aW9uJzogL1suLFxcW1xcXSgpXS8sXG5cdCdlbXB0eSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiZW1wdHlcXGIvLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcbn07XG5cblByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHR2YXIgbGlxdWlkUGF0dGVybiA9IC9cXHslXFxzKmNvbW1lbnRcXHMqJVxcfVtcXHNcXFNdKj9cXHslXFxzKmVuZGNvbW1lbnRcXHMqJVxcfXxcXHsoPzolW1xcc1xcU10qPyV8XFx7XFx7W1xcc1xcU10qP1xcfVxcfXxcXHtbXFxzXFxTXSo/XFx9KVxcfS9nO1xuXHR2YXIgaW5zaWRlUmF3ID0gZmFsc2U7XG5cblx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLmJ1aWxkUGxhY2Vob2xkZXJzKGVudiwgJ2xpcXVpZCcsIGxpcXVpZFBhdHRlcm4sIGZ1bmN0aW9uIChtYXRjaCkge1xuXHRcdHZhciB0YWdNYXRjaCA9IC9eXFx7JS0/XFxzKihcXHcrKS8uZXhlYyhtYXRjaCk7XG5cdFx0aWYgKHRhZ01hdGNoKSB7XG5cdFx0XHR2YXIgdGFnID0gdGFnTWF0Y2hbMV07XG5cdFx0XHRpZiAodGFnID09PSAncmF3JyAmJiAhaW5zaWRlUmF3KSB7XG5cdFx0XHRcdGluc2lkZVJhdyA9IHRydWU7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSBlbHNlIGlmICh0YWcgPT09ICdlbmRyYXcnKSB7XG5cdFx0XHRcdGluc2lkZVJhdyA9IGZhbHNlO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gIWluc2lkZVJhdztcblx0fSk7XG59KTtcblxuUHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLnRva2VuaXplUGxhY2Vob2xkZXJzKGVudiwgJ2xpcXVpZCcpO1xufSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0LyoqXG5cdCAqIEZ1bmN0aW9ucyB0byBjb25zdHJ1Y3QgcmVndWxhciBleHByZXNzaW9uc1xuXHQgKiBlLmcuIChpbnRlcmFjdGl2ZSAuLi4gb3IgKGludGVyYWN0aXZlKVxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuXHQgKiBAcmV0dXJucyB7UmVnRXhwfVxuXHQgKi9cblx0ZnVuY3Rpb24gc2ltcGxlX2Zvcm0obmFtZSkge1xuXHRcdHJldHVybiBSZWdFeHAoLyhcXCgpLy5zb3VyY2UgKyAnKD86JyArIG5hbWUgKyAnKScgKyAvKD89W1xcc1xcKV0pLy5zb3VyY2UpO1xuXHR9XG5cdC8qKlxuXHQgKiBib29sZWFucyBhbmQgbnVtYmVyc1xuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVyblxuXHQgKiBAcmV0dXJucyB7UmVnRXhwfVxuXHQgKi9cblx0ZnVuY3Rpb24gcHJpbWl0aXZlKHBhdHRlcm4pIHtcblx0XHRyZXR1cm4gUmVnRXhwKC8oW1xccyhbXSkvLnNvdXJjZSArICcoPzonICsgcGF0dGVybiArICcpJyArIC8oPz1bXFxzKV0pLy5zb3VyY2UpO1xuXHR9XG5cblx0Ly8gUGF0dGVybnMgaW4gcmVndWxhciBleHByZXNzaW9uc1xuXG5cdC8vIFN5bWJvbCBuYW1lLiBTZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9lbWFjcy9tYW51YWwvaHRtbF9ub2RlL2VsaXNwL1N5bWJvbC1UeXBlLmh0bWxcblx0Ly8gJiBhbmQgOiBhcmUgZXhjbHVkZWQgYXMgdGhleSBhcmUgdXN1YWxseSB1c2VkIGZvciBzcGVjaWFsIHB1cnBvc2VzXG5cdHZhciBzeW1ib2wgPSAvKD8hXFxkKVstKyovfiFAJCVePTw+e31cXHddKy8uc291cmNlO1xuXHQvLyBzeW1ib2wgc3RhcnRpbmcgd2l0aCAmIHVzZWQgaW4gZnVuY3Rpb24gYXJndW1lbnRzXG5cdHZhciBtYXJrZXIgPSAnJicgKyBzeW1ib2w7XG5cdC8vIE9wZW4gcGFyZW50aGVzaXMgZm9yIGxvb2stYmVoaW5kXG5cdHZhciBwYXIgPSAnKFxcXFwoKSc7XG5cdHZhciBlbmRwYXIgPSAnKD89XFxcXCkpJztcblx0Ly8gRW5kIHRoZSBwYXR0ZXJuIHdpdGggbG9vay1haGVhZCBzcGFjZVxuXHR2YXIgc3BhY2UgPSAnKD89XFxcXHMpJztcblx0dmFyIG5lc3RlZFBhciA9IC8oPzpbXigpXXxcXCgoPzpbXigpXXxcXCgoPzpbXigpXXxcXCgoPzpbXigpXXxcXCgoPzpbXigpXXxcXChbXigpXSpcXCkpKlxcKSkqXFwpKSpcXCkpKlxcKSkqLy5zb3VyY2U7XG5cblx0dmFyIGxhbmd1YWdlID0ge1xuXHRcdC8vIFRocmVlIG9yIGZvdXIgc2VtaWNvbG9ucyBhcmUgY29uc2lkZXJlZCBhIGhlYWRpbmcuXG5cdFx0Ly8gU2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZW1hY3MvbWFudWFsL2h0bWxfbm9kZS9lbGlzcC9Db21tZW50LVRpcHMuaHRtbFxuXHRcdGhlYWRpbmc6IHtcblx0XHRcdHBhdHRlcm46IC87OzsuKi8sXG5cdFx0XHRhbGlhczogWydjb21tZW50JywgJ3RpdGxlJ11cblx0XHR9LFxuXHRcdGNvbW1lbnQ6IC87LiovLFxuXHRcdHN0cmluZzoge1xuXHRcdFx0cGF0dGVybjogL1wiKD86W15cIlxcXFxdfFxcXFwuKSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0YXJndW1lbnQ6IC9bLUEtWl0rKD89Wy4sXFxzXSkvLFxuXHRcdFx0XHRzeW1ib2w6IFJlZ0V4cCgnYCcgKyBzeW1ib2wgKyBcIidcIilcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdxdW90ZWQtc3ltYm9sJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKFwiIz8nXCIgKyBzeW1ib2wpLFxuXHRcdFx0YWxpYXM6IFsndmFyaWFibGUnLCAnc3ltYm9sJ11cblx0XHR9LFxuXHRcdCdsaXNwLXByb3BlcnR5Jzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCc6JyArIHN5bWJvbCksXG5cdFx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHRcdH0sXG5cdFx0c3BsaWNlOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJyxAPycgKyBzeW1ib2wpLFxuXHRcdFx0YWxpYXM6IFsnc3ltYm9sJywgJ3ZhcmlhYmxlJ11cblx0XHR9LFxuXHRcdGtleXdvcmQ6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHRcdHBhciArXG5cdFx0XHRcdFx0XHQnKD86YW5kfCg/OmNsLSk/bGV0ZnxjbC1sb29wfGNvbmR8Y29uc3xlcnJvcnxpZnwoPzpsZXhpY2FsLSk/bGV0XFxcXCo/fG1lc3NhZ2V8bm90fG51bGx8b3J8cHJvdmlkZXxyZXF1aXJlfHNldHF8dW5sZXNzfHVzZS1wYWNrYWdlfHdoZW58d2hpbGUpJyArXG5cdFx0XHRcdFx0XHRzcGFjZVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdFx0cGFyICsgJyg/OmFwcGVuZHxieXxjb2xsZWN0fGNvbmNhdHxkb3xmaW5hbGx5fGZvcnxpbnxyZXR1cm4pJyArIHNwYWNlXG5cdFx0XHRcdCksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XSxcblx0XHRkZWNsYXJlOiB7XG5cdFx0XHRwYXR0ZXJuOiBzaW1wbGVfZm9ybSgvZGVjbGFyZS8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblx0XHRpbnRlcmFjdGl2ZToge1xuXHRcdFx0cGF0dGVybjogc2ltcGxlX2Zvcm0oL2ludGVyYWN0aXZlLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXHRcdGJvb2xlYW46IHtcblx0XHRcdHBhdHRlcm46IHByaW1pdGl2ZSgvbmlsfHQvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHRudW1iZXI6IHtcblx0XHRcdHBhdHRlcm46IHByaW1pdGl2ZSgvWy0rXT9cXGQrKD86XFwuXFxkKik/Ly5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0ZGVmdmFyOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAocGFyICsgJ2RlZig/OmNvbnN0fGN1c3RvbXxncm91cHx2YXIpXFxcXHMrJyArIHN5bWJvbCksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdGtleXdvcmQ6IC9eZGVmW2Etel0rLyxcblx0XHRcdFx0dmFyaWFibGU6IFJlZ0V4cChzeW1ib2wpXG5cdFx0XHR9XG5cdFx0fSxcblx0XHRkZWZ1bjoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKHBhciArIC8oPzpjbC0pPyg/OmRlZm1hY3JvfGRlZnVuXFwqPylcXHMrLy5zb3VyY2UgKyBzeW1ib2wgKyAvXFxzK1xcKC8uc291cmNlICsgbmVzdGVkUGFyICsgL1xcKS8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0a2V5d29yZDogL14oPzpjbC0pP2RlZlxcUysvLFxuXHRcdFx0XHQvLyBTZWUgYmVsb3csIHRoaXMgcHJvcGVydHkgbmVlZHMgdG8gYmUgZGVmaW5lZCBsYXRlciBzbyB0aGF0IGl0IGNhblxuXHRcdFx0XHQvLyByZWZlcmVuY2UgdGhlIGxhbmd1YWdlIG9iamVjdC5cblx0XHRcdFx0YXJndW1lbnRzOiBudWxsLFxuXHRcdFx0XHRmdW5jdGlvbjoge1xuXHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnKF5cXFxccyknICsgc3ltYm9sKSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHB1bmN0dWF0aW9uOiAvWygpXS9cblx0XHRcdH1cblx0XHR9LFxuXHRcdGxhbWJkYToge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKHBhciArICdsYW1iZGFcXFxccytcXFxcKFxcXFxzKig/OiY/JyArIHN5bWJvbCArICcoPzpcXFxccysmPycgKyBzeW1ib2wgKyAnKSpcXFxccyopP1xcXFwpJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdGtleXdvcmQ6IC9ebGFtYmRhLyxcblx0XHRcdFx0Ly8gU2VlIGJlbG93LCB0aGlzIHByb3BlcnR5IG5lZWRzIHRvIGJlIGRlZmluZWQgbGF0ZXIgc28gdGhhdCBpdCBjYW5cblx0XHRcdFx0Ly8gcmVmZXJlbmNlIHRoZSBsYW5ndWFnZSBvYmplY3QuXG5cdFx0XHRcdGFyZ3VtZW50czogbnVsbCxcblx0XHRcdFx0cHVuY3R1YXRpb246IC9bKCldL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Y2FyOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAocGFyICsgc3ltYm9sKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHB1bmN0dWF0aW9uOiBbXG5cdFx0XHQvLyBvcGVuIHBhcmVuLCBicmFja2V0cywgYW5kIGNsb3NlIHBhcmVuXG5cdFx0XHQvKD86WydgLF0/XFwofFspXFxbXFxdXSkvLFxuXHRcdFx0Ly8gY29uc1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxccylcXC4oPz1cXHMpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRdXG5cdH07XG5cblx0dmFyIGFyZyA9IHtcblx0XHQnbGlzcC1tYXJrZXInOiBSZWdFeHAobWFya2VyKSxcblx0XHQndmFyZm9ybSc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvXFwoLy5zb3VyY2UgKyBzeW1ib2wgKyAvXFxzKyg/PVxcUykvLnNvdXJjZSArIG5lc3RlZFBhciArIC9cXCkvLnNvdXJjZSksXG5cdFx0XHRpbnNpZGU6IGxhbmd1YWdlXG5cdFx0fSxcblx0XHQnYXJndW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhefFtcXHMoXSkvLnNvdXJjZSArIHN5bWJvbCksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHR9LFxuXHRcdHJlc3Q6IGxhbmd1YWdlXG5cdH07XG5cblx0dmFyIGZvcm1zID0gJ1xcXFxTKyg/OlxcXFxzK1xcXFxTKykqJztcblxuXHR2YXIgYXJnbGlzdCA9IHtcblx0XHRwYXR0ZXJuOiBSZWdFeHAocGFyICsgbmVzdGVkUGFyICsgZW5kcGFyKSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3Jlc3QtdmFycyc6IHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKCcmKD86Ym9keXxyZXN0KVxcXFxzKycgKyBmb3JtcyksXG5cdFx0XHRcdGluc2lkZTogYXJnXG5cdFx0XHR9LFxuXHRcdFx0J290aGVyLW1hcmtlci12YXJzJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJyYoPzphdXh8b3B0aW9uYWwpXFxcXHMrJyArIGZvcm1zKSxcblx0XHRcdFx0aW5zaWRlOiBhcmdcblx0XHRcdH0sXG5cdFx0XHRrZXlzOiB7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnJmtleVxcXFxzKycgKyBmb3JtcyArICcoPzpcXFxccysmYWxsb3ctb3RoZXIta2V5cyk/JyksXG5cdFx0XHRcdGluc2lkZTogYXJnXG5cdFx0XHR9LFxuXHRcdFx0YXJndW1lbnQ6IHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKHN5bWJvbCksXG5cdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0XHR9LFxuXHRcdFx0cHVuY3R1YXRpb246IC9bKCldL1xuXHRcdH1cblx0fTtcblxuXHRsYW5ndWFnZVsnbGFtYmRhJ10uaW5zaWRlLmFyZ3VtZW50cyA9IGFyZ2xpc3Q7XG5cdGxhbmd1YWdlWydkZWZ1biddLmluc2lkZS5hcmd1bWVudHMgPSBQcmlzbS51dGlsLmNsb25lKGFyZ2xpc3QpO1xuXHRsYW5ndWFnZVsnZGVmdW4nXS5pbnNpZGUuYXJndW1lbnRzLmluc2lkZS5zdWJsaXN0ID0gYXJnbGlzdDtcblxuXHRQcmlzbS5sYW5ndWFnZXMubGlzcCA9IGxhbmd1YWdlO1xuXHRQcmlzbS5sYW5ndWFnZXMuZWxpc3AgPSBsYW5ndWFnZTtcblx0UHJpc20ubGFuZ3VhZ2VzLmVtYWNzID0gbGFuZ3VhZ2U7XG5cdFByaXNtLmxhbmd1YWdlc1snZW1hY3MtbGlzcCddID0gbGFuZ3VhZ2U7XG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5saXZlc2NyaXB0ID0ge1xuXHQnY29tbWVudCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSMuKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnaW50ZXJwb2xhdGVkLXN0cmluZyc6IHtcblx0XHQvKiBMb29rLWJlaGluZCBhbmQgbG9vay1haGVhZCBwcmV2ZW50cyB3cm9uZyBiZWhhdmlvciBvZiB0aGUgZ3JlZWR5IHBhdHRlcm5cblx0XHQqIGZvcmNpbmcgaXQgdG8gbWF0Y2ggXCJcIlwiLXF1b3RlZCBzdHJpbmcgd2hlbiBpdCB3b3VsZCBvdGhlcndpc2UgbWF0Y2ggXCItcXVvdGVkIGZpcnN0LiAqL1xuXHRcdHBhdHRlcm46IC8oXnxbXlwiXSkoXCJcIlwifFwiKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDIpW15cXFxcXSkqXFwyKD8hXCIpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd2YXJpYWJsZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pI1thLXpfXSg/Oi0/W2Etel18W1xcZF9dKSovbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkjXFx7W159XStcXH0vbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXiNcXHt8XFx9JC8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBTZWUgcmVzdCBiZWxvd1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0fVxuXHR9LFxuXHQnc3RyaW5nJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oJycnfCcpKD86XFxcXFtcXHNcXFNdfCg/IVxcMSlbXlxcXFxdKSpcXDEvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvPFxcW1tcXHNcXFNdKj9cXF0+Lyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0L1xcXFxbXlxccyw7XFxdKX1dKy9cblx0XSxcblx0J3JlZ2V4JzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXC9cXC8oPzpcXFtbXlxcclxcblxcXV0qXFxdfFxcXFwufCg/IVxcL1xcLylbXlxcXFxcXFtdKStcXC9cXC9bZ2lteXVdezAsNX0vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjb21tZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSMuKi8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFwvKD86XFxbW15cXHJcXG5cXF1dKlxcXXxcXFxcLnxbXi9cXFxcXFxyXFxuXFxbXSkrXFwvW2dpbXl1XXswLDV9Lyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J2tleXdvcmQnOiB7XG5cdFx0cGF0dGVybjogLyhefCg/IS0pLilcXGIoPzpicmVha3xjYXNlfGNhdGNofGNsYXNzfGNvbnN0fGNvbnRpbnVlfGRlZmF1bHR8ZG98ZWxzZXxleHRlbmRzfGZhbGx0aHJvdWdofGZpbmFsbHl8Zm9yKD86IGV2ZXIpP3xmdW5jdGlvbnxpZnxpbXBsZW1lbnRzfGl0fGxldHxsb29wfG5ld3xudWxsfG90aGVyd2lzZXxvd258cmV0dXJufHN1cGVyfHN3aXRjaHx0aGF0fHRoZW58dGhpc3x0aHJvd3x0cnl8dW5sZXNzfHVudGlsfHZhcnx2b2lkfHdoZW58d2hpbGV8eWllbGQpKD8hLSlcXGIvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkLW9wZXJhdG9yJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXi1dKVxcYig/Oig/OmRlbGV0ZXxyZXF1aXJlfHR5cGVvZikhfCg/OmFuZHxieXxkZWxldGV8ZXhwb3J0fGZyb218aW1wb3J0KD86IGFsbCk/fGlufGluc3RhbmNlb2Z8aXMoPzogbm90fG50KT98bm90fG9mfG9yfHRpbHx0b3x0eXBlb2Z8d2l0aHx4b3IpKD8hLSlcXGIpL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHR9LFxuXHQnYm9vbGVhbic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W14tXSlcXGIoPzpmYWxzZXxub3xvZmZ8b258dHJ1ZXx5ZXMpKD8hLSlcXGIvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdhcmd1bWVudCc6IHtcblx0XHQvLyBEb24ndCBtYXRjaCAuJi4gbm9yICYmXG5cdFx0cGF0dGVybjogLyhefCg/IVxcLiZcXC4pW14mXSkmKD8hJilcXGQqL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9LFxuXHQnbnVtYmVyJzogL1xcYig/OlxcZCt+W1xcZGEtel0rfFxcZFtcXGRfXSooPzpcXC5cXGRbXFxkX10qKT8oPzpbYS16XVxcdyopPykvaSxcblx0J2lkZW50aWZpZXInOiAvW2Etel9dKD86LT9bYS16XXxbXFxkX10pKi9pLFxuXHQnb3BlcmF0b3InOiBbXG5cdFx0Ly8gU3BhY2VkIC5cblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKCApXFwuKD89ICkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0Ly8gRnVsbCBsaXN0LCBpbiBvcmRlcjpcblx0XHQvLyAuPSAufiAuLiAuLi5cblx0XHQvLyAuJi4gLl4uIC48PC4gLj4+LiAuPj4+LlxuXHRcdC8vIDo9IDo6IDo6PVxuXHRcdC8vICYmXG5cdFx0Ly8gfHwgfD5cblx0XHQvLyA8IDw8IDw8PCA8PDw8XG5cdFx0Ly8gPC0gPC0tIDwtISA8LS0hXG5cdFx0Ly8gPH4gPH5+IDx+ISA8fn4hXG5cdFx0Ly8gPHwgPD0gPD9cblx0XHQvLyA+ID4+ID49ID4/XG5cdFx0Ly8gLSAtLSAtPiAtLT5cblx0XHQvLyArICsrXG5cdFx0Ly8gQCBAQFxuXHRcdC8vICUgJSVcblx0XHQvLyAqICoqXG5cdFx0Ly8gISAhPSAhfj1cblx0XHQvLyAhfj4gIX5+PlxuXHRcdC8vICEtPiAhLS0+XG5cdFx0Ly8gfiB+PiB+fj4gfj1cblx0XHQvLyA9ID09XG5cdFx0Ly8gXiBeXlxuXHRcdC8vIC8gP1xuXHRcdC9cXC4oPzpbPX5dfFxcLlxcLj8pfFxcLig/OlsmfF5dfDw8fD4+Pj8pXFwufDooPzo9fDo9Pyl8JiZ8XFx8W3w+XXw8KD86PDw/PD98LS0/IT98fn4/IT98W3w9P10pP3w+Wz49P10/fC0oPzotPj98Pik/fFxcK1xcKz98QEA/fCUlP3xcXCpcXCo/fCEoPzp+Pz18LS0/Pnx+P34+KT98fig/On4/Pnw9KT98PT0/fFxcXlxcXj98W1xcLz9dL1xuXHRdLFxuXHQncHVuY3R1YXRpb24nOiAvWygpe31cXFtcXF18Liw6O2BdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmxpdmVzY3JpcHRbJ2ludGVycG9sYXRlZC1zdHJpbmcnXS5pbnNpZGVbJ2ludGVycG9sYXRpb24nXS5pbnNpZGUucmVzdCA9IFByaXNtLmxhbmd1YWdlcy5saXZlc2NyaXB0O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdFByaXNtLmxhbmd1YWdlcy5sbHZtID0ge1xuXHRcdCdjb21tZW50JzogLzsuKi8sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIlteXCJdKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHR9LFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0XHQndmFyaWFibGUnOiAvWyVAISNdKD86KD8hXFxkKSg/OlstJC5cXHddfFxcXFxbYS1mXFxkXXsyfSkrfFxcZCspL2ksXG5cdFx0J2xhYmVsJzogLyg/IVxcZCkoPzpbLSQuXFx3XXxcXFxcW2EtZlxcZF17Mn0pKzovaSxcblx0XHQndHlwZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzpkb3VibGV8ZmxvYXR8ZnAxMjh8aGFsZnxpWzEtOV1cXGQqfGxhYmVsfG1ldGFkYXRhfHBwY19mcDEyOHx0b2tlbnx2b2lkfHg4Nl9mcDgwfHg4Nl9tbXgpXFxiLyxcblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZScsXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IC9cXGJbYS16X11bYS16XzAtOV0qXFxiLyxcblx0XHQnbnVtYmVyJzogL1srLV0/XFxiXFxkKyg/OlxcLlxcZCspPyg/OltlRV1bKy1dP1xcZCspP1xcYnxcXGIweFtcXGRBLUZhLWZdK1xcYnxcXGIweEtbXFxkQS1GYS1mXXsyMH1cXGJ8XFxiMHhbTUxdW1xcZEEtRmEtZl17MzJ9XFxifFxcYjB4SFtcXGRBLUZhLWZdezR9XFxiLyxcblx0XHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSwuISo9PD5dLyxcblx0fTtcbn0oUHJpc20pKTtcblxuLy8gVGhpcyBpcyBhIGxhbmd1YWdlIGRlZmluaXRpb24gZm9yIGdlbmVyaWMgbG9nIGZpbGVzLlxuLy8gU2luY2UgdGhlcmUgaXMgbm8gb25lIGxvZyBmb3JtYXQsIHRoaXMgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBoYXMgdG8gc3VwcG9ydCBhbGwgZm9ybWF0cyB0byBzb21lIGRlZ3JlZS5cbi8vXG4vLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vTVRETDkvdmltLWxvZy1oaWdobGlnaHRpbmdcblxuUHJpc20ubGFuZ3VhZ2VzLmxvZyA9IHtcblx0J3N0cmluZyc6IHtcblx0XHQvLyBTaW5nbGUtcXVvdGVkIHN0cmluZ3MgbXVzdCBub3QgYmUgY29uZnVzZWQgd2l0aCBwbGFpbiB0ZXh0LiBFLmcuIENhbid0IGlzbid0IFN1c2FuJ3MgQ2hyaXMnIHRveVxuXHRcdHBhdHRlcm46IC9cIig/OlteXCJcXFxcXFxyXFxuXXxcXFxcLikqXCJ8Jyg/IVtzdF0gfCBcXHcpKD86W14nXFxcXFxcclxcbl18XFxcXC4pKicvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0fSxcblxuXHQnZXhjZXB0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcdy5dKVthLXpdW1xcdy5dKig/OkVycm9yfEV4Y2VwdGlvbik6LiooPzooPzpcXHJcXG4/fFxcbilbIFxcdF0qKD86YXRbIFxcdF0uK3xcXC57M30uKnxDYXVzZWQgYnk6LiopKSsoPzooPzpcXHJcXG4/fFxcbilbIFxcdF0qXFwuXFwuXFwuIC4qKT8vLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiBbJ2phdmFzdGFja3RyYWNlJywgJ2xhbmd1YWdlLWphdmFzdGFja3RyYWNlJ10sXG5cdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXNbJ2phdmFzdGFja3RyYWNlJ10gfHwge1xuXHRcdFx0J2tleXdvcmQnOiAvXFxiYXRcXGIvLFxuXHRcdFx0J2Z1bmN0aW9uJzogL1thLXpfXVtcXHckXSooPz1cXCgpLyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9bLjooKV0vXG5cdFx0fVxuXHR9LFxuXG5cdCdsZXZlbCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86QUxFUlR8Q1JJVHxDUklUSUNBTHxFTUVSR3xFTUVSR0VOQ1l8RVJSfEVSUk9SfEZBSUxVUkV8RkFUQUx8U0VWRVJFKVxcYi8sXG5cdFx0XHRhbGlhczogWydlcnJvcicsICdpbXBvcnRhbnQnXVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYig/OldBUk58V0FSTklOR3xXUk4pXFxiLyxcblx0XHRcdGFsaWFzOiBbJ3dhcm5pbmcnLCAnaW1wb3J0YW50J11cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzpESVNQTEFZfElORnxJTkZPfE5PVElDRXxTVEFUVVMpXFxiLyxcblx0XHRcdGFsaWFzOiBbJ2luZm8nLCAna2V5d29yZCddXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86REJHfERFQlVHfEZJTkUpXFxiLyxcblx0XHRcdGFsaWFzOiBbJ2RlYnVnJywgJ2tleXdvcmQnXVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYig/OkZJTkVSfEZJTkVTVHxUUkFDRXxUUkN8VkVSQk9TRXxWUkIpXFxiLyxcblx0XHRcdGFsaWFzOiBbJ3RyYWNlJywgJ2NvbW1lbnQnXVxuXHRcdH1cblx0XSxcblxuXHQncHJvcGVydHknOiB7XG5cdFx0cGF0dGVybjogLygoPzpefFtcXF18XSlbIFxcdF0qKVthLXpfXSg/OltcXHctXXxcXGJcXC9cXGIpKig/OlsuIF1cXCg/XFx3KD86W1xcdy1dfFxcYlxcL1xcYikqXFwpPykqOig/PVxccykvaW0sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXG5cdCdzZXBhcmF0b3InOiB7XG5cdFx0cGF0dGVybjogLyhefFteLStdKS17Myx9fD17Myx9fFxcKnszLH18LSAtIC9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdjb21tZW50J1xuXHR9LFxuXG5cdCd1cmwnOiAvXFxiKD86ZmlsZXxmdHB8aHR0cHM/KTpcXC9cXC9bXlxcc3wsOydcIl0qW15cXHN8LDsnXCI+Ll0vLFxuXHQnZW1haWwnOiB7XG5cdFx0cGF0dGVybjogLyhefFxccylbLVxcdysuXStAW2Etel1bYS16MC05LV0qKD86XFwuW2Etel1bYS16MC05LV0qKSsoPz1cXHMpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAndXJsJ1xuXHR9LFxuXG5cdCdpcC1hZGRyZXNzJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpcXGR7MSwzfSg/OlxcLlxcZHsxLDN9KXszfSlcXGIvLFxuXHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdH0sXG5cdCdtYWMtYWRkcmVzcyc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW2EtZjAtOV17Mn0oPzo6W2EtZjAtOV17Mn0pezV9XFxiL2ksXG5cdFx0YWxpYXM6ICdjb25zdGFudCdcblx0fSxcblx0J2RvbWFpbic6IHtcblx0XHRwYXR0ZXJuOiAvKF58XFxzKVthLXpdW2EtejAtOS1dKig/OlxcLlthLXpdW2EtejAtOS1dKikqXFwuW2Etel1bYS16MC05LV0rKD89XFxzKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHR9LFxuXG5cdCd1dWlkJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn1cXGIvaSxcblx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHR9LFxuXHQnaGFzaCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86W2EtZjAtOV17MzJ9KXsxLDJ9XFxiL2ksXG5cdFx0YWxpYXM6ICdjb25zdGFudCdcblx0fSxcblxuXHQnZmlsZS1wYXRoJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbYS16XTpbXFxcXC9dW15cXHN8LDs6KCl7fVxcW1xcXVwiJ10rfChefFtcXHM6XFxbXFxdKD58XSlcXC57MCwyfVxcL1xcd1teXFxzfCw7Oigpe31cXFtcXF1cIiddKi9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHR9LFxuXG5cdCdkYXRlJzoge1xuXHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdC9cXGJcXGR7NH1bLS9dXFxkezJ9Wy0vXVxcZHsyfSg/OlQoPz1cXGR7MSwyfTopfCg/PVxcc1xcZHsxLDJ9OikpLy5zb3VyY2UgK1xuXHRcdFx0J3wnICtcblx0XHRcdC9cXGJcXGR7MSw0fVstLyBdKD86XFxkezEsMn18QXByfEF1Z3xEZWN8RmVifEphbnxKdWx8SnVufE1hcnxNYXl8Tm92fE9jdHxTZXApWy0vIF1cXGR7Miw0fVQ/XFxiLy5zb3VyY2UgK1xuXHRcdFx0J3wnICtcblx0XHRcdC9cXGIoPzooPzpGcml8TW9ufFNhdHxTdW58VGh1fFR1ZXxXZWQpKD86XFxzezEsMn0oPzpBcHJ8QXVnfERlY3xGZWJ8SmFufEp1bHxKdW58TWFyfE1heXxOb3Z8T2N0fFNlcCkpP3xBcHJ8QXVnfERlY3xGZWJ8SmFufEp1bHxKdW58TWFyfE1heXxOb3Z8T2N0fFNlcClcXHN7MSwyfVxcZHsxLDJ9XFxiLy5zb3VyY2UsXG5cdFx0XHQnaSdcblx0XHQpLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQndGltZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiXFxkezEsMn06XFxkezEsMn06XFxkezEsMn0oPzpbLiw6XVxcZCspPyg/Olxccz9bKy1dXFxkezJ9Oj9cXGR7Mn18Wik/XFxiLyxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXxudWxsfHRydWUpXFxiL2ksXG5cdCdudW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyhefFteLlxcd10pKD86MHhbYS1mMC05XSt8MG9bMC03XSt8MGJbMDFdK3x2P1xcZFtcXGRhLWZdKig/OlxcLlxcZCspKig/OmVbKy1dP1xcZCspP1thLXpdezAsM31cXGIpXFxiKD8hXFwuXFx3KS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblxuXHQnb3BlcmF0b3InOiAvWzs6Pzw9Pn4vQCEkJSYrXFwtfF4oKXt9KiNdLyxcblx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF0uLF0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMubG9sY29kZSA9IHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0L1xcYk9CVFdcXHNbXFxzXFxTXSo/XFxzVExEUlxcYi8sXG5cdFx0L1xcYkJUVy4rL1xuXHRdLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OjoufFteXCI6XSkqXCIvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3ZhcmlhYmxlJzogLzpcXHtbXn1dK1xcfS8sXG5cdFx0XHQnc3ltYm9sJzogW1xuXHRcdFx0XHQvOlxcKFthLWZcXGRdK1xcKS9pLFxuXHRcdFx0XHQvOlxcW1teXFxdXStcXF0vLFxuXHRcdFx0XHQvOlspPm9cIjpdL1xuXHRcdFx0XVxuXHRcdH0sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdudW1iZXInOiAvKD86XFxCLSk/KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKS8sXG5cdCdzeW1ib2wnOiB7XG5cdFx0cGF0dGVybjogLyhefFxccykoPzpBICk/KD86QlVLS0lUfE5PT0J8TlVNQkFSfE5VTUJSfFRST09GfFlBUk4pKD89XFxzfCx8JCkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQna2V5d29yZCc6IC9BKD89XFxzKS9cblx0XHR9XG5cdH0sXG5cdCdsYWJlbCc6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxzKSg/OklNIElOIFlSfElNIE9VVFRBIFlSKSApW2EtekEtWl1cXHcqLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHR9LFxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLygoPzpefFxccykoPzpIT1cgSVogSXxJIElafElaKSApW2EtekEtWl1cXHcqLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXHMpKD86QU58Rk9VTkQgWVJ8R0lNTUVIfEdURk98SEFJfEhBUyBBfEhPVyBJWiBJfEkgSEFTIEF8SSBJWnxJRiBVIFNBWSBTT3xJTSBJTiBZUnxJTSBPVVRUQSBZUnxJUyBOT1coPzogQSk/fElUWig/OiBBKT98SVp8S1RIWHxLVEhYQllFfExJRUsoPzogQSk/fE1BRUt8TUVCQkV8TUtBWXxORVJGSU58Tk8gV0FJfE8gSEFJIElNfE8gUkxZXFw/fE9JQ3xPTUd8T01HV1RGfFJ8U01PT1NIfFNSU3xUSUx8VVBQSU58VklTSUJMRXxXSUxFfFdURlxcP3xZQSBSTFl8WVIpKD89XFxzfCx8JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0LydaKD89XFxzfCx8JCkvXG5cdF0sXG5cdCdib29sZWFuJzoge1xuXHRcdHBhdHRlcm46IC8oXnxcXHMpKD86RkFJTHxXSU4pKD89XFxzfCx8JCkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3ZhcmlhYmxlJzoge1xuXHRcdHBhdHRlcm46IC8oXnxcXHMpSVQoPz1cXHN8LHwkKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnb3BlcmF0b3InOiB7XG5cdFx0cGF0dGVybjogLyhefFxccykoPzpOT1R8Qk9USCBTQUVNfERJRkZSSU5UfCg/OkFMTHxBTll8QklHR1J8Qk9USHxESUZGfEVJVEhFUnxNT0R8UFJPRFVLVHxRVU9TSFVOVHxTTUFMTFJ8U1VNfFdPTikgT0YpKD89XFxzfCx8JCkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3B1bmN0dWF0aW9uJzogL1xcLnszfXxcdTIwMjZ8LHwhL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLm1hZ21hID0ge1xuXHQnb3V0cHV0Jzoge1xuXHRcdHBhdHRlcm46IC9eKD4uKig/Olxccig/OlxcbnwoPyFcXG4pKXxcXG4pKSg/IT4pKD86Lit8KD86XFxyKD86XFxufCg/IVxcbikpfFxcbikoPyE+KS4qKSg/Oig/Olxccig/OlxcbnwoPyFcXG4pKXxcXG4pKD8hPikuKikqL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXFwiXSlcIig/OlteXFxyXFxuXFxcXFwiXXxcXFxcLikqXCIvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0Ly8gaHR0cDovL21hZ21hLm1hdGhzLnVzeWQuZWR1LmF1L21hZ21hL2hhbmRib29rL3RleHQvODJcblx0J2tleXdvcmQnOiAvXFxiKD86X3xhZGp8YW5kfGFzc2VydHxhc3NlcnQyfGFzc2VydDN8YXNzaWduZWR8YnJlYWt8Ynl8Y2FzZXxjYXR8Y2F0Y2h8Y2xlYXJ8Y21wZXF8Y21wbmV8Y29udGludWV8ZGVjbGFyZXxkZWZhdWx0fGRlbGV0ZXxkaWZmfGRpdnxkb3xlbGlmfGVsc2V8ZW5kfGVxfGVycm9yfGV2YWx8ZXhpc3RzfGV4aXR8Zm9yfGZvcmFsbHxmb3J3YXJkfGZwcmludGZ8ZnJlZXplfGZ1bmN0aW9ufGdlfGd0fGlmfGlsb2FkfGltcG9ydHxpbnxpbnRyaW5zaWN8aXN8am9pbnxsZXxsb2FkfGxvY2FsfGx0fG1lZXR8bW9kfG5lfG5vdHxub3RhZGp8bm90aW58bm90c3Vic2V0fG9yfHByaW50fHByaW50Znxwcm9jZWR1cmV8cXVpdHxyYW5kb218cmVhZHxyZWFkaXxyZXBlYXR8cmVxdWlyZXxyZXF1aXJlZ2V8cmVxdWlyZXJhbmdlfHJlc3RvcmV8cmV0dXJufHNhdmV8c2RpZmZ8c2VsZWN0fHN1YnNldHx0aGVufHRpbWV8dG98dHJ5fHVudGlsfHZwcmludHx2cHJpbnRmfHZ0aW1lfHdoZW58d2hlcmV8d2hpbGV8eG9yKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblxuXHQnZ2VuZXJhdG9yJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbYS16X11cXHcqKD89XFxzKjwpL2ksXG5cdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHR9LFxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpL2ksXG5cblx0J251bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXHcuXXxcXC5cXC4pKD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKSg/OltlRV1bKy1dP1xcZCspPyg/Ol9bYS16XT8pPyg/PSR8W15cXHcuXXxcXC5cXC4pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cblx0J29wZXJhdG9yJzogLy0+fFstKyovXn4hfCM9XXw6PXxcXC5cXC4vLFxuXHQncHVuY3R1YXRpb24nOiAvWygpW1xcXXt9PD4sOy46XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5tYWtlZmlsZSA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pIyg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteXFxcXFxcclxcbl0pKi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oW1wiJ10pKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2J1aWx0aW4tdGFyZ2V0Jzoge1xuXHRcdHBhdHRlcm46IC9cXC5bQS1aXVteOiM9XFxzXSsoPz1cXHMqOig/IT0pKS8sXG5cdFx0YWxpYXM6ICdidWlsdGluJ1xuXHR9LFxuXG5cdCd0YXJnZXQnOiB7XG5cdFx0cGF0dGVybjogL14oPzpbXjo9XFxzXXxbIFxcdF0rKD8hW1xcczpdKSkrKD89XFxzKjooPyE9KSkvbSxcblx0XHRhbGlhczogJ3N5bWJvbCcsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndmFyaWFibGUnOiAvXFwkKyg/Oig/IVxcJClbXigpe306Iz1cXHNdK3woPz1bKHtdKSkvXG5cdFx0fVxuXHR9LFxuXHQndmFyaWFibGUnOiAvXFwkKyg/Oig/IVxcJClbXigpe306Iz1cXHNdK3xcXChbQColPF4rP11bREZdXFwpfCg/PVsoe10pKS8sXG5cblx0Ly8gRGlyZWN0aXZlc1xuXHQna2V5d29yZCc6IC8taW5jbHVkZVxcYnxcXGIoPzpkZWZpbmV8ZWxzZXxlbmRlZnxlbmRpZnxleHBvcnR8aWZuP2RlZnxpZm4/ZXF8aW5jbHVkZXxvdmVycmlkZXxwcml2YXRlfHNpbmNsdWRlfHVuZGVmaW5lfHVuZXhwb3J0fHZwYXRoKVxcYi8sXG5cblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXFwoKSg/OmFic3BhdGh8YWRkc3VmZml4fGFuZHxiYXNlbmFtZXxjYWxsfGRpcnxlcnJvcnxldmFsfGZpbGV8ZmlsdGVyKD86LW91dCk/fGZpbmRzdHJpbmd8Zmlyc3R3b3JkfGZsYXZvcnxmb3JlYWNofGd1aWxlfGlmfGluZm98am9pbnxsYXN0d29yZHxsb2FkfG5vdGRpcnxvcnxvcmlnaW58cGF0c3Vic3R8cmVhbHBhdGh8c2hlbGx8c29ydHxzdHJpcHxzdWJzdHxzdWZmaXh8dmFsdWV8d2FybmluZ3x3aWxkY2FyZHx3b3JkKD86bGlzdHxzKT8pKD89WyBcXHRdKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnb3BlcmF0b3InOiAvKD86Ojp8Wz86KyFdKT89fFt8QF0vLFxuXHQncHVuY3R1YXRpb24nOiAvWzo7KCl7fV0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0Ly8gQWxsb3cgb25seSBvbmUgbGluZSBicmVha1xuXHR2YXIgaW5uZXIgPSAvKD86XFxcXC58W15cXFxcXFxuXFxyXXwoPzpcXG58XFxyXFxuPykoPyFbXFxyXFxuXSkpLy5zb3VyY2U7XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgYm9sZCBvciBpdGFsaWMgcGF0dGVybi5cblx0ICpcblx0ICogVGhpcyBhbHNvIGFkZHMgYSBsb29rYmVoaW5kIGdyb3VwIHRvIHRoZSBnaXZlbiBwYXR0ZXJuIHRvIGVuc3VyZSB0aGF0IHRoZSBwYXR0ZXJuIGlzIG5vdCBiYWNrc2xhc2gtZXNjYXBlZC5cblx0ICpcblx0ICogX05vdGU6XyBLZWVwIGluIG1pbmQgdGhhdCB0aGlzIGFkZHMgYSBjYXB0dXJpbmcgZ3JvdXAuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuXG5cdCAqIEByZXR1cm5zIHtSZWdFeHB9XG5cdCAqL1xuXHRmdW5jdGlvbiBjcmVhdGVJbmxpbmUocGF0dGVybikge1xuXHRcdHBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UoLzxpbm5lcj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gaW5uZXI7IH0pO1xuXHRcdHJldHVybiBSZWdFeHAoLygoPzpefFteXFxcXF0pKD86XFxcXHsyfSkqKS8uc291cmNlICsgJyg/OicgKyBwYXR0ZXJuICsgJyknKTtcblx0fVxuXG5cblx0dmFyIHRhYmxlQ2VsbCA9IC8oPzpcXFxcLnxgYCg/OlteYFxcclxcbl18YCg/IWApKStgYHxgW15gXFxyXFxuXStgfFteXFxcXHxcXHJcXG5gXSkrLy5zb3VyY2U7XG5cdHZhciB0YWJsZVJvdyA9IC9cXHw/X18oPzpcXHxfXykrXFx8Pyg/Oig/OlxcbnxcXHJcXG4/KXwoPyFbXFxzXFxTXSkpLy5zb3VyY2UucmVwbGFjZSgvX18vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGFibGVDZWxsOyB9KTtcblx0dmFyIHRhYmxlTGluZSA9IC9cXHw/WyBcXHRdKjo/LXszLH06P1sgXFx0XSooPzpcXHxbIFxcdF0qOj8tezMsfTo/WyBcXHRdKikrXFx8Pyg/OlxcbnxcXHJcXG4/KS8uc291cmNlO1xuXG5cblx0UHJpc20ubGFuZ3VhZ2VzLm1hcmtkb3duID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnbWFya3VwJywge30pO1xuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdtYXJrZG93bicsICdwcm9sb2cnLCB7XG5cdFx0J2Zyb250LW1hdHRlci1ibG9jayc6IHtcblx0XHRcdHBhdHRlcm46IC8oXig/OlxccypbXFxyXFxuXSk/KS0tLSg/IS4pW1xcc1xcU10qP1tcXHJcXG5dLS0tKD8hLikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXi0tLXwtLS0kLyxcblx0XHRcdFx0J2Zyb250LW1hdHRlcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxTKyg/OlxccytcXFMrKSovLFxuXHRcdFx0XHRcdGFsaWFzOiBbJ3lhbWwnLCAnbGFuZ3VhZ2UteWFtbCddLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnlhbWxcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2Jsb2NrcXVvdGUnOiB7XG5cdFx0XHQvLyA+IC4uLlxuXHRcdFx0cGF0dGVybjogL14+KD86W1xcdCBdKj4pKi9tLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCd0YWJsZSc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnXicgKyB0YWJsZVJvdyArIHRhYmxlTGluZSArICcoPzonICsgdGFibGVSb3cgKyAnKSonLCAnbScpLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCd0YWJsZS1kYXRhLXJvd3MnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKCdeKCcgKyB0YWJsZVJvdyArIHRhYmxlTGluZSArICcpKD86JyArIHRhYmxlUm93ICsgJykqJCcpLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQndGFibGUtZGF0YSc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKHRhYmxlQ2VsbCksXG5cdFx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLm1hcmtkb3duXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcfC9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCd0YWJsZS1saW5lJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnXignICsgdGFibGVSb3cgKyAnKScgKyB0YWJsZUxpbmUgKyAnJCcpLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFx8fDo/LXszLH06Py9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCd0YWJsZS1oZWFkZXItcm93Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnXicgKyB0YWJsZVJvdyArICckJyksXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQndGFibGUtaGVhZGVyJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAodGFibGVDZWxsKSxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5tYXJrZG93blxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXHwvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnY29kZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gUHJlZml4ZWQgYnkgNCBzcGFjZXMgb3IgMSB0YWIgYW5kIHByZWNlZGVkIGJ5IGFuIGVtcHR5IGxpbmVcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFxcbilbIFxcdF0qXFxufCg/Ol58XFxyXFxuPylbIFxcdF0qXFxyXFxuPykoPzogezR9fFxcdCkuKyg/Oig/OlxcbnxcXHJcXG4/KSg/OiB7NH18XFx0KS4rKSovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBgYGBvcHRpb25hbCBsYW5ndWFnZVxuXHRcdFx0XHQvLyBjb2RlIGJsb2NrXG5cdFx0XHRcdC8vIGBgYFxuXHRcdFx0XHRwYXR0ZXJuOiAvXmBgYFtcXHNcXFNdKj9eYGBgJC9tLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdjb2RlLWJsb2NrJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL14oYGBgLiooPzpcXG58XFxyXFxuPykpW1xcc1xcU10rPyg/PSg/OlxcbnxcXHJcXG4/KV5gYGAkKS9tLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J2NvZGUtbGFuZ3VhZ2UnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXihgYGApLisvLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL2BgYC9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J3RpdGxlJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyB0aXRsZSAxXG5cdFx0XHRcdC8vID09PT09PT1cblxuXHRcdFx0XHQvLyB0aXRsZSAyXG5cdFx0XHRcdC8vIC0tLS0tLS1cblx0XHRcdFx0cGF0dGVybjogL1xcUy4qKD86XFxufFxcclxcbj8pKD86PT0rfC0tKykoPz1bIFxcdF0qJCkvbSxcblx0XHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRwdW5jdHVhdGlvbjogLz09KyR8LS0rJC9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gIyB0aXRsZSAxXG5cdFx0XHRcdC8vICMjIyMjIyB0aXRsZSA2XG5cdFx0XHRcdHBhdHRlcm46IC8oXlxccyopIy4rL20sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnaW1wb3J0YW50Jyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0cHVuY3R1YXRpb246IC9eIyt8IyskL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnaHInOiB7XG5cdFx0XHQvLyAqKipcblx0XHRcdC8vIC0tLVxuXHRcdFx0Ly8gKiAqICpcblx0XHRcdC8vIC0tLS0tLS0tLS0tXG5cdFx0XHRwYXR0ZXJuOiAvKF5cXHMqKShbKi1dKSg/OltcXHQgXSpcXDIpezIsfSg/PVxccyokKS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQnbGlzdCc6IHtcblx0XHRcdC8vICogaXRlbVxuXHRcdFx0Ly8gKyBpdGVtXG5cdFx0XHQvLyAtIGl0ZW1cblx0XHRcdC8vIDEuIGl0ZW1cblx0XHRcdHBhdHRlcm46IC8oXlxccyopKD86WyorLV18XFxkK1xcLikoPz1bXFx0IF0uKS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQndXJsLXJlZmVyZW5jZSc6IHtcblx0XHRcdC8vIFtpZF06IGh0dHA6Ly9leGFtcGxlLmNvbSBcIk9wdGlvbmFsIHRpdGxlXCJcblx0XHRcdC8vIFtpZF06IGh0dHA6Ly9leGFtcGxlLmNvbSAnT3B0aW9uYWwgdGl0bGUnXG5cdFx0XHQvLyBbaWRdOiBodHRwOi8vZXhhbXBsZS5jb20gKE9wdGlvbmFsIHRpdGxlKVxuXHRcdFx0Ly8gW2lkXTogPGh0dHA6Ly9leGFtcGxlLmNvbT4gXCJPcHRpb25hbCB0aXRsZVwiXG5cdFx0XHRwYXR0ZXJuOiAvIT9cXFtbXlxcXV0rXFxdOltcXHQgXSsoPzpcXFMrfDwoPzpcXFxcLnxbXj5cXFxcXSkrPikoPzpbXFx0IF0rKD86XCIoPzpcXFxcLnxbXlwiXFxcXF0pKlwifCcoPzpcXFxcLnxbXidcXFxcXSkqJ3xcXCgoPzpcXFxcLnxbXilcXFxcXSkqXFwpKSk/Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQndmFyaWFibGUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oIT9cXFspW15cXF1dKy8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnc3RyaW5nJzogLyg/OlwiKD86XFxcXC58W15cIlxcXFxdKSpcInwnKD86XFxcXC58W14nXFxcXF0pKid8XFwoKD86XFxcXC58W14pXFxcXF0pKlxcKSkkLyxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15bXFxbXFxdITpdfFs8Pl0vXG5cdFx0XHR9LFxuXHRcdFx0YWxpYXM6ICd1cmwnXG5cdFx0fSxcblx0XHQnYm9sZCc6IHtcblx0XHRcdC8vICoqc3Ryb25nKipcblx0XHRcdC8vIF9fc3Ryb25nX19cblxuXHRcdFx0Ly8gYWxsb3cgb25lIG5lc3RlZCBpbnN0YW5jZSBvZiBpdGFsaWMgdGV4dCB1c2luZyB0aGUgc2FtZSBkZWxpbWl0ZXJcblx0XHRcdHBhdHRlcm46IGNyZWF0ZUlubGluZSgvXFxiX18oPzooPyFfKTxpbm5lcj58Xyg/Oig/IV8pPGlubmVyPikrXykrX19cXGJ8XFwqXFwqKD86KD8hXFwqKTxpbm5lcj58XFwqKD86KD8hXFwqKTxpbm5lcj4pK1xcKikrXFwqXFwqLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY29udGVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF4uLilbXFxzXFxTXSsoPz0uLiQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge30gLy8gc2VlIGJlbG93XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXCpcXCp8X18vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnaXRhbGljJzoge1xuXHRcdFx0Ly8gKmVtKlxuXHRcdFx0Ly8gX2VtX1xuXG5cdFx0XHQvLyBhbGxvdyBvbmUgbmVzdGVkIGluc3RhbmNlIG9mIGJvbGQgdGV4dCB1c2luZyB0aGUgc2FtZSBkZWxpbWl0ZXJcblx0XHRcdHBhdHRlcm46IGNyZWF0ZUlubGluZSgvXFxiXyg/Oig/IV8pPGlubmVyPnxfXyg/Oig/IV8pPGlubmVyPikrX18pK19cXGJ8XFwqKD86KD8hXFwqKTxpbm5lcj58XFwqXFwqKD86KD8hXFwqKTxpbm5lcj4pK1xcKlxcKikrXFwqLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY29udGVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF4uKVtcXHNcXFNdKyg/PS4kKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHt9IC8vIHNlZSBiZWxvd1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWypfXS9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdzdHJpa2UnOiB7XG5cdFx0XHQvLyB+fnN0cmlrZSB0aHJvdWdofn5cblx0XHRcdC8vIH5zdHJpa2V+XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHRcdFx0cGF0dGVybjogY3JlYXRlSW5saW5lKC8ofn4/KSg/Oig/IX4pPGlubmVyPikrXFwyLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY29udGVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5+fj8pW1xcc1xcU10rKD89XFwxJCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7fSAvLyBzZWUgYmVsb3dcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL35+Py9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdjb2RlLXNuaXBwZXQnOiB7XG5cdFx0XHQvLyBgY29kZWBcblx0XHRcdC8vIGBgY29kZWBgXG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcYF0pKD86YGBbXmBcXHJcXG5dKyg/OmBbXmBcXHJcXG5dKykqYGAoPyFgKXxgW15gXFxyXFxuXStgKD8hYCkpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogWydjb2RlJywgJ2tleXdvcmQnXVxuXHRcdH0sXG5cdFx0J3VybCc6IHtcblx0XHRcdC8vIFtleGFtcGxlXShodHRwOi8vZXhhbXBsZS5jb20gXCJPcHRpb25hbCB0aXRsZVwiKVxuXHRcdFx0Ly8gW2V4YW1wbGVdW2lkXVxuXHRcdFx0Ly8gW2V4YW1wbGVdIFtpZF1cblx0XHRcdHBhdHRlcm46IGNyZWF0ZUlubGluZSgvIT9cXFsoPzooPyFcXF0pPGlubmVyPikrXFxdKD86XFwoW15cXHMpXSsoPzpbXFx0IF0rXCIoPzpcXFxcLnxbXlwiXFxcXF0pKlwiKT9cXCl8WyBcXHRdP1xcWyg/Oig/IVxcXSk8aW5uZXI+KStcXF0pLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnb3BlcmF0b3InOiAvXiEvLFxuXHRcdFx0XHQnY29udGVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXFspW15cXF1dKyg/PVxcXSkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7fSAvLyBzZWUgYmVsb3dcblx0XHRcdFx0fSxcblx0XHRcdFx0J3ZhcmlhYmxlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXlxcXVsgXFx0XT9cXFspW15cXF1dKyg/PVxcXSQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCd1cmwnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheXFxdXFwoKVteXFxzKV0rLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheWyBcXHRdKylcIig/OlxcXFwufFteXCJcXFxcXSkqXCIoPz1cXCkkKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRbJ3VybCcsICdib2xkJywgJ2l0YWxpYycsICdzdHJpa2UnXS5mb3JFYWNoKGZ1bmN0aW9uICh0b2tlbikge1xuXHRcdFsndXJsJywgJ2JvbGQnLCAnaXRhbGljJywgJ3N0cmlrZScsICdjb2RlLXNuaXBwZXQnXS5mb3JFYWNoKGZ1bmN0aW9uIChpbnNpZGUpIHtcblx0XHRcdGlmICh0b2tlbiAhPT0gaW5zaWRlKSB7XG5cdFx0XHRcdFByaXNtLmxhbmd1YWdlcy5tYXJrZG93blt0b2tlbl0uaW5zaWRlLmNvbnRlbnQuaW5zaWRlW2luc2lkZV0gPSBQcmlzbS5sYW5ndWFnZXMubWFya2Rvd25baW5zaWRlXTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG5cblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRpZiAoZW52Lmxhbmd1YWdlICE9PSAnbWFya2Rvd24nICYmIGVudi5sYW5ndWFnZSAhPT0gJ21kJykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHdhbGtUb2tlbnModG9rZW5zKSB7XG5cdFx0XHRpZiAoIXRva2VucyB8fCB0eXBlb2YgdG9rZW5zID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGZvciAodmFyIGkgPSAwLCBsID0gdG9rZW5zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHR2YXIgdG9rZW4gPSB0b2tlbnNbaV07XG5cblx0XHRcdFx0aWYgKHRva2VuLnR5cGUgIT09ICdjb2RlJykge1xuXHRcdFx0XHRcdHdhbGtUb2tlbnModG9rZW4uY29udGVudCk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvKlxuXHRcdFx0XHQgKiBBZGQgdGhlIGNvcnJlY3QgYGxhbmd1YWdlLXh4eHhgIGNsYXNzIHRvIHRoaXMgY29kZSBibG9jay4gS2VlcCBpbiBtaW5kIHRoYXQgdGhlIGBjb2RlLWxhbmd1YWdlYCB0b2tlblxuXHRcdFx0XHQgKiBpcyBvcHRpb25hbC4gQnV0IHRoZSBncmFtbWFyIGlzIGRlZmluZWQgc28gdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBjYXNlIHdlIGhhdmUgdG8gaGFuZGxlOlxuXHRcdFx0XHQgKlxuXHRcdFx0XHQgKiB0b2tlbi5jb250ZW50ID0gW1xuXHRcdFx0XHQgKiAgICAgPHNwYW4gY2xhc3M9XCJwdW5jdHVhdGlvblwiPmBgYDwvc3Bhbj4sXG5cdFx0XHRcdCAqICAgICA8c3BhbiBjbGFzcz1cImNvZGUtbGFuZ3VhZ2VcIj54eHh4PC9zcGFuPixcblx0XHRcdFx0ICogICAgICdcXG4nLCAvLyBleGFjdGx5IG9uZSBuZXcgbGluZXMgKFxcciBvciBcXG4gb3IgXFxyXFxuKVxuXHRcdFx0XHQgKiAgICAgPHNwYW4gY2xhc3M9XCJjb2RlLWJsb2NrXCI+Li4uPC9zcGFuPixcblx0XHRcdFx0ICogICAgICdcXG4nLCAvLyBleGFjdGx5IG9uZSBuZXcgbGluZXMgYWdhaW5cblx0XHRcdFx0ICogICAgIDxzcGFuIGNsYXNzPVwicHVuY3R1YXRpb25cIj5gYGA8L3NwYW4+XG5cdFx0XHRcdCAqIF07XG5cdFx0XHRcdCAqL1xuXG5cdFx0XHRcdHZhciBjb2RlTGFuZyA9IHRva2VuLmNvbnRlbnRbMV07XG5cdFx0XHRcdHZhciBjb2RlQmxvY2sgPSB0b2tlbi5jb250ZW50WzNdO1xuXG5cdFx0XHRcdGlmIChjb2RlTGFuZyAmJiBjb2RlQmxvY2sgJiZcblx0XHRcdFx0XHRjb2RlTGFuZy50eXBlID09PSAnY29kZS1sYW5ndWFnZScgJiYgY29kZUJsb2NrLnR5cGUgPT09ICdjb2RlLWJsb2NrJyAmJlxuXHRcdFx0XHRcdHR5cGVvZiBjb2RlTGFuZy5jb250ZW50ID09PSAnc3RyaW5nJykge1xuXG5cdFx0XHRcdFx0Ly8gdGhpcyBtaWdodCBiZSBhIGxhbmd1YWdlIHRoYXQgUHJpc20gZG9lcyBub3Qgc3VwcG9ydFxuXG5cdFx0XHRcdFx0Ly8gZG8gc29tZSByZXBsYWNlbWVudHMgdG8gc3VwcG9ydCBDKyssIEMjLCBhbmQgRiNcblx0XHRcdFx0XHR2YXIgbGFuZyA9IGNvZGVMYW5nLmNvbnRlbnQucmVwbGFjZSgvXFxiIy9nLCAnc2hhcnAnKS5yZXBsYWNlKC9cXGJcXCtcXCsvZywgJ3BwJyk7XG5cdFx0XHRcdFx0Ly8gb25seSB1c2UgdGhlIGZpcnN0IHdvcmRcblx0XHRcdFx0XHRsYW5nID0gKC9bYS16XVtcXHctXSovaS5leGVjKGxhbmcpIHx8IFsnJ10pWzBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0dmFyIGFsaWFzID0gJ2xhbmd1YWdlLScgKyBsYW5nO1xuXG5cdFx0XHRcdFx0Ly8gYWRkIGFsaWFzXG5cdFx0XHRcdFx0aWYgKCFjb2RlQmxvY2suYWxpYXMpIHtcblx0XHRcdFx0XHRcdGNvZGVCbG9jay5hbGlhcyA9IFthbGlhc107XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgY29kZUJsb2NrLmFsaWFzID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdFx0Y29kZUJsb2NrLmFsaWFzID0gW2NvZGVCbG9jay5hbGlhcywgYWxpYXNdO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb2RlQmxvY2suYWxpYXMucHVzaChhbGlhcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0d2Fsa1Rva2VucyhlbnYudG9rZW5zKTtcblx0fSk7XG5cblx0UHJpc20uaG9va3MuYWRkKCd3cmFwJywgZnVuY3Rpb24gKGVudikge1xuXHRcdGlmIChlbnYudHlwZSAhPT0gJ2NvZGUtYmxvY2snKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGNvZGVMYW5nID0gJyc7XG5cdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSBlbnYuY2xhc3Nlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdHZhciBjbHMgPSBlbnYuY2xhc3Nlc1tpXTtcblx0XHRcdHZhciBtYXRjaCA9IC9sYW5ndWFnZS0oLispLy5leGVjKGNscyk7XG5cdFx0XHRpZiAobWF0Y2gpIHtcblx0XHRcdFx0Y29kZUxhbmcgPSBtYXRjaFsxXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmFyIGdyYW1tYXIgPSBQcmlzbS5sYW5ndWFnZXNbY29kZUxhbmddO1xuXG5cdFx0aWYgKCFncmFtbWFyKSB7XG5cdFx0XHRpZiAoY29kZUxhbmcgJiYgY29kZUxhbmcgIT09ICdub25lJyAmJiBQcmlzbS5wbHVnaW5zLmF1dG9sb2FkZXIpIHtcblx0XHRcdFx0dmFyIGlkID0gJ21kLScgKyBuZXcgRGF0ZSgpLnZhbHVlT2YoKSArICctJyArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDFlMTYpO1xuXHRcdFx0XHRlbnYuYXR0cmlidXRlc1snaWQnXSA9IGlkO1xuXG5cdFx0XHRcdFByaXNtLnBsdWdpbnMuYXV0b2xvYWRlci5sb2FkTGFuZ3VhZ2VzKGNvZGVMYW5nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0dmFyIGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcblx0XHRcdFx0XHRpZiAoZWxlKSB7XG5cdFx0XHRcdFx0XHRlbGUuaW5uZXJIVE1MID0gUHJpc20uaGlnaGxpZ2h0KGVsZS50ZXh0Q29udGVudCwgUHJpc20ubGFuZ3VhZ2VzW2NvZGVMYW5nXSwgY29kZUxhbmcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGVudi5jb250ZW50ID0gUHJpc20uaGlnaGxpZ2h0KHRleHRDb250ZW50KGVudi5jb250ZW50KSwgZ3JhbW1hciwgY29kZUxhbmcpO1xuXHRcdH1cblx0fSk7XG5cblx0dmFyIHRhZ1BhdHRlcm4gPSBSZWdFeHAoUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cC50YWcucGF0dGVybi5zb3VyY2UsICdnaScpO1xuXG5cdC8qKlxuXHQgKiBBIGxpc3Qgb2Yga25vd24gZW50aXR5IG5hbWVzLlxuXHQgKlxuXHQgKiBUaGlzIHdpbGwgYWx3YXlzIGJlIGluY29tcGxldGUgdG8gc2F2ZSBzcGFjZS4gVGhlIGN1cnJlbnQgbGlzdCBpcyB0aGUgb25lIHVzZWQgYnkgbG93ZGFzaCdzIHVuZXNjYXBlIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iLzJkYTAyNGMzYjRmOTk0N2E0ODUxNzYzOWRlNzU2MDQ1N2NkNGVjNmMvdW5lc2NhcGUuanMjTDJ9XG5cdCAqL1xuXHR2YXIgS05PV05fRU5USVRZX05BTUVTID0ge1xuXHRcdCdhbXAnOiAnJicsXG5cdFx0J2x0JzogJzwnLFxuXHRcdCdndCc6ICc+Jyxcblx0XHQncXVvdCc6ICdcIicsXG5cdH07XG5cblx0Ly8gSUUgMTEgZG9lc24ndCBzdXBwb3J0IGBTdHJpbmcuZnJvbUNvZGVQb2ludGBcblx0dmFyIGZyb21Db2RlUG9pbnQgPSBTdHJpbmcuZnJvbUNvZGVQb2ludCB8fCBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB0ZXh0IGNvbnRlbnQgb2YgYSBnaXZlbiBIVE1MIHNvdXJjZSBjb2RlIHN0cmluZy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGh0bWxcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGZ1bmN0aW9uIHRleHRDb250ZW50KGh0bWwpIHtcblx0XHQvLyByZW1vdmUgYWxsIHRhZ3Ncblx0XHR2YXIgdGV4dCA9IGh0bWwucmVwbGFjZSh0YWdQYXR0ZXJuLCAnJyk7XG5cblx0XHQvLyBkZWNvZGUga25vd24gZW50aXRpZXNcblx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKC8mKFxcd3sxLDh9fCN4P1tcXGRhLWZdezEsOH0pOy9naSwgZnVuY3Rpb24gKG0sIGNvZGUpIHtcblx0XHRcdGNvZGUgPSBjb2RlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmIChjb2RlWzBdID09PSAnIycpIHtcblx0XHRcdFx0dmFyIHZhbHVlO1xuXHRcdFx0XHRpZiAoY29kZVsxXSA9PT0gJ3gnKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBwYXJzZUludChjb2RlLnNsaWNlKDIpLCAxNik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBOdW1iZXIoY29kZS5zbGljZSgxKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZnJvbUNvZGVQb2ludCh2YWx1ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIga25vd24gPSBLTk9XTl9FTlRJVFlfTkFNRVNbY29kZV07XG5cdFx0XHRcdGlmIChrbm93bikge1xuXHRcdFx0XHRcdHJldHVybiBrbm93bjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHVuYWJsZSB0byBkZWNvZGVcblx0XHRcdFx0cmV0dXJuIG07XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gdGV4dDtcblx0fVxuXG5cdFByaXNtLmxhbmd1YWdlcy5tZCA9IFByaXNtLmxhbmd1YWdlcy5tYXJrZG93bjtcblxufShQcmlzbSkpO1xuXG4vLyBodHRwczovL3d3dy5zdGF0YS5jb20vbWFudWFscy9tLnBkZlxuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIG9yZ1R5cGUgPSAvXFxiKD86KD86Y29sfHJvdyk/dmVjdG9yfG1hdHJpeHxzY2FsYXIpXFxiLy5zb3VyY2U7XG5cdHZhciB0eXBlID0gL1xcYnZvaWRcXGJ8PG9yZz58XFxiKD86Y29tcGxleHxudW1lcmljfHBvaW50ZXIoPzpcXHMqXFwoW14oKV0qXFwpKT98cmVhbHxzdHJpbmd8KD86Y2xhc3N8c3RydWN0KVxccytcXHcrfHRyYW5zbW9ycGhpYykoPzpcXHMqPG9yZz4pPy8uc291cmNlXG5cdFx0LnJlcGxhY2UoLzxvcmc+L2csIG9yZ1R5cGUpO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5tYXRhID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcL1xcLy4qfFxcL1xcKig/OlteKi9dfFxcKig/IVxcLyl8XFwvKD8hXFwqKXxcXC9cXCooPzpbXipdfFxcKig/IVxcLykpKlxcKlxcLykqXFwqXFwvLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIlteXCJcXHJcXG5dKlwifFtcdTIwMThgJ11cIi4qP1wiW1x1MjAxOWAnXS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXG5cdFx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmNsYXNzfGV4dGVuZHN8c3RydWN0KVxccyspXFx3Kyg/PVxccyooPzpcXHt8XFxiZXh0ZW5kc1xcYikpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCd0eXBlJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKHR5cGUpLFxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWygpXS8sXG5cdFx0XHRcdCdrZXl3b3JkJzogL1xcYig/OmNsYXNzfGZ1bmN0aW9ufHN0cnVjdHx2b2lkKVxcYi9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdrZXl3b3JkJzogL1xcYig/OmJyZWFrfGNsYXNzfGNvbnRpbnVlfGRvfGVsc2V8ZW5kfGV4dGVuZHN8ZXh0ZXJuYWx8ZmluYWx8Zm9yfGZ1bmN0aW9ufGdvdG98aWZ8cHJhZ21hfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xyZXR1cm58c3RhdGljfHN0cnVjdHx1bnNldHx1bnVzZWR8dmVyc2lvbnx2aXJ0dWFsfHdoaWxlKVxcYi8sXG5cdFx0J2NvbnN0YW50JzogL1xcYk5VTExcXGIvLFxuXG5cdFx0J251bWJlcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdy5dKSg/OlxcZCsoPzpcXC5cXGQrKT8oPzplWystXT9cXGQrKT98XFxkW2EtZjAtOV0qKD86XFwuW2EtZjAtOV0rKT94WystXT9cXGQrKWk/KD8hW1xcdy5dKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J21pc3NpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHcuXSkoPzpcXC5bYS16XT8pKD8hW1xcdy5dKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdzeW1ib2wnXG5cdFx0fSxcblxuXHRcdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCkvaSxcblxuXHRcdCdvcGVyYXRvcic6IC9cXC5cXC58XFwrXFwrfC0tfCYmfFxcfFxcfHw6Pyg/OlshPTw+XT18WytcXC0qL148PiZ8Ol0pfFshPz1cXFxcI1x1MjAxOWAnXS8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKVtcXF17fSw7Ll0vXG5cdH07XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLm1hdGxhYiA9IHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0LyVcXHtbXFxzXFxTXSo/XFx9JS8sXG5cdFx0LyUuKy9cblx0XSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXFxCJyg/OicnfFteJ1xcclxcbl0pKicvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQvLyBGSVhNRSBXZSBjb3VsZCBoYW5kbGUgaW1hZ2luYXJ5IG51bWJlcnMgYXMgYSB3aG9sZVxuXHQnbnVtYmVyJzogLyg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpbZUVdWystXT9cXGQrKT8oPzpbaWpdKT98XFxiW2lqXVxcYi8sXG5cdCdrZXl3b3JkJzogL1xcYig/Ok5hTnxicmVha3xjYXNlfGNhdGNofGNvbnRpbnVlfGVsc2V8ZWxzZWlmfGVuZHxmb3J8ZnVuY3Rpb258aWZ8aW5mfG90aGVyd2lzZXxwYXJmb3J8cGF1c2V8cGl8cmV0dXJufHN3aXRjaHx0cnl8d2hpbGUpXFxiLyxcblx0J2Z1bmN0aW9uJzogL1xcYig/IVxcZClcXHcrKD89XFxzKlxcKCkvLFxuXHQnb3BlcmF0b3InOiAvXFwuP1sqXlxcL1xcXFwnXXxbK1xcLTpAXXxbPD49fl09P3wmJj98XFx8XFx8Py8sXG5cdCdwdW5jdHVhdGlvbic6IC9cXC57M318Wy4sO1xcW1xcXSgpe30hXS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIga2V5d29yZHMgPSAvXFxiKD86YWJvdXR8YW5kfGFuaW1hdGV8YXN8YXR8YXR0cmlidXRlc3xieXxjYXNlfGNhdGNofGNvbGxlY3R8Y29udGludWV8Y29vcmRzeXN8ZG98ZWxzZXxleGl0fGZufGZvcnxmcm9tfGZ1bmN0aW9ufGdsb2JhbHxpZnxpbnxsb2NhbHxtYWNyb3NjcmlwdHxtYXBwZWR8bWF4fG5vdHxvZnxvZmZ8b258b3J8cGFyYW1ldGVyc3xwZXJzaXN0ZW50fHBsdWdpbnxyY21lbnV8cmV0dXJufHJvbGxvdXR8c2V0fHN0cnVjdHx0aGVufHRocm93fHRvfHRvb2x8dHJ5fHVuZG98dXRpbGl0eXx3aGVufHdoZXJlfHdoaWxlfHdpdGgpXFxiL2k7XG5cblxuXHRQcmlzbS5sYW5ndWFnZXMubWF4c2NyaXB0ID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCl8LS0uKi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cIlxcXFxAXSkoPzpcIig/OlteXCJcXFxcXXxcXFxcW1xcc1xcU10pKlwifEBcIlteXCJdKlwiKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQncGF0aCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXCQoPzpbXFx3L1xcXFwuKj9dfCdbXiddKicpKi8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHR9LFxuXG5cdFx0J2Z1bmN0aW9uLWNhbGwnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdCcoKD86JyArIChcblx0XHRcdFx0XHQvLyBzdGFydCBvZiBsaW5lXG5cdFx0XHRcdFx0L14vLnNvdXJjZSArXG5cdFx0XHRcdFx0J3wnICtcblx0XHRcdFx0XHQvLyBvcGVyYXRvcnMgYW5kIG90aGVyIGxhbmd1YWdlIGNvbnN0cnVjdHNcblx0XHRcdFx0XHQvWzs9PD4rXFwtKi9eKHtcXFtdLy5zb3VyY2UgK1xuXHRcdFx0XHRcdCd8JyArXG5cdFx0XHRcdFx0Ly8ga2V5d29yZHMgYXMgcGFydCBvZiBzdGF0ZW1lbnRzXG5cdFx0XHRcdFx0L1xcYig/OmFuZHxieXxjYXNlfGNhdGNofGNvbGxlY3R8ZG98ZWxzZXxpZnxpbnxub3R8b3J8cmV0dXJufHRoZW58dG98dHJ5fHdoZXJlfHdoaWxlfHdpdGgpXFxiLy5zb3VyY2Vcblx0XHRcdFx0KSArICcpWyBcXHRdKiknICtcblxuXHRcdFx0XHQnKD8hJyArIGtleXdvcmRzLnNvdXJjZSArICcpJyArIC9bYS16X11cXHcqXFxiLy5zb3VyY2UgK1xuXG5cdFx0XHRcdCcoPz1bIFxcdF0qKD86JyArIChcblx0XHRcdFx0XHQvLyB2YXJpYWJsZVxuXHRcdFx0XHRcdCcoPyEnICsga2V5d29yZHMuc291cmNlICsgJyknICsgL1thLXpfXS8uc291cmNlICtcblx0XHRcdFx0XHQnfCcgK1xuXHRcdFx0XHRcdC8vIG51bWJlclxuXHRcdFx0XHRcdC9cXGR8LVxcLj9cXGQvLnNvdXJjZSArXG5cdFx0XHRcdFx0J3wnICtcblx0XHRcdFx0XHQvLyBvdGhlciBleHByZXNzaW9ucyBvciBsaXRlcmFsc1xuXHRcdFx0XHRcdC9bKHsnXCIkQCM/XS8uc291cmNlXG5cdFx0XHRcdCkgKyAnKSknLFxuXHRcdFx0XHQnaW0nXG5cdFx0XHQpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblxuXHRcdCdmdW5jdGlvbi1kZWZpbml0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGIoPzpmbnxmdW5jdGlvbilcXHMrKVxcdytcXGIvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cblx0XHQnYXJndW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiW2Etel9dXFx3Kig/PTopL2ksXG5cdFx0XHRhbGlhczogJ2F0dHItbmFtZSdcblx0XHR9LFxuXG5cdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cblx0XHQndGltZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdy5dKSg/Oig/Oig/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzpbZUVkRF1bKy1dXFxkK3xbTFBdKT9bbXNmdF0pK3xcXGQrOlxcZCsoPzpcXC5cXGQqKT8pKD8hW1xcdy46XSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdH0sXG5cdFx0J251bWJlcic6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFx3Ll0pKD86KD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKSg/OltlRWREXVsrLV1cXGQrfFtMUF0pP3wweFthLWZBLUYwLTldKykoPyFbXFx3LjpdKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQvXFxiKD86ZXxwaSlcXGIvXG5cdFx0XSxcblxuXHRcdCdjb25zdGFudCc6IC9cXGIoPzpkb250Y29sbGVjdHxva3xzaWxlbnRWYWx1ZXx1bmRlZmluZWR8dW5zdXBwbGllZClcXGIvLFxuXHRcdCdjb2xvcic6IHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzpibGFja3xibHVlfGJyb3dufGdyYXl8Z3JlZW58b3JhbmdlfHJlZHx3aGl0ZXx5ZWxsb3cpXFxiL2ksXG5cdFx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHRcdH0sXG5cblx0XHQnb3BlcmF0b3InOiAvWy0rKi88Pj0hXT0/fFsmXj9dfCMoPyFcXCgpLyxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpXFxbXFxde30uOiw7XXwjKD89XFwoKXxcXFxcJC9tXG5cdH07XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLm1lbCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY29kZSc6IHtcblx0XHRwYXR0ZXJuOiAvYCg/OlxcXFwufFteXFxcXGBdKSpgLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdpdGFsaWMnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0cGF0dGVybjogL15gfGAkLyxcblx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdH0sXG5cdFx0XHQnc3RhdGVtZW50Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3ZhcmlhYmxlJzogL1xcJFxcdysvLFxuXHQnbnVtYmVyJzogL1xcYjB4W1xcZGEtZkEtRl0rXFxifFxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKy8sXG5cdCdmbGFnJzoge1xuXHRcdHBhdHRlcm46IC8tW15cXGRcXFddXFx3Ki8sXG5cdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YnJlYWt8Y2FzZXxjb250aW51ZXxkZWZhdWx0fGRvfGVsc2V8ZmxvYXR8Zm9yfGdsb2JhbHxpZnxpbnxpbnR8bWF0cml4fHByb2N8cmV0dXJufHN0cmluZ3xzd2l0Y2h8dmVjdG9yfHdoaWxlKVxcYi8sXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58W3s7XSlbIFxcdF0qKVthLXpfXVxcdypcXGIoPyFcXHMqKD86XFwuKD8hXFwuKXxbW3s9XSkpfFxcYlthLXpfXVxcdyooPz1bIFxcdF0qXFwoKS9pbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCd0ZW5zb3ItcHVuY3R1YXRpb24nOiB7XG5cdFx0cGF0dGVybjogLzw8fD4+Lyxcblx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHR9LFxuXHQnb3BlcmF0b3InOiAvXFwrWys9XT98LVstPV0/fCYmfFxcfFxcfHxbPD5dPT98WypcXC8hPV09P3xbJV5dLyxcblx0J3B1bmN0dWF0aW9uJzogL1suLDo7P1xcW1xcXSgpe31dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLm1lbFsnY29kZSddLmluc2lkZVsnc3RhdGVtZW50J10uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLm1lbDtcblxuUHJpc20ubGFuZ3VhZ2VzLm1lcm1haWQgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8lJS4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQnc3R5bGUnOiB7XG5cdFx0cGF0dGVybjogL14oWyBcXHRdKig/OmNsYXNzRGVmfGxpbmtTdHlsZXxzdHlsZSlbIFxcdF0rW1xcdyQtXStbIFxcdF0rKVxcdy4qW15cXHM7XS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHJvcGVydHknOiAvXFxiXFx3W1xcdy1dKig/PVsgXFx0XSo6KS8sXG5cdFx0XHQnb3BlcmF0b3InOiAvOi8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvLC9cblx0XHR9XG5cdH0sXG5cblx0J2ludGVyLWFycm93LWxhYmVsJzoge1xuXHRcdHBhdHRlcm46IC8oW148Pm94Lj0tXSkoPzotWy0uXXw9PSkoPyFbPD5veC49LV0pWyBcXHRdKig/OlwiW15cIlxcclxcbl0qXCJ8W15cXHNcIi49LV0oPzpbXlxcclxcbi49LV0qW15cXHMuPS1dKT8pWyBcXHRdKig/OlxcListPj98LS0rWy0+XXw9PStbPT5dKSg/IVs8Pm94Lj0tXSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2Fycm93Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKD86XFwuKy0+P3wtLStbLT5dfD09K1s9Pl0pJC8sXG5cdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0XHR9LFxuXHRcdFx0J2xhYmVsJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXihbXFxzXFxTXXsyfVsgXFx0XSopXFxTKD86W1xcc1xcU10qXFxTKT8vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHRcdFx0fSxcblx0XHRcdCdhcnJvdy1oZWFkJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXlxcUysvLFxuXHRcdFx0XHRhbGlhczogWydhcnJvdycsICdvcGVyYXRvciddXG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdCdhcnJvdyc6IFtcblx0XHQvLyBUaGlzIG1pZ2h0IGxvb2sgY29tcGxleCBidXQgaXQgcmVhbGx5IGlzbid0LlxuXHRcdC8vIFRoZXJlIGFyZSBtYW55IHBvc3NpYmxlIGFycm93cyAoc2VlIHRlc3RzKSBhbmQgaXQncyBpbXBvc3NpYmxlIHRvIGZpdCBhbGwgb2YgdGhlbSBpbnRvIG9uZSBwYXR0ZXJuLiBUaGVcblx0XHQvLyBwcm9ibGVtIGlzIHRoYXQgd2Ugb25seSBoYXZlIG9uZSBsb29rYmVoaW5kIHBlciBwYXR0ZXJuLiBIb3dldmVyLCB3ZSBjYW5ub3QgZGlzYWxsb3cgdG9vIG1hbnkgYXJyb3dcblx0XHQvLyBjaGFyYWN0ZXJzIGluIHRoZSBvbmUgbG9va2JlaGluZCBiZWNhdXNlIHRoYXQgd291bGQgY3JlYXRlIHRvbyBtYW55IGZhbHNlIG5lZ2F0aXZlcy4gU28gd2UgaGF2ZSB0byBzcGxpdCB0aGVcblx0XHQvLyBhcnJvd3MgaW50byBkaWZmZXJlbnQgcGF0dGVybnMuXG5cdFx0e1xuXHRcdFx0Ly8gRVIgZGlhZ3JhbVxuXHRcdFx0cGF0dGVybjogLyhefFtee318by4tXSlbfH1dW3xvXSg/Oi0tfFxcLlxcLilbfG9dW3x7XSg/IVt7fXxvLi1dKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIGZsb3cgY2hhcnRcblx0XHRcdC8vICg/Oj09K3wtLSt8LVxcLiotKVxuXHRcdFx0cGF0dGVybjogLyhefFtePD5veC49LV0pKD86WzxveF0oPzo9PSt8LS0rfC1cXC4qLSlbPm94XT98KD86PT0rfC0tK3wtXFwuKi0pWz5veF18PT09K3wtLS0rfC1cXC4rLSkoPyFbPD5veC49LV0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gc2VxdWVuY2UgZGlhZ3JhbVxuXHRcdFx0cGF0dGVybjogLyhefFtePD4oKXgtXSkoPzotLT8oPzo+PnxbeD4pXSkoPyFbPD4oKXhdKXwoPzo8PHxbeDwoXSktLT8oPyEtKSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBjbGFzcyBkaWFncmFtXG5cdFx0XHRwYXR0ZXJuOiAvKF58W148Pnwqby4tXSkoPzpbKm9dLS18LS1bKm9dfDxcXHw/KD86LS18XFwuXFwuKXwoPzotLXxcXC5cXC4pXFx8Pz58LS18XFwuXFwuKSg/IVs8Pnwqby4tXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fSxcblx0XSxcblxuXHQnbGFiZWwnOiB7XG5cdFx0cGF0dGVybjogLyhefFtefDxdKVxcfCg/OlteXFxyXFxuXCJ8XXxcIlteXCJcXHJcXG5dKlwiKStcXHwvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cblx0J3RleHQnOiB7XG5cdFx0cGF0dGVybjogLyg/OlsoXFxbe10rfFxcYj4pKD86W15cXHJcXG5cIigpXFxbXFxde31dfFwiW15cIlxcclxcbl0qXCIpKyg/OlspXFxdfV0rfD4pLyxcblx0XHRhbGlhczogJ3N0cmluZydcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCJbXlwiXFxyXFxuXSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2Fubm90YXRpb24nOiB7XG5cdFx0cGF0dGVybjogLzw8KD86YWJzdHJhY3R8Y2hvaWNlfGVudW1lcmF0aW9ufGZvcmt8aW50ZXJmYWNlfGpvaW58c2VydmljZSk+PnxcXFtcXFsoPzpjaG9pY2V8Zm9ya3xqb2luKVxcXVxcXS9pLFxuXHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHR9LFxuXG5cdCdrZXl3b3JkJzogW1xuXHRcdC8vIFRoaXMgbGFuZ3VhZ2UgaGFzIGJvdGggY2FzZS1zZW5zaXRpdmUgYW5kIGNhc2UtaW5zZW5zaXRpdmUga2V5d29yZHNcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSg/OmFjdGlvbnxjYWxsYmFja3xjbGFzc3xjbGFzc0RlZnxjbGFzc0RpYWdyYW18Y2xpY2t8ZGlyZWN0aW9ufGVyRGlhZ3JhbXxmbG93Y2hhcnR8Z2FudHR8Z2l0R3JhcGh8Z3JhcGh8am91cm5leXxsaW5rfGxpbmtTdHlsZXxwaWV8cmVxdWlyZW1lbnREaWFncmFtfHNlcXVlbmNlRGlhZ3JhbXxzdGF0ZURpYWdyYW18c3RhdGVEaWFncmFtLXYyfHN0eWxlfHN1YmdyYXBoKSg/IVtcXHckLV0pL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSg/OmFjdGl2YXRlfGFsdHxhbmR8YXN8YXV0b251bWJlcnxkZWFjdGl2YXRlfGVsc2V8ZW5kKD86WyBcXHRdK25vdGUpP3xsb29wfG9wdHxwYXJ8cGFydGljaXBhbnR8cmVjdHxzdGF0ZXxub3RlWyBcXHRdKyg/Om92ZXJ8KD86bGVmdHxyaWdodClbIFxcdF0rb2YpKSg/IVtcXHckLV0pL2ltLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblxuXHQnZW50aXR5JzogLyNbYS16MC05XSs7LyxcblxuXHQnb3BlcmF0b3InOiB7XG5cdFx0cGF0dGVybjogLyhcXHdbIFxcdF0qKSYoPz1bIFxcdF0qXFx3KXw6Ojp8Oi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvWygpe307XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5taXphciA9IHtcblx0J2NvbW1lbnQnOiAvOjouKy8sXG5cdCdrZXl3b3JkJzogL0Bwcm9vZlxcYnxcXGIoPzphY2NvcmRpbmd8YWdncmVnYXRlfGFsbHxhbmR8YW50b255bXxhcmV8YXN8YXNzb2NpYXRpdml0eXxhc3N1bWV8YXN5bW1ldHJ5fGF0dHJ8YmV8YmVnaW58YmVpbmd8Ynl8Y2FuY2VsZWR8Y2FzZXxjYXNlc3xjbHVzdGVycz98Y29oZXJlbmNlfGNvbW11dGF0aXZpdHl8Y29tcGF0aWJpbGl0eXxjb25uZWN0ZWRuZXNzfGNvbnNpZGVyfGNvbnNpc3RlbmN5fGNvbnN0cnVjdG9yc3xjb250cmFkaWN0aW9ufGNvcnJlY3RuZXNzfGRlZnxkZWZmdW5jfGRlZmluZXxkZWZpbml0aW9ucz98ZGVmcHJlZHxkb3xkb2VzfGVuZHxlbnZpcm9ufGVxdWFsc3xleHxleGFjdGx5fGV4aXN0ZW5jZXxmb3J8ZnJvbXxmdW5jfGdpdmVufGhlbmNlfGhlcmVieXxob2xkc3xpZGVtcG90ZW5jZXxpZGVudGl0eXxpZmY/fGltcGxpZXN8aW52b2x1dGl2ZW5lc3N8aXJyZWZsZXhpdml0eXxpc3xpdHxsZXR8bWVhbnN8bW9kZXxub258bm90fG5vdGF0aW9ucz98bm93fG9mfG9yfG90aGVyd2lzZXxvdmVyfHBlcnxwcmVkfHByZWZpeHxwcm9qZWN0aXZpdHl8cHJvb2Z8cHJvdmlkZWR8cXVhfHJlY29uc2lkZXJ8cmVkZWZpbmV8cmVkdWNlfHJlZHVjaWJpbGl0eXxyZWZsZXhpdml0eXxyZWdpc3RyYXRpb25zP3xyZXF1aXJlbWVudHN8cmVzZXJ2ZXxzY2h8c2NoZW1lcz98c2VjdGlvbnxzZWxlY3RvcnxzZXR8c2V0aG9vZHxzdHxzdHJ1Y3R8c3VjaHxzdXBwb3NlfHN5bW1ldHJ5fHN5bm9ueW18dGFrZXx0aGF0fHRoZXx0aGVufHRoZW9yZW1zP3x0aGVzaXN8dGh1c3x0b3x0cmFuc2l0aXZpdHl8dW5pcXVlbmVzc3x2b2NhYnVsYXIoPzppZXN8eSl8d2hlbnx3aGVyZXx3aXRofHdydClcXGIvLFxuXHQncGFyYW1ldGVyJzoge1xuXHRcdHBhdHRlcm46IC9cXCQoPzoxMHxcXGQpLyxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9LFxuXHQndmFyaWFibGUnOiAvXFxiXFx3Kyg/PTopLyxcblx0J251bWJlcic6IC8oPzpcXGJ8LSlcXGQrXFxiLyxcblx0J29wZXJhdG9yJzogL1xcLlxcLlxcLnwtPnwmfFxcLj89Lyxcblx0J3B1bmN0dWF0aW9uJzogL1xcKCN8I1xcKXxbLDo7XFxbXFxdKCl7fV0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIG9wZXJhdG9ycyA9IFtcblx0XHQvLyBxdWVyeSBhbmQgcHJvamVjdGlvblxuXHRcdCckZXEnLCAnJGd0JywgJyRndGUnLCAnJGluJywgJyRsdCcsICckbHRlJywgJyRuZScsICckbmluJywgJyRhbmQnLCAnJG5vdCcsICckbm9yJywgJyRvcicsXG5cdFx0JyRleGlzdHMnLCAnJHR5cGUnLCAnJGV4cHInLCAnJGpzb25TY2hlbWEnLCAnJG1vZCcsICckcmVnZXgnLCAnJHRleHQnLCAnJHdoZXJlJywgJyRnZW9JbnRlcnNlY3RzJyxcblx0XHQnJGdlb1dpdGhpbicsICckbmVhcicsICckbmVhclNwaGVyZScsICckYWxsJywgJyRlbGVtTWF0Y2gnLCAnJHNpemUnLCAnJGJpdHNBbGxDbGVhcicsICckYml0c0FsbFNldCcsXG5cdFx0JyRiaXRzQW55Q2xlYXInLCAnJGJpdHNBbnlTZXQnLCAnJGNvbW1lbnQnLCAnJGVsZW1NYXRjaCcsICckbWV0YScsICckc2xpY2UnLFxuXG5cdFx0Ly8gdXBkYXRlXG5cdFx0JyRjdXJyZW50RGF0ZScsICckaW5jJywgJyRtaW4nLCAnJG1heCcsICckbXVsJywgJyRyZW5hbWUnLCAnJHNldCcsICckc2V0T25JbnNlcnQnLCAnJHVuc2V0Jyxcblx0XHQnJGFkZFRvU2V0JywgJyRwb3AnLCAnJHB1bGwnLCAnJHB1c2gnLCAnJHB1bGxBbGwnLCAnJGVhY2gnLCAnJHBvc2l0aW9uJywgJyRzbGljZScsICckc29ydCcsICckYml0JyxcblxuXHRcdC8vIGFnZ3JlZ2F0aW9uIHBpcGVsaW5lIHN0YWdlc1xuXHRcdCckYWRkRmllbGRzJywgJyRidWNrZXQnLCAnJGJ1Y2tldEF1dG8nLCAnJGNvbGxTdGF0cycsICckY291bnQnLCAnJGN1cnJlbnRPcCcsICckZmFjZXQnLCAnJGdlb05lYXInLFxuXHRcdCckZ3JhcGhMb29rdXAnLCAnJGdyb3VwJywgJyRpbmRleFN0YXRzJywgJyRsaW1pdCcsICckbGlzdExvY2FsU2Vzc2lvbnMnLCAnJGxpc3RTZXNzaW9ucycsICckbG9va3VwJyxcblx0XHQnJG1hdGNoJywgJyRtZXJnZScsICckb3V0JywgJyRwbGFuQ2FjaGVTdGF0cycsICckcHJvamVjdCcsICckcmVkYWN0JywgJyRyZXBsYWNlUm9vdCcsICckcmVwbGFjZVdpdGgnLFxuXHRcdCckc2FtcGxlJywgJyRzZXQnLCAnJHNraXAnLCAnJHNvcnQnLCAnJHNvcnRCeUNvdW50JywgJyR1bmlvbldpdGgnLCAnJHVuc2V0JywgJyR1bndpbmQnLCAnJHNldFdpbmRvd0ZpZWxkcycsXG5cblx0XHQvLyBhZ2dyZWdhdGlvbiBwaXBlbGluZSBvcGVyYXRvcnNcblx0XHQnJGFicycsICckYWNjdW11bGF0b3InLCAnJGFjb3MnLCAnJGFjb3NoJywgJyRhZGQnLCAnJGFkZFRvU2V0JywgJyRhbGxFbGVtZW50c1RydWUnLCAnJGFuZCcsXG5cdFx0JyRhbnlFbGVtZW50VHJ1ZScsICckYXJyYXlFbGVtQXQnLCAnJGFycmF5VG9PYmplY3QnLCAnJGFzaW4nLCAnJGFzaW5oJywgJyRhdGFuJywgJyRhdGFuMicsXG5cdFx0JyRhdGFuaCcsICckYXZnJywgJyRiaW5hcnlTaXplJywgJyRic29uU2l6ZScsICckY2VpbCcsICckY21wJywgJyRjb25jYXQnLCAnJGNvbmNhdEFycmF5cycsICckY29uZCcsXG5cdFx0JyRjb252ZXJ0JywgJyRjb3MnLCAnJGRhdGVGcm9tUGFydHMnLCAnJGRhdGVUb1BhcnRzJywgJyRkYXRlRnJvbVN0cmluZycsICckZGF0ZVRvU3RyaW5nJywgJyRkYXlPZk1vbnRoJyxcblx0XHQnJGRheU9mV2VlaycsICckZGF5T2ZZZWFyJywgJyRkZWdyZWVzVG9SYWRpYW5zJywgJyRkaXZpZGUnLCAnJGVxJywgJyRleHAnLCAnJGZpbHRlcicsICckZmlyc3QnLFxuXHRcdCckZmxvb3InLCAnJGZ1bmN0aW9uJywgJyRndCcsICckZ3RlJywgJyRob3VyJywgJyRpZk51bGwnLCAnJGluJywgJyRpbmRleE9mQXJyYXknLCAnJGluZGV4T2ZCeXRlcycsXG5cdFx0JyRpbmRleE9mQ1AnLCAnJGlzQXJyYXknLCAnJGlzTnVtYmVyJywgJyRpc29EYXlPZldlZWsnLCAnJGlzb1dlZWsnLCAnJGlzb1dlZWtZZWFyJywgJyRsYXN0Jyxcblx0XHQnJGxhc3QnLCAnJGxldCcsICckbGl0ZXJhbCcsICckbG4nLCAnJGxvZycsICckbG9nMTAnLCAnJGx0JywgJyRsdGUnLCAnJGx0cmltJywgJyRtYXAnLCAnJG1heCcsXG5cdFx0JyRtZXJnZU9iamVjdHMnLCAnJG1ldGEnLCAnJG1pbicsICckbWlsbGlzZWNvbmQnLCAnJG1pbnV0ZScsICckbW9kJywgJyRtb250aCcsICckbXVsdGlwbHknLCAnJG5lJyxcblx0XHQnJG5vdCcsICckb2JqZWN0VG9BcnJheScsICckb3InLCAnJHBvdycsICckcHVzaCcsICckcmFkaWFuc1RvRGVncmVlcycsICckcmFuZ2UnLCAnJHJlZHVjZScsXG5cdFx0JyRyZWdleEZpbmQnLCAnJHJlZ2V4RmluZEFsbCcsICckcmVnZXhNYXRjaCcsICckcmVwbGFjZU9uZScsICckcmVwbGFjZUFsbCcsICckcmV2ZXJzZUFycmF5JywgJyRyb3VuZCcsXG5cdFx0JyRydHJpbScsICckc2Vjb25kJywgJyRzZXREaWZmZXJlbmNlJywgJyRzZXRFcXVhbHMnLCAnJHNldEludGVyc2VjdGlvbicsICckc2V0SXNTdWJzZXQnLCAnJHNldFVuaW9uJyxcblx0XHQnJHNpemUnLCAnJHNpbicsICckc2xpY2UnLCAnJHNwbGl0JywgJyRzcXJ0JywgJyRzdGREZXZQb3AnLCAnJHN0ZERldlNhbXAnLCAnJHN0cmNhc2VjbXAnLCAnJHN0ckxlbkJ5dGVzJyxcblx0XHQnJHN0ckxlbkNQJywgJyRzdWJzdHInLCAnJHN1YnN0ckJ5dGVzJywgJyRzdWJzdHJDUCcsICckc3VidHJhY3QnLCAnJHN1bScsICckc3dpdGNoJywgJyR0YW4nLFxuXHRcdCckdG9Cb29sJywgJyR0b0RhdGUnLCAnJHRvRGVjaW1hbCcsICckdG9Eb3VibGUnLCAnJHRvSW50JywgJyR0b0xvbmcnLCAnJHRvT2JqZWN0SWQnLCAnJHRvU3RyaW5nJyxcblx0XHQnJHRvTG93ZXInLCAnJHRvVXBwZXInLCAnJHRyaW0nLCAnJHRydW5jJywgJyR0eXBlJywgJyR3ZWVrJywgJyR5ZWFyJywgJyR6aXAnLCAnJGNvdW50JywgJyRkYXRlQWRkJyxcblx0XHQnJGRhdGVEaWZmJywgJyRkYXRlU3VidHJhY3QnLCAnJGRhdGVUcnVuYycsICckZ2V0RmllbGQnLCAnJHJhbmQnLCAnJHNhbXBsZVJhdGUnLCAnJHNldEZpZWxkJywgJyR1bnNldEZpZWxkJyxcblxuXHRcdC8vIGFnZ3JlZ2F0aW9uIHBpcGVsaW5lIHF1ZXJ5IG1vZGlmaWVyc1xuXHRcdCckY29tbWVudCcsICckZXhwbGFpbicsICckaGludCcsICckbWF4JywgJyRtYXhUaW1lTVMnLCAnJG1pbicsICckb3JkZXJieScsICckcXVlcnknLFxuXHRcdCckcmV0dXJuS2V5JywgJyRzaG93RGlza0xvYycsICckbmF0dXJhbCcsXG5cdF07XG5cblx0dmFyIGJ1aWx0aW5GdW5jdGlvbnMgPSBbXG5cdFx0J09iamVjdElkJyxcblx0XHQnQ29kZScsXG5cdFx0J0JpbkRhdGEnLFxuXHRcdCdEQlJlZicsXG5cdFx0J1RpbWVzdGFtcCcsXG5cdFx0J051bWJlckxvbmcnLFxuXHRcdCdOdW1iZXJEZWNpbWFsJyxcblx0XHQnTWF4S2V5Jyxcblx0XHQnTWluS2V5Jyxcblx0XHQnUmVnRXhwJyxcblx0XHQnSVNPRGF0ZScsXG5cdFx0J1VVSUQnLFxuXHRdO1xuXG5cdG9wZXJhdG9ycyA9IG9wZXJhdG9ycy5tYXAoZnVuY3Rpb24gKG9wZXJhdG9yKSB7XG5cdFx0cmV0dXJuIG9wZXJhdG9yLnJlcGxhY2UoJyQnLCAnXFxcXCQnKTtcblx0fSk7XG5cblx0dmFyIG9wZXJhdG9yc1NvdXJjZSA9ICcoPzonICsgb3BlcmF0b3JzLmpvaW4oJ3wnKSArICcpXFxcXGInO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5tb25nb2RiID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnamF2YXNjcmlwdCcsIHt9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdtb25nb2RiJywgJ3N0cmluZycsIHtcblx0XHQncHJvcGVydHknOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKD86KFtcIiddKSg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDF8KD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKikoPz1cXHMqOikvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdrZXl3b3JkJzogUmVnRXhwKCdeKFtcXCdcIl0pPycgKyBvcGVyYXRvcnNTb3VyY2UgKyAnKD86XFxcXDEpPyQnKVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLm1vbmdvZGIuc3RyaW5nLmluc2lkZSA9IHtcblx0XHR1cmw6IHtcblx0XHRcdC8vIHVybCBwYXR0ZXJuXG5cdFx0XHRwYXR0ZXJuOiAvaHR0cHM/OlxcL1xcL1stXFx3QDolLit+Iz1dezEsMjU2fVxcLlthLXowLTkoKV17MSw2fVxcYlstXFx3KClAOiUrLn4jPyYvPV0qL2ksXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdGVudGl0eToge1xuXHRcdFx0Ly8gaXB2NFxuXHRcdFx0cGF0dGVybjogL1xcYig/Oig/OlswMV0/XFxkXFxkP3wyWzAtNF1cXGR8MjVbMC01XSlcXC4pezN9KD86WzAxXT9cXGRcXGQ/fDJbMC00XVxcZHwyNVswLTVdKVxcYi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnbW9uZ29kYicsICdjb25zdGFudCcsIHtcblx0XHQnYnVpbHRpbic6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnXFxcXGIoPzonICsgYnVpbHRpbkZ1bmN0aW9ucy5qb2luKCd8JykgKyAnKVxcXFxiJyksXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fVxuXHR9KTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMubW9ua2V5ID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXiNSZW1cXHNbXFxzXFxTXSo/XiNFbmR8Jy4rL2ltLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIlteXCJcXHJcXG5dKlwiLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdH0sXG5cdCdwcmVwcm9jZXNzb3InOiB7XG5cdFx0cGF0dGVybjogLyheWyBcXHRdKikjLisvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXG5cdCdmdW5jdGlvbic6IC9cXGJcXHcrKD89XFwoKS8sXG5cdCd0eXBlLWNoYXInOiB7XG5cdFx0cGF0dGVybjogL1xcYls/JSMkXS8sXG5cdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHR9LFxuXHQnbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8oKD86XFwuXFwuKT8pKD86KD86XFxifFxcQi1cXC4/fFxcQlxcLilcXGQrKD86KD8hXFwuXFwuKVxcLlxcZCopP3xcXCRbXFxkYS1mXSspL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpBYnN0cmFjdHxBcnJheXxCb29sfENhc2V8Q2F0Y2h8Q2xhc3N8Q29uc3R8Q29udGludWV8RGVmYXVsdHxFYWNoaW58RWxzZXxFbHNlSWZ8RW5kfEVuZElmfEV4aXR8RXh0ZW5kc3xFeHRlcm58RmFsc2V8RmllbGR8RmluYWx8RmxvYXR8Rm9yfEZvcmV2ZXJ8RnVuY3Rpb258R2xvYmFsfElmfEltcGxlbWVudHN8SW1wb3J0fElubGluZXxJbnR8SW50ZXJmYWNlfExvY2FsfE1ldGhvZHxNb2R1bGV8TmV3fE5leHR8TnVsbHxPYmplY3R8UHJpdmF0ZXxQcm9wZXJ0eXxQdWJsaWN8UmVwZWF0fFJldHVybnxTZWxlY3R8U2VsZnxTdGVwfFN0cmljdHxTdHJpbmd8U3VwZXJ8VGhlbnxUaHJvd3xUb3xUcnVlfFRyeXxVbnRpbHxWb2lkfFdlbmR8V2hpbGUpXFxiL2ksXG5cdCdvcGVyYXRvcic6IC9cXC5cXC58PFs9Pl0/fD49P3w6Pz18KD86WytcXC0qXFwvJn58XXxcXGIoPzpNb2R8U2hsfFNocilcXGIpPT98XFxiKD86QW5kfE5vdHxPcilcXGIvaSxcblx0J3B1bmN0dWF0aW9uJzogL1suLDo7KClcXFtcXF1dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLm1vb25zY3JpcHQgPSB7XG5cdCdjb21tZW50JzogLy0tLiovLFxuXHQnc3RyaW5nJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8nW14nXSonfFxcWyg9KilcXFtbXFxzXFxTXSo/XFxdXFwxXFxdLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1wiW15cIl0qXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8jXFx7W157fV0qXFx9Lyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdtb29uc2NyaXB0Jzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKF4jXFx7KVtcXHNcXFNdKyg/PVxcfSkvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlb3dcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyNcXHt8XFx9Lyxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdF0sXG5cdCdjbGFzcy1uYW1lJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXFxiKD86Y2xhc3N8ZXh0ZW5kcylbIFxcdF0rKVxcdysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0Ly8gY2xhc3MtbGlrZSBuYW1lcyBzdGFydCB3aXRoIGEgY2FwaXRhbCBsZXR0ZXJcblx0XHQvXFxiW0EtWl1cXHcqL1xuXHRdLFxuXHQna2V5d29yZCc6IC9cXGIoPzpjbGFzc3xjb250aW51ZXxkb3xlbHNlfGVsc2VpZnxleHBvcnR8ZXh0ZW5kc3xmb3J8ZnJvbXxpZnxpbXBvcnR8aW58bG9jYWx8bmlsfHJldHVybnxzZWxmfHN1cGVyfHN3aXRjaHx0aGVufHVubGVzc3x1c2luZ3x3aGVufHdoaWxlfHdpdGgpXFxiLyxcblx0J3ZhcmlhYmxlJzogL0BAP1xcdyovLFxuXHQncHJvcGVydHknOiB7XG5cdFx0cGF0dGVybjogL1xcYig/IVxcZClcXHcrKD89Oil8KDopKD8hXFxkKVxcdysvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpfR3xfVkVSU0lPTnxhc3NlcnR8Y29sbGVjdGdhcmJhZ2V8Y29yb3V0aW5lXFwuKD86Y3JlYXRlfHJlc3VtZXxydW5uaW5nfHN0YXR1c3x3cmFwfHlpZWxkKXxkZWJ1Z1xcLig/OmRlYnVnfGdldGZlbnZ8Z2V0aG9va3xnZXRpbmZvfGdldGxvY2FsfGdldG1ldGF0YWJsZXxnZXRyZWdpc3RyeXxnZXR1cHZhbHVlfHNldGZlbnZ8c2V0aG9va3xzZXRsb2NhbHxzZXRtZXRhdGFibGV8c2V0dXB2YWx1ZXx0cmFjZWJhY2spfGRvZmlsZXxlcnJvcnxnZXRmZW52fGdldG1ldGF0YWJsZXxpb1xcLig/OmNsb3NlfGZsdXNofGlucHV0fGxpbmVzfG9wZW58b3V0cHV0fHBvcGVufHJlYWR8c3RkZXJyfHN0ZGlufHN0ZG91dHx0bXBmaWxlfHR5cGV8d3JpdGUpfGlwYWlyc3xsb2FkfGxvYWRmaWxlfGxvYWRzdHJpbmd8bWF0aFxcLig/OmFic3xhY29zfGFzaW58YXRhbnxhdGFuMnxjZWlsfGNvc3xjb3NofGRlZ3xleHB8Zmxvb3J8Zm1vZHxmcmV4cHxsZGV4cHxsb2d8bG9nMTB8bWF4fG1pbnxtb2RmfHBpfHBvd3xyYWR8cmFuZG9tfHJhbmRvbXNlZWR8c2lufHNpbmh8c3FydHx0YW58dGFuaCl8bW9kdWxlfG5leHR8b3NcXC4oPzpjbG9ja3xkYXRlfGRpZmZ0aW1lfGV4ZWN1dGV8ZXhpdHxnZXRlbnZ8cmVtb3ZlfHJlbmFtZXxzZXRsb2NhbGV8dGltZXx0bXBuYW1lKXxwYWNrYWdlXFwuKD86Y3BhdGh8bG9hZGVkfGxvYWRsaWJ8cGF0aHxwcmVsb2FkfHNlZWFsbCl8cGFpcnN8cGNhbGx8cHJpbnR8cmF3ZXF1YWx8cmF3Z2V0fHJhd3NldHxyZXF1aXJlfHNlbGVjdHxzZXRmZW52fHNldG1ldGF0YWJsZXxzdHJpbmdcXC4oPzpieXRlfGNoYXJ8ZHVtcHxmaW5kfGZvcm1hdHxnbWF0Y2h8Z3N1YnxsZW58bG93ZXJ8bWF0Y2h8cmVwfHJldmVyc2V8c3VifHVwcGVyKXx0YWJsZVxcLig/OmNvbmNhdHxpbnNlcnR8bWF4bnxyZW1vdmV8c29ydCl8dG9udW1iZXJ8dG9zdHJpbmd8dHlwZXx1bnBhY2t8eHBjYWxsKVxcYi8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdH1cblx0fSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnbnVtYmVyJzogLyg/OlxcQlxcLlxcZCt8XFxiXFxkK1xcLlxcZCt8XFxiXFxkKyg/PVtlRV0pKSg/OltlRV1bLStdP1xcZCspP1xcYnxcXGIoPzoweFthLWZBLUZcXGRdK3xcXGQrKSg/OlU/TEwpP1xcYi8sXG5cdCdvcGVyYXRvcic6IC9cXC57M318Wy09XT58fj18KD86Wy0rKi8lPD4hPV18XFwuXFwuKT0/fFs6I15dfFxcYig/OmFuZHxvcilcXGI9P3xcXGIoPzpub3QpXFxiLyxcblx0J3B1bmN0dWF0aW9uJzogL1suLCgpW1xcXXt9XFxcXF0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMubW9vbnNjcmlwdC5zdHJpbmdbMV0uaW5zaWRlLmludGVycG9sYXRpb24uaW5zaWRlLm1vb25zY3JpcHQuaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLm1vb25zY3JpcHQ7XG5cblByaXNtLmxhbmd1YWdlcy5tb29uID0gUHJpc20ubGFuZ3VhZ2VzLm1vb25zY3JpcHQ7XG5cbi8vIGh0dHBzOi8vZG9jcy5jb3VjaGJhc2UuY29tL3NlcnZlci9jdXJyZW50L24xcWwvbjFxbC1sYW5ndWFnZS1yZWZlcmVuY2UvaW5kZXguaHRtbFxuXG5QcmlzbS5sYW5ndWFnZXMubjFxbCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcKltcXHNcXFNdKj8oPzokfFxcKlxcLyl8LS0uKi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oW1wiJ10pKD86XFxcXFtcXHNcXFNdfCg/IVxcMSlbXlxcXFxdfFxcMVxcMSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdH0sXG5cdCdpZGVudGlmaWVyJzoge1xuXHRcdHBhdHRlcm46IC9gKD86XFxcXFtcXHNcXFNdfFteXFxcXGBdfGBgKSpgLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdH0sXG5cdCdwYXJhbWV0ZXInOiAvXFwkW1xcdy5dKy8sXG5cdC8vIGh0dHBzOi8vZG9jcy5jb3VjaGJhc2UuY29tL3NlcnZlci9jdXJyZW50L24xcWwvbjFxbC1sYW5ndWFnZS1yZWZlcmVuY2UvcmVzZXJ2ZWR3b3Jkcy5odG1sI24xcWwtcmVzZXJ2ZWQtd29yZHNcblx0J2tleXdvcmQnOiAvXFxiKD86QURWSVNFfEFMTHxBTFRFUnxBTkFMWVpFfEFTfEFTQ3xBVHxCRUdJTnxCSU5BUll8Qk9PTEVBTnxCUkVBS3xCVUNLRVR8QlVJTER8Qll8Q0FMTHxDQVNUfENMVVNURVJ8Q09MTEFURXxDT0xMRUNUSU9OfENPTU1JVHxDT01NSVRURUR8Q09OTkVDVHxDT05USU5VRXxDT1JSRUxBVEV8Q09SUkVMQVRFRHxDT1ZFUnxDUkVBVEV8Q1VSUkVOVHxEQVRBQkFTRXxEQVRBU0VUfERBVEFTVE9SRXxERUNMQVJFfERFQ1JFTUVOVHxERUxFVEV8REVSSVZFRHxERVNDfERFU0NSSUJFfERJU1RJTkNUfERPfERST1B8RUFDSHxFTEVNRU5UfEVYQ0VQVHxFWENMVURFfEVYRUNVVEV8RVhQTEFJTnxGRVRDSHxGSUxURVJ8RkxBVFRFTnxGTFVTSHxGT0xMT1dJTkd8Rk9SfEZPUkNFfEZST018RlRTfEZVTkNUSU9OfEdPTEFOR3xHUkFOVHxHUk9VUHxHUk9VUFN8R1NJfEhBU0h8SEFWSU5HfElGfElHTk9SRXxJTElLRXxJTkNMVURFfElOQ1JFTUVOVHxJTkRFWHxJTkZFUnxJTkxJTkV8SU5ORVJ8SU5TRVJUfElOVEVSU0VDVHxJTlRPfElTfElTT0xBVElPTnxKQVZBU0NSSVBUfEpPSU58S0VZfEtFWVN8S0VZU1BBQ0V8S05PV058TEFOR1VBR0V8TEFTVHxMRUZUfExFVHxMRVRUSU5HfExFVkVMfExJTUlUfExTTXxNQVB8TUFQUElOR3xNQVRDSEVEfE1BVEVSSUFMSVpFRHxNRVJHRXxNSU5VU3xNSVNTSU5HfE5BTUVTUEFDRXxORVNUfE5MfE5PfE5USF9WQUxVRXxOVUxMfE5VTExTfE5VTUJFUnxPQkpFQ1R8T0ZGU0VUfE9OfE9QVElPTnxPUFRJT05TfE9SREVSfE9USEVSU3xPVVRFUnxPVkVSfFBBUlNFfFBBUlRJVElPTnxQQVNTV09SRHxQQVRIfFBPT0x8UFJFQ0VESU5HfFBSRVBBUkV8UFJJTUFSWXxQUklWQVRFfFBSSVZJTEVHRXxQUk9CRXxQUk9DRURVUkV8UFVCTElDfFJBTkdFfFJBV3xSRUFMTXxSRURVQ0V8UkVOQU1FfFJFU1BFQ1R8UkVUVVJOfFJFVFVSTklOR3xSRVZPS0V8UklHSFR8Uk9MRXxST0xMQkFDS3xST1d8Uk9XU3xTQVRJU0ZJRVN8U0FWRVBPSU5UfFNDSEVNQXxTQ09QRXxTRUxFQ1R8U0VMRnxTRU1JfFNFVHxTSE9XfFNPTUV8U1RBUlR8U1RBVElTVElDU3xTVFJJTkd8U1lTVEVNfFRJRVN8VE98VFJBTnxUUkFOU0FDVElPTnxUUklHR0VSfFRSVU5DQVRFfFVOQk9VTkRFRHxVTkRFUnxVTklPTnxVTklRVUV8VU5LTk9XTnxVTk5FU1R8VU5TRVR8VVBEQVRFfFVQU0VSVHxVU0V8VVNFUnxVU0lOR3xWQUxJREFURXxWQUxVRXxWQUxVRVN8VklBfFZJRVd8V0hFUkV8V0hJTEV8V0lORE9XfFdJVEh8V09SS3xYT1IpXFxiL2ksXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCkvaSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86RkFMU0V8VFJVRSlcXGIvaSxcblx0J251bWJlcic6IC8oPzpcXGJcXGQrXFwufFxcQlxcLilcXGQrZVsrXFwtXT9cXGQrXFxifFxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkK1xcYi9pLFxuXHQnb3BlcmF0b3InOiAvWy0rKlxcLyVdfCE9fD09P3xcXHxcXHx8PFs+PV0/fD49P3xcXGIoPzpBTkR8QU5ZfEFSUkFZfEJFVFdFRU58Q0FTRXxFTFNFfEVORHxFVkVSWXxFWElTVFN8RklSU1R8SU58TElLRXxOT1R8T1J8VEhFTnxWQUxVRUR8V0hFTnxXSVRISU4pXFxiL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9bO1tcXF0oKSwue306XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5uNGpzID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnamF2YXNjcmlwdCcsIHtcblx0Ly8gS2V5d29yZHMgZnJvbSBONEpTIGxhbmd1YWdlIHNwZWM6IGh0dHBzOi8vbnVtYmVyZm91ci5naXRodWIuaW8vbjRqcy9zcGVjL040SlNTcGVjLmh0bWxcblx0J2tleXdvcmQnOiAvXFxiKD86QXJyYXl8YW55fGJvb2xlYW58YnJlYWt8Y2FzZXxjYXRjaHxjbGFzc3xjb25zdHxjb25zdHJ1Y3Rvcnxjb250aW51ZXxkZWJ1Z2dlcnxkZWNsYXJlfGRlZmF1bHR8ZGVsZXRlfGRvfGVsc2V8ZW51bXxleHBvcnR8ZXh0ZW5kc3xmYWxzZXxmaW5hbGx5fGZvcnxmcm9tfGZ1bmN0aW9ufGdldHxpZnxpbXBsZW1lbnRzfGltcG9ydHxpbnxpbnN0YW5jZW9mfGludGVyZmFjZXxsZXR8bW9kdWxlfG5ld3xudWxsfG51bWJlcnxwYWNrYWdlfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xyZXR1cm58c2V0fHN0YXRpY3xzdHJpbmd8c3VwZXJ8c3dpdGNofHRoaXN8dGhyb3d8dHJ1ZXx0cnl8dHlwZW9mfHZhcnx2b2lkfHdoaWxlfHdpdGh8eWllbGQpXFxiL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ240anMnLCAnY29uc3RhbnQnLCB7XG5cdC8vIEFubm90YXRpb25zIGluIE40SlMgc3BlYzogaHR0cHM6Ly9udW1iZXJmb3VyLmdpdGh1Yi5pby9uNGpzL3NwZWMvTjRKU1NwZWMuaHRtbCNfYW5ub3RhdGlvbnNcblx0J2Fubm90YXRpb24nOiB7XG5cdFx0cGF0dGVybjogL0ArXFx3Ky8sXG5cdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5uNGpzZCA9IFByaXNtLmxhbmd1YWdlcy5uNGpzO1xuXG5QcmlzbS5sYW5ndWFnZXNbJ25hbmQydGV0cmlzLWhkbCddID0ge1xuXHQnY29tbWVudCc6IC9cXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpLyxcblx0J2tleXdvcmQnOiAvXFxiKD86QlVJTFRJTnxDSElQfENMT0NLRUR8SU58T1VUfFBBUlRTKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J2Z1bmN0aW9uJzogL1xcYltBLVphLXpdW0EtWmEtejAtOV0qKD89XFwoKS8sXG5cdCdudW1iZXInOiAvXFxiXFxkK1xcYi8sXG5cdCdvcGVyYXRvcic6IC89fFxcLlxcLi8sXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLDpdL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBleHByZXNzaW9uRGVmID0gL1xce1teXFxyXFxuXFxbXFxde31dKlxcfS87XG5cblx0dmFyIHBhcmFtcyA9IHtcblx0XHQncXVvdGVkLXN0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIig/OlteXCJcXFxcXXxcXFxcLikqXCIvLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9LFxuXHRcdCdjb21tYW5kLXBhcmFtLWlkJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXHMpXFx3KzovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHJvcGVydHknXG5cdFx0fSxcblx0XHQnY29tbWFuZC1wYXJhbS12YWx1ZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogZXhwcmVzc2lvbkRlZixcblx0XHRcdFx0YWxpYXM6ICdzZWxlY3RvcicsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFtcXHQgXSlcXFMrLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJyxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXFMoPzouKlxcUyk/Lyxcblx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcicsXG5cdFx0XHR9XG5cdFx0XVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5uYW5pc2NyaXB0ID0ge1xuXHRcdC8vIDsgLi4uXG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXihbXFx0IF0qKTsuKi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHR9LFxuXHRcdC8vID4gLi4uXG5cdFx0Ly8gRGVmaW5lIGlzIGEgY29udHJvbCBsaW5lIHN0YXJ0aW5nIHdpdGggJz4nIGZvbGxvd2VkIGJ5IGEgd29yZCwgYSBzcGFjZSBhbmQgYSB0ZXh0LlxuXHRcdCdkZWZpbmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXj4uKy9tLFxuXHRcdFx0YWxpYXM6ICd0YWcnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCd2YWx1ZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF4+XFx3K1tcXHQgXSspKD8hXFxzKVtee31cXHJcXG5dKy8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQna2V5Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXj4pXFx3Ky8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Ly8gIyAuLi5cblx0XHQnbGFiZWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXihbXFx0IF0qKSNbXFx0IF0qXFx3K1tcXHQgXSokL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdyZWdleCdcblx0XHR9LFxuXHRcdCdjb21tYW5kJzoge1xuXHRcdFx0cGF0dGVybjogL14oW1xcdCBdKilAXFx3Kyg/PVtcXHQgXXwkKS4qL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbicsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NvbW1hbmQtbmFtZSc6IC9eQFxcdysvLFxuXHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBleHByZXNzaW9uRGVmLFxuXHRcdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ3NlbGVjdG9yJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnY29tbWFuZC1wYXJhbXMnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xccypcXFNbXFxzXFxTXSovLFxuXHRcdFx0XHRcdGluc2lkZTogcGFyYW1zXG5cdFx0XHRcdH0sXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvLyBHZW5lcmljIGlzIGFueSBsaW5lIHRoYXQgZG9lc24ndCBzdGFydCB3aXRoIG9wZXJhdG9yczogOz4jQFxuXHRcdCdnZW5lcmljLXRleHQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKVteI0A+O1xcc10uKi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdC8vIFxceyAuLi4gXFx9IC4uLiBcXFsgLi4uIFxcXSAuLi4gXFxcIlxuXHRcdFx0XHQnZXNjYXBlZC1jaGFyJzogL1xcXFxbe31cXFtcXF1cIl0vLFxuXHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBleHByZXNzaW9uRGVmLFxuXHRcdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ3NlbGVjdG9yJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnaW5saW5lLWNvbW1hbmQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xcW1tcXHQgXSpcXHdbXlxcclxcblxcW1xcXV0qXFxdLyxcblx0XHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdmdW5jdGlvbicsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnY29tbWFuZC1wYXJhbXMnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXlxcW1tcXHQgXSpcXHcrXFxiKVtcXHNcXFNdKyg/PVxcXSQpLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiBwYXJhbXNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQnY29tbWFuZC1wYXJhbS1uYW1lJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXFtbXFx0IF0qKVxcdysvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ25hbWUnLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdzdGFydC1zdG9wLWNoYXInOiAvW1xcW1xcXV0vLFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdFByaXNtLmxhbmd1YWdlcy5uYW5pID0gUHJpc20ubGFuZ3VhZ2VzWyduYW5pc2NyaXB0J107XG5cblx0LyoqIEB0eXBlZGVmIHtJbnN0YW5jZVR5cGU8aW1wb3J0KFwiLi9wcmlzbS1jb3JlXCIpW1wiVG9rZW5cIl0+fSBUb2tlbiAqL1xuXG5cdC8qKlxuXHQgKiBUaGlzIGhvb2sgaXMgdXNlZCB0byB2YWxpZGF0ZSBnZW5lcmljLXRleHQgdG9rZW5zIGZvciBiYWxhbmNlZCBicmFja2V0cy5cblx0ICogTWFyayB0b2tlbiBhcyBiYWQtbGluZSB3aGVuIGNvbnRhaW5zIG5vdCBiYWxhbmNlZCBicmFja2V0czoge30sW11cblx0ICovXG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0LyoqIEB0eXBlIHsoVG9rZW4gfCBzdHJpbmcpW119ICovXG5cdFx0dmFyIHRva2VucyA9IGVudi50b2tlbnM7XG5cdFx0dG9rZW5zLmZvckVhY2goZnVuY3Rpb24gKHRva2VuKSB7XG5cdFx0XHRpZiAodHlwZW9mIHRva2VuICE9PSAnc3RyaW5nJyAmJiB0b2tlbi50eXBlID09PSAnZ2VuZXJpYy10ZXh0Jykge1xuXHRcdFx0XHR2YXIgY29udGVudCA9IGdldFRleHRDb250ZW50KHRva2VuKTtcblx0XHRcdFx0aWYgKCFpc0JyYWNrZXRzQmFsYW5jZWQoY29udGVudCkpIHtcblx0XHRcdFx0XHR0b2tlbi50eXBlID0gJ2JhZC1saW5lJztcblx0XHRcdFx0XHR0b2tlbi5jb250ZW50ID0gY29udGVudDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0ZnVuY3Rpb24gaXNCcmFja2V0c0JhbGFuY2VkKGlucHV0KSB7XG5cdFx0dmFyIGJyYWNrZXRzID0gJ1tde30nO1xuXHRcdHZhciBzdGFjayA9IFtdO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBicmFja2V0ID0gaW5wdXRbaV07XG5cdFx0XHR2YXIgYnJhY2tldHNJbmRleCA9IGJyYWNrZXRzLmluZGV4T2YoYnJhY2tldCk7XG5cdFx0XHRpZiAoYnJhY2tldHNJbmRleCAhPT0gLTEpIHtcblx0XHRcdFx0aWYgKGJyYWNrZXRzSW5kZXggJSAyID09PSAwKSB7XG5cdFx0XHRcdFx0c3RhY2sucHVzaChicmFja2V0c0luZGV4ICsgMSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc3RhY2sucG9wKCkgIT09IGJyYWNrZXRzSW5kZXgpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHN0YWNrLmxlbmd0aCA9PT0gMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZyB8IFRva2VuIHwgKHN0cmluZyB8IFRva2VuKVtdfSB0b2tlblxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0VGV4dENvbnRlbnQodG9rZW4pIHtcblx0XHRpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHRva2VuO1xuXHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0b2tlbikpIHtcblx0XHRcdHJldHVybiB0b2tlbi5tYXAoZ2V0VGV4dENvbnRlbnQpLmpvaW4oJycpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZ2V0VGV4dENvbnRlbnQodG9rZW4uY29udGVudCk7XG5cdFx0fVxuXHR9XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLm5hc20gPSB7XG5cdCdjb21tZW50JzogLzsuKiQvbSxcblx0J3N0cmluZyc6IC8oW1wiJ2BdKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHQnbGFiZWwnOiB7XG5cdFx0cGF0dGVybjogLyheXFxzKilbQS1aYS16Ll8/JF1bXFx3Lj8kQH4jXSo6L20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQna2V5d29yZCc6IFtcblx0XHQvXFxbP0JJVFMgKD86MTZ8MzJ8NjQpXFxdPy8sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyheXFxzKilzZWN0aW9uXFxzKlthLXouXSs6Py9pbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC8oPzpleHRlcm58Z2xvYmFsKVteO1xcclxcbl0qL2ksXG5cdFx0Lyg/OkNQVXxERUZBVUxUfEZMT0FUKS4qJC9tXG5cdF0sXG5cdCdyZWdpc3Rlcic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86c3RcXGR8W3h5el1tbVxcZFxcZD98W2NkdF1yXFxkfHJcXGRcXGQ/W2J3ZF0/fFtlcl0/W2FiY2RdeHxbYWJjZF1baGxdfFtlcl0/KD86YnB8ZGl8c2l8c3ApfFtjZGVmZ3NdcylcXGIvaSxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9LFxuXHQnbnVtYmVyJzogLyg/OlxcYnwoPz1cXCQpKSg/OjBbaHhdKD86XFwuW1xcZGEtZl0rfFtcXGRhLWZdKyg/OlxcLltcXGRhLWZdKyk/KSg/OnBbKy1dP1xcZCspP3xcXGRbXFxkYS1mXStbaHhdfFxcJFxcZFtcXGRhLWZdKnwwW29xXVswLTddK3xbMC03XStbb3FdfDBbYnldWzAxXSt8WzAxXStbYnldfDBbZHRdXFxkK3woPzpcXGQrKD86XFwuXFxkKyk/fFxcLlxcZCspKD86XFwuP2VbKy1dP1xcZCspP1tkdF0/KVxcYi9pLFxuXHQnb3BlcmF0b3InOiAvW1xcW1xcXSorXFwtXFwvJTw+PSZ8JCFdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLm5lb24gPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8jLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnZGF0ZXRpbWUnOiB7XG5cdFx0cGF0dGVybjogLyhefFtbeyg9OixcXHNdKVxcZFxcZFxcZFxcZC1cXGRcXGQ/LVxcZFxcZD8oPzooPzpbVHRdfCArKVxcZFxcZD86XFxkXFxkOlxcZFxcZCg/OlxcLlxcZCopPyAqKD86WnxbLStdXFxkXFxkPyg/Ojo/XFxkXFxkKT8pPyk/KD89JHxbXFxdfSksXFxzXSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdCdrZXknOiB7XG5cdFx0cGF0dGVybjogLyhefFtbeygsXFxzXSlbXiw6PVtcXF17fSgpJ1wiXFxzXSsoPz1cXHMqOig/OiR8W1xcXX0pLFxcc10pfFxccyo9KS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXHQnbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbW3soPTosXFxzXSlbKy1dPyg/OjB4W1xcZGEtZkEtRl0rfDBvWzAtN10rfDBiWzAxXSt8KD86XFxkKyg/OlxcLlxcZCopP3xcXC4/XFxkKykoPzpbZUVdWystXT9cXGQrKT8pKD89JHxbXFxdfSksOj1cXHNdKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnYm9vbGVhbic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W1t7KD06LFxcc10pKD86ZmFsc2V8bm98dHJ1ZXx5ZXMpKD89JHxbXFxdfSksOj1cXHNdKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J251bGwnOiB7XG5cdFx0cGF0dGVybjogLyhefFtbeyg9OixcXHNdKSg/Om51bGwpKD89JHxbXFxdfSksOj1cXHNdKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbW3soPTosXFxzXSkoPzooJycnfFwiXCJcIilcXHI/XFxuKD86KD86W15cXHJcXG5dfFxccj9cXG4oPyFbXFx0IF0qXFwyKSkqXFxyP1xcbik/W1xcdCBdKlxcMnwnW14nXFxyXFxuXSonfFwiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcIikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdsaXRlcmFsJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbW3soPTosXFxzXSkoPzpbXiNcIicsOj1bXFxde30oKVxcc2AtXXxbOi1dW15cIicsPVtcXF17fSgpXFxzXSkoPzpbXiw6PVxcXX0pKFxcc118Oig/IVtcXHMsXFxdfSldfCQpfFsgXFx0XStbXiMsOj1cXF19KShcXHNdKSovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvWyw6PVtcXF17fSgpLV0vLFxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLm5ldm9kID0ge1xuXHQnY29tbWVudCc6IC9cXC9cXC8uKnwoPzpcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpKS8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyg/OlwiKD86XCJcInxbXlwiXSkqXCIoPyFcIil8Jyg/OicnfFteJ10pKicoPyEnKSkhP1xcKj8vLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdzdHJpbmctYXR0cnMnOiAvISR8IVxcKiR8XFwqJC8sXG5cdFx0fSxcblx0fSxcblx0J25hbWVzcGFjZSc6IHtcblx0XHRwYXR0ZXJuOiAvKEBuYW1lc3BhY2VcXHMrKVthLXpBLVowLTlcXC0uXSsoPz1cXHMqXFx7KS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0fSxcblx0J3BhdHRlcm4nOiB7XG5cdFx0cGF0dGVybjogLyhAcGF0dGVyblxccyspPyM/W2EtekEtWjAtOVxcLS5dKyg/OlxccypcXChcXHMqKD86flxccyopP1thLXpBLVowLTlcXC0uXStcXHMqKD86LFxccyooPzp+XFxzKik/W2EtekEtWjAtOVxcLS5dKikqXFwpKT8oPz1cXHMqPSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncGF0dGVybi1uYW1lJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXiM/W2EtekEtWjAtOVxcLS5dKy8sXG5cdFx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZScsXG5cdFx0XHR9LFxuXHRcdFx0J2ZpZWxkcyc6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcKC4qXFwpLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ZpZWxkLW5hbWUnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvW2EtekEtWjAtOVxcLS5dKy8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bLCgpXS8sXG5cdFx0XHRcdFx0J29wZXJhdG9yJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL34vLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdmaWVsZC1oaWRkZW4tbWFyaycsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0fSxcblx0fSxcblx0J3NlYXJjaCc6IHtcblx0XHRwYXR0ZXJuOiAvKEBzZWFyY2hcXHMrfCMpW2EtekEtWjAtOVxcLS5dKyg/OlxcLlxcKik/KD89XFxzKjspLyxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHR9LFxuXHQna2V5d29yZCc6IC9AKD86aGF2aW5nfGluc2lkZXxuYW1lc3BhY2V8b3V0c2lkZXxwYXR0ZXJufHJlcXVpcmV8c2VhcmNofHdoZXJlKVxcYi8sXG5cdCdzdGFuZGFyZC1wYXR0ZXJuJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpBbHBoYXxBbHBoYU51bXxBbnl8Qmxhbmt8RW5kfExpbmVCcmVha3xOdW18TnVtQWxwaGF8UHVuY3R8U3BhY2V8U3RhcnR8U3ltYm9sfFdvcmR8V29yZEJyZWFrKVxcYig/OlxcKFthLXpBLVowLTlcXC0uLFxccytdKlxcKSk/Lyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdzdGFuZGFyZC1wYXR0ZXJuLW5hbWUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eW2EtekEtWjAtOVxcLS5dKy8sXG5cdFx0XHRcdGFsaWFzOiAnYnVpbHRpbicsXG5cdFx0XHR9LFxuXHRcdFx0J3F1YW50aWZpZXInOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXGJcXGQrKD86XFxzKlxcK3xcXHMqLVxccypcXGQrKT8oPyFcXHcpLyxcblx0XHRcdFx0YWxpYXM6ICdudW1iZXInLFxuXHRcdFx0fSxcblx0XHRcdCdzdGFuZGFyZC1wYXR0ZXJuLWF0dHInOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9bYS16QS1aMC05XFwtLl0rLyxcblx0XHRcdFx0YWxpYXM6ICdidWlsdGluJyxcblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvWywoKV0vLFxuXHRcdH0sXG5cdH0sXG5cdCdxdWFudGlmaWVyJzoge1xuXHRcdHBhdHRlcm46IC9cXGJcXGQrKD86XFxzKlxcK3xcXHMqLVxccypcXGQrKT8oPyFcXHcpLyxcblx0XHRhbGlhczogJ251bWJlcicsXG5cdH0sXG5cdCdvcGVyYXRvcic6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvPS8sXG5cdFx0XHRhbGlhczogJ3BhdHRlcm4tZGVmJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8mLyxcblx0XHRcdGFsaWFzOiAnY29uanVuY3Rpb24nLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL34vLFxuXHRcdFx0YWxpYXM6ICdleGNlcHRpb24nLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcPy8sXG5cdFx0XHRhbGlhczogJ29wdGlvbmFsaXR5Jyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9bW1xcXV0vLFxuXHRcdFx0YWxpYXM6ICdyZXBldGl0aW9uJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9be31dLyxcblx0XHRcdGFsaWFzOiAndmFyaWF0aW9uJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9bK19dLyxcblx0XHRcdGFsaWFzOiAnc2VxdWVuY2UnLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcLnsyLDN9Lyxcblx0XHRcdGFsaWFzOiAnc3BhbicsXG5cdFx0fSxcblx0XSxcblx0J2ZpZWxkLWNhcHR1cmUnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhbYS16QS1aMC05XFwtLl0rXFxzKlxcKClcXHMqW2EtekEtWjAtOVxcLS5dK1xccyo6XFxzKlthLXpBLVowLTlcXC0uXSsoPzpcXHMqLFxccypbYS16QS1aMC05XFwtLl0rXFxzKjpcXHMqW2EtekEtWjAtOVxcLS5dKykqKD89XFxzKlxcKSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZmllbGQtbmFtZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvW2EtekEtWjAtOVxcLS5dKy8sXG5cdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdjb2xvbic6IC86Lyxcblx0XHRcdH0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvW2EtekEtWjAtOVxcLS5dK1xccyo6Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZmllbGQtbmFtZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvW2EtekEtWjAtOVxcLS5dKy8sXG5cdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdjb2xvbic6IC86Lyxcblx0XHRcdH0sXG5cdFx0fSxcblx0XSxcblx0J3B1bmN0dWF0aW9uJzogL1s6OywoKV0vLFxuXHQnbmFtZSc6IC9bYS16QS1aMC05XFwtLl0rL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciB2YXJpYWJsZSA9IC9cXCQoPzpcXHdbYS16XFxkXSooPzpfW15cXHgwMC1cXHgxRlxcc1wiJ1xcXFwoKSRdKik/fFxce1tefVxcc1wiJ1xcXFxdK1xcfSkvaTtcblxuXHRQcmlzbS5sYW5ndWFnZXMubmdpbnggPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W1xcc3t9O10pIy4qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdkaXJlY3RpdmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVxcdyg/OlteO3t9XCInXFxcXFxcc118XFxcXC58XCIoPzpbXlwiXFxcXF18XFxcXC4pKlwifCcoPzpbXidcXFxcXXxcXFxcLikqJ3xcXHMrKD86Iy4qKD8hLil8KD8hWyNcXHNdKSkpKj8oPz1cXHMqWzt7XSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnc3RyaW5nJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXlxcXFxdKSg/OlxcXFxcXFxcKSopKD86XCIoPzpbXlwiXFxcXF18XFxcXC4pKlwifCcoPzpbXidcXFxcXXxcXFxcLikqJykvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J2VzY2FwZSc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL1xcXFxbXCInXFxcXG5ydF0vLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ2VudGl0eSdcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQndmFyaWFibGUnOiB2YXJpYWJsZVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhcXHMpIy4qLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQna2V5d29yZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcUysvLFxuXHRcdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIG90aGVyIHBhdHRlcm5zXG5cblx0XHRcdFx0J2Jvb2xlYW4nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhcXHMpKD86b2ZmfG9uKSg/IVxcUykvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J251bWJlcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxccylcXGQrW2Etel0qKD8hXFxTKS9pLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J3ZhcmlhYmxlJzogdmFyaWFibGVcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdwdW5jdHVhdGlvbic6IC9be307XS9cblx0fTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMubmltID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvIy4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHQvLyBEb3VibGUtcXVvdGVkIHN0cmluZ3MgY2FuIGJlIHByZWZpeGVkIGJ5IGFuIGlkZW50aWZpZXIgKEdlbmVyYWxpemVkIHJhdyBzdHJpbmcgbGl0ZXJhbHMpXG5cdFx0cGF0dGVybjogLyg/OlxcYig/IVxcZCkoPzpcXHd8XFxcXHhbODlhLWZBLUZdWzAtOWEtZkEtRl0pKyk/KD86XCJcIlwiW1xcc1xcU10qP1wiXCJcIig/IVwiKXxcIig/OlxcXFxbXFxzXFxTXXxcIlwifFteXCJcXFxcXSkqXCIpLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NoYXInOiB7XG5cdFx0Ly8gQ2hhcmFjdGVyIGxpdGVyYWxzIGFyZSBoYW5kbGVkIHNwZWNpZmljYWxseSB0byBwcmV2ZW50IGlzc3VlcyB3aXRoIG51bWVyaWMgdHlwZSBzdWZmaXhlc1xuXHRcdHBhdHRlcm46IC8nKD86XFxcXCg/OlxcZCt8eFtcXGRhLWZBLUZdezAsMn18Lil8W14nXSknLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLyg/Oig/IVxcZCkoPzpcXHd8XFxcXHhbODlhLWZBLUZdWzAtOWEtZkEtRl0pK3xgW15gXFxyXFxuXStgKVxcKj8oPzpcXFtbXlxcXV0rXFxdKT8oPz1cXHMqXFwoKS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J29wZXJhdG9yJzogL1xcKiQvXG5cdFx0fVxuXHR9LFxuXHQvLyBXZSBkb24ndCB3YW50IHRvIGhpZ2hsaWdodCBvcGVyYXRvcnMgKGFuZCBhbnl0aGluZyByZWFsbHkpIGluc2lkZSBiYWNrdGlja3Ncblx0J2lkZW50aWZpZXInOiB7XG5cdFx0cGF0dGVybjogL2BbXmBcXHJcXG5dK2AvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9gL1xuXHRcdH1cblx0fSxcblxuXHQvLyBUaGUgbmVnYXRpdmUgbG9vayBhaGVhZCBwcmV2ZW50cyB3cm9uZyBoaWdobGlnaHRpbmcgb2YgdGhlIC4uIG9wZXJhdG9yXG5cdCdudW1iZXInOiAvXFxiKD86MFt4WG9PYkJdW1xcZGEtZkEtRl9dK3xcXGRbXFxkX10qKD86KD8hXFwuXFwuKVxcLltcXGRfXSopPyg/OltlRV1bKy1dP1xcZFtcXGRfXSopPykoPzonP1tpdWZdXFxkKik/Lyxcblx0J2tleXdvcmQnOiAvXFxiKD86YWRkcnxhc3xhc218YXRvbWljfGJpbmR8YmxvY2t8YnJlYWt8Y2FzZXxjYXN0fGNvbmNlcHR8Y29uc3R8Y29udGludWV8Y29udmVydGVyfGRlZmVyfGRpc2NhcmR8ZGlzdGluY3R8ZG98ZWxpZnxlbHNlfGVuZHxlbnVtfGV4Y2VwdHxleHBvcnR8ZmluYWxseXxmb3J8ZnJvbXxmdW5jfGdlbmVyaWN8aWZ8aW1wb3J0fGluY2x1ZGV8aW50ZXJmYWNlfGl0ZXJhdG9yfGxldHxtYWNyb3xtZXRob2R8bWl4aW58bmlsfG9iamVjdHxvdXR8cHJvY3xwdHJ8cmFpc2V8cmVmfHJldHVybnxzdGF0aWN8dGVtcGxhdGV8dHJ5fHR1cGxlfHR5cGV8dXNpbmd8dmFyfHdoZW58d2hpbGV8d2l0aHx3aXRob3V0fHlpZWxkKVxcYi8sXG5cdCdvcGVyYXRvcic6IHtcblx0XHQvLyBMb29rIGJlaGluZCBhbmQgbG9vayBhaGVhZCBwcmV2ZW50IHdyb25nIGhpZ2hsaWdodGluZyBvZiBwdW5jdHVhdGlvbnMgWy4gLl0gey4gLn0gKC4gLilcblx0XHQvLyBidXQgYWxsb3cgdGhlIHNsaWNlIG9wZXJhdG9yIC4uIHRvIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZW1cblx0XHQvLyBPbmUgY2FuIGRlZmluZSBoaXMgb3duIG9wZXJhdG9ycyBpbiBOaW0gc28gYWxsIGNvbWJpbmF0aW9uIG9mIG9wZXJhdG9ycyBtaWdodCBiZSBhbiBvcGVyYXRvci5cblx0XHRwYXR0ZXJuOiAvKF58Wyh7XFxbXSg/PVxcLlxcLil8KD8hWyh7XFxbXVxcLikuKSg/Oig/Ols9K1xcLSpcXC88PkAkfiYlfCE/XjpcXFxcXXxcXC5cXC58XFwuKD8hWyl9XFxdXSkpK3xcXGIoPzphbmR8ZGl2fGlufGlzfGlzbm90fG1vZHxub3R8bm90aW58b2Z8b3J8c2hsfHNocnx4b3IpXFxiKS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3B1bmN0dWF0aW9uJzogL1soe1xcW11cXC58XFwuWyl9XFxdXXxbYCgpe31cXFtcXF0sOl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMubml4ID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwqW1xcc1xcU10qP1xcKlxcL3wjLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXCJcXFxcXXxcXFxcW1xcc1xcU10pKlwifCcnKD86KD8hJycpW1xcc1xcU118JycoPzonfFxcXFx8XFwkXFx7KSkqJycvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHQvLyBUaGUgbG9va2JlaGluZCBlbnN1cmVzIHRoZSAke30gaXMgbm90IHByZWNlZGVkIGJ5IFxcIG9yICcnXG5cdFx0XHRcdHBhdHRlcm46IC8oXnwoPzpefCg/IScnKS4pW15cXFxcXSlcXCRcXHsoPzpbXnt9XXxcXHtbXn1dKlxcfSkqXFx9Lyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J3VybCc6IFtcblx0XHQvXFxiKD86W2Etel17Myw3fTpcXC9cXC8pW1xcd1xcLSslflxcLy46Iz0/Jl0rLyxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFteXFwvXSkoPzpbXFx3XFwtKyV+LjojPT8mXSooPyFcXC9cXC8pW1xcd1xcLSslflxcLy46Iz0/Jl0pPyg/IVxcL1xcLylcXC9bXFx3XFwtKyV+XFwvLjojPT8mXSovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J2FudGlxdW90YXRpb24nOiB7XG5cdFx0cGF0dGVybjogL1xcJCg/PVxceykvLFxuXHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHR9LFxuXHQnbnVtYmVyJzogL1xcYlxcZCtcXGIvLFxuXHQna2V5d29yZCc6IC9cXGIoPzphc3NlcnR8YnVpbHRpbnN8ZWxzZXxpZnxpbnxpbmhlcml0fGxldHxudWxsfG9yfHRoZW58d2l0aClcXGIvLFxuXHQnZnVuY3Rpb24nOiAvXFxiKD86YWJvcnR8YWRkfGFsbHxhbnl8YXR0ck5hbWVzfGF0dHJWYWx1ZXN8YmFzZU5hbWVPZnxjb21wYXJlVmVyc2lvbnN8Y29uY2F0TGlzdHN8Y3VycmVudFN5c3RlbXxkZWVwU2VxfGRlcml2YXRpb258ZGlyT2Z8ZGl2fGVsZW0oPzpBdCk/fGZldGNoKD86VGFyYmFsbHx1cmwpfGZpbHRlcig/OlNvdXJjZSk/fGZyb21KU09OfGdlbkxpc3R8Z2V0QXR0cnxnZXRFbnZ8aGFzQXR0cnxoYXNoU3RyaW5nfGhlYWR8aW1wb3J0fGludGVyc2VjdEF0dHJzfGlzKD86QXR0cnN8Qm9vbHxGdW5jdGlvbnxJbnR8TGlzdHxOdWxsfFN0cmluZyl8bGVuZ3RofGxlc3NUaGFufGxpc3RUb0F0dHJzfG1hcHxtdWx8cGFyc2VEcnZOYW1lfHBhdGhFeGlzdHN8cmVhZCg/OkRpcnxGaWxlKXxyZW1vdmVBdHRyc3xyZXBsYWNlU3RyaW5nc3xzZXF8c29ydHxzdHJpbmdMZW5ndGh8c3ViKD86c3RyaW5nKT98dGFpbHx0aHJvd3x0byg/OkZpbGV8SlNPTnxQYXRofFN0cmluZ3xYTUwpfHRyYWNlfHR5cGVPZilcXGJ8XFxiZm9sZGwnXFxCLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnb3BlcmF0b3InOiAvWz0hPD5dPT98XFwrXFwrP3xcXHxcXHx8JiZ8XFwvXFwvfC0+P3xbP0BdLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fSgpW1xcXS4sOjtdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLm5peC5zdHJpbmcuaW5zaWRlLmludGVycG9sYXRpb24uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLm5peDtcblxuLyoqXG4gKiBPcmlnaW5hbCBieSBKYW4gVC4gU290dCAoaHR0cDovL2dpdGh1Yi5jb20vaWRsZWJlcmcpXG4gKlxuICogSW5jbHVkZXMgYWxsIGNvbW1hbmRzIGFuZCBwbHVnLWlucyBzaGlwcGVkIHdpdGggTlNJUyAzLjA4XG4gKi9cblByaXNtLmxhbmd1YWdlcy5uc2lzID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkoPzpcXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFsjO10uKikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhcInwnKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSg/OkFib3J0fEFkZCg/OkJyYW5kaW5nSW1hZ2V8U2l6ZSl8QWR2U3BsYXNofEFsbG93KD86Um9vdERpckluc3RhbGx8U2tpcEZpbGVzKXxBdXRvQ2xvc2VXaW5kb3d8QkcoPzpGb250fEdyYWRpZW50fEltYWdlKXxCYW5uZXJ8QnJhbmRpbmdUZXh0fEJyaW5nVG9Gcm9udHxDUkNDaGVja3xDYWxsKD86SW5zdERMTCk/fENhcHRpb258Q2hhbmdlVUl8Q2hlY2tCaXRtYXB8Q2xlYXJFcnJvcnN8Q29tcGxldGVkVGV4dHxDb21wb25lbnRUZXh0fENvcHlGaWxlc3xDcmVhdGUoPzpEaXJlY3Rvcnl8Rm9udHxTaG9ydEN1dCl8RGVsZXRlKD86SU5JU2VjfElOSVN0cnxSZWdLZXl8UmVnVmFsdWUpP3xEZXRhaWwoPzpQcmludHxzQnV0dG9uVGV4dCl8RGlhbGVyfERpcig/OlRleHR8VmFyfFZlcmlmeSl8RW5hYmxlV2luZG93fEVudW0oPzpSZWdLZXl8UmVnVmFsdWUpfEV4Y2h8RXhlYyg/OlNoZWxsKD86V2FpdCk/fFdhaXQpP3xFeHBhbmRFbnZTdHJpbmdzfEZpbGUoPzpCdWZTaXplfENsb3NlfEVycm9yVGV4dHxPcGVufFJlYWR8UmVhZEJ5dGV8UmVhZFVURjE2TEV8UmVhZFdvcmR8U2Vla3xXcml0ZXxXcml0ZUJ5dGV8V3JpdGVVVEYxNkxFfFdyaXRlV29yZCk/fEZpbmQoPzpDbG9zZXxGaXJzdHxOZXh0fFdpbmRvdyl8Rmx1c2hJTkl8R2V0KD86Q3VySW5zdFR5cGV8Q3VycmVudEFkZHJlc3N8RExMVmVyc2lvbig/OkxvY2FsKT98RGxnSXRlbXxFcnJvckxldmVsfEZpbGVUaW1lKD86TG9jYWwpP3xGdWxsUGF0aE5hbWV8RnVuY3Rpb24oPzpBZGRyZXNzfEVuZCk/fEluc3REaXJFcnJvcnxMYWJlbEFkZHJlc3N8VGVtcEZpbGVOYW1lKXxHb3RvfEhpZGVXaW5kb3d8SWNvbnxJZig/OkFib3J0fEVycm9yc3xGaWxlRXhpc3RzfFJlYm9vdEZsYWd8U2lsZW50KXxJbml0UGx1Z2luc0RpcnxJbnN0UHJvZ3Jlc3NGbGFnc3xJbnN0KD86VHlwZSg/OkdldFRleHR8U2V0VGV4dCk/KXxJbnN0YWxsKD86QnV0dG9uVGV4dHxDb2xvcnN8RGlyKD86UmVnS2V5KT8pfEludCg/OjY0fFB0cik/Q21wVT98SW50KD86NjQpP0ZtdHxJbnQoPzpQdHIpP09wfElzV2luZG93fExhbmcoPzpETEx8U3RyaW5nKXxMaWNlbnNlKD86QmtDb2xvcnxEYXRhfEZvcmNlU2VsZWN0aW9ufExhbmdTdHJpbmd8VGV4dCl8TG9hZExhbmd1YWdlRmlsZXxMb2NrV2luZG93fExvZyg/OlNldHxUZXh0KXxNYW5pZmVzdCg/OkRQSUF3YXJlfFN1cHBvcnRlZE9TKXxNYXRofE1lc3NhZ2VCb3h8TWlzY0J1dHRvblRleHR8TlNJU2RsfE5hbWV8Tm9wfE91dEZpbGV8UEUoPzpEbGxDaGFyYWN0ZXJpc3RpY3N8U3Vic3lzVmVyKXxQYWdlKD86Q2FsbGJhY2tzKT98UG9wfFB1c2h8UXVpdHxSTURpcnxSZWFkKD86RW52U3RyfElOSVN0cnxSZWdEV09SRHxSZWdTdHIpfFJlYm9vdHxSZWdETEx8UmVuYW1lfFJlcXVlc3RFeGVjdXRpb25MZXZlbHxSZXNlcnZlRmlsZXxSZXR1cm58U2VhcmNoUGF0aHxTZWN0aW9uKD86RW5kfEdldEZsYWdzfEdldEluc3RUeXBlc3xHZXRTaXplfEdldFRleHR8R3JvdXB8SW58U2V0RmxhZ3N8U2V0SW5zdFR5cGVzfFNldFNpemV8U2V0VGV4dCk/fFNlbmRNZXNzYWdlfFNldCg/OkF1dG9DbG9zZXxCcmFuZGluZ0ltYWdlfENvbXByZXNzfENvbXByZXNzb3IoPzpEaWN0U2l6ZSk/fEN0bENvbG9yc3xDdXJJbnN0VHlwZXxEYXRhYmxvY2tPcHRpbWl6ZXxEYXRlU2F2ZXxEZXRhaWxzKD86UHJpbnR8Vmlldyl8RXJyb3JMZXZlbHxFcnJvcnN8RmlsZUF0dHJpYnV0ZXN8Rm9udHxPdXRQYXRofE92ZXJ3cml0ZXxQbHVnaW5VbmxvYWR8UmVib290RmxhZ3xSZWdWaWV3fFNoZWxsVmFyQ29udGV4dHxTaWxlbnQpfFNob3coPzpJbnN0RGV0YWlsc3xVbmluc3REZXRhaWxzfFdpbmRvdyl8U2lsZW50KD86SW5zdGFsbHxVbkluc3RhbGwpfFNsZWVwfFNwYWNlVGV4dHN8U3BsYXNofFN0YXJ0TWVudXxTdHIoPzpDbXBTP3xDcHl8TGVuKXxTdWJDYXB0aW9ufFN5c3RlbXxVblJlZ0RMTHxVbmljb2RlfFVuaW5zdFBhZ2V8VW5pbnN0YWxsKD86QnV0dG9uVGV4dHxDYXB0aW9ufEljb258U3ViQ2FwdGlvbnxUZXh0KXxVc2VySW5mb3xWSSg/OkFkZFZlcnNpb25LZXl8RmlsZVZlcnNpb258UHJvZHVjdFZlcnNpb24pfFZQYXRjaHxWYXJ8V2luZG93SWNvbnxXcml0ZSg/OklOSVN0cnxSZWcoPzpCaW58RFdPUkR8RXhwYW5kU3RyfE11bHRpU3RyfE5vbmV8U3RyKXxVbmluc3RhbGxlcil8WFBTdHlsZXxucyg/OkRpYWxvZ3N8RXhlYykpXFxiL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQncHJvcGVydHknOiAvXFxiKD86QVJDSElWRXxGSUxFXyg/OkFUVFJJQlVURV9BUkNISVZFfEFUVFJJQlVURV9OT1JNQUx8QVRUUklCVVRFX09GRkxJTkV8QVRUUklCVVRFX1JFQURPTkxZfEFUVFJJQlVURV9TWVNURU18QVRUUklCVVRFX1RFTVBPUkFSWSl8SEsoPzooPzpDUnxDVXxMTSkoPzozMnw2NCk/fEREfFBEfFUpfEhLRVlfKD86Q0xBU1NFU19ST09UfENVUlJFTlRfQ09ORklHfENVUlJFTlRfVVNFUnxEWU5fREFUQXxMT0NBTF9NQUNISU5FfFBFUkZPUk1BTkNFX0RBVEF8VVNFUlMpfElEKD86QUJPUlR8Q0FOQ0VMfElHTk9SRXxOT3xPS3xSRVRSWXxZRVMpfE1CXyg/OkFCT1JUUkVUUllJR05PUkV8REVGQlVUVE9OMXxERUZCVVRUT04yfERFRkJVVFRPTjN8REVGQlVUVE9ONHxJQ09ORVhDTEFNQVRJT058SUNPTklORk9STUFUSU9OfElDT05RVUVTVElPTnxJQ09OU1RPUHxPS3xPS0NBTkNFTHxSRVRSWUNBTkNFTHxSSUdIVHxSVExSRUFESU5HfFNFVEZPUkVHUk9VTkR8VE9QTU9TVHxVU0VSSUNPTnxZRVNOTyl8Tk9STUFMfE9GRkxJTkV8UkVBRE9OTFl8U0hDVFh8U0hFTExfQ09OVEVYVHxTWVNURU18VEVNUE9SQVJZfGFkbWlufGFsbHxhdXRvfGJvdGh8Y29sb3JlZHxmYWxzZXxmb3JjZXxoaWRlfGhpZ2hlc3R8bGFzdHVzZWR8bGVhdmV8bGlzdG9ubHl8bm9uZXxub3JtYWx8bm90c2V0fG9mZnxvbnxvcGVufHByaW50fHNob3d8c2lsZW50fHNpbGVudGxvZ3xzbW9vdGh8dGV4dG9ubHl8dHJ1ZXx1c2VyKVxcYi8sXG5cdCdjb25zdGFudCc6IC9cXCRcXHtbIVxcd1xcLjpcXF4tXStcXH18XFwkXFwoWyFcXHdcXC46XFxeLV0rXFwpLyxcblx0J3ZhcmlhYmxlJzogL1xcJFxcd1tcXHdcXC5dKi8sXG5cdCdudW1iZXInOiAvXFxiMHhbXFxkQS1GYS1mXStcXGJ8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OltFZV0tP1xcZCspPy8sXG5cdCdvcGVyYXRvcic6IC8tLT98XFwrXFwrP3w8PT98Pj0/fD09Pz0/fCYmP3xcXHxcXHw/fFs/KlxcL35eJV0vLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSwuOl0vLFxuXHQnaW1wb3J0YW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopISg/OmFkZGluY2x1ZGVkaXJ8YWRkcGx1Z2luZGlyfGFwcGVuZGZpbGV8Y2R8ZGVmaW5lfGRlbGZpbGV8ZWNob3xlbHNlfGVuZGlmfGVycm9yfGV4ZWN1dGV8ZmluYWxpemV8Z2V0ZGxsdmVyc2lvbnxnZXR0bGJ2ZXJzaW9ufGlmfGlmZGVmfGlmbWFjcm9kZWZ8aWZtYWNyb25kZWZ8aWZuZGVmfGluY2x1ZGV8aW5zZXJ0bWFjcm98bWFjcm98bWFjcm9lbmR8bWFrZW5zaXN8cGFja2hkcnxwcmFnbWF8c2VhcmNocGFyc2V8c2VhcmNocmVwbGFjZXxzeXN0ZW18dGVtcGZpbGV8dW5kZWZ8dmVyYm9zZXx3YXJuaW5nKVxcYi9pbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH1cbn07XG5cblByaXNtLmxhbmd1YWdlcy5vYmplY3RpdmVjID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnYycsIHtcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvQD9cIig/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteXCJcXFxcXFxyXFxuXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzphc218YXV0b3xicmVha3xjYXNlfGNoYXJ8Y29uc3R8Y29udGludWV8ZGVmYXVsdHxkb3xkb3VibGV8ZWxzZXxlbnVtfGV4dGVybnxmbG9hdHxmb3J8Z290b3xpZnxpbnxpbmxpbmV8aW50fGxvbmd8cmVnaXN0ZXJ8cmV0dXJufHNlbGZ8c2hvcnR8c2lnbmVkfHNpemVvZnxzdGF0aWN8c3RydWN0fHN1cGVyfHN3aXRjaHx0eXBlZGVmfHR5cGVvZnx1bmlvbnx1bnNpZ25lZHx2b2lkfHZvbGF0aWxlfHdoaWxlKVxcYnwoPzpAaW50ZXJmYWNlfEBlbmR8QGltcGxlbWVudGF0aW9ufEBwcm90b2NvbHxAY2xhc3N8QHB1YmxpY3xAcHJvdGVjdGVkfEBwcml2YXRlfEBwcm9wZXJ0eXxAdHJ5fEBjYXRjaHxAZmluYWxseXxAdGhyb3d8QHN5bnRoZXNpemV8QGR5bmFtaWN8QHNlbGVjdG9yKVxcYi8sXG5cdCdvcGVyYXRvcic6IC8tWy0+XT98XFwrXFwrP3whPT98PDw/PT98Pj4/PT98PT0/fCYmP3xcXHxcXHw/fFt+XiU/KlxcL0BdL1xufSk7XG5cbmRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMub2JqZWN0aXZlY1snY2xhc3MtbmFtZSddO1xuXG5QcmlzbS5sYW5ndWFnZXMub2JqYyA9IFByaXNtLmxhbmd1YWdlcy5vYmplY3RpdmVjO1xuXG4vLyBodHRwczovL29jYW1sLm9yZy9tYW51YWwvbGV4Lmh0bWxcblxuUHJpc20ubGFuZ3VhZ2VzLm9jYW1sID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwoXFwqW1xcc1xcU10qP1xcKlxcKS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjaGFyJzoge1xuXHRcdHBhdHRlcm46IC8nKD86W15cXFxcXFxyXFxuJ118XFxcXCg/Oi58W294XT9bMC05YS1mXXsxLDN9KSknL2ksXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1wiKD86XFxcXCg/OltcXHNcXFNdfFxcclxcbil8W15cXFxcXFxyXFxuXCJdKSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXHsoW2Etel9dKilcXHxbXFxzXFxTXSo/XFx8XFwxXFx9Lyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J251bWJlcic6IFtcblx0XHQvLyBiaW5hcnkgYW5kIG9jdGFsXG5cdFx0L1xcYig/OjBiWzAxXVswMV9dKnwwb1swLTddWzAtN19dKilcXGIvaSxcblx0XHQvLyBoZXhhZGVjaW1hbFxuXHRcdC9cXGIweFthLWYwLTldW2EtZjAtOV9dKig/OlxcLlthLWYwLTlfXSopPyg/OnBbKy1dP1xcZFtcXGRfXSopPyg/IVxcdykvaSxcblx0XHQvLyBkZWNpbWFsXG5cdFx0L1xcYlxcZFtcXGRfXSooPzpcXC5bXFxkX10qKT8oPzplWystXT9cXGRbXFxkX10qKT8oPyFcXHcpL2ksXG5cdF0sXG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogL1xcQiNcXHcrLyxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXHQnbGFiZWwnOiB7XG5cdFx0cGF0dGVybjogL1xcQn5cXHcrLyxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXHQndHlwZS12YXJpYWJsZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxCJ1xcdysvLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCd2YXJpYW50Jzoge1xuXHRcdHBhdHRlcm46IC9gXFx3Ky8sXG5cdFx0YWxpYXM6ICdzeW1ib2wnXG5cdH0sXG5cdC8vIEZvciB0aGUgbGlzdCBvZiBrZXl3b3JkcyBhbmQgb3BlcmF0b3JzLFxuXHQvLyBzZWU6IGh0dHA6Ly9jYW1sLmlucmlhLmZyL3B1Yi9kb2NzL21hbnVhbC1vY2FtbC9sZXguaHRtbCNzZWM4NFxuXHQna2V5d29yZCc6IC9cXGIoPzphc3xhc3NlcnR8YmVnaW58Y2xhc3N8Y29uc3RyYWludHxkb3xkb25lfGRvd250b3xlbHNlfGVuZHxleGNlcHRpb258ZXh0ZXJuYWx8Zm9yfGZ1bnxmdW5jdGlvbnxmdW5jdG9yfGlmfGlufGluY2x1ZGV8aW5oZXJpdHxpbml0aWFsaXplcnxsYXp5fGxldHxtYXRjaHxtZXRob2R8bW9kdWxlfG11dGFibGV8bmV3fG5vbnJlY3xvYmplY3R8b2Z8b3Blbnxwcml2YXRlfHJlY3xzaWd8c3RydWN0fHRoZW58dG98dHJ5fHR5cGV8dmFsfHZhbHVlfHZpcnR1YWx8d2hlbnx3aGVyZXx3aGlsZXx3aXRoKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblxuXHQnb3BlcmF0b3ItbGlrZS1wdW5jdHVhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvXFxbWzw+fF18Wz58XVxcXXxcXHs8fD5cXH0vLFxuXHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdH0sXG5cdC8vIEN1c3RvbSBvcGVyYXRvcnMgYXJlIGFsbG93ZWRcblx0J29wZXJhdG9yJzogL1xcLlsufl18Ols9Pl18Wz08PkBefCYrXFwtKlxcLyQlIT9+XVshJCUmKitcXC0uXFwvOjw9Pj9AXnx+XSp8XFxiKD86YW5kfGFzcnxsYW5kfGxvcnxsc2x8bHNyfGx4b3J8bW9kfG9yKVxcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC87O3w6OnxbKCl7fVxcW1xcXS4sOjsjXXxcXGJfXFxiL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHR2YXIgZXNjYXBlcyA9IC9cXFxcKD86W1wiJ1xcXFxhYmVmbnJ0dl18MFswLTddezJ9fFVbXFxkQS1GYS1mXXs2fXx1W1xcZEEtRmEtZl17NH18eFtcXGRBLUZhLWZdezJ9KS87XG5cblx0UHJpc20ubGFuZ3VhZ2VzLm9kaW4gPSB7XG5cdFx0LyoqXG5cdFx0ICogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSAxIGxldmVsIG9mIG5lc3RpbmcuXG5cdFx0ICpcblx0XHQgKiBAYXV0aG9yIE1pY2hhZWwgU2NobWlkdFxuXHRcdCAqIEBhdXRob3IgZWR1a2lzdG9cblx0XHQgKi9cblx0XHQnY29tbWVudCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcL1xcKig/OlteLypdfFxcLyg/IVxcKil8XFwqKD8hXFwvKXxcXC9cXCooPzpcXCooPyFcXC8pfFteKl0pKig/OlxcKlxcL3wkKSkqKD86XFwqXFwvfCQpLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvIyFbXlxcblxccl0qLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwvXFwvW15cXG5cXHJdKi8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cblx0XHQvKipcblx0XHQgKiBTaG91bGQgYmUgZm91bmQgYmVmb3JlIHN0cmluZ3MgYmVjYXVzZSBvZiAnXCInXCItIGFuZCAnYCdgLWxpa2Ugc2VxdWVuY2VzLlxuXHRcdCAqL1xuXHRcdCdjaGFyJzoge1xuXHRcdFx0cGF0dGVybjogLycoPzpcXFxcKD86LnxbMFV1eF1bMC05QS1GYS1mXXsxLDZ9KXxbXlxcblxccidcXFxcXSknLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnc3ltYm9sJzogZXNjYXBlc1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQnc3RyaW5nJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvYFteYF0qYC8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1wiKD86XFxcXC58W15cXG5cXHJcIlxcXFxdKSpcIi8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3N5bWJvbCc6IGVzY2FwZXNcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cblx0XHQnZGlyZWN0aXZlJzoge1xuXHRcdFx0cGF0dGVybjogLyNcXHcrLyxcblx0XHRcdGFsaWFzOiAncHJvcGVydHknXG5cdFx0fSxcblxuXHRcdCdudW1iZXInOiAvXFxiMCg/OmJbMDFfXSt8ZFtcXGRfXSt8aF8qKD86KD86KD86W1xcZEEtRmEtZl1fKil7OH0pezEsMn18KD86W1xcZEEtRmEtZl1fKil7NH0pfG9bMC03X10rfHhbXFxkQS1GX2EtZl0rfHpbXFxkQUJfYWJdKylcXGJ8KD86XFxiXFxkKyg/OlxcLig/IVxcLilcXGQqKT98XFxCXFwuXFxkKykoPzpbRWVdWystXT9cXGQqKT9baWprXT8oPyFcXHcpLyxcblxuXHRcdCdkaXNjYXJkJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYl9cXGIvLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cblx0XHQncHJvY2VkdXJlLWRlZmluaXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiXFx3Kyg/PVsgXFx0XSooPzo6XFxzKil7Mn1wcm9jXFxiKS8sXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cblx0XHQna2V5d29yZCc6IC9cXGIoPzphc218YXV0b19jYXN0fGJpdF9zZXR8YnJlYWt8Y2FzZXxjYXN0fGNvbnRleHR8Y29udGludWV8ZGVmZXJ8ZGlzdGluY3R8ZG98ZHluYW1pY3xlbHNlfGVudW18ZmFsbHRocm91Z2h8Zm9yfGZvcmVpZ258aWZ8aW1wb3J0fGlufG1hcHxtYXRyaXh8bm90X2lufG9yX2Vsc2V8b3JfcmV0dXJufHBhY2thZ2V8cHJvY3xyZXR1cm58c3RydWN0fHN3aXRjaHx0cmFuc211dGV8dHlwZWlkfHVuaW9ufHVzaW5nfHdoZW58d2hlcmUpXFxiLyxcblxuXHRcdC8qKlxuXHRcdCAqIGZhbHNlLCBuaWwsIHRydWUgY2FuIGJlIHVzZWQgYXMgcHJvY2VkdXJlIG5hbWVzLiBcIl9cIiBhbmQga2V5d29yZHMgY2FuJ3QuXG5cdFx0ICovXG5cdFx0J3Byb2NlZHVyZS1uYW1lJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYlxcdysoPz1bIFxcdF0qXFwoKS8sXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXxuaWx8dHJ1ZSlcXGIvLFxuXG5cdFx0J2NvbnN0YW50LXBhcmFtZXRlci1zaWduJzoge1xuXHRcdFx0cGF0dGVybjogL1xcJC8sXG5cdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHR9LFxuXG5cdFx0J3VuZGVmaW5lZCc6IHtcblx0XHRcdHBhdHRlcm46IC8tLS0vLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9LFxuXG5cdFx0J2Fycm93Jzoge1xuXHRcdFx0cGF0dGVybjogLy0+Lyxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblxuXHRcdCdvcGVyYXRvcic6IC9cXCtcXCt8LS18XFwuXFwuWzw9XT98KD86Jn58Wy0hKisvPX5dfFslJjw+fF17MSwyfSk9P3xbP15dLyxcblxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKCksLjo7QFxcW1xcXXt9XS9cblx0fTtcbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHQvKiBPcGVuQ0wga2VybmVsIGxhbmd1YWdlICovXG5cdFByaXNtLmxhbmd1YWdlcy5vcGVuY2wgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjJywge1xuXHRcdC8vIEV4dHJhY3RlZCBmcm9tIHRoZSBvZmZpY2lhbCBzcGVjcyAoMi4wKSBhbmQgaHR0cDovL3N0cmVhbWNvbXB1dGluZy5ldS9kb3dubG9hZHMvP29wZW5jbC5sYW5nIChvcGVuY2wta2V5d29yZHMsIG9wZW5jbC10eXBlcykgYW5kIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci8/ZnVuYz1kZXRhaWwmYWlkPTI5NTc3OTQmZ3JvdXBfaWQ9OTU3MTcmYXRpZD02MTIzODQgKFdvcmRzMiwgcGFydGx5IFdvcmRzMylcblx0XHQna2V5d29yZCc6IC9cXGIoPzooPzpfXyk/KD86Y29uc3RhbnR8Z2xvYmFsfGtlcm5lbHxsb2NhbHxwcml2YXRlfHJlYWRfb25seXxyZWFkX3dyaXRlfHdyaXRlX29ubHkpfF9fYXR0cmlidXRlX198YXV0b3woPzpib29sfHU/KD86Y2hhcnxpbnR8bG9uZ3xzaG9ydCl8aGFsZnxxdWFkKSg/OjJ8M3w0fDh8MTYpP3xicmVha3xjYXNlfGNvbXBsZXh8Y29uc3R8Y29udGludWV8KD86ZG91YmxlfGZsb2F0KSg/OjE2KD86eCg/OjF8Mnw0fDh8MTYpKT98MXgoPzoxfDJ8NHw4fDE2KXwyKD86eCg/OjF8Mnw0fDh8MTYpKT98M3w0KD86eCg/OjF8Mnw0fDh8MTYpKT98OCg/OngoPzoxfDJ8NHw4fDE2KSk/KT98ZGVmYXVsdHxkb3xlbHNlfGVudW18ZXh0ZXJufGZvcnxnb3RvfGlmfGltYWdpbmFyeXxpbmxpbmV8cGFja2VkfHBpcGV8cmVnaXN0ZXJ8cmVzdHJpY3R8cmV0dXJufHNpZ25lZHxzaXplb2Z8c3RhdGljfHN0cnVjdHxzd2l0Y2h8dHlwZWRlZnx1bmlmb3JtfHVuaW9ufHVuc2lnbmVkfHZvaWR8dm9sYXRpbGV8d2hpbGUpXFxiLyxcblx0XHQvLyBFeHRyYWN0ZWQgZnJvbSBodHRwOi8vc3RyZWFtY29tcHV0aW5nLmV1L2Rvd25sb2Fkcy8/b3BlbmNsLmxhbmcgKG9wZW5jbC1jb25zdClcblx0XHQvLyBNYXRoIENvbnN0YW50czogaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvT3BlbkNML3Nkay8yLjEvZG9jcy9tYW4veGh0bWwvbWF0aENvbnN0YW50cy5odG1sXG5cdFx0Ly8gTWFjcm9zIGFuZCBMaW1pdHM6IGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L09wZW5DTC9zZGsvMi4xL2RvY3MvbWFuL3hodG1sL21hY3JvTGltaXRzLmh0bWxcblx0XHQnbnVtYmVyJzogLyg/OlxcYjB4KD86W1xcZGEtZl0rKD86XFwuW1xcZGEtZl0qKT98XFwuW1xcZGEtZl0rKSg/OnBbKy1dP1xcZCspP3woPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/KVtmdWhsXXswLDR9L2ksXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHRcdCdjb25zdGFudC1vcGVuY2wta2VybmVsJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYig/OkNIQVJfKD86QklUfE1BWHxNSU4pfENMS18oPzpBRERSRVNTXyg/OkNMQU1QKD86X1RPX0VER0UpP3xOT05FfFJFUEVBVCl8RklMVEVSXyg/OkxJTkVBUnxORUFSRVNUKXwoPzpHTE9CQUx8TE9DQUwpX01FTV9GRU5DRXxOT1JNQUxJWkVEX0NPT1JEU18oPzpGQUxTRXxUUlVFKSl8Q0xfKD86QkdSQXwoPzpIQUxGXyk/RkxPQVR8SU5URU5TSVRZfExVTUlOQU5DRXxBP1I/Rz9CP1tBeF0/fCg/Oig/OlVOKT9TSUdORUR8W1VTXU5PUk0pXyg/OklOVCg/Ojh8MTZ8MzIpKXxVTk9STV8oPzpJTlRfMTAxMDEwfFNIT1JUXyg/OjU1NXw1NjUpKSl8KD86REJMfEZMVHxIQUxGKV8oPzpESUd8RVBTSUxPTnwoPzpNQVh8TUlOKSg/Oig/Ol8xMCk/X0VYUCk/fE1BTlRfRElHKXxGTFRfUkFESVh8SFVHRV9WQUxGP3woPzpJTlR8TE9OR3xTQ0hBUnxTSFJUKV8oPzpNQVh8TUlOKXxJTkZJTklUWXxNQVhGTE9BVHxNXyg/OlsxMl1fUEl8Ml9TUVJUUEl8RXxMTig/OjJ8MTApfExPRyg/OjJ8MTApRT98UEkoPzpfWzI0XSk/fFNRUlQoPzoxXzJ8MikpKD86X0Z8X0gpP3xOQU58KD86VUNIQVJ8VUlOVHxVTE9OR3xVU0hSVClfTUFYKVxcYi8sXG5cdFx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnb3BlbmNsJywgJ2NsYXNzLW5hbWUnLCB7XG5cdFx0Ly8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvT3BlbkNML3Nkay8yLjEvZG9jcy9tYW4veGh0bWwvc2NhbGFyRGF0YVR5cGVzLmh0bWxcblx0XHQvLyBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9PcGVuQ0wvc2RrLzIuMS9kb2NzL21hbi94aHRtbC9vdGhlckRhdGFUeXBlcy5odG1sXG5cdFx0J2J1aWx0aW4tdHlwZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzpfY2xfKD86Y29tbWFuZF9xdWV1ZXxjb250ZXh0fGRldmljZV9pZHxldmVudHxrZXJuZWx8bWVtfHBsYXRmb3JtX2lkfHByb2dyYW18c2FtcGxlcil8Y2xfKD86aW1hZ2VfZm9ybWF0fG1lbV9mZW5jZV9mbGFncyl8Y2xrX2V2ZW50X3R8ZXZlbnRfdHxpbWFnZSg/OjFkXyg/OmFycmF5X3xidWZmZXJfKT90fDJkXyg/OmFycmF5Xyg/OmRlcHRoX3xtc2FhX2RlcHRoX3xtc2FhXyk/fGRlcHRoX3xtc2FhX2RlcHRoX3xtc2FhXyk/dHwzZF90KXxpbnRwdHJfdHxuZHJhbmdlX3R8cHRyZGlmZl90fHF1ZXVlX3R8cmVzZXJ2ZV9pZF90fHNhbXBsZXJfdHxzaXplX3R8dWludHB0cl90KVxcYi8sXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fVxuXHR9KTtcblxuXHR2YXIgYXR0cmlidXRlcyA9IHtcblx0XHQvLyBFeHRyYWN0ZWQgZnJvbSBodHRwOi8vc3RyZWFtY29tcHV0aW5nLmV1L2Rvd25sb2Fkcy8/b3BlbmNsX2hvc3QubGFuZyAob3BlbmNsLXR5cGVzIGFuZCBvcGVuY2wtaG9zdClcblx0XHQndHlwZS1vcGVuY2wtaG9zdCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzpjbF8oPzpHTGVudW18R0xpbnR8R0x1aW58YWRkcmVzc2luZ19tb2RlfGJpdGZpZWxkfGJvb2x8YnVmZmVyX2NyZWF0ZV90eXBlfGJ1aWxkX3N0YXR1c3xjaGFubmVsXyg/Om9yZGVyfHR5cGUpfCg/OnU/KD86Y2hhcnxpbnR8bG9uZ3xzaG9ydCl8ZG91YmxlfGZsb2F0KSg/OjJ8M3w0fDh8MTYpP3xjb21tYW5kXyg/OnF1ZXVlKD86X2luZm98X3Byb3BlcnRpZXMpP3x0eXBlKXxjb250ZXh0KD86X2luZm98X3Byb3BlcnRpZXMpP3xkZXZpY2VfKD86ZXhlY19jYXBhYmlsaXRpZXN8ZnBfY29uZmlnfGlkfGluZm98bG9jYWxfbWVtX3R5cGV8bWVtX2NhY2hlX3R5cGV8dHlwZSl8KD86ZXZlbnR8c2FtcGxlcikoPzpfaW5mbyk/fGZpbHRlcl9tb2RlfGhhbGZ8aW1hZ2VfaW5mb3xrZXJuZWwoPzpfaW5mb3xfd29ya19ncm91cF9pbmZvKT98bWFwX2ZsYWdzfG1lbSg/Ol9mbGFnc3xfaW5mb3xfb2JqZWN0X3R5cGUpP3xwbGF0Zm9ybV8oPzppZHxpbmZvKXxwcm9maWxpbmdfaW5mb3xwcm9ncmFtKD86X2J1aWxkX2luZm98X2luZm8pPykpXFxiLyxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXHRcdCdib29sZWFuLW9wZW5jbC1ob3N0Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcYkNMXyg/OkZBTFNFfFRSVUUpXFxiLyxcblx0XHRcdGFsaWFzOiAnYm9vbGVhbidcblx0XHR9LFxuXHRcdC8vIEV4dHJhY3RlZCBmcm9tIGNsLmggKDIuMCkgYW5kIGh0dHA6Ly9zdHJlYW1jb21wdXRpbmcuZXUvZG93bmxvYWRzLz9vcGVuY2xfaG9zdC5sYW5nIChvcGVuY2wtY29uc3QpXG5cdFx0J2NvbnN0YW50LW9wZW5jbC1ob3N0Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcYkNMXyg/OkF8QUJHUnxBRERSRVNTXyg/OkNMQU1QKD86X1RPX0VER0UpP3xNSVJST1JFRF9SRVBFQVR8Tk9ORXxSRVBFQVQpfEFSR0J8QkdSQXxCTE9DS0lOR3xCVUZGRVJfQ1JFQVRFX1RZUEVfUkVHSU9OfEJVSUxEXyg/OkVSUk9SfElOX1BST0dSRVNTfE5PTkV8UFJPR1JBTV9GQUlMVVJFfFNVQ0NFU1MpfENPTU1BTkRfKD86QUNRVUlSRV9HTF9PQkpFQ1RTfEJBUlJJRVJ8Q09QWV8oPzpCVUZGRVIoPzpfUkVDVHxfVE9fSU1BR0UpP3xJTUFHRSg/Ol9UT19CVUZGRVIpPyl8RklMTF8oPzpCVUZGRVJ8SU1BR0UpfE1BUCg/Ol9CVUZGRVJ8X0lNQUdFKXxNQVJLRVJ8TUlHUkFURSg/Ol9TVk0pP19NRU1fT0JKRUNUU3xOQVRJVkVfS0VSTkVMfE5EUkFOR0VfS0VSTkVMfFJFQURfKD86QlVGRkVSKD86X1JFQ1QpP3xJTUFHRSl8UkVMRUFTRV9HTF9PQkpFQ1RTfFNWTV8oPzpGUkVFfE1BUHxNRU1DUFl8TUVNRklMTHxVTk1BUCl8VEFTS3xVTk1BUF9NRU1fT0JKRUNUfFVTRVJ8V1JJVEVfKD86QlVGRkVSKD86X1JFQ1QpP3xJTUFHRSkpfENPTVBJTEVSX05PVF9BVkFJTEFCTEV8Q09NUElMRV9QUk9HUkFNX0ZBSUxVUkV8Q09NUExFVEV8Q09OVEVYVF8oPzpERVZJQ0VTfElOVEVST1BfVVNFUl9TWU5DfE5VTV9ERVZJQ0VTfFBMQVRGT1JNfFBST1BFUlRJRVN8UkVGRVJFTkNFX0NPVU5UKXxERVBUSCg/Ol9TVEVOQ0lMKT98REVWSUNFXyg/OkFERFJFU1NfQklUU3xBRkZJTklUWV9ET01BSU5fKD86TFsxLTRdX0NBQ0hFfE5FWFRfUEFSVElUSU9OQUJMRXxOVU1BKXxBVkFJTEFCTEV8QlVJTFRfSU5fS0VSTkVMU3xDT01QSUxFUl9BVkFJTEFCTEV8RE9VQkxFX0ZQX0NPTkZJR3xFTkRJQU5fTElUVExFfEVSUk9SX0NPUlJFQ1RJT05fU1VQUE9SVHxFWEVDVVRJT05fQ0FQQUJJTElUSUVTfEVYVEVOU0lPTlN8R0xPQkFMXyg/Ok1FTV8oPzpDQUNIRUxJTkVfU0laRXxDQUNIRV9TSVpFfENBQ0hFX1RZUEV8U0laRSl8VkFSSUFCTEVfUFJFRkVSUkVEX1RPVEFMX1NJWkUpfEhPU1RfVU5JRklFRF9NRU1PUll8SUxfVkVSU0lPTnxJTUFHRSg/OjJEX01BWF8oPzpIRUlHSFR8V0lEVEgpfDNEX01BWF8oPzpERVBUSHxIRUlHSFR8V0lEVEgpfF9CQVNFX0FERFJFU1NfQUxJR05NRU5UfF9NQVhfQVJSQVlfU0laRXxfTUFYX0JVRkZFUl9TSVpFfF9QSVRDSF9BTElHTk1FTlR8X1NVUFBPUlQpfExJTktFUl9BVkFJTEFCTEV8TE9DQUxfTUVNX1NJWkV8TE9DQUxfTUVNX1RZUEV8TUFYXyg/OkNMT0NLX0ZSRVFVRU5DWXxDT01QVVRFX1VOSVRTfENPTlNUQU5UX0FSR1N8Q09OU1RBTlRfQlVGRkVSX1NJWkV8R0xPQkFMX1ZBUklBQkxFX1NJWkV8TUVNX0FMTE9DX1NJWkV8TlVNX1NVQl9HUk9VUFN8T05fREVWSUNFXyg/OkVWRU5UU3xRVUVVRVMpfFBBUkFNRVRFUl9TSVpFfFBJUEVfQVJHU3xSRUFEX0lNQUdFX0FSR1N8UkVBRF9XUklURV9JTUFHRV9BUkdTfFNBTVBMRVJTfFdPUktfR1JPVVBfU0laRXxXT1JLX0lURU1fRElNRU5TSU9OU3xXT1JLX0lURU1fU0laRVN8V1JJVEVfSU1BR0VfQVJHUyl8TUVNX0JBU0VfQUREUl9BTElHTnxNSU5fREFUQV9UWVBFX0FMSUdOX1NJWkV8TkFNRXxOQVRJVkVfVkVDVE9SX1dJRFRIXyg/OkNIQVJ8RE9VQkxFfEZMT0FUfEhBTEZ8SU5UfExPTkd8U0hPUlQpfE5PVF8oPzpBVkFJTEFCTEV8Rk9VTkQpfE9QRU5DTF9DX1ZFUlNJT058UEFSRU5UX0RFVklDRXxQQVJUSVRJT05fKD86QUZGSU5JVFlfRE9NQUlOfEJZX0FGRklOSVRZX0RPTUFJTnxCWV9DT1VOVFN8QllfQ09VTlRTX0xJU1RfRU5EfEVRVUFMTFl8RkFJTEVEfE1BWF9TVUJfREVWSUNFU3xQUk9QRVJUSUVTfFRZUEUpfFBJUEVfTUFYXyg/OkFDVElWRV9SRVNFUlZBVElPTlN8UEFDS0VUX1NJWkUpfFBMQVRGT1JNfFBSRUZFUlJFRF8oPzpHTE9CQUxfQVRPTUlDX0FMSUdOTUVOVHxJTlRFUk9QX1VTRVJfU1lOQ3xMT0NBTF9BVE9NSUNfQUxJR05NRU5UfFBMQVRGT1JNX0FUT01JQ19BTElHTk1FTlR8VkVDVE9SX1dJRFRIXyg/OkNIQVJ8RE9VQkxFfEZMT0FUfEhBTEZ8SU5UfExPTkd8U0hPUlQpKXxQUklOVEZfQlVGRkVSX1NJWkV8UFJPRklMRXxQUk9GSUxJTkdfVElNRVJfUkVTT0xVVElPTnxRVUVVRV8oPzpPTl8oPzpERVZJQ0VfKD86TUFYX1NJWkV8UFJFRkVSUkVEX1NJWkV8UFJPUEVSVElFUyl8SE9TVF9QUk9QRVJUSUVTKXxQUk9QRVJUSUVTKXxSRUZFUkVOQ0VfQ09VTlR8U0lOR0xFX0ZQX0NPTkZJR3xTVUJfR1JPVVBfSU5ERVBFTkRFTlRfRk9SV0FSRF9QUk9HUkVTU3xTVk1fKD86QVRPTUlDU3xDQVBBQklMSVRJRVN8Q09BUlNFX0dSQUlOX0JVRkZFUnxGSU5FX0dSQUlOX0JVRkZFUnxGSU5FX0dSQUlOX1NZU1RFTSl8VFlQRSg/Ol9BQ0NFTEVSQVRPUnxfQUxMfF9DUFV8X0NVU1RPTXxfREVGQVVMVHxfR1BVKT98VkVORE9SKD86X0lEKT98VkVSU0lPTil8RFJJVkVSX1ZFUlNJT058RVZFTlRfKD86Q09NTUFORF8oPzpFWEVDVVRJT05fU1RBVFVTfFFVRVVFfFRZUEUpfENPTlRFWFR8UkVGRVJFTkNFX0NPVU5UKXxFWEVDXyg/OktFUk5FTHxOQVRJVkVfS0VSTkVMfFNUQVRVU19FUlJPUl9GT1JfRVZFTlRTX0lOX1dBSVRfTElTVCl8RklMVEVSXyg/OkxJTkVBUnxORUFSRVNUKXxGTE9BVHxGUF8oPzpDT1JSRUNUTFlfUk9VTkRFRF9ESVZJREVfU1FSVHxERU5PUk18Rk1BfElORl9OQU58Uk9VTkRfVE9fSU5GfFJPVU5EX1RPX05FQVJFU1R8Uk9VTkRfVE9fWkVST3xTT0ZUX0ZMT0FUKXxHTE9CQUx8SEFMRl9GTE9BVHxJTUFHRV8oPzpBUlJBWV9TSVpFfEJVRkZFUnxERVBUSHxFTEVNRU5UX1NJWkV8Rk9STUFUfEZPUk1BVF9NSVNNQVRDSHxGT1JNQVRfTk9UX1NVUFBPUlRFRHxIRUlHSFR8TlVNX01JUF9MRVZFTFN8TlVNX1NBTVBMRVN8Uk9XX1BJVENIfFNMSUNFX1BJVENIfFdJRFRIKXxJTlRFTlNJVFl8SU5WQUxJRF8oPzpBUkdfSU5ERVh8QVJHX1NJWkV8QVJHX1ZBTFVFfEJJTkFSWXxCVUZGRVJfU0laRXxCVUlMRF9PUFRJT05TfENPTU1BTkRfUVVFVUV8Q09NUElMRVJfT1BUSU9OU3xDT05URVhUfERFVklDRXxERVZJQ0VfUEFSVElUSU9OX0NPVU5UfERFVklDRV9RVUVVRXxERVZJQ0VfVFlQRXxFVkVOVHxFVkVOVF9XQUlUX0xJU1R8R0xPQkFMX09GRlNFVHxHTE9CQUxfV09SS19TSVpFfEdMX09CSkVDVHxIT1NUX1BUUnxJTUFHRV9ERVNDUklQVE9SfElNQUdFX0ZPUk1BVF9ERVNDUklQVE9SfElNQUdFX1NJWkV8S0VSTkVMfEtFUk5FTF9BUkdTfEtFUk5FTF9ERUZJTklUSU9OfEtFUk5FTF9OQU1FfExJTktFUl9PUFRJT05TfE1FTV9PQkpFQ1R8TUlQX0xFVkVMfE9QRVJBVElPTnxQSVBFX1NJWkV8UExBVEZPUk18UFJPR1JBTXxQUk9HUkFNX0VYRUNVVEFCTEV8UFJPUEVSVFl8UVVFVUVfUFJPUEVSVElFU3xTQU1QTEVSfFZBTFVFfFdPUktfRElNRU5TSU9OfFdPUktfR1JPVVBfU0laRXxXT1JLX0lURU1fU0laRSl8S0VSTkVMXyg/OkFSR18oPzpBQ0NFU1NfKD86Tk9ORXxRVUFMSUZJRVJ8UkVBRF9PTkxZfFJFQURfV1JJVEV8V1JJVEVfT05MWSl8QUREUkVTU18oPzpDT05TVEFOVHxHTE9CQUx8TE9DQUx8UFJJVkFURXxRVUFMSUZJRVIpfElORk9fTk9UX0FWQUlMQUJMRXxOQU1FfFRZUEVfKD86Q09OU1R8TkFNRXxOT05FfFBJUEV8UVVBTElGSUVSfFJFU1RSSUNUfFZPTEFUSUxFKSl8QVRUUklCVVRFU3xDT01QSUxFX05VTV9TVUJfR1JPVVBTfENPTVBJTEVfV09SS19HUk9VUF9TSVpFfENPTlRFWFR8RVhFQ19JTkZPX1NWTV9GSU5FX0dSQUlOX1NZU1RFTXxFWEVDX0lORk9fU1ZNX1BUUlN8RlVOQ1RJT05fTkFNRXxHTE9CQUxfV09SS19TSVpFfExPQ0FMX01FTV9TSVpFfExPQ0FMX1NJWkVfRk9SX1NVQl9HUk9VUF9DT1VOVHxNQVhfTlVNX1NVQl9HUk9VUFN8TUFYX1NVQl9HUk9VUF9TSVpFX0ZPUl9ORFJBTkdFfE5VTV9BUkdTfFBSRUZFUlJFRF9XT1JLX0dST1VQX1NJWkVfTVVMVElQTEV8UFJJVkFURV9NRU1fU0laRXxQUk9HUkFNfFJFRkVSRU5DRV9DT1VOVHxTVUJfR1JPVVBfQ09VTlRfRk9SX05EUkFOR0V8V09SS19HUk9VUF9TSVpFKXxMSU5LRVJfTk9UX0FWQUlMQUJMRXxMSU5LX1BST0dSQU1fRkFJTFVSRXxMT0NBTHxMVU1JTkFOQ0V8TUFQXyg/OkZBSUxVUkV8UkVBRHxXUklURXxXUklURV9JTlZBTElEQVRFX1JFR0lPTil8TUVNXyg/OkFMTE9DX0hPU1RfUFRSfEFTU09DSUFURURfTUVNT0JKRUNUfENPTlRFWFR8Q09QWV9IT1NUX1BUUnxDT1BZX09WRVJMQVB8RkxBR1N8SE9TVF9OT19BQ0NFU1N8SE9TVF9QVFJ8SE9TVF9SRUFEX09OTFl8SE9TVF9XUklURV9PTkxZfEtFUk5FTF9SRUFEX0FORF9XUklURXxNQVBfQ09VTlR8T0JKRUNUXyg/OkFMTE9DQVRJT05fRkFJTFVSRXxCVUZGRVJ8SU1BR0UxRHxJTUFHRTFEX0FSUkFZfElNQUdFMURfQlVGRkVSfElNQUdFMkR8SU1BR0UyRF9BUlJBWXxJTUFHRTNEfFBJUEUpfE9GRlNFVHxSRUFEX09OTFl8UkVBRF9XUklURXxSRUZFUkVOQ0VfQ09VTlR8U0laRXxTVk1fQVRPTUlDU3xTVk1fRklORV9HUkFJTl9CVUZGRVJ8VFlQRXxVU0VTX1NWTV9QT0lOVEVSfFVTRV9IT1NUX1BUUnxXUklURV9PTkxZKXxNSUdSQVRFX01FTV9PQkpFQ1RfKD86Q09OVEVOVF9VTkRFRklORUR8SE9TVCl8TUlTQUxJR05FRF9TVUJfQlVGRkVSX09GRlNFVHxOT05FfE5PTl9CTE9DS0lOR3xPVVRfT0ZfKD86SE9TVF9NRU1PUll8UkVTT1VSQ0VTKXxQSVBFXyg/Ok1BWF9QQUNLRVRTfFBBQ0tFVF9TSVpFKXxQTEFURk9STV8oPzpFWFRFTlNJT05TfEhPU1RfVElNRVJfUkVTT0xVVElPTnxOQU1FfFBST0ZJTEV8VkVORE9SfFZFUlNJT04pfFBST0ZJTElOR18oPzpDT01NQU5EXyg/OkNPTVBMRVRFfEVORHxRVUVVRUR8U1RBUlR8U1VCTUlUKXxJTkZPX05PVF9BVkFJTEFCTEUpfFBST0dSQU1fKD86QklOQVJJRVN8QklOQVJZX1NJWkVTfEJJTkFSWV9UWVBFKD86X0NPTVBJTEVEX09CSkVDVHxfRVhFQ1VUQUJMRXxfTElCUkFSWXxfTk9ORSk/fEJVSUxEXyg/OkdMT0JBTF9WQVJJQUJMRV9UT1RBTF9TSVpFfExPR3xPUFRJT05TfFNUQVRVUyl8Q09OVEVYVHxERVZJQ0VTfElMfEtFUk5FTF9OQU1FU3xOVU1fREVWSUNFU3xOVU1fS0VSTkVMU3xSRUZFUkVOQ0VfQ09VTlR8U09VUkNFKXxRVUVVRUR8UVVFVUVfKD86Q09OVEVYVHxERVZJQ0V8REVWSUNFX0RFRkFVTFR8T05fREVWSUNFfE9OX0RFVklDRV9ERUZBVUxUfE9VVF9PRl9PUkRFUl9FWEVDX01PREVfRU5BQkxFfFBST0ZJTElOR19FTkFCTEV8UFJPUEVSVElFU3xSRUZFUkVOQ0VfQ09VTlR8U0laRSl8UnxSQXxSRUFEXyg/Ok9OTFl8V1JJVEUpX0NBQ0hFfFJHfFJHQnxSR0JBfFJHQnh8Ukd4fFJVTk5JTkd8Unh8U0FNUExFUl8oPzpBRERSRVNTSU5HX01PREV8Q09OVEVYVHxGSUxURVJfTU9ERXxMT0RfTUFYfExPRF9NSU58TUlQX0ZJTFRFUl9NT0RFfE5PUk1BTElaRURfQ09PUkRTfFJFRkVSRU5DRV9DT1VOVCl8KD86VU4pP1NJR05FRF9JTlQoPzo4fDE2fDMyKXxTTk9STV9JTlQoPzo4fDE2KXxTVUJNSVRURUR8U1VDQ0VTU3xVTk9STV9JTlQoPzo4fDE2fDI0fF8xMDEwMTB8XzEwMTAxMF8yKXxVTk9STV9TSE9SVF8oPzo1NTV8NTY1KXxWRVJTSU9OXyg/OjFfMHwxXzF8MV8yfDJfMHwyXzEpfHNCR1JBfHNSR0J8c1JHQkF8c1JHQngpXFxiLyxcblx0XHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdFx0fSxcblx0XHQvLyBFeHRyYWN0ZWQgZnJvbSBjbC5oICgyLjApIGFuZCBodHRwOi8vc3RyZWFtY29tcHV0aW5nLmV1L2Rvd25sb2Fkcy8/b3BlbmNsX2hvc3QubGFuZyAob3BlbmNsLWhvc3QpXG5cdFx0J2Z1bmN0aW9uLW9wZW5jbC1ob3N0Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcYmNsKD86QnVpbGRQcm9ncmFtfENsb25lS2VybmVsfENvbXBpbGVQcm9ncmFtfENyZWF0ZSg/OkJ1ZmZlcnxDb21tYW5kUXVldWUoPzpXaXRoUHJvcGVydGllcyk/fENvbnRleHR8Q29udGV4dEZyb21UeXBlfEltYWdlfEltYWdlMkR8SW1hZ2UzRHxLZXJuZWx8S2VybmVsc0luUHJvZ3JhbXxQaXBlfFByb2dyYW1XaXRoKD86QmluYXJ5fEJ1aWx0SW5LZXJuZWxzfElMfFNvdXJjZSl8U2FtcGxlcnxTYW1wbGVyV2l0aFByb3BlcnRpZXN8U3ViQnVmZmVyfFN1YkRldmljZXN8VXNlckV2ZW50KXxFbnF1ZXVlKD86KD86QmFycmllcnxNYXJrZXIpKD86V2l0aFdhaXRMaXN0KT98Q29weSg/OkJ1ZmZlcig/OlJlY3R8VG9JbWFnZSk/fEltYWdlKD86VG9CdWZmZXIpPyl8KD86RmlsbHxNYXApKD86QnVmZmVyfEltYWdlKXxNaWdyYXRlTWVtT2JqZWN0c3xORFJhbmdlS2VybmVsfE5hdGl2ZUtlcm5lbHwoPzpSZWFkfFdyaXRlKSg/OkJ1ZmZlcig/OlJlY3QpP3xJbWFnZSl8U1ZNKD86RnJlZXxNYXB8TWVtRmlsbHxNZW1jcHl8TWlncmF0ZU1lbXxVbm1hcCl8VGFza3xVbm1hcE1lbU9iamVjdHxXYWl0Rm9yRXZlbnRzKXxGaW5pc2h8Rmx1c2h8R2V0KD86Q29tbWFuZFF1ZXVlSW5mb3xDb250ZXh0SW5mb3xEZXZpY2UoPzpBbmRIb3N0VGltZXJ8SURzfEluZm8pfEV2ZW50KD86UHJvZmlsaW5nKT9JbmZvfEV4dGVuc2lvbkZ1bmN0aW9uQWRkcmVzcyg/OkZvclBsYXRmb3JtKT98SG9zdFRpbWVyfEltYWdlSW5mb3xLZXJuZWwoPzpBcmdJbmZvfEluZm98U3ViR3JvdXBJbmZvfFdvcmtHcm91cEluZm8pfE1lbU9iamVjdEluZm98UGlwZUluZm98UGxhdGZvcm0oPzpJRHN8SW5mbyl8UHJvZ3JhbSg/OkJ1aWxkKT9JbmZvfFNhbXBsZXJJbmZvfFN1cHBvcnRlZEltYWdlRm9ybWF0cyl8TGlua1Byb2dyYW18KD86UmVsZWFzZXxSZXRhaW4pKD86Q29tbWFuZFF1ZXVlfENvbnRleHR8RGV2aWNlfEV2ZW50fEtlcm5lbHxNZW1PYmplY3R8UHJvZ3JhbXxTYW1wbGVyKXxTVk0oPzpBbGxvY3xGcmVlKXxTZXQoPzpDb21tYW5kUXVldWVQcm9wZXJ0eXxEZWZhdWx0RGV2aWNlQ29tbWFuZFF1ZXVlfEV2ZW50Q2FsbGJhY2t8S2VybmVsfEtlcm5lbCg/OkFyZyg/OlNWTVBvaW50ZXIpP3xFeGVjSW5mbyl8TWVtT2JqZWN0RGVzdHJ1Y3RvckNhbGxiYWNrfFVzZXJFdmVudFN0YXR1cyl8VW5sb2FkKD86UGxhdGZvcm0pP0NvbXBpbGVyfFdhaXRGb3JFdmVudHMpXFxiLyxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fVxuXHR9O1xuXG5cdC8qIE9wZW5DTCBob3N0IEFQSSAqL1xuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjJywgJ2tleXdvcmQnLCBhdHRyaWJ1dGVzKTtcblxuXHQvLyBDKysgaW5jbHVkZXMgZXZlcnl0aGluZyBmcm9tIHRoZSBPcGVuQ0wgQyBob3N0IEFQSSBwbHVzIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gY2wyLmhcblx0aWYgKFByaXNtLmxhbmd1YWdlcy5jcHApIHtcblx0XHQvLyBFeHRyYWN0ZWQgZnJvbSBkb3h5Z2VuIGNsYXNzIGxpc3QgaHR0cDovL2dpdGh1Yi5raHJvbm9zLm9yZy9PcGVuQ0wtQ0xIUFAvYW5ub3RhdGVkLmh0bWxcblx0XHRhdHRyaWJ1dGVzWyd0eXBlLW9wZW5jbC1ob3N0LWNwcCddID0ge1xuXHRcdFx0cGF0dGVybjogL1xcYig/OkJ1ZmZlcnxCdWZmZXJHTHxCdWZmZXJSZW5kZXJHTHxDb21tYW5kUXVldWV8Q29udGV4dHxEZXZpY2V8RGV2aWNlQ29tbWFuZFF1ZXVlfEVucXVldWVBcmdzfEV2ZW50fEltYWdlfEltYWdlMUR8SW1hZ2UxREFycmF5fEltYWdlMURCdWZmZXJ8SW1hZ2UyRHxJbWFnZTJEQXJyYXl8SW1hZ2UyREdMfEltYWdlM0R8SW1hZ2UzREdMfEltYWdlRm9ybWF0fEltYWdlR0x8S2VybmVsfEtlcm5lbEZ1bmN0b3J8TG9jYWxTcGFjZUFyZ3xNZW1vcnl8TkRSYW5nZXxQaXBlfFBsYXRmb3JtfFByb2dyYW18U1ZNQWxsb2NhdG9yfFNWTVRyYWl0QXRvbWljfFNWTVRyYWl0Q29hcnNlfFNWTVRyYWl0RmluZXxTVk1UcmFpdFJlYWRPbmx5fFNWTVRyYWl0UmVhZFdyaXRlfFNWTVRyYWl0V3JpdGVPbmx5fFNhbXBsZXJ8VXNlckV2ZW50KVxcYi8sXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fTtcblxuXHRcdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NwcCcsICdrZXl3b3JkJywgYXR0cmlidXRlcyk7XG5cdH1cbn0oUHJpc20pKTtcblxuLy8gaHR0cHM6Ly9xaXNraXQuZ2l0aHViLmlvL29wZW5xYXNtL2dyYW1tYXIvaW5kZXguaHRtbFxuXG5QcmlzbS5sYW5ndWFnZXMub3BlbnFhc20gPSB7XG5cdCdjb21tZW50JzogL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98XFwvXFwvLiovLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIlteXCJcXHJcXG5cXHRdKlwifCdbXidcXHJcXG5cXHRdKicvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdrZXl3b3JkJzogL1xcYig/OkNYfE9QRU5RQVNNfFV8YmFycmllcnxib3hhc3xib3h0b3xicmVha3xjb25zdHxjb250aW51ZXxjdHJsfGRlZnxkZWZjYWx8ZGVmY2FsZ3JhbW1hcnxkZWxheXxlbHNlfGVuZHxmb3J8Z2F0ZXxncGhhc2V8aWZ8aW58aW5jbHVkZXxpbnZ8a2VybmVsfGxlbmd0aG9mfGxldHxtZWFzdXJlfHBvd3xyZXNldHxyZXR1cm58cm90YXJ5fHN0cmV0Y2hpbmZ8d2hpbGUpXFxifCNwcmFnbWFcXGIvLFxuXHQnY2xhc3MtbmFtZSc6IC9cXGIoPzphbmdsZXxiaXR8Ym9vbHxjcmVnfGZpeGVkfGZsb2F0fGludHxsZW5ndGh8cXJlZ3xxdWJpdHxzdHJldGNofHVpbnQpXFxiLyxcblx0J2Z1bmN0aW9uJzogL1xcYig/OmNvc3xleHB8bG58cG9wY291bnR8cm90bHxyb3RyfHNpbnxzcXJ0fHRhbilcXGIoPz1cXHMqXFwoKS8sXG5cblx0J2NvbnN0YW50JzogL1xcYig/OmV1bGVyfHBpfHRhdSlcXGJ8XHUwM0MwfFx1RDgzNVx1REYwRnxcdTIxMDcvLFxuXHQnbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXi5cXHckXSkoPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/KD86ZHR8bnN8dXN8XHUwMEI1c3xtc3xzKT8vaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdvcGVyYXRvcic6IC8tPnw+Pj0/fDw8PT98JiZ8XFx8XFx8fFxcK1xcK3wtLXxbIT08PiZ8fl4rXFwtKi8lXT0/fEAvLFxuXHQncHVuY3R1YXRpb24nOiAvWygpe31cXFtcXF07LDouXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5xYXNtID0gUHJpc20ubGFuZ3VhZ2VzLm9wZW5xYXNtO1xuXG5QcmlzbS5sYW5ndWFnZXMub3ogPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfCUuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cIlxcXFxdfFxcXFxbXFxzXFxTXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnYXRvbSc6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OlteJ1xcXFxdfFxcXFxbXFxzXFxTXSkqJy8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnYnVpbHRpbidcblx0fSxcblx0J2tleXdvcmQnOiAvXFwkfFxcW1xcXXxcXGIoPzpffGF0fGF0dHJ8Y2FzZXxjYXRjaHxjaG9pY2V8Y2xhc3N8Y29uZHxkZWNsYXJlfGRlZmluZXxkaXN8ZWxzZSg/OmNhc2V8aWYpP3xlbmR8ZXhwb3J0fGZhaWx8ZmFsc2V8ZmVhdHxmaW5hbGx5fGZyb218ZnVufGZ1bmN0b3J8aWZ8aW1wb3J0fGlufGxvY2FsfGxvY2t8bWV0aHxuaWx8bm90fG9mfG9yfHByZXBhcmV8cHJvY3xwcm9wfHJhaXNlfHJlcXVpcmV8c2VsZnxza2lwfHRoZW58dGhyZWFkfHRydWV8dHJ5fHVuaXQpXFxiLyxcblx0J2Z1bmN0aW9uJzogW1xuXHRcdC9cXGJbYS16XVtBLVphLXpcXGRdKig/PVxcKCkvLFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXFx7KVtBLVpdW0EtWmEtelxcZF0qXFxiLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdudW1iZXInOiAvXFxiKD86MFtieF1bXFxkYS1mXSt8XFxkKyg/OlxcLlxcZCopPyg/OmV+P1xcZCspPylcXGJ8Jig/OlteXFxcXF18XFxcXCg/OlxcZHszfXwuKSkvaSxcblx0J3ZhcmlhYmxlJzogL2AoPzpbXmBcXFxcXXxcXFxcLikrYC8sXG5cdCdhdHRyLW5hbWUnOiAvXFxiXFx3Kyg/PVsgXFx0XSo6KD8hWzo9XSkpLyxcblx0J29wZXJhdG9yJzogLzooPzo9fDo6Pyl8PFstOj1dP3w9KD86PXw8Pzo/KXw+PT86P3xcXFxcPTo/fCEhP3xbfCMrXFwtKlxcLyx+XkBdfFxcYig/OmFuZHRoZW58ZGl2fG1vZHxvcmVsc2UpXFxiLyxcblx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF0oKXt9Ljo7P10vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMucGFyaWdwID0ge1xuXHQnY29tbWVudCc6IC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFxcXFxcXFxcLiovLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXCJcXFxcXFxyXFxuXXxcXFxcLikqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQvLyBQQVJJL0dQIGRvZXMgbm90IGNhcmUgYWJvdXQgd2hpdGUgc3BhY2VzIGF0IGFsbFxuXHQvLyBzbyBsZXQncyBwcm9jZXNzIHRoZSBrZXl3b3JkcyB0byBidWlsZCBhbiBhcHByb3ByaWF0ZSByZWdleHBcblx0Ly8gKGUuZy4gXCJiICpyICplICphICprXCIsIGV0Yy4pXG5cdCdrZXl3b3JkJzogKGZ1bmN0aW9uICgpIHtcblx0XHR2YXIga2V5d29yZHMgPSBbXG5cdFx0XHQnYnJlYWtwb2ludCcsICdicmVhaycsICdkYmdfZG93bicsICdkYmdfZXJyJywgJ2RiZ191cCcsICdkYmdfeCcsXG5cdFx0XHQnZm9yY29tcG9zaXRlJywgJ2ZvcmRpdicsICdmb3JlbGwnLCAnZm9ycGFydCcsICdmb3JwcmltZScsXG5cdFx0XHQnZm9yc3RlcCcsICdmb3JzdWJncm91cCcsICdmb3J2ZWMnLCAnZm9yJywgJ2lmZXJyJywgJ2lmJyxcblx0XHRcdCdsb2NhbCcsICdteScsICduZXh0JywgJ3JldHVybicsICd1bnRpbCcsICd3aGlsZSdcblx0XHRdO1xuXHRcdGtleXdvcmRzID0ga2V5d29yZHMubWFwKGZ1bmN0aW9uIChrZXl3b3JkKSB7XG5cdFx0XHRyZXR1cm4ga2V5d29yZC5zcGxpdCgnJykuam9pbignIConKTtcblx0XHR9KS5qb2luKCd8Jyk7XG5cdFx0cmV0dXJuIFJlZ0V4cCgnXFxcXGIoPzonICsga2V5d29yZHMgKyAnKVxcXFxiJyk7XG5cdH0oKSksXG5cdCdmdW5jdGlvbic6IC9cXGJcXHcoPzpbXFx3IF0qXFx3KT8oPz0gKlxcKCkvLFxuXHQnbnVtYmVyJzoge1xuXHRcdC8vIFRoZSBsb29rYmVoaW5kIGFuZCB0aGUgbmVnYXRpdmUgbG9va2FoZWFkIHByZXZlbnQgZnJvbSBicmVha2luZyB0aGUgLi4gb3BlcmF0b3Jcblx0XHRwYXR0ZXJuOiAvKCg/OlxcLiAqXFwuICopPykoPzpcXGJcXGQoPzogKlxcZCkqKD86ICooPyFcXC4gKlxcLilcXC4oPzogKlxcZCkqKT98XFwuICpcXGQoPzogKlxcZCkqKSg/OiAqZSAqKD86WystXSAqKT9cXGQoPzogKlxcZCkqKT8vaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdvcGVyYXRvcic6IC9cXC4gKlxcLnxbKlxcLyFdKD86ICo9KT98JSg/OiAqPXwoPzogKiMpPyg/OiAqJykqKT98XFwrKD86ICpbKz1dKT98LSg/OiAqWy09Pl0pP3w8KD86ICo+fCg/OiAqPCk/KD86ICo9KT8pP3w+KD86ICo+KT8oPzogKj0pP3w9KD86ICo9KXswLDJ9fFxcXFwoPzogKlxcLyk/KD86ICo9KT98Jig/OiAqJik/fFxcfCAqXFx8fFsnI35eXS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxde30oKS4sOjt8XS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgcGFyc2VyID0gUHJpc20ubGFuZ3VhZ2VzLnBhcnNlciA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ21hcmt1cCcsIHtcblx0XHQna2V5d29yZCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXl5dKSg/OlxcXig/OmNhc2V8ZXZhbHxmb3J8aWZ8c3dpdGNofHRocm93KVxcYnxAKD86QkFTRXxDTEFTU3xHRVQoPzpfREVGQVVMVCk/fE9QVElPTlN8U0VUX0RFRkFVTFR8VVNFKVxcYikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3ZhcmlhYmxlJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXl0pXFxCXFwkKD86XFx3K3woPz1bLntdKSkoPzooPzpcXC58Ojo/KVxcdyspKig/OlxcLnw6Oj8pPy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC58OisvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15eXSlcXEJbQF5dXFx3Kyg/Oig/OlxcLnw6Oj8pXFx3KykqKD86XFwufDo6Pyk/Lyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheQCkoPzpHRVRffFNFVF8pLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC58OisvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnZXNjYXBlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcXig/OlskXjtAKClcXFtcXF17fVwiJzpdfCNbYS1mXFxkXSopL2ksXG5cdFx0XHRhbGlhczogJ2J1aWx0aW4nXG5cdFx0fSxcblx0XHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXSgpe307XS9cblx0fSk7XG5cblx0cGFyc2VyID0gUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncGFyc2VyJywgJ2tleXdvcmQnLCB7XG5cdFx0J3BhcnNlci1jb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyhcXHMpIy4qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdFx0fSxcblx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdC8vIEFsbG93IGZvciAzIGxldmVscyBvZiBkZXB0aFxuXHRcdFx0cGF0dGVybjogLyhefFteXl0pXFwoKD86W14oKV18XFwoKD86W14oKV18XFwoKD86W14oKV0pKlxcKSkqXFwpKSpcXCkvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnc3RyaW5nJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXnxbXl5dKShbXCInXSkoPzooPyFcXDIpW15eXXxcXF5bXFxzXFxTXSkqXFwyLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdrZXl3b3JkJzogcGFyc2VyLmtleXdvcmQsXG5cdFx0XHRcdCd2YXJpYWJsZSc6IHBhcnNlci52YXJpYWJsZSxcblx0XHRcdFx0J2Z1bmN0aW9uJzogcGFyc2VyLmZ1bmN0aW9uLFxuXHRcdFx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdFx0XHRcdCdudW1iZXInOiAvXFxiKD86MHhbYS1mXFxkXSt8XFxkKyg/OlxcLlxcZCopPyg/OmVbKy1dP1xcZCspPylcXGIvaSxcblx0XHRcdFx0J2VzY2FwZSc6IHBhcnNlci5lc2NhcGUsXG5cdFx0XHRcdCdvcGVyYXRvcic6IC9bfisqXFwvXFxcXCVdfCEoPzpcXHxcXHw/fD0pP3wmJj98XFx8XFx8P3w9PXw8Wzw9XT98Pls+PV0/fC1bZmRdP3xcXGIoPzpkZWZ8ZXF8Z2V8Z3R8aW58aXN8bGV8bHR8bmUpXFxiLyxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogcGFyc2VyLnB1bmN0dWF0aW9uXG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdpbnNpZGUnLCAncHVuY3R1YXRpb24nLCB7XG5cdFx0J2V4cHJlc3Npb24nOiBwYXJzZXIuZXhwcmVzc2lvbixcblx0XHQna2V5d29yZCc6IHBhcnNlci5rZXl3b3JkLFxuXHRcdCd2YXJpYWJsZSc6IHBhcnNlci52YXJpYWJsZSxcblx0XHQnZnVuY3Rpb24nOiBwYXJzZXIuZnVuY3Rpb24sXG5cdFx0J2VzY2FwZSc6IHBhcnNlci5lc2NhcGUsXG5cdFx0J3BhcnNlci1wdW5jdHVhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IHBhcnNlci5wdW5jdHVhdGlvbixcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fVxuXHR9LCBwYXJzZXJbJ3RhZyddLmluc2lkZVsnYXR0ci12YWx1ZSddKTtcblxufShQcmlzbSkpO1xuXG4vLyBCYXNlZCBvbiBGcmVlIFBhc2NhbFxuXG4vKiBUT0RPXG5cdFN1cHBvcnQgaW5saW5lIGFzbSA/XG4qL1xuXG5QcmlzbS5sYW5ndWFnZXMucGFzY2FsID0ge1xuXHQnZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC9cXHtcXCRbXFxzXFxTXSo/XFx9Lyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6IFsnbWFyY28nLCAncHJvcGVydHknXVxuXHR9LFxuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwoXFwqW1xcc1xcU10qP1xcKlxcKXxcXHtbXFxzXFxTXSo/XFx9fFxcL1xcLy4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKD86Jyg/OicnfFteJ1xcclxcbl0pKicoPyEnKXwjWyYkJV0/W2EtZlxcZF0rKSt8XFxeW2Etel0vaSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2FzbSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYmFzbVxcYilbXFxzXFxTXSs/KD89XFxiZW5kXFxzKls7W10pL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHR9LFxuXHQna2V5d29yZCc6IFtcblx0XHR7XG5cdFx0XHQvLyBUdXJibyBQYXNjYWxcblx0XHRcdHBhdHRlcm46IC8oXnxbXiZdKVxcYig/OmFic29sdXRlfGFycmF5fGFzbXxiZWdpbnxjYXNlfGNvbnN0fGNvbnN0cnVjdG9yfGRlc3RydWN0b3J8ZG98ZG93bnRvfGVsc2V8ZW5kfGZpbGV8Zm9yfGZ1bmN0aW9ufGdvdG98aWZ8aW1wbGVtZW50YXRpb258aW5oZXJpdGVkfGlubGluZXxpbnRlcmZhY2V8bGFiZWx8bmlsfG9iamVjdHxvZnxvcGVyYXRvcnxwYWNrZWR8cHJvY2VkdXJlfHByb2dyYW18cmVjb3JkfHJlaW50cm9kdWNlfHJlcGVhdHxzZWxmfHNldHxzdHJpbmd8dGhlbnx0b3x0eXBlfHVuaXR8dW50aWx8dXNlc3x2YXJ8d2hpbGV8d2l0aClcXGIvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIEZyZWUgUGFzY2FsXG5cdFx0XHRwYXR0ZXJuOiAvKF58W14mXSlcXGIoPzpkaXNwb3NlfGV4aXR8ZmFsc2V8bmV3fHRydWUpXFxiL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBPYmplY3QgUGFzY2FsXG5cdFx0XHRwYXR0ZXJuOiAvKF58W14mXSlcXGIoPzpjbGFzc3xkaXNwaW50ZXJmYWNlfGV4Y2VwdHxleHBvcnRzfGZpbmFsaXphdGlvbnxmaW5hbGx5fGluaXRpYWxpemF0aW9ufGlubGluZXxsaWJyYXJ5fG9ufG91dHxwYWNrZWR8cHJvcGVydHl8cmFpc2V8cmVzb3VyY2VzdHJpbmd8dGhyZWFkdmFyfHRyeSlcXGIvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIE1vZGlmaWVyc1xuXHRcdFx0cGF0dGVybjogLyhefFteJl0pXFxiKD86YWJzb2x1dGV8YWJzdHJhY3R8YWxpYXN8YXNzZW1ibGVyfGJpdHBhY2tlZHxicmVha3xjZGVjbHxjb250aW51ZXxjcHBkZWNsfGN2YXJ8ZGVmYXVsdHxkZXByZWNhdGVkfGR5bmFtaWN8ZW51bWVyYXRvcnxleHBlcmltZW50YWx8ZXhwb3J0fGV4dGVybmFsfGZhcnxmYXIxNnxmb3J3YXJkfGdlbmVyaWN8aGVscGVyfGltcGxlbWVudHN8aW5kZXh8aW50ZXJydXB0fGlvY2hlY2tzfGxvY2FsfG1lc3NhZ2V8bmFtZXxuZWFyfG5vZGVmYXVsdHxub3JldHVybnxub3N0YWNrZnJhbWV8b2xkZnBjY2FsbHxvdGhlcndpc2V8b3ZlcmxvYWR8b3ZlcnJpZGV8cGFzY2FsfHBsYXRmb3JtfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xwdWJsaXNoZWR8cmVhZHxyZWdpc3RlcnxyZWludHJvZHVjZXxyZXN1bHR8c2FmZWNhbGx8c2F2ZXJlZ2lzdGVyc3xzb2Z0ZmxvYXR8c3BlY2lhbGl6ZXxzdGF0aWN8c3RkY2FsbHxzdG9yZWR8c3RyaWN0fHVuYWxpZ25lZHx1bmltcGxlbWVudGVkfHZhcmFyZ3N8dmlydHVhbHx3cml0ZSlcXGIvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdudW1iZXInOiBbXG5cdFx0Ly8gSGV4YWRlY2ltYWwsIG9jdGFsIGFuZCBiaW5hcnlcblx0XHQvKD86WyYlXVxcZCt8XFwkW2EtZlxcZF0rKS9pLFxuXHRcdC8vIERlY2ltYWxcblx0XHQvXFxiXFxkKyg/OlxcLlxcZCspPyg/OmVbKy1dP1xcZCspPy9pXG5cdF0sXG5cdCdvcGVyYXRvcic6IFtcblx0XHQvXFwuXFwufFxcKlxcKnw6PXw8Wzw9Pl0/fD5bPj1dP3xbK1xcLSpcXC9dPT98W0BePV0vLFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXiZdKVxcYig/OmFuZHxhc3xkaXZ8ZXhjbHVkZXxpbnxpbmNsdWRlfGlzfG1vZHxub3R8b3J8c2hsfHNocnx4b3IpXFxiLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdwdW5jdHVhdGlvbic6IC9cXChcXC58XFwuXFwpfFsoKVxcW1xcXTo7LC5dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnBhc2NhbC5hc20uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgncGFzY2FsJywge1xuXHQnYXNtJzogdW5kZWZpbmVkLFxuXHQna2V5d29yZCc6IHVuZGVmaW5lZCxcblx0J29wZXJhdG9yJzogdW5kZWZpbmVkXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLm9iamVjdHBhc2NhbCA9IFByaXNtLmxhbmd1YWdlcy5wYXNjYWw7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvLyBQYXNjYWxpZ28gaXMgYSBsYXllciAyIHNtYXJ0IGNvbnRyYWN0IGxhbmd1YWdlIGZvciB0aGUgdGV6b3MgYmxvY2tjaGFpblxuXG5cdHZhciBicmFjZXMgPSAvXFwoKD86W14oKV18XFwoKD86W14oKV18XFwoW14oKV0qXFwpKSpcXCkpKlxcKS8uc291cmNlO1xuXHR2YXIgdHlwZSA9IC8oPzpcXGJcXHcrKD86PGJyYWNlcz4pP3w8YnJhY2VzPikvLnNvdXJjZS5yZXBsYWNlKC88YnJhY2VzPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBicmFjZXM7IH0pO1xuXG5cdHZhciBwYXNjYWxpZ28gPSBQcmlzbS5sYW5ndWFnZXMucGFzY2FsaWdvID0ge1xuXHRcdCdjb21tZW50JzogL1xcKFxcKltcXHNcXFNdKz9cXCpcXCl8XFwvXFwvLiovLFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFtcIidgXSkoPzpcXFxcW1xcc1xcU118KD8hXFwxKVteXFxcXF0pKlxcMXxcXF5bYS16XS9pLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnY2xhc3MtbmFtZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXFxidHlwZVxccytcXHcrXFxzK2lzXFxzKyk8dHlwZT4vLnNvdXJjZS5yZXBsYWNlKC88dHlwZT4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdHlwZTsgfSksICdpJyksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvPHR5cGU+KD89XFxzK2lzXFxiKS8uc291cmNlLnJlcGxhY2UoLzx0eXBlPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0eXBlOyB9KSwgJ2knKSxcblx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oOlxccyopPHR5cGU+Ly5zb3VyY2UucmVwbGFjZSgvPHR5cGU+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHR5cGU7IH0pKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14mXSlcXGIoPzpiZWdpbnxibG9ja3xjYXNlfGNvbnN0fGVsc2V8ZW5kfGZhaWx8Zm9yfGZyb218ZnVuY3Rpb258aWZ8aXN8bmlsfG9mfHJlbW92ZXxyZXR1cm58c2tpcHx0aGVufHR5cGV8dmFyfHdoaWxlfHdpdGgpXFxiL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnYm9vbGVhbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXiZdKVxcYig/OkZhbHNlfFRydWUpXFxiL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnYnVpbHRpbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXiZdKVxcYig/OmJvb2x8aW50fGxpc3R8bWFwfG5hdHxyZWNvcmR8c3RyaW5nfHVuaXQpXFxiL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnZnVuY3Rpb24nOiAvXFxiXFx3Kyg/PVxccypcXCgpLyxcblx0XHQnbnVtYmVyJzogW1xuXHRcdFx0Ly8gSGV4YWRlY2ltYWwsIG9jdGFsIGFuZCBiaW5hcnlcblx0XHRcdC8lWzAxXSt8JlswLTddK3xcXCRbYS1mXFxkXSsvaSxcblx0XHRcdC8vIERlY2ltYWxcblx0XHRcdC9cXGJcXGQrKD86XFwuXFxkKyk/KD86ZVsrLV0/XFxkKyk/KD86bXR6fG4pPy9pXG5cdFx0XSxcblx0XHQnb3BlcmF0b3InOiAvLT58PVxcLz18XFwuXFwufFxcKlxcKnw6PXw8Wzw9Pl0/fD5bPj1dP3xbK1xcLSpcXC9dPT98W0BePXxdfFxcYig/OmFuZHxtb2R8b3IpXFxiLyxcblx0XHQncHVuY3R1YXRpb24nOiAvXFwoXFwufFxcLlxcKXxbKClcXFtcXF06Oywue31dL1xuXHR9O1xuXG5cdHZhciBjbGFzc05hbWVJbnNpZGUgPSBbJ2NvbW1lbnQnLCAna2V5d29yZCcsICdidWlsdGluJywgJ29wZXJhdG9yJywgJ3B1bmN0dWF0aW9uJ10ucmVkdWNlKGZ1bmN0aW9uIChhY2N1bSwga2V5KSB7XG5cdFx0YWNjdW1ba2V5XSA9IHBhc2NhbGlnb1trZXldO1xuXHRcdHJldHVybiBhY2N1bTtcblx0fSwge30pO1xuXG5cdHBhc2NhbGlnb1snY2xhc3MtbmFtZSddLmZvckVhY2goZnVuY3Rpb24gKHApIHtcblx0XHRwLmluc2lkZSA9IGNsYXNzTmFtZUluc2lkZTtcblx0fSk7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnBzbCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyMuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86XFxcXC58W15cXFxcXCJdKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3N5bWJvbCc6IC9cXFxcW250cmJBLVpcIlxcXFxdL1xuXHRcdH1cblx0fSxcblx0J2hlcmVkb2Mtc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC88PDwoW2EtekEtWl9dXFx3KilbXFxyXFxuXSg/Oi4qW1xcclxcbl0pKj9cXDFcXGIvLFxuXHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86X19tdWx0aXxfX3NpbmdsZXxjYXNlfGRlZmF1bHR8ZG98ZWxzZXxlbHNpZnxleGl0fGV4cG9ydHxmb3J8Zm9yZWFjaHxmdW5jdGlvbnxpZnxsYXN0fGxpbmV8bG9jYWx8bmV4dHxyZXF1aXJlc3xyZXR1cm58c3dpdGNofHVudGlsfHdoaWxlfHdvcmQpXFxiLyxcblx0J2NvbnN0YW50JzogL1xcYig/OkFMQVJNfENIQVJUX0FERF9HUkFQSHxDSEFSVF9ERUxFVEVfR1JBUEh8Q0hBUlRfREVTVFJPWXxDSEFSVF9MT0FEfENIQVJUX1BSSU5UfEVPRnxPRkZMSU5FfE9LfFBTTF9QUk9GX0xPR3xSX0NIRUNLX0hPUklafFJfQ0hFQ0tfVkVSVHxSX0NMSUNLRVJ8Ul9DT0xVTU58Ul9GUkFNRXxSX0lDT058Ul9MQUJFTHxSX0xBQkVMX0NFTlRFUnxSX0xJU1RfTVVMVElQTEV8Ul9MSVNUX01VTFRJUExFX05EfFJfTElTVF9TSU5HTEV8Ul9MSVNUX1NJTkdMRV9ORHxSX01FTlV8Ul9QT1BVUHxSX1BPUFVQX1NDUk9MTEVEfFJfUkFESU9fSE9SSVp8Ul9SQURJT19WRVJUfFJfUk9XfFJfU0NBTEVfSE9SSVp8Ul9TQ0FMRV9WRVJUfFJfU0VQX0hPUklafFJfU0VQX1ZFUlR8Ul9TUElOTkVSfFJfVEVYVF9GSUVMRHxSX1RFWFRfRklFTERfTEFCRUx8Ul9UT0dHTEV8VFJJTV9MRUFESU5HfFRSSU1fTEVBRElOR19BTkRfVFJBSUxJTkd8VFJJTV9SRURVTkRBTlR8VFJJTV9UUkFJTElOR3xWT0lEfFdBUk4pXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86RkFMU0V8RmFsc2V8Tk98Tm98VFJVRXxUcnVlfFlFU3xZZXN8ZmFsc2V8bm98dHJ1ZXx5ZXMpXFxiLyxcblx0J3ZhcmlhYmxlJzogL1xcYig/OlBzbERlYnVnfGVycm5vfGV4aXRfc3RhdHVzKVxcYi8sXG5cdCdidWlsdGluJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpQc2xFeGVjdXRlfFBzbEZ1bmN0aW9uQ2FsbHxQc2xGdW5jdGlvbkV4aXN0c3xQc2xTZXRPcHRpb25zfF9zbm1wX2RlYnVnfGFjb3N8YWRkX2RpYXJ5fGFubm90YXRlfGFubm90YXRlX2dldHxhc2NpaV90b19lYmNkaWN8YXNjdGltZXxhc2lufGF0YW58YXRleGl0fGJhdGNoX3NldHxibGFja291dHxjYXR8Y2VpbHxjaGFuX2V4aXN0c3xjaGFuZ2Vfc3RhdGV8Y2xvc2V8Y29kZV9jdnR8Y29uZF9zaWduYWx8Y29uZF93YWl0fGNvbnNvbGVfdHlwZXxjb252ZXJ0X2Jhc2V8Y29udmVydF9kYXRlfGNvbnZlcnRfbG9jYWxlX2RhdGV8Y29zfGNvc2h8Y3JlYXRlfGRhdGV8ZGNnZXRfdGV4dHxkZXN0cm95fGRlc3Ryb3lfbG9ja3xkZ2V0X3RleHR8ZGlmZmVyZW5jZXxkdW1wX2hpc3R8ZWJjZGljX3RvX2FzY2lpfGVuY3J5cHR8ZXZlbnRfYXJjaGl2ZXxldmVudF9jYXRhbG9nX2dldHxldmVudF9jaGVja3xldmVudF9xdWVyeXxldmVudF9yYW5nZV9tYW5hZ2V8ZXZlbnRfcmFuZ2VfcXVlcnl8ZXZlbnRfcmVwb3J0fGV2ZW50X3NjaGVkdWxlfGV2ZW50X3RyaWdnZXJ8ZXZlbnRfdHJpZ2dlcjJ8ZXhlY3V0ZXxleGlzdHN8ZXhwfGZhYnN8ZmlsZXxmbG9vcnxmbW9kfGZvcGVufGZzZWVrfGZ0ZWxsfGZ1bGxfZGlzY292ZXJ5fGdldHxnZXRfY2hhbl9pbmZvfGdldF9yYW5nZXN8Z2V0X3RleHR8Z2V0X3ZhcnN8Z2V0ZW52fGdldGhvc3RpbmZvfGdldHBpZHxnZXRwbmFtZXxncmVwfGhpc3Rvcnl8aGlzdG9yeV9nZXRfcmV0ZW50aW9ufGluX3RyYW5zaXRpb258aW5kZXh8aW50fGludGVybmFsfGludGVyc2VjdGlvbnxpc192YXJ8aXNudW1iZXJ8am9pbnxraWxsfGxlbmd0aHxsaW5lc3xsb2NrfGxvY2tfaW5mb3xsb2d8bG9nMTB8bG9nZXxtYXRjaGxpbmV8bXNnX2NoZWNrfG1zZ19nZXRfZm9ybWF0fG1zZ19nZXRfc2V2ZXJpdHl8bXNnX3ByaW50Znxtc2dfc3ByaW50ZnxudGhhcmd8bnRoYXJnZnxudGhsaW5lfG50aGxpbmVmfG51bV9ieXRlc3xudW1fY29uc29sZXN8cGNvbmZpZ3xwb3Blbnxwb3BsaW5lc3xwb3d8cHJpbnR8cHJpbnRmfHByb2NfZXhpc3RzfHByb2Nlc3N8cmFuZG9tfHJlYWR8cmVhZGxufHJlZnJlc2hfcGFyYW1ldGVyc3xyZW1vdGVfY2hlY2t8cmVtb3RlX2Nsb3NlfHJlbW90ZV9ldmVudF9xdWVyeXxyZW1vdGVfZXZlbnRfdHJpZ2dlcnxyZW1vdGVfZmlsZV9zZW5kfHJlbW90ZV9vcGVufHJlbW92ZXxyZXBsYWNlfHJpbmRleHxzZWNfY2hlY2tfcHJpdnxzZWNfc3RvcmVfZ2V0fHNlY19zdG9yZV9zZXR8c2V0fHNldF9hbGFybV9yYW5nZXN8c2V0X2xvY2FsZXxzaGFyZXxzaW58c2luaHxzbGVlcHxzbm1wX2FnZW50X2NvbmZpZ3xzbm1wX2FnZW50X3N0YXJ0fHNubXBfYWdlbnRfc3RvcHxzbm1wX2Nsb3NlfHNubXBfY29uZmlnfHNubXBfZ2V0fHNubXBfZ2V0X25leHR8c25tcF9oX2dldHxzbm1wX2hfZ2V0X25leHR8c25tcF9oX3NldHxzbm1wX29wZW58c25tcF9zZXR8c25tcF90cmFwX2lnbm9yZXxzbm1wX3RyYXBfbGlzdGVufHNubXBfdHJhcF9yYWlzZV9zdGRfdHJhcHxzbm1wX3RyYXBfcmVjZWl2ZXxzbm1wX3RyYXBfcmVnaXN0ZXJfaW18c25tcF90cmFwX3NlbmR8c25tcF93YWxrfHNvcGVufHNvcnR8c3BsaXRsaW5lfHNwcmludGZ8c3FydHxzcmFuZG9tfHN0cl9yZXBlYXR8c3RyY2FzZWNtcHxzdWJzZXR8c3Vic3RyfHN5c3RlbXx0YWlsfHRhbnx0YW5ofHRleHRfZG9tYWlufHRpbWV8dG1wbmFtfHRvbG93ZXJ8dG91cHBlcnx0cmFjZV9wc2xfcHJvY2Vzc3x0cmltfHVuaW9ufHVuaXF1ZXx1bmxvY2t8dW5zZXR8dmFfYXJnfHZhX3N0YXJ0fHdyaXRlKVxcYi8sXG5cdFx0YWxpYXM6ICdidWlsdGluLWZ1bmN0aW9uJ1xuXHR9LFxuXHQnZm9yZWFjaC12YXJpYWJsZSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYmZvcmVhY2hcXHMrKD86KD86XFx3K1xcYnxcIig/OlxcXFwufFteXFxcXFwiXSkqXCIpXFxzKyl7MCwyfSlbX2EtekEtWl1cXHcqKD89XFxzKlxcKCkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdmdW5jdGlvbic6IC9cXGJbX2Etel1cXHcqXFxiKD89XFxzKlxcKCkvaSxcblx0J251bWJlcic6IC9cXGIoPzoweFswLTlhLWZdK3xcXGQrKD86XFwuXFxkKyk/KVxcYi9pLFxuXHQnb3BlcmF0b3InOiAvLS18XFwrXFwrfCYmPT98XFx8XFx8PT98PDw9P3w+Pj0/fFs9IV1+fFstKyovJSZ8XiE9PD5dPT98XFwufFs6P10vLFxuXHQncHVuY3R1YXRpb24nOiAvWygpe31cXFtcXF07LF0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMucGNheGlzID0ge1xuXHQnc3RyaW5nJzogL1wiW15cIl0qXCIvLFxuXHQna2V5d29yZCc6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58OylcXHMqKVstQS1aXFxkXSsoPzpcXHMqXFxbWy1cXHddK1xcXSk/KD86XFxzKlxcKFwiW15cIl0qXCIoPzosXFxzKlwiW15cIl0qXCIpKlxcKSk/KD89XFxzKj0pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdrZXl3b3JkJzogL15bLUEtWlxcZF0rLyxcblx0XHRcdCdsYW5ndWFnZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oXFxzKilcXFtbLVxcd10rXFxdLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXFt8XFxdJC8sXG5cdFx0XHRcdFx0J3Byb3BlcnR5JzogL1stXFx3XSsvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnc3ViLWtleSc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oXFxzKilcXFNbXFxzXFxTXSovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncGFyYW1ldGVyJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1wiW15cIl0qXCIvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFwofFxcKSR8LC9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J29wZXJhdG9yJzogLz0vLFxuXHQndGxpc3QnOiB7XG5cdFx0cGF0dGVybjogL1RMSVNUXFxzKlxcKFxccypcXHcrKD86KD86XFxzKixcXHMqXCJbXlwiXSpcIikrfFxccyosXFxzKlwiW15cIl0qXCItXCJbXlwiXSpcIik/XFxzKlxcKS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2Z1bmN0aW9uJzogL15UTElTVC8sXG5cdFx0XHQncHJvcGVydHknOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKFxccypcXChcXHMqKVxcdysvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IC9cIlteXCJdKlwiLyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKCksXS8sXG5cdFx0XHQnb3BlcmF0b3InOiAvLS9cblx0XHR9XG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC9bOyxdLyxcblx0J251bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58XFxzKVxcZCsoPzpcXC5cXGQrKT8oPyFcXFMpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdib29sZWFuJzogL05PfFlFUy8sXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMucHggPSBQcmlzbS5sYW5ndWFnZXMucGNheGlzO1xuXG5QcmlzbS5sYW5ndWFnZXMucGVvcGxlY29kZSA9IHtcblx0J2NvbW1lbnQnOiBSZWdFeHAoW1xuXHRcdC8vIEMtc3R5bGUgbXVsdGlsaW5lIGNvbW1lbnRzXG5cdFx0L1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vLnNvdXJjZSxcblx0XHQvLyBSRU0gY29tbWVudHNcblx0XHQvXFxiUkVNW147XSo7Ly5zb3VyY2UsXG5cdFx0Ly8gTmVzdGVkIDwqICo+IGNvbW1lbnRzXG5cdFx0LzxcXCooPzpbXjwqXXxcXCooPyE+KXw8KD8hXFwqKXw8XFwqKD86KD8hXFwqPilbXFxzXFxTXSkqXFwqPikqXFwqPi8uc291cmNlLFxuXHRcdC8vIC8rICsvIGNvbW1lbnRzXG5cdFx0L1xcL1xcK1tcXHNcXFNdKj9cXCtcXC8vLnNvdXJjZSxcblx0XS5qb2luKCd8JykpLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8nKD86Jyd8W14nXFxyXFxuXSkqJyg/IScpfFwiKD86XCJcInxbXlwiXFxyXFxuXSkqXCIoPyFcIikvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQndmFyaWFibGUnOiAvJVxcdysvLFxuXHQnZnVuY3Rpb24tZGVmaW5pdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXHctXSkoPzpmdW5jdGlvbnxtZXRob2QpXFxzKylcXHcrL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58W14tXFx3XSkoPzphc3xjYXRjaHxjbGFzc3xjb21wb25lbnR8Y3JlYXRlfGV4dGVuZHN8Z2xvYmFsfGltcGxlbWVudHN8aW5zdGFuY2V8bG9jYWx8b2Z8cHJvcGVydHl8cmV0dXJucylcXHMrKVxcdysoPzo6XFx3KykqL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC86L1xuXHRcdH1cblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YWJzdHJhY3R8YWxpYXN8YXN8Y2F0Y2h8Y2xhc3N8Y29tcG9uZW50fGNvbnN0YW50fGNyZWF0ZXxkZWNsYXJlfGVsc2V8ZW5kLSg/OmNsYXNzfGV2YWx1YXRlfGZvcnxmdW5jdGlvbnxnZXR8aWZ8bWV0aG9kfHNldHx0cnl8d2hpbGUpfGV2YWx1YXRlfGV4dGVuZHN8Zm9yfGZ1bmN0aW9ufGdldHxnbG9iYWx8aWZ8aW1wbGVtZW50c3xpbXBvcnR8aW5zdGFuY2V8bGlicmFyeXxsb2NhbHxtZXRob2R8bnVsbHxvZnxvdXR8cGVvcGxlQ29kZXxwcml2YXRlfHByb2dyYW18cHJvcGVydHl8cHJvdGVjdGVkfHJlYWRvbmx5fHJlZnxyZXBlYXR8cmV0dXJucz98c2V0fHN0ZXB8dGhlbnx0aHJvd3x0b3x0cnl8dW50aWx8dmFsdWV8d2hlbig/Oi1vdGhlcik/fHdoaWxlKVxcYi9pLFxuXHQnb3BlcmF0b3Ita2V5d29yZCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86YW5kfG5vdHxvcilcXGIvaSxcblx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHR9LFxuXHQnZnVuY3Rpb24nOiAvW19hLXpdXFx3Kig/PVxccypcXCgpL2ksXG5cblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvaSxcblx0J251bWJlcic6IC9cXGJcXGQrKD86XFwuXFxkKyk/XFxiLyxcblx0J29wZXJhdG9yJzogLzw+fFs8Pl09P3whPXxcXCpcXCp8Wy0rKi98PUBdLyxcblx0J3B1bmN0dWF0aW9uJzogL1s6LjssKClbXFxdXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5wY29kZSA9IFByaXNtLmxhbmd1YWdlcy5wZW9wbGVjb2RlO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGJyYWNrZXRzID0gLyg/OlxcKCg/OlteKClcXFxcXXxcXFxcW1xcc1xcU10pKlxcKXxcXHsoPzpbXnt9XFxcXF18XFxcXFtcXHNcXFNdKSpcXH18XFxbKD86W15bXFxdXFxcXF18XFxcXFtcXHNcXFNdKSpcXF18PCg/OltePD5cXFxcXXxcXFxcW1xcc1xcU10pKj4pLy5zb3VyY2U7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnBlcmwgPSB7XG5cdFx0J2NvbW1lbnQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFBPRFxuXHRcdFx0XHRwYXR0ZXJuOiAvKF5cXHMqKT1cXHdbXFxzXFxTXSo/PWN1dC4qL20sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXCRdKSMuKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0Ly8gVE9ETyBDb3VsZCBiZSBuaWNlIHRvIGhhbmRsZSBIZXJlZG9jIHRvby5cblx0XHQnc3RyaW5nJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdFx0L1xcYig/OnF8cXF8cXd8cXgpKD8hW2EtekEtWjAtOV0pXFxzKi8uc291cmNlICtcblx0XHRcdFx0XHQnKD86JyArXG5cdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0Ly8gcS8uLi4vXG5cdFx0XHRcdFx0XHQvKFteYS16QS1aMC05XFxzeyhcXFs8XSkoPzooPyFcXDEpW15cXFxcXXxcXFxcW1xcc1xcU10pKlxcMS8uc291cmNlLFxuXG5cdFx0XHRcdFx0XHQvLyBxIGEuLi5hXG5cdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHRcdFx0XHRcdFx0LyhbYS16QS1aMC05XSkoPzooPyFcXDIpW15cXFxcXXxcXFxcW1xcc1xcU10pKlxcMi8uc291cmNlLFxuXG5cdFx0XHRcdFx0XHQvLyBxKC4uLilcblx0XHRcdFx0XHRcdC8vIHF7Li4ufVxuXHRcdFx0XHRcdFx0Ly8gcVsuLi5dXG5cdFx0XHRcdFx0XHQvLyBxPC4uLj5cblx0XHRcdFx0XHRcdGJyYWNrZXRzLFxuXHRcdFx0XHRcdF0uam9pbignfCcpICtcblx0XHRcdFx0XHQnKSdcblx0XHRcdFx0KSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBcIi4uLlwiLCBgLi4uYFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFwifGApKD86KD8hXFwxKVteXFxcXF18XFxcXFtcXHNcXFNdKSpcXDEvLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cblx0XHRcdC8vICcuLi4nXG5cdFx0XHQvLyBGSVhNRSBNdWx0aS1saW5lIHNpbmdsZS1xdW90ZWQgc3RyaW5ncyBhcmUgbm90IHN1cHBvcnRlZCBhcyB0aGV5IHdvdWxkIGJyZWFrIHZhcmlhYmxlcyBjb250YWluaW5nICdcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLycoPzpbXidcXFxcXFxyXFxuXXxcXFxcLikqJy8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J3JlZ2V4JzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdFx0L1xcYig/Om18cXIpKD8hW2EtekEtWjAtOV0pXFxzKi8uc291cmNlICtcblx0XHRcdFx0XHQnKD86JyArXG5cdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0Ly8gbS8uLi4vXG5cdFx0XHRcdFx0XHQvKFteYS16QS1aMC05XFxzeyhcXFs8XSkoPzooPyFcXDEpW15cXFxcXXxcXFxcW1xcc1xcU10pKlxcMS8uc291cmNlLFxuXG5cdFx0XHRcdFx0XHQvLyBtIGEuLi5hXG5cdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHRcdFx0XHRcdFx0LyhbYS16QS1aMC05XSkoPzooPyFcXDIpW15cXFxcXXxcXFxcW1xcc1xcU10pKlxcMi8uc291cmNlLFxuXG5cdFx0XHRcdFx0XHQvLyBtKC4uLilcblx0XHRcdFx0XHRcdC8vIG17Li4ufVxuXHRcdFx0XHRcdFx0Ly8gbVsuLi5dXG5cdFx0XHRcdFx0XHQvLyBtPC4uLj5cblx0XHRcdFx0XHRcdGJyYWNrZXRzLFxuXHRcdFx0XHRcdF0uam9pbignfCcpICtcblx0XHRcdFx0XHQnKScgK1xuXHRcdFx0XHRcdC9bbXNpeHBvZHVhbG5nY10qLy5zb3VyY2Vcblx0XHRcdFx0KSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBUaGUgbG9va2JlaGluZHMgcHJldmVudCAtcyBmcm9tIGJyZWFraW5nXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0XHQvKF58W14tXSlcXGIoPzpzfHRyfHkpKD8hW2EtekEtWjAtOV0pXFxzKi8uc291cmNlICtcblx0XHRcdFx0XHQnKD86JyArXG5cdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0Ly8gcy8uLi4vLi4uL1xuXHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0XHRcdFx0XHRcdC8oW15hLXpBLVowLTlcXHN7KFxcWzxdKSg/Oig/IVxcMilbXlxcXFxdfFxcXFxbXFxzXFxTXSkqXFwyKD86KD8hXFwyKVteXFxcXF18XFxcXFtcXHNcXFNdKSpcXDIvLnNvdXJjZSxcblxuXHRcdFx0XHRcdFx0Ly8gcyBhLi4uYS4uLmFcblx0XHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdFx0XHRcdFx0XHQvKFthLXpBLVowLTldKSg/Oig/IVxcMylbXlxcXFxdfFxcXFxbXFxzXFxTXSkqXFwzKD86KD8hXFwzKVteXFxcXF18XFxcXFtcXHNcXFNdKSpcXDMvLnNvdXJjZSxcblxuXHRcdFx0XHRcdFx0Ly8gcyguLi4pKC4uLilcblx0XHRcdFx0XHRcdC8vIHN7Li4ufXsuLi59XG5cdFx0XHRcdFx0XHQvLyBzWy4uLl1bLi4uXVxuXHRcdFx0XHRcdFx0Ly8gczwuLi4+PC4uLj5cblx0XHRcdFx0XHRcdC8vIHMoLi4uKVsuLi5dXG5cdFx0XHRcdFx0XHRicmFja2V0cyArIC9cXHMqLy5zb3VyY2UgKyBicmFja2V0cyxcblx0XHRcdFx0XHRdLmpvaW4oJ3wnKSArXG5cdFx0XHRcdFx0JyknICtcblx0XHRcdFx0XHQvW21zaXhwb2R1YWxuZ2Nlcl0qLy5zb3VyY2Vcblx0XHRcdFx0KSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXG5cdFx0XHQvLyAvLi4uL1xuXHRcdFx0Ly8gVGhlIGxvb2stYWhlYWQgdHJpZXMgdG8gcHJldmVudCB0d28gZGl2aXNpb25zIG9uXG5cdFx0XHQvLyB0aGUgc2FtZSBsaW5lIGZyb20gYmVpbmcgaGlnaGxpZ2h0ZWQgYXMgcmVnZXguXG5cdFx0XHQvLyBUaGlzIGRvZXMgbm90IHN1cHBvcnQgbXVsdGktbGluZSByZWdleC5cblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcLyg/OlteXFwvXFxcXFxcclxcbl18XFxcXC4pKlxcL1ttc2l4cG9kdWFsbmdjXSooPz1cXHMqKD86JHxbXFxyXFxuLC47fSkmfFxcLSsqfjw+IT9eXXwoPzphbmR8Y21wfGVxfGdlfGd0fGxlfGx0fG5lfG5vdHxvcnx4fHhvcilcXGIpKS8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cblx0XHQvLyBGSVhNRSBOb3Qgc3VyZSBhYm91dCB0aGUgaGFuZGxpbmcgb2YgOjosICcsIGFuZCAjXG5cdFx0J3ZhcmlhYmxlJzogW1xuXHRcdFx0Ly8gJHteUE9TVE1BVENIfVxuXHRcdFx0L1smKiRAJV1cXHtcXF5bQS1aXStcXH0vLFxuXHRcdFx0Ly8gJF5WXG5cdFx0XHQvWyYqJEAlXVxcXltBLVpfXS8sXG5cdFx0XHQvLyAkey4uLn1cblx0XHRcdC9bJiokQCVdIz8oPz1cXHspLyxcblx0XHRcdC8vICRmb29cblx0XHRcdC9bJiokQCVdIz8oPzooPzo6OikqJz8oPyFcXGQpW1xcdyRdKyg/IVtcXHckXSkpKyg/Ojo6KSovLFxuXHRcdFx0Ly8gJDFcblx0XHRcdC9bJiokQCVdXFxkKy8sXG5cdFx0XHQvLyAkXywgQF8sICUhXG5cdFx0XHQvLyBUaGUgbmVnYXRpdmUgbG9va2FoZWFkIHByZXZlbnRzIGZyb20gYnJlYWtpbmcgdGhlICU9IG9wZXJhdG9yXG5cdFx0XHQvKD8hJT0pWyRAJV1bIVwiIyQlJicoKSorLFxcLS5cXC86Ozw9Pj9AW1xcXFxcXF1eX2B7fH1+XS9cblx0XHRdLFxuXHRcdCdmaWxlaGFuZGxlJzoge1xuXHRcdFx0Ly8gPD4sIDxGT08+LCBfXG5cdFx0XHRwYXR0ZXJuOiAvPCg/IVs8PV0pXFxTKj8+fFxcYl9cXGIvLFxuXHRcdFx0YWxpYXM6ICdzeW1ib2wnXG5cdFx0fSxcblx0XHQndi1zdHJpbmcnOiB7XG5cdFx0XHQvLyB2MS4yLCAxLjIuM1xuXHRcdFx0cGF0dGVybjogL3ZcXGQrKD86XFwuXFxkKykqfFxcZCsoPzpcXC5cXGQrKXsyLH0vLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0fSxcblx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYnN1YlsgXFx0XSspXFx3Ky8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IC9cXGIoPzphbnl8YnJlYWt8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZGllfGRvfGVsc2V8ZWxzaWZ8ZXZhbHxmb3J8Zm9yZWFjaHxnaXZlbnxnb3RvfGlmfGxhc3R8bG9jYWx8bXl8bmV4dHxvdXJ8cGFja2FnZXxwcmludHxyZWRvfHJlcXVpcmV8cmV0dXJufHNheXxzdGF0ZXxzdWJ8c3dpdGNofHVuZGVmfHVubGVzc3x1bnRpbHx1c2V8d2hlbnx3aGlsZSlcXGIvLFxuXHRcdCdudW1iZXInOiAvXFxiKD86MHhbXFxkQS1GYS1mXSg/Ol8/W1xcZEEtRmEtZl0pKnwwYlswMV0oPzpfP1swMV0pKnwoPzooPzpcXGQoPzpfP1xcZCkqKT9cXC4pP1xcZCg/Ol8/XFxkKSooPzpbRWVdWystXT9cXGQrKT8pXFxiLyxcblx0XHQnb3BlcmF0b3InOiAvLVtyd3hvUldYT2V6c2ZkbHBTYmN0dWdrVEJNQUNdXFxifFxcK1srPV0/fC1bLT0+XT98XFwqXFwqPz0/fFxcL1xcLz89P3w9Wz1+Pl0/fH5bfj1dP3xcXHxcXHw/PT98JiY/PT98PCg/Oj0+P3w8PT8pP3w+Pj89P3whW349XT98WyVeXT0/fFxcLig/Oj18XFwuXFwuPyk/fFtcXFxcP118XFxieCg/Oj18XFxiKXxcXGIoPzphbmR8Y21wfGVxfGdlfGd0fGxlfGx0fG5lfG5vdHxvcnx4b3IpXFxiLyxcblx0XHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSw6XS9cblx0fTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIHR5cGVFeHByZXNzaW9uID0gLyg/OlxcYlthLXpBLVpdXFx3KnxbfFxcXFxbXFxdXSkrLy5zb3VyY2U7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnBocGRvYyA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2phdmFkb2NsaWtlJywge1xuXHRcdCdwYXJhbWV0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJyhAKD86Z2xvYmFsfHBhcmFtfHByb3BlcnR5KD86LXJlYWR8LXdyaXRlKT98dmFyKVxcXFxzKyg/OicgKyB0eXBlRXhwcmVzc2lvbiArICdcXFxccyspPylcXFxcJFxcXFx3KycpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncGhwZG9jJywgJ2tleXdvcmQnLCB7XG5cdFx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnKEAoPzpnbG9iYWx8cGFja2FnZXxwYXJhbXxwcm9wZXJ0eSg/Oi1yZWFkfC13cml0ZSk/fHJldHVybnxzdWJwYWNrYWdlfHRocm93c3x2YXIpXFxcXHMrKScgKyB0eXBlRXhwcmVzc2lvbiksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdrZXl3b3JkJzogL1xcYig/OmFycmF5fGJvb2x8Ym9vbGVhbnxjYWxsYmFja3xkb3VibGV8ZmFsc2V8ZmxvYXR8aW50fGludGVnZXJ8bWl4ZWR8bnVsbHxvYmplY3R8cmVzb3VyY2V8c2VsZnxzdHJpbmd8dHJ1ZXx2b2lkKVxcYi8sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1t8XFxcXFtcXF0oKV0vXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuamF2YWRvY2xpa2UuYWRkU3VwcG9ydCgncGhwJywgUHJpc20ubGFuZ3VhZ2VzLnBocGRvYyk7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncGhwJywgJ3ZhcmlhYmxlJywge1xuXHQndGhpcyc6IHtcblx0XHRwYXR0ZXJuOiAvXFwkdGhpc1xcYi8sXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnZ2xvYmFsJzogL1xcJCg/OkdMT0JBTFN8SFRUUF9SQVdfUE9TVF9EQVRBfF8oPzpDT09LSUV8RU5WfEZJTEVTfEdFVHxQT1NUfFJFUVVFU1R8U0VSVkVSfFNFU1NJT04pfGFyZ2N8YXJndnxodHRwX3Jlc3BvbnNlX2hlYWRlcnxwaHBfZXJyb3Jtc2cpXFxiLyxcblx0J3Njb3BlJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbXFx3XFxcXF0rOjovLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2tleXdvcmQnOiAvXFxiKD86cGFyZW50fHNlbGZ8c3RhdGljKVxcYi8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvOjp8XFxcXC9cblx0XHR9XG5cdH1cbn0pO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdHZhciB2YXJpYWJsZSA9IC9cXCRcXHcrfCVbYS16XSslLztcblxuXHR2YXIgYXJyb3dBdHRyID0gL1xcW1teW1xcXV0qXFxdLy5zb3VyY2U7XG5cdHZhciBhcnJvd0RpcmVjdGlvbiA9IC8oPzpbZHJsdV18ZG98ZG93bnxsZXxsZWZ0fHJpfHJpZ2h0fHVwKS8uc291cmNlO1xuXHR2YXIgYXJyb3dCb2R5ID0gJyg/Oi0rJyArIGFycm93RGlyZWN0aW9uICsgJy0rfFxcXFwuKycgKyBhcnJvd0RpcmVjdGlvbiArICdcXFxcLit8LSsoPzonICsgYXJyb3dBdHRyICsgJy0qKT98JyArIGFycm93QXR0ciArICctK3xcXFxcLisoPzonICsgYXJyb3dBdHRyICsgJ1xcXFwuKik/fCcgKyBhcnJvd0F0dHIgKyAnXFxcXC4rKSc7XG5cdHZhciBhcnJvd0xlZnQgPSAvKD86PHsxLDJ9fFxcL3sxLDJ9fFxcXFx7MSwyfXw8XFx8fFsjKl4rfXhvXSkvLnNvdXJjZTtcblx0dmFyIGFycm93UmlnaHQgPSAvKD86PnsxLDJ9fFxcL3sxLDJ9fFxcXFx7MSwyfXxcXHw+fFsjKl4re3hvXSkvLnNvdXJjZTtcblx0dmFyIGFycm93UHJlZml4ID0gL1tbP10/W294XT8vLnNvdXJjZTtcblx0dmFyIGFycm93U3VmZml4ID0gL1tveF0/W1xcXT9dPy8uc291cmNlO1xuXHR2YXIgYXJyb3cgPVxuXHRcdGFycm93UHJlZml4ICtcblx0XHQnKD86JyArXG5cdFx0YXJyb3dCb2R5ICsgYXJyb3dSaWdodCArXG5cdFx0J3wnICtcblx0XHRhcnJvd0xlZnQgKyBhcnJvd0JvZHkgKyAnKD86JyArIGFycm93UmlnaHQgKyAnKT8nICtcblx0XHQnKScgK1xuXHRcdGFycm93U3VmZml4O1xuXG5cdFByaXNtLmxhbmd1YWdlc1sncGxhbnQtdW1sJ10gPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSg/OicuKnxcXC8nW1xcc1xcU10qPydcXC8pL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQncHJlcHJvY2Vzc29yJzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKikhLiovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ3Byb3BlcnR5Jyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQndmFyaWFibGUnOiB2YXJpYWJsZVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopQCg/OmVuZHxzdGFydCl1bWxcXGIvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cblx0XHQnYXJyb3cnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhefFteLS48Pj98XFxcXFtcXF1veF0pLy5zb3VyY2UgKyBhcnJvdyArIC8oPyFbLS48Pj98XFxcXFxcXW94XSkvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcicsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhcXFspW15bXFxdXSsoPz1cXF0pLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcWyg/PSR8XFxdKXxeXFxdL1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiW15cIl0qXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQndGV4dCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxbWyBcXHRdKltcXHJcXG5dKyg/IVtcXHJcXG5dKSlbXlxcXV0qKD89XFxdKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0fSxcblxuXHRcdCdrZXl3b3JkJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXihbIFxcdF0qKSg/OmFic3RyYWN0XFxzK2NsYXNzfGVuZFxccysoPzpib3h8Zm9ya3xncm91cHxtZXJnZXxub3RlfHJlZnxzcGxpdHx0aXRsZSl8KD86Zm9ya3xzcGxpdCkoPzpcXHMrYWdhaW4pP3xhY3RpdmF0ZXxhY3RvcnxhZ2VudHxhbHR8YW5ub3RhdGlvbnxhcnRpZmFjdHxhdXRvYWN0aXZhdGV8YXV0b251bWJlcnxiYWNrd2FyZHxiaW5hcnl8Ym91bmRhcnl8Ym94fGJyZWFrfGNhcHRpb258Y2FyZHxjYXNlfGNpcmNsZXxjbGFzc3xjbG9ja3xjbG91ZHxjb2xsZWN0aW9uc3xjb21wb25lbnR8Y29uY2lzZXxjb250cm9sfGNyZWF0ZXxjcml0aWNhbHxkYXRhYmFzZXxkZWFjdGl2YXRlfGRlc3Ryb3l8ZGV0YWNofGRpYW1vbmR8ZWxzZXxlbHNlaWZ8ZW5kfGVuZFtocl1ub3RlfGVuZGlmfGVuZHN3aXRjaHxlbmR3aGlsZXxlbnRpdHl8ZW51bXxmaWxlfGZvbGRlcnxmb290ZXJ8ZnJhbWV8Z3JvdXB8W2hyXT9ub3RlfGhlYWRlcnxoZXhhZ29ufGhpZGV8aWZ8aW50ZXJmYWNlfGxhYmVsfGxlZ2VuZHxsb29wfG1hcHxuYW1lc3BhY2V8bmV0d29ya3xuZXdwYWdlfG5vZGV8bndkaWFnfG9iamVjdHxvcHR8cGFja2FnZXxwYWdlfHBhcnxwYXJ0aWNpcGFudHxwZXJzb258cXVldWV8cmVjdGFuZ2xlfHJlZnxyZW1vdmV8cmVwZWF0fHJlc3RvcmV8cmV0dXJufHJvYnVzdHxzY2FsZXxzZXR8c2hvd3xza2lucGFyYW18c3RhY2t8c3RhcnR8c3RhdGV8c3RvcHxzdG9yYWdlfHN3aXRjaHx0aXRsZXx0b2dldGhlcnx1c2VjYXNlfHVzZWNhc2VcXC98d2hpbGUpKD89XFxzfCQpL20sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdC9cXGIoPzplbHNlaWZ8ZXF1YWxzfG5vdHx3aGlsZSkoPz1cXHMqXFwoKS8sXG5cdFx0XHQvXFxiKD86YXN8aXN8dGhlbilcXGIvXG5cdFx0XSxcblxuXHRcdCdkaXZpZGVyJzoge1xuXHRcdFx0cGF0dGVybjogL149PS4rPT0kL20sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHR9LFxuXG5cdFx0J3RpbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvQCg/OlxcZCsoPzpbOi9dXFxkKyl7Mn18WystXT9cXGQrfDpbYS16XVxcdyooPzpbKy1dXFxkKyk/KVxcYi9pLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0fSxcblxuXHRcdCdjb2xvcic6IHtcblx0XHRcdHBhdHRlcm46IC8jKD86W2Etel9dK3xbYS1mQS1GMC05XSspXFxiLyxcblx0XHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHRcdH0sXG5cdFx0J3ZhcmlhYmxlJzogdmFyaWFibGUsXG5cblx0XHQncHVuY3R1YXRpb24nOiAvWzosOygpW1xcXXt9XXxcXC57M30vXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzWydwbGFudC11bWwnXS5hcnJvdy5pbnNpZGUuZXhwcmVzc2lvbi5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXNbJ3BsYW50LXVtbCddO1xuXG5cdFByaXNtLmxhbmd1YWdlc1sncGxhbnR1bWwnXSA9IFByaXNtLmxhbmd1YWdlc1sncGxhbnQtdW1sJ107XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnBsc3FsID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnc3FsJywge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwqW1xcc1xcU10qP1xcKlxcL3wtLS4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0Ly8gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vZGF0YWJhc2Uvb3JhY2xlL29yYWNsZS1kYXRhYmFzZS8yMS9sbnBscy9wbHNxbC1yZXNlcnZlZC13b3Jkcy1rZXl3b3Jkcy5odG1sXG5cdCdrZXl3b3JkJzogL1xcYig/OkF8QUNDRVNTSUJMRXxBRER8QUdFTlR8QUdHUkVHQVRFfEFMTHxBTFRFUnxBTkR8QU5ZfEFSUkFZfEFTfEFTQ3xBVHxBVFRSSUJVVEV8QVVUSElEfEFWR3xCRUdJTnxCRVRXRUVOfEJGSUxFX0JBU0V8QklOQVJZfEJMT0JfQkFTRXxCTE9DS3xCT0RZfEJPVEh8Qk9VTkR8QlVMS3xCWXxCWVRFfEN8Q0FMTHxDQUxMSU5HfENBU0NBREV8Q0FTRXxDSEFSfENIQVJBQ1RFUnxDSEFSU0VUfENIQVJTRVRGT1JNfENIQVJTRVRJRHxDSEFSX0JBU0V8Q0hFQ0t8Q0xPQl9CQVNFfENMT05FfENMT1NFfENMVVNURVJ8Q0xVU1RFUlN8Q09MQVVUSHxDT0xMRUNUfENPTFVNTlN8Q09NTUVOVHxDT01NSVR8Q09NTUlUVEVEfENPTVBJTEVEfENPTVBSRVNTfENPTk5FQ1R8Q09OU1RBTlR8Q09OU1RSVUNUT1J8Q09OVEVYVHxDT05USU5VRXxDT05WRVJUfENPVU5UfENSQVNIfENSRUFURXxDUkVERU5USUFMfENVUlJFTlR8Q1VSU09SfENVU1RPTURBVFVNfERBTkdMSU5HfERBVEF8REFURXxEQVRFX0JBU0V8REFZfERFQ0xBUkV8REVGQVVMVHxERUZJTkV8REVMRVRFfERFU0N8REVURVJNSU5JU1RJQ3xESVJFQ1RPUll8RElTVElOQ1R8RE9VQkxFfERST1B8RFVSQVRJT058RUxFTUVOVHxFTFNFfEVMU0lGfEVNUFRZfEVORHxFU0NBUEV8RVhDRVBUfEVYQ0VQVElPTnxFWENFUFRJT05TfEVYQ0xVU0lWRXxFWEVDVVRFfEVYSVNUU3xFWElUfEVYVEVSTkFMfEZFVENIfEZJTkFMfEZJUlNUfEZJWEVEfEZMT0FUfEZPUnxGT1JBTEx8Rk9SQ0V8RlJPTXxGVU5DVElPTnxHRU5FUkFMfEdPVE98R1JBTlR8R1JPVVB8SEFTSHxIQVZJTkd8SEVBUHxISURERU58SE9VUnxJREVOVElGSUVEfElGfElNTUVESUFURXxJTU1VVEFCTEV8SU58SU5DTFVESU5HfElOREVYfElOREVYRVN8SU5ESUNBVE9SfElORElDRVN8SU5GSU5JVEV8SU5TRVJUfElOU1RBTlRJQUJMRXxJTlR8SU5URVJGQUNFfElOVEVSU0VDVHxJTlRFUlZBTHxJTlRPfElOVkFMSURBVEV8SVN8SVNPTEFUSU9OfEpBVkF8TEFOR1VBR0V8TEFSR0V8TEVBRElOR3xMRU5HVEh8TEVWRUx8TElCUkFSWXxMSUtFfExJS0UyfExJS0U0fExJS0VDfExJTUlUfExJTUlURUR8TE9DQUx8TE9DS3xMT05HfExPT1B8TUFQfE1BWHxNQVhMRU58TUVNQkVSfE1FUkdFfE1JTnxNSU5VU3xNSU5VVEV8TU9EfE1PREV8TU9ESUZZfE1PTlRIfE1VTFRJU0VUfE1VVEFCTEV8TkFNRXxOQU58TkFUSU9OQUx8TkFUSVZFfE5DSEFSfE5FV3xOT0NPTVBSRVNTfE5PQ09QWXxOT1R8Tk9XQUlUfE5VTEx8TlVNQkVSX0JBU0V8T0JKRUNUfE9DSUNPTEx8T0NJREFURXxPQ0lEQVRFVElNRXxPQ0lEVVJBVElPTnxPQ0lJTlRFUlZBTHxPQ0lMT0JMT0NBVE9SfE9DSU5VTUJFUnxPQ0lSQVd8T0NJUkVGfE9DSVJFRkNVUlNPUnxPQ0lST1dJRHxPQ0lTVFJJTkd8T0NJVFlQRXxPRnxPTER8T058T05MWXxPUEFRVUV8T1BFTnxPUEVSQVRPUnxPUFRJT058T1J8T1JBQ0xFfE9SQURBVEF8T1JERVJ8T1JHQU5JWkFUSU9OfE9STEFOWXxPUkxWQVJZfE9USEVSU3xPVVR8T1ZFUkxBUFN8T1ZFUlJJRElOR3xQQUNLQUdFfFBBUkFMTEVMX0VOQUJMRXxQQVJBTUVURVJ8UEFSQU1FVEVSU3xQQVJFTlR8UEFSVElUSU9OfFBBU0NBTHxQRVJTSVNUQUJMRXxQSVBFfFBJUEVMSU5FRHxQTFVHR0FCTEV8UE9MWU1PUlBISUN8UFJBR01BfFBSRUNJU0lPTnxQUklPUnxQUklWQVRFfFBST0NFRFVSRXxQVUJMSUN8UkFJU0V8UkFOR0V8UkFXfFJFQUR8UkVDT1JEfFJFRnxSRUZFUkVOQ0V8UkVMSUVTX09OfFJFTXxSRU1BSU5ERVJ8UkVOQU1FfFJFU09VUkNFfFJFU1VMVHxSRVNVTFRfQ0FDSEV8UkVUVVJOfFJFVFVSTklOR3xSRVZFUlNFfFJFVk9LRXxST0xMQkFDS3xST1d8U0FNUExFfFNBVkV8U0FWRVBPSU5UfFNCMXxTQjJ8U0I0fFNFQ09ORHxTRUdNRU5UfFNFTEVDVHxTRUxGfFNFUEFSQVRFfFNFUVVFTkNFfFNFUklBTElaQUJMRXxTRVR8U0hBUkV8U0hPUlR8U0laRXxTSVpFX1R8U09NRXxTUEFSU0V8U1FMfFNRTENPREV8U1FMREFUQXxTUUxOQU1FfFNRTFNUQVRFfFNUQU5EQVJEfFNUQVJUfFNUQVRJQ3xTVERERVZ8U1RPUkVEfFNUUklOR3xTVFJVQ1R8U1RZTEV8U1VCTVVMVElTRVR8U1VCUEFSVElUSU9OfFNVQlNUSVRVVEFCTEV8U1VCVFlQRXxTVU18U1lOT05ZTXxUQUJBVVRIfFRBQkxFfFRET3xUSEV8VEhFTnxUSU1FfFRJTUVTVEFNUHxUSU1FWk9ORV9BQkJSfFRJTUVaT05FX0hPVVJ8VElNRVpPTkVfTUlOVVRFfFRJTUVaT05FX1JFR0lPTnxUT3xUUkFJTElOR3xUUkFOU0FDVElPTnxUUkFOU0FDVElPTkFMfFRSVVNURUR8VFlQRXxVQjF8VUIyfFVCNHxVTkRFUnxVTklPTnxVTklRVUV8VU5QTFVHfFVOU0lHTkVEfFVOVFJVU1RFRHxVUERBVEV8VVNFfFVTSU5HfFZBTElTVHxWQUxVRXxWQUxVRVN8VkFSSUFCTEV8VkFSSUFOQ0V8VkFSUkFZfFZBUllJTkd8VklFV3xWSUVXU3xWT0lEfFdIRU58V0hFUkV8V0hJTEV8V0lUSHxXT1JLfFdSQVBQRUR8V1JJVEV8WUVBUnxaT05FKVxcYi9pLFxuXHQvLyBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9kYXRhYmFzZS9vcmFjbGUvb3JhY2xlLWRhdGFiYXNlLzIxL2xucGxzL3Bsc3FsLWxhbmd1YWdlLWZ1bmRhbWVudGFscy5odG1sI0dVSUQtOTZBNDJGN0MtN0E3MS00QjkwLTgyNTUtQ0E5QzhCRDk3MjJFXG5cdCdvcGVyYXRvcic6IC86PT98PT58Wzw+Xn4hXT18XFwuXFwufFxcfFxcfHxcXCpcXCp8Wy0rKi8lPD49QF0vXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncGxzcWwnLCAnb3BlcmF0b3InLCB7XG5cdCdsYWJlbCc6IHtcblx0XHRwYXR0ZXJuOiAvPDxcXHMqXFx3K1xccyo+Pi8sXG5cdFx0YWxpYXM6ICdzeW1ib2wnXG5cdH0sXG59KTtcblxuLy8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcG93ZXJxdWVyeS1tL3Bvd2VyLXF1ZXJ5LW0tbGFuZ3VhZ2Utc3BlY2lmaWNhdGlvblxuXG5QcmlzbS5sYW5ndWFnZXMucG93ZXJxdWVyeSA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pKD86XFwvXFwqW1xcc1xcU10qP1xcKlxcL3xcXC9cXC8uKikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdxdW90ZWQtaWRlbnRpZmllcic6IHtcblx0XHRwYXR0ZXJuOiAvI1wiKD86W15cIlxcclxcbl18XCJcIikqXCIoPyFcIikvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oPzojISk/XCIoPzpbXlwiXFxyXFxuXXxcIlwiKSpcIig/IVwiKS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjb25zdGFudCc6IFtcblx0XHQvXFxiRGF5XFwuKD86RnJpZGF5fE1vbmRheXxTYXR1cmRheXxTdW5kYXl8VGh1cnNkYXl8VHVlc2RheXxXZWRuZXNkYXkpXFxiLyxcblx0XHQvXFxiVHJhY2VMZXZlbFxcLig/OkNyaXRpY2FsfEVycm9yfEluZm9ybWF0aW9ufFZlcmJvc2V8V2FybmluZylcXGIvLFxuXHRcdC9cXGJPY2N1cnJlbmNlXFwuKD86QWxsfEZpcnN0fExhc3QpXFxiLyxcblx0XHQvXFxiT3JkZXJcXC4oPzpBc2NlbmRpbmd8RGVzY2VuZGluZylcXGIvLFxuXHRcdC9cXGJSb3VuZGluZ01vZGVcXC4oPzpBd2F5RnJvbVplcm98RG93bnxUb0V2ZW58VG93YXJkWmVyb3xVcClcXGIvLFxuXHRcdC9cXGJNaXNzaW5nRmllbGRcXC4oPzpFcnJvcnxJZ25vcmV8VXNlTnVsbClcXGIvLFxuXHRcdC9cXGJRdW90ZVN0eWxlXFwuKD86Q3N2fE5vbmUpXFxiLyxcblx0XHQvXFxiSm9pbktpbmRcXC4oPzpGdWxsT3V0ZXJ8SW5uZXJ8TGVmdEFudGl8TGVmdE91dGVyfFJpZ2h0QW50aXxSaWdodE91dGVyKVxcYi8sXG5cdFx0L1xcYkdyb3VwS2luZFxcLig/Okdsb2JhbHxMb2NhbClcXGIvLFxuXHRcdC9cXGJFeHRyYVZhbHVlc1xcLig/OkVycm9yfElnbm9yZXxMaXN0KVxcYi8sXG5cdFx0L1xcYkpvaW5BbGdvcml0aG1cXC4oPzpEeW5hbWljfExlZnRIYXNofExlZnRJbmRleHxQYWlyd2lzZUhhc2h8UmlnaHRIYXNofFJpZ2h0SW5kZXh8U29ydE1lcmdlKVxcYi8sXG5cdFx0L1xcYkpvaW5TaWRlXFwuKD86TGVmdHxSaWdodClcXGIvLFxuXHRcdC9cXGJQcmVjaXNpb25cXC4oPzpEZWNpbWFsfERvdWJsZSlcXGIvLFxuXHRcdC9cXGJSZWxhdGl2ZVBvc2l0aW9uXFwuRnJvbSg/OkVuZHxTdGFydClcXGIvLFxuXHRcdC9cXGJUZXh0RW5jb2RpbmdcXC4oPzpBc2NpaXxCaWdFbmRpYW5Vbmljb2RlfFVuaWNvZGV8VXRmMTZ8VXRmOHxXaW5kb3dzKVxcYi8sXG5cdFx0L1xcYig/OkFueXxCaW5hcnl8RGF0ZXxEYXRlVGltZXxEYXRlVGltZVpvbmV8RHVyYXRpb258RnVuY3Rpb258SW50MTZ8SW50MzJ8SW50NjR8SW50OHxMaXN0fExvZ2ljYWx8Tm9uZXxOdW1iZXJ8UmVjb3JkfFRhYmxlfFRleHR8VGltZSlcXC5UeXBlXFxiLyxcblx0XHQvXFxibnVsbFxcYi9cblx0XSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQna2V5d29yZCc6IC9cXGIoPzphbmR8YXN8ZWFjaHxlbHNlfGVycm9yfGlmfGlufGlzfGxldHxtZXRhfG5vdHxudWxsYWJsZXxvcHRpb25hbHxvcnxvdGhlcndpc2V8c2VjdGlvbnxzaGFyZWR8dGhlbnx0cnl8dHlwZSlcXGJ8Iyg/OmJpbmFyeXxkYXRlfGRhdGV0aW1lfGRhdGV0aW1lem9uZXxkdXJhdGlvbnxpbmZpbml0eXxuYW58c2VjdGlvbnN8c2hhcmVkfHRhYmxlfHRpbWUpXFxiLyxcblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXiNcXHcuXSlbYS16X11bXFx3Ll0qKD89XFxzKlxcKCkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdkYXRhLXR5cGUnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OmFueXxhbnlub25udWxsfGJpbmFyeXxkYXRlfGRhdGV0aW1lfGRhdGV0aW1lem9uZXxkdXJhdGlvbnxmdW5jdGlvbnxsaXN0fGxvZ2ljYWx8bm9uZXxudW1iZXJ8cmVjb3JkfHRhYmxlfHRleHR8dGltZSlcXGIvLFxuXHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0fSxcblx0J251bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiMHhbXFxkYS1mXStcXGJ8KD86WystXT8oPzpcXGJcXGQrXFwuKT9cXGJcXGQrfFsrLV1cXC5cXGQrfChefFteLl0pXFxCXFwuXFxkKykoPzplWystXT9cXGQrKT9cXGIvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdvcGVyYXRvcic6IC9bLSsqXFwvJj9AXl18PCg/Oj0+P3w+KT98Pj0/fD0+P3xcXC5cXC5cXC4/Lyxcblx0J3B1bmN0dWF0aW9uJzogL1ssO1xcW1xcXSgpe31dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnBxID0gUHJpc20ubGFuZ3VhZ2VzWydwb3dlcnF1ZXJ5J107XG5QcmlzbS5sYW5ndWFnZXMubXNjcmlwdCA9IFByaXNtLmxhbmd1YWdlc1sncG93ZXJxdWVyeSddO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIHBvd2Vyc2hlbGwgPSBQcmlzbS5sYW5ndWFnZXMucG93ZXJzaGVsbCA9IHtcblx0XHQnY29tbWVudCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteYF0pPCNbXFxzXFxTXSo/Iz4vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15gXSkjLiovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnc3RyaW5nJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXCIoPzpgW1xcc1xcU118W15gXCJdKSpcIi8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLycoPzpbXiddfCcnKSonLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQvLyBNYXRjaGVzIG5hbWUgc3BhY2VzIGFzIHdlbGwgYXMgY2FzdHMsIGF0dHJpYnV0ZSBkZWNvcmF0b3JzLiBGb3JjZSBzdGFydGluZyB3aXRoIGxldHRlciB0byBhdm9pZCBtYXRjaGluZyBhcnJheSBpbmRpY2VzXG5cdFx0Ly8gU3VwcG9ydHMgdHdvIGxldmVscyBvZiBuZXN0ZWQgYnJhY2tldHMgKGUuZy4gYFtPdXRwdXRUeXBlKFtTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W2ludF1dKV1gKVxuXHRcdCduYW1lc3BhY2UnOiAvXFxbW2Etel0oPzpcXFsoPzpcXFtbXlxcXV0qXFxdfFteXFxbXFxdXSkqXFxdfFteXFxbXFxdXSkqXFxdL2ksXG5cdFx0J2Jvb2xlYW4nOiAvXFwkKD86ZmFsc2V8dHJ1ZSlcXGIvaSxcblx0XHQndmFyaWFibGUnOiAvXFwkXFx3K1xcYi8sXG5cdFx0Ly8gQ21kbGV0cyBhbmQgYWxpYXNlcy4gQWxpYXNlcyBzaG91bGQgY29tZSBsYXN0LCBvdGhlcndpc2UgXCJ3cml0ZVwiIGdldHMgcHJlZmVycmVkIG92ZXIgXCJ3cml0ZS1ob3N0XCIgZm9yIGV4YW1wbGVcblx0XHQvLyBHZXQtQ29tbWFuZCB8ID97ICRfLk1vZHVsZU5hbWUgLW1hdGNoIFwiTWljcm9zb2Z0LlBvd2VyU2hlbGwuKFV0aWx8Q29yZXxNYW5hZ2VtZW50KVwiIH1cblx0XHQvLyBHZXQtQWxpYXMgfCA/eyAkXy5SZWZlcmVuY2VkQ29tbWFuZC5Nb2R1bGUuTmFtZSAtbWF0Y2ggXCJNaWNyb3NvZnQuUG93ZXJTaGVsbC4oVXRpbHxDb3JlfE1hbmFnZW1lbnQpXCIgfVxuXHRcdCdmdW5jdGlvbic6IFtcblx0XHRcdC9cXGIoPzpBZGR8QXBwcm92ZXxBc3NlcnR8QmFja3VwfEJsb2NrfENoZWNrcG9pbnR8Q2xlYXJ8Q2xvc2V8Q29tcGFyZXxDb21wbGV0ZXxDb21wcmVzc3xDb25maXJtfENvbm5lY3R8Q29udmVydHxDb252ZXJ0RnJvbXxDb252ZXJ0VG98Q29weXxEZWJ1Z3xEZW55fERpc2FibGV8RGlzY29ubmVjdHxEaXNtb3VudHxFZGl0fEVuYWJsZXxFbnRlcnxFeGl0fEV4cGFuZHxFeHBvcnR8RmluZHxGb3JFYWNofEZvcm1hdHxHZXR8R3JhbnR8R3JvdXB8SGlkZXxJbXBvcnR8SW5pdGlhbGl6ZXxJbnN0YWxsfEludm9rZXxKb2lufExpbWl0fExvY2t8TWVhc3VyZXxNZXJnZXxNb3ZlfE5ld3xPcGVufE9wdGltaXplfE91dHxQaW5nfFBvcHxQcm90ZWN0fFB1Ymxpc2h8UHVzaHxSZWFkfFJlY2VpdmV8UmVkb3xSZWdpc3RlcnxSZW1vdmV8UmVuYW1lfFJlcGFpcnxSZXF1ZXN0fFJlc2V0fFJlc2l6ZXxSZXNvbHZlfFJlc3RhcnR8UmVzdG9yZXxSZXN1bWV8UmV2b2tlfFNhdmV8U2VhcmNofFNlbGVjdHxTZW5kfFNldHxTaG93fFNraXB8U29ydHxTcGxpdHxTdGFydHxTdGVwfFN0b3B8U3VibWl0fFN1c3BlbmR8U3dpdGNofFN5bmN8VGVlfFRlc3R8VHJhY2V8VW5ibG9ja3xVbmRvfFVuaW5zdGFsbHxVbmxvY2t8VW5wcm90ZWN0fFVucHVibGlzaHxVbnJlZ2lzdGVyfFVwZGF0ZXxVc2V8V2FpdHxXYXRjaHxXaGVyZXxXcml0ZSktW2Etel0rXFxiL2ksXG5cdFx0XHQvXFxiKD86YWN8Y2F0fGNoZGlyfGNsY3xjbGl8Y2xwfGNsdnxjb21wYXJlfGNvcHl8Y3B8Y3BpfGNwcHxjdnBhfGRicHxkZWx8ZGlmZnxkaXJ8ZWJwfGVjaG98ZXBhbHxlcGNzdnxlcHNufGVyYXNlfGZjfGZsfGZ0fGZ3fGdhbHxnYnB8Z2N8Z2NpfGdjc3xnZHJ8Z2l8Z2x8Z218Z3B8Z3BzfGdyb3VwfGdzdnxndXxndnxnd21pfGlleHxpaXxpcGFsfGlwY3N2fGlwc258aXJtfGl3bWl8aXdyfGtpbGx8bHB8bHN8bWVhc3VyZXxtaXxtb3VudHxtb3ZlfG1wfG12fG5hbHxuZHJ8bml8bnZ8b2d2fHBvcGR8cHN8cHVzaGR8cHdkfHJicHxyZHxyZHJ8cmVufHJpfHJtfHJtZGlyfHJuaXxybnB8cnB8cnZ8cnZwYXxyd21pfHNhbHxzYXBzfHNhc3Z8c2JwfHNjfHNlbGVjdHxzZXR8c2hjbXxzaXxzbHxzbGVlcHxzbHN8c29ydHxzcHxzcHBzfHNwc3Z8c3RhcnR8c3Z8c3dtaXx0ZWV8dHJjbXx0eXBlfHdyaXRlKVxcYi9pXG5cdFx0XSxcblx0XHQvLyBwZXIgaHR0cDovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2hoODQ3NzQ0LmFzcHhcblx0XHQna2V5d29yZCc6IC9cXGIoPzpCZWdpbnxCcmVha3xDYXRjaHxDbGFzc3xDb250aW51ZXxEYXRhfERlZmluZXxEb3xEeW5hbWljUGFyYW18RWxzZXxFbHNlSWZ8RW5kfEV4aXR8RmlsdGVyfEZpbmFsbHl8Rm9yfEZvckVhY2h8RnJvbXxGdW5jdGlvbnxJZnxJbmxpbmVTY3JpcHR8UGFyYWxsZWx8UGFyYW18UHJvY2Vzc3xSZXR1cm58U2VxdWVuY2V8U3dpdGNofFRocm93fFRyYXB8VHJ5fFVudGlsfFVzaW5nfFZhcnxXaGlsZXxXb3JrZmxvdylcXGIvaSxcblx0XHQnb3BlcmF0b3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxXKSg/OiF8LSg/OmI/KD86YW5kfHg/b3IpfGFzfCg/Ok5vdCk/KD86Q29udGFpbnN8SW58TGlrZXxNYXRjaCl8ZXF8Z2V8Z3R8aXMoPzpOb3QpP3xKb2lufGxlfGx0fG5lfG5vdHxSZXBsYWNlfHNoW2xyXSlcXGJ8LVstPV0/fFxcK1srPV0/fFsqXFwvJV09PykvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bfHt9W1xcXTsoKSwuXS9cblx0fTtcblxuXHQvLyBWYXJpYWJsZSBpbnRlcnBvbGF0aW9uIGluc2lkZSBzdHJpbmdzLCBhbmQgbmVzdGVkIGV4cHJlc3Npb25zXG5cdHBvd2Vyc2hlbGwuc3RyaW5nWzBdLmluc2lkZSA9IHtcblx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHQvLyBBbGxvdyBmb3Igb25lIGxldmVsIG9mIG5lc3Rpbmdcblx0XHRcdHBhdHRlcm46IC8oXnxbXmBdKVxcJFxcKCg/OlxcJFxcKFteXFxyXFxuKCldKlxcKXwoPyFcXCRcXCgpW15cXHJcXG4pXSkqXFwpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHBvd2Vyc2hlbGxcblx0XHR9LFxuXHRcdCdib29sZWFuJzogcG93ZXJzaGVsbC5ib29sZWFuLFxuXHRcdCd2YXJpYWJsZSc6IHBvd2Vyc2hlbGwudmFyaWFibGUsXG5cdH07XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnByb2Nlc3NpbmcgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J2tleXdvcmQnOiAvXFxiKD86YnJlYWt8Y2FzZXxjYXRjaHxjbGFzc3xjb250aW51ZXxkZWZhdWx0fGVsc2V8ZXh0ZW5kc3xmaW5hbHxmb3J8aWZ8aW1wbGVtZW50c3xpbXBvcnR8bmV3fG51bGx8cHJpdmF0ZXxwdWJsaWN8cmV0dXJufHN0YXRpY3xzdXBlcnxzd2l0Y2h8dGhpc3x0cnl8dm9pZHx3aGlsZSlcXGIvLFxuXHQvLyBTcGFjZXMgYXJlIGFsbG93ZWQgYmV0d2VlbiBmdW5jdGlvbiBuYW1lIGFuZCBwYXJlbnRoZXNpc1xuXHQnZnVuY3Rpb24nOiAvXFxiXFx3Kyg/PVxccypcXCgpLyxcblx0J29wZXJhdG9yJzogLzxbPD1dP3w+Wz49XT98JiY/fFxcfFxcfD98WyU/XXxbIT0rXFwtKlxcL109Py9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdwcm9jZXNzaW5nJywgJ251bWJlcicsIHtcblx0Ly8gU3BlY2lhbCBjYXNlOiBYTUwgaXMgYSB0eXBlXG5cdCdjb25zdGFudCc6IC9cXGIoPyFYTUxcXGIpW0EtWl1bQS1aXFxkX10rXFxiLyxcblx0J3R5cGUnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OmJvb2xlYW58Ynl0ZXxjaGFyfGNvbG9yfGRvdWJsZXxmbG9hdHxpbnR8W0EtWl1cXHcqKVxcYi8sXG5cdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLnByb2xvZyA9IHtcblx0Ly8gU3ludGF4IGRlcGVuZHMgb24gdGhlIGltcGxlbWVudGF0aW9uXG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfCUuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdC8vIERlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24sIHN0cmluZ3MgbWF5IGFsbG93IGVzY2FwZWQgbmV3bGluZXMgYW5kIHF1b3RlLWVzY2FwZVxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oW1wiJ10pKD86XFwxXFwxfFxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEoPyFcXDEpLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2J1aWx0aW4nOiAvXFxiKD86Znh8Znl8eGZbeHldP3x5Zng/KVxcYi8sXG5cdC8vIEZJWE1FOiBTaG91bGQgd2UgbGlzdCBhbGwgbnVsbC1hcnkgcHJlZGljYXRlcyAobm90IGZvbGxvd2VkIGJ5IGEgcGFyZW50aGVzaXMpIGxpa2UgaGFsdCwgdHJhY2UsIGV0Yy4/XG5cdCdmdW5jdGlvbic6IC9cXGJbYS16XVxcdyooPzooPz1cXCgpfFxcL1xcZCspLyxcblx0J251bWJlcic6IC9cXGJcXGQrKD86XFwuXFxkKik/Lyxcblx0Ly8gQ3VzdG9tIG9wZXJhdG9ycyBhcmUgYWxsb3dlZFxuXHQnb3BlcmF0b3InOiAvWzpcXFxcPT48XFwtPypAXFwvOytefCEkLl0rfFxcYig/OmlzfG1vZHxub3R8eG9yKVxcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCl7fVxcW1xcXSxdL1xufTtcblxuLy8gVGhhbmtzIHRvOiBodHRwczovL2dpdGh1Yi5jb20vcHJvbWV0aGV1cy1jb21tdW5pdHkvbW9uYWNvLXByb21xbC9ibG9iL21hc3Rlci9zcmMvcHJvbXFsL3Byb21xbC50c1xuLy8gQXMgd2VsbCBhczogaHR0cHM6Ly9rYXVzYWwuY28vYmxvZy9zbGF0ZS1wcmlzbS1hZGQtbmV3LXN5bnRheC1wcm9tcWwvXG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0Ly8gUHJvbVFMIEFnZ3JlZ2F0aW9uIE9wZXJhdG9yc1xuXHQvLyAoaHR0cHM6Ly9wcm9tZXRoZXVzLmlvL2RvY3MvcHJvbWV0aGV1cy9sYXRlc3QvcXVlcnlpbmcvb3BlcmF0b3JzLyNhZ2dyZWdhdGlvbi1vcGVyYXRvcnMpXG5cdHZhciBhZ2dyZWdhdGlvbnMgPSBbXG5cdFx0J3N1bScsXG5cdFx0J21pbicsXG5cdFx0J21heCcsXG5cdFx0J2F2ZycsXG5cdFx0J2dyb3VwJyxcblx0XHQnc3RkZGV2Jyxcblx0XHQnc3RkdmFyJyxcblx0XHQnY291bnQnLFxuXHRcdCdjb3VudF92YWx1ZXMnLFxuXHRcdCdib3R0b21rJyxcblx0XHQndG9waycsXG5cdFx0J3F1YW50aWxlJ1xuXHRdO1xuXG5cdC8vIFByb21RTCB2ZWN0b3IgbWF0Y2hpbmcgKyB0aGUgYnkgYW5kIHdpdGhvdXQgY2xhdXNlc1xuXHQvLyAoaHR0cHM6Ly9wcm9tZXRoZXVzLmlvL2RvY3MvcHJvbWV0aGV1cy9sYXRlc3QvcXVlcnlpbmcvb3BlcmF0b3JzLyN2ZWN0b3ItbWF0Y2hpbmcpXG5cdHZhciB2ZWN0b3JNYXRjaGluZyA9IFtcblx0XHQnb24nLFxuXHRcdCdpZ25vcmluZycsXG5cdFx0J2dyb3VwX3JpZ2h0Jyxcblx0XHQnZ3JvdXBfbGVmdCcsXG5cdFx0J2J5Jyxcblx0XHQnd2l0aG91dCcsXG5cdF07XG5cblx0Ly8gUHJvbVFMIG9mZnNldCBtb2RpZmllclxuXHQvLyAoaHR0cHM6Ly9wcm9tZXRoZXVzLmlvL2RvY3MvcHJvbWV0aGV1cy9sYXRlc3QvcXVlcnlpbmcvYmFzaWNzLyNvZmZzZXQtbW9kaWZpZXIpXG5cdHZhciBvZmZzZXRNb2RpZmllciA9IFsnb2Zmc2V0J107XG5cblx0dmFyIGtleXdvcmRzID0gYWdncmVnYXRpb25zLmNvbmNhdCh2ZWN0b3JNYXRjaGluZywgb2Zmc2V0TW9kaWZpZXIpO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5wcm9tcWwgPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSMuKi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3ZlY3Rvci1tYXRjaCc6IHtcblx0XHRcdC8vIE1hdGNoIHRoZSBjb21tYS1zZXBhcmF0ZWQgbGFiZWwgbGlzdHMgaW5zaWRlIHZlY3RvciBtYXRjaGluZzpcblx0XHRcdHBhdHRlcm46IG5ldyBSZWdFeHAoJygoPzonICsgdmVjdG9yTWF0Y2hpbmcuam9pbignfCcpICsgJylcXFxccyopXFxcXChbXildKlxcXFwpJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdsYWJlbC1rZXknOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xcYlteLF0rXFxiLyxcblx0XHRcdFx0XHRhbGlhczogJ2F0dHItbmFtZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKCksXS9cblx0XHRcdH0sXG5cdFx0fSxcblx0XHQnY29udGV4dC1sYWJlbHMnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFx7W157fV0qXFx9Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnbGFiZWwta2V5Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXGJbYS16X11cXHcqKD89XFxzKig/Oj18IVs9fl0pKS8sXG5cdFx0XHRcdFx0YWxpYXM6ICdhdHRyLW5hbWUnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnbGFiZWwtdmFsdWUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhbXCInYF0pKD86XFxcXFtcXHNcXFNdfCg/IVxcMSlbXlxcXFxdKSpcXDEvLFxuXHRcdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ2F0dHItdmFsdWUnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFx7fFxcfXw9fj98IVs9fl18LC8sXG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0J2NvbnRleHQtcmFuZ2UnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXFtbXFx3XFxzOl0rXFxdLywgLy8gWzFtXVxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFxbfFxcXXw6Lyxcblx0XHRcdFx0XHQncmFuZ2UtZHVyYXRpb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxiKD86XFxkKyg/OltzbWhkd3ldfG1zKSkrXFxiL2ksXG5cdFx0XHRcdFx0XHRhbGlhczogJ251bWJlcicsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFxib2Zmc2V0XFxzKylcXHcrLywgLy8gb2Zmc2V0IDFtXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdyYW5nZS1kdXJhdGlvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9cXGIoPzpcXGQrKD86W3NtaGR3eV18bXMpKStcXGIvaSxcblx0XHRcdFx0XHRcdGFsaWFzOiAnbnVtYmVyJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRdLFxuXHRcdCdrZXl3b3JkJzogbmV3IFJlZ0V4cCgnXFxcXGIoPzonICsga2V5d29yZHMuam9pbignfCcpICsgJylcXFxcYicsICdpJyksXG5cdFx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXHRcdCdudW1iZXInOiAvWy0rXT8oPzooPzpcXGJcXGQrKD86XFwuXFxkKyk/fFxcQlxcLlxcZCspKD86ZVstK10/XFxkKyk/XFxifFxcYig/OjB4WzAtOWEtZl0rfG5hbnxpbmYpXFxiKS9pLFxuXHRcdCdvcGVyYXRvcic6IC9bXFxeKi8lKy1dfD09fCE9fDw9fDx8Pj18PnxcXGIoPzphbmR8b3J8dW5sZXNzKVxcYi9pLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9be307KClgLC5bXFxdXS8sXG5cdH07XG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5wcm9wZXJ0aWVzID0ge1xuXHQnY29tbWVudCc6IC9eWyBcXHRdKlsjIV0uKiQvbSxcblx0J3ZhbHVlJzoge1xuXHRcdHBhdHRlcm46IC8oXlsgXFx0XSooPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXlxcXFxcXHM6PV0pKyg/OiAqWz06XSAqKD8hICl8ICkpKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W15cXFxcXFxyXFxuXSkrL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2F0dHItdmFsdWUnXG5cdH0sXG5cdCdrZXknOiB7XG5cdFx0cGF0dGVybjogL15bIFxcdF0qKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W15cXFxcXFxzOj1dKSsoPz0gKls9Ol18ICkvbSxcblx0XHRhbGlhczogJ2F0dHItbmFtZSdcblx0fSxcblx0J3B1bmN0dWF0aW9uJzogL1s9Ol0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGJ1aWx0aW5UeXBlcyA9IC9cXGIoPzpib29sfGJ5dGVzfGRvdWJsZXxzP2ZpeGVkKD86MzJ8NjQpfGZsb2F0fFtzdV0/aW50KD86MzJ8NjQpfHN0cmluZylcXGIvO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5wcm90b2J1ZiA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHRcdCdjbGFzcy1uYW1lJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmVudW18ZXh0ZW5kfG1lc3NhZ2V8c2VydmljZSlcXHMrKVtBLVphLXpfXVxcdyooPz1cXHMqXFx7KS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFxiKD86cnBjXFxzK1xcdyt8cmV0dXJucylcXHMqXFwoXFxzKig/OnN0cmVhbVxccyspPylcXC4/W0EtWmEtel9dXFx3Kig/OlxcLltBLVphLXpfXVxcdyopKig/PVxccypcXCkpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86ZW51bXxleHRlbmR8ZXh0ZW5zaW9uc3xpbXBvcnR8bWVzc2FnZXxvbmVvZnxvcHRpb258b3B0aW9uYWx8cGFja2FnZXxwdWJsaWN8cmVwZWF0ZWR8cmVxdWlyZWR8cmVzZXJ2ZWR8cmV0dXJuc3xycGMoPz1cXHMrXFx3KXxzZXJ2aWNlfHN0cmVhbXxzeW50YXh8dG8pXFxiKD8hXFxzKj1cXHMqXFxkKS8sXG5cdFx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKS9pXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3Byb3RvYnVmJywgJ29wZXJhdG9yJywge1xuXHRcdCdtYXAnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxibWFwPFxccypbXFx3Ll0rXFxzKixcXHMqW1xcdy5dK1xccyo+KD89XFxzK1thLXpfXVxcdypcXHMqWz07XSkvaSxcblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZScsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1s8Pi4sXS8sXG5cdFx0XHRcdCdidWlsdGluJzogYnVpbHRpblR5cGVzXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnYnVpbHRpbic6IGJ1aWx0aW5UeXBlcyxcblx0XHQncG9zaXRpb25hbC1jbGFzcy1uYW1lJzoge1xuXHRcdFx0cGF0dGVybjogLyg/OlxcYnxcXEJcXC4pW2Etel9dXFx3Kig/OlxcLlthLXpfXVxcdyopKig/PVxccytbYS16X11cXHcqXFxzKls9O10pL2ksXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnYW5ub3RhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxbXFxzKilbYS16X11cXHcqKD89XFxzKj0pL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHR9KTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdC8vIFRPRE86XG5cdC8vIC0gQWRkIENTUyBoaWdobGlnaHRpbmcgaW5zaWRlIDxzdHlsZT4gdGFnc1xuXHQvLyAtIEFkZCBzdXBwb3J0IGZvciBtdWx0aS1saW5lIGNvZGUgYmxvY2tzXG5cdC8vIC0gQWRkIHN1cHBvcnQgZm9yIGludGVycG9sYXRpb24gI3t9IGFuZCAhe31cblx0Ly8gLSBBZGQgc3VwcG9ydCBmb3IgdGFnIGludGVycG9sYXRpb24gI1tdXG5cdC8vIC0gQWRkIGV4cGxpY2l0IHN1cHBvcnQgZm9yIHBsYWluIHRleHQgdXNpbmcgfFxuXHQvLyAtIEFkZCBzdXBwb3J0IGZvciBtYXJrdXAgZW1iZWRkZWQgaW4gcGxhaW4gdGV4dFxuXG5cdFByaXNtLmxhbmd1YWdlcy5wdWcgPSB7XG5cblx0XHQvLyBNdWx0aWxpbmUgc3R1ZmYgc2hvdWxkIGFwcGVhciBiZWZvcmUgdGhlIHJlc3RcblxuXHRcdC8vIFRoaXMgaGFuZGxlcyBib3RoIHNpbmdsZS1saW5lIGFuZCBtdWx0aS1saW5lIGNvbW1lbnRzXG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF4oW1xcdCBdKikpXFwvXFwvLiooPzooPzpcXHI/XFxufFxccilcXDJbXFx0IF0uKykqL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblxuXHRcdC8vIEFsbCB0aGUgdGFnLXJlbGF0ZWQgcGFydCBpcyBpbiBsb29rYmVoaW5kXG5cdFx0Ly8gc28gdGhhdCBpdCBjYW4gYmUgaGlnaGxpZ2h0ZWQgYnkgdGhlIFwidGFnXCIgcGF0dGVyblxuXHRcdCdtdWx0aWxpbmUtc2NyaXB0Jzoge1xuXHRcdFx0cGF0dGVybjogLyheKFtcXHQgXSopc2NyaXB0XFxiLipcXC5bXFx0IF0qKSg/Oig/Olxccj9cXG58XFxyKD8hXFxuKSkoPzpcXDJbXFx0IF0uK3xcXHMqPyg/PVxccj9cXG58XFxyKSkpKy9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHR9LFxuXG5cdFx0Ly8gU2VlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgZm9yIGtub3duIGZpbHRlcnNcblx0XHQnZmlsdGVyJzoge1xuXHRcdFx0cGF0dGVybjogLyheKFtcXHQgXSopKTouKyg/Oig/Olxccj9cXG58XFxyKD8hXFxuKSkoPzpcXDJbXFx0IF0uK3xcXHMqPyg/PVxccj9cXG58XFxyKSkpKy9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZmlsdGVyLW5hbWUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL146W1xcdy1dKy8sXG5cdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHRcdFx0fSxcblx0XHRcdFx0J3RleHQnOiAvXFxTW1xcc1xcU10qLyxcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J211bHRpbGluZS1wbGFpbi10ZXh0Jzoge1xuXHRcdFx0cGF0dGVybjogLyheKFtcXHQgXSopW1xcd1xcLSMuXStcXC5bXFx0IF0qKSg/Oig/Olxccj9cXG58XFxyKD8hXFxuKSkoPzpcXDJbXFx0IF0uK3xcXHMqPyg/PVxccj9cXG58XFxyKSkpKy9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J21hcmt1cCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSopPC4rL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMubWFya3VwXG5cdFx0fSxcblx0XHQnZG9jdHlwZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxcXG4pW1xcdCBdKilkb2N0eXBlKD86IC4rKT8vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQvLyBUaGlzIGhhbmRsZSBhbGwgY29uZGl0aW9uYWwgYW5kIGxvb3Aga2V5d29yZHNcblx0XHQnZmxvdy1jb250cm9sJzoge1xuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKikoPzpjYXNlfGRlZmF1bHR8ZWFjaHxlbHNlfGlmfHVubGVzc3x3aGVufHdoaWxlKVxcYig/OiAuKyk/L20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdlYWNoJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eZWFjaCAuKz8gaW5cXGIvLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J2tleXdvcmQnOiAvXFxiKD86ZWFjaHxpbilcXGIvLFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLywvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnYnJhbmNoJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKD86Y2FzZXxkZWZhdWx0fGVsc2V8aWZ8dW5sZXNzfHdoZW58d2hpbGUpXFxiLyxcblx0XHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJlc3Q6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQna2V5d29yZCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSopKD86YXBwZW5kfGJsb2NrfGV4dGVuZHN8aW5jbHVkZXxwcmVwZW5kKVxcYi4rL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnbWl4aW4nOiBbXG5cdFx0XHQvLyBEZWNsYXJhdGlvblxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKW1peGluIC4rL20sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdrZXl3b3JkJzogL15taXhpbi8sXG5cdFx0XHRcdFx0J2Z1bmN0aW9uJzogL1xcdysoPz1cXHMqXFwofFxccyokKS8sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1soKSwuXS9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdC8vIFVzYWdlXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSopXFwrLisvbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J25hbWUnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcK1xcdysvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHJlc3Q6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCdzY3JpcHQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qc2NyaXB0KD86KD86JlteKF0rKT9cXChbXildK1xcKSkqW1xcdCBdKS4rL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdH0sXG5cblx0XHQncGxhaW4tdGV4dCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSooPyEtKVtcXHdcXC0jLl0qW1xcd1xcLV0oPzooPzomW14oXSspP1xcKFteKV0rXFwpKSpcXC8/W1xcdCBdKS4rL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQndGFnJzoge1xuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKikoPyEtKVtcXHdcXC0jLl0qW1xcd1xcLV0oPzooPzomW14oXSspP1xcKFteKV0rXFwpKSpcXC8/Oj8vbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2F0dHJpYnV0ZXMnOiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLyZbXihdK1xcKFteKV0rXFwpLyxcblx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9cXChbXildK1xcKS8sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0J2F0dHItdmFsdWUnOiB7XG5cdFx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyg9XFxzKig/IVxccykpKD86XFx7W159XSpcXH18W14sKVxcclxcbl0rKS8sXG5cdFx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdCdhdHRyLW5hbWUnOiAvW1xcdy1dKyg/PVxccyohPz18XFxzKlssKV0pLyxcblx0XHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1shPSgpLF0rL1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzovLFxuXHRcdFx0XHQnYXR0ci1pZCc6IC8jW1xcd1xcLV0rLyxcblx0XHRcdFx0J2F0dHItY2xhc3MnOiAvXFwuW1xcd1xcLV0rL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2NvZGUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSooPzotfCE/PSkpLisvbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1suXFwtIT18XSsvXG5cdH07XG5cblx0dmFyIGZpbHRlcl9wYXR0ZXJuID0gLyheKFtcXHQgXSopKTo8ZmlsdGVyX25hbWU+KD86KD86XFxyP1xcbnxcXHIoPyFcXG4pKSg/OlxcMltcXHQgXS4rfFxccyo/KD89XFxyP1xcbnxcXHIpKSkrLy5zb3VyY2U7XG5cblx0Ly8gTm9uIGV4aGF1c3RpdmUgbGlzdCBvZiBhdmFpbGFibGUgZmlsdGVycyBhbmQgYXNzb2NpYXRlZCBsYW5ndWFnZXNcblx0dmFyIGZpbHRlcnMgPSBbXG5cdFx0eyBmaWx0ZXI6ICdhdHBsJywgbGFuZ3VhZ2U6ICd0d2lnJyB9LFxuXHRcdHsgZmlsdGVyOiAnY29mZmVlJywgbGFuZ3VhZ2U6ICdjb2ZmZWVzY3JpcHQnIH0sXG5cdFx0J2VqcycsXG5cdFx0J2hhbmRsZWJhcnMnLFxuXHRcdCdsZXNzJyxcblx0XHQnbGl2ZXNjcmlwdCcsXG5cdFx0J21hcmtkb3duJyxcblx0XHR7IGZpbHRlcjogJ3Nhc3MnLCBsYW5ndWFnZTogJ3Njc3MnIH0sXG5cdFx0J3N0eWx1cydcblx0XTtcblx0dmFyIGFsbF9maWx0ZXJzID0ge307XG5cdGZvciAodmFyIGkgPSAwLCBsID0gZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHR2YXIgZmlsdGVyID0gZmlsdGVyc1tpXTtcblx0XHRmaWx0ZXIgPSB0eXBlb2YgZmlsdGVyID09PSAnc3RyaW5nJyA/IHsgZmlsdGVyOiBmaWx0ZXIsIGxhbmd1YWdlOiBmaWx0ZXIgfSA6IGZpbHRlcjtcblx0XHRpZiAoUHJpc20ubGFuZ3VhZ2VzW2ZpbHRlci5sYW5ndWFnZV0pIHtcblx0XHRcdGFsbF9maWx0ZXJzWydmaWx0ZXItJyArIGZpbHRlci5maWx0ZXJdID0ge1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoZmlsdGVyX3BhdHRlcm4ucmVwbGFjZSgnPGZpbHRlcl9uYW1lPicsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZpbHRlci5maWx0ZXI7IH0pLCAnbScpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnZmlsdGVyLW5hbWUnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXjpbXFx3LV0rLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndGV4dCc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9cXFNbXFxzXFxTXSovLFxuXHRcdFx0XHRcdFx0YWxpYXM6IFtmaWx0ZXIubGFuZ3VhZ2UsICdsYW5ndWFnZS0nICsgZmlsdGVyLmxhbmd1YWdlXSxcblx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzW2ZpbHRlci5sYW5ndWFnZV1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncHVnJywgJ2ZpbHRlcicsIGFsbF9maWx0ZXJzKTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdFByaXNtLmxhbmd1YWdlcy5wdXBwZXQgPSB7XG5cdFx0J2hlcmVkb2MnOiBbXG5cdFx0XHQvLyBNYXRjaGVzIHRoZSBjb250ZW50IG9mIGEgcXVvdGVkIGhlcmVkb2Mgc3RyaW5nIChzdWJqZWN0IHRvIGludGVycG9sYXRpb24pXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oQFxcKFwiKFteXCJcXHJcXG5cXC8pOl0rKVwiKD86XFwvW25ydHMkdUxdKik/XFwpLiooPzpcXHI/XFxufFxccikpKD86LiooPzpcXHI/XFxufFxccig/IVxcbikpKSo/WyBcXHRdKig/OlxcfFsgXFx0XSopPyg/Oi1bIFxcdF0qKT9cXDIvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdC8vIE1hdGNoZXMgdGhlIGVuZCB0YWdcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvKD89XFxTKS4qXFxTKD89ICokKS9cblx0XHRcdFx0XHQvLyBTZWUgaW50ZXJwb2xhdGlvbiBiZWxvd1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0Ly8gTWF0Y2hlcyB0aGUgY29udGVudCBvZiBhbiB1bnF1b3RlZCBoZXJlZG9jIHN0cmluZyAobm8gaW50ZXJwb2xhdGlvbilcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhAXFwoKFteXCJcXHJcXG5cXC8pOl0rKSg/OlxcL1tucnRzJHVMXSopP1xcKS4qKD86XFxyP1xcbnxcXHIpKSg/Oi4qKD86XFxyP1xcbnxcXHIoPyFcXG4pKSkqP1sgXFx0XSooPzpcXHxbIFxcdF0qKT8oPzotWyBcXHRdKik/XFwyLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdC8vIE1hdGNoZXMgdGhlIGVuZCB0YWdcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvKD89XFxTKS4qXFxTKD89ICokKS9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdC8vIE1hdGNoZXMgdGhlIHN0YXJ0IHRhZyBvZiBoZXJlZG9jIHN0cmluZ3Ncblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL0BcXChcIj8oPzpbXlwiXFxyXFxuXFwvKTpdKylcIj8oPzpcXC9bbnJ0cyR1TF0qKT9cXCkvLFxuXHRcdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXFwoKS4rPyg/PVxcKSkvLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J211bHRpbGluZS1jb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdjb21tZW50J1xuXHRcdH0sXG5cdFx0J3JlZ2V4Jzoge1xuXHRcdFx0Ly8gTXVzdCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBrZXl3b3JkIFwibm9kZVwiIG9yIGEgbm9uLXdvcmQgY2hhclxuXHRcdFx0cGF0dGVybjogLygoPzpcXGJub2RlXFxzK3xbfj1cXChcXFtcXHssXVxccyp8Wz0rXT5cXHMqfF5cXHMqKSlcXC8oPzpbXlxcL1xcXFxdfFxcXFxbXFxzXFxTXSkrXFwvKD86W2lteF0rXFxifFxcQikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQvLyBFeHRlbmRlZCByZWdleGVzIG11c3QgaGF2ZSB0aGUgeCBmbGFnLiBUaGV5IGNhbiBjb250YWluIHNpbmdsZS1saW5lIGNvbW1lbnRzLlxuXHRcdFx0XHQnZXh0ZW5kZWQtcmVnZXgnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15cXC8oPzpbXlxcL1xcXFxdfFxcXFxbXFxzXFxTXSkrXFwvW2ltXSp4W2ltXSokLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdjb21tZW50JzogLyMuKi9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pIy4qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0Ly8gQWxsb3cgZm9yIG9uZSBuZXN0ZWQgbGV2ZWwgb2YgZG91YmxlIHF1b3RlcyBpbnNpZGUgaW50ZXJwb2xhdGlvblxuXHRcdFx0cGF0dGVybjogLyhbXCInXSkoPzpcXCRcXHsoPzpbXidcIn1dfChbXCInXSkoPzooPyFcXDIpW15cXFxcXXxcXFxcW1xcc1xcU10pKlxcMikrXFx9fFxcJCg/IVxceyl8KD8hXFwxKVteXFxcXCRdfFxcXFxbXFxzXFxTXSkqXFwxLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZG91YmxlLXF1b3RlZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlwiW1xcc1xcU10qXCIkLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdC8vIFNlZSBpbnRlcnBvbGF0aW9uIGJlbG93XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQndmFyaWFibGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwkKD86OjopP1xcdysoPzo6OlxcdyspKi8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzo6L1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2F0dHItbmFtZSc6IC8oPzpcXGJcXHcrfFxcKikoPz1cXHMqPT4pLyxcblx0XHQnZnVuY3Rpb24nOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFwuKSg/IVxcZClcXHcrLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdC9cXGIoPzpjb250YWlufGRlYnVnfGVycnxmYWlsfGluY2x1ZGV8aW5mb3xub3RpY2V8cmVhbGl6ZXxyZXF1aXJlfHRhZ3x3YXJuaW5nKVxcYnxcXGIoPyFcXGQpXFx3Kyg/PVxcKCkvXG5cdFx0XSxcblx0XHQnbnVtYmVyJzogL1xcYig/OjB4W2EtZlxcZF0rfFxcZCsoPzpcXC5cXGQrKT8oPzplLT9cXGQrKT8pXFxiL2ksXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHRcdC8vIEluY2x1ZGVzIHdvcmRzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86YXBwbGljYXRpb258YXR0cnxjYXNlfGNsYXNzfGNvbnN1bWVzfGRlZmF1bHR8ZGVmaW5lfGVsc2V8ZWxzaWZ8ZnVuY3Rpb258aWZ8aW1wb3J0fGluaGVyaXRzfG5vZGV8cHJpdmF0ZXxwcm9kdWNlc3x0eXBlfHVuZGVmfHVubGVzcylcXGIvLFxuXHRcdCdkYXRhdHlwZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzpBbnl8QXJyYXl8Qm9vbGVhbnxDYWxsYWJsZXxDYXRhbG9nZW50cnl8Q2xhc3N8Q29sbGVjdGlvbnxEYXRhfERlZmF1bHR8RW51bXxGbG9hdHxIYXNofEludGVnZXJ8Tm90VW5kZWZ8TnVtZXJpY3xPcHRpb25hbHxQYXR0ZXJufFJlZ2V4cHxSZXNvdXJjZXxSdW50aW1lfFNjYWxhcnxTdHJpbmd8U3RydWN0fFR1cGxlfFR5cGV8VW5kZWZ8VmFyaWFudClcXGIvLFxuXHRcdFx0YWxpYXM6ICdzeW1ib2wnXG5cdFx0fSxcblx0XHQnb3BlcmF0b3InOiAvPVs9fj5dP3whWz1+XT98PCg/OjxcXHw/fFs9fnwtXSk/fD5bPj1dP3wtPj98fj58XFx8Pj8+P3xbKlxcLyUrP118XFxiKD86YW5kfGlufG9yKVxcYi8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF17fSgpLiw7XXw6Ky9cblx0fTtcblxuXHR2YXIgaW50ZXJwb2xhdGlvbiA9IFtcblx0XHR7XG5cdFx0XHQvLyBBbGxvdyBmb3Igb25lIG5lc3RlZCBsZXZlbCBvZiBicmFjZXMgaW5zaWRlIGludGVycG9sYXRpb25cblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcJFxceyg/OlteJ1wie31dfFxce1tefV0qXFx9fChbXCInXSkoPzooPyFcXDIpW15cXFxcXXxcXFxcW1xcc1xcU10pKlxcMikrXFx9Lyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3Nob3J0LXZhcmlhYmxlJzoge1xuXHRcdFx0XHRcdC8vIE5lZ2F0aXZlIGxvb2stYWhlYWQgcHJldmVudCB3cm9uZyBoaWdobGlnaHRpbmcgb2YgZnVuY3Rpb25zXG5cdFx0XHRcdFx0cGF0dGVybjogLyheXFwkXFx7KSg/IVxcdytcXCgpKD86OjopP1xcdysoPzo6OlxcdyspKi8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC86Oi9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15cXCQvLFxuXHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJlc3Q6IFByaXNtLmxhbmd1YWdlcy5wdXBwZXRcblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcJCg/Ojo6KT9cXHcrKD86OjpcXHcrKSovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAndmFyaWFibGUnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC86Oi9cblx0XHRcdH1cblx0XHR9XG5cdF07XG5cdFByaXNtLmxhbmd1YWdlcy5wdXBwZXRbJ2hlcmVkb2MnXVswXS5pbnNpZGUuaW50ZXJwb2xhdGlvbiA9IGludGVycG9sYXRpb247XG5cdFByaXNtLmxhbmd1YWdlcy5wdXBwZXRbJ3N0cmluZyddLmluc2lkZVsnZG91YmxlLXF1b3RlZCddLmluc2lkZS5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHQvLyBodHRwczovL2FncmFlZi5naXRodWIuaW8vcHVyZS1kb2NzL3B1cmUuaHRtbCNsZXhpY2FsLW1hdHRlcnNcblxuXHRQcmlzbS5sYW5ndWFnZXMucHVyZSA9IHtcblx0XHQnY29tbWVudCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFw6XSlcXC9cXC8uKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQvIyEuKy9cblx0XHRdLFxuXHRcdCdpbmxpbmUtbGFuZyc6IHtcblx0XHRcdHBhdHRlcm46IC8lPFtcXHNcXFNdKz8lPi8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2xhbmcnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheJTwgKiktXFwqLS4rPy1cXCotLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnY29tbWVudCdcblx0XHRcdFx0fSxcblx0XHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXiU8Lip8JT4kLyxcblx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiKD86XFxcXC58W15cIlxcXFxcXHJcXG5dKSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdudW1iZXInOiB7XG5cdFx0XHQvLyBUaGUgbG9vay1iZWhpbmQgcHJldmVudHMgd3JvbmcgaGlnaGxpZ2h0aW5nIG9mIHRoZSAuLiBvcGVyYXRvclxuXHRcdFx0cGF0dGVybjogLygoPzpcXC5cXC4pPykoPzpcXGIoPzppbmZ8bmFuKVxcYnxcXGIweFtcXGRhLWZdK3woPzpcXGIoPzowYik/XFxkKyg/OlxcLlxcZCspP3xcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspP0w/KS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86TlVMTHxhbnN8YnJlYWt8YnR8Y2FzZXxjYXRjaHxjZHxjbGVhcnxjb25zdHxkZWZ8ZGVsfGR1bXB8ZWxzZXxlbmR8ZXhpdHxleHRlcm58ZmFsc2V8Zm9yY2V8aGVscHxpZnxpbmZpeFtscl0/fGludGVyZmFjZXxsZXR8bHN8bWVtfG5hbWVzcGFjZXxub25maXh8b2Z8b3RoZXJ3aXNlfG91dGZpeHxvdmVycmlkZXxwb3N0Zml4fHByZWZpeHxwcml2YXRlfHB1YmxpY3xwd2R8cXVpdHxydW58c2F2ZXxzaG93fHN0YXRzfHRoZW58dGhyb3d8dHJhY2V8dHJ1ZXx0eXBlfHVuZGVycmlkZXx1c2luZ3x3aGVufHdpdGgpXFxiLyxcblx0XHQnZnVuY3Rpb24nOiAvXFxiKD86YWJzfGFkZF8oPzphZGRyfGNvbnN0ZGVmfCg/OmZ1bmRlZnxpbnRlcmZhY2V8bWFjZGVmfHR5cGVkZWYpKD86X2F0KT98dmFyZGVmKXxhbGx8YW55fGFwcGxwP3xhcml0eXxiaWdpbnRwP3xibG9iKD86X2NyY3xfc2l6ZXxwKT98Ym9vbHA/fGJ5dGVfYz9zdHJpbmcoPzpfcG9pbnRlcik/fGJ5dGVfKD86bWF0cml4fHBvaW50ZXIpfGNhbGxvY3xjYXR8Y2F0bWFwfGNlaWx8Y2hhcltwc10/fGNoZWNrX3B0cnRhZ3xjaHJ8Y2xlYXJfc2VudHJ5fGNsZWFyc3ltfGNsb3N1cmVwP3xjbWF0cml4cD98Y29scz98Y29sY2F0KD86bWFwKT98Y29sbWFwfGNvbHJldnxjb2x2ZWN0b3IoPzpwfHNlcSk/fGNvbXBsZXgoPzpfZmxvYXRfKD86bWF0cml4fHBvaW50ZXIpfF9tYXRyaXgoPzpfdmlldyk/fF9wb2ludGVyfHApP3xjb25qfGNvb2tlZHA/fGNzdHxjc3RyaW5nKD86Xyg/OmR1cHxsaXN0fHZlY3RvcikpP3xjdXJyeTM/fGN5Y2xlbj98ZGVsXyg/OmNvbnN0ZGVmfGZ1bmRlZnxpbnRlcmZhY2V8bWFjZGVmfHR5cGVkZWZ8dmFyZGVmKXxkZWxldGV8ZGlhZyg/Om1hdCk/fGRpbXxkbWF0cml4cD98ZG98ZG91YmxlKD86X21hdHJpeCg/Ol92aWV3KT98X3BvaW50ZXJ8cCk/fGRvd2l0aDM/fGRyb3B8ZHJvcHdoaWxlfGV2YWwoPzpjbWQpP3xleGFjdHB8ZmlsdGVyfGZpeHxmaXhpdHl8ZmxpcHxmbG9hdCg/Ol9tYXRyaXh8X3BvaW50ZXIpfGZsb29yfGZvbGRbbHJdMT98ZnJhY3xmcmVlfGZ1bnA/fGZ1bmN0aW9ucD98Z2NkfGdldCg/Ol8oPzpieXRlfGNvbnN0ZGVmfGRvdWJsZXxmbG9hdHxmdW5kZWZ8aW50KD86NjQpP3xpbnRlcmZhY2UoPzpfdHlwZWRlZik/fGxvbmd8bWFjZGVmfHBvaW50ZXJ8cHRydGFnfHNlbnRyeXxzaG9ydHxzdHJpbmd8dHlwZWRlZnx2YXJkZWYpKT98Z2xvYnN5bXxoYXNofGhlYWR8aWR8aW18aW1hdHJpeHA/fGluZGV4fGluZXhhY3RwfGluZnB8aW5pdHxpbnNlcnR8aW50KD86X21hdHJpeCg/Ol92aWV3KT98X3BvaW50ZXJ8cCk/fGludDY0Xyg/Om1hdHJpeHxwb2ludGVyKXxpbnRlZ2VycD98aXRlcmF0ZW4/fGl0ZXJ3aGlsZXxqb2lufGtleXM/fGxhbWJkYXA/fGxhc3QoPzplcnIoPzpwb3MpPyk/fGxjZHxsaXN0WzJwXT98bGlzdG1hcHxtYWtlX3B0cnRhZ3xtYWxsb2N8bWFwfG1hdGNhdHxtYXRyaXhwP3xtYXh8bWVtYmVyfG1pbnxuYW5wfG5hcmdzfG5tYXRyaXhwP3xudWxsfG51bWJlcnA/fG9yZHxwYWNrKD86ZWQpP3xwb2ludGVyKD86X2Nhc3R8X3RhZ3xfdHlwZXxwKT98cG93fHByZWR8cHRydGFnfHB1dCg/Ol8oPzpieXRlfGRvdWJsZXxmbG9hdHxpbnQoPzo2NCk/fGxvbmd8cG9pbnRlcnxzaG9ydHxzdHJpbmcpKT98cmF0aW9uYWxwP3xyZXxyZWFscD98cmVhbGxvY3xyZWNvcmRwP3xyZWRpbXxyZWR1Y2UoPzpfd2l0aCk/fHJlZnA/fHJlcGVhdG4/fHJldmVyc2V8cmxpc3RwP3xyb3VuZHxyb3dzP3xyb3djYXQoPzptYXApP3xyb3dtYXB8cm93cmV2fHJvd3ZlY3Rvcig/OnB8c2VxKT98c2FtZXxzY2FuW2xyXTE/fHNlbnRyeXxzZ258c2hvcnRfKD86bWF0cml4fHBvaW50ZXIpfHNsaWNlfHNtYXRyaXhwP3xzb3J0fHNwbGl0fHN0cnxzdHJjYXR8c3RyZWFtfHN0cmlkZXxzdHJpbmcoPzpfKD86ZHVwfGxpc3R8dmVjdG9yKXxwKT98c3ViZGlhZyg/Om1hdCk/fHN1Ym1hdHxzdWJzZXEyP3xzdWJzdHJ8c3VjY3xzdXBkaWFnKD86bWF0KT98c3ltYm9scD98dGFpbHx0YWtlfHRha2V3aGlsZXx0aHVua3A/fHRyYW5zcG9zZXx0cnVuY3x0dXBsZXA/fHR5cGVwfHVieXRlfHVpbnQoPzo2NCk/fHVsb25nfHVuY3VycnkzP3x1bnJlZnx1bnppcDM/fHVwZGF0ZXx1c2hvcnR8dmFscz98dmFycD98dmVjdG9yKD86cHxzZXEpP3x2b2lkfHppcDM/fHppcHdpdGgzPylcXGIvLFxuXHRcdCdzcGVjaWFsJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYl9fW2Etel0rX19cXGIvaSxcblx0XHRcdGFsaWFzOiAnYnVpbHRpbidcblx0XHR9LFxuXHRcdC8vIEFueSBjb21iaW5hdGlvbiBvZiBvcGVyYXRvciBjaGFycyBjYW4gYmUgYW4gb3BlcmF0b3Jcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWlzbGVhZGluZy1jaGFyYWN0ZXItY2xhc3Ncblx0XHQnb3BlcmF0b3InOiAvKD86WyFcIiMkJSYnKissXFwtLlxcLzo8PT4/QFxcXFxeYHx+XFx1MDBhMS1cXHUwMGJmXFx1MDBkNy1cXHUwMGY3XFx1MjBkMC1cXHUyYmZmXXxcXGJfK1xcYikrfFxcYig/OmFuZHxkaXZ8bW9kfG5vdHxvcilcXGIvLFxuXHRcdC8vIEZJWE1FOiBIb3cgY2FuIHdlIHByZXZlbnQgfCBhbmQgLCB0byBiZSBoaWdobGlnaHRlZCBhcyBvcGVyYXRvciB3aGVuIHRoZXkgYXJlIHVzZWQgYWxvbmU/XG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKXt9XFxbXFxdOyx8XS9cblx0fTtcblxuXHR2YXIgaW5saW5lTGFuZ3VhZ2VzID0gW1xuXHRcdCdjJyxcblx0XHR7IGxhbmc6ICdjKysnLCBhbGlhczogJ2NwcCcgfSxcblx0XHQnZm9ydHJhbidcblx0XTtcblx0dmFyIGlubGluZUxhbmd1YWdlUmUgPSAvJTwgKi1cXCotICo8bGFuZz5cXGQqICotXFwqLVtcXHNcXFNdKz8lPi8uc291cmNlO1xuXG5cdGlubGluZUxhbmd1YWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChsYW5nKSB7XG5cdFx0dmFyIGFsaWFzID0gbGFuZztcblx0XHRpZiAodHlwZW9mIGxhbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRhbGlhcyA9IGxhbmcuYWxpYXM7XG5cdFx0XHRsYW5nID0gbGFuZy5sYW5nO1xuXHRcdH1cblx0XHRpZiAoUHJpc20ubGFuZ3VhZ2VzW2FsaWFzXSkge1xuXHRcdFx0dmFyIG8gPSB7fTtcblx0XHRcdG9bJ2lubGluZS1sYW5nLScgKyBhbGlhc10gPSB7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChpbmxpbmVMYW5ndWFnZVJlLnJlcGxhY2UoJzxsYW5nPicsIGxhbmcucmVwbGFjZSgvKFsuKyo/XFwvXFxcXCgpe31cXFtcXF1dKS9nLCAnXFxcXCQxJykpLCAnaScpLFxuXHRcdFx0XHRpbnNpZGU6IFByaXNtLnV0aWwuY2xvbmUoUHJpc20ubGFuZ3VhZ2VzLnB1cmVbJ2lubGluZS1sYW5nJ10uaW5zaWRlKVxuXHRcdFx0fTtcblx0XHRcdG9bJ2lubGluZS1sYW5nLScgKyBhbGlhc10uaW5zaWRlLnJlc3QgPSBQcmlzbS51dGlsLmNsb25lKFByaXNtLmxhbmd1YWdlc1thbGlhc10pO1xuXHRcdFx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncHVyZScsICdpbmxpbmUtbGFuZycsIG8pO1xuXHRcdH1cblx0fSk7XG5cblx0Ly8gQyBpcyB0aGUgZGVmYXVsdCBpbmxpbmUgbGFuZ3VhZ2Vcblx0aWYgKFByaXNtLmxhbmd1YWdlcy5jKSB7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzLnB1cmVbJ2lubGluZS1sYW5nJ10uaW5zaWRlLnJlc3QgPSBQcmlzbS51dGlsLmNsb25lKFByaXNtLmxhbmd1YWdlcy5jKTtcblx0fVxuXG59KFByaXNtKSk7XG5cbi8qXG5PcmlnaW5hbCBDb2RlIGJ5IEJhcyBHcm9vdGhlZGRlXG4hIU1BTlkgVEhBTktTISEgSSBuZXZlciB3b3VsZCBoYXZlIG1hZGUgdGhpcywgcmVnZXggYW5kIG1lIHdpbGwgbmV2ZXIgYmUgYmVzdCBmcmllbmRzIDspXG49PT4gaHR0cHM6Ly9jb2RlcGVuLmlvL0ltYWdpbmVQcm9ncmFtbWluZy9kZXRhaWxzL0pZeWRCeS9cbnNsaWdodGx5IGNoYW5nZWQgdG8gcGFzcyBhbGwgdGVzdHNcbiovXG5cblxuLy8gUHVyZUJhc2ljIHN1cHBvcnQsIHN0ZWFsIHN0dWZmIGZyb20gYW5zaS1jXG5QcmlzbS5sYW5ndWFnZXMucHVyZWJhc2ljID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdjb21tZW50JzogLzsuKi8sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFsaWdufGFuZHxhc3xicmVha3xjYWxsZGVidWdnZXJ8Y2FzZXxjb21waWxlcmNhc2V8Y29tcGlsZXJkZWZhdWx0fGNvbXBpbGVyZWxzZXxjb21waWxlcmVsc2VpZnxjb21waWxlcmVuZGlmfGNvbXBpbGVyZW5kc2VsZWN0fGNvbXBpbGVyZXJyb3J8Y29tcGlsZXJpZnxjb21waWxlcnNlbGVjdHxjb250aW51ZXxkYXRhfGRhdGFzZWN0aW9ufGRlYnVnfGRlYnVnbGV2ZWx8ZGVjbGFyZXxkZWNsYXJlY3xkZWNsYXJlY2RsbHxkZWNsYXJlZGxsfGRlY2xhcmVtb2R1bGV8ZGVmYXVsdHxkZWZpbmV8ZGltfGRpc2FibGVhc218ZGlzYWJsZWRlYnVnZ2VyfGRpc2FibGVleHBsaWNpdHxlbHNlfGVsc2VpZnxlbmFibGVhc218ZW5hYmxlZGVidWdnZXJ8ZW5hYmxlZXhwbGljaXR8ZW5kfGVuZGRhdGFzZWN0aW9ufGVuZGRlY2xhcmVtb2R1bGV8ZW5kZW51bWVyYXRpb258ZW5kaWZ8ZW5kaW1wb3J0fGVuZGludGVyZmFjZXxlbmRtYWNyb3xlbmRtb2R1bGV8ZW5kcHJvY2VkdXJlfGVuZHNlbGVjdHxlbmRzdHJ1Y3R1cmV8ZW5kc3RydWN0dXJldW5pb258ZW5kd2l0aHxlbnVtZXJhdGlvbnxleHRlbmRzfGZha2VyZXR1cm58Zm9yfGZvcmVhY2h8Zm9yZXZlcnxnbG9iYWx8Z29zdWJ8Z290b3xpZnxpbXBvcnR8aW1wb3J0Y3xpbmNsdWRlYmluYXJ5fGluY2x1ZGVmaWxlfGluY2x1ZGVwYXRofGludGVyZmFjZXxtYWNyb3xtb2R1bGV8bmV3bGlzdHxuZXdtYXB8bmV4dHxub3R8b3J8cHJvY2VkdXJlfHByb2NlZHVyZWN8cHJvY2VkdXJlY2RsbHxwcm9jZWR1cmVkbGx8cHJvY2VkdXJlcmV0dXJufHByb3RlY3RlZHxwcm90b3R5cGV8cHJvdG90eXBlY3xyZWFkfHJlZGltfHJlcGVhdHxyZXN0b3JlfHJldHVybnxydW50aW1lfHNlbGVjdHxzaGFyZWR8c3RhdGljfHN0ZXB8c3RydWN0dXJlfHN0cnVjdHVyZXVuaW9ufHN3YXB8dGhyZWFkZWR8dG98dW50aWx8d2VuZHx3aGlsZXx3aXRofHhpbmNsdWRlZmlsZXx4b3IpXFxiL2ksXG5cdCdmdW5jdGlvbic6IC9cXGJcXHcrKD86XFwuXFx3Kyk/XFxzKig/PVxcKCkvLFxuXHQnbnVtYmVyJzogLyg/OlxcJFtcXGRhLWZdK3xcXGItPyg/OlxcZCsoPzpcXC5cXGQrKT98XFwuXFxkKykoPzplWystXT9cXGQrKT8pXFxiL2ksXG5cdCdvcGVyYXRvcic6IC8oPzpAXFwqP3xcXD98XFwqKVxcdytcXCQ/fC1bPi1dP3xcXCtcXCs/fCE9P3w8PD89P3w+Pj89P3w9PT98JiY/fFxcfD9cXHx8W35eJT8qL0BdL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3B1cmViYXNpYycsICdrZXl3b3JkJywge1xuXHQndGFnJzogLyNcXHcrXFwkPy8sXG5cdCdhc20nOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKikhLiovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAndGFnJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdjb21tZW50JzogLzsuKi8sXG5cdFx0XHQnc3RyaW5nJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFtcIidgXSkoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0Ly8gQW5vbnltb3VzIGxhYmVsIHJlZmVyZW5jZXMsIGkuZS46IGptcCBAYlxuXHRcdFx0J2xhYmVsLXJlZmVyZW5jZS1hbm9ueW1vdXMnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oIVxccypqW2Etel0rXFxzKylAW2ZiXS9pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2Zhc20tbGFiZWwnXG5cdFx0XHR9LFxuXHRcdFx0Ly8gTmFtZWQgbGFiZWwgcmVmZXJlbmNlLCBpLmUuOiBqbmUgbGFiZWwxXG5cdFx0XHQnbGFiZWwtcmVmZXJlbmNlLWFkZHJlc3NlZCc6IHtcblx0XHRcdFx0cGF0dGVybjogLyghXFxzKmpbYS16XStcXHMrKVtBLVouXz8kQF1bXFx3Lj8kQH4jXSovaSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdmYXNtLWxhYmVsJ1xuXHRcdFx0fSxcblx0XHRcdCdrZXl3b3JkJzogW1xuXHRcdFx0XHQvXFxiKD86ZXh0ZXJufGdsb2JhbClcXGJbXjtcXHJcXG5dKi9pLFxuXHRcdFx0XHQvXFxiKD86Q1BVfERFRkFVTFR8RkxPQVQpXFxiLiovXG5cdFx0XHRdLFxuXHRcdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXihbXFx0IF0qIVxccyopW1xcZGEtel0rKD89XFxzfCQpL2ltLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J2Z1bmN0aW9uLWlubGluZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLyg6XFxzKilbXFxkYS16XSsoPz1cXHMpL2ksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0XHR9LFxuXHRcdFx0J2xhYmVsJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXihbXFx0IF0qIVxccyopW0EtWmEtei5fPyRAXVtcXHcuPyRAfiNdKig/PTopL20sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnZmFzbS1sYWJlbCdcblx0XHRcdH0sXG5cdFx0XHQncmVnaXN0ZXInOiAvXFxiKD86c3RcXGR8W3h5el1tbVxcZFxcZD98W2NkdF1yXFxkfHJcXGRcXGQ/W2J3ZF0/fFtlcl0/W2FiY2RdeHxbYWJjZF1baGxdfFtlcl0/KD86YnB8ZGl8c2l8c3ApfFtjZGVmZ3Ndc3xtbVxcZCspXFxiL2ksXG5cdFx0XHQnbnVtYmVyJzogLyg/OlxcYnwtfCg/PVxcJCkpKD86MFtoeF0oPzpbXFxkYS1mXSpcXC4pP1tcXGRhLWZdKyg/OnBbKy1dP1xcZCspP3xcXGRbXFxkYS1mXStbaHhdfFxcJFxcZFtcXGRhLWZdKnwwW29xXVswLTddK3xbMC03XStbb3FdfDBbYnldWzAxXSt8WzAxXStbYnldfDBbZHRdXFxkK3woPzpcXGQrKD86XFwuXFxkKyk/fFxcLlxcZCspKD86XFwuP2VbKy1dP1xcZCspP1tkdF0/KVxcYi9pLFxuXHRcdFx0J29wZXJhdG9yJzogL1tcXFtcXF0qK1xcLS8lPD49JnwkISwuOl0vXG5cdFx0fVxuXHR9XG59KTtcblxuZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5wdXJlYmFzaWNbJ2NsYXNzLW5hbWUnXTtcbmRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMucHVyZWJhc2ljWydib29sZWFuJ107XG5cblByaXNtLmxhbmd1YWdlcy5wYmZhc20gPSBQcmlzbS5sYW5ndWFnZXNbJ3B1cmViYXNpYyddO1xuXG5QcmlzbS5sYW5ndWFnZXMucHVyZXNjcmlwdCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2hhc2tlbGwnLCB7XG5cdCdrZXl3b3JkJzogL1xcYig/OmFkb3xjYXNlfGNsYXNzfGRhdGF8ZGVyaXZlfGRvfGVsc2V8Zm9yYWxsfGlmfGlufGluZml4bHxpbmZpeHJ8aW5zdGFuY2V8bGV0fG1vZHVsZXxuZXd0eXBlfG9mfHByaW1pdGl2ZXx0aGVufHR5cGV8d2hlcmUpXFxifFx1MjIwMC8sXG5cblx0J2ltcG9ydC1zdGF0ZW1lbnQnOiB7XG5cdFx0Ly8gVGhlIGltcG9ydGVkIG9yIGhpZGRlbiBuYW1lcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoaXMgaW1wb3J0XG5cdFx0Ly8gc3RhdGVtZW50LiBUaGlzIGlzIGJlY2F1c2Ugd2Ugd2FudCB0byBoaWdobGlnaHQgdGhvc2UgZXhhY3RseSBsaWtlXG5cdFx0Ly8gd2UgZG8gZm9yIHRoZSBuYW1lcyBpbiB0aGUgcHJvZ3JhbS5cblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKWltcG9ydFxccytbQS1aXVtcXHcnXSooPzpcXC5bQS1aXVtcXHcnXSopKig/Olxccythc1xccytbQS1aXVtcXHcnXSooPzpcXC5bQS1aXVtcXHcnXSopKik/KD86XFxzK2hpZGluZ1xcYik/L20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdrZXl3b3JkJzogL1xcYig/OmFzfGhpZGluZ3xpbXBvcnQpXFxiLyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0fVxuXHR9LFxuXG5cdC8vIFRoZXNlIGFyZSBidWlsdGluIGZ1bmN0aW9ucyBvbmx5LiBDb25zdHJ1Y3RvcnMgYXJlIGhpZ2hsaWdodGVkIGxhdGVyIGFzIGEgY29uc3RhbnQuXG5cdCdidWlsdGluJzogL1xcYig/OmFic3VyZHxhZGR8YXB8YXBwZW5kfGFwcGx5fGJldHdlZW58YmluZHxib3R0b218Y2xhbXB8Y29tcGFyZXxjb21wYXJpbmd8Y29tcG9zZXxjb25qfGNvbnN0fGRlZ3JlZXxkaXNjYXJkfGRpc2p8ZGl2fGVxfGZsYXB8ZmxpcHxnY2R8aWRlbnRpdHl8aWZNfGpvaW58bGNtfGxpZnRBMXxsaWZ0TTF8bWFwfG1heHxtZW1wdHl8bWlufG1vZHxtdWx8bmVnYXRlfG5vdHxub3RFcXxvbmV8b3RoZXJ3aXNlfHJlY2lwfHNob3d8c3VifHRvcHx1bml0fHVubGVzc3x1bmxlc3NNfHZvaWR8d2hlbnx3aGVuTXx6ZXJvKVxcYi8sXG5cblx0J29wZXJhdG9yJzogW1xuXHRcdC8vIEluZml4IG9wZXJhdG9yc1xuXHRcdFByaXNtLmxhbmd1YWdlcy5oYXNrZWxsLm9wZXJhdG9yWzBdLFxuXHRcdC8vIEFTQ0lJIG9wZXJhdG9yc1xuXHRcdFByaXNtLmxhbmd1YWdlcy5oYXNrZWxsLm9wZXJhdG9yWzJdLFxuXHRcdC8vIEFsbCBVVEYxNiBVbmljb2RlIG9wZXJhdG9yIHN5bWJvbHNcblx0XHQvLyBUaGlzIHJlZ2V4IGlzIGVxdWl2YWxlbnQgdG8gLyg/PVtcXHg4MC1cXHVGRkZGXSlbXFxwe2djPU1hdGhfU3ltYm9sfVxccHtnYz1DdXJyZW5jeV9TeW1ib2x9XFxwe01vZGlmaWVyX1N5bWJvbH1cXHB7T3RoZXJfU3ltYm9sfV0vdVxuXHRcdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vUHJpc21KUy9wcmlzbS9pc3N1ZXMvMzAwNiBmb3IgbW9yZSBkZXRhaWxzLlxuXHRcdC9bXFx4YTItXFx4YTZcXHhhOFxceGE5XFx4YWNcXHhhZS1cXHhiMVxceGI0XFx4YjhcXHhkN1xceGY3XFx1MDJjMi1cXHUwMmM1XFx1MDJkMi1cXHUwMmRmXFx1MDJlNS1cXHUwMmViXFx1MDJlZFxcdTAyZWYtXFx1MDJmZlxcdTAzNzVcXHUwMzg0XFx1MDM4NVxcdTAzZjZcXHUwNDgyXFx1MDU4ZC1cXHUwNThmXFx1MDYwNi1cXHUwNjA4XFx1MDYwYlxcdTA2MGVcXHUwNjBmXFx1MDZkZVxcdTA2ZTlcXHUwNmZkXFx1MDZmZVxcdTA3ZjZcXHUwN2ZlXFx1MDdmZlxcdTA5ZjJcXHUwOWYzXFx1MDlmYVxcdTA5ZmJcXHUwYWYxXFx1MGI3MFxcdTBiZjMtXFx1MGJmYVxcdTBjN2ZcXHUwZDRmXFx1MGQ3OVxcdTBlM2ZcXHUwZjAxLVxcdTBmMDNcXHUwZjEzXFx1MGYxNS1cXHUwZjE3XFx1MGYxYS1cXHUwZjFmXFx1MGYzNFxcdTBmMzZcXHUwZjM4XFx1MGZiZS1cXHUwZmM1XFx1MGZjNy1cXHUwZmNjXFx1MGZjZVxcdTBmY2ZcXHUwZmQ1LVxcdTBmZDhcXHUxMDllXFx1MTA5ZlxcdTEzOTAtXFx1MTM5OVxcdTE2NmRcXHUxN2RiXFx1MTk0MFxcdTE5ZGUtXFx1MTlmZlxcdTFiNjEtXFx1MWI2YVxcdTFiNzQtXFx1MWI3Y1xcdTFmYmRcXHUxZmJmLVxcdTFmYzFcXHUxZmNkLVxcdTFmY2ZcXHUxZmRkLVxcdTFmZGZcXHUxZmVkLVxcdTFmZWZcXHUxZmZkXFx1MWZmZVxcdTIwNDRcXHUyMDUyXFx1MjA3YS1cXHUyMDdjXFx1MjA4YS1cXHUyMDhjXFx1MjBhMC1cXHUyMGJmXFx1MjEwMFxcdTIxMDFcXHUyMTAzLVxcdTIxMDZcXHUyMTA4XFx1MjEwOVxcdTIxMTRcXHUyMTE2LVxcdTIxMThcXHUyMTFlLVxcdTIxMjNcXHUyMTI1XFx1MjEyN1xcdTIxMjlcXHUyMTJlXFx1MjEzYVxcdTIxM2JcXHUyMTQwLVxcdTIxNDRcXHUyMTRhLVxcdTIxNGRcXHUyMTRmXFx1MjE4YVxcdTIxOGJcXHUyMTkwLVxcdTIzMDdcXHUyMzBjLVxcdTIzMjhcXHUyMzJiLVxcdTI0MjZcXHUyNDQwLVxcdTI0NGFcXHUyNDljLVxcdTI0ZTlcXHUyNTAwLVxcdTI3NjdcXHUyNzk0LVxcdTI3YzRcXHUyN2M3LVxcdTI3ZTVcXHUyN2YwLVxcdTI5ODJcXHUyOTk5LVxcdTI5ZDdcXHUyOWRjLVxcdTI5ZmJcXHUyOWZlLVxcdTJiNzNcXHUyYjc2LVxcdTJiOTVcXHUyYjk3LVxcdTJiZmZcXHUyY2U1LVxcdTJjZWFcXHUyZTUwXFx1MmU1MVxcdTJlODAtXFx1MmU5OVxcdTJlOWItXFx1MmVmM1xcdTJmMDAtXFx1MmZkNVxcdTJmZjAtXFx1MmZmYlxcdTMwMDRcXHUzMDEyXFx1MzAxM1xcdTMwMjBcXHUzMDM2XFx1MzAzN1xcdTMwM2VcXHUzMDNmXFx1MzA5YlxcdTMwOWNcXHUzMTkwXFx1MzE5MVxcdTMxOTYtXFx1MzE5ZlxcdTMxYzAtXFx1MzFlM1xcdTMyMDAtXFx1MzIxZVxcdTMyMmEtXFx1MzI0N1xcdTMyNTBcXHUzMjYwLVxcdTMyN2ZcXHUzMjhhLVxcdTMyYjBcXHUzMmMwLVxcdTMzZmZcXHU0ZGMwLVxcdTRkZmZcXHVhNDkwLVxcdWE0YzZcXHVhNzAwLVxcdWE3MTZcXHVhNzIwXFx1YTcyMVxcdWE3ODlcXHVhNzhhXFx1YTgyOC1cXHVhODJiXFx1YTgzNi1cXHVhODM5XFx1YWE3Ny1cXHVhYTc5XFx1YWI1YlxcdWFiNmFcXHVhYjZiXFx1ZmIyOVxcdWZiYjItXFx1ZmJjMVxcdWZkZmNcXHVmZGZkXFx1ZmU2MlxcdWZlNjQtXFx1ZmU2NlxcdWZlNjlcXHVmZjA0XFx1ZmYwYlxcdWZmMWMtXFx1ZmYxZVxcdWZmM2VcXHVmZjQwXFx1ZmY1Y1xcdWZmNWVcXHVmZmUwLVxcdWZmZTZcXHVmZmU4LVxcdWZmZWVcXHVmZmZjXFx1ZmZmZF0vXG5cdF1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMucHVycyA9IFByaXNtLmxhbmd1YWdlcy5wdXJlc2NyaXB0O1xuXG5QcmlzbS5sYW5ndWFnZXMucHl0aG9uID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkjLiovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmctaW50ZXJwb2xhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKD86ZnxmcnxyZikoPzooXCJcIlwifCcnJylbXFxzXFxTXSo/XFwxfChcInwnKSg/OlxcXFwufCg/IVxcMilbXlxcXFxcXHJcXG5dKSpcXDIpL2ksXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdC8vIFwie1wiIDxleHByZXNzaW9uPiA8b3B0aW9uYWwgXCIhc1wiLCBcIiFyXCIsIG9yIFwiIWFcIj4gPG9wdGlvbmFsIFwiOlwiIGZvcm1hdCBzcGVjaWZpZXI+IFwifVwiXG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXntdKSg/Olxce1xceykqKVxceyg/IVxceykoPzpbXnt9XXxcXHsoPyFcXHspKD86W157fV18XFx7KD8hXFx7KSg/Oltee31dKStcXH0pK1xcfSkrXFx9Lyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2Zvcm1hdC1zcGVjJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLyg6KVteOigpe31dKyg/PVxcfSQpLyxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdjb252ZXJzaW9uLW9wdGlvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8hW3NyYV0oPz1bOn1dJCkvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHJlc3Q6IG51bGxcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fSxcblx0J3RyaXBsZS1xdW90ZWQtc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oPzpbcnViXXxicnxyYik/KFwiXCJcInwnJycpW1xcc1xcU10qP1xcMS9pLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3N0cmluZydcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKD86W3J1Yl18YnJ8cmIpPyhcInwnKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvaSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oKD86XnxcXHMpZGVmWyBcXHRdKylbYS16QS1aX11cXHcqKD89XFxzKlxcKCkvZyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdjbGFzcy1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiY2xhc3NcXHMrKVxcdysvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdkZWNvcmF0b3InOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKilAXFx3Kyg/OlxcLlxcdyspKi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6IFsnYW5ub3RhdGlvbicsICdwdW5jdHVhdGlvbiddLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHR9XG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/Ol8oPz1cXHMqOil8YW5kfGFzfGFzc2VydHxhc3luY3xhd2FpdHxicmVha3xjYXNlfGNsYXNzfGNvbnRpbnVlfGRlZnxkZWx8ZWxpZnxlbHNlfGV4Y2VwdHxleGVjfGZpbmFsbHl8Zm9yfGZyb218Z2xvYmFsfGlmfGltcG9ydHxpbnxpc3xsYW1iZGF8bWF0Y2h8bm9ubG9jYWx8bm90fG9yfHBhc3N8cHJpbnR8cmFpc2V8cmV0dXJufHRyeXx3aGlsZXx3aXRofHlpZWxkKVxcYi8sXG5cdCdidWlsdGluJzogL1xcYig/Ol9faW1wb3J0X198YWJzfGFsbHxhbnl8YXBwbHl8YXNjaWl8YmFzZXN0cmluZ3xiaW58Ym9vbHxidWZmZXJ8Ynl0ZWFycmF5fGJ5dGVzfGNhbGxhYmxlfGNocnxjbGFzc21ldGhvZHxjbXB8Y29lcmNlfGNvbXBpbGV8Y29tcGxleHxkZWxhdHRyfGRpY3R8ZGlyfGRpdm1vZHxlbnVtZXJhdGV8ZXZhbHxleGVjZmlsZXxmaWxlfGZpbHRlcnxmbG9hdHxmb3JtYXR8ZnJvemVuc2V0fGdldGF0dHJ8Z2xvYmFsc3xoYXNhdHRyfGhhc2h8aGVscHxoZXh8aWR8aW5wdXR8aW50fGludGVybnxpc2luc3RhbmNlfGlzc3ViY2xhc3N8aXRlcnxsZW58bGlzdHxsb2NhbHN8bG9uZ3xtYXB8bWF4fG1lbW9yeXZpZXd8bWlufG5leHR8b2JqZWN0fG9jdHxvcGVufG9yZHxwb3d8cHJvcGVydHl8cmFuZ2V8cmF3X2lucHV0fHJlZHVjZXxyZWxvYWR8cmVwcnxyZXZlcnNlZHxyb3VuZHxzZXR8c2V0YXR0cnxzbGljZXxzb3J0ZWR8c3RhdGljbWV0aG9kfHN0cnxzdW18c3VwZXJ8dHVwbGV8dHlwZXx1bmljaHJ8dW5pY29kZXx2YXJzfHhyYW5nZXx6aXApXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86RmFsc2V8Tm9uZXxUcnVlKVxcYi8sXG5cdCdudW1iZXInOiAvXFxiMCg/OmIoPzpfP1swMV0pK3xvKD86Xz9bMC03XSkrfHgoPzpfP1thLWYwLTldKSspXFxifCg/OlxcYlxcZCsoPzpfXFxkKykqKD86XFwuKD86XFxkKyg/Ol9cXGQrKSopPyk/fFxcQlxcLlxcZCsoPzpfXFxkKykqKSg/OmVbKy1dP1xcZCsoPzpfXFxkKykqKT9qPyg/IVxcdykvaSxcblx0J29wZXJhdG9yJzogL1stKyU9XT0/fCE9fDo9fFxcKlxcKj89P3xcXC9cXC8/PT98PFs8PT5dP3w+Wz0+XT98WyZ8Xn5dLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksLjpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnB5dGhvblsnc3RyaW5nLWludGVycG9sYXRpb24nXS5pbnNpZGVbJ2ludGVycG9sYXRpb24nXS5pbnNpZGUucmVzdCA9IFByaXNtLmxhbmd1YWdlcy5weXRob247XG5cblByaXNtLmxhbmd1YWdlcy5weSA9IFByaXNtLmxhbmd1YWdlcy5weXRob247XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvKipcblx0ICogUmVwbGFjZXMgYWxsIHBsYWNlaG9sZGVycyBcIjw8bj4+XCIgb2YgZ2l2ZW4gcGF0dGVybiB3aXRoIHRoZSBuLXRoIHJlcGxhY2VtZW50ICh6ZXJvIGJhc2VkKS5cblx0ICpcblx0ICogTm90ZTogVGhpcyBpcyBhIHNpbXBsZSB0ZXh0IGJhc2VkIHJlcGxhY2VtZW50LiBCZSBjYXJlZnVsIHdoZW4gdXNpbmcgYmFja3JlZmVyZW5jZXMhXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuIHRoZSBnaXZlbiBwYXR0ZXJuLlxuXHQgKiBAcGFyYW0ge3N0cmluZ1tdfSByZXBsYWNlbWVudHMgYSBsaXN0IG9mIHJlcGxhY2VtZW50IHdoaWNoIGNhbiBiZSBpbnNlcnRlZCBpbnRvIHRoZSBnaXZlbiBwYXR0ZXJuLlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgcGF0dGVybiB3aXRoIGFsbCBwbGFjZWhvbGRlcnMgcmVwbGFjZWQgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHJlcGxhY2VtZW50cy5cblx0ICogQGV4YW1wbGUgcmVwbGFjZSgvYTw8MD4+YS8uc291cmNlLCBbL2IrLy5zb3VyY2VdKSA9PT0gL2EoPzpiKylhLy5zb3VyY2Vcblx0ICovXG5cdGZ1bmN0aW9uIHJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnRzKSB7XG5cdFx0cmV0dXJuIHBhdHRlcm4ucmVwbGFjZSgvPDwoXFxkKyk+Pi9nLCBmdW5jdGlvbiAobSwgaW5kZXgpIHtcblx0XHRcdHJldHVybiAnKD86JyArIHJlcGxhY2VtZW50c1sraW5kZXhdICsgJyknO1xuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVyblxuXHQgKiBAcGFyYW0ge3N0cmluZ1tdfSByZXBsYWNlbWVudHNcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtmbGFnc11cblx0ICogQHJldHVybnMge1JlZ0V4cH1cblx0ICovXG5cdGZ1bmN0aW9uIHJlKHBhdHRlcm4sIHJlcGxhY2VtZW50cywgZmxhZ3MpIHtcblx0XHRyZXR1cm4gUmVnRXhwKHJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnRzKSwgZmxhZ3MgfHwgJycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXN0ZWQgcGF0dGVybiB3aGVyZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHN0cmluZyBgPDxzZWxmPj5gIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBwYXR0ZXJuIGl0c2VsZi5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cblx0ICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoTG9nMlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0ZnVuY3Rpb24gbmVzdGVkKHBhdHRlcm4sIGRlcHRoTG9nMikge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGVwdGhMb2cyOyBpKyspIHtcblx0XHRcdHBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UoLzw8c2VsZj4+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuICcoPzonICsgcGF0dGVybiArICcpJzsgfSk7XG5cdFx0fVxuXHRcdHJldHVybiBwYXR0ZXJuLnJlcGxhY2UoLzw8c2VsZj4+L2csICdbXlxcXFxzXFxcXFNdJyk7XG5cdH1cblxuXHQvLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9xdWFudHVtL3VzZXItZ3VpZGUvbGFuZ3VhZ2UvdHlwZXN5c3RlbS9cblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9xc2hhcnAtbGFuZ3VhZ2UvdHJlZS9tYWluL1NwZWNpZmljYXRpb25zL0xhbmd1YWdlLzVfR3JhbW1hclxuXHR2YXIga2V5d29yZEtpbmRzID0ge1xuXHRcdC8vIGtleXdvcmRzIHdoaWNoIHJlcHJlc2VudCBhIHJldHVybiBvciB2YXJpYWJsZSB0eXBlXG5cdFx0dHlwZTogJ0FkaiBCaWdJbnQgQm9vbCBDdGwgRG91YmxlIGZhbHNlIEludCBPbmUgUGF1bGkgUGF1bGlJIFBhdWxpWCBQYXVsaVkgUGF1bGlaIFF1Yml0IFJhbmdlIFJlc3VsdCBTdHJpbmcgdHJ1ZSBVbml0IFplcm8nLFxuXHRcdC8vIGFsbCBvdGhlciBrZXl3b3Jkc1xuXHRcdG90aGVyOiAnQWRqb2ludCBhZGpvaW50IGFwcGx5IGFzIGF1dG8gYm9keSBib3Jyb3cgYm9ycm93aW5nIENvbnRyb2xsZWQgY29udHJvbGxlZCBkaXN0cmlidXRlIGVsaWYgZWxzZSBmYWlsIGZpeHVwIGZvciBmdW5jdGlvbiBpZiBpbiBpbnRlcm5hbCBpbnRyaW5zaWMgaW52ZXJ0IGlzIGxldCBtdXRhYmxlIG5hbWVzcGFjZSBuZXcgbmV3dHlwZSBvcGVuIG9wZXJhdGlvbiByZXBlYXQgcmV0dXJuIHNlbGYgc2V0IHVudGlsIHVzZSB1c2luZyB3aGlsZSB3aXRoaW4nXG5cdH07XG5cdC8vIGtleXdvcmRzXG5cdGZ1bmN0aW9uIGtleXdvcmRzVG9QYXR0ZXJuKHdvcmRzKSB7XG5cdFx0cmV0dXJuICdcXFxcYig/OicgKyB3b3Jkcy50cmltKCkucmVwbGFjZSgvIC9nLCAnfCcpICsgJylcXFxcYic7XG5cdH1cblx0dmFyIGtleXdvcmRzID0gUmVnRXhwKGtleXdvcmRzVG9QYXR0ZXJuKGtleXdvcmRLaW5kcy50eXBlICsgJyAnICsga2V5d29yZEtpbmRzLm90aGVyKSk7XG5cblx0Ly8gdHlwZXNcblx0dmFyIGlkZW50aWZpZXIgPSAvXFxiW0EtWmEtel9dXFx3KlxcYi8uc291cmNlO1xuXHR2YXIgcXVhbGlmaWVkTmFtZSA9IHJlcGxhY2UoLzw8MD4+KD86XFxzKlxcLlxccyo8PDA+PikqLy5zb3VyY2UsIFtpZGVudGlmaWVyXSk7XG5cblx0dmFyIHR5cGVJbnNpZGUgPSB7XG5cdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHQncHVuY3R1YXRpb24nOiAvWzw+KCk/LC46W1xcXV0vXG5cdH07XG5cblx0Ly8gc3RyaW5nc1xuXHR2YXIgcmVndWxhclN0cmluZyA9IC9cIig/OlxcXFwufFteXFxcXFwiXSkqXCIvLnNvdXJjZTtcblxuXHRQcmlzbS5sYW5ndWFnZXMucXNoYXJwID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdFx0J2NvbW1lbnQnOiAvXFwvXFwvLiovLFxuXHRcdCdzdHJpbmcnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IHJlKC8oXnxbXiRcXFxcXSk8PDA+Pi8uc291cmNlLCBbcmVndWxhclN0cmluZ10pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdjbGFzcy1uYW1lJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBvcGVuIE1pY3Jvc29mdC5RdWFudHVtLkNhbm9uO1xuXHRcdFx0XHQvLyBvcGVuIE1pY3Jvc29mdC5RdWFudHVtLkNhbm9uIGFzIENOO1xuXHRcdFx0XHRwYXR0ZXJuOiByZSgvKFxcYig/OmFzfG9wZW4pXFxzKyk8PDA+Pig/PVxccyooPzo7fGFzXFxiKSkvLnNvdXJjZSwgW3F1YWxpZmllZE5hbWVdKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBuYW1lc3BhY2UgUXVhbnR1bS5BcHAxO1xuXHRcdFx0XHRwYXR0ZXJuOiByZSgvKFxcYm5hbWVzcGFjZVxccyspPDwwPj4oPz1cXHMqXFx7KS8uc291cmNlLCBbcXVhbGlmaWVkTmFtZV0pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHRcdH0sXG5cdFx0XSxcblx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdCdudW1iZXInOiAvKD86XFxiMCg/OnhbXFxkYS1mXSt8YlswMV0rfG9bMC03XSspfCg/OlxcQlxcLlxcZCt8XFxiXFxkKyg/OlxcLlxcZCopPykoPzplWy0rXT9cXGQrKT8pbD9cXGIvaSxcblx0XHQnb3BlcmF0b3InOiAvXFxiYW5kPXxcXGJvcj18XFxiYW5kXFxifFxcYm5vdFxcYnxcXGJvclxcYnw8Wy09XXxbLT1dPnw+Pj49P3w8PDw9P3xcXF5cXF5cXF49P3xcXHxcXHxcXHw9P3wmJiY9P3x3XFwvPT98fn5+fFsqXFwvK1xcLV49ISVdPT8vLFxuXHRcdCdwdW5jdHVhdGlvbic6IC86Onxbe31bXFxdOygpLC46XS9cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncXNoYXJwJywgJ251bWJlcicsIHtcblx0XHQncmFuZ2UnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwuXFwuLyxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fVxuXHR9KTtcblxuXHQvLyBzaW5nbGUgbGluZVxuXHR2YXIgaW50ZXJwb2xhdGlvbkV4cHIgPSBuZXN0ZWQocmVwbGFjZSgvXFx7KD86W15cInt9XXw8PDA+Pnw8PHNlbGY+PikqXFx9Ly5zb3VyY2UsIFtyZWd1bGFyU3RyaW5nXSksIDIpO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3FzaGFycCcsICdzdHJpbmcnLCB7XG5cdFx0J2ludGVycG9sYXRpb24tc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogcmUoL1xcJFwiKD86XFxcXC58PDwwPj58W15cXFxcXCJ7XSkqXCIvLnNvdXJjZSwgW2ludGVycG9sYXRpb25FeHByXSksXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogcmUoLygoPzpefFteXFxcXF0pKD86XFxcXFxcXFwpKik8PDA+Pi8uc291cmNlLCBbaW50ZXJwb2xhdGlvbkV4cHJdKSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXHt8XFx9JC8sXG5cdFx0XHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtcXNoYXJwJyxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucXNoYXJwXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5xcyA9IFByaXNtLmxhbmd1YWdlcy5xc2hhcnA7XG5cblByaXNtLmxhbmd1YWdlcy5xID0ge1xuXHQnc3RyaW5nJzogL1wiKD86XFxcXC58W15cIlxcXFxcXHJcXG5dKSpcIi8sXG5cdCdjb21tZW50JzogW1xuXHRcdC8vIEZyb20gaHR0cDovL2NvZGUua3guY29tL3dpa2kvUmVmZXJlbmNlL1NsYXNoOlxuXHRcdC8vIFdoZW4gLyBpcyBmb2xsb3dpbmcgYSBzcGFjZSAob3IgYSByaWdodCBwYXJlbnRoZXNpcywgYnJhY2tldCwgb3IgYnJhY2UpLCBpdCBpcyBpZ25vcmVkIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGxpbmUuXG5cdFx0e1xuXG5cdFx0XHRwYXR0ZXJuOiAvKFtcXHQgKVxcXX1dKVxcLy4qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdC8vIEZyb20gaHR0cDovL2NvZGUua3guY29tL3dpa2kvUmVmZXJlbmNlL1NsYXNoOlxuXHRcdC8vIEEgbGluZSB3aGljaCBoYXMgLyBhcyBpdHMgZmlyc3QgY2hhcmFjdGVyIGFuZCBjb250YWlucyBhdCBsZWFzdCBvbmUgb3RoZXIgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGEgd2hvbGUtbGluZSBjb21tZW50IGFuZCBpcyBpZ25vcmVkIGVudGlyZWx5LlxuXHRcdC8vIEEgLyBvbiBhIGxpbmUgYnkgaXRzZWxmIGJlZ2lucyBhIG11bHRpbGluZSBjb21tZW50IHdoaWNoIGlzIHRlcm1pbmF0ZWQgYnkgdGhlIG5leHQgXFwgb24gYSBsaW5lIGJ5IGl0c2VsZi5cblx0XHQvLyBJZiBhIC8gaXMgbm90IG1hdGNoZWQgYnkgYSBcXCwgdGhlIG11bHRpbGluZSBjb21tZW50IGlzIHVudGVybWluYXRlZCBhbmQgY29udGludWVzIHRvIGVuZCBvZiBmaWxlLlxuXHRcdC8vIFRoZSAvIGFuZCBcXCBtdXN0IGJlIHRoZSBmaXJzdCBjaGFyIG9uIHRoZSBsaW5lLCBidXQgbWF5IGJlIGZvbGxvd2VkIGJ5IGFueSBhbW91bnQgb2Ygd2hpdGVzcGFjZS5cblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxyP1xcbnxcXHIpXFwvW1xcdCBdKig/Oig/Olxccj9cXG58XFxyKSg/Oi4qKD86XFxyP1xcbnxcXHIoPyFcXG4pKSkqPyg/OlxcXFwoPz1bXFx0IF0qKD86XFxyP1xcbnxcXHIpKXwkKXxcXFMuKikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0Ly8gRnJvbSBodHRwOi8vY29kZS5reC5jb20vd2lraS9SZWZlcmVuY2UvU2xhc2g6XG5cdFx0Ly8gQSBcXCBvbiBhIGxpbmUgYnkgaXRzZWxmIHdpdGggbm8gcHJlY2VkaW5nIG1hdGNoaW5nIC8gd2lsbCBjb21tZW50IHRvIGVuZCBvZiBmaWxlLlxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9eXFxcXFtcXHQgXSooPzpcXHI/XFxufFxccilbXFxzXFxTXSsvbSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL14jIS4rL20sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdzeW1ib2wnOiAvYCg/OjpcXFMrfFtcXHcuXSopLyxcblx0J2RhdGV0aW1lJzoge1xuXHRcdHBhdHRlcm46IC8wTlttZHp1dnRdfDBXW2R0el18XFxkezR9XFwuXFxkXFxkKD86bXxcXC5cXGRcXGQoPzpUKD86XFxkXFxkKD86OlxcZFxcZCg/OjpcXGRcXGQoPzpbLjpdXFxkXFxkXFxkKT8pPyk/KT8pP1tkel0/KXxcXGRcXGQ6XFxkXFxkKD86OlxcZFxcZCg/OlsuOl1cXGRcXGRcXGQpPyk/W3V2dF0/Lyxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblx0Ly8gVGhlIG5lZ2F0aXZlIGxvb2stYWhlYWQgcHJldmVudHMgYmFkIGhpZ2hsaWdodGluZ1xuXHQvLyBvZiB2ZXJicyAwOiBhbmQgMTpcblx0J251bWJlcic6IC9cXGIoPyFbMDFdOikoPzowTltoamVdP3wwV1toal0/fDBbd25dfDB4W1xcZGEtZkEtRl0rfFxcZCsoPzpcXC5cXGQqKT8oPzplWystXT9cXGQrKT9baGpmZWJdPykvLFxuXHQna2V5d29yZCc6IC9cXFxcXFx3K1xcYnxcXGIoPzphYnN8YWNvc3xhajA/fGFsbHxhbmR8YW55fGFzY3xhc2lufGFzb2Z8YXRhbnxhdHRyfGF2Z3M/fGJpbnI/fGJ5fGNlaWxpbmd8Y29sc3xjb3J8Y29zfGNvdW50fGNvdnxjcm9zc3xjc3Z8Y3V0fGRlbGV0ZXxkZWx0YXN8ZGVzY3xkZXZ8ZGlmZmVyfGRpc3RpbmN0fGRpdnxkb3xkc2F2ZXxlanxlbmxpc3R8ZXZhbHxleGNlcHR8ZXhlY3xleGl0fGV4cHxmYnl8ZmlsbHN8Zmlyc3R8ZmtleXN8ZmxpcHxmbG9vcnxmcm9tfGdldHxnZXRlbnZ8Z3JvdXB8Z3RpbWV8aGNsb3NlfGhjb3VudHxoZGVsfGhvcGVufGhzeW18aWFzY3xpZGVudGl0eXxpZGVzY3xpZnxpanxpbnxpbnNlcnR8aW50ZXJ8aW52fGtleXM/fGxhc3R8bGlrZXxsaXN0fGxqZj98bG9hZHxsb2d8bG93ZXJ8bHNxfGx0aW1lfGx0cmltfG1hdmd8bWF4cz98bWNvdW50fG1kNXxtZGV2fG1lZHxtZXRhfG1pbnM/fG1tYXh8bW1pbnxtbXV8bW9kfG1zdW18bmVnfG5leHR8bm90fG51bGx8b3J8b3ZlcnxwYXJzZXxwZWFjaHxwanxwbGlzdHxwcmRzP3xwcmV2fHByaW9yfHJhbmR8cmFua3xyYXRpb3N8cmF6ZXxyZWFkMHxyZWFkMXxyZWNpcHJvY2FsfHJldmFsfHJldmVyc2V8cmxvYWR8cm90YXRlfHJzYXZlfHJ0cmltfHNhdmV8c2NhbnxzY292fHNkZXZ8c2VsZWN0fHNldHxzZXRlbnZ8c2hvd3xzaWdudW18c2lufHNxcnR8c3NyP3xzdHJpbmd8c3VibGlzdHxzdW1zP3xzdnxzdmFyfHN5c3RlbXx0YWJsZXN8dGFufHRpbHx0cmltfHR4Znx0eXBlfHVqfHVuZ3JvdXB8dW5pb258dXBkYXRlfHVwcGVyfHVwc2VydHx2YWx1ZXx2YXJ8dmlld3M/fHZzfHdhdmd8d2hlcmV8d2hpbGV8d2l0aGlufHdqMT98d3N1bXx3d3x4YXNjfHhiYXJ8eGNvbHM/fHhkZXNjfHhleHB8eGdyb3VwfHhrZXl8eGxvZ3x4cHJldnx4cmFuaylcXGIvLFxuXHQnYWR2ZXJiJzoge1xuXHRcdHBhdHRlcm46IC9bJ1xcL1xcXFxdOj98XFxiZWFjaFxcYi8sXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J3ZlcmInOiB7XG5cdFx0cGF0dGVybjogLyg/OlxcQlxcLlxcQnxcXGJbMDFdOnw8Wz0+XT98Pj0/fFs6K1xcLSolLCE/fj18JCYjQF5dKTo/fFxcYl9cXGI6Py8sXG5cdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0fSxcblx0J3B1bmN0dWF0aW9uJzogL1soKXt9XFxbXFxdOy5dL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBqc1N0cmluZyA9IC9cIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCJ8Jyg/OlxcXFwufFteXFxcXCdcXHJcXG5dKSonLy5zb3VyY2U7XG5cdHZhciBqc0NvbW1lbnQgPSAvXFwvXFwvLiooPyEuKXxcXC9cXCooPzpbXipdfFxcKig/IVxcLykpKlxcKlxcLy8uc291cmNlO1xuXG5cdHZhciBqc0V4cHIgPSAvKD86W15cXFxcKClbXFxde31cIicvXXw8c3RyaW5nPnxcXC8oPyFbKi9dKXw8Y29tbWVudD58XFwoPGV4cHI+KlxcKXxcXFs8ZXhwcj4qXFxdfFxcezxleHByPipcXH18XFxcXFtcXHNcXFNdKS9cblx0XHQuc291cmNlLnJlcGxhY2UoLzxzdHJpbmc+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpzU3RyaW5nOyB9KS5yZXBsYWNlKC88Y29tbWVudD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4ganNDb21tZW50OyB9KTtcblxuXHQvLyB0aGUgcGF0dGVybiB3aWxsIGJsb3cgdXAsIHNvIG9ubHkgYSBmZXcgaXRlcmF0aW9uc1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IDI7IGkrKykge1xuXHRcdGpzRXhwciA9IGpzRXhwci5yZXBsYWNlKC88ZXhwcj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4ganNFeHByOyB9KTtcblx0fVxuXHRqc0V4cHIgPSBqc0V4cHIucmVwbGFjZSgvPGV4cHI+L2csICdbXlxcXFxzXFxcXFNdJyk7XG5cblxuXHRQcmlzbS5sYW5ndWFnZXMucW1sID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnamF2YXNjcmlwdC1mdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKCg/Ol58OylbIFxcdF0qKWZ1bmN0aW9uXFxzKyg/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSpcXHMqXFwoPGpzPipcXClcXHMqXFx7PGpzPipcXH0vLnNvdXJjZS5yZXBsYWNlKC88anM+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpzRXhwcjsgfSksICdtJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1qYXZhc2NyaXB0Jyxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHR9LFxuXHRcdCdjbGFzcy1uYW1lJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFs6O10pWyBcXHRdKikoPyFcXGQpXFx3Kyg/PVsgXFx0XSpcXHt8WyBcXHRdK29uXFxiKS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3Byb3BlcnR5JzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58Wzt7XSlbIFxcdF0qKSg/IVxcZClcXHcrKD86XFwuXFx3KykqKD89WyBcXHRdKjopL20sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbO3tdKVsgXFx0XSopcHJvcGVydHlbIFxcdF0rKD8hXFxkKVxcdysoPzpcXC5cXHcrKSpbIFxcdF0rKD8hXFxkKVxcdysoPzpcXC5cXHcrKSooPz1bIFxcdF0qOikvbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2tleXdvcmQnOiAvXnByb3BlcnR5Lyxcblx0XHRcdFx0XHQncHJvcGVydHknOiAvXFx3Kyg/OlxcLlxcdyspKi9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2phdmFzY3JpcHQtZXhwcmVzc2lvbic6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKDpbIFxcdF0qKSg/IVtcXHM7fVtdKSg/Oig/ISR8Wzt9XSk8anM+KSsvLnNvdXJjZS5yZXBsYWNlKC88anM+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpzRXhwcjsgfSksICdtJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1qYXZhc2NyaXB0Jyxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86YXN8aW1wb3J0fG9uKVxcYi8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF06OyxdL1xuXHR9O1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5xb3JlID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSg/OlxcL1xcKltcXHNcXFNdKj9cXCpcXC98KD86XFwvXFwvfCMpLiopLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdC8vIE92ZXJyaWRkZW4gdG8gYWxsb3cgdW5lc2NhcGVkIG11bHRpLWxpbmUgc3RyaW5nc1xuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXCJ8JykoPzpcXFxcW1xcc1xcU118KD8hXFwxKVteXFxcXF0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFic3RyYWN0fGFueXxhc3NlcnR8YmluYXJ5fGJvb2x8Ym9vbGVhbnxicmVha3xieXRlfGNhc2V8Y2F0Y2h8Y2hhcnxjbGFzc3xjb2RlfGNvbnN0fGNvbnRpbnVlfGRhdGF8ZGVmYXVsdHxkb3xkb3VibGV8ZWxzZXxlbnVtfGV4dGVuZHN8ZmluYWx8ZmluYWxseXxmbG9hdHxmb3J8Z290b3xoYXNofGlmfGltcGxlbWVudHN8aW1wb3J0fGluaGVyaXRzfGluc3RhbmNlb2Z8aW50fGludGVyZmFjZXxsb25nfG15fG5hdGl2ZXxuZXd8bm90aGluZ3xudWxsfG9iamVjdHxvdXJ8b3dufHByaXZhdGV8cmVmZXJlbmNlfHJldGhyb3d8cmV0dXJufHNob3J0fHNvZnQoPzpib29sfGRhdGV8ZmxvYXR8aW50fGxpc3R8bnVtYmVyfHN0cmluZyl8c3RhdGljfHN0cmljdGZwfHN0cmluZ3xzdWJ8c3VwZXJ8c3dpdGNofHN5bmNocm9uaXplZHx0aGlzfHRocm93fHRocm93c3x0cmFuc2llbnR8dHJ5fHZvaWR8dm9sYXRpbGV8d2hpbGUpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvaSxcblx0J2Z1bmN0aW9uJzogL1xcJD9cXGIoPyFcXGQpXFx3Kyg/PVxcKCkvLFxuXHQnbnVtYmVyJzogL1xcYig/OjBiWzAxXSt8MHgoPzpbXFxkYS1mXSpcXC4pP1tcXGRhLWZwXFwtXSt8KD86XFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKSg/OmVcXGQrKT9bZGZdfCg/OlxcZCsoPzpcXC5cXGQrKT98XFwuXFxkKykpXFxiL2ksXG5cdCdvcGVyYXRvcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W14uXSkoPzpcXCtbKz1dP3wtWy09XT98WyE9XSg/Oj09P3x+KT98Pj4/PT98PCg/Oj0+P3w8PT8pP3wmWyY9XT98XFx8W3w9XT98WypcXC8lXl09P3xbfj9dKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQndmFyaWFibGUnOiAvXFwkKD8hXFxkKVxcdytcXGIvXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLnIgPSB7XG5cdCdjb21tZW50JzogLyMuKi8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhbJ1wiXSkoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3BlcmNlbnQtb3BlcmF0b3InOiB7XG5cdFx0Ly8gSW5jbHVkZXMgdXNlci1kZWZpbmVkIG9wZXJhdG9yc1xuXHRcdC8vIGFuZCAlJSwgJSolLCAlLyUsICVpbiUsICVvJSwgJXglXG5cdFx0cGF0dGVybjogLyVbXiVcXHNdKiUvLFxuXHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdH0sXG5cdCdib29sZWFuJzogL1xcYig/OkZBTFNFfFRSVUUpXFxiLyxcblx0J2VsbGlwc2lzJzogL1xcLlxcLig/OlxcLnxcXGQrKS8sXG5cdCdudW1iZXInOiBbXG5cdFx0L1xcYig/OkluZnxOYU4pXFxiLyxcblx0XHQvKD86XFxiMHhbXFxkQS1GYS1mXSsoPzpcXC5cXGQqKT98XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OltFZVBwXVsrLV0/XFxkKyk/W2lMXT8vXG5cdF0sXG5cdCdrZXl3b3JkJzogL1xcYig/Ok5BfE5BX2NoYXJhY3Rlcl98TkFfY29tcGxleF98TkFfaW50ZWdlcl98TkFfcmVhbF98TlVMTHxicmVha3xlbHNlfGZvcnxmdW5jdGlvbnxpZnxpbnxuZXh0fHJlcGVhdHx3aGlsZSlcXGIvLFxuXHQnb3BlcmF0b3InOiAvLT4/Pj98PCg/Oj18PD8tKT98Wz49IV09P3w6Oj98JiY/fFxcfFxcfD98WysqXFwvXiRAfl0vLFxuXHQncHVuY3R1YXRpb24nOiAvWygpe31cXFtcXF0sO10vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMucmFja2V0ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnc2NoZW1lJywge1xuXHQnbGFtYmRhLXBhcmFtZXRlcic6IHtcblx0XHQvLyB0aGUgcmFja2V0IGxhbWJkYSBzeW50YXggaXMgYSBsb3QgbW9yZSBjb21wbGV4LCBzbyB3ZSB3b24ndCBldmVuIGF0dGVtcHQgdG8gY2FwdHVyZSBpdC5cblx0XHQvLyB0aGlzIHdpbGwganVzdCBwcmV2ZW50IGZhbHNlIHBvc2l0aXZlcyBvZiB0aGUgYGZ1bmN0aW9uYCBwYXR0ZXJuXG5cdFx0cGF0dGVybjogLyhbKFxcW11sYW1iZGFcXHMrWyhcXFtdKVteKClcXFtcXF0nXFxzXSsvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3JhY2tldCcsICdzdHJpbmcnLCB7XG5cdCdsYW5nJzoge1xuXHRcdHBhdHRlcm46IC9eI2xhbmcuKy9tLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMucmt0ID0gUHJpc20ubGFuZ3VhZ2VzLnJhY2tldDtcblxuLy8gRG9jczpcbi8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2FzcG5ldC9jb3JlL3Jhem9yLXBhZ2VzLz92aWV3PWFzcG5ldGNvcmUtNS4wJnRhYnM9dmlzdWFsLXN0dWRpb1xuLy8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvYXNwbmV0L2NvcmUvbXZjL3ZpZXdzL3Jhem9yP3ZpZXc9YXNwbmV0Y29yZS01LjBcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBjb21tZW50TGlrZSA9IC9cXC8oPyFbLypdKXxcXC9cXC8uKltcXHJcXG5dfFxcL1xcKlteKl0qKD86XFwqKD8hXFwvKVteKl0qKSpcXCpcXC8vLnNvdXJjZTtcblx0dmFyIHN0cmluZ0xpa2UgPVxuXHRcdC9AKD8hXCIpfFwiKD86W15cXHJcXG5cXFxcXCJdfFxcXFwuKSpcInxAXCIoPzpbXlxcXFxcIl18XCJcInxcXFxcW1xcc1xcU10pKlwiKD8hXCIpLy5zb3VyY2UgK1xuXHRcdCd8JyArXG5cdFx0LycoPzooPzpbXlxcclxcbidcXFxcXXxcXFxcLnxcXFxcW1V1eF1bXFxkYS1mQS1GXXsxLDh9KSd8KD89W15cXFxcXSg/IScpKSkvLnNvdXJjZTtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5lc3RlZCBwYXR0ZXJuIHdoZXJlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3RyaW5nIGA8PHNlbGY+PmAgYXJlIHJlcGxhY2VkIHdpdGggdGhlIHBhdHRlcm4gaXRzZWxmLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVyblxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGVwdGhMb2cyXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRmdW5jdGlvbiBuZXN0ZWQocGF0dGVybiwgZGVwdGhMb2cyKSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBkZXB0aExvZzI7IGkrKykge1xuXHRcdFx0cGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZSgvPHNlbGY+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuICcoPzonICsgcGF0dGVybiArICcpJzsgfSk7XG5cdFx0fVxuXHRcdHJldHVybiBwYXR0ZXJuXG5cdFx0XHQucmVwbGFjZSgvPHNlbGY+L2csICdbXlxcXFxzXFxcXFNdJylcblx0XHRcdC5yZXBsYWNlKC88c3RyPi9nLCAnKD86JyArIHN0cmluZ0xpa2UgKyAnKScpXG5cdFx0XHQucmVwbGFjZSgvPGNvbW1lbnQ+L2csICcoPzonICsgY29tbWVudExpa2UgKyAnKScpO1xuXHR9XG5cblx0dmFyIHJvdW5kID0gbmVzdGVkKC9cXCgoPzpbXigpJ1wiQC9dfDxzdHI+fDxjb21tZW50Pnw8c2VsZj4pKlxcKS8uc291cmNlLCAyKTtcblx0dmFyIHNxdWFyZSA9IG5lc3RlZCgvXFxbKD86W15cXFtcXF0nXCJAL118PHN0cj58PGNvbW1lbnQ+fDxzZWxmPikqXFxdLy5zb3VyY2UsIDEpO1xuXHR2YXIgY3VybHkgPSBuZXN0ZWQoL1xceyg/Oltee30nXCJAL118PHN0cj58PGNvbW1lbnQ+fDxzZWxmPikqXFx9Ly5zb3VyY2UsIDIpO1xuXHR2YXIgYW5nbGUgPSBuZXN0ZWQoLzwoPzpbXjw+J1wiQC9dfDxjb21tZW50Pnw8c2VsZj4pKj4vLnNvdXJjZSwgMSk7XG5cblx0dmFyIGlubGluZUNzID0gL0AvLnNvdXJjZSArXG5cdFx0Lyg/OmF3YWl0XFxiXFxzKik/Ly5zb3VyY2UgK1xuXHRcdCcoPzonICsgLyg/IWF3YWl0XFxiKVxcdytcXGIvLnNvdXJjZSArICd8JyArIHJvdW5kICsgJyknICtcblx0XHQnKD86JyArIC9bPyFdP1xcLlxcdytcXGIvLnNvdXJjZSArICd8JyArICcoPzonICsgYW5nbGUgKyAnKT8nICsgcm91bmQgKyAnfCcgKyBzcXVhcmUgKyAnKSonICtcblx0XHQvKD8hWz8hXFwuKFxcW118PCg/IVxcLykpLy5zb3VyY2U7XG5cblx0Ly8gTm90ZSBhYm91dCB0aGUgYWJvdmUgYnJhY2tldCBwYXR0ZXJuczpcblx0Ly8gVGhleSBhbGwgaWdub3JlIEhUTUwgZXhwcmVzc2lvbnMgdGhhdCBtaWdodCBiZSBpbiB0aGUgQyMgY29kZS4gVGhpcyBpcyBhIHByb2JsZW0gYmVjYXVzZSBIVE1MIChsaWtlIHN0cmluZ3MgYW5kXG5cdC8vIGNvbW1lbnRzKSBpcyBwYXJzZWQgZGlmZmVyZW50bHkuIFRoaXMgaXMgYSBodWdlIHByb2JsZW0gYmVjYXVzZSBIVE1MIG1pZ2h0IGNvbnRhaW4gYnJhY2tldHMgYW5kIHF1b3RlcyB3aGljaFxuXHQvLyBtZXNzZXMgdXAgdGhlIGJyYWNrZXQgYW5kIHN0cmluZyBjb3VudGluZyBpbXBsZW1lbnRlZCBieSB0aGUgYWJvdmUgcGF0dGVybnMuXG5cdC8vXG5cdC8vIFRoaXMgcHJvYmxlbSBpcyBub3QgZml4YWJsZSBiZWNhdXNlIDEpIEhUTUwgZXhwcmVzc2lvbiBhcmUgaGlnaGx5IGNvbnRleHQgc2Vuc2l0aXZlIGFuZCB2ZXJ5IGRpZmZpY3VsdCB0byBkZXRlY3Rcblx0Ly8gYW5kIDIpIHRoZXkgcmVxdWlyZSBvbmUgY2FwdHVyaW5nIGdyb3VwIGF0IGV2ZXJ5IG5lc3RlZCBsZXZlbC4gU2VlIHRoZSBgdGFnUmVnaW9uYCBwYXR0ZXJuIHRvIGFkbWlyZSB0aGVcblx0Ly8gY29tcGxleGl0eSBvZiBhbiBIVE1MIGV4cHJlc3Npb24uXG5cdC8vXG5cdC8vIFRvIHNvbWV3aGF0IGFsbGV2aWF0ZSB0aGUgcHJvYmxlbSBhIGJpdCwgdGhlIHBhdHRlcm5zIGZvciBjaGFyYWN0ZXJzIChlLmcuICdhJykgaXMgdmVyeSBwZXJtaXNzaXZlLCBpdCBhbHNvXG5cdC8vIGFsbG93cyBpbnZhbGlkIGNoYXJhY3RlcnMgdG8gc3VwcG9ydCBIVE1MIGV4cHJlc3Npb25zIGxpa2UgdGhpczogPHA+VGhhdCdzIGl0ITwvcD4uXG5cblx0dmFyIHRhZ0F0dHJJbmxpbmVDcyA9IC9AKD8hW1xcdygpXSkvLnNvdXJjZSArICd8JyArIGlubGluZUNzO1xuXHR2YXIgdGFnQXR0clZhbHVlID0gJyg/OicgK1xuXHRcdC9cIlteXCJAXSpcInwnW14nQF0qJ3xbXlxccydcIkA+PV0rKD89W1xccz5dKS8uc291cmNlICtcblx0XHQnfCcgK1xuXHRcdCdbXCJcXCddW15cIlxcJ0BdKig/Oig/OicgKyB0YWdBdHRySW5saW5lQ3MgKyAnKVteXCJcXCdAXSopK1tcIlxcJ10nICtcblx0XHQnKSc7XG5cblx0dmFyIHRhZ0F0dHJzID0gLyg/Olxccyg/OlxccypbXlxccz5cXC89XSsoPzpcXHMqPVxccyo8dGFnQXR0clZhbHVlPnwoPz1bXFxzLz5dKSkpKyk/Ly5zb3VyY2UucmVwbGFjZSgvPHRhZ0F0dHJWYWx1ZT4vLCB0YWdBdHRyVmFsdWUpO1xuXHR2YXIgdGFnQ29udGVudCA9IC8oPyFcXGQpW15cXHM+XFwvPSQ8JV0rLy5zb3VyY2UgKyB0YWdBdHRycyArIC9cXHMqXFwvPz4vLnNvdXJjZTtcblx0dmFyIHRhZ1JlZ2lvbiA9XG5cdFx0L1xcQkA/Ly5zb3VyY2UgK1xuXHRcdCcoPzonICtcblx0XHQvPChbYS16QS1aXVtcXHc6XSopLy5zb3VyY2UgKyB0YWdBdHRycyArIC9cXHMqPi8uc291cmNlICtcblx0XHQnKD86JyArXG5cdFx0KFxuXHRcdFx0L1tePF0vLnNvdXJjZSArXG5cdFx0XHQnfCcgK1xuXHRcdFx0Ly8gYWxsIHRhZ3MgdGhhdCBhcmUgbm90IHRoZSBzdGFydCB0YWdcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdFx0XHQvPFxcLz8oPyFcXDFcXGIpLy5zb3VyY2UgKyB0YWdDb250ZW50ICtcblx0XHRcdCd8JyArXG5cdFx0XHQvLyBuZXN0ZWQgc3RhcnQgdGFnXG5cdFx0XHRuZXN0ZWQoXG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdFx0XHRcdC88XFwxLy5zb3VyY2UgKyB0YWdBdHRycyArIC9cXHMqPi8uc291cmNlICtcblx0XHRcdFx0Jyg/OicgK1xuXHRcdFx0XHQoXG5cdFx0XHRcdFx0L1tePF0vLnNvdXJjZSArXG5cdFx0XHRcdFx0J3wnICtcblx0XHRcdFx0XHQvLyBhbGwgdGFncyB0aGF0IGFyZSBub3QgdGhlIHN0YXJ0IHRhZ1xuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdFx0XHRcdFx0LzxcXC8/KD8hXFwxXFxiKS8uc291cmNlICsgdGFnQ29udGVudCArXG5cdFx0XHRcdFx0J3wnICtcblx0XHRcdFx0XHQnPHNlbGY+J1xuXHRcdFx0XHQpICtcblx0XHRcdFx0JykqJyArXG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdFx0XHRcdC88XFwvXFwxXFxzKj4vLnNvdXJjZSxcblx0XHRcdFx0MlxuXHRcdFx0KVxuXHRcdCkgK1xuXHRcdCcpKicgK1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdFx0LzxcXC9cXDFcXHMqPi8uc291cmNlICtcblx0XHQnfCcgK1xuXHRcdC88Ly5zb3VyY2UgKyB0YWdDb250ZW50ICtcblx0XHQnKSc7XG5cblx0Ly8gTm93IGZvciB0aGUgYWN0dWFsIGxhbmd1YWdlIGRlZmluaXRpb24ocyk6XG5cdC8vXG5cdC8vIFJhem9yIGFzIGEgbGFuZ3VhZ2UgaGFzIDIgcGFydHM6XG5cdC8vICAxKSBDU0hUTUw6IEEgbWFya3VwLWxpa2UgbGFuZ3VhZ2UgdGhhdCBoYXMgYmVlbiBleHRlbmRlZCB3aXRoIGlubGluZSBDIyBjb2RlIGV4cHJlc3Npb25zIGFuZCBibG9ja3MuXG5cdC8vICAyKSBDIytIVE1MOiBBIHZhcmlhbnQgb2YgQyMgdGhhdCBjYW4gY29udGFpbiBDU0hUTUwgdGFncyBhcyBleHByZXNzaW9ucy5cblx0Ly9cblx0Ly8gSW4gdGhlIGJlbG93IGNvZGUsIGJvdGggQ1NIVE1MIGFuZCBDIytIVE1MIHdpbGwgYmUgY3JlYXRlIGFzIHNlcGFyYXRlIGxhbmd1YWdlIGRlZmluaXRpb25zIHRoYXQgcmVmZXJlbmNlIGVhY2hcblx0Ly8gb3RoZXIuIEhvd2V2ZXIsIG9ubHkgQ1NIVE1MIHdpbGwgYmUgZXhwb3J0ZWQgdmlhIGBQcmlzbS5sYW5ndWFnZXNgLlxuXG5cdFByaXNtLmxhbmd1YWdlcy5jc2h0bWwgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdtYXJrdXAnLCB7fSk7XG5cblx0dmFyIGNzaGFycFdpdGhIdG1sID0gUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY3NoYXJwJywgJ3N0cmluZycsIHtcblx0XHQnaHRtbCc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCh0YWdSZWdpb24pLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuY3NodG1sXG5cdFx0fSxcblx0fSwgeyBjc2hhcnA6IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NzaGFycCcsIHt9KSB9KTtcblxuXHR2YXIgY3MgPSB7XG5cdFx0cGF0dGVybjogL1xcU1tcXHNcXFNdKi8sXG5cdFx0YWxpYXM6ICdsYW5ndWFnZS1jc2hhcnAnLFxuXHRcdGluc2lkZTogY3NoYXJwV2l0aEh0bWxcblx0fTtcblxuXHR2YXIgaW5saW5lVmFsdWUgPSB7XG5cdFx0cGF0dGVybjogUmVnRXhwKC8oXnxbXkBdKS8uc291cmNlICsgaW5saW5lQ3MpLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2tleXdvcmQnOiAvXkAvLFxuXHRcdFx0J2NzaGFycCc6IGNzXG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5jc2h0bWwudGFnLnBhdHRlcm4gPSBSZWdFeHAoLzxcXC8/Ly5zb3VyY2UgKyB0YWdDb250ZW50KTtcblx0UHJpc20ubGFuZ3VhZ2VzLmNzaHRtbC50YWcuaW5zaWRlWydhdHRyLXZhbHVlJ10ucGF0dGVybiA9IFJlZ0V4cCgvPVxccyovLnNvdXJjZSArIHRhZ0F0dHJWYWx1ZSk7XG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2luc2lkZScsICdwdW5jdHVhdGlvbicsIHsgJ3ZhbHVlJzogaW5saW5lVmFsdWUgfSwgUHJpc20ubGFuZ3VhZ2VzLmNzaHRtbC50YWcuaW5zaWRlWydhdHRyLXZhbHVlJ10pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NzaHRtbCcsICdwcm9sb2cnLCB7XG5cdFx0J3Jhem9yLWNvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvQFxcKltcXHNcXFNdKj9cXCpALyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnY29tbWVudCdcblx0XHR9LFxuXG5cdFx0J2Jsb2NrJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHQvKF58W15AXSlALy5zb3VyY2UgK1xuXHRcdFx0XHQnKD86JyArXG5cdFx0XHRcdFtcblx0XHRcdFx0XHQvLyBAeyAuLi4gfVxuXHRcdFx0XHRcdGN1cmx5LFxuXHRcdFx0XHRcdC8vIEBjb2RleyAuLi4gfVxuXHRcdFx0XHRcdC8oPzpjb2RlfGZ1bmN0aW9ucylcXHMqLy5zb3VyY2UgKyBjdXJseSxcblx0XHRcdFx0XHQvLyBAZm9yICguLi4pIHsgLi4uIH1cblx0XHRcdFx0XHQvKD86Zm9yfGZvcmVhY2h8bG9ja3xzd2l0Y2h8dXNpbmd8d2hpbGUpXFxzKi8uc291cmNlICsgcm91bmQgKyAvXFxzKi8uc291cmNlICsgY3VybHksXG5cdFx0XHRcdFx0Ly8gQGRvIHsgLi4uIH0gd2hpbGUgKC4uLik7XG5cdFx0XHRcdFx0L2RvXFxzKi8uc291cmNlICsgY3VybHkgKyAvXFxzKndoaWxlXFxzKi8uc291cmNlICsgcm91bmQgKyAvKD86XFxzKjspPy8uc291cmNlLFxuXHRcdFx0XHRcdC8vIEB0cnkgeyAuLi4gfSBjYXRjaCAoLi4uKSB7IC4uLiB9IGZpbmFsbHkgeyAuLi4gfVxuXHRcdFx0XHRcdC90cnlcXHMqLy5zb3VyY2UgKyBjdXJseSArIC9cXHMqY2F0Y2hcXHMqLy5zb3VyY2UgKyByb3VuZCArIC9cXHMqLy5zb3VyY2UgKyBjdXJseSArIC9cXHMqZmluYWxseVxccyovLnNvdXJjZSArIGN1cmx5LFxuXHRcdFx0XHRcdC8vIEBpZiAoLi4uKSB7Li4ufSBlbHNlIGlmICguLi4pIHsuLi59IGVsc2Ugey4uLn1cblx0XHRcdFx0XHQvaWZcXHMqLy5zb3VyY2UgKyByb3VuZCArIC9cXHMqLy5zb3VyY2UgKyBjdXJseSArICcoPzonICsgL1xccyplbHNlLy5zb3VyY2UgKyAnKD86JyArIC9cXHMraWZcXHMqLy5zb3VyY2UgKyByb3VuZCArICcpPycgKyAvXFxzKi8uc291cmNlICsgY3VybHkgKyAnKSonLFxuXHRcdFx0XHRcdC8vIEBoZWxwZXIgSWRlbnQocGFyYW1zKSB7IC4uLiB9XG5cdFx0XHRcdFx0L2hlbHBlclxccytcXHcrXFxzKi8uc291cmNlICsgcm91bmQgKyAvXFxzKi8uc291cmNlICsgY3VybHksXG5cdFx0XHRcdF0uam9pbignfCcpICtcblx0XHRcdFx0JyknXG5cdFx0XHQpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQna2V5d29yZCc6IC9eQFxcdyovLFxuXHRcdFx0XHQnY3NoYXJwJzogY3Ncblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J2RpcmVjdGl2ZSc6IHtcblx0XHRcdHBhdHRlcm46IC9eKFsgXFx0XSopQCg/OmFkZFRhZ0hlbHBlcnxhdHRyaWJ1dGV8aW1wbGVtZW50c3xpbmhlcml0c3xpbmplY3R8bGF5b3V0fG1vZGVsfG5hbWVzcGFjZXxwYWdlfHByZXNlcnZld2hpdGVzcGFjZXxyZW1vdmVUYWdIZWxwZXJ8c2VjdGlvbnx0YWdIZWxwZXJQcmVmaXh8dXNpbmcpKD89XFxzKS4qL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdrZXl3b3JkJzogL15AXFx3Ky8sXG5cdFx0XHRcdCdjc2hhcnAnOiBjc1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQndmFsdWUnOiBpbmxpbmVWYWx1ZSxcblxuXHRcdCdkZWxlZ2F0ZS1vcGVyYXRvcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXkBdKUAoPz08KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5yYXpvciA9IFByaXNtLmxhbmd1YWdlcy5jc2h0bWw7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBqYXZhc2NyaXB0ID0gUHJpc20udXRpbC5jbG9uZShQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdCk7XG5cblx0dmFyIHNwYWNlID0gLyg/Olxcc3xcXC9cXC8uKig/IS4pfFxcL1xcKig/OlteKl18XFwqKD8hXFwvKSlcXCpcXC8pLy5zb3VyY2U7XG5cdHZhciBicmFjZXMgPSAvKD86XFx7KD86XFx7KD86XFx7W157fV0qXFx9fFtee31dKSpcXH18W157fV0pKlxcfSkvLnNvdXJjZTtcblx0dmFyIHNwcmVhZCA9IC8oPzpcXHs8Uz4qXFwuezN9KD86W157fV18PEJSQUNFUz4pKlxcfSkvLnNvdXJjZTtcblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2ZsYWdzXVxuXHQgKi9cblx0ZnVuY3Rpb24gcmUoc291cmNlLCBmbGFncykge1xuXHRcdHNvdXJjZSA9IHNvdXJjZVxuXHRcdFx0LnJlcGxhY2UoLzxTPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBzcGFjZTsgfSlcblx0XHRcdC5yZXBsYWNlKC88QlJBQ0VTPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBicmFjZXM7IH0pXG5cdFx0XHQucmVwbGFjZSgvPFNQUkVBRD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gc3ByZWFkOyB9KTtcblx0XHRyZXR1cm4gUmVnRXhwKHNvdXJjZSwgZmxhZ3MpO1xuXHR9XG5cblx0c3ByZWFkID0gcmUoc3ByZWFkKS5zb3VyY2U7XG5cblxuXHRQcmlzbS5sYW5ndWFnZXMuanN4ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnbWFya3VwJywgamF2YXNjcmlwdCk7XG5cdFByaXNtLmxhbmd1YWdlcy5qc3gudGFnLnBhdHRlcm4gPSByZShcblx0XHQvPFxcLz8oPzpbXFx3LjotXSsoPzo8Uz4rKD86W1xcdy46JC1dKyg/Oj0oPzpcIig/OlxcXFxbXFxzXFxTXXxbXlxcXFxcIl0pKlwifCcoPzpcXFxcW1xcc1xcU118W15cXFxcJ10pKid8W15cXHN7J1wiLz49XSt8PEJSQUNFUz4pKT98PFNQUkVBRD4pKSo8Uz4qXFwvPyk/Pi8uc291cmNlXG5cdCk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmpzeC50YWcuaW5zaWRlWyd0YWcnXS5wYXR0ZXJuID0gL148XFwvP1teXFxzPlxcL10qLztcblx0UHJpc20ubGFuZ3VhZ2VzLmpzeC50YWcuaW5zaWRlWydhdHRyLXZhbHVlJ10ucGF0dGVybiA9IC89KD8hXFx7KSg/OlwiKD86XFxcXFtcXHNcXFNdfFteXFxcXFwiXSkqXCJ8Jyg/OlxcXFxbXFxzXFxTXXxbXlxcXFwnXSkqJ3xbXlxccydcIj5dKykvO1xuXHRQcmlzbS5sYW5ndWFnZXMuanN4LnRhZy5pbnNpZGVbJ3RhZyddLmluc2lkZVsnY2xhc3MtbmFtZSddID0gL15bQS1aXVxcdyooPzpcXC5bQS1aXVxcdyopKiQvO1xuXHRQcmlzbS5sYW5ndWFnZXMuanN4LnRhZy5pbnNpZGVbJ2NvbW1lbnQnXSA9IGphdmFzY3JpcHRbJ2NvbW1lbnQnXTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdpbnNpZGUnLCAnYXR0ci1uYW1lJywge1xuXHRcdCdzcHJlYWQnOiB7XG5cdFx0XHRwYXR0ZXJuOiByZSgvPFNQUkVBRD4vLnNvdXJjZSksXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qc3hcblx0XHR9XG5cdH0sIFByaXNtLmxhbmd1YWdlcy5qc3gudGFnKTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdpbnNpZGUnLCAnc3BlY2lhbC1hdHRyJywge1xuXHRcdCdzY3JpcHQnOiB7XG5cdFx0XHQvLyBBbGxvdyBmb3IgdHdvIGxldmVscyBvZiBuZXN0aW5nXG5cdFx0XHRwYXR0ZXJuOiByZSgvPTxCUkFDRVM+Ly5zb3VyY2UpLFxuXHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1qYXZhc2NyaXB0Jyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnc2NyaXB0LXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9ePSg/PVxceykvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJlc3Q6IFByaXNtLmxhbmd1YWdlcy5qc3hcblx0XHRcdH0sXG5cdFx0fVxuXHR9LCBQcmlzbS5sYW5ndWFnZXMuanN4LnRhZyk7XG5cblx0Ly8gVGhlIGZvbGxvd2luZyB3aWxsIGhhbmRsZSBwbGFpbiB0ZXh0IGluc2lkZSB0YWdzXG5cdHZhciBzdHJpbmdpZnlUb2tlbiA9IGZ1bmN0aW9uICh0b2tlbikge1xuXHRcdGlmICghdG9rZW4pIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiB0b2tlbjtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB0b2tlbi5jb250ZW50ID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHRva2VuLmNvbnRlbnQ7XG5cdFx0fVxuXHRcdHJldHVybiB0b2tlbi5jb250ZW50Lm1hcChzdHJpbmdpZnlUb2tlbikuam9pbignJyk7XG5cdH07XG5cblx0dmFyIHdhbGtUb2tlbnMgPSBmdW5jdGlvbiAodG9rZW5zKSB7XG5cdFx0dmFyIG9wZW5lZFRhZ3MgPSBbXTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIHRva2VuID0gdG9rZW5zW2ldO1xuXHRcdFx0dmFyIG5vdFRhZ05vckJyYWNlID0gZmFsc2U7XG5cblx0XHRcdGlmICh0eXBlb2YgdG9rZW4gIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdGlmICh0b2tlbi50eXBlID09PSAndGFnJyAmJiB0b2tlbi5jb250ZW50WzBdICYmIHRva2VuLmNvbnRlbnRbMF0udHlwZSA9PT0gJ3RhZycpIHtcblx0XHRcdFx0XHQvLyBXZSBmb3VuZCBhIHRhZywgbm93IGZpbmQgaXRzIGtpbmRcblxuXHRcdFx0XHRcdGlmICh0b2tlbi5jb250ZW50WzBdLmNvbnRlbnRbMF0uY29udGVudCA9PT0gJzwvJykge1xuXHRcdFx0XHRcdFx0Ly8gQ2xvc2luZyB0YWdcblx0XHRcdFx0XHRcdGlmIChvcGVuZWRUYWdzLmxlbmd0aCA+IDAgJiYgb3BlbmVkVGFnc1tvcGVuZWRUYWdzLmxlbmd0aCAtIDFdLnRhZ05hbWUgPT09IHN0cmluZ2lmeVRva2VuKHRva2VuLmNvbnRlbnRbMF0uY29udGVudFsxXSkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gUG9wIG1hdGNoaW5nIG9wZW5pbmcgdGFnXG5cdFx0XHRcdFx0XHRcdG9wZW5lZFRhZ3MucG9wKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmICh0b2tlbi5jb250ZW50W3Rva2VuLmNvbnRlbnQubGVuZ3RoIC0gMV0uY29udGVudCA9PT0gJy8+Jykge1xuXHRcdFx0XHRcdFx0XHQvLyBBdXRvY2xvc2VkIHRhZywgaWdub3JlXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBPcGVuaW5nIHRhZ1xuXHRcdFx0XHRcdFx0XHRvcGVuZWRUYWdzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdHRhZ05hbWU6IHN0cmluZ2lmeVRva2VuKHRva2VuLmNvbnRlbnRbMF0uY29udGVudFsxXSksXG5cdFx0XHRcdFx0XHRcdFx0b3BlbmVkQnJhY2VzOiAwXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChvcGVuZWRUYWdzLmxlbmd0aCA+IDAgJiYgdG9rZW4udHlwZSA9PT0gJ3B1bmN0dWF0aW9uJyAmJiB0b2tlbi5jb250ZW50ID09PSAneycpIHtcblxuXHRcdFx0XHRcdC8vIEhlcmUgd2UgbWlnaHQgaGF2ZSBlbnRlcmVkIGEgSlNYIGNvbnRleHQgaW5zaWRlIGEgdGFnXG5cdFx0XHRcdFx0b3BlbmVkVGFnc1tvcGVuZWRUYWdzLmxlbmd0aCAtIDFdLm9wZW5lZEJyYWNlcysrO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAob3BlbmVkVGFncy5sZW5ndGggPiAwICYmIG9wZW5lZFRhZ3Nbb3BlbmVkVGFncy5sZW5ndGggLSAxXS5vcGVuZWRCcmFjZXMgPiAwICYmIHRva2VuLnR5cGUgPT09ICdwdW5jdHVhdGlvbicgJiYgdG9rZW4uY29udGVudCA9PT0gJ30nKSB7XG5cblx0XHRcdFx0XHQvLyBIZXJlIHdlIG1pZ2h0IGhhdmUgbGVmdCBhIEpTWCBjb250ZXh0IGluc2lkZSBhIHRhZ1xuXHRcdFx0XHRcdG9wZW5lZFRhZ3Nbb3BlbmVkVGFncy5sZW5ndGggLSAxXS5vcGVuZWRCcmFjZXMtLTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG5vdFRhZ05vckJyYWNlID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG5vdFRhZ05vckJyYWNlIHx8IHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0aWYgKG9wZW5lZFRhZ3MubGVuZ3RoID4gMCAmJiBvcGVuZWRUYWdzW29wZW5lZFRhZ3MubGVuZ3RoIC0gMV0ub3BlbmVkQnJhY2VzID09PSAwKSB7XG5cdFx0XHRcdFx0Ly8gSGVyZSB3ZSBhcmUgaW5zaWRlIGEgdGFnLCBhbmQgbm90IGluc2lkZSBhIEpTWCBjb250ZXh0LlxuXHRcdFx0XHRcdC8vIFRoYXQncyBwbGFpbiB0ZXh0OiBkcm9wIGFueSB0b2tlbnMgbWF0Y2hlZC5cblx0XHRcdFx0XHR2YXIgcGxhaW5UZXh0ID0gc3RyaW5naWZ5VG9rZW4odG9rZW4pO1xuXG5cdFx0XHRcdFx0Ly8gQW5kIG1lcmdlIHRleHQgd2l0aCBhZGphY2VudCB0ZXh0XG5cdFx0XHRcdFx0aWYgKGkgPCB0b2tlbnMubGVuZ3RoIC0gMSAmJiAodHlwZW9mIHRva2Vuc1tpICsgMV0gPT09ICdzdHJpbmcnIHx8IHRva2Vuc1tpICsgMV0udHlwZSA9PT0gJ3BsYWluLXRleHQnKSkge1xuXHRcdFx0XHRcdFx0cGxhaW5UZXh0ICs9IHN0cmluZ2lmeVRva2VuKHRva2Vuc1tpICsgMV0pO1xuXHRcdFx0XHRcdFx0dG9rZW5zLnNwbGljZShpICsgMSwgMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChpID4gMCAmJiAodHlwZW9mIHRva2Vuc1tpIC0gMV0gPT09ICdzdHJpbmcnIHx8IHRva2Vuc1tpIC0gMV0udHlwZSA9PT0gJ3BsYWluLXRleHQnKSkge1xuXHRcdFx0XHRcdFx0cGxhaW5UZXh0ID0gc3RyaW5naWZ5VG9rZW4odG9rZW5zW2kgLSAxXSkgKyBwbGFpblRleHQ7XG5cdFx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKGkgLSAxLCAxKTtcblx0XHRcdFx0XHRcdGktLTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0b2tlbnNbaV0gPSBuZXcgUHJpc20uVG9rZW4oJ3BsYWluLXRleHQnLCBwbGFpblRleHQsIG51bGwsIHBsYWluVGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHRva2VuLmNvbnRlbnQgJiYgdHlwZW9mIHRva2VuLmNvbnRlbnQgIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdHdhbGtUb2tlbnModG9rZW4uY29udGVudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0aWYgKGVudi5sYW5ndWFnZSAhPT0gJ2pzeCcgJiYgZW52Lmxhbmd1YWdlICE9PSAndHN4Jykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR3YWxrVG9rZW5zKGVudi50b2tlbnMpO1xuXHR9KTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdHZhciB0eXBlc2NyaXB0ID0gUHJpc20udXRpbC5jbG9uZShQcmlzbS5sYW5ndWFnZXMudHlwZXNjcmlwdCk7XG5cdFByaXNtLmxhbmd1YWdlcy50c3ggPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdqc3gnLCB0eXBlc2NyaXB0KTtcblxuXHQvLyBkb2Vzbid0IHdvcmsgd2l0aCBUUyBiZWNhdXNlIFRTIGlzIHRvbyBjb21wbGV4XG5cdGRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMudHN4WydwYXJhbWV0ZXInXTtcblx0ZGVsZXRlIFByaXNtLmxhbmd1YWdlcy50c3hbJ2xpdGVyYWwtcHJvcGVydHknXTtcblxuXHQvLyBUaGlzIHdpbGwgcHJldmVudCBjb2xsaXNpb25zIGJldHdlZW4gVFNYIHRhZ3MgYW5kIFRTIGdlbmVyaWMgdHlwZXMuXG5cdC8vIElkZWEgYnkgaHR0cHM6Ly9naXRodWIuY29tL2thcmxob3JreVxuXHQvLyBEaXNjdXNzaW9uOiBodHRwczovL2dpdGh1Yi5jb20vUHJpc21KUy9wcmlzbS9pc3N1ZXMvMjU5NCNpc3N1ZWNvbW1lbnQtNzEwNjY2OTI4XG5cdHZhciB0YWcgPSBQcmlzbS5sYW5ndWFnZXMudHN4LnRhZztcblx0dGFnLnBhdHRlcm4gPSBSZWdFeHAoLyhefFteXFx3JF18KD89PFxcLykpLy5zb3VyY2UgKyAnKD86JyArIHRhZy5wYXR0ZXJuLnNvdXJjZSArICcpJywgdGFnLnBhdHRlcm4uZmxhZ3MpO1xuXHR0YWcubG9va2JlaGluZCA9IHRydWU7XG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5yZWFzb24gPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXlxcXFxcXHJcXG5cIl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0Ly8gJ2NsYXNzLW5hbWUnIG11c3QgYmUgbWF0Y2hlZCAqYWZ0ZXIqICdjb25zdHJ1Y3RvcicgZGVmaW5lZCBiZWxvd1xuXHQnY2xhc3MtbmFtZSc6IC9cXGJbQS1aXVxcdyovLFxuXHQna2V5d29yZCc6IC9cXGIoPzphbmR8YXN8YXNzZXJ0fGJlZ2lufGNsYXNzfGNvbnN0cmFpbnR8ZG98ZG9uZXxkb3dudG98ZWxzZXxlbmR8ZXhjZXB0aW9ufGV4dGVybmFsfGZvcnxmdW58ZnVuY3Rpb258ZnVuY3RvcnxpZnxpbnxpbmNsdWRlfGluaGVyaXR8aW5pdGlhbGl6ZXJ8bGF6eXxsZXR8bWV0aG9kfG1vZHVsZXxtdXRhYmxlfG5ld3xub25yZWN8b2JqZWN0fG9mfG9wZW58b3J8cHJpdmF0ZXxyZWN8c2lnfHN0cnVjdHxzd2l0Y2h8dGhlbnx0b3x0cnl8dHlwZXx2YWx8dmlydHVhbHx3aGVufHdoaWxlfHdpdGgpXFxiLyxcblx0J29wZXJhdG9yJzogL1xcLnszfXw6Wzo9XXxcXHw+fC0+fD0oPzo9PT98Pik/fDw9P3w+PT98W3xePycjIX5gXXxbK1xcLSpcXC9dXFwuP3xcXGIoPzphc3J8bGFuZHxsb3J8bHNsfGxzcnxseG9yfG1vZClcXGIvXG59KTtcblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3JlYXNvbicsICdjbGFzcy1uYW1lJywge1xuXHQnY2hhcic6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OlxcXFx4W1xcZGEtZl17Mn18XFxcXG9bMC0zXVswLTddWzAtN118XFxcXFxcZHszfXxcXFxcLnxbXidcXFxcXFxyXFxuXSknLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0Ly8gTmVnYXRpdmUgbG9vay1haGVhZCBwcmV2ZW50cyBmcm9tIG1hdGNoaW5nIHRoaW5ncyBsaWtlIFN0cmluZy5jYXBpdGFsaXplXG5cdCdjb25zdHJ1Y3Rvcic6IC9cXGJbQS1aXVxcdypcXGIoPyFcXHMqXFwuKS8sXG5cdCdsYWJlbCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW2Etel1cXHcqKD89OjopLyxcblx0XHRhbGlhczogJ3N5bWJvbCdcblx0fVxufSk7XG5cbi8vIFdlIGNhbid0IG1hdGNoIGZ1bmN0aW9ucyBwcm9wZXJ0eSwgc28gbGV0J3Mgbm90IGV2ZW4gdHJ5LlxuZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5yZWFzb24uZnVuY3Rpb247XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgc3BlY2lhbEVzY2FwZSA9IHtcblx0XHRwYXR0ZXJuOiAvXFxcXFtcXFxcKCl7fVtcXF1eJCsqP3wuXS8sXG5cdFx0YWxpYXM6ICdlc2NhcGUnXG5cdH07XG5cdHZhciBlc2NhcGUgPSAvXFxcXCg/OnhbXFxkYS1mQS1GXXsyfXx1W1xcZGEtZkEtRl17NH18dVxce1tcXGRhLWZBLUZdK1xcfXwwWzAtN117MCwyfXxbMTIzXVswLTddezJ9fGNbYS16QS1aXXwuKS87XG5cdHZhciBjaGFyU2V0ID0ge1xuXHRcdHBhdHRlcm46IC9cXC58XFxcXFt3c2RdfFxcXFxwXFx7W157fV0rXFx9L2ksXG5cdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHR9O1xuXHR2YXIgY2hhclNldFdpdGhvdXREb3QgPSB7XG5cdFx0cGF0dGVybjogL1xcXFxbd3NkXXxcXFxccFxce1tee31dK1xcfS9pLFxuXHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0fTtcblxuXHR2YXIgcmFuZ2VDaGFyID0gJyg/OlteXFxcXFxcXFwtXXwnICsgZXNjYXBlLnNvdXJjZSArICcpJztcblx0dmFyIHJhbmdlID0gUmVnRXhwKHJhbmdlQ2hhciArICctJyArIHJhbmdlQ2hhcik7XG5cblx0Ly8gdGhlIG5hbWUgb2YgYSBjYXB0dXJpbmcgZ3JvdXBcblx0dmFyIGdyb3VwTmFtZSA9IHtcblx0XHRwYXR0ZXJuOiAvKDx8JylbXjw+J10rKD89Wz4nXSQpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnJlZ2V4ID0ge1xuXHRcdCdjaGFyLWNsYXNzJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFteXFxcXF0pKD86XFxcXFxcXFwpKilcXFsoPzpbXlxcXFxcXF1dfFxcXFxbXFxzXFxTXSkqXFxdLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NoYXItY2xhc3MtbmVnYXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheXFxbKVxcXi8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnY2hhci1jbGFzcy1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcW3xcXF0kLyxcblx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncmFuZ2UnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogcmFuZ2UsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnZXNjYXBlJzogZXNjYXBlLFxuXHRcdFx0XHRcdFx0J3JhbmdlLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvLS8sXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnc3BlY2lhbC1lc2NhcGUnOiBzcGVjaWFsRXNjYXBlLFxuXHRcdFx0XHQnY2hhci1zZXQnOiBjaGFyU2V0V2l0aG91dERvdCxcblx0XHRcdFx0J2VzY2FwZSc6IGVzY2FwZVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3NwZWNpYWwtZXNjYXBlJzogc3BlY2lhbEVzY2FwZSxcblx0XHQnY2hhci1zZXQnOiBjaGFyU2V0LFxuXHRcdCdiYWNrcmVmZXJlbmNlJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBhIGJhY2tyZWZlcmVuY2Ugd2hpY2ggaXMgbm90IGFuIG9jdGFsIGVzY2FwZVxuXHRcdFx0XHRwYXR0ZXJuOiAvXFxcXCg/IVsxMjNdWzAtN117Mn0pWzEtOV0vLFxuXHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxcXGs8W148PiddKz4vLFxuXHRcdFx0XHRhbGlhczogJ2tleXdvcmQnLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnZ3JvdXAtbmFtZSc6IGdyb3VwTmFtZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnYW5jaG9yJzoge1xuXHRcdFx0cGF0dGVybjogL1skXl18XFxcXFtBQmJHWnpdLyxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblx0XHQnZXNjYXBlJzogZXNjYXBlLFxuXHRcdCdncm91cCc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzEwL2RvY3MvYXBpL2phdmEvdXRpbC9yZWdleC9QYXR0ZXJuLmh0bWxcblx0XHRcdFx0Ly8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvZG90bmV0L3N0YW5kYXJkL2Jhc2UtdHlwZXMvcmVndWxhci1leHByZXNzaW9uLWxhbmd1YWdlLXF1aWNrLXJlZmVyZW5jZT92aWV3PW5ldGZyYW1ld29yay00LjcuMiNncm91cGluZy1jb25zdHJ1Y3RzXG5cblx0XHRcdFx0Ly8gKCksICg/PG5hbWU+KSwgKD8nbmFtZScpLCAoPz4pLCAoPzopLCAoPz0pLCAoPyEpLCAoPzw9KSwgKD88ISksICg/aXMtbSksICg/aS1tOilcblx0XHRcdFx0cGF0dGVybjogL1xcKCg/OlxcPyg/OjxbXjw+J10rPnwnW148PiddKyd8Wz46XXw8P1s9IV18W2lkbW5zdXhVXSsoPzotW2lkbW5zdXhVXSspPzo/KSk/Lyxcblx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbicsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdncm91cC1uYW1lJzogZ3JvdXBOYW1lXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXCkvLFxuXHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J3F1YW50aWZpZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKD86WysqP118XFx7XFxkKyg/OixcXGQqKT9cXH0pWz8rXT8vLFxuXHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0fSxcblx0XHQnYWx0ZXJuYXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFx8Lyxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9XG5cdH07XG5cbn0oUHJpc20pKTtcblxuLy8gaHR0cHM6Ly93d3cub3BlbnBvbGljeWFnZW50Lm9yZy9kb2NzL2xhdGVzdC9wb2xpY3ktcmVmZXJlbmNlL1xuXG5QcmlzbS5sYW5ndWFnZXMucmVnbyA9IHtcblx0J2NvbW1lbnQnOiAvIy4qLyxcblx0J3Byb3BlcnR5Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFwuXSkoPzpcIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCJ8YFteYF0qYHxcXGJbYS16X11cXHcqXFxiKSg/PVxccyo6KD8hPSkpL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCJ8YFteYF0qYC8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQna2V5d29yZCc6IC9cXGIoPzphc3xkZWZhdWx0fGVsc2V8aW1wb3J0fG5vdHxudWxsfHBhY2thZ2V8c2V0KD89XFxzKlxcKCl8c29tZXx3aXRoKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogL1xcYlthLXpfXVxcdypcXGIoPzpcXHMqXFwuXFxzKlxcYlthLXpfXVxcdypcXGIpKig/PVxccypcXCgpL2ksXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnbmFtZXNwYWNlJzogL1xcYlxcdytcXGIoPz1cXHMqXFwuKS8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdH1cblx0fSxcblxuXHQnbnVtYmVyJzogLy0/XFxiXFxkKyg/OlxcLlxcZCspPyg/OmVbKy1dP1xcZCspP1xcYi9pLFxuXHQnb3BlcmF0b3InOiAvWy0rKi8lfCZdfFs8Pjo9XT0/fCE9fFxcYl9cXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvWyw7LlxcW1xcXXt9KCldL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnJlbnB5ID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkjLisvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXCJcIlwifCcnJylbXFxzXFxTXSs/XFwxfChcInwnKSg/OlxcXFwufCg/IVxcMilbXlxcXFxdKSpcXDJ8KD86XiM/KD86KD86WzAtOWEtZkEtRl0pezN9fFswLTlhLWZBLUZdezZ9KSQpL20sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXCgpL2ksXG5cblx0J3Byb3BlcnR5JzogL1xcYig/OlVwZGF0ZXxVcGRhdGVWZXJzaW9ufGFjdGlvbnxhY3RpdmF0ZV9zb3VuZHxhZHZfbnZsX3RyYW5zaXRpb258YWZ0ZXJfbG9hZF90cmFuc2l0aW9ufGFsaWdufGFscGhhfGFsdHxhbmNob3J8YW50aWFsaWFzfGFyZWF8YXV0b3xiYWNrZ3JvdW5kfGJhcl9pbnZlcnR8YmFyX3Jlc2l6aW5nfGJhcl92ZXJ0aWNhbHxibGFja19jb2xvcnxib2xkfGJvdHRvbV9iYXJ8Ym90dG9tX2d1dHRlcnxib3R0b21fbWFyZ2lufGJvdHRvbV9wYWRkaW5nfGJveF9yZXZlcnNlfGJveF93cmFwfGNhbl91cGRhdGV8Y2FyZXR8Y2hpbGR8Y29sb3J8Y3JvcHxkZWZhdWx0X2FmbV9lbmFibGV8ZGVmYXVsdF9hZm1fdGltZXxkZWZhdWx0X2Z1bGxzY3JlZW58ZGVmYXVsdF90ZXh0X2Nwc3xkZXZlbG9wZXJ8ZGlyZWN0b3J5X25hbWV8ZHJhZ19oYW5kbGV8ZHJhZ19qb2luZWR8ZHJhZ19uYW1lfGRyYWdfcmFpc2V8ZHJhZ2dhYmxlfGRyYWdnZWR8ZHJvcF9zaGFkb3d8ZHJvcF9zaGFkb3dfY29sb3J8ZHJvcHBhYmxlfGRyb3BwZWR8ZWFzZWlufGVhc2VvdXR8ZWRnZXNjcm9sbHxlbmRfZ2FtZV90cmFuc2l0aW9ufGVuZF9zcGxhc2hfdHJhbnNpdGlvbnxlbnRlcl9yZXBsYXlfdHJhbnNpdGlvbnxlbnRlcl9zb3VuZHxlbnRlcl90cmFuc2l0aW9ufGVudGVyX3llc25vX3RyYW5zaXRpb258ZXhlY3V0YWJsZV9uYW1lfGV4aXRfcmVwbGF5X3RyYW5zaXRpb258ZXhpdF9zb3VuZHxleGl0X3RyYW5zaXRpb258ZXhpdF95ZXNub190cmFuc2l0aW9ufGZhZGVpbnxmYWRlb3V0fGZpcnN0X2luZGVudHxmaXJzdF9zcGFjaW5nfGZpdF9maXJzdHxmb2N1c3xmb2N1c19tYXNrfGZvbnR8Zm9yZWdyb3VuZHxnYW1lX21haW5fdHJhbnNpdGlvbnxnZXRfaW5zdGFsbGVkX3BhY2thZ2VzfGdvb2dsZV9wbGF5X2tleXxnb29nbGVfcGxheV9zYWx0fGdyb3VuZHxoYXNfbXVzaWN8aGFzX3NvdW5kfGhhc192b2ljZXxoZWlnaHR8aGVscHxoaW50aW5nfGhvdmVyfGhvdmVyX2JhY2tncm91bmR8aG92ZXJfY29sb3J8aG92ZXJfc291bmR8aG92ZXJlZHxoeXBlcmxpbmtfZnVuY3Rpb25zfGlkbGV8aWRsZV9jb2xvcnxpbWFnZV9zdHlsZXxpbmNsdWRlX3VwZGF0ZXxpbnNlbnNpdGl2ZXxpbnNlbnNpdGl2ZV9iYWNrZ3JvdW5kfGluc2Vuc2l0aXZlX2NvbG9yfGluc2lkZXxpbnRyYV90cmFuc2l0aW9ufGl0YWxpY3xqdXN0aWZ5fGtlcm5pbmd8a2V5Ym9hcmRfZm9jdXN8bGFuZ3VhZ2V8bGF5ZXJfY2xpcHBpbmd8bGF5ZXJzfGxheW91dHxsZWZ0X2JhcnxsZWZ0X2d1dHRlcnxsZWZ0X21hcmdpbnxsZWZ0X3BhZGRpbmd8bGVuZ3RofGxpbmVfbGVhZGluZ3xsaW5lX292ZXJsYXBfc3BsaXR8bGluZV9zcGFjaW5nfGxpbmVhcnxtYWluX2dhbWVfdHJhbnNpdGlvbnxtYWluX21lbnVfbXVzaWN8bWF4aW11bXxtaW5fd2lkdGh8bWluaW11bXxtaW53aWR0aHxtb2RhbHxtb3VzZXxtb3VzZXdoZWVsfG5hbWV8bmFycmF0b3JfbWVudXxuZXdsaW5lX2luZGVudHxudmxfYWR2X3RyYW5zaXRpb258b2Zmc2V0fG9yZGVyX3JldmVyc2V8b3V0bGluZXN8b3ZlcmxheV9mdW5jdGlvbnN8cG9zfHBvc2l0aW9ufHByZWZpeHxyYWRpdXN8cmFuZ2V8cmVzdF9pbmRlbnR8cmlnaHRfYmFyfHJpZ2h0X2d1dHRlcnxyaWdodF9tYXJnaW58cmlnaHRfcGFkZGluZ3xyb3RhdGV8cm90YXRlX3BhZHxydWJ5X3N0eWxlfHNhbXBsZV9zb3VuZHxzYXZlX2RpcmVjdG9yeXxzYXlfYXR0cmlidXRlX3RyYW5zaXRpb258c2NyZWVuX2hlaWdodHxzY3JlZW5fd2lkdGh8c2Nyb2xsYmFyc3xzZWxlY3RlZF9ob3ZlcnxzZWxlY3RlZF9ob3Zlcl9jb2xvcnxzZWxlY3RlZF9pZGxlfHNlbGVjdGVkX2lkbGVfY29sb3J8c2VsZWN0ZWRfaW5zZW5zaXRpdmV8c2hvd19zaWRlX2ltYWdlfHNob3dfdHdvX3dpbmRvd3xzaWRlX3NwYWNpbmd8c2lkZV94cG9zfHNpZGVfeXBvc3xzaXplfHNpemVfZ3JvdXB8c2xvd19jcHN8c2xvd19jcHNfbXVsdGlwbGllcnxzcGFjaW5nfHN0cmlrZXRocm91Z2h8c3VicGl4ZWx8dGV4dF9hbGlnbnx0ZXh0X3N0eWxlfHRleHRfeHBvc3x0ZXh0X3lfZnVkZ2V8dGV4dF95cG9zfHRodW1ifHRodW1iX29mZnNldHx0aHVtYl9zaGFkb3d8dGh1bWJuYWlsX2hlaWdodHx0aHVtYm5haWxfd2lkdGh8dGltZXx0b3BfYmFyfHRvcF9ndXR0ZXJ8dG9wX21hcmdpbnx0b3BfcGFkZGluZ3x0cmFuc2xhdGlvbnN8dW5kZXJsaW5lfHVuc2Nyb2xsYWJsZXx1cGRhdGV8dmFsdWV8dmVyc2lvbnx2ZXJzaW9uX25hbWV8dmVyc2lvbl90dXBsZXx2ZXJ0aWNhbHx3aWR0aHx3aW5kb3dfaGlkZV90cmFuc2l0aW9ufHdpbmRvd19pY29ufHdpbmRvd19sZWZ0X3BhZGRpbmd8d2luZG93X3Nob3dfdHJhbnNpdGlvbnx3aW5kb3dfdGl0bGV8d2luZG93c19pY29ufHhhZGp1c3RtZW50fHhhbGlnbnx4YW5jaG9yfHhhbmNob3Jhcm91bmR8eGFyb3VuZHx4Y2VudGVyfHhmaWxsfHhpbml0aWFsfHhtYXJnaW58eG1heGltdW18eG1pbmltdW18eG9mZnNldHx4b2Zzc2V0fHhwYWRkaW5nfHhwb3N8eHNpemV8eHpvb218eWFkanVzdG1lbnR8eWFsaWdufHlhbmNob3J8eWFuY2hvcmFyb3VuZHx5YXJvdW5kfHljZW50ZXJ8eWZpbGx8eWluaXRpYWx8eW1hcmdpbnx5bWF4aW11bXx5bWluaW11bXx5b2Zmc2V0fHlwYWRkaW5nfHlwb3N8eXNpemV8eXNpemV4eXNpemV8eXpvb218em9vbXx6b3JkZXIpXFxiLyxcblxuXHQndGFnJzogL1xcYig/OmJhcnxibG9ja3xidXR0b258YnV0dG9zY3JlZW5ufGRyYWd8ZHJhZ2dyb3VwfGZpeGVkfGZyYW1lfGdyaWR8W2h2XWJveHxob3RiYXJ8aG90c3BvdHxpbWFnZXxpbWFnZWJ1dHRvbnxpbWFnZW1hcHxpbnB1dHxrZXl8bGFiZWx8bWVudXxtbV9tZW51X2ZyYW1lfG1vdXNlYXJlYXxudmx8cGFyYWxsZWx8c2NyZWVufHNlbGZ8c2lkZXx0YWd8dGV4dHx0ZXh0YnV0dG9ufHRpbWVyfHZiYXJ8dmlld3BvcnR8d2luZG93KVxcYnxcXCQvLFxuXG5cdCdrZXl3b3JkJzogL1xcYig/Ok5vbmV8YWRkfGFkanVzdG1lbnR8YWxpZ25hcm91bmR8YWxsb3d8YW5nbGV8YW5pbWF0aW9ufGFyb3VuZHxhc3xhc3NlcnR8YmVoaW5kfGJveF9sYXlvdXR8YnJlYWt8YnVpbGR8Y2FjaGV8Y2FsbHxjZW50ZXJ8Y2hhbmdlZHxjaGlsZF9zaXplfGNob2ljZXxjaXJjbGVzfGNsYXNzfGNsZWFyfGNsaWNrZWR8Y2xpcHBpbmd8Y2xvY2t3aXNlfGNvbmZpZ3xjb250YWluc3xjb250aW51ZXxjb3JuZXIxfGNvcm5lcjJ8Y291bnRlcmNsb2Nrd2lzZXxkZWZ8ZGVmYXVsdHxkZWZpbmV8ZGVsfGRlbGF5fGRpc2FibGVkfGRpc2FibGVkX3RleHR8ZGlzc29sdmV8ZWxpZnxlbHNlfGV2ZW50fGV4Y2VwdHxleGNsdWRlfGV4ZWN8ZXhwcmVzc2lvbnxmYWRlfGZpbmFsbHl8Zm9yfGZyb218ZnVuY3Rpb258Z2xvYmFsfGdtX3Jvb3R8aGFzfGhpZGV8aWR8aWZ8aW1wb3J0fGlufGluaXR8aXN8anVtcHxrbm90fGxhbWJkYXxsZWZ0fGxlc3Nfcm91bmRlZHxtbV9yb290fG1vdmllfG11c2ljfG51bGx8b258b25sYXllcnxwYXNzfHBhdXNlfHBlcnNpc3RlbnR8cGxheXxwcmludHxweXRob258cXVldWV8cmFpc2V8cmFuZG9tfHJlbnB5fHJlcGVhdHxyZXR1cm58cmlnaHR8cm91bmRlZF93aW5kb3d8c2NlbmV8c2NvcGV8c2V0fHNob3d8c2xvd3xzbG93X2Fib3J0YWJsZXxzbG93X2RvbmV8c291bmR8c3RvcHxzdG9yZXxzdHlsZXxzdHlsZV9ncm91cHxzdWJzdGl0dXRlfHN1ZmZpeHx0aGVtZXx0cmFuc2Zvcm18dHJhbnNmb3JtX2FuY2hvcnx0cmFuc3Bvc2V8dHJ5fHVpfHVuaG92ZXJlZHx1cGRhdGVyfHVzZXx2b2ljZXx3aGlsZXx3aWRnZXR8d2lkZ2V0X2hvdmVyfHdpZGdldF9zZWxlY3RlZHx3aWRnZXRfdGV4dHx5aWVsZClcXGIvLFxuXG5cdCdib29sZWFuJzogL1xcYig/OltGZl1hbHNlfFtUdF1ydWUpXFxiLyxcblxuXHQnbnVtYmVyJzogLyg/OlxcYig/OjBbYm9dKT8oPzooPzpcXGR8MHhbXFxkYS1mXSlbXFxkYS1mXSooPzpcXC5cXGQqKT8pfFxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/aj8vaSxcblxuXHQnb3BlcmF0b3InOiAvWy0rJT1dPT98IT18XFwqXFwqPz0/fFxcL1xcLz89P3w8Wzw9Pl0/fD5bPT5dP3xbJnxefl18XFxiKD86YW5kfGF0fG5vdHxvcnx3aXRoKVxcYi8sXG5cblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksLjpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnJweSA9IFByaXNtLmxhbmd1YWdlcy5yZW5weTtcblxuUHJpc20ubGFuZ3VhZ2VzLnJlc2NyaXB0ID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjaGFyJzogeyBwYXR0ZXJuOiAvJyg/OlteXFxyXFxuXFxcXF18XFxcXCg/Oi58XFx3KykpJy8sIGdyZWVkeTogdHJ1ZSB9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteXFxcXFxcclxcblwiXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IC9cXGJbQS1aXVxcdyp8QFthLXouXSp8I1tBLVphLXpdXFx3KnwjXFxkLyxcblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9bYS16QS1aXVxcdyooPz1cXCgpfChcXC4pW2Etel1cXHcqLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHR9LFxuXHQnbnVtYmVyJzogLyg/OlxcYjB4KD86W1xcZGEtZl0rKD86XFwuW1xcZGEtZl0qKT98XFwuW1xcZGEtZl0rKSg/OnBbKy1dP1xcZCspP3woPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/KVtmdWxdezAsNH0vaSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnYXR0ci12YWx1ZSc6IC9bQS1aYS16XVxcdyooPz09KS8sXG5cdCdjb25zdGFudCc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYnR5cGVcXHMrKVthLXpdXFx3Ki8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQndGFnJzoge1xuXHRcdHBhdHRlcm46IC8oPClbYS16XVxcdyp8KD86PFxcLylbYS16XVxcdyovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnb3BlcmF0b3InOiAvPHw+fFxcLy8sXG5cdFx0fSxcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YW5kfGFzfGFzc2VydHxiZWdpbnxib29sfGNsYXNzfGNvbnN0cmFpbnR8ZG98ZG9uZXxkb3dudG98ZWxzZXxlbmR8ZXhjZXB0aW9ufGV4dGVybmFsfGZsb2F0fGZvcnxmdW58ZnVuY3Rpb258aWZ8aW58aW5jbHVkZXxpbmhlcml0fGluaXRpYWxpemVyfGludHxsYXp5fGxldHxtZXRob2R8bW9kdWxlfG11dGFibGV8bmV3fG5vbnJlY3xvYmplY3R8b2Z8b3Blbnxvcnxwcml2YXRlfHJlY3xzdHJpbmd8c3dpdGNofHRoZW58dG98dHJ5fHR5cGV8d2hlbnx3aGlsZXx3aXRoKVxcYi8sXG5cdCdvcGVyYXRvcic6IC9cXC57M318Ols6PV0/fFxcfD58LT58PSg/Oj09P3w+KT98PD0/fD49P3xbfF4/JyMhfmBdfFsrXFwtKlxcL11cXC4/fFxcYig/OmFzcnxsYW5kfGxvcnxsc2x8bHNyfGx4b3J8bW9kKVxcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCl7fVtcXF0sOy5dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncmVzY3JpcHQnLCAnc3RyaW5nJywge1xuXHQndGVtcGxhdGUtc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9gKD86XFxcXFtcXHNcXFNdfFxcJFxceyg/Oltee31dfFxceyg/Oltee31dfFxce1tefV0qXFx9KSpcXH0pK1xcfXwoPyFcXCRcXHspW15cXFxcYF0pKmAvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd0ZW1wbGF0ZS1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL15gfGAkLyxcblx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0XHR9LFxuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXlxcXFxdKSg/OlxcXFx7Mn0pKilcXCRcXHsoPzpbXnt9XXxcXHsoPzpbXnt9XXxcXHtbXn1dKlxcfSkqXFx9KStcXH0vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eXFwkXFx7fFxcfSQvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICd0YWcnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRyZXN0OiBQcmlzbS5sYW5ndWFnZXMucmVzY3JpcHRcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fSxcbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMucmVzID0gUHJpc20ubGFuZ3VhZ2VzLnJlc2NyaXB0O1xuXG5QcmlzbS5sYW5ndWFnZXMucmVzdCA9IHtcblx0J3RhYmxlJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSopKD86XFwrWz0tXSspK1xcKyg/Olxccj9cXG58XFxyKSg/OlxcMVsrfF0uK1srfF0oPzpcXHI/XFxufFxccikpK1xcMSg/OlxcK1s9LV0rKStcXCsvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcfHwoPzpcXCtbPS1dKykrXFwrL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKik9KyBbID1dKj0oPzooPzpcXHI/XFxufFxccilcXDEuKykrKD86XFxyP1xcbnxcXHIpXFwxPSsgWyA9XSo9KD89KD86XFxyP1xcbnxcXHIpezJ9fFxccyokKS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWz0tXSsvXG5cdFx0XHR9XG5cdFx0fVxuXHRdLFxuXG5cdC8vIERpcmVjdGl2ZS1saWtlIHBhdHRlcm5zXG5cblx0J3N1YnN0aXR1dGlvbi1kZWYnOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKlxcLlxcLiApXFx8KD86W158XFxzXSg/OltefF0qW158XFxzXSk/KVxcfCBbXjpdKzo6L20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdzdWJzdGl0dXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eXFx8KD86W158XFxzXXxbXnxcXHNdW158XSpbXnxcXHNdKVxcfC8sXG5cdFx0XHRcdGFsaWFzOiAnYXR0ci12YWx1ZScsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFx8fFxcfCQvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnZGlyZWN0aXZlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCApKD8hIClbXjpdKzo6Lyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdmdW5jdGlvbicsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC86OiQvXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdsaW5rLXRhcmdldCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qXFwuXFwuIClcXFtbXlxcXV0rXFxdL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFxbfFxcXSQvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qXFwuXFwuIClfKD86YFteYF0rYHwoPzpbXjpcXFxcXXxcXFxcLikrKTovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15ffDokL1xuXHRcdFx0fVxuXHRcdH1cblx0XSxcblx0J2RpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qXFwuXFwuIClbXjpdKzo6L20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC86OiQvXG5cdFx0fVxuXHR9LFxuXHQnY29tbWVudCc6IHtcblx0XHQvLyBUaGUgdHdvIGFsdGVybmF0aXZlcyB0cnkgdG8gcHJldmVudCBoaWdobGlnaHRpbmcgb2YgYmxhbmsgY29tbWVudHNcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qXFwuXFwuKSg/Oig/OiAuKyk/KD86KD86XFxyP1xcbnxcXHIpLispK3wgLispKD89KD86XFxyP1xcbnxcXHIpezJ9fCQpL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXG5cdCd0aXRsZSc6IFtcblx0XHQvLyBPdmVybGluZWQgYW5kIHVuZGVybGluZWRcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXigoWyFcIiMkJSYnKCkqKyxcXC0uXFwvOjs8PT4/QFxcW1xcXFxcXF1eX2B7fH1+XSlcXDIrKSg/Olxccj9cXG58XFxyKS4rKD86XFxyP1xcbnxcXHIpXFwxJC9tLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eWyFcIiMkJSYnKCkqKyxcXC0uXFwvOjs8PT4/QFxcW1xcXFxcXF1eX2B7fH1+XSt8WyFcIiMkJSYnKCkqKyxcXC0uXFwvOjs8PT4/QFxcW1xcXFxcXF1eX2B7fH1+XSskLyxcblx0XHRcdFx0J2ltcG9ydGFudCc6IC8uKy9cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gVW5kZXJsaW5lZCBvbmx5XG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefCg/Olxccj9cXG58XFxyKXsyfSkuKyg/Olxccj9cXG58XFxyKShbIVwiIyQlJicoKSorLFxcLS5cXC86Ozw9Pj9AXFxbXFxcXFxcXV5fYHt8fX5dKVxcMisoPz1cXHI/XFxufFxccnwkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bIVwiIyQlJicoKSorLFxcLS5cXC86Ozw9Pj9AXFxbXFxcXFxcXV5fYHt8fX5dKyQvLFxuXHRcdFx0XHQnaW1wb3J0YW50JzogLy4rL1xuXHRcdFx0fVxuXHRcdH1cblx0XSxcblx0J2hyJzoge1xuXHRcdHBhdHRlcm46IC8oKD86XFxyP1xcbnxcXHIpezJ9KShbIVwiIyQlJicoKSorLFxcLS5cXC86Ozw9Pj9AXFxbXFxcXFxcXV5fYHt8fX5dKVxcMnszLH0oPz0oPzpcXHI/XFxufFxccil7Mn0pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdH0sXG5cdCdmaWVsZCc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKTpbXjpcXHJcXG5dKzooPz0gKS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdhdHRyLW5hbWUnXG5cdH0sXG5cdCdjb21tYW5kLWxpbmUtb3B0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopKD86WystXVthLXpcXGRdfCg/Oi0tfFxcLylbYS16XFxkLV0rKSg/OlsgPV0oPzpbYS16XVtcXHctXSp8PFtePD5dKz4pKT8oPzosICg/OlsrLV1bYS16XFxkXXwoPzotLXxcXC8pW2EtelxcZC1dKykoPzpbID1dKD86W2Etel1bXFx3LV0qfDxbXjw+XSs+KSk/KSooPz0oPzpcXHI/XFxufFxccik/IHsyLH1cXFMpL2ltLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdzeW1ib2wnXG5cdH0sXG5cdCdsaXRlcmFsLWJsb2NrJzoge1xuXHRcdHBhdHRlcm46IC86Oig/Olxccj9cXG58XFxyKXsyfShbIFxcdF0rKSg/IVsgXFx0XSkuKyg/Oig/Olxccj9cXG58XFxyKVxcMS4rKSovLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2xpdGVyYWwtYmxvY2stcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eOjovLFxuXHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J3F1b3RlZC1saXRlcmFsLWJsb2NrJzoge1xuXHRcdHBhdHRlcm46IC86Oig/Olxccj9cXG58XFxyKXsyfShbIVwiIyQlJicoKSorLFxcLS5cXC86Ozw9Pj9AXFxbXFxcXFxcXV5fYHt8fX5dKS4qKD86KD86XFxyP1xcbnxcXHIpXFwxLiopKi8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnbGl0ZXJhbC1ibG9jay1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL14oPzo6OnwoWyFcIiMkJSYnKCkqKyxcXC0uXFwvOjs8PT4/QFxcW1xcXFxcXF1eX2B7fH1+XSlcXDEqKS9tLFxuXHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J2xpc3QtYnVsbGV0Jzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopKD86WyorXFwtXHUyMDIyXHUyMDIzXHUyMDQzXXxcXCg/KD86XFxkK3xbYS16XXxbaXZ4ZGNsbV0rKVxcKXwoPzpcXGQrfFthLXpdfFtpdnhkY2xtXSspXFwuKSg/PSApL2ltLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0fSxcblx0J2RvY3Rlc3QtYmxvY2snOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKik+Pj4gLisoPzooPzpcXHI/XFxufFxccikuKykqL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9ePj4+L1xuXHRcdH1cblx0fSxcblxuXHQnaW5saW5lJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXFxzXFwtOlxcLydcIjwoXFxbe10pKD86OlteOl0rOmAuKj9gfGAuKj9gOlteOl0rOnwoXFwqXFwqP3xgYD98XFx8KSg/IVxccykoPzooPyFcXDIpLikqXFxTXFwyKD89W1xcc1xcLS4sOjshP1xcXFxcXC8nXCIpXFxdfV18JCkpL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdib2xkJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXlxcKlxcKikuKyg/PVxcKlxcKiQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdpdGFsaWMnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheXFwqKS4rKD89XFwqJCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J2lubGluZS1saXRlcmFsJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXmBgKS4rKD89YGAkKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ3N5bWJvbCdcblx0XHRcdFx0fSxcblx0XHRcdFx0J3JvbGUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL146W146XSs6fDpbXjpdKzokLyxcblx0XHRcdFx0XHRhbGlhczogJ2Z1bmN0aW9uJyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eOnw6JC9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdpbnRlcnByZXRlZC10ZXh0Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXmApLisoPz1gJCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdhdHRyLXZhbHVlJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnc3Vic3RpdHV0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXlxcfCkuKyg/PVxcfCQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnYXR0ci12YWx1ZSdcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcKlxcKj98YGA/fFxcfC9cblx0XHRcdH1cblx0XHR9XG5cdF0sXG5cblx0J2xpbmsnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcW1teXFxbXFxdXStcXF1fKD89W1xcc1xcLS4sOjshP1xcXFxcXC8nXCIpXFxdfV18JCkvLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFxbfFxcXV8kL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyg/OlxcYlthLXpcXGRdKyg/OltfLjorXVthLXpcXGRdKykqXz9ffGBbXmBdK2BfP198X2BbXmBdK2ApKD89W1xcc1xcLS4sOjshP1xcXFxcXC8nXCIpXFxdfV18JCkvaSxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXl8/YHxgJHxgP18/XyQvXG5cdFx0XHR9XG5cdFx0fVxuXHRdLFxuXG5cdC8vIExpbmUgYmxvY2sgc3RhcnQsXG5cdC8vIHF1b3RlIGF0dHJpYnV0aW9uLFxuXHQvLyBleHBsaWNpdCBtYXJrdXAgc3RhcnQsXG5cdC8vIGFuZCBhbm9ueW1vdXMgaHlwZXJsaW5rIHRhcmdldCBzaG9ydGN1dCAoX18pXG5cdCdwdW5jdHVhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSg/OlxcfCg/PSB8JCl8KD86LS0tP3xcdTIwMTR8XFwuXFwufF9fKSg/PSApfFxcLlxcLiQpL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9XG59O1xuXG5QcmlzbS5sYW5ndWFnZXMucmlwID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvIy4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQnY2hhcic6IHtcblx0XHRwYXR0ZXJuOiAvXFxCYFteXFxzYCdcIiwuOjsjXFwvXFxcXCgpPD5cXFtcXF17fV1cXGIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXCJ8JykoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQncmVnZXgnOiB7XG5cdFx0cGF0dGVybjogLyhefFteL10pXFwvKD8hXFwvKSg/OlxcW1teXFxuXFxyXFxdXSpcXF18XFxcXC58W14vXFxcXFxcclxcblxcW10pK1xcLyg/PVxccyooPzokfFtcXHJcXG4sLjt9KV0pKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQna2V5d29yZCc6IC8oPzo9PnwtPil8XFxiKD86Y2FzZXxjYXRjaHxjbGFzc3xlbHNlfGV4aXR8ZmluYWxseXxpZnxyYWlzZXxyZXR1cm58c3dpdGNofHRyeSlcXGIvLFxuXG5cdCdidWlsdGluJzogL0B8XFxiU3lzdGVtXFxiLyxcblxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cblx0J2RhdGUnOiAvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1cXGIvLFxuXHQndGltZSc6IC9cXGJcXGR7Mn06XFxkezJ9OlxcZHsyfVxcYi8sXG5cdCdkYXRldGltZSc6IC9cXGJcXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfVxcYi8sXG5cblx0J3N5bWJvbCc6IC86W15cXGRcXHNgJ1wiLC46OyNcXC9cXFxcKCk8PlxcW1xcXXt9XVteXFxzYCdcIiwuOjsjXFwvXFxcXCgpPD5cXFtcXF17fV0qLyxcblx0J251bWJlcic6IC9bKy1dP1xcYig/OlxcZCtcXC5cXGQrfFxcZCspXFxiLyxcblxuXHQncHVuY3R1YXRpb24nOiAvKD86XFwuezIsM30pfFtgLC46Oz1cXC9cXFxcKCk8PlxcW1xcXXt9XS8sXG5cblx0J3JlZmVyZW5jZSc6IC9bXlxcZFxcc2AnXCIsLjo7I1xcL1xcXFwoKTw+XFxbXFxde31dW15cXHNgJ1wiLC46OyNcXC9cXFxcKCk8PlxcW1xcXXt9XSovXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMucm9ib2NvbmYgPSB7XG5cdCdjb21tZW50JzogLyMuKi8sXG5cdCdrZXl3b3JkJzoge1xuXHRcdCdwYXR0ZXJuJzogLyhefFxccykoPzooPzpleHRlcm5hbHxpbXBvcnQpXFxifCg/OmZhY2V0fGluc3RhbmNlIG9mKSg/PVsgXFx0XStbXFx3LV0rWyBcXHRdKlxceykpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdjb21wb25lbnQnOiB7XG5cdFx0cGF0dGVybjogL1tcXHctXSsoPz1bIFxcdF0qXFx7KS8sXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fSxcblx0J3Byb3BlcnR5JzogL1tcXHcuLV0rKD89WyBcXHRdKjopLyxcblx0J3ZhbHVlJzoge1xuXHRcdHBhdHRlcm46IC8oPVsgXFx0XSooPyFbIFxcdF0pKVteLDtdKy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2F0dHItdmFsdWUnXG5cdH0sXG5cdCdvcHRpb25hbCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwob3B0aW9uYWxcXCkvLFxuXHRcdGFsaWFzOiAnYnVpbHRpbidcblx0fSxcblx0J3dpbGRjYXJkJzoge1xuXHRcdHBhdHRlcm46IC8oXFwuKVxcKi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvW3t9LC47Oj1dL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBjb21tZW50ID0ge1xuXHRcdHBhdHRlcm46IC8oXlsgXFx0XSp8IHsyfXxcXHQpIy4qL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fTtcblxuXHR2YXIgdmFyaWFibGUgPSB7XG5cdFx0cGF0dGVybjogLygoPzpefFteXFxcXF0pKD86XFxcXHsyfSkqKVskQCYlXVxceyg/Oltee31cXHJcXG5dfFxce1tee31cXHJcXG5dKlxcfSkqXFx9Lyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL15bJEAmJV1cXHt8XFx9JC9cblx0XHR9XG5cdH07XG5cblx0ZnVuY3Rpb24gY3JlYXRlU2VjdGlvbihuYW1lLCBpbnNpZGUpIHtcblx0XHR2YXIgZXh0ZW5kZWNJbnNpZGUgPSB7fTtcblxuXHRcdGV4dGVuZGVjSW5zaWRlWydzZWN0aW9uLWhlYWRlciddID0ge1xuXHRcdFx0cGF0dGVybjogL14gP1xcKnszfS4rP1xcKnszfS8sXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fTtcblxuXHRcdC8vIGNvcHkgaW5zaWRlIHRva2Vuc1xuXHRcdGZvciAodmFyIHRva2VuIGluIGluc2lkZSkge1xuXHRcdFx0ZXh0ZW5kZWNJbnNpZGVbdG9rZW5dID0gaW5zaWRlW3Rva2VuXTtcblx0XHR9XG5cblx0XHRleHRlbmRlY0luc2lkZVsndGFnJ10gPSB7XG5cdFx0XHRwYXR0ZXJuOiAvKFtcXHJcXG5dKD86IHsyfXxcXHQpWyBcXHRdKilcXFtbLVxcd10rXFxdLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcW3xcXF0vXG5cdFx0XHR9XG5cdFx0fTtcblx0XHRleHRlbmRlY0luc2lkZVsndmFyaWFibGUnXSA9IHZhcmlhYmxlO1xuXHRcdGV4dGVuZGVjSW5zaWRlWydjb21tZW50J10gPSBjb21tZW50O1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvXiA/XFwqezN9WyBcXHRdKjxuYW1lPlsgXFx0XSpcXCp7M30oPzoufFtcXHJcXG5dKD8hXFwqezN9KSkqLy5zb3VyY2UucmVwbGFjZSgvPG5hbWU+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5hbWU7IH0pLCAnaW0nKSxcblx0XHRcdGFsaWFzOiAnc2VjdGlvbicsXG5cdFx0XHRpbnNpZGU6IGV4dGVuZGVjSW5zaWRlXG5cdFx0fTtcblx0fVxuXG5cblx0dmFyIGRvY1RhZyA9IHtcblx0XHRwYXR0ZXJuOiAvKFxcW0RvY3VtZW50YXRpb25cXF0oPzogezJ9fFxcdClbIFxcdF0qKSg/IVsgXFx0XXwjKSg/Oi58KD86XFxyXFxuP3xcXG4pWyBcXHRdKlxcLnszfSkrLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHR9O1xuXG5cdHZhciB0ZXN0TmFtZUxpa2UgPSB7XG5cdFx0cGF0dGVybjogLyhbXFxyXFxuXSA/KSg/ISMpKD86XFxTKD86WyBcXHRdXFxTKSopKy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd2YXJpYWJsZSc6IHZhcmlhYmxlXG5cdFx0fVxuXHR9O1xuXG5cdHZhciB0ZXN0UHJvcGVydHlMaWtlID0ge1xuXHRcdHBhdHRlcm46IC8oW1xcclxcbl0oPzogezJ9fFxcdClbIFxcdF0qKSg/IVxcW3xcXC57M318IykoPzpcXFMoPzpbIFxcdF1cXFMpKikrLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3ZhcmlhYmxlJzogdmFyaWFibGVcblx0XHR9XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzWydyb2JvdGZyYW1ld29yayddID0ge1xuXHRcdCdzZXR0aW5ncyc6IGNyZWF0ZVNlY3Rpb24oJ1NldHRpbmdzJywge1xuXHRcdFx0J2RvY3VtZW50YXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oW1xcclxcbl0gP0RvY3VtZW50YXRpb24oPzogezJ9fFxcdClbIFxcdF0qKSg/IVsgXFx0XXwjKSg/Oi58KD86XFxyXFxuP3xcXG4pWyBcXHRdKlxcLnszfSkrLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0XHR9LFxuXHRcdFx0J3Byb3BlcnR5Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFtcXHJcXG5dID8pKD8hXFwuezN9fCMpKD86XFxTKD86WyBcXHRdXFxTKSopKy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHR9KSxcblx0XHQndmFyaWFibGVzJzogY3JlYXRlU2VjdGlvbignVmFyaWFibGVzJyksXG5cdFx0J3Rlc3QtY2FzZXMnOiBjcmVhdGVTZWN0aW9uKCdUZXN0IENhc2VzJywge1xuXHRcdFx0J3Rlc3QtbmFtZSc6IHRlc3ROYW1lTGlrZSxcblx0XHRcdCdkb2N1bWVudGF0aW9uJzogZG9jVGFnLFxuXHRcdFx0J3Byb3BlcnR5JzogdGVzdFByb3BlcnR5TGlrZVxuXHRcdH0pLFxuXHRcdCdrZXl3b3Jkcyc6IGNyZWF0ZVNlY3Rpb24oJ0tleXdvcmRzJywge1xuXHRcdFx0J2tleXdvcmQtbmFtZSc6IHRlc3ROYW1lTGlrZSxcblx0XHRcdCdkb2N1bWVudGF0aW9uJzogZG9jVGFnLFxuXHRcdFx0J3Byb3BlcnR5JzogdGVzdFByb3BlcnR5TGlrZVxuXHRcdH0pLFxuXHRcdCd0YXNrcyc6IGNyZWF0ZVNlY3Rpb24oJ1Rhc2tzJywge1xuXHRcdFx0J3Rhc2stbmFtZSc6IHRlc3ROYW1lTGlrZSxcblx0XHRcdCdkb2N1bWVudGF0aW9uJzogZG9jVGFnLFxuXHRcdFx0J3Byb3BlcnR5JzogdGVzdFByb3BlcnR5TGlrZVxuXHRcdH0pLFxuXHRcdCdjb21tZW50JzogY29tbWVudFxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5yb2JvdCA9IFByaXNtLmxhbmd1YWdlc1sncm9ib3RmcmFtZXdvcmsnXTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIG11bHRpbGluZUNvbW1lbnQgPSAvXFwvXFwqKD86W14qL118XFwqKD8hXFwvKXxcXC8oPyFcXCopfDxzZWxmPikqXFwqXFwvLy5zb3VyY2U7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgMjsgaSsrKSB7XG5cdFx0Ly8gc3VwcG9ydCA0IGxldmVscyBvZiBuZXN0ZWQgY29tbWVudHNcblx0XHRtdWx0aWxpbmVDb21tZW50ID0gbXVsdGlsaW5lQ29tbWVudC5yZXBsYWNlKC88c2VsZj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gbXVsdGlsaW5lQ29tbWVudDsgfSk7XG5cdH1cblx0bXVsdGlsaW5lQ29tbWVudCA9IG11bHRpbGluZUNvbW1lbnQucmVwbGFjZSgvPHNlbGY+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIC9bXlxcc1xcU10vLnNvdXJjZTsgfSk7XG5cblxuXHRQcmlzbS5sYW5ndWFnZXMucnVzdCA9IHtcblx0XHQnY29tbWVudCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXnxbXlxcXFxdKS8uc291cmNlICsgbXVsdGlsaW5lQ29tbWVudCksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXDpdKVxcL1xcLy4qLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL2I/XCIoPzpcXFxcW1xcc1xcU118W15cXFxcXCJdKSpcInxiP3IoIyopXCIoPzpbXlwiXXxcIig/IVxcMSkpKlwiXFwxLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2NoYXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvYj8nKD86XFxcXCg/OnhbMC03XVtcXGRhLWZBLUZdfHVcXHsoPzpbXFxkYS1mQS1GXV8qKXsxLDZ9XFx9fC4pfFteXFxcXFxcclxcblxcdCddKScvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnYXR0cmlidXRlJzoge1xuXHRcdFx0cGF0dGVybjogLyMhP1xcWyg/OlteXFxbXFxdXCJdfFwiKD86XFxcXFtcXHNcXFNdfFteXFxcXFwiXSkqXCIpKlxcXS8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2F0dHItbmFtZScsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3N0cmluZyc6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIENsb3N1cmUgcGFyYW1zIHNob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aCBiaXR3aXNlIE9SIHxcblx0XHQnY2xvc3VyZS1wYXJhbXMnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFs9KCw6XVxccyp8XFxibW92ZVxccyopXFx8W158XSpcXHx8XFx8W158XSpcXHwoPz1cXHMqKD86XFx7fC0+KSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY2xvc3VyZS1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcfHxcXHwkLyxcblx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRyZXN0OiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQnbGlmZXRpbWUtYW5ub3RhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8nXFx3Ky8sXG5cdFx0XHRhbGlhczogJ3N5bWJvbCdcblx0XHR9LFxuXG5cdFx0J2ZyYWdtZW50LXNwZWNpZmllcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXFwkXFx3KzopW2Etel0rLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J3ZhcmlhYmxlJzogL1xcJFxcdysvLFxuXG5cdFx0J2Z1bmN0aW9uLWRlZmluaXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYmZuXFxzKylcXHcrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cdFx0J3R5cGUtZGVmaW5pdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxiKD86ZW51bXxzdHJ1Y3R8dHJhaXR8dHlwZXx1bmlvbilcXHMrKVxcdysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0XHR9LFxuXHRcdCdtb2R1bGUtZGVjbGFyYXRpb24nOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFxiKD86Y3JhdGV8bW9kKVxccyspW2Etel1bYS16X1xcZF0qLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICduYW1lc3BhY2UnXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmNyYXRlfHNlbGZ8c3VwZXIpXFxzKik6OlxccypbYS16XVthLXpfXFxkXSpcXGIoPzpcXHMqOjooPzpcXHMqW2Etel1bYS16X1xcZF0qXFxzKjo6KSopPy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnbmFtZXNwYWNlJyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzo6L1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQna2V5d29yZCc6IFtcblx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvcmVmZXJlbmNlL2Jsb2IvbWFzdGVyL3NyYy9rZXl3b3Jkcy5tZFxuXHRcdFx0L1xcYig/OlNlbGZ8YWJzdHJhY3R8YXN8YXN5bmN8YXdhaXR8YmVjb21lfGJveHxicmVha3xjb25zdHxjb250aW51ZXxjcmF0ZXxkb3xkeW58ZWxzZXxlbnVtfGV4dGVybnxmaW5hbHxmbnxmb3J8aWZ8aW1wbHxpbnxsZXR8bG9vcHxtYWNyb3xtYXRjaHxtb2R8bW92ZXxtdXR8b3ZlcnJpZGV8cHJpdnxwdWJ8cmVmfHJldHVybnxzZWxmfHN0YXRpY3xzdHJ1Y3R8c3VwZXJ8dHJhaXR8dHJ5fHR5cGV8dHlwZW9mfHVuaW9ufHVuc2FmZXx1bnNpemVkfHVzZXx2aXJ0dWFsfHdoZXJlfHdoaWxlfHlpZWxkKVxcYi8sXG5cdFx0XHQvLyBwcmltaXRpdmVzIGFuZCBzdHJcblx0XHRcdC8vIGh0dHBzOi8vZG9jLnJ1c3QtbGFuZy5vcmcvc3RhYmxlL3J1c3QtYnktZXhhbXBsZS9wcmltaXRpdmVzLmh0bWxcblx0XHRcdC9cXGIoPzpib29sfGNoYXJ8Zig/OjMyfDY0KXxbdWldKD86OHwxNnwzMnw2NHwxMjh8c2l6ZSl8c3RyKVxcYi9cblx0XHRdLFxuXG5cdFx0Ly8gZnVuY3Rpb25zIGNhbiB0ZWNobmljYWxseSBzdGFydCB3aXRoIGFuIHVwcGVyLWNhc2UgbGV0dGVyLCBidXQgdGhpcyB3aWxsIGludHJvZHVjZSBhIGxvdCBvZiBmYWxzZSBwb3NpdGl2ZXNcblx0XHQvLyBhbmQgUnVzdCdzIG5hbWluZyBjb252ZW50aW9ucyByZWNvbW1lbmQgc25ha2VfY2FzZSBhbnl3YXkuXG5cdFx0Ly8gaHR0cHM6Ly9kb2MucnVzdC1sYW5nLm9yZy8xLjAuMC9zdHlsZS9zdHlsZS9uYW1pbmcvUkVBRE1FLmh0bWxcblx0XHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccyooPzo6Olxccyo8fFxcKCkpLyxcblx0XHQnbWFjcm8nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiXFx3KyEvLFxuXHRcdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0XHR9LFxuXHRcdCdjb25zdGFudCc6IC9cXGJbQS1aX11bQS1aX1xcZF0rXFxiLyxcblx0XHQnY2xhc3MtbmFtZSc6IC9cXGJbQS1aXVxcdypcXGIvLFxuXG5cdFx0J25hbWVzcGFjZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oPzpcXGJbYS16XVthLXpfXFxkXSpcXHMqOjpcXHMqKSpcXGJbYS16XVthLXpfXFxkXSpcXHMqOjooPyFcXHMqPCkvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC86Oi9cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gSGV4LCBvY3QsIGJpbiwgZGVjIG51bWJlcnMgd2l0aCB2aXN1YWwgc2VwYXJhdG9ycyBhbmQgdHlwZSBzdWZmaXhcblx0XHQnbnVtYmVyJzogL1xcYig/OjB4W1xcZEEtRmEtZl0oPzpfP1tcXGRBLUZhLWZdKSp8MG9bMC03XSg/Ol8/WzAtN10pKnwwYlswMV0oPzpfP1swMV0pKnwoPzooPzpcXGQoPzpfP1xcZCkqKT9cXC4pP1xcZCg/Ol8/XFxkKSooPzpbRWVdWystXT9cXGQrKT8pKD86Xz8oPzpmMzJ8ZjY0fFtpdV0oPzo4fDE2fDMyfDY0fHNpemUpPykpP1xcYi8sXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHRcdCdwdW5jdHVhdGlvbic6IC8tPnxcXC5cXC49fFxcLnsxLDN9fDo6fFt7fVtcXF07KCksOl0vLFxuXHRcdCdvcGVyYXRvcic6IC9bLSsqXFwvJSFeXT0/fD1bPT5dP3wmWyY9XT98XFx8W3w9XT98PDw/PT98Pj4/PT98W0A/XS9cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMucnVzdFsnY2xvc3VyZS1wYXJhbXMnXS5pbnNpZGUucmVzdCA9IFByaXNtLmxhbmd1YWdlcy5ydXN0O1xuXHRQcmlzbS5sYW5ndWFnZXMucnVzdFsnYXR0cmlidXRlJ10uaW5zaWRlWydzdHJpbmcnXSA9IFByaXNtLmxhbmd1YWdlcy5ydXN0WydzdHJpbmcnXTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIHN0cmluZ1BhdHRlcm4gPSAvKD86XCIoPzpcIlwifFteXCJdKSpcIig/IVwiKXwnKD86Jyd8W14nXSkqJyg/IScpKS8uc291cmNlO1xuXG5cdHZhciBudW1iZXIgPSAvXFxiKD86XFxkW1xcZGEtZl0qeHxcXGQrKD86XFwuXFxkKyk/KD86ZVsrLV0/XFxkKyk/KVxcYi9pO1xuXHR2YXIgbnVtZXJpY0NvbnN0YW50ID0ge1xuXHRcdHBhdHRlcm46IFJlZ0V4cChzdHJpbmdQYXR0ZXJuICsgJ1tieF0nKSxcblx0XHRhbGlhczogJ251bWJlcidcblx0fTtcblxuXHR2YXIgbWFjcm9WYXJpYWJsZSA9IHtcblx0XHRwYXR0ZXJuOiAvJlthLXpfXVxcdyovaVxuXHR9O1xuXG5cdHZhciBtYWNyb0tleXdvcmQgPSB7XG5cdFx0cGF0dGVybjogLygoPzpefFxcc3w9fFxcKCkpJSg/OkFCT1JUfEJZfENNU3xDT1BZfERJU1BMQVl8RE98RUxTRXxFTkR8RVZBTHxHTE9CQUx8R098R09UT3xJRnxJTkN8SU5DTFVERXxJTkRFWHxJTlBVVHxLVFJJTXxMRU5HVEh8TEVUfExJU1R8TE9DQUx8UFVUfFFLVFJJTXxRU0NBTnxRU1VCU1RSfFFTWVNGVU5DfFFVUENBU0V8UkVUVVJOfFJVTnxTQ0FOfFNVQlNUUnxTVVBFUlF8U1lNREVMfFNZTUVYSVNUfFNZTUdMT0JMfFNZTUxPQ0FMfFNZU0NBTEx8U1lTRVZBTEZ8U1lTRVhFQ3xTWVNGVU5DfFNZU0dFVHxTWVNSUFVUfFRIRU58VE98VFNPfFVOUVVPVEV8VU5USUx8VVBDQVNFfFdISUxFfFdJTkRPVylcXGIvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fTtcblxuXHR2YXIgc3RlcCA9IHtcblx0XHRwYXR0ZXJuOiAvKF58XFxzKSg/OnByb2NcXHMrXFx3K3xkYXRhKD8hPSl8cXVpdHxydW4pXFxiL2ksXG5cdFx0YWxpYXM6ICdrZXl3b3JkJyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH07XG5cblx0dmFyIGNvbW1lbnQgPSBbXG5cdFx0L1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSp8O1xccyopXFwqW147XSo7L20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdO1xuXG5cdHZhciBzdHJpbmcgPSB7XG5cdFx0cGF0dGVybjogUmVnRXhwKHN0cmluZ1BhdHRlcm4pLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9O1xuXG5cdHZhciBwdW5jdHVhdGlvbiA9IC9bJCVALigpe31cXFtcXF07LFxcXFxdLztcblxuXHR2YXIgZnVuYyA9IHtcblx0XHRwYXR0ZXJuOiAvJT9cXGJcXHcrKD89XFwoKS8sXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9O1xuXG5cdHZhciBhcmdzID0ge1xuXHRcdCdmdW5jdGlvbic6IGZ1bmMsXG5cdFx0J2FyZy12YWx1ZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oPVxccyopW0EtWlxcLl0rL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnb3BlcmF0b3InOiAvPS8sXG5cdFx0J21hY3JvLXZhcmlhYmxlJzogbWFjcm9WYXJpYWJsZSxcblx0XHQnYXJnJzoge1xuXHRcdFx0cGF0dGVybjogL1tBLVpdKy9pLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cdFx0J251bWJlcic6IG51bWJlcixcblx0XHQnbnVtZXJpYy1jb25zdGFudCc6IG51bWVyaWNDb25zdGFudCxcblx0XHQncHVuY3R1YXRpb24nOiBwdW5jdHVhdGlvbixcblx0XHQnc3RyaW5nJzogc3RyaW5nXG5cdH07XG5cblx0dmFyIGZvcm1hdCA9IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86Zm9ybWF0fHB1dClcXGI9P1tcXHcnJC5dKy9pLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2tleXdvcmQnOiAvXig/OmZvcm1hdHxwdXQpKD89PSkvaSxcblx0XHRcdCdlcXVhbHMnOiAvPS8sXG5cdFx0XHQnZm9ybWF0Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKD86XFx3fFxcJFxcZCkrXFwuXFxkPy8sXG5cdFx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHR2YXIgYWx0Zm9ybWF0ID0ge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpmb3JtYXR8cHV0KVxccytbXFx3J10rKD86XFxzK1skLlxcd10rKSsoPz07KS9pLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2tleXdvcmQnOiAvXig/OmZvcm1hdHxwdXQpL2ksXG5cdFx0XHQnZm9ybWF0Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvW1xcdyRdK1xcLlxcZD8vLFxuXHRcdFx0XHRhbGlhczogJ251bWJlcidcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0dmFyIGdsb2JhbFN0YXRlbWVudHMgPSB7XG5cdFx0cGF0dGVybjogLygoPzpefFxccyk9PykoPzpjYXRuYW1lfGNoZWNrcG9pbnQgZXhlY3V0ZV9hbHdheXN8ZG18ZW5kc2FzfGZpbGVuYW1lfGZvb3Rub3RlfCVpbmNsdWRlfGxpYm5hbWV8JWxpc3R8bG9ja3xtaXNzaW5nfG9wdGlvbnN8cGFnZXxyZXNldGxpbmV8JXJ1bnxzYXNmaWxlfHNraXB8c3lzZWNob3x0aXRsZVxcZD8pXFxiL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH07XG5cblx0dmFyIHN1Ym1pdFN0YXRlbWVudCA9IHtcblx0XHRwYXR0ZXJuOiAvKF58XFxzKSg/OnN1Ym1pdCg/OlxccysoPzpsb2FkfG5vcnVufHBhcnNlb25seSkpP3xlbmRzdWJtaXQpXFxiL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH07XG5cblx0dmFyIGFjdGlvblNldHMgPSAvYVN0b3JlfGFjY2Vzc0NvbnRyb2x8YWdncmVnYXRpb258YXVkaW98YXV0b3R1bmV8YmF5ZXNpYW5OZXRDbGFzc2lmaWVyfGJpb01lZEltYWdlfGJvb2xSdWxlfGJ1aWx0aW5zfGNhcmRpbmFsaXR5fGNkbXxjbHVzdGVyaW5nfGNvbmRpdGlvbmFsUmFuZG9tRmllbGRzfGNvbmZpZ3VyYXRpb258Y29wdWxhfGNvdW50cmVnfGRhdGFEaXNjb3Zlcnl8ZGF0YVByZXByb2Nlc3N8ZGF0YVNjaWVuY2VQaWxvdHxkYXRhU3RlcHxkZWNpc2lvblRyZWV8ZGVkdXBsaWNhdGlvbnxkZWVwTGVhcm58ZGVlcE5ldXJhbHxkZWVwUm5ufGRzMnxlY218ZW50aXR5UmVzfGVzcENsdXN0ZXJ8ZXhwbGFpbk1vZGVsfGZhY3RtYWN8ZmFzdEtubnxmY21wYWN0fGZlZFNxbHxmcmVxVGFifGdWYXJDbHVzdGVyfGdhbXxnbGVhbXxncmFwaFNlbWlTdXBMZWFybnxoaWRkZW5NYXJrb3ZNb2RlbHxoeXBlckdyb3VwfGljYXxpbWFnZXxpbWx8a2VybmFsUGNhfGxhbmdNb2RlbHxsZGFUb3BpY3xsb2FkU3RyZWFtc3xtYmN8bWl4ZWR8bWxUb29sc3xtb2RlbFB1Ymxpc2hpbmd8bmV0d29ya3xuZXVyYWxOZXR8bm1mfG5vblBhcmFtZXRyaWNCYXllc3xub25saW5lYXJ8b3B0TmV0d29ya3xvcHRpbWl6YXRpb258cGFuZWx8cGNhfHBlcmNlbnRpbGV8cGhyZWd8cGxzfHFrYnxxbGltfHF1YW50cmVnfHJlY29tbWVuZHxyZWdyZXNzaW9ufHJlaW5mb3JjZW1lbnRMZWFybnxyb2J1c3RQY2F8cnVsZU1pbmluZ3xzYW1wbGluZ3xzYW5kd2ljaHxzY2Nhc2x8c2VhcmNoKD86QW5hbHl0aWNzKT98c2VudGltZW50QW5hbHlzaXN8c2VxdWVuY2V8c2Vzc2lvbig/OlByb3ApP3xzZXZlcml0eXxzaW1TeXN0ZW18c2ltcGxlfHNtYXJ0RGF0YXxzcGFya0VtYmVkZGVkUHJvY2Vzc3xzcGFyc2VNTHxzcGF0aWFscmVnfHNwY3xzdGFiaWxpdHlNb25pdG9yaW5nfHN2RGF0YURlc2NyaXB0aW9ufHN2bXx0YWJsZXx0ZXh0KD86RmlsdGVyc3xGcmVxdWVuY3l8TWluaW5nfFBhcnNlfFJ1bGUoPzpEZXZlbG9wfFNjb3JlKXxUb3BpY3xVdGlsKXx0aW1lRGF0YXx0cmFuc3Bvc2V8dHNJbmZvfHRzUmVjb25jaWxlfHVuaVRpbWVTZXJpZXN8dmFyUmVkdWNlLy5zb3VyY2U7XG5cblx0dmFyIGNhc0FjdGlvbnMgPSB7XG5cdFx0cGF0dGVybjogUmVnRXhwKC8oXnxcXHMpKD86YWN0aW9uXFxzKyk/KD86PGFjdD4pXFwuW2Etel0rXFxiW147XSsvLnNvdXJjZS5yZXBsYWNlKC88YWN0Pi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBhY3Rpb25TZXRzOyB9KSwgJ2knKSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2tleXdvcmQnOiBSZWdFeHAoLyg/OjxhY3Q+KVxcLlthLXpdK1xcYi8uc291cmNlLnJlcGxhY2UoLzxhY3Q+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFjdGlvblNldHM7IH0pLCAnaScpLFxuXHRcdFx0J2FjdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogLyg/OmFjdGlvbikvaSxcblx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0fSxcblx0XHRcdCdjb21tZW50JzogY29tbWVudCxcblx0XHRcdCdmdW5jdGlvbic6IGZ1bmMsXG5cdFx0XHQnYXJnLXZhbHVlJzogYXJnc1snYXJnLXZhbHVlJ10sXG5cdFx0XHQnb3BlcmF0b3InOiBhcmdzLm9wZXJhdG9yLFxuXHRcdFx0J2FyZ3VtZW50JzogYXJncy5hcmcsXG5cdFx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdFx0J251bWVyaWMtY29uc3RhbnQnOiBudW1lcmljQ29uc3RhbnQsXG5cdFx0XHQncHVuY3R1YXRpb24nOiBwdW5jdHVhdGlvbixcblx0XHRcdCdzdHJpbmcnOiBzdHJpbmdcblx0XHR9XG5cdH07XG5cblx0dmFyIGtleXdvcmRzID0ge1xuXHRcdHBhdHRlcm46IC8oKD86XnxcXHMpPT8pKD86YWZ0ZXJ8YW5hbHlzaXN8YW5kfGFycmF5fGJhcmNoYXJ0fGJhcndpZHRofGJlZ2luZ3JhcGh8Ynl8Y2FsbHxjYXN8Y2JhcmxpbmV8Y2ZpbGx8Y2xhc3MoPzpsZXYpP3xjbG9zZXxjb2x1bW58Y29tcHV0ZWQ/fGNvbnRhaW5zfGNvbnRpbnVlfGRhdGEoPz09KXxkZWZpbmV8ZGVsZXRlfGRlc2NyaWJlfGRvY3VtZW50fGRvXFxzK292ZXJ8ZG98ZG9sfGRyb3B8ZHVsfGVsc2V8ZW5kKD86Y29tcHxzb3VyY2UpP3xlbnRyeVRpdGxlfGV2YWwoPzp1YXRlKT98ZXhlYyg/OnV0ZSk/fGV4aXR8ZmlsZSg/Om5hbWUpP3xmaWxsKD86YXR0cnMpP3xmbGlzdHxmbmN8ZnVuY3Rpb24oPzpsaXN0KT98Z2xvYmFsfGdvdG98Z3JvdXAoPzpieSk/fGhlYWRsaW5lfGhlYWRza2lwfGhpc3RvZ3JhbXxpZnxpbmZpbGV8a2VlcHxrZXlsYWJlbHxrZXl3b3JkfGxhYmVsfGxheW91dHxsZWF2ZXxsZWdlbmRsYWJlbHxsZW5ndGh8bGlibmFtZXxsb2FkYWN0aW9uc2V0fG1lcmdlfG1pZHBvaW50c3xfP251bGxffG5hbWV8bm9vYnN8bm93ZHxvZHN8b3B0aW9uc3xvcnxvdGhlcndpc2V8b3V0KD86cHV0KT98b3Zlcig/OmxheSk/fHBsb3R8cHJpbnR8cHV0fHJhaXNlfHJhbmV4cHxyYW5ub3J8cmJyZWFrfHJldGFpbnxyZXR1cm58c2VsZWN0fHNlc3Npb258c2Vzc3JlZnxzZXR8c291cmNlfHN0YXRncmFwaHxzdW18c3VtbWFyaXplfHRhYmxlfHRlbXB8dGVybWluYXRlfHRoZW5cXHMrZG98dGhlbnx0aXRsZVxcZD98dG98dmFyfHdoZW58d2hlcmV8eGF4aXNvcHRzfHkyYXhpc29wdHN8eWF4aXNvcHRzKVxcYi9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnNhcyA9IHtcblx0XHQnZGF0YWxpbmVzJzoge1xuXHRcdFx0cGF0dGVybjogL14oWyBcXHRdKikoPzpjYXJkc3woPzpkYXRhKT9saW5lcyk7W1xcc1xcU10rP15bIFxcdF0qOy9pbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oPzpjYXJkc3woPzpkYXRhKT9saW5lcykvaVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvOy9cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J3Byb2Mtc3FsJzoge1xuXHRcdFx0cGF0dGVybjogLyhecHJvY1xccysoPzpmZWQpP3NxbCg/OlxccytbXFx3fD1dKyk/OylbXFxzXFxTXSs/KD89Xig/OnByb2NcXHMrXFx3K3xkYXRhfHF1aXR8cnVuKTt8KD8hW1xcc1xcU10pKS9pbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3NxbCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoL15bIFxcdF0qKD86c2VsZWN0fGFsdGVyXFxzK3RhYmxlfCg/OmNyZWF0ZXxkZXNjcmliZXxkcm9wKVxccysoPzppbmRleHx0YWJsZSg/Olxccytjb25zdHJhaW50cyk/fHZpZXcpfGNyZWF0ZVxccyt1bmlxdWVcXHMraW5kZXh8aW5zZXJ0XFxzK2ludG98dXBkYXRlKSg/OjxzdHI+fFteO1wiJ10pKzsvLnNvdXJjZS5yZXBsYWNlKC88c3RyPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBzdHJpbmdQYXR0ZXJuOyB9KSwgJ2ltJyksXG5cdFx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1zcWwnLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnNxbFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnZ2xvYmFsLXN0YXRlbWVudHMnOiBnbG9iYWxTdGF0ZW1lbnRzLFxuXHRcdFx0XHQnc3FsLXN0YXRlbWVudHMnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhefFxccykoPzpkaXNjb25uZWN0XFxzK2Zyb218YmVnaW58Y29tbWl0fGV4ZWMoPzp1dGUpP3xyZXNldHxyb2xsYmFja3x2YWxpZGF0ZSlcXGIvaSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdFx0fSxcblx0XHRcdFx0J251bWJlcic6IG51bWJlcixcblx0XHRcdFx0J251bWVyaWMtY29uc3RhbnQnOiBudW1lcmljQ29uc3RhbnQsXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IHB1bmN0dWF0aW9uLFxuXHRcdFx0XHQnc3RyaW5nJzogc3RyaW5nXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdwcm9jLWdyb292eSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnByb2NcXHMrZ3Jvb3Z5KD86XFxzK1tcXHd8PV0rKT87KVtcXHNcXFNdKz8oPz1eKD86cHJvY1xccytcXHcrfGRhdGF8cXVpdHxydW4pO3woPyFbXFxzXFxTXSkpL2ltLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY29tbWVudCc6IGNvbW1lbnQsXG5cdFx0XHRcdCdncm9vdnknOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXlsgXFx0XSpzdWJtaXQoPzpcXHMrKD86bG9hZHxub3J1bnxwYXJzZW9ubHkpKT8pKD86PHN0cj58W15cIiddKSs/KD89ZW5kc3VibWl0OykvLnNvdXJjZS5yZXBsYWNlKC88c3RyPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBzdHJpbmdQYXR0ZXJuOyB9KSwgJ2ltJyksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLWdyb292eScsXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuZ3Jvb3Z5XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0XHRcdCdzdWJtaXQtc3RhdGVtZW50Jzogc3VibWl0U3RhdGVtZW50LFxuXHRcdFx0XHQnZ2xvYmFsLXN0YXRlbWVudHMnOiBnbG9iYWxTdGF0ZW1lbnRzLFxuXHRcdFx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdFx0XHQnbnVtZXJpYy1jb25zdGFudCc6IG51bWVyaWNDb25zdGFudCxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogcHVuY3R1YXRpb24sXG5cdFx0XHRcdCdzdHJpbmcnOiBzdHJpbmdcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J3Byb2MtbHVhJzoge1xuXHRcdFx0cGF0dGVybjogLyhecHJvY1xccytsdWEoPzpcXHMrW1xcd3w9XSspPzspW1xcc1xcU10rPyg/PV4oPzpwcm9jXFxzK1xcdyt8ZGF0YXxxdWl0fHJ1bik7fCg/IVtcXHNcXFNdKSkvaW0sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjb21tZW50JzogY29tbWVudCxcblx0XHRcdFx0J2x1YSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyheWyBcXHRdKnN1Ym1pdCg/OlxccysoPzpsb2FkfG5vcnVufHBhcnNlb25seSkpPykoPzo8c3RyPnxbXlwiJ10pKz8oPz1lbmRzdWJtaXQ7KS8uc291cmNlLnJlcGxhY2UoLzxzdHI+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0cmluZ1BhdHRlcm47IH0pLCAnaW0nKSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtbHVhJyxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5sdWFcblx0XHRcdFx0fSxcblx0XHRcdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHRcdFx0J3N1Ym1pdC1zdGF0ZW1lbnQnOiBzdWJtaXRTdGF0ZW1lbnQsXG5cdFx0XHRcdCdnbG9iYWwtc3RhdGVtZW50cyc6IGdsb2JhbFN0YXRlbWVudHMsXG5cdFx0XHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0XHRcdCdudW1lcmljLWNvbnN0YW50JzogbnVtZXJpY0NvbnN0YW50LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiBwdW5jdHVhdGlvbixcblx0XHRcdFx0J3N0cmluZyc6IHN0cmluZ1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQncHJvYy1jYXMnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5wcm9jXFxzK2Nhcyg/OlxccytbXFx3fD1dKyk/OylbXFxzXFxTXSs/KD89Xig/OnByb2NcXHMrXFx3K3xxdWl0fGRhdGEpO3woPyFbXFxzXFxTXSkpL2ltLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY29tbWVudCc6IGNvbW1lbnQsXG5cdFx0XHRcdCdzdGF0ZW1lbnQtdmFyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oKD86XnxcXHMpPT8pc2F2ZXJlc3VsdFxcc1teO10rL2ltLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cblx0XHRcdFx0XHRcdCdzdGF0ZW1lbnQnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9ec2F2ZXJlc3VsdFxccytcXFMrL2ksXG5cdFx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHRcdGtleXdvcmQ6IC9eKD86c2F2ZXJlc3VsdCkvaVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0cmVzdDogYXJnc1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J2Nhcy1hY3Rpb25zJzogY2FzQWN0aW9ucyxcblx0XHRcdFx0J3N0YXRlbWVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxzKT0/KSg/OmRlZmF1bHR8KD86dW4pP3NldHxvbnxvdXRwdXR8dXBsb2FkKVteO10rL2ltLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiBhcmdzXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdzdGVwJzogc3RlcCxcblx0XHRcdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHRcdFx0J2Z1bmN0aW9uJzogZnVuYyxcblx0XHRcdFx0J2Zvcm1hdCc6IGZvcm1hdCxcblx0XHRcdFx0J2FsdGZvcm1hdCc6IGFsdGZvcm1hdCxcblx0XHRcdFx0J2dsb2JhbC1zdGF0ZW1lbnRzJzogZ2xvYmFsU3RhdGVtZW50cyxcblx0XHRcdFx0J251bWJlcic6IG51bWJlcixcblx0XHRcdFx0J251bWVyaWMtY29uc3RhbnQnOiBudW1lcmljQ29uc3RhbnQsXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IHB1bmN0dWF0aW9uLFxuXHRcdFx0XHQnc3RyaW5nJzogc3RyaW5nXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdwcm9jLWFyZ3MnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhecHJvY1xccytcXHcrXFxzKykoPyFcXHMpKD86W147XCInXXw8c3RyPikrOy8uc291cmNlLnJlcGxhY2UoLzxzdHI+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0cmluZ1BhdHRlcm47IH0pLCAnaW0nKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IGFyZ3Ncblx0XHR9LFxuXHRcdC8qU3BlY2lhbCBrZXl3b3JkcyB3aXRoaW4gbWFjcm9zKi9cblx0XHQnbWFjcm8ta2V5d29yZCc6IG1hY3JvS2V5d29yZCxcblx0XHQnbWFjcm8tdmFyaWFibGUnOiBtYWNyb1ZhcmlhYmxlLFxuXHRcdCdtYWNyby1zdHJpbmctZnVuY3Rpb25zJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFxcc3w9KSklKD86QlFVT1RFfE5SQlFVT1RFfE5SUVVPVEV8TlJTVFJ8UVVPVEV8U1RSKVxcKC4qPyg/OlteJV1cXCkpL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvJSg/OkJRVU9URXxOUkJRVU9URXxOUlFVT1RFfE5SU1RSfFFVT1RFfFNUUikvaSxcblx0XHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdtYWNyby1rZXl3b3JkJzogbWFjcm9LZXl3b3JkLFxuXHRcdFx0XHQnbWFjcm8tdmFyaWFibGUnOiBtYWNyb1ZhcmlhYmxlLFxuXHRcdFx0XHQnZXNjYXBlZC1jaGFyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8lWydcIigpPD49XHUwMEFDXn47LCNdLyxcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogcHVuY3R1YXRpb25cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdtYWNyby1kZWNsYXJhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC9eJW1hY3JvW147XSsoPz07KS9pbSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQna2V5d29yZCc6IC8lbWFjcm8vaSxcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdtYWNyby1lbmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXiVtZW5kW147XSsoPz07KS9pbSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQna2V5d29yZCc6IC8lbWVuZC9pLFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0LyolX3pzY29yZShoZWFkY2lyLCBfbGhjLCBfbWhjLCBfc2hjLCBoZWFkY3osIGhlYWRjcGN0LCBfRmhlYWRjeik7ICovXG5cdFx0J21hY3JvJzoge1xuXHRcdFx0cGF0dGVybjogLyVfXFx3Kyg/PVxcKCkvLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cdFx0J2lucHV0Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcYmlucHV0XFxzWy1cXHdcXHMvKi4kJl0rOy9pLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdpbnB1dCc6IHtcblx0XHRcdFx0XHRhbGlhczogJ2tleXdvcmQnLFxuXHRcdFx0XHRcdHBhdHRlcm46IC9eaW5wdXQvaSxcblx0XHRcdFx0fSxcblx0XHRcdFx0J2NvbW1lbnQnOiBjb21tZW50LFxuXHRcdFx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdFx0XHQnbnVtZXJpYy1jb25zdGFudCc6IG51bWVyaWNDb25zdGFudFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J29wdGlvbnMtYXJncyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXm9wdGlvbnMpWy0nXCJ8L1xcXFw8PiorPTooKVxcd1xcc10qKD89OykvaW0sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBhcmdzXG5cdFx0fSxcblx0XHQnY2FzLWFjdGlvbnMnOiBjYXNBY3Rpb25zLFxuXHRcdCdjb21tZW50JzogY29tbWVudCxcblx0XHQnZnVuY3Rpb24nOiBmdW5jLFxuXHRcdCdmb3JtYXQnOiBmb3JtYXQsXG5cdFx0J2FsdGZvcm1hdCc6IGFsdGZvcm1hdCxcblx0XHQnbnVtZXJpYy1jb25zdGFudCc6IG51bWVyaWNDb25zdGFudCxcblx0XHQnZGF0ZXRpbWUnOiB7XG5cdFx0XHQvLyAnMWphbjIwMTMnZCwgJzk6MjU6MTlwbSd0LCAnMThqYW4yMDAzOjk6Mjc6MDVhbSdkdFxuXHRcdFx0cGF0dGVybjogUmVnRXhwKHN0cmluZ1BhdHRlcm4gKyAnKD86ZHQ/fHQpJyksXG5cdFx0XHRhbGlhczogJ251bWJlcidcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiBzdHJpbmcsXG5cdFx0J3N0ZXAnOiBzdGVwLFxuXHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0Ly8gSW4gU0FTIFN0dWRpbyBzeW50YXggaGlnaGxpZ2h0aW5nLCB0aGVzZSBvcGVyYXRvcnMgYXJlIHN0eWxlZCBsaWtlIGtleXdvcmRzXG5cdFx0J29wZXJhdG9yLWtleXdvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86ZXF8Z2V8Z3R8aW58bGV8bHR8bmV8bm90KVxcYi9pLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9LFxuXHRcdC8vIERlY2ltYWwgKDEuMmUyMyksIGhleGFkZWNpbWFsICgwYzF4KVxuXHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0J29wZXJhdG9yJzogL1xcKlxcKj98XFx8XFx8P3whIT98XHUwMEE2XHUwMEE2P3w8Wz49XT98Pls8PV0/fFstK1xcLz0mXXxbflx1MDBBQ15dPT8vLFxuXHRcdCdwdW5jdHVhdGlvbic6IHB1bmN0dWF0aW9uXG5cdH07XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHRQcmlzbS5sYW5ndWFnZXMuc2FzcyA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NzcycsIHtcblx0XHQvLyBTYXNzIGNvbW1lbnRzIGRvbid0IG5lZWQgdG8gYmUgY2xvc2VkLCBvbmx5IGluZGVudGVkXG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXihbIFxcdF0qKVxcL1tcXC8qXS4qKD86KD86XFxyP1xcbnxcXHIpXFwxWyBcXHRdLispKi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnc2FzcycsICdhdHJ1bGUnLCB7XG5cdFx0Ly8gV2Ugd2FudCB0byBjb25zdW1lIHRoZSB3aG9sZSBsaW5lXG5cdFx0J2F0cnVsZS1saW5lJzoge1xuXHRcdFx0Ly8gSW5jbHVkZXMgc3VwcG9ydCBmb3IgPSBhbmQgKyBzaG9ydGN1dHNcblx0XHRcdHBhdHRlcm46IC9eKD86WyBcXHRdKilbQCs9XS4rL20sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2F0cnVsZSc6IC8oPzpAW1xcdy1dK3xbKz1dKS9cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRkZWxldGUgUHJpc20ubGFuZ3VhZ2VzLnNhc3MuYXRydWxlO1xuXG5cblx0dmFyIHZhcmlhYmxlID0gL1xcJFstXFx3XSt8I1xce1xcJFstXFx3XStcXH0vO1xuXHR2YXIgb3BlcmF0b3IgPSBbXG5cdFx0L1srKlxcLyVdfFs9IV09fDw9P3w+PT98XFxiKD86YW5kfG5vdHxvcilcXGIvLFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXFxzKS0oPz1cXHMpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnc2FzcycsICdwcm9wZXJ0eScsIHtcblx0XHQvLyBXZSB3YW50IHRvIGNvbnN1bWUgdGhlIHdob2xlIGxpbmVcblx0XHQndmFyaWFibGUtbGluZSc6IHtcblx0XHRcdHBhdHRlcm46IC9eWyBcXHRdKlxcJC4rL20sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzovLFxuXHRcdFx0XHQndmFyaWFibGUnOiB2YXJpYWJsZSxcblx0XHRcdFx0J29wZXJhdG9yJzogb3BlcmF0b3Jcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8vIFdlIHdhbnQgdG8gY29uc3VtZSB0aGUgd2hvbGUgbGluZVxuXHRcdCdwcm9wZXJ0eS1saW5lJzoge1xuXHRcdFx0cGF0dGVybjogL15bIFxcdF0qKD86W146XFxzXSsgKjouKnw6W146XFxzXS4qKS9tLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwcm9wZXJ0eSc6IFtcblx0XHRcdFx0XHQvW146XFxzXSsoPz1cXHMqOikvLFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8oOilbXjpcXHNdKy8sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRdLFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvOi8sXG5cdFx0XHRcdCd2YXJpYWJsZSc6IHZhcmlhYmxlLFxuXHRcdFx0XHQnb3BlcmF0b3InOiBvcGVyYXRvcixcblx0XHRcdFx0J2ltcG9ydGFudCc6IFByaXNtLmxhbmd1YWdlcy5zYXNzLmltcG9ydGFudFxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdGRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMuc2Fzcy5wcm9wZXJ0eTtcblx0ZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5zYXNzLmltcG9ydGFudDtcblxuXHQvLyBOb3cgdGhhdCB3aG9sZSBsaW5lcyBmb3Igb3RoZXIgcGF0dGVybnMgYXJlIGNvbnN1bWVkLFxuXHQvLyB3aGF0J3MgbGVmdCBzaG91bGQgYmUgc2VsZWN0b3JzXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3Nhc3MnLCAncHVuY3R1YXRpb24nLCB7XG5cdFx0J3NlbGVjdG9yJzoge1xuXHRcdFx0cGF0dGVybjogL14oWyBcXHRdKilcXFMoPzosW14sXFxyXFxuXSt8W14sXFxyXFxuXSopKD86LFteLFxcclxcbl0rKSooPzosKD86XFxyP1xcbnxcXHIpXFwxWyBcXHRdK1xcUyg/OixbXixcXHJcXG5dK3xbXixcXHJcXG5dKikoPzosW14sXFxyXFxuXSspKikqL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHR9KTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuc2NzcyA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NzcycsIHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pKD86XFwvXFwqW1xcc1xcU10qP1xcKlxcL3xcXC9cXC8uKikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2F0cnVsZSc6IHtcblx0XHRwYXR0ZXJuOiAvQFtcXHctXSg/OlxcKFteKCldK1xcKXxbXigpXFxzXXxcXHMrKD8hXFxzKSkqPyg/PVxccytbeztdKS8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncnVsZSc6IC9AW1xcdy1dKy9cblx0XHRcdC8vIFNlZSByZXN0IGJlbG93XG5cdFx0fVxuXHR9LFxuXHQvLyB1cmwsIGNvbXBhc3NpZmllZFxuXHQndXJsJzogLyg/OlstYS16XSstKT91cmwoPz1cXCgpL2ksXG5cdC8vIENTUyBzZWxlY3RvciByZWdleCBpcyBub3QgYXBwcm9wcmlhdGUgZm9yIFNhc3Ncblx0Ly8gc2luY2UgdGhlcmUgY2FuIGJlIGxvdCBtb3JlIHRoaW5ncyAodmFyLCBAIGRpcmVjdGl2ZSwgbmVzdGluZy4uKVxuXHQvLyBhIHNlbGVjdG9yIG11c3Qgc3RhcnQgYXQgdGhlIGVuZCBvZiBhIHByb3BlcnR5IG9yIGFmdGVyIGEgYnJhY2UgKGVuZCBvZiBvdGhlciBydWxlcyBvciBuZXN0aW5nKVxuXHQvLyBpdCBjYW4gY29udGFpbiBzb21lIGNoYXJhY3RlcnMgdGhhdCBhcmVuJ3QgdXNlZCBmb3IgZGVmaW5pbmcgcnVsZXMgb3IgZW5kIG9mIHNlbGVjdG9yLCAmIChwYXJlbnQgc2VsZWN0b3IpLCBvciBpbnRlcnBvbGF0ZWQgdmFyaWFibGVcblx0Ly8gdGhlIGVuZCBvZiBhIHNlbGVjdG9yIGlzIGZvdW5kIHdoZW4gdGhlcmUgaXMgbm8gcnVsZXMgaW4gaXQgKCB7fSBvciB7XFxzfSkgb3IgaWYgdGhlcmUgaXMgYSBwcm9wZXJ0eSAoYmVjYXVzZSBhbiBpbnRlcnBvbGF0ZWQgdmFyXG5cdC8vIGNhbiBcInBhc3NcIiBhcyBhIHNlbGVjdG9yLSBlLmc6IHByb3BlciN7JGVydHl9KVxuXHQvLyB0aGlzIG9uZSB3YXMgaGFyZCB0byBkbywgc28gcGxlYXNlIGJlIGNhcmVmdWwgaWYgeW91IGVkaXQgdGhpcyBvbmUgOilcblx0J3NlbGVjdG9yJzoge1xuXHRcdC8vIEluaXRpYWwgbG9vay1haGVhZCBpcyB1c2VkIHRvIHByZXZlbnQgbWF0Y2hpbmcgb2YgYmxhbmsgc2VsZWN0b3JzXG5cdFx0cGF0dGVybjogLyg/PVxcUylbXkA7e30oKV0/KD86W15AO3t9KClcXHNdfFxccysoPyFcXHMpfCNcXHtcXCRbLVxcd10rXFx9KSsoPz1cXHMqXFx7KD86XFx9fFxcc3xbXn1dW146e31dKls6e11bXn1dKSkvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3BhcmVudCc6IHtcblx0XHRcdFx0cGF0dGVybjogLyYvLFxuXHRcdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHRcdH0sXG5cdFx0XHQncGxhY2Vob2xkZXInOiAvJVstXFx3XSsvLFxuXHRcdFx0J3ZhcmlhYmxlJzogL1xcJFstXFx3XSt8I1xce1xcJFstXFx3XStcXH0vXG5cdFx0fVxuXHR9LFxuXHQncHJvcGVydHknOiB7XG5cdFx0cGF0dGVybjogLyg/OlstXFx3XXxcXCRbLVxcd118I1xce1xcJFstXFx3XStcXH0pKyg/PVxccyo6KS8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndmFyaWFibGUnOiAvXFwkWy1cXHddK3wjXFx7XFwkWy1cXHddK1xcfS9cblx0XHR9XG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdzY3NzJywgJ2F0cnVsZScsIHtcblx0J2tleXdvcmQnOiBbXG5cdFx0L0AoPzpjb250ZW50fGRlYnVnfGVhY2h8ZWxzZSg/OiBpZik/fGV4dGVuZHxmb3J8Zm9yd2FyZHxmdW5jdGlvbnxpZnxpbXBvcnR8aW5jbHVkZXxtaXhpbnxyZXR1cm58dXNlfHdhcm58d2hpbGUpXFxiL2ksXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyggKSg/OmZyb218dGhyb3VnaCkoPz0gKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnc2NzcycsICdpbXBvcnRhbnQnLCB7XG5cdC8vIHZhciBhbmQgaW50ZXJwb2xhdGVkIHZhcnNcblx0J3ZhcmlhYmxlJzogL1xcJFstXFx3XSt8I1xce1xcJFstXFx3XStcXH0vXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnc2NzcycsICdmdW5jdGlvbicsIHtcblx0J21vZHVsZS1tb2RpZmllcic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86YXN8aGlkZXxzaG93fHdpdGgpXFxiL2ksXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQncGxhY2Vob2xkZXInOiB7XG5cdFx0cGF0dGVybjogLyVbLVxcd10rLyxcblx0XHRhbGlhczogJ3NlbGVjdG9yJ1xuXHR9LFxuXHQnc3RhdGVtZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXEIhKD86ZGVmYXVsdHxvcHRpb25hbClcXGIvaSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J251bGwnOiB7XG5cdFx0cGF0dGVybjogL1xcYm51bGxcXGIvLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J29wZXJhdG9yJzoge1xuXHRcdHBhdHRlcm46IC8oXFxzKSg/OlstKypcXC8lXXxbPSFdPXw8PT98Pj0/fGFuZHxub3R8b3IpKD89XFxzKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLnNjc3NbJ2F0cnVsZSddLmluc2lkZS5yZXN0ID0gUHJpc20ubGFuZ3VhZ2VzLnNjc3M7XG5cblByaXNtLmxhbmd1YWdlcy5zY2FsYSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2phdmEnLCB7XG5cdCd0cmlwbGUtcXVvdGVkLXN0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCJcIlwiW1xcc1xcU10qP1wiXCJcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXCJ8JykoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvPC18PT58XFxiKD86YWJzdHJhY3R8Y2FzZXxjYXRjaHxjbGFzc3xkZWZ8ZG98ZWxzZXxleHRlbmRzfGZpbmFsfGZpbmFsbHl8Zm9yfGZvclNvbWV8aWZ8aW1wbGljaXR8aW1wb3J0fGxhenl8bWF0Y2h8bmV3fG51bGx8b2JqZWN0fG92ZXJyaWRlfHBhY2thZ2V8cHJpdmF0ZXxwcm90ZWN0ZWR8cmV0dXJufHNlYWxlZHxzZWxmfHN1cGVyfHRoaXN8dGhyb3d8dHJhaXR8dHJ5fHR5cGV8dmFsfHZhcnx3aGlsZXx3aXRofHlpZWxkKVxcYi8sXG5cdCdudW1iZXInOiAvXFxiMHgoPzpbXFxkYS1mXSpcXC4pP1tcXGRhLWZdK3woPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86ZVxcZCspP1tkZmxdPy9pLFxuXHQnYnVpbHRpbic6IC9cXGIoPzpBbnl8QW55UmVmfEFueVZhbHxCb29sZWFufEJ5dGV8Q2hhcnxEb3VibGV8RmxvYXR8SW50fExvbmd8Tm90aGluZ3xTaG9ydHxTdHJpbmd8VW5pdClcXGIvLFxuXHQnc3ltYm9sJzogLydbXlxcZFxcc1xcXFxdXFx3Ki9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdzY2FsYScsICd0cmlwbGUtcXVvdGVkLXN0cmluZycsIHtcblx0J3N0cmluZy1pbnRlcnBvbGF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbYS16XVxcdyooPzpcIlwiXCIoPzpbXiRdfFxcJCg/Oltee118XFx7KD86W157fV18XFx7W157fV0qXFx9KSpcXH0pKSo/XCJcIlwifFwiKD86W14kXCJcXHJcXG5dfFxcJCg/Oltee118XFx7KD86W157fV18XFx7W157fV0qXFx9KSpcXH0pKSpcIikvaSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaWQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eXFx3Ky8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHRcdH0sXG5cdFx0XHQnZXNjYXBlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxcXFxcJFwifFxcJFskXCJdLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3N5bWJvbCdcblx0XHRcdH0sXG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcJCg/Olxcdyt8XFx7KD86W157fV18XFx7W157fV0qXFx9KSpcXH0pLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcJFxcez98XFx9JC8sXG5cdFx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnNjYWxhXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0fVxuXHR9XG59KTtcblxuZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5zY2FsYVsnY2xhc3MtbmFtZSddO1xuZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5zY2FsYVsnZnVuY3Rpb24nXTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8vIENBUkVGVUwhXG5cdC8vIFRoZSBmb2xsb3dpbmcgcGF0dGVybnMgYXJlIGNvbmNhdGVuYXRlZCwgc28gdGhlIGdyb3VwIHJlZmVyZW5jZWQgYnkgYSBiYWNrIHJlZmVyZW5jZSBpcyBub24tb2J2aW91cyFcblxuXHR2YXIgc3RyaW5ncyA9IFtcblx0XHQvLyBub3JtYWwgc3RyaW5nXG5cdFx0L1wiKD86XFxcXFtcXHNcXFNdfFxcJFxcKFteKV0rXFwpfFxcJCg/IVxcKCl8YFteYF0rYHxbXlwiXFxcXGAkXSkqXCIvLnNvdXJjZSxcblx0XHQvJ1teJ10qJy8uc291cmNlLFxuXHRcdC9cXCQnKD86W14nXFxcXF18XFxcXFtcXHNcXFNdKSonLy5zb3VyY2UsXG5cblx0XHQvLyBoZXJlIGRvY1xuXHRcdC8vIDIgY2FwdHVyaW5nIGdyb3Vwc1xuXHRcdC88PC0/XFxzKihbXCInXT8pKFxcdyspXFwxXFxzW1xcc1xcU10qP1tcXHJcXG5dXFwyLy5zb3VyY2Vcblx0XS5qb2luKCd8Jyk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzWydzaGVsbC1zZXNzaW9uJ10gPSB7XG5cdFx0J2NvbW1hbmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdC8vIHVzZXIgaW5mb1xuXHRcdFx0XHQvXi8uc291cmNlICtcblx0XHRcdFx0Jyg/OicgK1xuXHRcdFx0XHQoXG5cdFx0XHRcdFx0Ly8gPHVzZXI+IFwiOlwiICggPHBhdGg+ICk/XG5cdFx0XHRcdFx0L1teXFxzQDokIyUqIS9cXFxcXStAW15cXHJcXG5AOiQjJSohL1xcXFxdKyg/OjpbXlxcMC1cXHgxRiQjJSo/XCI8Pjo7fF0rKT8vLnNvdXJjZSArXG5cdFx0XHRcdFx0J3wnICtcblx0XHRcdFx0XHQvLyA8cGF0aD5cblx0XHRcdFx0XHQvLyBTaW5jZSB0aGUgcGF0aCBwYXR0ZXJuIGlzIHF1aXRlIGdlbmVyYWwsIHdlIHdpbGwgcmVxdWlyZSBpdCB0byBzdGFydCB3aXRoIGEgc3BlY2lhbCBjaGFyYWN0ZXIgdG9cblx0XHRcdFx0XHQvLyBwcmV2ZW50IGZhbHNlIHBvc2l0aXZlcy5cblx0XHRcdFx0XHQvWy9+Ll1bXlxcMC1cXHgxRiQjJSo/XCI8PkA6O3xdKi8uc291cmNlXG5cdFx0XHRcdCkgK1xuXHRcdFx0XHQnKT8nICtcblx0XHRcdFx0Ly8gc2hlbGwgc3ltYm9sXG5cdFx0XHRcdC9bJCMlXSg/PVxccykvLnNvdXJjZSArXG5cdFx0XHRcdC8vIGJhc2ggY29tbWFuZFxuXHRcdFx0XHQvKD86W15cXFxcXFxyXFxuIFxcdCdcIjwkXXxbIFxcdF0oPzooPyEjKXwjLiokKXxcXFxcKD86W15cXHJdfFxcclxcbj8pfFxcJCg/IScpfDwoPyE8KXw8PHN0cj4+KSsvLnNvdXJjZS5yZXBsYWNlKC88PHN0cj4+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0cmluZ3M7IH0pLFxuXHRcdFx0XHQnbSdcblx0XHRcdCksXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2luZm8nOiB7XG5cdFx0XHRcdFx0Ly8gZm9vQGJhcjp+L2ZpbGVzJCBleGl0XG5cdFx0XHRcdFx0Ly8gZm9vQGJhciQgZXhpdFxuXHRcdFx0XHRcdC8vIH4vZmlsZXMkIGV4aXRcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlteIyQlXSsvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3VzZXInOiAvXlteXFxzQDokIyUqIS9cXFxcXStAW15cXHJcXG5AOiQjJSohL1xcXFxdKy8sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvOi8sXG5cdFx0XHRcdFx0XHQncGF0aCc6IC9bXFxzXFxTXSsvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnYmFzaCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5bJCMlXVxccyopXFxTW1xcc1xcU10qLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtYmFzaCcsXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuYmFzaFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnc2hlbGwtc3ltYm9sJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eWyQjJV0vLFxuXHRcdFx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnb3V0cHV0JzogLy4oPzouKig/OltcXHJcXG5dfC4kKSkqL1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlc1snc2gtc2Vzc2lvbiddID0gUHJpc20ubGFuZ3VhZ2VzWydzaGVsbHNlc3Npb24nXSA9IFByaXNtLmxhbmd1YWdlc1snc2hlbGwtc2Vzc2lvbiddO1xuXG59KFByaXNtKSk7XG5cbi8vIFRlc3QgZmlsZXMgZm9yIHRoZSBwYXJzZXIgaXRzZWxmOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0plc3VzRnJla2Uvc21hbGkvdHJlZS9tYXN0ZXIvc21hbGkvc3JjL3Rlc3QvcmVzb3VyY2VzL0xleGVyVGVzdFxuXG5QcmlzbS5sYW5ndWFnZXMuc21hbGkgPSB7XG5cdCdjb21tZW50JzogLyMuKi8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cXHJcXG5cXFxcXCJdfFxcXFwuKSpcInwnKD86W15cXHJcXG5cXFxcJ118XFxcXCg/Oi58dVtcXGRhLWZBLUZdezR9KSknLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15MXSlMKD86KD86XFx3K3xgW15gXFxyXFxuXSpgKVxcLykqKD86W1xcdyRdK3xgW15gXFxyXFxuXSpgKSg/PVxccyo7KS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdjbGFzcy1uYW1lJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF5MfFxcLykoPzpbXFx3JF0rfGBbXmBcXHJcXG5dKmApJC8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQnbmFtZXNwYWNlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXihMKSg/Oig/Olxcdyt8YFteYFxcclxcbl0qYClcXC8pKy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC8vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnYnVpbHRpbic6IC9eTC9cblx0XHR9XG5cdH0sXG5cdCdidWlsdGluJzogW1xuXHRcdHtcblx0XHRcdC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9naXRodWIuY29tL0plc3VzRnJla2Uvc21hbGkvd2lraS9UeXBlc01ldGhvZHNBbmRGaWVsZHMjdHlwZXNcblx0XHRcdHBhdHRlcm46IC8oWygpO1xcW10pW0JDREZJSlNWWl0rLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIGUuZy4gLmZpZWxkIG1XaWZpT25VaWQ6SVxuXHRcdFx0cGF0dGVybjogLyhbXFx3JD5dOilbQkNERklKU1ZaXS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQna2V5d29yZCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcLmVuZFxccyspW1xcdy1dKy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHcuLV0pXFwuKD8hXFxkKVtcXHctXSsvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3Li1dKSg/OmFic3RyYWN0fGFubm90YXRpb258YnJpZGdlfGNvbnN0cnVjdG9yfGVudW18ZmluYWx8aW50ZXJmYWNlfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xydW50aW1lfHN0YXRpY3xzeW50aGV0aWN8c3lzdGVtfHRyYW5zaWVudCkoPyFbXFx3Li1dKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFx3Li1dKSg/Olxcdyt8PFtcXHckLV0rPikoPz1cXCgpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cblx0J2ZpZWxkJzoge1xuXHRcdHBhdHRlcm46IC9bXFx3JF0rKD89OikvLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH0sXG5cdCdyZWdpc3Rlcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXHcuLV0pW3ZwXVxcZCg/IVtcXHcuLV0pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH0sXG5cblx0J2Jvb2xlYW4nOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFx3Li1dKSg/OmZhbHNlfHRydWUpKD8hW1xcdy4tXSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J251bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W14vXFx3Li1dKS0/KD86TkFOfElORklOSVRZfDB4KD86W1xcZEEtRl0rKD86XFwuW1xcZEEtRl0qKT98XFwuW1xcZEEtRl0rKSg/OnBbKy1dP1tcXGRBLUZdKyk/fCg/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzplWystXT9cXGQrKT8pW2RmbHN0XT8oPyFbXFx3Li1dKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblxuXHQnbGFiZWwnOiB7XG5cdFx0cGF0dGVybjogLyg6KVxcdysvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblxuXHQnb3BlcmF0b3InOiAvLT58XFwuXFwufFtcXFs9XS8sXG5cdCdwdW5jdHVhdGlvbic6IC9be30oKSw7Ol0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuc21hbGx0YWxrID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpcIlwifFteXCJdKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjaGFyJzoge1xuXHRcdHBhdHRlcm46IC9cXCQuLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OicnfFteJ10pKicvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3ltYm9sJzogLyNbXFxkYS16XSt8Iyg/Oi18KFsrXFwvXFxcXCp+PD49QCV8Jj8hXSlcXDE/KXwjKD89XFwoKS9pLFxuXHQnYmxvY2stYXJndW1lbnRzJzoge1xuXHRcdHBhdHRlcm46IC8oXFxbXFxzKik6W15cXFt8XSpcXHwvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndmFyaWFibGUnOiAvOltcXGRhLXpdKy9pLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcfC9cblx0XHR9XG5cdH0sXG5cdCd0ZW1wb3JhcnktdmFyaWFibGVzJzoge1xuXHRcdHBhdHRlcm46IC9cXHxbXnxdK1xcfC8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndmFyaWFibGUnOiAvW1xcZGEtel0rL2ksXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFx8L1xuXHRcdH1cblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86bmV3fG5pbHxzZWxmfHN1cGVyKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J251bWJlcic6IFtcblx0XHQvXFxkK3ItP1tcXGRBLVpdKyg/OlxcLltcXGRBLVpdKyk/KD86ZS0/XFxkKyk/Lyxcblx0XHQvXFxiXFxkKyg/OlxcLlxcZCspPyg/OmUtP1xcZCspPy9cblx0XSxcblx0J29wZXJhdG9yJzogL1s8PV09P3w6PXx+W349XXxcXC9cXC8/fFxcXFxcXFxcfD5bPj1dP3xbIV4rXFwtKiZ8LEBdLyxcblx0J3B1bmN0dWF0aW9uJzogL1suOzo/XFxbXFxdKCl7fV0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnNtYXJ0eSA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC9eXFx7XFwqW1xcc1xcU10qP1xcKlxcfS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdlbWJlZGRlZC1waHAnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXlxce3BocFxcfVtcXHNcXFNdKj9cXHtcXC9waHBcXH0vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdzbWFydHknOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15cXHtwaHBcXH18XFx7XFwvcGhwXFx9JC8sXG5cdFx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncGhwJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtcGhwJyxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5waHBcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1wiKD86XFxcXC58W15cIlxcXFxcXHJcXG5dKSpcIi8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXFx7W157fV0qXFx9fGBbXmBdKmAvLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9eW3tgXXxbYH1dJC8sXG5cdFx0XHRcdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndmFyaWFibGUnOiAvXFwkXFx3Ky9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLycoPzpcXFxcLnxbXidcXFxcXFxyXFxuXSkqJy8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRdLFxuXHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0cGF0dGVybjogLyheXFx7XFwvPylbYS16X11cXHcqXFxiKD8hXFwoKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdHBhdHRlcm46IC9eXFx7XFwvP3xcXH0kLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQnbnVtYmVyJzogL1xcYjB4W1xcZEEtRmEtZl0rfCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpbRWVdWy0rXT9cXGQrKT8vLFxuXHRcdCd2YXJpYWJsZSc6IFtcblx0XHRcdC9cXCQoPyFcXGQpXFx3Ky8sXG5cdFx0XHQvIyg/IVxcZClcXHcrIy8sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFwufC0+fFxcd1xccyo9KSg/IVxcZClcXHcrXFxiKD8hXFwoKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFxbKSg/IVxcZClcXHcrKD89XFxdKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXFx8XFxzKilAP1thLXpfXVxcdyp8XFxiW2Etel9dXFx3Kig/PVxcKCkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdhdHRyLW5hbWUnOiAvXFxiW2Etel9dXFx3Kig/PVxccyo9KS9pLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfG5vfG9mZnxvbnx0cnVlfHllcylcXGIvLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxdKCl7fS4sOmBdfC0+Lyxcblx0XHQnb3BlcmF0b3InOiBbXG5cdFx0XHQvWytcXC0qXFwvJV18PT0/PT98WyE8Pl09P3wmJnxcXHxcXHw/Lyxcblx0XHRcdC9cXGJpc1xccysoPzpub3RcXHMrKT8oPzpkaXZ8ZXZlbnxvZGQpKD86XFxzK2J5KT9cXGIvLFxuXHRcdFx0L1xcYig/OmFuZHxlcXxndD9lfGd0fGx0P2V8bHR8bW9kfG5lcT98bm90fG9yKVxcYi9cblx0XHRdXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnNtYXJ0eVsnZW1iZWRkZWQtcGhwJ10uaW5zaWRlLnNtYXJ0eS5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuc21hcnR5O1xuXHRQcmlzbS5sYW5ndWFnZXMuc21hcnR5LnN0cmluZ1swXS5pbnNpZGUuaW50ZXJwb2xhdGlvbi5pbnNpZGUuZXhwcmVzc2lvbi5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuc21hcnR5O1xuXG5cdHZhciBzdHJpbmcgPSAvXCIoPzpcXFxcLnxbXlwiXFxcXFxcclxcbl0pKlwifCcoPzpcXFxcLnxbXidcXFxcXFxyXFxuXSkqJy87XG5cdHZhciBzbWFydHlQYXR0ZXJuID0gUmVnRXhwKFxuXHRcdC8vIGNvbW1lbnRzXG5cdFx0L1xce1xcKltcXHNcXFNdKj9cXCpcXH0vLnNvdXJjZSArXG5cdFx0J3wnICtcblx0XHQvLyBwaHAgdGFnc1xuXHRcdC9cXHtwaHBcXH1bXFxzXFxTXSo/XFx7XFwvcGhwXFx9Ly5zb3VyY2UgK1xuXHRcdCd8JyArXG5cdFx0Ly8gc21hcnR5IGJsb2Nrc1xuXHRcdC9cXHsoPzpbXnt9XCInXXw8c3RyPnxcXHsoPzpbXnt9XCInXXw8c3RyPnxcXHsoPzpbXnt9XCInXXw8c3RyPikqXFx9KSpcXH0pKlxcfS8uc291cmNlXG5cdFx0XHQucmVwbGFjZSgvPHN0cj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RyaW5nLnNvdXJjZTsgfSksXG5cdFx0J2cnXG5cdCk7XG5cblx0Ly8gVG9rZW5pemUgYWxsIGlubGluZSBTbWFydHkgZXhwcmVzc2lvbnNcblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0dmFyIHNtYXJ0eUxpdGVyYWxTdGFydCA9ICd7bGl0ZXJhbH0nO1xuXHRcdHZhciBzbWFydHlMaXRlcmFsRW5kID0gJ3svbGl0ZXJhbH0nO1xuXHRcdHZhciBzbWFydHlMaXRlcmFsTW9kZSA9IGZhbHNlO1xuXG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLmJ1aWxkUGxhY2Vob2xkZXJzKGVudiwgJ3NtYXJ0eScsIHNtYXJ0eVBhdHRlcm4sIGZ1bmN0aW9uIChtYXRjaCkge1xuXHRcdFx0Ly8gU21hcnR5IHRhZ3MgaW5zaWRlIHtsaXRlcmFsfSBibG9jayBhcmUgaWdub3JlZFxuXHRcdFx0aWYgKG1hdGNoID09PSBzbWFydHlMaXRlcmFsRW5kKSB7XG5cdFx0XHRcdHNtYXJ0eUxpdGVyYWxNb2RlID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghc21hcnR5TGl0ZXJhbE1vZGUpIHtcblx0XHRcdFx0aWYgKG1hdGNoID09PSBzbWFydHlMaXRlcmFsU3RhcnQpIHtcblx0XHRcdFx0XHRzbWFydHlMaXRlcmFsTW9kZSA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9KTtcblx0fSk7XG5cblx0Ly8gUmUtaW5zZXJ0IHRoZSB0b2tlbnMgYWZ0ZXIgdG9rZW5pemluZ1xuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS50b2tlbml6ZVBsYWNlaG9sZGVycyhlbnYsICdzbWFydHknKTtcblx0fSk7XG5cbn0oUHJpc20pKTtcblxuLy8gaHR0cHM6Ly9zbWxmYW1pbHkuZ2l0aHViLmlvL3NtbDk3LWRlZm4ucGRmXG4vLyBodHRwczovL3Blb3BsZS5tcGktc3dzLm9yZy9+cm9zc2Jlcmcvc21sLmh0bWxcbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIga2V5d29yZHMgPSAvXFxiKD86YWJzdHlwZXxhbmR8YW5kYWxzb3xhc3xjYXNlfGRhdGF0eXBlfGRvfGVsc2V8ZW5kfGVxdHlwZXxleGNlcHRpb258Zm58ZnVufGZ1bmN0b3J8aGFuZGxlfGlmfGlufGluY2x1ZGV8aW5maXh8aW5maXhyfGxldHxsb2NhbHxub25maXh8b2Z8b3B8b3BlbnxvcmVsc2V8cmFpc2V8cmVjfHNoYXJpbmd8c2lnfHNpZ25hdHVyZXxzdHJ1Y3R8c3RydWN0dXJlfHRoZW58dHlwZXx2YWx8d2hlcmV8d2hpbGV8d2l0aHx3aXRodHlwZSlcXGIvaTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuc21sID0ge1xuXHRcdC8vIGFsbG93IG9uZSBsZXZlbCBvZiBuZXN0aW5nXG5cdFx0J2NvbW1lbnQnOiAvXFwoXFwqKD86W14qKF18XFwqKD8hXFwpKXxcXCgoPyFcXCopfFxcKFxcKig/OlteKihdfFxcKig/IVxcKSl8XFwoKD8hXFwqKSkqXFwqXFwpKSpcXCpcXCkvLFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvIz9cIig/OlteXCJcXFxcXXxcXFxcLikqXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblxuXHRcdCdjbGFzcy1uYW1lJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBUaGlzIGlzIG9ubHkgYW4gYXBwcm94aW1hdGlvbiBzaW5jZSB0aGUgcmVhbCBncmFtbWFyIGlzIGNvbnRleHQtZnJlZVxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBXaHkgdGhlIG1haW4gbG9vcCBzbyBjb21wbGV4P1xuXHRcdFx0XHQvLyBUaGUgbWFpbiBsb29wIGlzIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgYXMgLyg/OlxccyooPzpbKixdfC0+KVxccyo8VEVSTUlOQUw+KSovIHdoaWNoIGlzLCBvYnZpb3VzbHksIGEgbG90XG5cdFx0XHRcdC8vIHNpbXBsZXIuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgaWYgYSBjb21tYSBpcyB0aGUgbGFzdCBpdGVyYXRpb24gb2YgdGhlIGxvb3AsIHRoZW4gdGhlIHRlcm1pbmFsIG11c3QgYmVcblx0XHRcdFx0Ly8gZm9sbG93ZWQgYnkgYSBsb25nIGlkZW50aWZpZXIuXG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0XHQvKCg/Ol58W146XSk6XFxzKik8VEVSTUlOQUw+KD86XFxzKig/Oig/OlxcKnwtPilcXHMqPFRFUk1JTkFMPnwsXFxzKjxURVJNSU5BTD4oPzooPz08Tk9ULUxBU1Q+KXwoPyE8Tk9ULUxBU1Q+KVxccys8TE9ORy1JRD4pKSkqLy5zb3VyY2Vcblx0XHRcdFx0XHRcdC5yZXBsYWNlKC88Tk9ULUxBU1Q+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIC9cXHMqKD86WyosXXwtPikvLnNvdXJjZTsgfSlcblx0XHRcdFx0XHRcdC5yZXBsYWNlKC88VEVSTUlOQUw+L2csIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIC8oPzonW1xcdyddKnw8TE9ORy1JRD58XFwoKD86W14oKV18XFwoW14oKV0qXFwpKSpcXCl8XFx7KD86W157fV18XFx7W157fV0qXFx9KSpcXH0pKD86XFxzKzxMT05HLUlEPikqLy5zb3VyY2U7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoLzxMT05HLUlEPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiAvKD8hPEtFWVdPUkQ+KVthLXpcXGRfXVtcXHcnLl0qLy5zb3VyY2U7IH0pXG5cdFx0XHRcdFx0XHQucmVwbGFjZSgvPEtFWVdPUkQ+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGtleXdvcmRzLnNvdXJjZTsgfSksXG5cdFx0XHRcdFx0J2knXG5cdFx0XHRcdCksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFteXFx3J10pKD86ZGF0YXR5cGV8ZXhjZXB0aW9ufGZ1bmN0b3J8c2lnbmF0dXJlfHN0cnVjdHVyZXx0eXBlKVxccyspW2Etel9dW1xcdycuXSovaSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFteXFx3J10pZnVuXFxzKylbYS16X11bXFx3Jy5dKi9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdCd2YXJpYWJsZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdyddKSdbXFx3J10qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0fSxcblxuXHRcdCdudW1iZXInOiAvfj9cXGIoPzpcXGQrKD86XFwuXFxkKyk/KD86ZX4/XFxkKyk/fDB4W1xcZGEtZl0rKVxcYi9pLFxuXHRcdCd3b3JkJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYjB3KD86XFxkK3x4W1xcZGEtZl0rKVxcYi9pLFxuXHRcdFx0YWxpYXM6ICdjb25zdGFudCdcblx0XHR9LFxuXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvaSxcblx0XHQnb3BlcmF0b3InOiAvXFwuXFwuXFwufDpbPj06XXw9Pj98LT58Wzw+XT0/fFshK1xcLSovXiN8QH5dLyxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpe31cXFtcXF0uOiw7XS9cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuc21sWydjbGFzcy1uYW1lJ11bMF0uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLnNtbDtcblxuXHRQcmlzbS5sYW5ndWFnZXMuc21sbmogPSBQcmlzbS5sYW5ndWFnZXMuc21sO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5zb2xpZGl0eSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYig/OmNvbnRyYWN0fGVudW18aW50ZXJmYWNlfGxpYnJhcnl8bmV3fHN0cnVjdHx1c2luZylcXHMrKSg/IVxcZClbXFx3JF0rLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/Ol98YW5vbnltb3VzfGFzfGFzc2VtYmx5fGFzc2VydHxicmVha3xjYWxsZGF0YXxjYXNlfGNvbnN0YW50fGNvbnN0cnVjdG9yfGNvbnRpbnVlfGNvbnRyYWN0fGRlZmF1bHR8ZGVsZXRlfGRvfGVsc2V8ZW1pdHxlbnVtfGV2ZW50fGV4dGVybmFsfGZvcnxmcm9tfGZ1bmN0aW9ufGlmfGltcG9ydHxpbmRleGVkfGluaGVyaXRlZHxpbnRlcmZhY2V8aW50ZXJuYWx8aXN8bGV0fGxpYnJhcnl8bWFwcGluZ3xtZW1vcnl8bW9kaWZpZXJ8bmV3fHBheWFibGV8cHJhZ21hfHByaXZhdGV8cHVibGljfHB1cmV8cmVxdWlyZXxyZXR1cm5zP3xyZXZlcnR8c2VsZmRlc3RydWN0fHNvbGlkaXR5fHN0b3JhZ2V8c3RydWN0fHN1aWNpZGV8c3dpdGNofHRoaXN8dGhyb3d8dXNpbmd8dmFyfHZpZXd8d2hpbGUpXFxiLyxcblx0J29wZXJhdG9yJzogLz0+fC0+fDo9fD06fFxcKlxcKnxcXCtcXCt8LS18XFx8XFx8fCYmfDw8PT98Pj49P3xbLSsqLyVeJnw8PiE9XT0/fFt+P10vXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnc29saWRpdHknLCAna2V5d29yZCcsIHtcblx0J2J1aWx0aW4nOiAvXFxiKD86YWRkcmVzc3xib29sfGJ5dGV8dT9pbnQoPzo4fDE2fDI0fDMyfDQwfDQ4fDU2fDY0fDcyfDgwfDg4fDk2fDEwNHwxMTJ8MTIwfDEyOHwxMzZ8MTQ0fDE1MnwxNjB8MTY4fDE3NnwxODR8MTkyfDIwMHwyMDh8MjE2fDIyNHwyMzJ8MjQwfDI0OHwyNTYpP3xzdHJpbmd8Ynl0ZXMoPzpbMS05XXxbMTJdXFxkfDNbMC0yXSk/KVxcYi9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdzb2xpZGl0eScsICdudW1iZXInLCB7XG5cdCd2ZXJzaW9uJzoge1xuXHRcdHBhdHRlcm46IC8oWzw+XT0/fFxcXilcXGQrXFwuXFxkK1xcLlxcZCtcXGIvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdudW1iZXInLFxuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLnNvbCA9IFByaXNtLmxhbmd1YWdlcy5zb2xpZGl0eTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBndWlkID0ge1xuXHRcdC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXZlcnNhbGx5X3VuaXF1ZV9pZGVudGlmaWVyI0Zvcm1hdFxuXHRcdHBhdHRlcm46IC9cXHtbXFxkYS1mXXs4fS1bXFxkYS1mXXs0fS1bXFxkYS1mXXs0fS1bXFxkYS1mXXs0fS1bXFxkYS1mXXsxMn1cXH0vaSxcblx0XHRhbGlhczogJ2NvbnN0YW50Jyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9be31dL1xuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXNbJ3NvbHV0aW9uLWZpbGUnXSA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8jLiovLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiW15cIlxcclxcbl0qXCJ8J1teJ1xcclxcbl0qJy8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2d1aWQnOiBndWlkXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnb2JqZWN0Jzoge1xuXHRcdFx0Ly8gRm9vXG5cdFx0XHQvLyAgIEJhcihcImFic1wiKSA9IDlcblx0XHRcdC8vICAgRW5kQmFyXG5cdFx0XHQvLyAgIFByb3AgPSBUUlVFXG5cdFx0XHQvLyBFbmRGb29cblx0XHRcdHBhdHRlcm46IC9eKFsgXFx0XSopKD86KFtBLVpdXFx3KilcXGIoPz0uKig/Olxcclxcbj98XFxuKSg/OlxcMVsgXFx0XS4qKD86XFxyXFxuP3xcXG4pKSpcXDFFbmRcXDIoPz1bIFxcdF0qJCkpfEVuZFtBLVpdXFx3Kig/PVsgXFx0XSokKSkvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblx0XHQncHJvcGVydHknOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXihbIFxcdF0qKSg/IVxccylbXlxcclxcblwiIz0oKV0qW15cXHNcIiM9KCldKD89XFxzKj0pL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdndWlkJzogZ3VpZFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2d1aWQnOiBndWlkLFxuXHRcdCdudW1iZXInOiAvXFxiXFxkKyg/OlxcLlxcZCspKlxcYi8sXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86RkFMU0V8VFJVRSlcXGIvLFxuXHRcdCdvcGVyYXRvcic6IC89Lyxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpLF0vXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzWydzbG4nXSA9IFByaXNtLmxhbmd1YWdlc1snc29sdXRpb24tZmlsZSddO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0dmFyIHN0cmluZ1BhdHRlcm4gPSAvKFtcIiddKSg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvO1xuXHR2YXIgbnVtYmVyUGF0dGVybiA9IC9cXGJcXGQrKD86XFwuXFxkKyk/KD86W2VFXVsrLV0/XFxkKyk/XFxifFxcYjB4W1xcZEEtRl0rXFxiLztcblxuXHRQcmlzbS5sYW5ndWFnZXMuc295ID0ge1xuXHRcdCdjb21tZW50JzogW1xuXHRcdFx0L1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxccylcXC9cXC8uKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2NvbW1hbmQtYXJnJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXHsrXFwvP1xccyooPzphbGlhc3xjYWxsfGRlbGNhbGx8ZGVscGFja2FnZXxkZWx0ZW1wbGF0ZXxuYW1lc3BhY2V8dGVtcGxhdGUpXFxzKylcXC4/W1xcdy5dKy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQncGFyYW1ldGVyJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXHsrXFwvP1xccypAP3BhcmFtXFw/P1xccyspXFwuP1tcXHcuXSsvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXHsrXFwvP1teXFxTXFxyXFxuXSopKD86XFxcXFtucnRdfGFsaWFzfGNhbGx8Y2FzZXxjc3N8ZGVmYXVsdHxkZWxjYWxsfGRlbHBhY2thZ2V8ZGVsdGVtcGxhdGV8ZWxzZSg/OmlmKT98ZmFsbGJhY2ttc2d8Zm9yKD86ZWFjaCk/fGlmKD86ZW1wdHkpP3xsYnxsZXR8bGl0ZXJhbHxtc2d8bmFtZXNwYWNlfG5pbHxAP3BhcmFtXFw/P3xyYnxzcHxzd2l0Y2h8dGVtcGxhdGV8eGlkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQvXFxiKD86YW55fGFzfGF0dHJpYnV0ZXN8Ym9vbHxjc3N8ZmxvYXR8aHRtbHxpbnxpbnR8anN8bGlzdHxtYXB8bnVsbHxudW1iZXJ8c3RyaW5nfHVyaSlcXGIvXG5cdFx0XSxcblx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0cGF0dGVybjogL15cXHsrXFwvP3xcXC8/XFx9KyQvLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdwcm9wZXJ0eSc6IC9cXHcrKD89PSkvLFxuXHRcdCd2YXJpYWJsZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXCRbXlxcV1xcZF1cXHcqKD86XFw/Pyg/OlxcLlxcdyt8XFxbW15cXF1dK1xcXSkpKi8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3N0cmluZyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBzdHJpbmdQYXR0ZXJuLFxuXHRcdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnbnVtYmVyJzogbnVtYmVyUGF0dGVybixcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF0uP10vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogc3RyaW5nUGF0dGVybixcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2Z1bmN0aW9uJzogW1xuXHRcdFx0L1xcdysoPz1cXCgpLyxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXHxbXlxcU1xcclxcbl0qKVxcdysvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdFx0J251bWJlcic6IG51bWJlclBhdHRlcm4sXG5cdFx0J29wZXJhdG9yJzogL1xcPzo/fDw9P3w+PT98PT0/fCE9fFsrKi8lLV18XFxiKD86YW5kfG5vdHxvcilcXGIvLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9be30oKVxcW1xcXXwuLDpdL1xuXHR9O1xuXG5cdC8vIFRva2VuaXplIGFsbCBpbmxpbmUgU295IGV4cHJlc3Npb25zXG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdHZhciBzb3lQYXR0ZXJuID0gL1xce1xcey4rP1xcfVxcfXxcXHsuKz9cXH18XFxzXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nO1xuXHRcdHZhciBzb3lMaXR0ZXJhbFN0YXJ0ID0gJ3tsaXRlcmFsfSc7XG5cdFx0dmFyIHNveUxpdHRlcmFsRW5kID0gJ3svbGl0ZXJhbH0nO1xuXHRcdHZhciBzb3lMaXR0ZXJhbE1vZGUgPSBmYWxzZTtcblxuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS5idWlsZFBsYWNlaG9sZGVycyhlbnYsICdzb3knLCBzb3lQYXR0ZXJuLCBmdW5jdGlvbiAobWF0Y2gpIHtcblx0XHRcdC8vIFNveSB0YWdzIGluc2lkZSB7bGl0ZXJhbH0gYmxvY2sgYXJlIGlnbm9yZWRcblx0XHRcdGlmIChtYXRjaCA9PT0gc295TGl0dGVyYWxFbmQpIHtcblx0XHRcdFx0c295TGl0dGVyYWxNb2RlID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghc295TGl0dGVyYWxNb2RlKSB7XG5cdFx0XHRcdGlmIChtYXRjaCA9PT0gc295TGl0dGVyYWxTdGFydCkge1xuXHRcdFx0XHRcdHNveUxpdHRlcmFsTW9kZSA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9KTtcblx0fSk7XG5cblx0Ly8gUmUtaW5zZXJ0IHRoZSB0b2tlbnMgYWZ0ZXIgdG9rZW5pemluZ1xuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS50b2tlbml6ZVBsYWNlaG9sZGVycyhlbnYsICdzb3knKTtcblx0fSk7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnR1cnRsZSA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyMuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdtdWx0aWxpbmUtc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIlwiXCIoPzooPzpcIlwiPyk/KD86W15cIlxcXFxdfFxcXFwuKSkqXCJcIlwifCcnJyg/Oig/OicnPyk/KD86W14nXFxcXF18XFxcXC4pKSonJycvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnY29tbWVudCc6IC8jLiovXG5cdFx0fVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXFxcXFwiXFxyXFxuXXxcXFxcLikqXCJ8Jyg/OlteXFxcXCdcXHJcXG5dfFxcXFwuKSonLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3VybCc6IHtcblx0XHRwYXR0ZXJuOiAvPCg/OlteXFx4MDAtXFx4MjA8Plwie318XmBcXFxcXXxcXFxcKD86dVtcXGRhLWZBLUZdezR9fFVbXFxkYS1mQS1GXXs4fSkpKj4vLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9bPD5dL1xuXHRcdH1cblx0fSxcblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oPzooPyFbLS5cXGRcXHhCN10pWy0uXFx3XFx4QjdcXHhDMC1cXHVGRkZEXSspPzooPzooPyFbLS5dKSg/OlstLjpcXHdcXHhDMC1cXHVGRkZEXXwlW1xcZGEtZl17Mn18XFxcXC4pKyk/L2ksXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnbG9jYWwtbmFtZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLyhbXjpdKjopW1xcc1xcU10rLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCdwcmVmaXgnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvOi9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J251bWJlcic6IC9bKy1dP1xcYlxcZCsoPzpcXC5cXGQqKT8oPzplWystXT9cXGQrKT8vaSxcblx0J3B1bmN0dWF0aW9uJzogL1t7fS4sOygpW1xcXV18XFxeXFxeLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQna2V5d29yZCc6IFtcblx0XHQvKD86XFxiYXxAcHJlZml4fEBiYXNlKVxcYnw9Lyxcblx0XHQvXFxiKD86YmFzZXxncmFwaHxwcmVmaXgpXFxiL2lcblx0XSxcblx0J3RhZyc6IHtcblx0XHRwYXR0ZXJuOiAvQFthLXpdKyg/Oi1bYS16XFxkXSspKi9pLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL0AvXG5cdFx0fVxuXHR9XG59O1xuUHJpc20ubGFuZ3VhZ2VzLnRyaWcgPSBQcmlzbS5sYW5ndWFnZXNbJ3R1cnRsZSddO1xuXG5QcmlzbS5sYW5ndWFnZXMuc3BhcnFsID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgndHVydGxlJywge1xuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi9pLFxuXHQndmFyaWFibGUnOiB7XG5cdFx0cGF0dGVybjogL1s/JF1cXHcrLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcbn1cbik7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3NwYXJxbCcsICdwdW5jdHVhdGlvbicsIHtcblx0J2tleXdvcmQnOiBbXG5cdFx0L1xcYig/OkF8QUREfEFMTHxBU3xBU0N8QVNLfEJOT0RFfEJZfENMRUFSfENPTlNUUlVDVHxDT1BZfENSRUFURXxEQVRBfERFRkFVTFR8REVMRVRFfERFU0N8REVTQ1JJQkV8RElTVElOQ1R8RFJPUHxFWElTVFN8RklMVEVSfEZST018R1JPVVB8SEFWSU5HfElOU0VSVHxJTlRPfExJTUlUfExPQUR8TUlOVVN8TU9WRXxOQU1FRHxOT1R8Tk9XfE9GRlNFVHxPUFRJT05BTHxPUkRFUnxSQU5EfFJFRFVDRUR8U0VMRUNUfFNFUEFSQVRPUnxTRVJWSUNFfFNJTEVOVHxTVFJVVUlEfFVOSU9OfFVTSU5HfFVVSUR8VkFMVUVTfFdIRVJFKVxcYi9pLFxuXHRcdC9cXGIoPzpBQlN8QVZHfEJJTkR8Qk9VTkR8Q0VJTHxDT0FMRVNDRXxDT05DQVR8Q09OVEFJTlN8Q09VTlR8REFUQVRZUEV8REFZfEVOQ09ERV9GT1JfVVJJfEZMT09SfEdST1VQX0NPTkNBVHxIT1VSU3xJRnxJUkl8aXNCTEFOS3xpc0lSSXxpc0xJVEVSQUx8aXNOVU1FUklDfGlzVVJJfExBTkd8TEFOR01BVENIRVN8TENBU0V8TUFYfE1ENXxNSU58TUlOVVRFU3xNT05USHxSRUdFWHxSRVBMQUNFfFJPVU5EfHNhbWVUZXJtfFNBTVBMRXxTRUNPTkRTfFNIQTF8U0hBMjU2fFNIQTM4NHxTSEE1MTJ8U1RSfFNUUkFGVEVSfFNUUkJFRk9SRXxTVFJEVHxTVFJFTkRTfFNUUkxBTkd8U1RSTEVOfFNUUlNUQVJUU3xTVUJTVFJ8U1VNfFRJTUVaT05FfFRafFVDQVNFfFVSSXxZRUFSKVxcYig/PVxccypcXCgpL2ksXG5cdFx0L1xcYig/OkJBU0V8R1JBUEh8UFJFRklYKVxcYi9pXG5cdF1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMucnEgPSBQcmlzbS5sYW5ndWFnZXMuc3BhcnFsO1xuXG5QcmlzbS5sYW5ndWFnZXNbJ3NwbHVuay1zcGwnXSA9IHtcblx0J2NvbW1lbnQnOiAvYGNvbW1lbnRcXChcIig/OlxcXFwufFteXFxcXFwiXSkqXCJcXClgLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcLnxbXlxcXFxcIl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0Ly8gaHR0cHM6Ly9kb2NzLnNwbHVuay5jb20vRG9jdW1lbnRhdGlvbi9TcGx1bmsvNy4zLjAvU2VhcmNoUmVmZXJlbmNlL0xpc3RPZlNlYXJjaENvbW1hbmRzXG5cdCdrZXl3b3JkJzogL1xcYig/OmFic3RyYWN0fGFjY3VtfGFkZGNvbHRvdGFsc3xhZGRpbmZvfGFkZHRvdGFsc3xhbmFseXplZmllbGRzfGFub21hbGllc3xhbm9tYWxvdXN2YWx1ZXxhbm9tYWx5ZGV0ZWN0aW9ufGFwcGVuZHxhcHBlbmRjb2xzfGFwcGVuZGNzdnxhcHBlbmRsb29rdXB8YXBwZW5kcGlwZXxhcnVsZXN8YXNzb2NpYXRlfGF1ZGl0fGF1dG9yZWdyZXNzfGJpbnxidWNrZXR8YnVja2V0ZGlyfGNoYXJ0fGNsdXN0ZXJ8Y29maWx0ZXJ8Y29sbGVjdHxjb25jdXJyZW5jeXxjb250aW5nZW5jeXxjb252ZXJ0fGNvcnJlbGF0ZXxkYXRhbW9kZWx8ZGJpbnNwZWN0fGRlZHVwfGRlbGV0ZXxkZWx0YXxkaWZmfGVyZXh8ZXZhbHxldmVudGNvdW50fGV2ZW50c3RhdHN8ZXh0cmFjdHxmaWVsZGZvcm1hdHxmaWVsZHN8ZmllbGRzdW1tYXJ5fGZpbGxkb3dufGZpbGxudWxsfGZpbmR0eXBlc3xmb2xkZXJpemV8Zm9yZWFjaHxmb3JtYXR8ZnJvbXxnYXVnZXxnZW50aW1lc3xnZW9tfGdlb21maWx0ZXJ8Z2Vvc3RhdHN8aGVhZHxoaWdobGlnaHR8aGlzdG9yeXxpY29uaWZ5fGlucHV0fGlucHV0Y3N2fGlucHV0bG9va3VwfGlwbG9jYXRpb258am9pbnxrbWVhbnN8a3Z8a3Zmb3JtfGxvYWRqb2J8bG9jYWxpemV8bG9jYWxvcHxsb29rdXB8bWFrZWNvbnRpbnVvdXN8bWFrZW12fG1ha2VyZXN1bHRzfG1hcHxtY29sbGVjdHxtZXRhZGF0YXxtZXRhc2VhcmNofG1ldmVudGNvbGxlY3R8bXN0YXRzfG11bHRpa3Z8bXVsdGlzZWFyY2h8bXZjb21iaW5lfG12ZXhwYW5kfG5vbXZ8b3V0bGllcnxvdXRwdXRjc3Z8b3V0cHV0bG9va3VwfG91dHB1dHRleHR8b3ZlcmxhcHxwaXZvdHxwcmVkaWN0fHJhbmdlbWFwfHJhcmV8cmVnZXh8cmVsZXZhbmN5fHJlbHRpbWV8cmVuYW1lfHJlcGxhY2V8cmVzdHxyZXR1cm58cmV2ZXJzZXxyZXh8cnRvcmRlcnxydW58c2F2ZWRzZWFyY2h8c2NyaXB0fHNjcnVifHNlYXJjaHxzZWFyY2h0eG58c2VsZmpvaW58c2VuZGVtYWlsfHNldHxzZXRmaWVsZHN8c2ljaGFydHxzaXJhcmV8c2lzdGF0c3xzaXRpbWVjaGFydHxzaXRvcHxzb3J0fHNwYXRofHN0YXRzfHN0cmNhdHxzdHJlYW1zdGF0c3x0YWJsZXx0YWdzfHRhaWx8dGltZWNoYXJ0fHRpbWV3cmFwfHRvcHx0cmFuc2FjdGlvbnx0cmFuc3Bvc2V8dHJlbmRsaW5lfHRzY29sbGVjdHx0c3RhdHN8dHlwZWFoZWFkfHR5cGVsZWFybmVyfHR5cGVyfHVuaW9ufHVuaXF8dW50YWJsZXx3aGVyZXx4MTF8eG1sa3Z8eG1sdW5lc2NhcGV8eHBhdGh8eHlzZXJpZXMpXFxiL2ksXG5cdCdvcGVyYXRvci13b3JkJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzphbmR8YXN8Ynl8bm90fG9yfHhvcilcXGIvaSxcblx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHR9LFxuXHQnZnVuY3Rpb24nOiAvXFxiXFx3Kyg/PVxccypcXCgpLyxcblx0J3Byb3BlcnR5JzogL1xcYlxcdysoPz1cXHMqPSg/IT0pKS8sXG5cdCdkYXRlJzoge1xuXHRcdC8vIE1NL0REL1lZWVkoOkhIOk1NOlNTKT9cblx0XHRwYXR0ZXJuOiAvXFxiXFxkezEsMn1cXC9cXGR7MSwyfVxcL1xcZHsxLDR9KD86KD86OlxcZHsxLDJ9KXszfSk/XFxiLyxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblx0J251bWJlcic6IC9cXGJcXGQrKD86XFwuXFxkKyk/XFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZnxmYWxzZXx0fHRydWUpXFxiL2ksXG5cdCdvcGVyYXRvcic6IC9bPD49XT0/fFstKyovJXxdLyxcblx0J3B1bmN0dWF0aW9uJzogL1soKVtcXF0sXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5zcWYgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzooPzpcIlwiKT9bXlwiXSkqXCIoPyFcIil8Jyg/OlteJ10pKicvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpicmVha091dHxicmVha1RvfGNhbGx8Y2FzZXxjYXRjaHxkZWZhdWx0fGRvfGVjaG98ZWxzZXxleGVjRlNNfGV4ZWNWTXxleGl0V2l0aHxmb3J8Zm9yRWFjaHxmb3JFYWNoTWVtYmVyfGZvckVhY2hNZW1iZXJBZ2VudHxmb3JFYWNoTWVtYmVyVGVhbXxmcm9tfGdvdG98aWZ8bmlsfHByZXByb2Nlc3NGaWxlfHByZXByb2Nlc3NGaWxlTGluZU51bWJlcnN8cHJpdmF0ZXxzY29wZU5hbWV8c3Bhd258c3RlcHxzd2l0Y2h8dGhlbnx0aHJvd3x0b3x0cnl8d2hpbGV8d2l0aClcXGIvaSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvaSxcblx0J2Z1bmN0aW9uJzogL1xcYig/OmFic3xhY2NUaW1lfGFjb3N8YWN0aW9ufGFjdGlvbklEc3xhY3Rpb25LZXlzfGFjdGlvbktleXNJbWFnZXN8YWN0aW9uS2V5c05hbWVzfGFjdGlvbktleXNOYW1lc0FycmF5fGFjdGlvbk5hbWV8YWN0aW9uUGFyYW1zfGFjdGl2YXRlQWRkb25zfGFjdGl2YXRlZEFkZG9uc3xhY3RpdmF0ZUtleXxhZGQzREVOQ29ubmVjdGlvbnxhZGQzREVORXZlbnRIYW5kbGVyfGFkZDNERU5MYXllcnxhZGRBY3Rpb258YWRkQmFja3BhY2t8YWRkQmFja3BhY2tDYXJnb3xhZGRCYWNrcGFja0NhcmdvR2xvYmFsfGFkZEJhY2twYWNrR2xvYmFsfGFkZENhbVNoYWtlfGFkZEN1cmF0b3JBZGRvbnN8YWRkQ3VyYXRvckNhbWVyYUFyZWF8YWRkQ3VyYXRvckVkaXRhYmxlT2JqZWN0c3xhZGRDdXJhdG9yRWRpdGluZ0FyZWF8YWRkQ3VyYXRvclBvaW50c3xhZGRFZGl0b3JPYmplY3R8YWRkRXZlbnRIYW5kbGVyfGFkZEZvcmNlfGFkZEZvcmNlR2VuZXJhdG9yUlREfGFkZEdvZ2dsZXN8YWRkR3JvdXBJY29ufGFkZEhhbmRndW5JdGVtfGFkZEhlYWRnZWFyfGFkZEl0ZW18YWRkSXRlbUNhcmdvfGFkZEl0ZW1DYXJnb0dsb2JhbHxhZGRJdGVtUG9vbHxhZGRJdGVtVG9CYWNrcGFja3xhZGRJdGVtVG9Vbmlmb3JtfGFkZEl0ZW1Ub1Zlc3R8YWRkTGl2ZVN0YXRzfGFkZE1hZ2F6aW5lfGFkZE1hZ2F6aW5lQW1tb0NhcmdvfGFkZE1hZ2F6aW5lQ2FyZ298YWRkTWFnYXppbmVDYXJnb0dsb2JhbHxhZGRNYWdhemluZUdsb2JhbHxhZGRNYWdhemluZVBvb2x8YWRkTWFnYXppbmVzfGFkZE1hZ2F6aW5lVHVycmV0fGFkZE1lbnV8YWRkTWVudUl0ZW18YWRkTWlzc2lvbkV2ZW50SGFuZGxlcnxhZGRNUEV2ZW50SGFuZGxlcnxhZGRNdXNpY0V2ZW50SGFuZGxlcnxhZGRPd25lZE1pbmV8YWRkUGxheWVyU2NvcmVzfGFkZFByaW1hcnlXZWFwb25JdGVtfGFkZFB1YmxpY1ZhcmlhYmxlRXZlbnRIYW5kbGVyfGFkZFJhdGluZ3xhZGRSZXNvdXJjZXN8YWRkU2NvcmV8YWRkU2NvcmVTaWRlfGFkZFNlY29uZGFyeVdlYXBvbkl0ZW18YWRkU3dpdGNoYWJsZVVuaXR8YWRkVGVhbU1lbWJlcnxhZGRUb1JlbWFpbnNDb2xsZWN0b3J8YWRkVG9ycXVlfGFkZFVuaWZvcm18YWRkVmVoaWNsZXxhZGRWZXN0fGFkZFdheXBvaW50fGFkZFdlYXBvbnxhZGRXZWFwb25DYXJnb3xhZGRXZWFwb25DYXJnb0dsb2JhbHxhZGRXZWFwb25HbG9iYWx8YWRkV2VhcG9uSXRlbXxhZGRXZWFwb25Qb29sfGFkZFdlYXBvblR1cnJldHxhZG1pbnxhZ2VudHxhZ2VudHN8QUdMVG9BU0x8YWltZWRBdFRhcmdldHxhaW1Qb3N8YWlyRGVuc2l0eUN1cnZlUlREfGFpckRlbnNpdHlSVER8YWlycGxhbmVUaHJvdHRsZXxhaXJwb3J0U2lkZXxBSVNGaW5pc2hIZWFsfGFsaXZlfGFsbDNERU5FbnRpdGllc3xhbGxBaXJwb3J0c3xhbGxDb250cm9sc3xhbGxDdXJhdG9yc3xhbGxDdXRMYXllcnN8YWxsRGVhZHxhbGxEZWFkTWVufGFsbERpc3BsYXlzfGFsbEdyb3Vwc3xhbGxNYXBNYXJrZXJzfGFsbE1pbmVzfGFsbE1pc3Npb25PYmplY3RzfGFsbG93M0RNb2RlfGFsbG93Q3Jld0luSW1tb2JpbGV8YWxsb3dDdXJhdG9yTG9naWNJZ25vcmVBcmVhc3xhbGxvd0RhbWFnZXxhbGxvd0RhbW1hZ2V8YWxsb3dGaWxlT3BlcmF0aW9uc3xhbGxvd0ZsZWVpbmd8YWxsb3dHZXRJbnxhbGxvd1NwcmludHxhbGxQbGF5ZXJzfGFsbFNpbXBsZU9iamVjdHN8YWxsU2l0ZXN8YWxsVHVycmV0c3xhbGxVbml0c3xhbGxVbml0c1VBVnxhbGxWYXJpYWJsZXN8YW1tb3xhbW1vT25QeWxvbnxhbmltYXRlfGFuaW1hdGVCYXl8YW5pbWF0ZURvb3J8YW5pbWF0ZVB5bG9ufGFuaW1hdGVTb3VyY2V8YW5pbWF0aW9uTmFtZXN8YW5pbWF0aW9uUGhhc2V8YW5pbWF0aW9uU291cmNlUGhhc2V8YW5pbWF0aW9uU3RhdGV8YXBwZW5kfGFwcGx5fGFybW9yeVBvaW50c3xhcnJheUludGVyc2VjdHxhc2lufEFTTFRvQUdMfEFTTFRvQVRMfGFzc2VydHxhc3NpZ25Bc0NhcmdvfGFzc2lnbkFzQ2FyZ29JbmRleHxhc3NpZ25Bc0NvbW1hbmRlcnxhc3NpZ25Bc0RyaXZlcnxhc3NpZ25Bc0d1bm5lcnxhc3NpZ25Bc1R1cnJldHxhc3NpZ25DdXJhdG9yfGFzc2lnbmVkQ2FyZ298YXNzaWduZWRDb21tYW5kZXJ8YXNzaWduZWREcml2ZXJ8YXNzaWduZWRHdW5uZXJ8YXNzaWduZWRJdGVtc3xhc3NpZ25lZFRhcmdldHxhc3NpZ25lZFRlYW18YXNzaWduZWRWZWhpY2xlfGFzc2lnbmVkVmVoaWNsZVJvbGV8YXNzaWduSXRlbXxhc3NpZ25UZWFtfGFzc2lnblRvQWlycG9ydHxhdGFufGF0YW4yfGF0Z3xBVExUb0FTTHxhdHRhY2hlZE9iamVjdHxhdHRhY2hlZE9iamVjdHN8YXR0YWNoZWRUb3xhdHRhY2hPYmplY3R8YXR0YWNoVG98YXR0YWNrRW5hYmxlZHxiYWNrcGFja3xiYWNrcGFja0NhcmdvfGJhY2twYWNrQ29udGFpbmVyfGJhY2twYWNrSXRlbXN8YmFja3BhY2tNYWdhemluZXN8YmFja3BhY2tTcGFjZUZvcnxiZWhhdmlvdXJ8YmVuY2htYXJrfGJpbm9jdWxhcnxibHVmb3J8Ym91bmRpbmdCb3h8Ym91bmRpbmdCb3hSZWFsfGJvdW5kaW5nQ2VudGVyfGJyaWVmaW5nTmFtZXxidWlsZGluZ0V4aXR8YnVpbGRpbmdQb3N8YnVsZG96ZXJfRW5hYmxlUm9hZERpYWd8YnVsZG96ZXJfSXNFbmFibGVkUm9hZERpYWd8YnVsZG96ZXJfTG9hZE5ld1JvYWRzfGJ1bGRvemVyX3JlbG9hZE9wZXJNYXB8YnV0dG9uQWN0aW9ufGJ1dHRvblNldEFjdGlvbnxjYWRldE1vZGV8Y2FsbEV4dGVuc2lvbnxjYW1Db21tYW5kfGNhbUNvbW1pdHxjYW1Db21taXRQcmVwYXJlZHxjYW1Db21taXR0ZWR8Y2FtQ29uc3R1Y3Rpb25TZXRQYXJhbXN8Y2FtQ3JlYXRlfGNhbURlc3Ryb3l8Y2FtZXJhRWZmZWN0fGNhbWVyYUVmZmVjdEVuYWJsZUhVRHxjYW1lcmFJbnRlcmVzdHxjYW1lcmFPbnxjYW1lcmFWaWV3fGNhbXBhaWduQ29uZmlnRmlsZXxjYW1QcmVsb2FkfGNhbVByZWxvYWRlZHxjYW1QcmVwYXJlQmFua3xjYW1QcmVwYXJlRGlyfGNhbVByZXBhcmVEaXZlfGNhbVByZXBhcmVGb2N1c3xjYW1QcmVwYXJlRm92fGNhbVByZXBhcmVGb3ZSYW5nZXxjYW1QcmVwYXJlUG9zfGNhbVByZXBhcmVSZWxQb3N8Y2FtUHJlcGFyZVRhcmdldHxjYW1TZXRCYW5rfGNhbVNldERpcnxjYW1TZXREaXZlfGNhbVNldEZvY3VzfGNhbVNldEZvdnxjYW1TZXRGb3ZSYW5nZXxjYW1TZXRQb3N8Y2FtU2V0UmVsUG9zfGNhbVNldFRhcmdldHxjYW1UYXJnZXR8Y2FtVXNlTlZHfGNhbkFkZHxjYW5BZGRJdGVtVG9CYWNrcGFja3xjYW5BZGRJdGVtVG9Vbmlmb3JtfGNhbkFkZEl0ZW1Ub1Zlc3R8Y2FuY2VsU2ltcGxlVGFza0Rlc3RpbmF0aW9ufGNhbkZpcmV8Y2FuTW92ZXxjYW5TbGluZ0xvYWR8Y2FuU3RhbmR8Y2FuU3VzcGVuZHxjYW5UcmlnZ2VyRHluYW1pY1NpbXVsYXRpb258Y2FuVW5sb2FkSW5Db21iYXR8Y2FuVmVoaWNsZUNhcmdvfGNhcHRpdmV8Y2FwdGl2ZU51bXxjYkNoZWNrZWR8Y2JTZXRDaGVja2VkfGNlaWx8Y2hhbm5lbEVuYWJsZWR8Y2hlYXRzRW5hYmxlZHxjaGVja0FJRmVhdHVyZXxjaGVja1Zpc2liaWxpdHl8Y2l2aWxpYW58Y2xhc3NOYW1lfGNsZWFyM0RFTkF0dHJpYnV0ZXxjbGVhcjNERU5JbnZlbnRvcnl8Y2xlYXJBbGxJdGVtc0Zyb21CYWNrcGFja3xjbGVhckJhY2twYWNrQ2FyZ298Y2xlYXJCYWNrcGFja0NhcmdvR2xvYmFsfGNsZWFyRm9yY2VzUlREfGNsZWFyR3JvdXBJY29uc3xjbGVhckl0ZW1DYXJnb3xjbGVhckl0ZW1DYXJnb0dsb2JhbHxjbGVhckl0ZW1Qb29sfGNsZWFyTWFnYXppbmVDYXJnb3xjbGVhck1hZ2F6aW5lQ2FyZ29HbG9iYWx8Y2xlYXJNYWdhemluZVBvb2x8Y2xlYXJPdmVybGF5fGNsZWFyUmFkaW98Y2xlYXJWZWhpY2xlSW5pdHxjbGVhcldlYXBvbkNhcmdvfGNsZWFyV2VhcG9uQ2FyZ29HbG9iYWx8Y2xlYXJXZWFwb25Qb29sfGNsaWVudE93bmVyfGNsb3NlRGlhbG9nfGNsb3NlRGlzcGxheXxjbG9zZU92ZXJsYXl8Y29sbGFwc2VPYmplY3RUcmVlfGNvbGxlY3QzREVOSGlzdG9yeXxjb2xsZWN0aXZlUlREfGNvbWJhdE1vZGV8Y29tbWFuZEFydGlsbGVyeUZpcmV8Y29tbWFuZENoYXR8Y29tbWFuZGVyfGNvbW1hbmRGaXJlfGNvbW1hbmRGb2xsb3d8Y29tbWFuZEZTTXxjb21tYW5kR2V0T3V0fGNvbW1hbmRpbmdNZW51fGNvbW1hbmRNb3ZlfGNvbW1hbmRSYWRpb3xjb21tYW5kU3RvcHxjb21tYW5kU3VwcHJlc3NpdmVGaXJlfGNvbW1hbmRUYXJnZXR8Y29tbWFuZFdhdGNofGNvbW1lbnR8Y29tbWl0T3ZlcmxheXxjb21waWxlfGNvbXBpbGVGaW5hbHxjb21wbGV0ZWRGU018Y29tcG9zZVRleHR8Y29uZmlnQ2xhc3Nlc3xjb25maWdGaWxlfGNvbmZpZ0hpZXJhcmNoeXxjb25maWdOYW1lfGNvbmZpZ051bGx8Y29uZmlnUHJvcGVydGllc3xjb25maWdTb3VyY2VBZGRvbkxpc3R8Y29uZmlnU291cmNlTW9kfGNvbmZpZ1NvdXJjZU1vZExpc3R8Y29uZmlybVNlbnNvclRhcmdldHxjb25uZWN0VGVybWluYWxUb1VBVnxjb250cm9sTnVsbHxjb250cm9sc0dyb3VwQ3RybHxjb3B5RnJvbUNsaXBib2FyZHxjb3B5VG9DbGlwYm9hcmR8Y29weVdheXBvaW50c3xjb3N8Y291bnR8Y291bnRFbmVteXxjb3VudEZyaWVuZGx5fGNvdW50U2lkZXxjb3VudFR5cGV8Y291bnRVbmtub3dufGNyZWF0ZTNERU5Db21wb3NpdGlvbnxjcmVhdGUzREVORW50aXR5fGNyZWF0ZUFnZW50fGNyZWF0ZUNlbnRlcnxjcmVhdGVEaWFsb2d8Y3JlYXRlRGlhcnlMaW5rfGNyZWF0ZURpYXJ5UmVjb3JkfGNyZWF0ZURpYXJ5U3ViamVjdHxjcmVhdGVEaXNwbGF5fGNyZWF0ZUdlYXJEaWFsb2d8Y3JlYXRlR3JvdXB8Y3JlYXRlR3VhcmRlZFBvaW50fGNyZWF0ZUxvY2F0aW9ufGNyZWF0ZU1hcmtlcnxjcmVhdGVNYXJrZXJMb2NhbHxjcmVhdGVNZW51fGNyZWF0ZU1pbmV8Y3JlYXRlTWlzc2lvbkRpc3BsYXl8Y3JlYXRlTVBDYW1wYWlnbkRpc3BsYXl8Y3JlYXRlU2ltcGxlT2JqZWN0fGNyZWF0ZVNpbXBsZVRhc2t8Y3JlYXRlU2l0ZXxjcmVhdGVTb3VuZFNvdXJjZXxjcmVhdGVUYXNrfGNyZWF0ZVRlYW18Y3JlYXRlVHJpZ2dlcnxjcmVhdGVVbml0fGNyZWF0ZVZlaGljbGV8Y3JlYXRlVmVoaWNsZUNyZXd8Y3JlYXRlVmVoaWNsZUxvY2FsfGNyZXd8Y3RBZGRIZWFkZXJ8Y3RBZGRSb3d8Y3RDbGVhcnxjdEN1clNlbHxjdERhdGF8Y3RGaW5kSGVhZGVyUm93c3xjdEZpbmRSb3dIZWFkZXJ8Y3RIZWFkZXJDb250cm9sc3xjdEhlYWRlckNvdW50fGN0UmVtb3ZlSGVhZGVyc3xjdFJlbW92ZVJvd3N8Y3RybEFjdGl2YXRlfGN0cmxBZGRFdmVudEhhbmRsZXJ8Y3RybEFuZ2xlfGN0cmxBdXRvU2Nyb2xsRGVsYXl8Y3RybEF1dG9TY3JvbGxSZXdpbmR8Y3RybEF1dG9TY3JvbGxTcGVlZHxjdHJsQ2hlY2tlZHxjdHJsQ2xhc3NOYW1lfGN0cmxDb21taXR8Y3RybENvbW1pdHRlZHxjdHJsQ3JlYXRlfGN0cmxEZWxldGV8Y3RybEVuYWJsZXxjdHJsRW5hYmxlZHxjdHJsRmFkZXxjdHJsSFRNTExvYWRlZHxjdHJsSURDfGN0cmxJRER8Y3RybE1hcEFuaW1BZGR8Y3RybE1hcEFuaW1DbGVhcnxjdHJsTWFwQW5pbUNvbW1pdHxjdHJsTWFwQW5pbURvbmV8Y3RybE1hcEN1cnNvcnxjdHJsTWFwTW91c2VPdmVyfGN0cmxNYXBTY2FsZXxjdHJsTWFwU2NyZWVuVG9Xb3JsZHxjdHJsTWFwV29ybGRUb1NjcmVlbnxjdHJsTW9kZWx8Y3RybE1vZGVsRGlyQW5kVXB8Y3RybE1vZGVsU2NhbGV8Y3RybFBhcmVudHxjdHJsUGFyZW50Q29udHJvbHNHcm91cHxjdHJsUG9zaXRpb258Y3RybFJlbW92ZUFsbEV2ZW50SGFuZGxlcnN8Y3RybFJlbW92ZUV2ZW50SGFuZGxlcnxjdHJsU2NhbGV8Y3RybFNldEFjdGl2ZUNvbG9yfGN0cmxTZXRBbmdsZXxjdHJsU2V0QXV0b1Njcm9sbERlbGF5fGN0cmxTZXRBdXRvU2Nyb2xsUmV3aW5kfGN0cmxTZXRBdXRvU2Nyb2xsU3BlZWR8Y3RybFNldEJhY2tncm91bmRDb2xvcnxjdHJsU2V0Q2hlY2tlZHxjdHJsU2V0RGlzYWJsZWRDb2xvcnxjdHJsU2V0RXZlbnRIYW5kbGVyfGN0cmxTZXRGYWRlfGN0cmxTZXRGb2N1c3xjdHJsU2V0Rm9udHxjdHJsU2V0Rm9udEgxfGN0cmxTZXRGb250SDFCfGN0cmxTZXRGb250SDJ8Y3RybFNldEZvbnRIMkJ8Y3RybFNldEZvbnRIM3xjdHJsU2V0Rm9udEgzQnxjdHJsU2V0Rm9udEg0fGN0cmxTZXRGb250SDRCfGN0cmxTZXRGb250SDV8Y3RybFNldEZvbnRINUJ8Y3RybFNldEZvbnRINnxjdHJsU2V0Rm9udEg2QnxjdHJsU2V0Rm9udEhlaWdodHxjdHJsU2V0Rm9udEhlaWdodEgxfGN0cmxTZXRGb250SGVpZ2h0SDJ8Y3RybFNldEZvbnRIZWlnaHRIM3xjdHJsU2V0Rm9udEhlaWdodEg0fGN0cmxTZXRGb250SGVpZ2h0SDV8Y3RybFNldEZvbnRIZWlnaHRINnxjdHJsU2V0Rm9udEhlaWdodFNlY29uZGFyeXxjdHJsU2V0Rm9udFB8Y3RybFNldEZvbnRQQnxjdHJsU2V0Rm9udFNlY29uZGFyeXxjdHJsU2V0Rm9yZWdyb3VuZENvbG9yfGN0cmxTZXRNb2RlbHxjdHJsU2V0TW9kZWxEaXJBbmRVcHxjdHJsU2V0TW9kZWxTY2FsZXxjdHJsU2V0UGl4ZWxQcmVjaXNpb258Y3RybFNldFBvc2l0aW9ufGN0cmxTZXRTY2FsZXxjdHJsU2V0U3RydWN0dXJlZFRleHR8Y3RybFNldFRleHR8Y3RybFNldFRleHRDb2xvcnxjdHJsU2V0VGV4dENvbG9yU2Vjb25kYXJ5fGN0cmxTZXRUZXh0U2Vjb25kYXJ5fGN0cmxTZXRUb29sdGlwfGN0cmxTZXRUb29sdGlwQ29sb3JCb3h8Y3RybFNldFRvb2x0aXBDb2xvclNoYWRlfGN0cmxTZXRUb29sdGlwQ29sb3JUZXh0fGN0cmxTaG93fGN0cmxTaG93bnxjdHJsVGV4dHxjdHJsVGV4dEhlaWdodHxjdHJsVGV4dFNlY29uZGFyeXxjdHJsVGV4dFdpZHRofGN0cmxUeXBlfGN0cmxWaXNpYmxlfGN0Um93Q29udHJvbHN8Y3RSb3dDb3VudHxjdFNldEN1clNlbHxjdFNldERhdGF8Y3RTZXRIZWFkZXJUZW1wbGF0ZXxjdFNldFJvd1RlbXBsYXRlfGN0U2V0VmFsdWV8Y3RWYWx1ZXxjdXJhdG9yQWRkb25zfGN1cmF0b3JDYW1lcmF8Y3VyYXRvckNhbWVyYUFyZWF8Y3VyYXRvckNhbWVyYUFyZWFDZWlsaW5nfGN1cmF0b3JDb2VmfGN1cmF0b3JFZGl0YWJsZU9iamVjdHN8Y3VyYXRvckVkaXRpbmdBcmVhfGN1cmF0b3JFZGl0aW5nQXJlYVR5cGV8Y3VyYXRvck1vdXNlT3ZlcnxjdXJhdG9yUG9pbnRzfGN1cmF0b3JSZWdpc3RlcmVkT2JqZWN0c3xjdXJhdG9yU2VsZWN0ZWR8Y3VyYXRvcldheXBvaW50Q29zdHxjdXJyZW50M0RFTk9wZXJhdGlvbnxjdXJyZW50Q2hhbm5lbHxjdXJyZW50Q29tbWFuZHxjdXJyZW50TWFnYXppbmV8Y3VycmVudE1hZ2F6aW5lRGV0YWlsfGN1cnJlbnRNYWdhemluZURldGFpbFR1cnJldHxjdXJyZW50TWFnYXppbmVUdXJyZXR8Y3VycmVudE11enpsZXxjdXJyZW50TmFtZXNwYWNlfGN1cnJlbnRUYXNrfGN1cnJlbnRUYXNrc3xjdXJyZW50VGhyb3dhYmxlfGN1cnJlbnRWaXNpb25Nb2RlfGN1cnJlbnRXYXlwb2ludHxjdXJyZW50V2VhcG9ufGN1cnJlbnRXZWFwb25Nb2RlfGN1cnJlbnRXZWFwb25UdXJyZXR8Y3VycmVudFplcm9pbmd8Y3Vyc29yT2JqZWN0fGN1cnNvclRhcmdldHxjdXN0b21DaGF0fGN1c3RvbVJhZGlvfGN1dEZhZGVPdXR8Y3V0T2JqfGN1dFJzY3xjdXRUZXh0fGRhbWFnZXxkYXRlfGRhdGVUb051bWJlcnxkYXl0aW1lfGRlQWN0aXZhdGVLZXl8ZGVicmllZmluZ1RleHR8ZGVidWdGU018ZGVidWdMb2d8ZGVnfGRlbGV0ZTNERU5FbnRpdGllc3xkZWxldGVBdHxkZWxldGVDZW50ZXJ8ZGVsZXRlQ29sbGVjdGlvbnxkZWxldGVFZGl0b3JPYmplY3R8ZGVsZXRlR3JvdXB8ZGVsZXRlR3JvdXBXaGVuRW1wdHl8ZGVsZXRlSWRlbnRpdHl8ZGVsZXRlTG9jYXRpb258ZGVsZXRlTWFya2VyfGRlbGV0ZU1hcmtlckxvY2FsfGRlbGV0ZVJhbmdlfGRlbGV0ZVJlc291cmNlc3xkZWxldGVTaXRlfGRlbGV0ZVN0YXR1c3xkZWxldGVUZWFtfGRlbGV0ZVZlaGljbGV8ZGVsZXRlVmVoaWNsZUNyZXd8ZGVsZXRlV2F5cG9pbnR8ZGV0YWNofGRldGVjdGVkTWluZXN8ZGlhZ19hY3RpdmVNaXNzaW9uRlNNc3xkaWFnX2FjdGl2ZVNjcmlwdHN8ZGlhZ19hY3RpdmVTUUZTY3JpcHRzfGRpYWdfYWN0aXZlU1FTU2NyaXB0c3xkaWFnX2NhcHR1cmVGcmFtZXxkaWFnX2NhcHR1cmVGcmFtZVRvRmlsZXxkaWFnX2NhcHR1cmVTbG93RnJhbWV8ZGlhZ19jb2RlUGVyZm9ybWFuY2V8ZGlhZ19kcmF3TW9kZXxkaWFnX2R5bmFtaWNTaW11bGF0aW9uRW5kfGRpYWdfZW5hYmxlfGRpYWdfZW5hYmxlZHxkaWFnX2Zwc3xkaWFnX2Zwc01pbnxkaWFnX2ZyYW1lTm98ZGlhZ19saWdodE5ld0xvYWR8ZGlhZ19saXN0fGRpYWdfbG9nfGRpYWdfbG9nU2xvd0ZyYW1lfGRpYWdfbWVyZ2VDb25maWdGaWxlfGRpYWdfcmVjb3JkVHVycmV0TGltaXRzfGRpYWdfc2V0TGlnaHROZXd8ZGlhZ190aWNrVGltZXxkaWFnX3RvZ2dsZXxkaWFsb2d8ZGlhcnlTdWJqZWN0RXhpc3RzfGRpZEpJUHxkaWRKSVBPd25lcnxkaWZmaWN1bHR5fGRpZmZpY3VsdHlFbmFibGVkfGRpZmZpY3VsdHlFbmFibGVkUlREfGRpZmZpY3VsdHlPcHRpb258ZGlyZWN0aW9ufGRpcmVjdFNheXxkaXNhYmxlQUl8ZGlzYWJsZUNvbGxpc2lvbldpdGh8ZGlzYWJsZUNvbnZlcnNhdGlvbnxkaXNhYmxlRGVicmllZmluZ1N0YXRzfGRpc2FibGVNYXBJbmRpY2F0b3JzfGRpc2FibGVOVkdFcXVpcG1lbnR8ZGlzYWJsZVJlbW90ZVNlbnNvcnN8ZGlzYWJsZVNlcmlhbGl6YXRpb258ZGlzYWJsZVRJRXF1aXBtZW50fGRpc2FibGVVQVZDb25uZWN0YWJpbGl0eXxkaXNhYmxlVXNlcklucHV0fGRpc3BsYXlBZGRFdmVudEhhbmRsZXJ8ZGlzcGxheUN0cmx8ZGlzcGxheU51bGx8ZGlzcGxheVBhcmVudHxkaXNwbGF5UmVtb3ZlQWxsRXZlbnRIYW5kbGVyc3xkaXNwbGF5UmVtb3ZlRXZlbnRIYW5kbGVyfGRpc3BsYXlTZXRFdmVudEhhbmRsZXJ8ZGlzc29sdmVUZWFtfGRpc3RhbmNlfGRpc3RhbmNlMkR8ZGlzdGFuY2VTcXJ8ZGlzdHJpYnV0aW9uUmVnaW9ufGRvM0RFTkFjdGlvbnxkb0FydGlsbGVyeUZpcmV8ZG9GaXJlfGRvRm9sbG93fGRvRlNNfGRvR2V0T3V0fGRvTW92ZXxkb29yUGhhc2V8ZG9TdG9wfGRvU3VwcHJlc3NpdmVGaXJlfGRvVGFyZ2V0fGRvV2F0Y2h8ZHJhd0Fycm93fGRyYXdFbGxpcHNlfGRyYXdJY29ufGRyYXdJY29uM0R8ZHJhd0xpbmV8ZHJhd0xpbmUzRHxkcmF3TGlua3xkcmF3TG9jYXRpb258ZHJhd1BvbHlnb258ZHJhd1JlY3RhbmdsZXxkcmF3VHJpYW5nbGV8ZHJpdmVyfGRyb3B8ZHluYW1pY1NpbXVsYXRpb25EaXN0YW5jZXxkeW5hbWljU2ltdWxhdGlvbkRpc3RhbmNlQ29lZnxkeW5hbWljU2ltdWxhdGlvbkVuYWJsZWR8ZHluYW1pY1NpbXVsYXRpb25TeXN0ZW1FbmFibGVkfGVhc3R8ZWRpdDNERU5NaXNzaW9uQXR0cmlidXRlc3xlZGl0T2JqZWN0fGVkaXRvclNldEV2ZW50SGFuZGxlcnxlZmZlY3RpdmVDb21tYW5kZXJ8ZW1wdHlQb3NpdGlvbnN8ZW5hYmxlQUl8ZW5hYmxlQUlGZWF0dXJlfGVuYWJsZUFpbVByZWNpc2lvbnxlbmFibGVBdHRhY2t8ZW5hYmxlQXVkaW9GZWF0dXJlfGVuYWJsZUF1dG9TdGFydFVwUlREfGVuYWJsZUF1dG9UcmltUlREfGVuYWJsZUNhbVNoYWtlfGVuYWJsZUNhdXN0aWNzfGVuYWJsZUNoYW5uZWx8ZW5hYmxlQ29sbGlzaW9uV2l0aHxlbmFibGVDb3BpbG90fGVuYWJsZURlYnJpZWZpbmdTdGF0c3xlbmFibGVEaWFnTGVnZW5kfGVuYWJsZUR5bmFtaWNTaW11bGF0aW9ufGVuYWJsZUR5bmFtaWNTaW11bGF0aW9uU3lzdGVtfGVuYWJsZUVuZERpYWxvZ3xlbmFibGVFbmdpbmVBcnRpbGxlcnl8ZW5hYmxlRW52aXJvbm1lbnR8ZW5hYmxlRmF0aWd1ZXxlbmFibGVHdW5MaWdodHN8ZW5hYmxlSW5mb1BhbmVsQ29tcG9uZW50fGVuYWJsZUlSTGFzZXJzfGVuYWJsZU1pbWljc3xlbmFibGVQZXJzb25UdXJyZXR8ZW5hYmxlUmFkaW98ZW5hYmxlUmVsb2FkfGVuYWJsZVJvcGVBdHRhY2h8ZW5hYmxlU2F0Tm9ybWFsT25EZXRhaWx8ZW5hYmxlU2F2aW5nfGVuYWJsZVNlbnRlbmNlc3xlbmFibGVTaW11bGF0aW9ufGVuYWJsZVNpbXVsYXRpb25HbG9iYWx8ZW5hYmxlU3RhbWluYXxlbmFibGVTdHJlc3NEYW1hZ2V8ZW5hYmxlVGVhbVN3aXRjaHxlbmFibGVUcmFmZmljfGVuYWJsZVVBVkNvbm5lY3RhYmlsaXR5fGVuYWJsZVVBVldheXBvaW50c3xlbmFibGVWZWhpY2xlQ2FyZ298ZW5hYmxlVmVoaWNsZVNlbnNvcnxlbmFibGVXZWFwb25EaXNhc3NlbWJseXxlbmRsfGVuZExvYWRpbmdTY3JlZW58ZW5kTWlzc2lvbnxlbmdpbmVPbnxlbmdpbmVzSXNPblJURHxlbmdpbmVzUG93ZXJSVER8ZW5naW5lc1JwbVJURHxlbmdpbmVzVG9ycXVlUlREfGVudGl0aWVzfGVudmlyb25tZW50RW5hYmxlZHxlc3RpbWF0ZWRFbmRTZXJ2ZXJUaW1lfGVzdGltYXRlZFRpbWVMZWZ0fGV2YWxPYmplY3RBcmd1bWVudHxldmVyeUJhY2twYWNrfGV2ZXJ5Q29udGFpbmVyfGV4ZWN8ZXhlY0VkaXRvclNjcmlwdHxleHB8ZXhwZWN0ZWREZXN0aW5hdGlvbnxleHBvcnRKSVBNZXNzYWdlc3xleWVEaXJlY3Rpb258ZXllUG9zfGZhY2V8ZmFjdGlvbnxmYWRlTXVzaWN8ZmFkZVJhZGlvfGZhZGVTb3VuZHxmYWRlU3BlZWNofGZhaWxNaXNzaW9ufGZpbGxXZWFwb25zRnJvbVBvb2x8ZmluZHxmaW5kQ292ZXJ8ZmluZERpc3BsYXl8ZmluZEVkaXRvck9iamVjdHxmaW5kRW1wdHlQb3NpdGlvbnxmaW5kRW1wdHlQb3NpdGlvblJlYWR5fGZpbmRJZnxmaW5kTmVhcmVzdEVuZW15fGZpbmlzaE1pc3Npb25Jbml0fGZpbml0ZXxmaXJlfGZpcmVBdFRhcmdldHxmaXJzdEJhY2twYWNrfGZsYWd8ZmxhZ0FuaW1hdGlvblBoYXNlfGZsYWdPd25lcnxmbGFnU2lkZXxmbGFnVGV4dHVyZXxmbGVlaW5nfGZsb29yfGZseUluSGVpZ2h0fGZseUluSGVpZ2h0QVNMfGZvZ3xmb2dGb3JlY2FzdHxmb2dQYXJhbXN8Zm9yY2VBZGRVbmlmb3JtfGZvcmNlQXRQb3NpdGlvblJURHxmb3JjZWRNYXB8Zm9yY2VFbmR8Zm9yY2VGbGFnVGV4dHVyZXxmb3JjZUZvbGxvd1JvYWR8Zm9yY2VHZW5lcmF0b3JSVER8Zm9yY2VNYXB8Zm9yY2VSZXNwYXdufGZvcmNlU3BlZWR8Zm9yY2VXYWxrfGZvcmNlV2VhcG9uRmlyZXxmb3JjZVdlYXRoZXJDaGFuZ2V8Zm9yZ2V0VGFyZ2V0fGZvcm1hdHxmb3JtYXRpb258Zm9ybWF0aW9uRGlyZWN0aW9ufGZvcm1hdGlvbkxlYWRlcnxmb3JtYXRpb25NZW1iZXJzfGZvcm1hdGlvblBvc2l0aW9ufGZvcm1hdGlvblRhc2t8Zm9ybWF0VGV4dHxmb3JtTGVhZGVyfGZyZWVMb29rfGZyb21FZGl0b3J8ZnVlbHxmdWxsQ3Jld3xnZWFySURDQW1tb0NvdW50fGdlYXJTbG90QW1tb0NvdW50fGdlYXJTbG90RGF0YXxnZXQzREVOQWN0aW9uU3RhdGV8Z2V0M0RFTkF0dHJpYnV0ZXxnZXQzREVOQ2FtZXJhfGdldDNERU5Db25uZWN0aW9uc3xnZXQzREVORW50aXR5fGdldDNERU5FbnRpdHlJRHxnZXQzREVOR3JpZHxnZXQzREVOSWNvbnNWaXNpYmxlfGdldDNERU5MYXllckVudGl0aWVzfGdldDNERU5MaW5lc1Zpc2libGV8Z2V0M0RFTk1pc3Npb25BdHRyaWJ1dGV8Z2V0M0RFTk1vdXNlT3ZlcnxnZXQzREVOU2VsZWN0ZWR8Z2V0QWltaW5nQ29lZnxnZXRBbGxFbnZTb3VuZENvbnRyb2xsZXJzfGdldEFsbEhpdFBvaW50c0RhbWFnZXxnZXRBbGxPd25lZE1pbmVzfGdldEFsbFNvdW5kQ29udHJvbGxlcnN8Z2V0QW1tb0NhcmdvfGdldEFuaW1BaW1QcmVjaXNpb258Z2V0QW5pbVNwZWVkQ29lZnxnZXRBcnJheXxnZXRBcnRpbGxlcnlBbW1vfGdldEFydGlsbGVyeUNvbXB1dGVyU2V0dGluZ3N8Z2V0QXJ0aWxsZXJ5RVRBfGdldEFzc2lnbmVkQ3VyYXRvckxvZ2ljfGdldEFzc2lnbmVkQ3VyYXRvclVuaXR8Z2V0QmFja3BhY2tDYXJnb3xnZXRCbGVlZGluZ1JlbWFpbmluZ3xnZXRCdXJuaW5nVmFsdWV8Z2V0Q2FtZXJhVmlld0RpcmVjdGlvbnxnZXRDYXJnb0luZGV4fGdldENlbnRlck9mTWFzc3xnZXRDbGllbnRTdGF0ZXxnZXRDbGllbnRTdGF0ZU51bWJlcnxnZXRDb21wYXRpYmxlUHlsb25NYWdhemluZXN8Z2V0Q29ubmVjdGVkVUFWfGdldENvbnRhaW5lck1heExvYWR8Z2V0Q3Vyc29yT2JqZWN0UGFyYW1zfGdldEN1c3RvbUFpbUNvZWZ8Z2V0RGFtbWFnZXxnZXREZXNjcmlwdGlvbnxnZXREaXJ8Z2V0RGlyVmlzdWFsfGdldERMQ0Fzc2V0c1VzYWdlfGdldERMQ0Fzc2V0c1VzYWdlQnlOYW1lfGdldERMQ3N8Z2V0RExDVXNhZ2VUaW1lfGdldEVkaXRvckNhbWVyYXxnZXRFZGl0b3JNb2RlfGdldEVkaXRvck9iamVjdFNjb3BlfGdldEVsZXZhdGlvbk9mZnNldHxnZXRFbmdpbmVUYXJnZXRScG1SVER8Z2V0RW52U291bmRDb250cm9sbGVyfGdldEZhdGlndWV8Z2V0RmllbGRNYW51YWxTdGFydFBhZ2V8Z2V0Rm9yY2VkRmxhZ1RleHR1cmV8Z2V0RnJpZW5kfGdldEZTTVZhcmlhYmxlfGdldEZ1ZWxDYXJnb3xnZXRHcm91cEljb258Z2V0R3JvdXBJY29uUGFyYW1zfGdldEdyb3VwSWNvbnN8Z2V0SGlkZUZyb218Z2V0SGl0fGdldEhpdEluZGV4fGdldEhpdFBvaW50RGFtYWdlfGdldEl0ZW1DYXJnb3xnZXRNYWdhemluZUNhcmdvfGdldE1hcmtlckNvbG9yfGdldE1hcmtlclBvc3xnZXRNYXJrZXJTaXplfGdldE1hcmtlclR5cGV8Z2V0TWFzc3xnZXRNaXNzaW9uQ29uZmlnfGdldE1pc3Npb25Db25maWdWYWx1ZXxnZXRNaXNzaW9uRExDc3xnZXRNaXNzaW9uTGF5ZXJFbnRpdGllc3xnZXRNaXNzaW9uTGF5ZXJzfGdldE1vZGVsSW5mb3xnZXRNb3VzZVBvc2l0aW9ufGdldE11c2ljUGxheWVkVGltZXxnZXROdW1iZXJ8Z2V0T2JqZWN0QXJndW1lbnR8Z2V0T2JqZWN0Q2hpbGRyZW58Z2V0T2JqZWN0RExDfGdldE9iamVjdE1hdGVyaWFsc3xnZXRPYmplY3RQcm94eXxnZXRPYmplY3RUZXh0dXJlc3xnZXRPYmplY3RUeXBlfGdldE9iamVjdFZpZXdEaXN0YW5jZXxnZXRPeHlnZW5SZW1haW5pbmd8Z2V0UGVyc29uVXNlZERMQ3N8Z2V0UGlsb3RDYW1lcmFEaXJlY3Rpb258Z2V0UGlsb3RDYW1lcmFQb3NpdGlvbnxnZXRQaWxvdENhbWVyYVJvdGF0aW9ufGdldFBpbG90Q2FtZXJhVGFyZ2V0fGdldFBsYXRlTnVtYmVyfGdldFBsYXllckNoYW5uZWx8Z2V0UGxheWVyU2NvcmVzfGdldFBsYXllclVJRHxnZXRQbGF5ZXJVSURPbGR8Z2V0UG9zfGdldFBvc0FTTHxnZXRQb3NBU0xWaXN1YWx8Z2V0UG9zQVNMV3xnZXRQb3NBVEx8Z2V0UG9zQVRMVmlzdWFsfGdldFBvc1Zpc3VhbHxnZXRQb3NXb3JsZHxnZXRQeWxvbk1hZ2F6aW5lc3xnZXRSZWxEaXJ8Z2V0UmVsUG9zfGdldFJlbW90ZVNlbnNvcnNEaXNhYmxlZHxnZXRSZXBhaXJDYXJnb3xnZXRSZXNvbHV0aW9ufGdldFJvdG9yQnJha2VSVER8Z2V0U2hhZG93RGlzdGFuY2V8Z2V0U2hvdFBhcmVudHN8Z2V0U2xpbmdMb2FkfGdldFNvdW5kQ29udHJvbGxlcnxnZXRTb3VuZENvbnRyb2xsZXJSZXN1bHR8Z2V0U3BlZWR8Z2V0U3RhbWluYXxnZXRTdGF0VmFsdWV8Z2V0U3VwcHJlc3Npb258Z2V0VGVycmFpbkdyaWR8Z2V0VGVycmFpbkhlaWdodEFTTHxnZXRUZXh0fGdldFRvdGFsRExDVXNhZ2VUaW1lfGdldFRyaW1PZmZzZXRSVER8Z2V0VW5pdExvYWRvdXR8Z2V0VW5pdFRyYWl0fGdldFVzZXJNRkRUZXh0fGdldFVzZXJNRkRWYWx1ZXxnZXRWYXJpYWJsZXxnZXRWZWhpY2xlQ2FyZ298Z2V0V2VhcG9uQ2FyZ298Z2V0V2VhcG9uU3dheXxnZXRXaW5nc09yaWVudGF0aW9uUlREfGdldFdpbmdzUG9zaXRpb25SVER8Z2V0V1BQb3N8Z2xhbmNlQXR8Z2xvYmFsQ2hhdHxnbG9iYWxSYWRpb3xnb2dnbGVzfGdyb3VwfGdyb3VwQ2hhdHxncm91cEZyb21OZXRJZHxncm91cEljb25TZWxlY3RhYmxlfGdyb3VwSWNvbnNWaXNpYmxlfGdyb3VwSWR8Z3JvdXBPd25lcnxncm91cFJhZGlvfGdyb3VwU2VsZWN0ZWRVbml0c3xncm91cFNlbGVjdFVuaXR8Z3JwTnVsbHxndW5uZXJ8Z3VzdHN8aGFsdHxoYW5kZ3VuSXRlbXN8aGFuZGd1bk1hZ2F6aW5lfGhhbmRndW5XZWFwb258aGFuZHNIaXR8aGFzSW50ZXJmYWNlfGhhc1BpbG90Q2FtZXJhfGhhc1dlYXBvbnxoY0FsbEdyb3Vwc3xoY0dyb3VwUGFyYW1zfGhjTGVhZGVyfGhjUmVtb3ZlQWxsR3JvdXBzfGhjUmVtb3ZlR3JvdXB8aGNTZWxlY3RlZHxoY1NlbGVjdEdyb3VwfGhjU2V0R3JvdXB8aGNTaG93QmFyfGhjU2hvd25CYXJ8aGVhZGdlYXJ8aGlkZUJvZHl8aGlkZU9iamVjdHxoaWRlT2JqZWN0R2xvYmFsfGhpZGVTZWxlY3Rpb258aGludHxoaW50Q3xoaW50Q2FkZXR8aGludFNpbGVudHxobWR8aG9zdE1pc3Npb258aHRtbExvYWR8SFVETW92ZW1lbnRMZXZlbHN8aHVtaWRpdHl8aW1hZ2V8aW1wb3J0QWxsR3JvdXBzfGltcG9ydGFuY2V8aW58aW5BcmVhfGluQXJlYUFycmF5fGluY2FwYWNpdGF0ZWRTdGF0ZXxpbmRlcGVuZGVudHxpbmZsYW1lfGluZmxhbWVkfGluZm9QYW5lbHxpbmZvUGFuZWxDb21wb25lbnRFbmFibGVkfGluZm9QYW5lbENvbXBvbmVudHN8aW5mb1BhbmVsc3xpbkdhbWVVSVNldEV2ZW50SGFuZGxlcnxpbmhlcml0c0Zyb218aW5pdEFtYmllbnRMaWZlfGluUG9seWdvbnxpbnB1dEFjdGlvbnxpblJhbmdlT2ZBcnRpbGxlcnl8aW5zZXJ0RWRpdG9yT2JqZWN0fGludGVyc2VjdHxpczNERU58aXMzREVOTXVsdGlwbGF5ZXJ8aXNBYmxlVG9CcmVhdGhlfGlzQWdlbnR8aXNBaW1QcmVjaXNpb25FbmFibGVkfGlzQXJyYXl8aXNBdXRvSG92ZXJPbnxpc0F1dG9ub21vdXN8aXNBdXRvU3RhcnRVcEVuYWJsZWRSVER8aXNBdXRvdGVzdHxpc0F1dG9UcmltT25SVER8aXNCbGVlZGluZ3xpc0J1cm5pbmd8aXNDbGFzc3xpc0NvbGxpc2lvbkxpZ2h0T258aXNDb3BpbG90RW5hYmxlZHxpc0RhbWFnZUFsbG93ZWR8aXNEZWRpY2F0ZWR8aXNETENBdmFpbGFibGV8aXNFbmdpbmVPbnxpc0VxdWFsVG98aXNFcXVhbFR5cGV8aXNFcXVhbFR5cGVBbGx8aXNFcXVhbFR5cGVBbnl8aXNFcXVhbFR5cGVBcnJheXxpc0VxdWFsVHlwZVBhcmFtc3xpc0ZpbGVQYXRjaGluZ0VuYWJsZWR8aXNGbGFzaGxpZ2h0T258aXNGbGF0RW1wdHl8aXNGb3JjZWRXYWxrfGlzRm9ybWF0aW9uTGVhZGVyfGlzR3JvdXBEZWxldGVkV2hlbkVtcHR5fGlzSGlkZGVufGlzSW5SZW1haW5zQ29sbGVjdG9yfGlzSW5zdHJ1Y3RvckZpZ3VyZUVuYWJsZWR8aXNJUkxhc2VyT258aXNLZXlBY3RpdmV8aXNLaW5kT2Z8aXNMYXNlck9ufGlzTGlnaHRPbnxpc0xvY2FsaXplZHxpc01hbnVhbEZpcmV8aXNNYXJrZWRGb3JDb2xsZWN0aW9ufGlzTXVsdGlwbGF5ZXJ8aXNNdWx0aXBsYXllclNvbG98aXNOaWx8aXNOdWxsfGlzTnVtYmVyfGlzT2JqZWN0SGlkZGVufGlzT2JqZWN0UlREfGlzT25Sb2FkfGlzUGlwRW5hYmxlZHxpc1BsYXllcnxpc1JlYWxUaW1lfGlzUmVtb3RlRXhlY3V0ZWR8aXNSZW1vdGVFeGVjdXRlZEpJUHxpc1NlcnZlcnxpc1Nob3dpbmczREljb25zfGlzU2ltcGxlT2JqZWN0fGlzU3ByaW50QWxsb3dlZHxpc1N0YW1pbmFFbmFibGVkfGlzU3RlYW1NaXNzaW9ufGlzU3RyZWFtRnJpZW5kbHlVSUVuYWJsZWR8aXNTdHJlc3NEYW1hZ2VFbmFibGVkfGlzVGV4dHxpc1RvdWNoaW5nR3JvdW5kfGlzVHVybmVkT3V0fGlzVHV0SGludHNFbmFibGVkfGlzVUFWQ29ubmVjdGFibGV8aXNVQVZDb25uZWN0ZWR8aXNVSUNvbnRleHR8aXNVbmlmb3JtQWxsb3dlZHxpc1ZlaGljbGVDYXJnb3xpc1ZlaGljbGVSYWRhck9ufGlzVmVoaWNsZVNlbnNvckVuYWJsZWR8aXNXYWxraW5nfGlzV2VhcG9uRGVwbG95ZWR8aXNXZWFwb25SZXN0ZWR8aXRlbUNhcmdvfGl0ZW1zfGl0ZW1zV2l0aE1hZ2F6aW5lc3xqb2lufGpvaW5Bc3xqb2luQXNTaWxlbnR8am9pblNpbGVudHxqb2luU3RyaW5nfGtiQWRkRGF0YWJhc2V8a2JBZGREYXRhYmFzZVRhcmdldHN8a2JBZGRUb3BpY3xrYkhhc1RvcGljfGtiUmVhY3R8a2JSZW1vdmVUb3BpY3xrYlRlbGx8a2JXYXNTYWlkfGtleUltYWdlfGtleU5hbWV8a25vd3NBYm91dHxsYW5kfGxhbmRBdHxsYW5kUmVzdWx0fGxhbmd1YWdlfGxhc2VyVGFyZ2V0fGxiQWRkfGxiQ2xlYXJ8bGJDb2xvcnxsYkNvbG9yUmlnaHR8bGJDdXJTZWx8bGJEYXRhfGxiRGVsZXRlfGxiSXNTZWxlY3RlZHxsYlBpY3R1cmV8bGJQaWN0dXJlUmlnaHR8bGJTZWxlY3Rpb258bGJTZXRDb2xvcnxsYlNldENvbG9yUmlnaHR8bGJTZXRDdXJTZWx8bGJTZXREYXRhfGxiU2V0UGljdHVyZXxsYlNldFBpY3R1cmVDb2xvcnxsYlNldFBpY3R1cmVDb2xvckRpc2FibGVkfGxiU2V0UGljdHVyZUNvbG9yU2VsZWN0ZWR8bGJTZXRQaWN0dXJlUmlnaHR8bGJTZXRQaWN0dXJlUmlnaHRDb2xvcnxsYlNldFBpY3R1cmVSaWdodENvbG9yRGlzYWJsZWR8bGJTZXRQaWN0dXJlUmlnaHRDb2xvclNlbGVjdGVkfGxiU2V0U2VsZWN0Q29sb3J8bGJTZXRTZWxlY3RDb2xvclJpZ2h0fGxiU2V0U2VsZWN0ZWR8bGJTZXRUZXh0fGxiU2V0VGV4dFJpZ2h0fGxiU2V0VG9vbHRpcHxsYlNldFZhbHVlfGxiU2l6ZXxsYlNvcnR8bGJTb3J0QnlWYWx1ZXxsYlRleHR8bGJUZXh0UmlnaHR8bGJWYWx1ZXxsZWFkZXJ8bGVhZGVyYm9hcmREZUluaXR8bGVhZGVyYm9hcmRHZXRSb3dzfGxlYWRlcmJvYXJkSW5pdHxsZWFkZXJib2FyZFJlcXVlc3RSb3dzRnJpZW5kc3xsZWFkZXJib2FyZFJlcXVlc3RSb3dzR2xvYmFsfGxlYWRlcmJvYXJkUmVxdWVzdFJvd3NHbG9iYWxBcm91bmRVc2VyfGxlYWRlcmJvYXJkc1JlcXVlc3RVcGxvYWRTY29yZXxsZWFkZXJib2FyZHNSZXF1ZXN0VXBsb2FkU2NvcmVLZWVwQmVzdHxsZWFkZXJib2FyZFN0YXRlfGxlYXZlVmVoaWNsZXxsaWJyYXJ5Q3JlZGl0c3xsaWJyYXJ5RGlzY2xhaW1lcnN8bGlmZVN0YXRlfGxpZ2h0QXR0YWNoT2JqZWN0fGxpZ2h0RGV0YWNoT2JqZWN0fGxpZ2h0SXNPbnxsaWdodG5pbmdzfGxpbWl0U3BlZWR8bGluZWFyQ29udmVyc2lvbnxsaW5lQnJlYWt8bGluZUludGVyc2VjdHN8bGluZUludGVyc2VjdHNPYmpzfGxpbmVJbnRlcnNlY3RzU3VyZmFjZXN8bGluZUludGVyc2VjdHNXaXRofGxpbmtJdGVtfGxpc3R8bGlzdE9iamVjdHN8bGlzdFJlbW90ZVRhcmdldHN8bGlzdFZlaGljbGVTZW5zb3JzfGxufGxuYkFkZEFycmF5fGxuYkFkZENvbHVtbnxsbmJBZGRSb3d8bG5iQ2xlYXJ8bG5iQ29sb3J8bG5iQ29sb3JSaWdodHxsbmJDdXJTZWxSb3d8bG5iRGF0YXxsbmJEZWxldGVDb2x1bW58bG5iRGVsZXRlUm93fGxuYkdldENvbHVtbnNQb3NpdGlvbnxsbmJQaWN0dXJlfGxuYlBpY3R1cmVSaWdodHxsbmJTZXRDb2xvcnxsbmJTZXRDb2xvclJpZ2h0fGxuYlNldENvbHVtbnNQb3N8bG5iU2V0Q3VyU2VsUm93fGxuYlNldERhdGF8bG5iU2V0UGljdHVyZXxsbmJTZXRQaWN0dXJlQ29sb3J8bG5iU2V0UGljdHVyZUNvbG9yUmlnaHR8bG5iU2V0UGljdHVyZUNvbG9yU2VsZWN0ZWR8bG5iU2V0UGljdHVyZUNvbG9yU2VsZWN0ZWRSaWdodHxsbmJTZXRQaWN0dXJlUmlnaHR8bG5iU2V0VGV4dHxsbmJTZXRUZXh0UmlnaHR8bG5iU2V0VmFsdWV8bG5iU2l6ZXxsbmJTb3J0fGxuYlNvcnRCeVZhbHVlfGxuYlRleHR8bG5iVGV4dFJpZ2h0fGxuYlZhbHVlfGxvYWR8bG9hZEFic3xsb2FkQmFja3BhY2t8bG9hZEZpbGV8bG9hZEdhbWV8bG9hZElkZW50aXR5fGxvYWRNYWdhemluZXxsb2FkT3ZlcmxheXxsb2FkU3RhdHVzfGxvYWRVbmlmb3JtfGxvYWRWZXN0fGxvY2FsfGxvY2FsaXplfGxvY2F0aW9uTnVsbHxsb2NhdGlvblBvc2l0aW9ufGxvY2t8bG9ja0NhbWVyYVRvfGxvY2tDYXJnb3xsb2NrRHJpdmVyfGxvY2tlZHxsb2NrZWRDYXJnb3xsb2NrZWREcml2ZXJ8bG9ja2VkVHVycmV0fGxvY2tJZGVudGl0eXxsb2NrVHVycmV0fGxvY2tXUHxsb2d8bG9nRW50aXRpZXN8bG9nTmV0d29ya3xsb2dOZXR3b3JrVGVybWluYXRlfGxvb2tBdHxsb29rQXRQb3N8bWFnYXppbmVDYXJnb3xtYWdhemluZXN8bWFnYXppbmVzQWxsVHVycmV0c3xtYWdhemluZXNBbW1vfG1hZ2F6aW5lc0FtbW9DYXJnb3xtYWdhemluZXNBbW1vRnVsbHxtYWdhemluZXNEZXRhaWx8bWFnYXppbmVzRGV0YWlsQmFja3BhY2t8bWFnYXppbmVzRGV0YWlsVW5pZm9ybXxtYWdhemluZXNEZXRhaWxWZXN0fG1hZ2F6aW5lc1R1cnJldHxtYWdhemluZVR1cnJldEFtbW98bWFwQW5pbUFkZHxtYXBBbmltQ2xlYXJ8bWFwQW5pbUNvbW1pdHxtYXBBbmltRG9uZXxtYXBDZW50ZXJPbkNhbWVyYXxtYXBHcmlkUG9zaXRpb258bWFya0FzRmluaXNoZWRPblN0ZWFtfG1hcmtlckFscGhhfG1hcmtlckJydXNofG1hcmtlckNvbG9yfG1hcmtlckRpcnxtYXJrZXJQb3N8bWFya2VyU2hhcGV8bWFya2VyU2l6ZXxtYXJrZXJUZXh0fG1hcmtlclR5cGV8bWF4fG1lbWJlcnN8bWVudUFjdGlvbnxtZW51QWRkfG1lbnVDaGVja2VkfG1lbnVDbGVhcnxtZW51Q29sbGFwc2V8bWVudURhdGF8bWVudURlbGV0ZXxtZW51RW5hYmxlfG1lbnVFbmFibGVkfG1lbnVFeHBhbmR8bWVudUhvdmVyfG1lbnVQaWN0dXJlfG1lbnVTZXRBY3Rpb258bWVudVNldENoZWNrfG1lbnVTZXREYXRhfG1lbnVTZXRQaWN0dXJlfG1lbnVTZXRWYWx1ZXxtZW51U2hvcnRjdXR8bWVudVNob3J0Y3V0VGV4dHxtZW51U2l6ZXxtZW51U29ydHxtZW51VGV4dHxtZW51VVJMfG1lbnVWYWx1ZXxtaW58bWluZUFjdGl2ZXxtaW5lRGV0ZWN0ZWRCeXxtaXNzaW9uQ29uZmlnRmlsZXxtaXNzaW9uRGlmZmljdWx0eXxtaXNzaW9uTmFtZXxtaXNzaW9uTmFtZXNwYWNlfG1pc3Npb25TdGFydHxtaXNzaW9uVmVyc2lvbnxtb2RlbFRvV29ybGR8bW9kZWxUb1dvcmxkVmlzdWFsfG1vZGVsVG9Xb3JsZFZpc3VhbFdvcmxkfG1vZGVsVG9Xb3JsZFdvcmxkfG1vZFBhcmFtc3xtb29uSW50ZW5zaXR5fG1vb25QaGFzZXxtb3JhbGV8bW92ZXxtb3ZlM0RFTkNhbWVyYXxtb3ZlSW5Bbnl8bW92ZUluQ2FyZ298bW92ZUluQ29tbWFuZGVyfG1vdmVJbkRyaXZlcnxtb3ZlSW5HdW5uZXJ8bW92ZUluVHVycmV0fG1vdmVPYmplY3RUb0VuZHxtb3ZlT3V0fG1vdmVUaW1lfG1vdmVUb3xtb3ZlVG9Db21wbGV0ZWR8bW92ZVRvRmFpbGVkfG11c2ljVm9sdW1lfG5hbWV8bmFtZVNvdW5kfG5lYXJFbnRpdGllc3xuZWFyZXN0QnVpbGRpbmd8bmVhcmVzdExvY2F0aW9ufG5lYXJlc3RMb2NhdGlvbnN8bmVhcmVzdExvY2F0aW9uV2l0aER1YmJpbmd8bmVhcmVzdE9iamVjdHxuZWFyZXN0T2JqZWN0c3xuZWFyZXN0VGVycmFpbk9iamVjdHN8bmVhck9iamVjdHN8bmVhck9iamVjdHNSZWFkeXxuZWFyUm9hZHN8bmVhclN1cHBsaWVzfG5lYXJUYXJnZXRzfG5lZWRSZWxvYWR8bmV0SWR8bmV0T2JqTnVsbHxuZXdPdmVybGF5fG5leHRNZW51SXRlbUluZGV4fG5leHRXZWF0aGVyQ2hhbmdlfG5NZW51SXRlbXN8bnVtYmVyT2ZFbmdpbmVzUlREfG51bWJlclRvRGF0ZXxvYmplY3RDdXJhdG9yc3xvYmplY3RGcm9tTmV0SWR8b2JqZWN0UGFyZW50fG9iak51bGx8b2JqU3RhdHVzfG9uQnJpZWZpbmdHZWFyfG9uQnJpZWZpbmdHcm91cHxvbkJyaWVmaW5nTm90ZXN8b25CcmllZmluZ1BsYW58b25CcmllZmluZ1RlYW1Td2l0Y2h8b25Db21tYW5kTW9kZUNoYW5nZWR8b25Eb3VibGVDbGlja3xvbkVhY2hGcmFtZXxvbkdyb3VwSWNvbkNsaWNrfG9uR3JvdXBJY29uT3ZlckVudGVyfG9uR3JvdXBJY29uT3ZlckxlYXZlfG9uSENHcm91cFNlbGVjdGlvbkNoYW5nZWR8b25NYXBTaW5nbGVDbGlja3xvblBsYXllckNvbm5lY3RlZHxvblBsYXllckRpc2Nvbm5lY3RlZHxvblByZWxvYWRGaW5pc2hlZHxvblByZWxvYWRTdGFydGVkfG9uU2hvd05ld09iamVjdHxvblRlYW1Td2l0Y2h8b3BlbkN1cmF0b3JJbnRlcmZhY2V8b3BlbkRMQ1BhZ2V8b3BlbkRTSW50ZXJmYWNlfG9wZW5NYXB8b3BlblN0ZWFtQXBwfG9wZW5Zb3V0dWJlVmlkZW98b3Bmb3J8b3JkZXJHZXRJbnxvdmVyY2FzdHxvdmVyY2FzdEZvcmVjYXN0fG93bmVyfHBhcmFtfHBhcmFtc3xwYXJzZU51bWJlcnxwYXJzZVNpbXBsZUFycmF5fHBhcnNlVGV4dHxwYXJzaW5nTmFtZXNwYWNlfHBhcnRpY2xlc1F1YWxpdHl8cGl8cGlja1dlYXBvblBvb2x8cGl0Y2h8cGl4ZWxHcmlkfHBpeGVsR3JpZEJhc2V8cGl4ZWxHcmlkTm9VSVNjYWxlfHBpeGVsSHxwaXhlbFd8cGxheWFibGVTbG90c051bWJlcnxwbGF5YWJsZVVuaXRzfHBsYXlBY3Rpb258cGxheUFjdGlvbk5vd3xwbGF5ZXJ8cGxheWVyUmVzcGF3blRpbWV8cGxheWVyU2lkZXxwbGF5ZXJzTnVtYmVyfHBsYXlHZXN0dXJlfHBsYXlNaXNzaW9ufHBsYXlNb3ZlfHBsYXlNb3ZlTm93fHBsYXlNdXNpY3xwbGF5U2NyaXB0ZWRNaXNzaW9ufHBsYXlTb3VuZHxwbGF5U291bmQzRHxwb3NpdGlvbnxwb3NpdGlvbkNhbWVyYVRvV29ybGR8cG9zU2NyZWVuVG9Xb3JsZHxwb3NXb3JsZFRvU2NyZWVufHBwRWZmZWN0QWRqdXN0fHBwRWZmZWN0Q29tbWl0fHBwRWZmZWN0Q29tbWl0dGVkfHBwRWZmZWN0Q3JlYXRlfHBwRWZmZWN0RGVzdHJveXxwcEVmZmVjdEVuYWJsZXxwcEVmZmVjdEVuYWJsZWR8cHBFZmZlY3RGb3JjZUluTlZHfHByZWNpc2lvbnxwcmVsb2FkQ2FtZXJhfHByZWxvYWRPYmplY3R8cHJlbG9hZFNvdW5kfHByZWxvYWRUaXRsZU9ianxwcmVsb2FkVGl0bGVSc2N8cHJpbWFyeVdlYXBvbnxwcmltYXJ5V2VhcG9uSXRlbXN8cHJpbWFyeVdlYXBvbk1hZ2F6aW5lfHByaW9yaXR5fHByb2Nlc3NEaWFyeUxpbmt8cHJvY2Vzc0luaXRDb21tYW5kc3xwcm9kdWN0VmVyc2lvbnxwcm9maWxlTmFtZXxwcm9maWxlTmFtZXNwYWNlfHByb2ZpbGVOYW1lU3RlYW18cHJvZ3Jlc3NMb2FkaW5nU2NyZWVufHByb2dyZXNzUG9zaXRpb258cHJvZ3Jlc3NTZXRQb3NpdGlvbnxwdWJsaWNWYXJpYWJsZXxwdWJsaWNWYXJpYWJsZUNsaWVudHxwdWJsaWNWYXJpYWJsZVNlcnZlcnxwdXNoQmFja3xwdXNoQmFja1VuaXF1ZXxwdXRXZWFwb25Qb29sfHF1ZXJ5SXRlbXNQb29sfHF1ZXJ5TWFnYXppbmVQb29sfHF1ZXJ5V2VhcG9uUG9vbHxyYWR8cmFkaW9DaGFubmVsQWRkfHJhZGlvQ2hhbm5lbENyZWF0ZXxyYWRpb0NoYW5uZWxSZW1vdmV8cmFkaW9DaGFubmVsU2V0Q2FsbFNpZ258cmFkaW9DaGFubmVsU2V0TGFiZWx8cmFkaW9Wb2x1bWV8cmFpbnxyYWluYm93fHJhbmRvbXxyYW5rfHJhbmtJZHxyYXRpbmd8cmVjdGFuZ3VsYXJ8cmVnaXN0ZXJlZFRhc2tzfHJlZ2lzdGVyVGFza3xyZWxvYWR8cmVsb2FkRW5hYmxlZHxyZW1vdGVDb250cm9sfHJlbW90ZUV4ZWN8cmVtb3RlRXhlY0NhbGx8cmVtb3RlRXhlY3V0ZWRPd25lcnxyZW1vdmUzREVOQ29ubmVjdGlvbnxyZW1vdmUzREVORXZlbnRIYW5kbGVyfHJlbW92ZTNERU5MYXllcnxyZW1vdmVBY3Rpb258cmVtb3ZlQWxsM0RFTkV2ZW50SGFuZGxlcnN8cmVtb3ZlQWxsQWN0aW9uc3xyZW1vdmVBbGxBc3NpZ25lZEl0ZW1zfHJlbW92ZUFsbENvbnRhaW5lcnN8cmVtb3ZlQWxsQ3VyYXRvckFkZG9uc3xyZW1vdmVBbGxDdXJhdG9yQ2FtZXJhQXJlYXN8cmVtb3ZlQWxsQ3VyYXRvckVkaXRpbmdBcmVhc3xyZW1vdmVBbGxFdmVudEhhbmRsZXJzfHJlbW92ZUFsbEhhbmRndW5JdGVtc3xyZW1vdmVBbGxJdGVtc3xyZW1vdmVBbGxJdGVtc1dpdGhNYWdhemluZXN8cmVtb3ZlQWxsTWlzc2lvbkV2ZW50SGFuZGxlcnN8cmVtb3ZlQWxsTVBFdmVudEhhbmRsZXJzfHJlbW92ZUFsbE11c2ljRXZlbnRIYW5kbGVyc3xyZW1vdmVBbGxPd25lZE1pbmVzfHJlbW92ZUFsbFByaW1hcnlXZWFwb25JdGVtc3xyZW1vdmVBbGxXZWFwb25zfHJlbW92ZUJhY2twYWNrfHJlbW92ZUJhY2twYWNrR2xvYmFsfHJlbW92ZUN1cmF0b3JBZGRvbnN8cmVtb3ZlQ3VyYXRvckNhbWVyYUFyZWF8cmVtb3ZlQ3VyYXRvckVkaXRhYmxlT2JqZWN0c3xyZW1vdmVDdXJhdG9yRWRpdGluZ0FyZWF8cmVtb3ZlRHJhd0ljb258cmVtb3ZlRHJhd0xpbmtzfHJlbW92ZUV2ZW50SGFuZGxlcnxyZW1vdmVGcm9tUmVtYWluc0NvbGxlY3RvcnxyZW1vdmVHb2dnbGVzfHJlbW92ZUdyb3VwSWNvbnxyZW1vdmVIYW5kZ3VuSXRlbXxyZW1vdmVIZWFkZ2VhcnxyZW1vdmVJdGVtfHJlbW92ZUl0ZW1Gcm9tQmFja3BhY2t8cmVtb3ZlSXRlbUZyb21Vbmlmb3JtfHJlbW92ZUl0ZW1Gcm9tVmVzdHxyZW1vdmVJdGVtc3xyZW1vdmVNYWdhemluZXxyZW1vdmVNYWdhemluZUdsb2JhbHxyZW1vdmVNYWdhemluZXN8cmVtb3ZlTWFnYXppbmVzVHVycmV0fHJlbW92ZU1hZ2F6aW5lVHVycmV0fHJlbW92ZU1lbnVJdGVtfHJlbW92ZU1pc3Npb25FdmVudEhhbmRsZXJ8cmVtb3ZlTVBFdmVudEhhbmRsZXJ8cmVtb3ZlTXVzaWNFdmVudEhhbmRsZXJ8cmVtb3ZlT3duZWRNaW5lfHJlbW92ZVByaW1hcnlXZWFwb25JdGVtfHJlbW92ZVNlY29uZGFyeVdlYXBvbkl0ZW18cmVtb3ZlU2ltcGxlVGFza3xyZW1vdmVTd2l0Y2hhYmxlVW5pdHxyZW1vdmVUZWFtTWVtYmVyfHJlbW92ZVVuaWZvcm18cmVtb3ZlVmVzdHxyZW1vdmVXZWFwb258cmVtb3ZlV2VhcG9uQXR0YWNobWVudENhcmdvfHJlbW92ZVdlYXBvbkNhcmdvfHJlbW92ZVdlYXBvbkdsb2JhbHxyZW1vdmVXZWFwb25UdXJyZXR8cmVwb3J0UmVtb3RlVGFyZ2V0fHJlcXVpcmVkVmVyc2lvbnxyZXNldENhbVNoYWtlfHJlc2V0U3ViZ3JvdXBEaXJlY3Rpb258cmVzaXN0YW5jZXxyZXNpemV8cmVzb3VyY2VzfHJlc3Bhd25WZWhpY2xlfHJlc3RhcnRFZGl0b3JDYW1lcmF8cmV2ZWFsfHJldmVhbE1pbmV8cmV2ZXJzZXxyZXZlcnNlZE1vdXNlWXxyb2FkQXR8cm9hZHNDb25uZWN0ZWRUb3xyb2xlRGVzY3JpcHRpb258cm9wZUF0dGFjaGVkT2JqZWN0c3xyb3BlQXR0YWNoZWRUb3xyb3BlQXR0YWNoRW5hYmxlZHxyb3BlQXR0YWNoVG98cm9wZUNyZWF0ZXxyb3BlQ3V0fHJvcGVEZXN0cm95fHJvcGVEZXRhY2h8cm9wZUVuZFBvc2l0aW9ufHJvcGVMZW5ndGh8cm9wZXN8cm9wZVVud2luZHxyb3BlVW53b3VuZHxyb3RvcnNGb3JjZXNSVER8cm90b3JzUnBtUlREfHJvdW5kfHJ1bkluaXRTY3JpcHR8c2FmZVpvbmVIfHNhZmVab25lV3xzYWZlWm9uZVdBYnN8c2FmZVpvbmVYfHNhZmVab25lWEFic3xzYWZlWm9uZVl8c2F2ZTNERU5JbnZlbnRvcnl8c2F2ZUdhbWV8c2F2ZUlkZW50aXR5fHNhdmVKb3lzdGlja3N8c2F2ZU92ZXJsYXl8c2F2ZVByb2ZpbGVOYW1lc3BhY2V8c2F2ZVN0YXR1c3xzYXZlVmFyfHNhdmluZ0VuYWJsZWR8c2F5fHNheTJEfHNheTNEfHNjb3JlfHNjb3JlU2lkZXxzY3JlZW5zaG90fHNjcmVlblRvV29ybGR8c2NyaXB0RG9uZXxzY3JpcHROYW1lfHNjcmlwdE51bGx8c2N1ZFN0YXRlfHNlY29uZGFyeVdlYXBvbnxzZWNvbmRhcnlXZWFwb25JdGVtc3xzZWNvbmRhcnlXZWFwb25NYWdhemluZXxzZWxlY3R8c2VsZWN0QmVzdFBsYWNlc3xzZWxlY3REaWFyeVN1YmplY3R8c2VsZWN0ZWRFZGl0b3JPYmplY3RzfHNlbGVjdEVkaXRvck9iamVjdHxzZWxlY3Rpb25OYW1lc3xzZWxlY3Rpb25Qb3NpdGlvbnxzZWxlY3RMZWFkZXJ8c2VsZWN0TWF4fHNlbGVjdE1pbnxzZWxlY3ROb1BsYXllcnxzZWxlY3RQbGF5ZXJ8c2VsZWN0UmFuZG9tfHNlbGVjdFJhbmRvbVdlaWdodGVkfHNlbGVjdFdlYXBvbnxzZWxlY3RXZWFwb25UdXJyZXR8c2VuZEFVTWVzc2FnZXxzZW5kU2ltcGxlQ29tbWFuZHxzZW5kVGFza3xzZW5kVGFza1Jlc3VsdHxzZW5kVURQTWVzc2FnZXxzZXJ2ZXJDb21tYW5kfHNlcnZlckNvbW1hbmRBdmFpbGFibGV8c2VydmVyQ29tbWFuZEV4ZWN1dGFibGV8c2VydmVyTmFtZXxzZXJ2ZXJUaW1lfHNldHxzZXQzREVOQXR0cmlidXRlfHNldDNERU5BdHRyaWJ1dGVzfHNldDNERU5HcmlkfHNldDNERU5JY29uc1Zpc2libGV8c2V0M0RFTkxheWVyfHNldDNERU5MaW5lc1Zpc2libGV8c2V0M0RFTkxvZ2ljVHlwZXxzZXQzREVOTWlzc2lvbkF0dHJpYnV0ZXxzZXQzREVOTWlzc2lvbkF0dHJpYnV0ZXN8c2V0M0RFTk1vZGVsc1Zpc2libGV8c2V0M0RFTk9iamVjdFR5cGV8c2V0M0RFTlNlbGVjdGVkfHNldEFjY1RpbWV8c2V0QWN0dWFsQ29sbGVjdGl2ZVJURHxzZXRBaXJwbGFuZVRocm90dGxlfHNldEFpcnBvcnRTaWRlfHNldEFtbW98c2V0QW1tb0NhcmdvfHNldEFtbW9PblB5bG9ufHNldEFuaW1TcGVlZENvZWZ8c2V0QXBlcnR1cmV8c2V0QXBlcnR1cmVOZXd8c2V0QXJtb3J5UG9pbnRzfHNldEF0dHJpYnV0ZXN8c2V0QXV0b25vbW91c3xzZXRCZWhhdmlvdXJ8c2V0QmxlZWRpbmdSZW1haW5pbmd8c2V0QnJha2VzUlREfHNldENhbWVyYUludGVyZXN0fHNldENhbVNoYWtlRGVmUGFyYW1zfHNldENhbVNoYWtlUGFyYW1zfHNldENhbVVzZVRJfHNldENhcHRpdmV8c2V0Q2VudGVyT2ZNYXNzfHNldENvbGxpc2lvbkxpZ2h0fHNldENvbWJhdE1vZGV8c2V0Q29tcGFzc09zY2lsbGF0aW9ufHNldENvbnZveVNlcGFyYXRpb258c2V0Q3VyYXRvckNhbWVyYUFyZWFDZWlsaW5nfHNldEN1cmF0b3JDb2VmfHNldEN1cmF0b3JFZGl0aW5nQXJlYVR5cGV8c2V0Q3VyYXRvcldheXBvaW50Q29zdHxzZXRDdXJyZW50Q2hhbm5lbHxzZXRDdXJyZW50VGFza3xzZXRDdXJyZW50V2F5cG9pbnR8c2V0Q3VzdG9tQWltQ29lZnxzZXRDdXN0b21XZWlnaHRSVER8c2V0RGFtYWdlfHNldERhbW1hZ2V8c2V0RGF0ZXxzZXREZWJyaWVmaW5nVGV4dHxzZXREZWZhdWx0Q2FtZXJhfHNldERlc3RpbmF0aW9ufHNldERldGFpbE1hcEJsZW5kUGFyc3xzZXREaXJ8c2V0RGlyZWN0aW9ufHNldERyYXdJY29ufHNldERyaXZlT25QYXRofHNldERyb3BJbnRlcnZhbHxzZXREeW5hbWljU2ltdWxhdGlvbkRpc3RhbmNlfHNldER5bmFtaWNTaW11bGF0aW9uRGlzdGFuY2VDb2VmfHNldEVkaXRvck1vZGV8c2V0RWRpdG9yT2JqZWN0U2NvcGV8c2V0RWZmZWN0Q29uZGl0aW9ufHNldEVuZ2luZVJwbVJURHxzZXRGYWNlfHNldEZhY2VBbmltYXRpb258c2V0RmF0aWd1ZXxzZXRGZWF0dXJlVHlwZXxzZXRGbGFnQW5pbWF0aW9uUGhhc2V8c2V0RmxhZ093bmVyfHNldEZsYWdTaWRlfHNldEZsYWdUZXh0dXJlfHNldEZvZ3xzZXRGb3JjZUdlbmVyYXRvclJURHxzZXRGb3JtYXRpb258c2V0Rm9ybWF0aW9uVGFza3xzZXRGb3JtRGlyfHNldEZyaWVuZHxzZXRGcm9tRWRpdG9yfHNldEZTTVZhcmlhYmxlfHNldEZ1ZWx8c2V0RnVlbENhcmdvfHNldEdyb3VwSWNvbnxzZXRHcm91cEljb25QYXJhbXN8c2V0R3JvdXBJY29uc1NlbGVjdGFibGV8c2V0R3JvdXBJY29uc1Zpc2libGV8c2V0R3JvdXBJZHxzZXRHcm91cElkR2xvYmFsfHNldEdyb3VwT3duZXJ8c2V0R3VzdHN8c2V0SGlkZUJlaGluZHxzZXRIaXR8c2V0SGl0SW5kZXh8c2V0SGl0UG9pbnREYW1hZ2V8c2V0SG9yaXpvblBhcmFsbGF4Q29lZnxzZXRIVURNb3ZlbWVudExldmVsc3xzZXRJZGVudGl0eXxzZXRJbXBvcnRhbmNlfHNldEluZm9QYW5lbHxzZXRMZWFkZXJ8c2V0TGlnaHRBbWJpZW50fHNldExpZ2h0QXR0ZW51YXRpb258c2V0TGlnaHRCcmlnaHRuZXNzfHNldExpZ2h0Q29sb3J8c2V0TGlnaHREYXlMaWdodHxzZXRMaWdodEZsYXJlTWF4RGlzdGFuY2V8c2V0TGlnaHRGbGFyZVNpemV8c2V0TGlnaHRJbnRlbnNpdHl8c2V0TGlnaHRuaW5nc3xzZXRMaWdodFVzZUZsYXJlfHNldExvY2FsV2luZFBhcmFtc3xzZXRNYWdhemluZVR1cnJldEFtbW98c2V0TWFya2VyQWxwaGF8c2V0TWFya2VyQWxwaGFMb2NhbHxzZXRNYXJrZXJCcnVzaHxzZXRNYXJrZXJCcnVzaExvY2FsfHNldE1hcmtlckNvbG9yfHNldE1hcmtlckNvbG9yTG9jYWx8c2V0TWFya2VyRGlyfHNldE1hcmtlckRpckxvY2FsfHNldE1hcmtlclBvc3xzZXRNYXJrZXJQb3NMb2NhbHxzZXRNYXJrZXJTaGFwZXxzZXRNYXJrZXJTaGFwZUxvY2FsfHNldE1hcmtlclNpemV8c2V0TWFya2VyU2l6ZUxvY2FsfHNldE1hcmtlclRleHR8c2V0TWFya2VyVGV4dExvY2FsfHNldE1hcmtlclR5cGV8c2V0TWFya2VyVHlwZUxvY2FsfHNldE1hc3N8c2V0TWltaWN8c2V0TW91c2VQb3NpdGlvbnxzZXRNdXNpY0VmZmVjdHxzZXRNdXNpY0V2ZW50SGFuZGxlcnxzZXROYW1lfHNldE5hbWVTb3VuZHxzZXRPYmplY3RBcmd1bWVudHN8c2V0T2JqZWN0TWF0ZXJpYWx8c2V0T2JqZWN0TWF0ZXJpYWxHbG9iYWx8c2V0T2JqZWN0UHJveHl8c2V0T2JqZWN0VGV4dHVyZXxzZXRPYmplY3RUZXh0dXJlR2xvYmFsfHNldE9iamVjdFZpZXdEaXN0YW5jZXxzZXRPdmVyY2FzdHxzZXRPd25lcnxzZXRPeHlnZW5SZW1haW5pbmd8c2V0UGFydGljbGVDaXJjbGV8c2V0UGFydGljbGVDbGFzc3xzZXRQYXJ0aWNsZUZpcmV8c2V0UGFydGljbGVQYXJhbXN8c2V0UGFydGljbGVSYW5kb218c2V0UGlsb3RDYW1lcmFEaXJlY3Rpb258c2V0UGlsb3RDYW1lcmFSb3RhdGlvbnxzZXRQaWxvdENhbWVyYVRhcmdldHxzZXRQaWxvdExpZ2h0fHNldFBpUEVmZmVjdHxzZXRQaXRjaHxzZXRQbGF0ZU51bWJlcnxzZXRQbGF5YWJsZXxzZXRQbGF5ZXJSZXNwYXduVGltZXxzZXRQb3N8c2V0UG9zQVNMfHNldFBvc0FTTDJ8c2V0UG9zQVNMV3xzZXRQb3NBVEx8c2V0UG9zaXRpb258c2V0UG9zV29ybGR8c2V0UHlsb25Mb2FkT3V0fHNldFB5bG9uc1ByaW9yaXR5fHNldFJhZGlvTXNnfHNldFJhaW58c2V0UmFpbmJvd3xzZXRSYW5kb21MaXB8c2V0UmFua3xzZXRSZWN0YW5ndWxhcnxzZXRSZXBhaXJDYXJnb3xzZXRSb3RvckJyYWtlUlREfHNldFNoYWRvd0Rpc3RhbmNlfHNldFNob3RQYXJlbnRzfHNldFNpZGV8c2V0U2ltcGxlVGFza0Fsd2F5c1Zpc2libGV8c2V0U2ltcGxlVGFza0N1c3RvbURhdGF8c2V0U2ltcGxlVGFza0Rlc2NyaXB0aW9ufHNldFNpbXBsZVRhc2tEZXN0aW5hdGlvbnxzZXRTaW1wbGVUYXNrVGFyZ2V0fHNldFNpbXBsZVRhc2tUeXBlfHNldFNpbXVsV2VhdGhlckxheWVyc3xzZXRTaXplfHNldFNraWxsfHNldFNsaW5nTG9hZHxzZXRTb3VuZEVmZmVjdHxzZXRTcGVha2VyfHNldFNwZWVjaHxzZXRTcGVlZE1vZGV8c2V0U3RhbWluYXxzZXRTdGFtaW5hU2NoZW1lfHNldFN0YXRWYWx1ZXxzZXRTdXBwcmVzc2lvbnxzZXRTeXN0ZW1PZlVuaXRzfHNldFRhcmdldEFnZXxzZXRUYXNrTWFya2VyT2Zmc2V0fHNldFRhc2tSZXN1bHR8c2V0VGFza1N0YXRlfHNldFRlcnJhaW5HcmlkfHNldFRleHR8c2V0VGltZU11bHRpcGxpZXJ8c2V0VGl0bGVFZmZlY3R8c2V0VG9uZU1hcHBpbmd8c2V0VG9uZU1hcHBpbmdQYXJhbXN8c2V0VHJhZmZpY0RlbnNpdHl8c2V0VHJhZmZpY0Rpc3RhbmNlfHNldFRyYWZmaWNHYXB8c2V0VHJhZmZpY1NwZWVkfHNldFRyaWdnZXJBY3RpdmF0aW9ufHNldFRyaWdnZXJBcmVhfHNldFRyaWdnZXJTdGF0ZW1lbnRzfHNldFRyaWdnZXJUZXh0fHNldFRyaWdnZXJUaW1lb3V0fHNldFRyaWdnZXJUeXBlfHNldFR5cGV8c2V0VW5jb25zY2lvdXN8c2V0VW5pdEFiaWxpdHl8c2V0VW5pdExvYWRvdXR8c2V0VW5pdFBvc3xzZXRVbml0UG9zV2Vha3xzZXRVbml0UmFua3xzZXRVbml0UmVjb2lsQ29lZmZpY2llbnR8c2V0VW5pdFRyYWl0fHNldFVubG9hZEluQ29tYmF0fHNldFVzZXJBY3Rpb25UZXh0fHNldFVzZXJNRkRUZXh0fHNldFVzZXJNRkRWYWx1ZXxzZXRWYXJpYWJsZXxzZXRWZWN0b3JEaXJ8c2V0VmVjdG9yRGlyQW5kVXB8c2V0VmVjdG9yVXB8c2V0VmVoaWNsZUFtbW98c2V0VmVoaWNsZUFtbW9EZWZ8c2V0VmVoaWNsZUFybW9yfHNldFZlaGljbGVDYXJnb3xzZXRWZWhpY2xlSWR8c2V0VmVoaWNsZUluaXR8c2V0VmVoaWNsZUxvY2t8c2V0VmVoaWNsZVBvc2l0aW9ufHNldFZlaGljbGVSYWRhcnxzZXRWZWhpY2xlUmVjZWl2ZVJlbW90ZVRhcmdldHN8c2V0VmVoaWNsZVJlcG9ydE93blBvc2l0aW9ufHNldFZlaGljbGVSZXBvcnRSZW1vdGVUYXJnZXRzfHNldFZlaGljbGVUSVBhcnN8c2V0VmVoaWNsZVZhck5hbWV8c2V0VmVsb2NpdHl8c2V0VmVsb2NpdHlNb2RlbFNwYWNlfHNldFZlbG9jaXR5VHJhbnNmb3JtYXRpb258c2V0Vmlld0Rpc3RhbmNlfHNldFZpc2libGVJZlRyZWVDb2xsYXBzZWR8c2V0V2FudGVkUnBtUlREfHNldFdhdmVzfHNldFdheXBvaW50QmVoYXZpb3VyfHNldFdheXBvaW50Q29tYmF0TW9kZXxzZXRXYXlwb2ludENvbXBsZXRpb25SYWRpdXN8c2V0V2F5cG9pbnREZXNjcmlwdGlvbnxzZXRXYXlwb2ludEZvcmNlQmVoYXZpb3VyfHNldFdheXBvaW50Rm9ybWF0aW9ufHNldFdheXBvaW50SG91c2VQb3NpdGlvbnxzZXRXYXlwb2ludExvaXRlclJhZGl1c3xzZXRXYXlwb2ludExvaXRlclR5cGV8c2V0V2F5cG9pbnROYW1lfHNldFdheXBvaW50UG9zaXRpb258c2V0V2F5cG9pbnRTY3JpcHR8c2V0V2F5cG9pbnRTcGVlZHxzZXRXYXlwb2ludFN0YXRlbWVudHN8c2V0V2F5cG9pbnRUaW1lb3V0fHNldFdheXBvaW50VHlwZXxzZXRXYXlwb2ludFZpc2libGV8c2V0V2VhcG9uUmVsb2FkaW5nVGltZXxzZXRXaW5kfHNldFdpbmREaXJ8c2V0V2luZEZvcmNlfHNldFdpbmRTdHJ8c2V0V2luZ0ZvcmNlU2NhbGVSVER8c2V0V1BQb3N8c2hvdzNESWNvbnN8c2hvd0NoYXR8c2hvd0NpbmVtYUJvcmRlcnxzaG93Q29tbWFuZGluZ01lbnV8c2hvd0NvbXBhc3N8c2hvd0N1cmF0b3JDb21wYXNzfHNob3dHUFN8c2hvd0hVRHxzaG93TGVnZW5kfHNob3dNYXB8c2hvd25BcnRpbGxlcnlDb21wdXRlcnxzaG93bkNoYXR8c2hvd25Db21wYXNzfHNob3duQ3VyYXRvckNvbXBhc3N8c2hvd05ld0VkaXRvck9iamVjdHxzaG93bkdQU3xzaG93bkhVRHxzaG93bk1hcHxzaG93blBhZHxzaG93blJhZGlvfHNob3duU2NvcmV0YWJsZXxzaG93blVBVkZlZWR8c2hvd25XYXJyYW50fHNob3duV2F0Y2h8c2hvd1BhZHxzaG93UmFkaW98c2hvd1Njb3JldGFibGV8c2hvd1N1YnRpdGxlc3xzaG93VUFWRmVlZHxzaG93V2FycmFudHxzaG93V2F0Y2h8c2hvd1dheXBvaW50fHNob3dXYXlwb2ludHN8c2lkZXxzaWRlQW1iaWVudExpZmV8c2lkZUNoYXR8c2lkZUVtcHR5fHNpZGVFbmVteXxzaWRlRnJpZW5kbHl8c2lkZUxvZ2ljfHNpZGVSYWRpb3xzaWRlVW5rbm93bnxzaW1wbGVUYXNrc3xzaW11bGF0aW9uRW5hYmxlZHxzaW11bENsb3VkRGVuc2l0eXxzaW11bENsb3VkT2NjbHVzaW9ufHNpbXVsSW5DbG91ZHN8c2ltdWxXZWF0aGVyU3luY3xzaW58c2l6ZXxzaXplT2Z8c2tpbGx8c2tpbGxGaW5hbHxza2lwVGltZXxzbGVlcHxzbGlkZXJQb3NpdGlvbnxzbGlkZXJSYW5nZXxzbGlkZXJTZXRQb3NpdGlvbnxzbGlkZXJTZXRSYW5nZXxzbGlkZXJTZXRTcGVlZHxzbGlkZXJTcGVlZHxzbGluZ0xvYWRBc3Npc3RhbnRTaG93bnxzb2xkaWVyTWFnYXppbmVzfHNvbWVBbW1vfHNvcnR8c291bmRWb2x1bWV8c3BlYWtlcnxzcGVlZHxzcGVlZE1vZGV8c3BsaXRTdHJpbmd8c3FydHxzcXVhZFBhcmFtc3xzdGFuY2V8c3RhcnRMb2FkaW5nU2NyZWVufHN0b3B8c3RvcEVuZ2luZVJURHxzdG9wcGVkfHN0cnxzdW5Pck1vb258c3VwcG9ydEluZm98c3VwcHJlc3NGb3J8c3VyZmFjZUlzV2F0ZXJ8c3VyZmFjZU5vcm1hbHxzdXJmYWNlVHlwZXxzd2ltSW5EZXB0aHxzd2l0Y2hhYmxlVW5pdHN8c3dpdGNoQWN0aW9ufHN3aXRjaENhbWVyYXxzd2l0Y2hHZXN0dXJlfHN3aXRjaExpZ2h0fHN3aXRjaE1vdmV8c3luY2hyb25pemVkT2JqZWN0c3xzeW5jaHJvbml6ZWRUcmlnZ2Vyc3xzeW5jaHJvbml6ZWRXYXlwb2ludHN8c3luY2hyb25pemVPYmplY3RzQWRkfHN5bmNocm9uaXplT2JqZWN0c1JlbW92ZXxzeW5jaHJvbml6ZVRyaWdnZXJ8c3luY2hyb25pemVXYXlwb2ludHxzeXN0ZW1DaGF0fHN5c3RlbU9mVW5pdHN8dGFufHRhcmdldEtub3dsZWRnZXx0YXJnZXRzfHRhcmdldHNBZ2dyZWdhdGV8dGFyZ2V0c1F1ZXJ5fHRhc2tBbHdheXNWaXNpYmxlfHRhc2tDaGlsZHJlbnx0YXNrQ29tcGxldGVkfHRhc2tDdXN0b21EYXRhfHRhc2tEZXNjcmlwdGlvbnx0YXNrRGVzdGluYXRpb258dGFza0hpbnR8dGFza01hcmtlck9mZnNldHx0YXNrTnVsbHx0YXNrUGFyZW50fHRhc2tSZXN1bHR8dGFza1N0YXRlfHRhc2tUeXBlfHRlYW1NZW1iZXJ8dGVhbU1lbWJlck51bGx8dGVhbU5hbWV8dGVhbXN8dGVhbVN3aXRjaHx0ZWFtU3dpdGNoRW5hYmxlZHx0ZWFtVHlwZXx0ZXJtaW5hdGV8dGVycmFpbkludGVyc2VjdHx0ZXJyYWluSW50ZXJzZWN0QVNMfHRlcnJhaW5JbnRlcnNlY3RBdEFTTHx0ZXh0fHRleHRMb2d8dGV4dExvZ0Zvcm1hdHx0Z3x0aW1lfHRpbWVNdWx0aXBsaWVyfHRpdGxlQ3V0fHRpdGxlRmFkZU91dHx0aXRsZU9ianx0aXRsZVJzY3x0aXRsZVRleHR8dG9BcnJheXx0b0ZpeGVkfHRvTG93ZXJ8dG9TdHJpbmd8dG9VcHBlcnx0cmlnZ2VyQWN0aXZhdGVkfHRyaWdnZXJBY3RpdmF0aW9ufHRyaWdnZXJBcmVhfHRyaWdnZXJBdHRhY2hlZFZlaGljbGV8dHJpZ2dlckF0dGFjaE9iamVjdHx0cmlnZ2VyQXR0YWNoVmVoaWNsZXx0cmlnZ2VyRHluYW1pY1NpbXVsYXRpb258dHJpZ2dlclN0YXRlbWVudHN8dHJpZ2dlclRleHR8dHJpZ2dlclRpbWVvdXR8dHJpZ2dlclRpbWVvdXRDdXJyZW50fHRyaWdnZXJUeXBlfHR1cnJldExvY2FsfHR1cnJldE93bmVyfHR1cnJldFVuaXR8dHZBZGR8dHZDbGVhcnx0dkNvbGxhcHNlfHR2Q29sbGFwc2VBbGx8dHZDb3VudHx0dkN1clNlbHx0dkRhdGF8dHZEZWxldGV8dHZFeHBhbmR8dHZFeHBhbmRBbGx8dHZQaWN0dXJlfHR2UGljdHVyZVJpZ2h0fHR2U2V0Q29sb3J8dHZTZXRDdXJTZWx8dHZTZXREYXRhfHR2U2V0UGljdHVyZXx0dlNldFBpY3R1cmVDb2xvcnx0dlNldFBpY3R1cmVDb2xvckRpc2FibGVkfHR2U2V0UGljdHVyZUNvbG9yU2VsZWN0ZWR8dHZTZXRQaWN0dXJlUmlnaHR8dHZTZXRQaWN0dXJlUmlnaHRDb2xvcnx0dlNldFBpY3R1cmVSaWdodENvbG9yRGlzYWJsZWR8dHZTZXRQaWN0dXJlUmlnaHRDb2xvclNlbGVjdGVkfHR2U2V0U2VsZWN0Q29sb3J8dHZTZXRUZXh0fHR2U2V0VG9vbHRpcHx0dlNldFZhbHVlfHR2U29ydHx0dlNvcnRCeVZhbHVlfHR2VGV4dHx0dlRvb2x0aXB8dHZWYWx1ZXx0eXBlfHR5cGVOYW1lfHR5cGVPZnxVQVZDb250cm9sfHVpTmFtZXNwYWNlfHVpU2xlZXB8dW5hc3NpZ25DdXJhdG9yfHVuYXNzaWduSXRlbXx1bmFzc2lnblRlYW18dW5hc3NpZ25WZWhpY2xlfHVuZGVyd2F0ZXJ8dW5pZm9ybXx1bmlmb3JtQ29udGFpbmVyfHVuaWZvcm1JdGVtc3x1bmlmb3JtTWFnYXppbmVzfHVuaXRBZGRvbnN8dW5pdEFpbVBvc2l0aW9ufHVuaXRBaW1Qb3NpdGlvblZpc3VhbHx1bml0QmFja3BhY2t8dW5pdElzVUFWfHVuaXRQb3N8dW5pdFJlYWR5fHVuaXRSZWNvaWxDb2VmZmljaWVudHx1bml0c3x1bml0c0JlbG93SGVpZ2h0fHVubGlua0l0ZW18dW5sb2NrQWNoaWV2ZW1lbnR8dW5yZWdpc3RlclRhc2t8dXBkYXRlRHJhd0ljb258dXBkYXRlTWVudUl0ZW18dXBkYXRlT2JqZWN0VHJlZXx1c2VBSU9wZXJNYXBPYnN0cnVjdGlvblRlc3R8dXNlQUlTdGVlcmluZ0NvbXBvbmVudHx1c2VBdWRpb1RpbWVGb3JNb3Zlc3x1c2VySW5wdXREaXNhYmxlZHx2ZWN0b3JBZGR8dmVjdG9yQ29zfHZlY3RvckNyb3NzUHJvZHVjdHx2ZWN0b3JEaWZmfHZlY3RvckRpcnx2ZWN0b3JEaXJWaXN1YWx8dmVjdG9yRGlzdGFuY2V8dmVjdG9yRGlzdGFuY2VTcXJ8dmVjdG9yRG90UHJvZHVjdHx2ZWN0b3JGcm9tVG98dmVjdG9yTWFnbml0dWRlfHZlY3Rvck1hZ25pdHVkZVNxcnx2ZWN0b3JNb2RlbFRvV29ybGR8dmVjdG9yTW9kZWxUb1dvcmxkVmlzdWFsfHZlY3Rvck11bHRpcGx5fHZlY3Rvck5vcm1hbGl6ZWR8dmVjdG9yVXB8dmVjdG9yVXBWaXN1YWx8dmVjdG9yV29ybGRUb01vZGVsfHZlY3RvcldvcmxkVG9Nb2RlbFZpc3VhbHx2ZWhpY2xlfHZlaGljbGVDYXJnb0VuYWJsZWR8dmVoaWNsZUNoYXR8dmVoaWNsZVJhZGlvfHZlaGljbGVSZWNlaXZlUmVtb3RlVGFyZ2V0c3x2ZWhpY2xlUmVwb3J0T3duUG9zaXRpb258dmVoaWNsZVJlcG9ydFJlbW90ZVRhcmdldHN8dmVoaWNsZXN8dmVoaWNsZVZhck5hbWV8dmVsb2NpdHl8dmVsb2NpdHlNb2RlbFNwYWNlfHZlcmlmeVNpZ25hdHVyZXx2ZXN0fHZlc3RDb250YWluZXJ8dmVzdEl0ZW1zfHZlc3RNYWdhemluZXN8dmlld0Rpc3RhbmNlfHZpc2libGVDb21wYXNzfHZpc2libGVHUFN8dmlzaWJsZU1hcHx2aXNpYmxlUG9zaXRpb258dmlzaWJsZVBvc2l0aW9uQVNMfHZpc2libGVTY29yZXRhYmxlfHZpc2libGVXYXRjaHx3YWl0VW50aWx8d2F2ZXN8d2F5cG9pbnRBdHRhY2hlZE9iamVjdHx3YXlwb2ludEF0dGFjaGVkVmVoaWNsZXx3YXlwb2ludEF0dGFjaE9iamVjdHx3YXlwb2ludEF0dGFjaFZlaGljbGV8d2F5cG9pbnRCZWhhdmlvdXJ8d2F5cG9pbnRDb21iYXRNb2RlfHdheXBvaW50Q29tcGxldGlvblJhZGl1c3x3YXlwb2ludERlc2NyaXB0aW9ufHdheXBvaW50Rm9yY2VCZWhhdmlvdXJ8d2F5cG9pbnRGb3JtYXRpb258d2F5cG9pbnRIb3VzZVBvc2l0aW9ufHdheXBvaW50TG9pdGVyUmFkaXVzfHdheXBvaW50TG9pdGVyVHlwZXx3YXlwb2ludE5hbWV8d2F5cG9pbnRQb3NpdGlvbnx3YXlwb2ludHN8d2F5cG9pbnRTY3JpcHR8d2F5cG9pbnRzRW5hYmxlZFVBVnx3YXlwb2ludFNob3d8d2F5cG9pbnRTcGVlZHx3YXlwb2ludFN0YXRlbWVudHN8d2F5cG9pbnRUaW1lb3V0fHdheXBvaW50VGltZW91dEN1cnJlbnR8d2F5cG9pbnRUeXBlfHdheXBvaW50VmlzaWJsZXx3ZWFwb25BY2Nlc3Nvcmllc3x3ZWFwb25BY2Nlc3Nvcmllc0NhcmdvfHdlYXBvbkNhcmdvfHdlYXBvbkRpcmVjdGlvbnx3ZWFwb25JbmVydGlhfHdlYXBvbkxvd2VyZWR8d2VhcG9uc3x3ZWFwb25zSXRlbXN8d2VhcG9uc0l0ZW1zQ2FyZ298d2VhcG9uU3RhdGV8d2VhcG9uc1R1cnJldHx3ZWlnaHRSVER8d2VzdHxXRlNpZGVUZXh0fHdpbmR8d2luZERpcnx3aW5kUlREfHdpbmRTdHJ8d2luZ3NGb3JjZXNSVER8d29ybGROYW1lfHdvcmxkU2l6ZXx3b3JsZFRvTW9kZWx8d29ybGRUb01vZGVsVmlzdWFsfHdvcmxkVG9TY3JlZW4pXFxiL2ksXG5cdCdudW1iZXInOiAvKD86XFwkfFxcYjB4KVtcXGRhLWZdK1xcYnwoPzpcXEJcXC5cXGQrfFxcYlxcZCsoPzpcXC5cXGQrKT8pKD86ZVsrLV0/XFxkKyk/XFxiL2ksXG5cdCdvcGVyYXRvcic6IC8jI3w+PnwmJnxcXHxcXHx8WyE9PD5dPT98Wy0rKi8lI15dfFxcYig/OmFuZHxtb2R8bm90fG9yKVxcYi9pLFxuXHQnbWFnaWMtdmFyaWFibGUnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OnRoaXN8dGhpc0xpc3R8dGhpc1RyaWdnZXJ8X2V4Y2VwdGlvbnxfZm5jX3NjcmlwdE5hbWV8X2ZuY19zY3JpcHROYW1lUGFyZW50fF9mb3JFYWNoSW5kZXh8X3RoaXN8X3RoaXNFdmVudEhhbmRsZXJ8X3RoaXNGU018X3RoaXNTY3JpcHR8X3gpXFxiL2ksXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnY29uc3RhbnQnOiAvXFxiRElLKD86X1thLXpcXGRdKykrXFxiL2lcbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdzcWYnLCAnc3RyaW5nJywge1xuXHQnbWFjcm8nOiB7XG5cdFx0cGF0dGVybjogLyheWyBcXHRdKikjW2Etel0oPzpbXlxcclxcblxcXFxdfFxcXFwoPzpcXHJcXG58W1xcc1xcU10pKSovaW0sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eScsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnZGlyZWN0aXZlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvI1thLXpdK1xcYi9pLFxuXHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHR9LFxuXHRcdFx0J2NvbW1lbnQnOiBQcmlzbS5sYW5ndWFnZXMuc3FmLmNvbW1lbnRcblx0XHR9XG5cdH1cbn0pO1xuXG5kZWxldGUgUHJpc20ubGFuZ3VhZ2VzLnNxZlsnY2xhc3MtbmFtZSddO1xuXG5QcmlzbS5sYW5ndWFnZXMuc3F1aXJyZWwgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0UHJpc20ubGFuZ3VhZ2VzLmNsaWtlWydjb21tZW50J11bMF0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXDpdKSg/OlxcL1xcL3wjKS4qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXFwiJ0BdKSg/OkBcIig/OlteXCJdfFwiXCIpKlwiKD8hXCIpfFwiKD86W15cXFxcXFxyXFxuXCJdfFxcXFwuKSpcIikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogLyhcXGIoPzpjbGFzc3xlbnVtfGV4dGVuZHN8aW5zdGFuY2VvZilcXHMrKVxcdysoPzpcXC5cXHcrKSovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdH1cblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86X19GSUxFX198X19MSU5FX198YmFzZXxicmVha3xjYXNlfGNhdGNofGNsYXNzfGNsb25lfGNvbnN0fGNvbnN0cnVjdG9yfGNvbnRpbnVlfGRlZmF1bHR8ZGVsZXRlfGVsc2V8ZW51bXxleHRlbmRzfGZvcnxmb3JlYWNofGZ1bmN0aW9ufGlmfGlufGluc3RhbmNlb2Z8bG9jYWx8bnVsbHxyZXN1bWV8cmV0dXJufHN0YXRpY3xzd2l0Y2h8dGhpc3x0aHJvd3x0cnl8dHlwZW9mfHdoaWxlfHlpZWxkKVxcYi8sXG5cblx0J251bWJlcic6IC9cXGIoPzoweFswLTlhLWZBLUZdK3xcXGQrKD86XFwuKD86XFxkK3xbZUVdWystXT9cXGQrKSk/KVxcYi8sXG5cdCdvcGVyYXRvcic6IC9cXCtcXCt8LS18PD0+fDxbLTxdfD4+Pj98JiY/fFxcfFxcfD98Wy0rKi8lIT08Pl09P3xbfl5dfDo6Py8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCl7fVxcW1xcXSw7Ll0vXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnc3F1aXJyZWwnLCAnc3RyaW5nJywge1xuXHQnY2hhcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXCInXSknKD86W15cXFxcJ118XFxcXCg/Olt4dVVdWzAtOWEtZkEtRl17MCw4fXxbXFxzXFxTXSkpJy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3NxdWlycmVsJywgJ29wZXJhdG9yJywge1xuXHQnYXR0cmlidXRlLXB1bmN0dWF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC88XFwvfFxcLz4vLFxuXHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHR9LFxuXHQnbGFtYmRhJzoge1xuXHRcdHBhdHRlcm46IC9AKD89XFwoKS8sXG5cdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0fVxufSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvLyBodHRwczovL21jLXN0YW4ub3JnL2RvY3MvMl8yOC9yZWZlcmVuY2UtbWFudWFsL2JuZi1ncmFtbWFycy5odG1sXG5cblx0dmFyIGhpZ2hlck9yZGVyRnVuY3Rpb25zID0gL1xcYig/OmFsZ2VicmFfc29sdmVyfGFsZ2VicmFfc29sdmVyX25ld3RvbnxpbnRlZ3JhdGVfMWR8aW50ZWdyYXRlX29kZXxpbnRlZ3JhdGVfb2RlX2JkZnxpbnRlZ3JhdGVfb2RlX3JrNDV8bWFwX3JlY3R8b2RlXyg/OmFkYW1zfGJkZnxja3JrfHJrNDUpKD86X3RvbCk/fG9kZV9hZGpvaW50X3RvbF9jdGx8cmVkdWNlX3N1bXxyZWR1Y2Vfc3VtX3N0YXRpYylcXGIvO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5zdGFuID0ge1xuXHRcdCdjb21tZW50JzogL1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC98Iyg/IWluY2x1ZGUpLiovLFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHQvLyBTdHJpbmcgbGl0ZXJhbHMgY2FuIGNvbnRhaW4gc3BhY2VzIGFuZCBhbnkgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlcnMgZXhjZXB0IGZvciBcIiBhbmQgXFxcblx0XHRcdC8vIGh0dHBzOi8vbWMtc3Rhbi5vcmcvZG9jcy8yXzI0L3JlZmVyZW5jZS1tYW51YWwvcHJpbnQtc3RhdGVtZW50cy1zZWN0aW9uLmh0bWwjc3RyaW5nLWxpdGVyYWxzXG5cdFx0XHRwYXR0ZXJuOiAvXCJbXFx4MjBcXHgyMVxceDIzLVxceDVCXFx4NUQtXFx4N0VdKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2RpcmVjdGl2ZSc6IHtcblx0XHRcdHBhdHRlcm46IC9eKFsgXFx0XSopI2luY2x1ZGVcXGIuKi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHJvcGVydHknXG5cdFx0fSxcblxuXHRcdCdmdW5jdGlvbi1hcmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdCcoJyArXG5cdFx0XHRcdGhpZ2hlck9yZGVyRnVuY3Rpb25zLnNvdXJjZSArXG5cdFx0XHRcdC9cXHMqXFwoXFxzKi8uc291cmNlICtcblx0XHRcdFx0JyknICtcblx0XHRcdFx0L1thLXpBLVpdXFx3Ki8uc291cmNlXG5cdFx0XHQpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblx0XHQnY29uc3RyYWludCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxiKD86aW50fG1hdHJpeHxyZWFsfHJvd192ZWN0b3J8dmVjdG9yKVxccyopPFtePD5dKj4vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKD1cXHMqKVxcUyg/OlxcU3xcXHMrKD8hXFxzKSkqPyg/PVxccyooPzo+JHwsXFxzKlxcdytcXHMqPSkpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdFx0fSxcblx0XHRcdFx0J3Byb3BlcnR5JzogL1xcYlthLXpdXFx3Kig/PVxccyo9KS9pLFxuXHRcdFx0XHQnb3BlcmF0b3InOiAvPS8sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9ePHw+JHwsL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXGJkYXRhKD89XFxzKlxceyl8XFxiKD86ZnVuY3Rpb25zfGdlbmVyYXRlZHxtb2RlbHxwYXJhbWV0ZXJzfHF1YW50aXRpZXN8dHJhbnNmb3JtZWQpXFxiLyxcblx0XHRcdFx0YWxpYXM6ICdwcm9ncmFtLWJsb2NrJ1xuXHRcdFx0fSxcblx0XHRcdC9cXGIoPzphcnJheXxicmVha3xjaG9sZXNreV9mYWN0b3JfY29ycnxjaG9sZXNreV9mYWN0b3JfY292fGNvbXBsZXh8Y29udGludWV8Y29ycl9tYXRyaXh8Y292X21hdHJpeHxkYXRhfGVsc2V8Zm9yfGlmfGlufGluY3JlbWVudF9sb2dfcHJvYnxpbnR8bWF0cml4fG9yZGVyZWR8cG9zaXRpdmVfb3JkZXJlZHxwcmludHxyZWFsfHJlamVjdHxyZXR1cm58cm93X3ZlY3RvcnxzaW1wbGV4fHRhcmdldHx1bml0X3ZlY3Rvcnx2ZWN0b3J8dm9pZHx3aGlsZSlcXGIvLFxuXHRcdFx0Ly8gdGhlc2UgYXJlIGZ1bmN0aW9ucyB0aGF0IGFyZSBrbm93biB0byB0YWtlIGFub3RoZXIgZnVuY3Rpb24gYXMgdGhlaXIgZmlyc3QgYXJndW1lbnQuXG5cdFx0XHRoaWdoZXJPcmRlckZ1bmN0aW9uc1xuXHRcdF0sXG5cdFx0J2Z1bmN0aW9uJzogL1xcYlthLXpdXFx3Kig/PVxccypcXCgpL2ksXG5cdFx0J251bWJlcic6IC8oPzpcXGJcXGQrKD86X1xcZCspKig/OlxcLig/OlxcZCsoPzpfXFxkKykqKT8pP3xcXEJcXC5cXGQrKD86X1xcZCspKikoPzpFWystXT9cXGQrKD86X1xcZCspKik/aT8oPyFcXHcpL2ksXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXG5cdFx0J29wZXJhdG9yJzogLzwtfFxcLlsqL109P3xcXHxcXHw/fCYmfFshPTw+K1xcLSovXT0/fFsnXiV+PzpdLyxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpXFxbXFxde30sO10vXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnN0YW4uY29uc3RyYWludC5pbnNpZGUuZXhwcmVzc2lvbi5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuc3RhbjtcblxufShQcmlzbSkpO1xuXG4vLyBodHRwczovL3d3dy5zdGF0YS5jb20vbWFudWFscy91LnBkZlxuLy8gaHR0cHM6Ly93d3cuc3RhdGEuY29tL21hbnVhbHMvcC5wZGZcblxuUHJpc20ubGFuZ3VhZ2VzLnN0YXRhID0ge1xuXHQnY29tbWVudCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKVxcKi4qL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVxcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J3N0cmluZy1saXRlcmFsJzoge1xuXHRcdHBhdHRlcm46IC9cIlteXCJcXHJcXG5dKlwifFtcdTIwMThgJ11cIi4qP1wiW1x1MjAxOWAnXS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXCRcXHtbXnt9XSpcXH18W1x1MjAxOGAnXVxcd1teXHUyMDE5YCdcXHJcXG5dKltcdTIwMTlgJ10vLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcJFxce3xcXH0kLyxcblx0XHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fSxcblxuXHQnbWF0YSc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qbWF0YVsgXFx0XSo6KVtcXHNcXFNdKz8oPz1eZW5kXFxiKS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnbGFuZ3VhZ2UtbWF0YScsXG5cdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMubWF0YVxuXHR9LFxuXHQnamF2YSc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qamF2YVsgXFx0XSo6KVtcXHNcXFNdKz8oPz1eZW5kXFxiKS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnbGFuZ3VhZ2UtamF2YScsXG5cdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YVxuXHR9LFxuXHQncHl0aG9uJzoge1xuXHRcdHBhdHRlcm46IC8oXlsgXFx0XSpweXRob25bIFxcdF0qOilbXFxzXFxTXSs/KD89XmVuZFxcYikvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ2xhbmd1YWdlLXB5dGhvbicsXG5cdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucHl0aG9uXG5cdH0sXG5cblxuXHQnY29tbWFuZCc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKD86XFwuWyBcXHRdKyk/KD86KD86YmF5ZXN8Ym9vdHN0cmFwfGJ5fGJ5c29ydHxjYXB0dXJlfGNvbGxlY3R8Zm1tfGZwfGZyYW1lfGphY2trbmlmZXxtZnB8bWl8bmVzdHJlZ3xub2lzaWx5fHBlcm11dGV8cXVpZXRseXxyb2xsaW5nfHNpbXVsYXRlfHN0YXRzYnl8c3RlcHdpc2V8c3Z5fHZlcnNpb258eGkpXFxiW146XFxyXFxuXSo6WyBcXHRdKnwoPzpjYXB0dXJlfG5vaXNpbHl8cXVpZXRseXx2ZXJzaW9uKVsgXFx0XSspPylbYS16QS1aXVxcdyovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCd2YXJpYWJsZSc6IC9cXCRcXHcrfFtcdTIwMThgJ11cXHdbXlx1MjAxOWAnXFxyXFxuXSpbXHUyMDE5YCddLyxcblx0J2tleXdvcmQnOiAvXFxiKD86YmF5ZXN8Ym9vdHN0cmFwfGJ5fGJ5c29ydHxjYXB0dXJlfGNsZWFyfGNvbGxlY3R8Zm1tfGZwfGZyYW1lfGlmfGlufGphY2trbmlmZXxtaVsgXFx0XStlc3RpbWF0ZXxtZnB8bmVzdHJlZ3xub2lzaWx5fG9mfHBlcm11dGV8cXVpZXRseXxyb2xsaW5nfHNpbXVsYXRlfHNvcnR8c3RhdHNieXxzdGVwd2lzZXxzdnl8dmFybGlzdHx2ZXJzaW9ufHhpKVxcYi8sXG5cblxuXHQnYm9vbGVhbic6IC9cXGIoPzpvZmZ8b24pXFxiLyxcblx0J251bWJlcic6IC9cXGJcXGQrKD86XFwuXFxkKyk/XFxifFxcQlxcLlxcZCsvLFxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxcKCkvaSxcblxuXHQnb3BlcmF0b3InOiAvXFwrXFwrfC0tfCMjP3xbPD4hPX5dPT98WytcXC0qXiZ8L10vLFxuXHQncHVuY3R1YXRpb24nOiAvWygpe31bXFxdLDpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnN0YXRhWydzdHJpbmctbGl0ZXJhbCddLmluc2lkZS5pbnRlcnBvbGF0aW9uLmluc2lkZS5leHByZXNzaW9uLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5zdGF0YTtcblxuUHJpc20ubGFuZ3VhZ2VzLmllY3N0ID0ge1xuXHQnY29tbWVudCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkoPzpcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpfFxcKFxcKltcXHNcXFNdKj8oPzpcXCpcXCl8JCl8XFx7W1xcc1xcU10qPyg/OlxcfXwkKSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFw6XSlcXC9cXC8uKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdH0sXG5cdF0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhbXCInXSkoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdH0sXG5cdCdrZXl3b3JkJzogW1xuXHRcdC9cXGIoPzpFTkRfKT8oPzpQUk9HUkFNfENPTkZJR1VSQVRJT058SU5URVJGQUNFfEZVTkNUSU9OX0JMT0NLfEZVTkNUSU9OfEFDVElPTnxUUkFOU0lUSU9OfFRZUEV8U1RSVUNUfCg/OklOSVRJQUxfKT9TVEVQfE5BTUVTUEFDRXxMSUJSQVJZfENIQU5ORUx8Rk9MREVSfFJFU09VUkNFfFZBUl8oPzpBQ0NFU1N8Q09ORklHfEVYVEVSTkFMfEdMT0JBTHxJTlBVVHxJTl9PVVR8T1VUUFVUfFRFTVApfFZBUnxNRVRIT0R8UFJPUEVSVFkpXFxiL2ksXG5cdFx0L1xcYig/OkFUfEJZfCg/OkVORF8pPyg/OkNBU0V8Rk9SfElGfFJFUEVBVHxXSElMRSl8Q09OU1RBTlR8Q09OVElOVUV8RE98RUxTRXxFTFNJRnxFWElUfEVYVEVORFN8RlJPTXxHRVR8R09UT3xJTVBMRU1FTlRTfEpNUHxOT05fUkVUQUlOfE9GfFBSSVZBVEV8UFJPVEVDVEVEfFBVQkxJQ3xSRVRBSU58UkVUVVJOfFNFVHxUQVNLfFRIRU58VE98VU5USUx8VVNJTkd8V0lUSHxfX0NBVENIfF9fRU5EVFJZfF9fRklOQUxMWXxfX1RSWSlcXGIvXG5cdF0sXG5cdCdjbGFzcy1uYW1lJzogL1xcYig/OkFOWXxBUlJBWXxCT09MfEJZVEV8VT8oPzpEfEx8Uyk/SU5UfCg/OkR8TCk/V09SRHxEQVRFKD86X0FORF9USU1FKT98RFR8TD9SRUFMfFBPSU5URVJ8U1RSSU5HfFRJTUUoPzpfT0ZfREFZKT98VE9EKVxcYi8sXG5cdCdhZGRyZXNzJzoge1xuXHRcdHBhdHRlcm46IC8lW0lRTV1bWEJXRExdW1xcZC5dKnwlW0lRXVtcXGQuXSovLFxuXHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHR9LFxuXHQnbnVtYmVyJzogL1xcYig/OjE2I1tcXGRhLWZdK3wyI1swMV9dK3wweFtcXGRhLWZdKylcXGJ8XFxiKD86RHxEVHxUfFRPRCkjW1xcZF9zaG1kOl0qfFxcYltBLVpdKiNbXFxkLixfXSp8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspPy9pLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpGQUxTRXxOVUxMfFRSVUUpXFxiLyxcblx0J29wZXJhdG9yJzogL1M/Uj86Pz0+P3wmJj98XFwqXFwqP3w8Wz0+XT98Pj0/fFstOl4vKyNdfFxcYig/OkFORHxFUXxFWFBUfEdFfEdUfExFfExUfE1PRHxORXxOT1R8T1J8WE9SKVxcYi8sXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCkvaSxcblx0J3B1bmN0dWF0aW9uJzogL1soKVtcXF0uLDtdLyxcbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0dmFyIHVuaXQgPSB7XG5cdFx0cGF0dGVybjogLyhcXGJcXGQrKSg/OiV8W2Etel0rKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9O1xuXHQvLyAxMjMgLTEyMyAuMTIzIC0uMTIzIDEyLjMgLTEyLjNcblx0dmFyIG51bWJlciA9IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXHcuLV0pLT8oPzpcXGQrKD86XFwuXFxkKyk/fFxcLlxcZCspLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH07XG5cblx0dmFyIGluc2lkZSA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSg/OlxcL1xcKltcXHNcXFNdKj9cXCpcXC98XFwvXFwvLiopLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCd1cmwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxidXJsXFwoKFtcIiddPykuKj9cXDFcXCkvaSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXCJ8JykoPzooPyFcXDEpW15cXFxcXFxyXFxuXXxcXFxcKD86XFxyXFxufFtcXHNcXFNdKSkqXFwxLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2ludGVycG9sYXRpb24nOiBudWxsLCAvLyBTZWUgYmVsb3dcblx0XHQnZnVuYyc6IG51bGwsIC8vIFNlZSBiZWxvd1xuXHRcdCdpbXBvcnRhbnQnOiAvXFxCISg/OmltcG9ydGFudHxvcHRpb25hbClcXGIvaSxcblx0XHQna2V5d29yZCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXHMrKSg/Oig/OmVsc2V8Zm9yfGlmfHJldHVybnx1bmxlc3MpKD89XFxzfCQpfEBbXFx3LV0rKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnaGV4Y29kZSc6IC8jW1xcZGEtZl17Myw2fS9pLFxuXHRcdCdjb2xvcic6IFtcblx0XHRcdC9cXGIoPzpBbGljZUJsdWV8QW50aXF1ZVdoaXRlfEFxdWF8QXF1YW1hcmluZXxBenVyZXxCZWlnZXxCaXNxdWV8QmxhY2t8QmxhbmNoZWRBbG1vbmR8Qmx1ZXxCbHVlVmlvbGV0fEJyb3dufEJ1cmx5V29vZHxDYWRldEJsdWV8Q2hhcnRyZXVzZXxDaG9jb2xhdGV8Q29yYWx8Q29ybmZsb3dlckJsdWV8Q29ybnNpbGt8Q3JpbXNvbnxDeWFufERhcmtCbHVlfERhcmtDeWFufERhcmtHb2xkZW5Sb2R8RGFya0dyW2FlXXl8RGFya0dyZWVufERhcmtLaGFraXxEYXJrTWFnZW50YXxEYXJrT2xpdmVHcmVlbnxEYXJrT3JhbmdlfERhcmtPcmNoaWR8RGFya1JlZHxEYXJrU2FsbW9ufERhcmtTZWFHcmVlbnxEYXJrU2xhdGVCbHVlfERhcmtTbGF0ZUdyW2FlXXl8RGFya1R1cnF1b2lzZXxEYXJrVmlvbGV0fERlZXBQaW5rfERlZXBTa3lCbHVlfERpbUdyW2FlXXl8RG9kZ2VyQmx1ZXxGaXJlQnJpY2t8RmxvcmFsV2hpdGV8Rm9yZXN0R3JlZW58RnVjaHNpYXxHYWluc2Jvcm98R2hvc3RXaGl0ZXxHb2xkfEdvbGRlblJvZHxHclthZV15fEdyZWVufEdyZWVuWWVsbG93fEhvbmV5RGV3fEhvdFBpbmt8SW5kaWFuUmVkfEluZGlnb3xJdm9yeXxLaGFraXxMYXZlbmRlcnxMYXZlbmRlckJsdXNofExhd25HcmVlbnxMZW1vbkNoaWZmb258TGlnaHRCbHVlfExpZ2h0Q29yYWx8TGlnaHRDeWFufExpZ2h0R29sZGVuUm9kWWVsbG93fExpZ2h0R3JbYWVdeXxMaWdodEdyZWVufExpZ2h0UGlua3xMaWdodFNhbG1vbnxMaWdodFNlYUdyZWVufExpZ2h0U2t5Qmx1ZXxMaWdodFNsYXRlR3JbYWVdeXxMaWdodFN0ZWVsQmx1ZXxMaWdodFllbGxvd3xMaW1lfExpbWVHcmVlbnxMaW5lbnxNYWdlbnRhfE1hcm9vbnxNZWRpdW1BcXVhTWFyaW5lfE1lZGl1bUJsdWV8TWVkaXVtT3JjaGlkfE1lZGl1bVB1cnBsZXxNZWRpdW1TZWFHcmVlbnxNZWRpdW1TbGF0ZUJsdWV8TWVkaXVtU3ByaW5nR3JlZW58TWVkaXVtVHVycXVvaXNlfE1lZGl1bVZpb2xldFJlZHxNaWRuaWdodEJsdWV8TWludENyZWFtfE1pc3R5Um9zZXxNb2NjYXNpbnxOYXZham9XaGl0ZXxOYXZ5fE9sZExhY2V8T2xpdmV8T2xpdmVEcmFifE9yYW5nZXxPcmFuZ2VSZWR8T3JjaGlkfFBhbGVHb2xkZW5Sb2R8UGFsZUdyZWVufFBhbGVUdXJxdW9pc2V8UGFsZVZpb2xldFJlZHxQYXBheWFXaGlwfFBlYWNoUHVmZnxQZXJ1fFBpbmt8UGx1bXxQb3dkZXJCbHVlfFB1cnBsZXxSZWR8Um9zeUJyb3dufFJveWFsQmx1ZXxTYWRkbGVCcm93bnxTYWxtb258U2FuZHlCcm93bnxTZWFHcmVlbnxTZWFTaGVsbHxTaWVubmF8U2lsdmVyfFNreUJsdWV8U2xhdGVCbHVlfFNsYXRlR3JbYWVdeXxTbm93fFNwcmluZ0dyZWVufFN0ZWVsQmx1ZXxUYW58VGVhbHxUaGlzdGxlfFRvbWF0b3xUcmFuc3BhcmVudHxUdXJxdW9pc2V8VmlvbGV0fFdoZWF0fFdoaXRlfFdoaXRlU21va2V8WWVsbG93fFllbGxvd0dyZWVuKVxcYi9pLFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiKD86aHNsfHJnYilcXChcXHMqXFxkezEsM31cXHMqLFxccypcXGR7MSwzfSU/XFxzKixcXHMqXFxkezEsM30lP1xccypcXClcXEJ8XFxiKD86aHNsfHJnYilhXFwoXFxzKlxcZHsxLDN9XFxzKixcXHMqXFxkezEsM30lP1xccyosXFxzKlxcZHsxLDN9JT9cXHMqLFxccyooPzowfDA/XFwuXFxkK3wxKVxccypcXClcXEIvaSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3VuaXQnOiB1bml0LFxuXHRcdFx0XHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0XHRcdFx0J2Z1bmN0aW9uJzogL1tcXHctXSsoPz1cXCgpLyxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWygpLF0vXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCdlbnRpdHknOiAvXFxcXFtcXGRhLWZdezEsOH0vaSxcblx0XHQndW5pdCc6IHVuaXQsXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHRcdCdvcGVyYXRvcic6IFtcblx0XHRcdC8vIFdlIHdhbnQgbm9uLXdvcmQgY2hhcnMgYXJvdW5kIFwiLVwiIGJlY2F1c2UgaXQgaXNcblx0XHRcdC8vIGFjY2VwdGVkIGluIHByb3BlcnR5IG5hbWVzLlxuXHRcdFx0L358WyshXFwvJTw+Pz1dPT98Wy06XT18XFwqWyo9XT98XFwuezIsM318JiZ8XFx8XFx8fFxcQi1cXEJ8XFxiKD86YW5kfGlufGlzKD86IGF8IGRlZmluZWR8IG5vdHxudCk/fG5vdHxvcilcXGIvXG5cdFx0XSxcblx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9be30oKVxcW1xcXTs6LF0vXG5cdH07XG5cblx0aW5zaWRlWydpbnRlcnBvbGF0aW9uJ10gPSB7XG5cdFx0cGF0dGVybjogL1xce1teXFxyXFxufTpdK1xcfS8sXG5cdFx0YWxpYXM6ICd2YXJpYWJsZScsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXlxce3xcXH0kLyxcblx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdH0sXG5cdFx0XHRyZXN0OiBpbnNpZGVcblx0XHR9XG5cdH07XG5cdGluc2lkZVsnZnVuYyddID0ge1xuXHRcdHBhdHRlcm46IC9bXFx3LV0rXFwoW14pXSpcXCkuKi8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnZnVuY3Rpb24nOiAvXlteKF0rLyxcblx0XHRcdHJlc3Q6IGluc2lkZVxuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuc3R5bHVzID0ge1xuXHRcdCdhdHJ1bGUtZGVjbGFyYXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKUAuKy9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnYXRydWxlJzogL15AW1xcdy1dKy8sXG5cdFx0XHRcdHJlc3Q6IGluc2lkZVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3ZhcmlhYmxlLWRlY2xhcmF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKilbXFx3JC1dK1xccyouPz1bIFxcdF0qKD86XFx7W157fV0qXFx9fFxcUy4qfCQpL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCd2YXJpYWJsZSc6IC9eXFxTKy8sXG5cdFx0XHRcdHJlc3Q6IGluc2lkZVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQnc3RhdGVtZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKikoPzplbHNlfGZvcnxpZnxyZXR1cm58dW5sZXNzKVsgXFx0XS4rL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdrZXl3b3JkJzogL15cXFMrLyxcblx0XHRcdFx0cmVzdDogaW5zaWRlXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIEEgcHJvcGVydHkvdmFsdWUgcGFpciBjYW5ub3QgZW5kIHdpdGggYSBjb21tYSBvciBhIGJyYWNlXG5cdFx0Ly8gSXQgY2Fubm90IGhhdmUgaW5kZW50ZWQgY29udGVudCB1bmxlc3MgaXQgZW5kZWQgd2l0aCBhIHNlbWljb2xvblxuXHRcdCdwcm9wZXJ0eS1kZWNsYXJhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxcXHspKFsgXFx0XSopKSg/OltcXHctXXxcXHtbXn1cXHJcXG5dK1xcfSkrKD86XFxzKjpcXHMqfFsgXFx0XSspKD8hXFxzKVtee1xcclxcbl0qKD86O3xbXntcXHJcXG4sXSQoPyEoPzpcXHI/XFxufFxccikoPzpcXHt8XFwyWyBcXHRdKSkpL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwcm9wZXJ0eSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlteXFxzOl0rLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzogaW5zaWRlLmludGVycG9sYXRpb25cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJlc3Q6IGluc2lkZVxuXHRcdFx0fVxuXHRcdH0sXG5cblxuXHRcdC8vIEEgc2VsZWN0b3IgY2FuIGNvbnRhaW4gcGFyZW50aGVzZXMgb25seSBhcyBwYXJ0IG9mIGEgcHNldWRvLWVsZW1lbnRcblx0XHQvLyBJdCBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcy5cblx0XHQvLyBJdCBtdXN0IGVuZCB3aXRoIGEgY29tbWEgb3IgYW4gYWNjb2xhZGUgb3IgaGF2ZSBpbmRlbnRlZCBjb250ZW50LlxuXHRcdCdzZWxlY3Rvcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopKD86KD89XFxTKSg/Oltee31cXHJcXG46KCldfDo6P1tcXHctXSsoPzpcXChbXilcXHJcXG5dKlxcKXwoPyFbXFx3LV0pKXxcXHtbXn1cXHJcXG5dK1xcfSkrKSg/Oig/Olxccj9cXG58XFxyKSg/OlxcMSg/Oig/PVxcUykoPzpbXnt9XFxyXFxuOigpXXw6Oj9bXFx3LV0rKD86XFwoW14pXFxyXFxuXSpcXCl8KD8hW1xcdy1dKSl8XFx7W159XFxyXFxuXStcXH0pKykpKSooPzosJHxcXHt8KD89KD86XFxyP1xcbnxcXHIpKD86XFx7fFxcMVsgXFx0XSkpKS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IGluc2lkZS5pbnRlcnBvbGF0aW9uLFxuXHRcdFx0XHQnY29tbWVudCc6IGluc2lkZS5jb21tZW50LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvW3t9LF0vXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdmdW5jJzogaW5zaWRlLmZ1bmMsXG5cdFx0J3N0cmluZyc6IGluc2lkZS5zdHJpbmcsXG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkoPzpcXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFxcL1xcLy4qKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnaW50ZXJwb2xhdGlvbic6IGluc2lkZS5pbnRlcnBvbGF0aW9uLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9be30oKVxcW1xcXTs6Ll0vXG5cdH07XG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5zdXBlcmNvbGxpZGVyID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwvLip8XFwvXFwqKD86W14qL118XFwqKD8hXFwvKXxcXC8oPyFcXCopfFxcL1xcKig/OlteKl18XFwqKD8hXFwvKSkqXFwqXFwvKSpcXCpcXC8vLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVwiKD86W15cIlxcXFxdfFxcXFxbXFxzXFxTXSkqXCIvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjaGFyJzoge1xuXHRcdHBhdHRlcm46IC9cXCQoPzpbXlxcXFxcXHJcXG5dfFxcXFwuKS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzeW1ib2wnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pJyg/OlteJ1xcXFxdfFxcXFxbXFxzXFxTXSkqJ3xcXFxcXFx3Ky8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQna2V5d29yZCc6IC9cXGIoPzpffGFyZ3xjbGFzc3Zhcnxjb25zdHxuaWx8dmFyfHdoaWxlKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblxuXHQnbGFiZWwnOiB7XG5cdFx0cGF0dGVybjogL1xcYlthLXpfXVxcdyooPz1cXHMqOikvLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cblx0J251bWJlcic6IC9cXGIoPzppbmZ8cGl8MHhbMC05YS1mQS1GXSt8XFxkKyg/OlxcLlxcZCspPyg/OltlRV1bKy1dP1xcZCspPyg/OnBpKT98XFxkK3JbMC05YS16QS1aXSsoPzpcXC5bMC05YS16QS1aXSspP3xcXGQrW3NiXXsxLDR9XFxkKilcXGIvLFxuXHQnY2xhc3MtbmFtZSc6IC9cXGJbQS1aXVxcdypcXGIvLFxuXG5cdCdvcGVyYXRvcic6IC9cXC57MiwzfXwjKD8hW1t7XSl8JiZ8WyE9XT09P3xcXCs+PnxcXCt7MSwzfXwtWy0+XXw9Pnw+PnxcXD9cXD98QFxcfD9AfFxcfCg/OkB8WyE9XT0pP1xcfHwhXFw/fDxbIT0+XXxcXCp7MSwyfXw8ezIsM31cXCo/fFstISUmLzw+P0B8PWBdLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fSgpW1xcXS46LDtdfCNbW3tdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnNjbGFuZyA9IFByaXNtLmxhbmd1YWdlcy5zdXBlcmNvbGxpZGVyO1xuXG5QcmlzbS5sYW5ndWFnZXMuc3dpZnQgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdC8vIE5lc3RlZCBjb21tZW50cyBhcmUgc3VwcG9ydGVkIHVwIHRvIDIgbGV2ZWxzXG5cdFx0cGF0dGVybjogLyhefFteXFxcXDpdKSg/OlxcL1xcLy4qfFxcL1xcKig/OlteLypdfFxcLyg/IVxcKil8XFwqKD8hXFwvKXxcXC9cXCooPzpbXipdfFxcKig/IVxcLykpKlxcKlxcLykqXFwqXFwvKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZy1saXRlcmFsJzogW1xuXHRcdC8vIGh0dHBzOi8vZG9jcy5zd2lmdC5vcmcvc3dpZnQtYm9vay9MYW5ndWFnZUd1aWRlL1N0cmluZ3NBbmRDaGFyYWN0ZXJzLmh0bWxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdC8oXnxbXlwiI10pLy5zb3VyY2Vcblx0XHRcdFx0KyAnKD86J1xuXHRcdFx0XHQvLyBzaW5nbGUtbGluZSBzdHJpbmdcblx0XHRcdFx0KyAvXCIoPzpcXFxcKD86XFwoKD86W14oKV18XFwoW14oKV0qXFwpKSpcXCl8XFxyXFxufFteKF0pfFteXFxcXFxcclxcblwiXSkqXCIvLnNvdXJjZVxuXHRcdFx0XHQrICd8J1xuXHRcdFx0XHQvLyBtdWx0aS1saW5lIHN0cmluZ1xuXHRcdFx0XHQrIC9cIlwiXCIoPzpcXFxcKD86XFwoKD86W14oKV18XFwoW14oKV0qXFwpKSpcXCl8W14oXSl8W15cXFxcXCJdfFwiKD8hXCJcIikpKlwiXCJcIi8uc291cmNlXG5cdFx0XHRcdCsgJyknXG5cdFx0XHRcdCsgLyg/IVtcIiNdKS8uc291cmNlXG5cdFx0XHQpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxcXFxcXCgpKD86W14oKV18XFwoW14oKV0qXFwpKSooPz1cXCkpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdFx0fSxcblx0XHRcdFx0J2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15cXCl8XFxcXFxcKCQvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFxcKD89W1xcclxcbl0pLyxcblx0XHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdC8oXnxbXlwiI10pKCMrKS8uc291cmNlXG5cdFx0XHRcdCsgJyg/Oidcblx0XHRcdFx0Ly8gc2luZ2xlLWxpbmUgc3RyaW5nXG5cdFx0XHRcdCsgL1wiKD86XFxcXCg/OiMrXFwoKD86W14oKV18XFwoW14oKV0qXFwpKSpcXCl8XFxyXFxufFteI10pfFteXFxcXFxcclxcbl0pKj9cIi8uc291cmNlXG5cdFx0XHRcdCsgJ3wnXG5cdFx0XHRcdC8vIG11bHRpLWxpbmUgc3RyaW5nXG5cdFx0XHRcdCsgL1wiXCJcIig/OlxcXFwoPzojK1xcKCg/OlteKCldfFxcKFteKCldKlxcKSkqXFwpfFteI10pfFteXFxcXF0pKj9cIlwiXCIvLnNvdXJjZVxuXHRcdFx0XHQrICcpJ1xuXHRcdFx0XHQrICdcXFxcMidcblx0XHRcdCksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXFxcXCMrXFwoKSg/OlteKCldfFxcKFteKCldKlxcKSkqKD89XFwpKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eXFwpfFxcXFwjK1xcKCQvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdFx0fVxuXHRcdH0sXG5cdF0sXG5cblx0J2RpcmVjdGl2ZSc6IHtcblx0XHQvLyBkaXJlY3RpdmVzIHdpdGggY29uZGl0aW9uc1xuXHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdC8jLy5zb3VyY2Vcblx0XHRcdCsgJyg/Oidcblx0XHRcdCsgKFxuXHRcdFx0XHQvKD86ZWxzZWlmfGlmKVxcYi8uc291cmNlXG5cdFx0XHRcdCsgJyg/OlsgXFx0XSonXG5cdFx0XHRcdC8vIFRoaXMgcmVnZXggaXMgYSBsaXR0bGUgY29tcGxleC4gSXQncyBlcXVpdmFsZW50IHRvIHRoaXM6XG5cdFx0XHRcdC8vICAgKD86IVsgXFx0XSopPyg/OlxcYlxcdytcXGIoPzpbIFxcdF0qPHJvdW5kPik/fDxyb3VuZD4pKD86WyBcXHRdKig/OiYmfFxcfFxcfCkpP1xuXHRcdFx0XHQvLyB3aGVyZSA8cm91bmQ+IGlzIGEgZ2VuZXJhbCBwYXJlbnRoZXNlcyBleHByZXNzaW9uLlxuXHRcdFx0XHQrIC8oPzohWyBcXHRdKik/KD86XFxiXFx3K1xcYig/OlsgXFx0XSpcXCgoPzpbXigpXXxcXChbXigpXSpcXCkpKlxcKSk/fFxcKCg/OlteKCldfFxcKFteKCldKlxcKSkqXFwpKSg/OlsgXFx0XSooPzomJnxcXHxcXHwpKT8vLnNvdXJjZVxuXHRcdFx0XHQrICcpKydcblx0XHRcdClcblx0XHRcdCsgJ3wnXG5cdFx0XHQrIC8oPzplbHNlfGVuZGlmKVxcYi8uc291cmNlXG5cdFx0XHQrICcpJ1xuXHRcdCksXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eScsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnZGlyZWN0aXZlLW5hbWUnOiAvXiNcXHcrLyxcblx0XHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0XHRcdCdudW1iZXInOiAvXFxiXFxkKyg/OlxcLlxcZCspKlxcYi8sXG5cdFx0XHQnb3BlcmF0b3InOiAvIXwmJnxcXHxcXHx8Wzw+XT0/Lyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKCksXS9cblx0XHR9XG5cdH0sXG5cdCdsaXRlcmFsJzoge1xuXHRcdHBhdHRlcm46IC8jKD86Y29sb3JMaXRlcmFsfGNvbHVtbnxkc29oYW5kbGV8ZmlsZSg/OklEfExpdGVyYWx8UGF0aCk/fGZ1bmN0aW9ufGltYWdlTGl0ZXJhbHxsaW5lKVxcYi8sXG5cdFx0YWxpYXM6ICdjb25zdGFudCdcblx0fSxcblx0J290aGVyLWRpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvI1xcdytcXGIvLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cblx0J2F0dHJpYnV0ZSc6IHtcblx0XHRwYXR0ZXJuOiAvQFxcdysvLFxuXHRcdGFsaWFzOiAnYXRydWxlJ1xuXHR9LFxuXG5cdCdmdW5jdGlvbi1kZWZpbml0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiZnVuY1xccyspXFx3Ky8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQnbGFiZWwnOiB7XG5cdFx0Ly8gaHR0cHM6Ly9kb2NzLnN3aWZ0Lm9yZy9zd2lmdC1ib29rL0xhbmd1YWdlR3VpZGUvQ29udHJvbEZsb3cuaHRtbCNJRDE0MVxuXHRcdHBhdHRlcm46IC9cXGIoYnJlYWt8Y29udGludWUpXFxzK1xcdyt8XFxiW2EtekEtWl9dXFx3Kig/PVxccyo6XFxzKig/OmZvcnxyZXBlYXR8d2hpbGUpXFxiKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0fSxcblxuXHQna2V5d29yZCc6IC9cXGIoPzpBbnl8UHJvdG9jb2x8U2VsZnxUeXBlfGFjdG9yfGFzfGFzc2lnbm1lbnR8YXNzb2NpYXRlZHR5cGV8YXNzb2NpYXRpdml0eXxhc3luY3xhd2FpdHxicmVha3xjYXNlfGNhdGNofGNsYXNzfGNvbnRpbnVlfGNvbnZlbmllbmNlfGRlZmF1bHR8ZGVmZXJ8ZGVpbml0fGRpZFNldHxkb3xkeW5hbWljfGVsc2V8ZW51bXxleHRlbnNpb258ZmFsbHRocm91Z2h8ZmlsZXByaXZhdGV8ZmluYWx8Zm9yfGZ1bmN8Z2V0fGd1YXJkfGhpZ2hlclRoYW58aWZ8aW1wb3J0fGlufGluZGlyZWN0fGluZml4fGluaXR8aW5vdXR8aW50ZXJuYWx8aXN8aXNvbGF0ZWR8bGF6eXxsZWZ0fGxldHxsb3dlclRoYW58bXV0YXRpbmd8bm9uZXxub25pc29sYXRlZHxub25tdXRhdGluZ3xvcGVufG9wZXJhdG9yfG9wdGlvbmFsfG92ZXJyaWRlfHBvc3RmaXh8cHJlY2VkZW5jZWdyb3VwfHByZWZpeHxwcml2YXRlfHByb3RvY29sfHB1YmxpY3xyZXBlYXR8cmVxdWlyZWR8cmV0aHJvd3N8cmV0dXJufHJpZ2h0fHNhZmV8c2VsZnxzZXR8c29tZXxzdGF0aWN8c3RydWN0fHN1YnNjcmlwdHxzdXBlcnxzd2l0Y2h8dGhyb3d8dGhyb3dzfHRyeXx0eXBlYWxpYXN8dW5vd25lZHx1bnNhZmV8dmFyfHdlYWt8d2hlcmV8d2hpbGV8d2lsbFNldClcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCduaWwnOiB7XG5cdFx0cGF0dGVybjogL1xcYm5pbFxcYi8sXG5cdFx0YWxpYXM6ICdjb25zdGFudCdcblx0fSxcblxuXHQnc2hvcnQtYXJndW1lbnQnOiAvXFwkXFxkK1xcYi8sXG5cdCdvbWl0Jzoge1xuXHRcdHBhdHRlcm46IC9cXGJfXFxiLyxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdudW1iZXInOiAvXFxiKD86W1xcZF9dKyg/OlxcLltcXGRlX10rKT98MHhbYS1mMC05X10rKD86XFwuW2EtZjAtOXBfXSspP3wwYlswMV9dK3wwb1swLTdfXSspXFxiL2ksXG5cblx0Ly8gQSBjbGFzcyBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlci1jYXNlIGxldHRlciBhbmQgYmUgZWl0aGVyIDEgbGV0dGVyIGxvbmcgb3IgY29udGFpbiBhIGxvd2VyLWNhc2UgbGV0dGVyLlxuXHQnY2xhc3MtbmFtZSc6IC9cXGJbQS1aXSg/OltBLVpfXFxkXSpbYS16XVxcdyopP1xcYi8sXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCkvaSxcblx0J2NvbnN0YW50JzogL1xcYig/OltBLVpfXXsyLH18a1tBLVpdW0EtWmEtel9dKylcXGIvLFxuXG5cdC8vIE9wZXJhdG9ycyBhcmUgZ2VuZXJpYyBpbiBTd2lmdC4gRGV2ZWxvcGVycyBjYW4gZXZlbiBjcmVhdGUgbmV3IG9wZXJhdG9ycyAoZS5nLiArKyspLlxuXHQvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL3p6U3VtbWFyeU9mVGhlR3JhbW1hci5odG1sI0lENDgxXG5cdC8vIFRoaXMgcmVnZXggb25seSBzdXBwb3J0cyBBU0NJSSBvcGVyYXRvcnMuXG5cdCdvcGVyYXRvcic6IC9bLSsqLyU9ITw+Jnxefj9dK3xcXC5bLlxcLSsqLyU9ITw+Jnxefj9dKy8sXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdKCk7LC46XFxcXF0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuc3dpZnRbJ3N0cmluZy1saXRlcmFsJ10uZm9yRWFjaChmdW5jdGlvbiAocnVsZSkge1xuXHRydWxlLmluc2lkZVsnaW50ZXJwb2xhdGlvbiddLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5zd2lmdDtcbn0pO1xuXG4vLyBodHRwczovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvc3lzdGVtZC9tYW4vc3lzdGVtZC5zeW50YXguaHRtbFxuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGNvbW1lbnQgPSB7XG5cdFx0cGF0dGVybjogL15bOyNdLiovbSxcblx0XHRncmVlZHk6IHRydWVcblx0fTtcblxuXHR2YXIgcXVvdGVzU291cmNlID0gL1wiKD86W15cXHJcXG5cIlxcXFxdfFxcXFwoPzpbXlxccl18XFxyXFxuPykpKlwiKD8hXFxTKS8uc291cmNlO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5zeXN0ZW1kID0ge1xuXHRcdCdjb21tZW50JzogY29tbWVudCxcblxuXHRcdCdzZWN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogL15cXFtbXlxcblxcclxcW1xcXV0qXFxdKD89WyBcXHRdKiQpL20sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXFt8XFxdJC8sXG5cdFx0XHRcdCdzZWN0aW9uLW5hbWUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0YWxpYXM6ICdzZWxlY3Rvcidcblx0XHRcdFx0fSxcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J2tleSc6IHtcblx0XHRcdHBhdHRlcm46IC9eW15cXHM9XSsoPz1bIFxcdF0qPSkvbSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnYXR0ci1uYW1lJ1xuXHRcdH0sXG5cdFx0J3ZhbHVlJzoge1xuXHRcdFx0Ly8gVGhpcyBwYXR0ZXJuIGlzIHF1aXRlIGNvbXBsZXggYmVjYXVzZSBvZiB0d28gcHJvcGVydGllczpcblx0XHRcdC8vICAxKSBRdW90ZXMgKHN0cmluZ3MpIG11c3QgYmUgcHJlY2VkZWQgYnkgYSBzcGFjZS4gU2luY2Ugd2UgY2FuJ3QgdXNlIGxvb2tiZWhpbmRzLCB3ZSBoYXZlIHRvIFwicmVzb2x2ZVwiXG5cdFx0XHQvLyAgICAgdGhlIGxvb2tiZWhpbmQuIFlvdSB3aWxsIHNlZSB0aGlzIGluIHRoZSBtYWluIGxvb3Agd2hlcmUgc3BhY2VzIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkuXG5cdFx0XHQvLyAgMikgTGluZSBjb250aW51YXRpb25zLlxuXHRcdFx0Ly8gICAgIEFmdGVyIGxpbmUgY29udGludWF0aW9ucywgZW1wdHkgbGluZXMgYW5kIGNvbW1lbnRzIGFyZSBpZ25vcmVkIHNvIHdlIGhhdmUgdG8gY29uc3VtZSB0aGVtLlxuXHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHQvKD1bIFxcdF0qKD8hXFxzKSkvLnNvdXJjZSArXG5cdFx0XHRcdC8vIHRoZSB2YWx1ZSBlaXRoZXIgc3RhcnRzIHdpdGggcXVvdGVzIG9yIG5vdFxuXHRcdFx0XHQnKD86JyArIHF1b3Rlc1NvdXJjZSArICd8KD89W15cIlxcclxcbl0pKScgK1xuXHRcdFx0XHQvLyBtYWluIGxvb3Bcblx0XHRcdFx0Jyg/OicgKyAoXG5cdFx0XHRcdFx0L1teXFxzXFxcXF0vLnNvdXJjZSArXG5cdFx0XHRcdFx0Ly8gaGFuZGxlIHNwYWNlcyBzZXBhcmF0ZWx5IGJlY2F1c2Ugb2YgcXVvdGVzXG5cdFx0XHRcdFx0J3wnICsgJ1sgXFx0XSsoPzooPyFbIFxcdFwiXSl8JyArIHF1b3Rlc1NvdXJjZSArICcpJyArXG5cdFx0XHRcdFx0Ly8gbGluZSBjb250aW51YXRpb25cblx0XHRcdFx0XHQnfCcgKyAvXFxcXFtcXHJcXG5dKyg/OlsjO10uKltcXHJcXG5dKykqKD8hWyM7XSkvLnNvdXJjZVxuXHRcdFx0XHQpICtcblx0XHRcdFx0JykqJ1xuXHRcdFx0KSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2F0dHItdmFsdWUnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjb21tZW50JzogY29tbWVudCxcblx0XHRcdFx0J3F1b3RlZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhefFxccykvLnNvdXJjZSArIHF1b3Rlc1NvdXJjZSksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFxcJC9tLFxuXG5cdFx0XHRcdCdib29sZWFuJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKD86ZmFsc2V8bm98b2ZmfG9ufHRydWV8eWVzKSQvLFxuXHRcdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdwdW5jdHVhdGlvbic6IC89L1xuXHR9O1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRmdW5jdGlvbiBjcmVhdGVCbG9jayhwcmVmaXgsIGluc2lkZSwgY29udGVudEFsaWFzKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnPCMnICsgcHJlZml4ICsgJ1tcXFxcc1xcXFxTXSo/Iz4nKSxcblx0XHRcdGFsaWFzOiAnYmxvY2snLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKCdePCMnICsgcHJlZml4ICsgJ3wjPiQnKSxcblx0XHRcdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHRcdFx0fSxcblx0XHRcdFx0J2NvbnRlbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0aW5zaWRlOiBpbnNpZGUsXG5cdFx0XHRcdFx0YWxpYXM6IGNvbnRlbnRBbGlhc1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdGZ1bmN0aW9uIGNyZWF0ZVQ0KGluc2lkZUxhbmcpIHtcblx0XHR2YXIgZ3JhbW1hciA9IFByaXNtLmxhbmd1YWdlc1tpbnNpZGVMYW5nXTtcblx0XHR2YXIgY2xhc3NOYW1lID0gJ2xhbmd1YWdlLScgKyBpbnNpZGVMYW5nO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdCdibG9jayc6IHtcblx0XHRcdFx0cGF0dGVybjogLzwjW1xcc1xcU10rPyM+Lyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2RpcmVjdGl2ZSc6IGNyZWF0ZUJsb2NrKCdAJywge1xuXHRcdFx0XHRcdFx0J2F0dHItdmFsdWUnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC89KD86KFwifCcpKD86XFxcXFtcXHNcXFNdfCg/IVxcMSlbXlxcXFxdKSpcXDF8W15cXHMnXCI+PV0rKS8sXG5cdFx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9ePXxeW1wiJ118W1wiJ10kL1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J2tleXdvcmQnOiAvXFxiXFx3Kyg/PVxccykvLFxuXHRcdFx0XHRcdFx0J2F0dHItbmFtZSc6IC9cXGJcXHcrL1xuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdCdleHByZXNzaW9uJzogY3JlYXRlQmxvY2soJz0nLCBncmFtbWFyLCBjbGFzc05hbWUpLFxuXHRcdFx0XHRcdCdjbGFzcy1mZWF0dXJlJzogY3JlYXRlQmxvY2soJ1xcXFwrJywgZ3JhbW1hciwgY2xhc3NOYW1lKSxcblx0XHRcdFx0XHQnc3RhbmRhcmQnOiBjcmVhdGVCbG9jaygnJywgZ3JhbW1hciwgY2xhc3NOYW1lKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdFByaXNtLmxhbmd1YWdlc1sndDQtdGVtcGxhdGluZyddID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnY3JlYXRlVDQnLCB7IHZhbHVlOiBjcmVhdGVUNCB9KTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMudDQgPSBQcmlzbS5sYW5ndWFnZXNbJ3Q0LWNzJ10gPSBQcmlzbS5sYW5ndWFnZXNbJ3Q0LXRlbXBsYXRpbmcnXS5jcmVhdGVUNCgnY3NoYXJwJyk7XG5cblByaXNtLmxhbmd1YWdlcy52Ym5ldCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2Jhc2ljJywge1xuXHQnY29tbWVudCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKD86IXxSRU1cXGIpLisvaSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQna2V5d29yZCc6IC9eUkVNL2lcblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFw6XSknLiovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cIl0pXCIoPzpcIlwifFteXCJdKSpcIig/IVwiKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvKD86XFxiKD86QURESEFORExFUnxBRERSRVNTT0Z8QUxJQVN8QU5EfEFOREFMU098QVN8QkVFUHxCTE9BRHxCT09MRUFOfEJTQVZFfEJZUkVGfEJZVEV8QllWQUx8Q0FMTCg/OiBBQlNPTFVURSk/fENBU0V8Q0FUQ0h8Q0JPT0x8Q0JZVEV8Q0NIQVJ8Q0RBVEV8Q0RCTHxDREVDfENIQUlOfENIQVJ8Q0hESVJ8Q0lOVHxDTEFTU3xDTEVBUnxDTE5HfENMT1NFfENMU3xDT0JKfENPTXxDT01NT058Q09OU1R8Q09OVElOVUV8Q1NCWVRFfENTSE9SVHxDU05HfENTVFJ8Q1RZUEV8Q1VJTlR8Q1VMTkd8Q1VTSE9SVHxEQVRBfERBVEV8REVDSU1BTHxERUNMQVJFfERFRig/OiBGTnwgU0VHfERCTHxJTlR8TE5HfFNOR3xTVFIpfERFRkFVTFR8REVMRUdBVEV8RElNfERJUkVDVENBU1R8RE98RE9VQkxFfEVMU0V8RUxTRUlGfEVORHxFTlVNfEVOVklST058RVJBU0V8RVJST1J8RVZFTlR8RVhJVHxGQUxTRXxGSUVMRHxGSUxFU3xGSU5BTExZfEZPUig/OiBFQUNIKT98RlJJRU5EfEZVTkNUSU9OfEdFVHxHRVRUWVBFfEdFVFhNTE5BTUVTUEFDRXxHTE9CQUx8R09TVUJ8R09UT3xIQU5ETEVTfElGfElNUExFTUVOVFN8SU1QT1JUU3xJTnxJTkhFUklUU3xJTlBVVHxJTlRFR0VSfElOVEVSRkFDRXxJT0NUTHxJU3xJU05PVHxLRVl8S0lMTHxMRVR8TElCfExJS0V8TElORSBJTlBVVHxMT0NBVEV8TE9DS3xMT05HfExPT1B8TFNFVHxNRXxNS0RJUnxNT0R8TU9EVUxFfE1VU1RJTkhFUklUfE1VU1RPVkVSUklERXxNWUJBU0V8TVlDTEFTU3xOQU1FfE5BTUVTUEFDRXxOQVJST1dJTkd8TkVXfE5FWFR8Tk9UfE5PVEhJTkd8Tk9USU5IRVJJVEFCTEV8Tk9UT1ZFUlJJREFCTEV8T0JKRUNUfE9GfE9GRnxPTig/OiBDT018IEVSUk9SfCBLRVl8IFRJTUVSKT98T1BFTnxPUEVSQVRPUnxPUFRJT04oPzogQkFTRSk/fE9QVElPTkFMfE9SfE9SRUxTRXxPVVR8T1ZFUkxPQURTfE9WRVJSSURBQkxFfE9WRVJSSURFU3xQQVJBTUFSUkFZfFBBUlRJQUx8UE9LRXxQUklWQVRFfFBST1BFUlRZfFBST1RFQ1RFRHxQVUJMSUN8UFVUfFJBSVNFRVZFTlR8UkVBRHxSRUFET05MWXxSRURJTXxSRU18UkVNT1ZFSEFORExFUnxSRVNUT1JFfFJFU1VNRXxSRVRVUk58Uk1ESVJ8UlNFVHxSVU58U0JZVEV8U0VMRUNUKD86IENBU0UpP3xTRVR8U0hBRE9XU3xTSEFSRUR8U0hFTEx8U0hPUlR8U0lOR0xFfFNMRUVQfFNUQVRJQ3xTVEVQfFNUT1B8U1RSSU5HfFNUUlVDVFVSRXxTVUJ8U1dBUHxTWU5DTE9DS3xTWVNURU18VEhFTnxUSFJPV3xUSU1FUnxUT3xUUk9GRnxUUk9OfFRSVUV8VFJZfFRSWUNBU1R8VFlQRXxUWVBFT0Z8VUlOVEVHRVJ8VUxPTkd8VU5MT0NLfFVOVElMfFVTSE9SVHxVU0lOR3xWSUVXIFBSSU5UfFdBSVR8V0VORHxXSEVOfFdISUxFfFdJREVOSU5HfFdJVEh8V0lUSEVWRU5UU3xXUklURXxXUklURU9OTFl8WE9SKXxcXEIoPzojQ09OU1R8I0VMU0V8I0VMU0VJRnwjRU5EfCNJRikpKD86XFwkfFxcYikvaSxcblx0J3B1bmN0dWF0aW9uJzogL1ssOzooKXt9XS9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXNbJ3Q0LXZiJ10gPSBQcmlzbS5sYW5ndWFnZXNbJ3Q0LXRlbXBsYXRpbmcnXS5jcmVhdGVUNCgndmJuZXQnKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8vIGh0dHBzOi8veWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2MtbnMtYW5jaG9yLXByb3BlcnR5XG5cdC8vIGh0dHBzOi8veWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2MtbnMtYWxpYXMtbm9kZVxuXHR2YXIgYW5jaG9yT3JBbGlhcyA9IC9bKiZdW15cXHNbXFxde30sXSsvO1xuXHQvLyBodHRwczovL3lhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNjLW5zLXRhZy1wcm9wZXJ0eVxuXHR2YXIgdGFnID0gLyEoPzo8W1xcd1xcLSUjOy8/OkAmPSskLC4hfionKClbXFxdXSs+fCg/OlthLXpBLVpcXGQtXSohKT9bXFx3XFwtJSM7Lz86QCY9KyQufionKCldKyk/Lztcblx0Ly8gaHR0cHM6Ly95YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjYy1ucy1wcm9wZXJ0aWVzKG4sYylcblx0dmFyIHByb3BlcnRpZXMgPSAnKD86JyArIHRhZy5zb3VyY2UgKyAnKD86WyBcXHRdKycgKyBhbmNob3JPckFsaWFzLnNvdXJjZSArICcpP3wnXG5cdFx0KyBhbmNob3JPckFsaWFzLnNvdXJjZSArICcoPzpbIFxcdF0rJyArIHRhZy5zb3VyY2UgKyAnKT8pJztcblx0Ly8gaHR0cHM6Ly95YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjbnMtcGxhaW4obixjKVxuXHQvLyBUaGlzIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIHRoYXQgZG9lc24ndCBzdXBwb3J0IFwiI1wiIGFuZCBtdWx0aWxpbmUga2V5c1xuXHQvLyBBbGwgdGhlc2UgbG9uZyBzY2FycnkgY2hhcmFjdGVyIGNsYXNzZXMgYXJlIHNpbXBsaWZpZWQgdmVyc2lvbnMgb2YgWUFNTCdzIGNoYXJhY3RlcnNcblx0dmFyIHBsYWluS2V5ID0gLyg/OlteXFxzXFx4MDAtXFx4MDhcXHgwZS1cXHgxZiFcIiMlJicqLFxcLTo+P0BbXFxdYHt8fVxceDdmLVxceDg0XFx4ODYtXFx4OWZcXHVkODAwLVxcdWRmZmZcXHVmZmZlXFx1ZmZmZl18Wz86LV08UExBSU4+KSg/OlsgXFx0XSooPzooPyFbIzpdKTxQTEFJTj58OjxQTEFJTj4pKSovLnNvdXJjZVxuXHRcdC5yZXBsYWNlKC88UExBSU4+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIC9bXlxcc1xceDAwLVxceDA4XFx4MGUtXFx4MWYsW1xcXXt9XFx4N2YtXFx4ODRcXHg4Ni1cXHg5ZlxcdWQ4MDAtXFx1ZGZmZlxcdWZmZmVcXHVmZmZmXS8uc291cmNlOyB9KTtcblx0dmFyIHN0cmluZyA9IC9cIig/OlteXCJcXFxcXFxyXFxuXXxcXFxcLikqXCJ8Jyg/OlteJ1xcXFxcXHJcXG5dfFxcXFwuKSonLy5zb3VyY2U7XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2ZsYWdzXVxuXHQgKiBAcmV0dXJucyB7UmVnRXhwfVxuXHQgKi9cblx0ZnVuY3Rpb24gY3JlYXRlVmFsdWVQYXR0ZXJuKHZhbHVlLCBmbGFncykge1xuXHRcdGZsYWdzID0gKGZsYWdzIHx8ICcnKS5yZXBsYWNlKC9tL2csICcnKSArICdtJzsgLy8gYWRkIG0gZmxhZ1xuXHRcdHZhciBwYXR0ZXJuID0gLyhbOlxcLSxbe11cXHMqKD86XFxzPDxwcm9wPj5bIFxcdF0rKT8pKD86PDx2YWx1ZT4+KSg/PVsgXFx0XSooPzokfCx8XFxdfFxcfXwoPzpbXFxyXFxuXVxccyopPyMpKS8uc291cmNlXG5cdFx0XHQucmVwbGFjZSgvPDxwcm9wPj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gcHJvcGVydGllczsgfSkucmVwbGFjZSgvPDx2YWx1ZT4+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbHVlOyB9KTtcblx0XHRyZXR1cm4gUmVnRXhwKHBhdHRlcm4sIGZsYWdzKTtcblx0fVxuXG5cdFByaXNtLmxhbmd1YWdlcy55YW1sID0ge1xuXHRcdCdzY2FsYXInOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhbXFwtOl1cXHMqKD86XFxzPDxwcm9wPj5bIFxcdF0rKT9bfD5dKVsgXFx0XSooPzooKD86XFxyP1xcbnxcXHIpWyBcXHRdKylcXFNbXlxcclxcbl0qKD86XFwyW15cXHJcXG5dKykqKS8uc291cmNlXG5cdFx0XHRcdC5yZXBsYWNlKC88PHByb3A+Pi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBwcm9wZXJ0aWVzOyB9KSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0fSxcblx0XHQnY29tbWVudCc6IC8jLiovLFxuXHRcdCdrZXknOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLygoPzpefFs6XFwtLFt7XFxyXFxuP10pWyBcXHRdKig/Ojw8cHJvcD4+WyBcXHRdKyk/KTw8a2V5Pj4oPz1cXHMqOlxccykvLnNvdXJjZVxuXHRcdFx0XHQucmVwbGFjZSgvPDxwcm9wPj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gcHJvcGVydGllczsgfSlcblx0XHRcdFx0LnJlcGxhY2UoLzw8a2V5Pj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gJyg/OicgKyBwbGFpbktleSArICd8JyArIHN0cmluZyArICcpJzsgfSkpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnYXRydWxlJ1xuXHRcdH0sXG5cdFx0J2RpcmVjdGl2ZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopJS4rL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0fSxcblx0XHQnZGF0ZXRpbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiBjcmVhdGVWYWx1ZVBhdHRlcm4oL1xcZHs0fS1cXGRcXGQ/LVxcZFxcZD8oPzpbdFRdfFsgXFx0XSspXFxkXFxkPzpcXGR7Mn06XFxkezJ9KD86XFwuXFxkKik/KD86WyBcXHRdKig/Olp8Wy0rXVxcZFxcZD8oPzo6XFxkezJ9KT8pKT98XFxkezR9LVxcZHsyfS1cXGR7Mn18XFxkXFxkPzpcXGR7Mn0oPzo6XFxkezJ9KD86XFwuXFxkKik/KT8vLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0fSxcblx0XHQnYm9vbGVhbic6IHtcblx0XHRcdHBhdHRlcm46IGNyZWF0ZVZhbHVlUGF0dGVybigvZmFsc2V8dHJ1ZS8uc291cmNlLCAnaScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdH0sXG5cdFx0J251bGwnOiB7XG5cdFx0XHRwYXR0ZXJuOiBjcmVhdGVWYWx1ZVBhdHRlcm4oL251bGx8fi8uc291cmNlLCAnaScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IGNyZWF0ZVZhbHVlUGF0dGVybihzdHJpbmcpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J251bWJlcic6IHtcblx0XHRcdHBhdHRlcm46IGNyZWF0ZVZhbHVlUGF0dGVybigvWystXT8oPzoweFtcXGRhLWZdK3wwb1swLTddK3woPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/fFxcLmluZnxcXC5uYW4pLy5zb3VyY2UsICdpJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQndGFnJzogdGFnLFxuXHRcdCdpbXBvcnRhbnQnOiBhbmNob3JPckFsaWFzLFxuXHRcdCdwdW5jdHVhdGlvbic6IC8tLS18WzpbXFxde31cXC0sfD4/XXxcXC5cXC5cXC4vXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnltbCA9IFByaXNtLmxhbmd1YWdlcy55YW1sO1xuXG59KFByaXNtKSk7XG5cbi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Rlc3RfQW55dGhpbmdfUHJvdG9jb2xcblxuUHJpc20ubGFuZ3VhZ2VzLnRhcCA9IHtcblx0J2ZhaWwnOiAvbm90IG9rW14je1xcblxccl0qLyxcblx0J3Bhc3MnOiAvb2tbXiN7XFxuXFxyXSovLFxuXHQncHJhZ21hJzogL3ByYWdtYSBbKy1dW2Etel0rLyxcblx0J2JhaWxvdXQnOiAvYmFpbCBvdXQhLiovaSxcblx0J3ZlcnNpb24nOiAvVEFQIHZlcnNpb24gXFxkKy9pLFxuXHQncGxhbic6IC9cXGJcXGQrXFwuXFwuXFxkKyg/OiArIy4qKT8vLFxuXHQnc3VidGVzdCc6IHtcblx0XHRwYXR0ZXJuOiAvIyBTdWJ0ZXN0KD86OiAuKik/Lyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3B1bmN0dWF0aW9uJzogL1t7fV0vLFxuXHQnZGlyZWN0aXZlJzogLyMuKi8sXG5cdCd5YW1saXNoJzoge1xuXHRcdHBhdHRlcm46IC8oXlsgXFx0XSopLS0tW1xcc1xcU10qP1tcXHJcXG5dWyBcXHRdKlxcLlxcLlxcLiQvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnlhbWwsXG5cdFx0YWxpYXM6ICdsYW5ndWFnZS15YW1sJ1xuXHR9XG59O1xuXG5QcmlzbS5sYW5ndWFnZXMudGNsID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkjLiovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxcXFxcclxcbl18XFxcXCg/OlxcclxcbnxbXFxzXFxTXSkpKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3ZhcmlhYmxlJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXFwkKSg/Ojo6KT8oPzpbYS16QS1aMC05XSs6OikqXFx3Ky8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcJClcXHtbXn1dK1xcfS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qc2V0WyBcXHRdKykoPzo6Oik/KD86W2EtekEtWjAtOV0rOjopKlxcdysvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qcHJvY1sgXFx0XSspXFxTKy9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2J1aWx0aW4nOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKikoPzpicmVha3xjbGFzc3xjb250aW51ZXxlcnJvcnxldmFsfGV4aXR8Zm9yfGZvcmVhY2h8aWZ8cHJvY3xyZXR1cm58c3dpdGNofHdoaWxlKVxcYi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0L1xcYig/OmVsc2V8ZWxzZWlmKVxcYi9cblx0XSxcblx0J3Njb3BlJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopKD86Z2xvYmFsfHVwdmFyfHZhcmlhYmxlKVxcYi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdjb25zdGFudCdcblx0fSxcblx0J2tleXdvcmQnOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKnxcXFspKD86U2FmZV9CYXNlfFRjbHxhZnRlcnxhcHBlbmR8YXBwbHl8YXJyYXl8YXV0b18oPzpleGVjb2t8aW1wb3J0fGxvYWR8bWtpbmRleHxxdWFsaWZ5fHJlc2V0KXxhdXRvbWtpbmRleF9vbGR8YmdlcnJvcnxiaW5hcnl8Y2F0Y2h8Y2R8Y2hhbnxjbG9ja3xjbG9zZXxjb25jYXR8ZGRlfGRpY3R8ZW5jb2Rpbmd8ZW9mfGV4ZWN8ZXhwcnxmYmxvY2tlZHxmY29uZmlndXJlfGZjb3B5fGZpbGUoPzpldmVudHxuYW1lKT98Zmx1c2h8Z2V0c3xnbG9ifGhpc3Rvcnl8aHR0cHxpbmNyfGluZm98aW50ZXJwfGpvaW58bGFwcGVuZHxsYXNzaWdufGxpbmRleHxsaW5zZXJ0fGxpc3R8bGxlbmd0aHxsb2FkfGxyYW5nZXxscmVwZWF0fGxyZXBsYWNlfGxyZXZlcnNlfGxzZWFyY2h8bHNldHxsc29ydHxtYXRoKD86ZnVuY3xvcCl8bWVtb3J5fG1zZ2NhdHxuYW1lc3BhY2V8b3BlbnxwYWNrYWdlfHBhcnJheXxwaWR8cGtnX21rSW5kZXh8cGxhdGZvcm18cHV0c3xwd2R8cmVfc3ludGF4fHJlYWR8cmVmY2hhbnxyZWdleHB8cmVnaXN0cnl8cmVnc3VifHJlbmFtZXxzY2FufHNlZWt8c2V0fHNvY2tldHxzb3VyY2V8c3BsaXR8c3RyaW5nfHN1YnN0fHRjbCg/Ol9lbmRPZldvcmR8X2ZpbmRMaWJyYXJ5fHN0YXJ0T2YoPzpOZXh0fFByZXZpb3VzKVdvcmR8dGVzdHx2YXJzfHdvcmRCcmVhayg/OkFmdGVyfEJlZm9yZSkpfHRlbGx8dGltZXx0bXx0cmFjZXx1bmtub3dufHVubG9hZHx1bnNldHx1cGRhdGV8dXBsZXZlbHx2d2FpdClcXGIvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdvcGVyYXRvcic6IC8hPT98XFwqXFwqP3w9PXwmJj98XFx8XFx8P3w8Wz08XT98Pls9Pl0/fFstK35cXC8lP15dfFxcYig/OmVxfGlufG5lfG5pKVxcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC9be30oKVxcW1xcXV0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnR0MiA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHRcdCdjb21tZW50JzogLyMuKnxcXFslI1tcXHNcXFNdKj8lXFxdLyxcblx0XHQna2V5d29yZCc6IC9cXGIoPzpCTE9DS3xDQUxMfENBU0V8Q0FUQ0h8Q0xFQVJ8REVCVUd8REVGQVVMVHxFTFNFfEVMU0lGfEVORHxGSUxURVJ8RklOQUx8Rk9SRUFDSHxHRVR8SUZ8SU58SU5DTFVERXxJTlNFUlR8TEFTVHxNQUNST3xNRVRBfE5FWFR8UEVSTHxQUk9DRVNTfFJBV1BFUkx8UkVUVVJOfFNFVHxTVE9QfFNXSVRDSHxUQUdTfFRIUk9XfFRSWXxVTkxFU1N8VVNFfFdISUxFfFdSQVBQRVIpXFxiLyxcblx0XHQncHVuY3R1YXRpb24nOiAvW1tcXF17fSwoKV0vXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3R0MicsICdudW1iZXInLCB7XG5cdFx0J29wZXJhdG9yJzogLz1bPj1dP3whPT98PD0/fD49P3wmJnxcXHxcXHw/fFxcYig/OmFuZHxub3R8b3IpXFxiLyxcblx0XHQndmFyaWFibGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiW2Etel1cXHcqKD86XFxzKlxcLlxccyooPzpcXGQrfFxcJD9bYS16XVxcdyopKSpcXGIvaVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgndHQyJywgJ2tleXdvcmQnLCB7XG5cdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdHBhdHRlcm46IC9eKD86XFxbJXwlJSktP3wtPyVcXF0kLyxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCd0dDInLCAnc3RyaW5nJywge1xuXHRcdCdzaW5nbGUtcXVvdGVkLXN0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC8nW15cXFxcJ10qKD86XFxcXFtcXHNcXFNdW15cXFxcJ10qKSonLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdH0sXG5cdFx0J2RvdWJsZS1xdW90ZWQtc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiW15cXFxcXCJdKig/OlxcXFxbXFxzXFxTXVteXFxcXFwiXSopKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQndmFyaWFibGUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xcJCg/OlthLXpdXFx3Kig/OlxcLig/OlxcZCt8XFwkP1thLXpdXFx3KikpKikvaVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIFRUMiBzdHJpbmdzIFwicmVwbGFjZVwiIHRoZSBDLWxpa2Ugc3RhbmRhcmQgc3RyaW5nXG5cdGRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMudHQyLnN0cmluZztcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHR2YXIgdHQyUGF0dGVybiA9IC9cXFslW1xcc1xcU10rPyVcXF0vZztcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10uYnVpbGRQbGFjZWhvbGRlcnMoZW52LCAndHQyJywgdHQyUGF0dGVybik7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLnRva2VuaXplUGxhY2Vob2xkZXJzKGVudiwgJ3R0MicpO1xuXHR9KTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdC8vIFdlIGRvbid0IGFsbG93IGZvciBwaXBlcyBpbnNpZGUgcGFyZW50aGVzZXNcblx0Ly8gdG8gbm90IGJyZWFrIHRhYmxlIHBhdHRlcm4gfCguIGZvbyB8KS4gYmFyIHxcblx0dmFyIG1vZGlmaWVyUmVnZXggPSAvXFwoW158KClcXG5dK1xcKXxcXFtbXlxcXVxcbl0rXFxdfFxce1tefVxcbl0rXFx9Ly5zb3VyY2U7XG5cdC8vIE9wZW5pbmcgYW5kIGNsb3NpbmcgcGFyZW50aGVzZXMgd2hpY2ggYXJlIG5vdCBhIG1vZGlmaWVyXG5cdC8vIFRoaXMgcGF0dGVybiBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCBleHBvbmVudGlhbCBiYWNrdHJhY2tpbmdcblx0dmFyIHBhcmVudGhlc2VzUmVnZXggPSAvXFwpfFxcKCg/IVtefCgpXFxuXStcXCkpLy5zb3VyY2U7XG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhZ3NdXG5cdCAqL1xuXHRmdW5jdGlvbiB3aXRoTW9kaWZpZXIoc291cmNlLCBmbGFncykge1xuXHRcdHJldHVybiBSZWdFeHAoXG5cdFx0XHRzb3VyY2Vcblx0XHRcdFx0LnJlcGxhY2UoLzxNT0Q+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuICcoPzonICsgbW9kaWZpZXJSZWdleCArICcpJzsgfSlcblx0XHRcdFx0LnJlcGxhY2UoLzxQQVI+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuICcoPzonICsgcGFyZW50aGVzZXNSZWdleCArICcpJzsgfSksXG5cdFx0XHRmbGFncyB8fCAnJyk7XG5cdH1cblxuXHR2YXIgbW9kaWZpZXJUb2tlbnMgPSB7XG5cdFx0J2Nzcyc6IHtcblx0XHRcdHBhdHRlcm46IC9cXHtbXnt9XStcXH0vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdHJlc3Q6IFByaXNtLmxhbmd1YWdlcy5jc3Ncblx0XHRcdH1cblx0XHR9LFxuXHRcdCdjbGFzcy1pZCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFwoKVteKCldKyg/PVxcKSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnYXR0ci12YWx1ZSdcblx0XHR9LFxuXHRcdCdsYW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXFspW15cXFtcXF1dKyg/PVxcXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnYXR0ci12YWx1ZSdcblx0XHR9LFxuXHRcdC8vIEFueXRoaW5nIGVsc2UgaXMgcHVuY3R1YXRpb24gKHRoZSBmaXJzdCBwYXR0ZXJuIGlzIGZvciByb3cvY29sIHNwYW5zIGluc2lkZSB0YWJsZXMpXG5cdFx0J3B1bmN0dWF0aW9uJzogL1tcXFxcXFwvXVxcZCt8XFxTL1xuXHR9O1xuXG5cblx0dmFyIHRleHRpbGUgPSBQcmlzbS5sYW5ndWFnZXMudGV4dGlsZSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ21hcmt1cCcsIHtcblx0XHQncGhyYXNlJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFxccnxcXG4pXFxTW1xcc1xcU10qPyg/PSR8XFxyP1xcblxccj9cXG58XFxyXFxyKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cblx0XHRcdFx0Ly8gaDEuIEhlYWRlciAxXG5cdFx0XHRcdCdibG9jay10YWcnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC9eW2Etel1cXHcqKD86PE1PRD58PFBBUj58Wzw+PV0pKlxcLi8uc291cmNlKSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdtb2RpZmllcic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8oXlthLXpdXFx3KikoPzo8TU9EPnw8UEFSPnxbPD49XSkrKD89XFwuKS8uc291cmNlKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiBtb2RpZmllclRva2Vuc1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCd0YWcnOiAvXlthLXpdXFx3Ki8sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuJC9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gIyBMaXN0IGl0ZW1cblx0XHRcdFx0Ly8gKiBMaXN0IGl0ZW1cblx0XHRcdFx0J2xpc3QnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC9eWyojXSs8TU9EPipcXHMrXFxTLiovLnNvdXJjZSwgJ20nKSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdtb2RpZmllcic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8oXlsqI10rKTxNT0Q+Ky8uc291cmNlKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiBtb2RpZmllclRva2Vuc1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eWyojXSsvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIHwgY2VsbCB8IGNlbGwgfCBjZWxsIHxcblx0XHRcdFx0J3RhYmxlJzoge1xuXHRcdFx0XHRcdC8vIE1vZGlmaWVycyBjYW4gYmUgYXBwbGllZCB0byB0aGUgcm93OiB7Y29sb3I6cmVkfS58MXwyfDN8XG5cdFx0XHRcdFx0Ly8gb3IgdGhlIGNlbGw6IHx7Y29sb3I6cmVkfS4xfDJ8M3xcblx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoL14oPzooPzo8TU9EPnw8UEFSPnxbPD49Xn5dKStcXC5cXHMqKT8oPzpcXHwoPzooPzo8TU9EPnw8UEFSPnxbPD49Xn5fXXxbXFxcXC9dXFxkKykrXFwufCg/ISg/OjxNT0Q+fDxQQVI+fFs8Pj1efl9dfFtcXFxcL11cXGQrKStcXC4pKVtefF0qKStcXHwvLnNvdXJjZSwgJ20nKSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdtb2RpZmllcic6IHtcblx0XHRcdFx0XHRcdFx0Ly8gTW9kaWZpZXJzIGZvciByb3dzIGFmdGVyIHRoZSBmaXJzdCBvbmUgYXJlXG5cdFx0XHRcdFx0XHRcdC8vIHByZWNlZGVkIGJ5IGEgcGlwZSBhbmQgYSBsaW5lIGZlZWRcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8oXnxcXHwoPzpcXHI/XFxufFxccik/KSg/OjxNT0Q+fDxQQVI+fFs8Pj1efl9dfFtcXFxcL11cXGQrKSsoPz1cXC4pLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IG1vZGlmaWVyVG9rZW5zXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcfHxeXFwuL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0XHQnaW5saW5lJzoge1xuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tc3VwZXItbGluZWFyLWJhY2t0cmFja2luZ1xuXHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvKF58W15hLXpBLVpcXGRdKShcXCpcXCp8X198XFw/XFw/fFsqXyVAK1xcLV5+XSk8TU9EPiouKz9cXDIoPyFbYS16QS1aXFxkXSkvLnNvdXJjZSksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdC8vIE5vdGU6IHN1cGVyc2NyaXB0cyBhbmQgc3Vic2NyaXB0cyBhcmUgbm90IGhhbmRsZWQgc3BlY2lmaWNhbGx5XG5cblx0XHRcdFx0XHRcdC8vICpib2xkKiwgKipib2xkKipcblx0XHRcdFx0XHRcdCdib2xkJzoge1xuXHRcdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXN1cGVyLWxpbmVhci1iYWNrdHJhY2tpbmdcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8oXihcXCpcXCo/KTxNT0Q+KikuKz8oPz1cXDIpLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHQvLyBfaXRhbGljXywgX19pdGFsaWNfX1xuXHRcdFx0XHRcdFx0J2l0YWxpYyc6IHtcblx0XHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1zdXBlci1saW5lYXItYmFja3RyYWNraW5nXG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvKF4oX18/KTxNT0Q+KikuKz8oPz1cXDIpLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHQvLyA/P2NpdGU/P1xuXHRcdFx0XHRcdFx0J2NpdGUnOiB7XG5cdFx0XHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tc3VwZXItbGluZWFyLWJhY2t0cmFja2luZ1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyheXFw/XFw/PE1PRD4qKS4rPyg/PVxcP1xcPykvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdFx0Ly8gQGNvZGVAXG5cdFx0XHRcdFx0XHQnY29kZSc6IHtcblx0XHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1zdXBlci1saW5lYXItYmFja3RyYWNraW5nXG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvKF5APE1PRD4qKS4rPyg/PUApLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHQvLyAraW5zZXJ0ZWQrXG5cdFx0XHRcdFx0XHQnaW5zZXJ0ZWQnOiB7XG5cdFx0XHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tc3VwZXItbGluZWFyLWJhY2t0cmFja2luZ1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyheXFwrPE1PRD4qKS4rPyg/PVxcKykvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHRcdC8vIC1kZWxldGVkLVxuXHRcdFx0XHRcdFx0J2RlbGV0ZWQnOiB7XG5cdFx0XHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tc3VwZXItbGluZWFyLWJhY2t0cmFja2luZ1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyheLTxNT0Q+KikuKz8oPz0tKS8uc291cmNlKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdFx0Ly8gJXNwYW4lXG5cdFx0XHRcdFx0XHQnc3Bhbic6IHtcblx0XHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1zdXBlci1saW5lYXItYmFja3RyYWNraW5nXG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvKF4lPE1PRD4qKS4rPyg/PSUpLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHQnbW9kaWZpZXInOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvKF5cXCpcXCp8X198XFw/XFw/fFsqXyVAK1xcLV5+XSk8TU9EPisvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluc2lkZTogbW9kaWZpZXJUb2tlbnNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWypfJT9AK1xcLV5+XSsvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFthbGlhc11odHRwOi8vZXhhbXBsZS5jb21cblx0XHRcdFx0J2xpbmstcmVmJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eXFxbW15cXF1dK1xcXVxcUyskL20sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnc3RyaW5nJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXFspW15cXF1dKyg/PVxcXSkvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3VybCc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyheXFxdKVxcUyskLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxdXS9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gXCJ0ZXh0XCI6aHR0cDovL2V4YW1wbGUuY29tXG5cdFx0XHRcdC8vIFwidGV4dFwiOmxpbmstcmVmXG5cdFx0XHRcdCdsaW5rJzoge1xuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tc3VwZXItbGluZWFyLWJhY2t0cmFja2luZ1xuXHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvXCI8TU9EPipbXlwiXStcIjouKz8oPz1bXlxcdy9dPyg/Olxcc3wkKSkvLnNvdXJjZSksXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQndGV4dCc6IHtcblx0XHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1zdXBlci1saW5lYXItYmFja3RyYWNraW5nXG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvKF5cIjxNT0Q+KilbXlwiXSsoPz1cIikvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQnbW9kaWZpZXInOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvKF5cIik8TU9EPisvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluc2lkZTogbW9kaWZpZXJUb2tlbnNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQndXJsJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKDopLisvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1tcIjpdL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyAhaW1hZ2UuanBnIVxuXHRcdFx0XHQvLyAhaW1hZ2UuanBnKFRpdGxlKSE6aHR0cDovL2V4YW1wbGUuY29tXG5cdFx0XHRcdCdpbWFnZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyEoPzo8TU9EPnw8UEFSPnxbPD49XSkqKD8hWzw+PV0pW14hXFxzKCldKyg/OlxcKFteKV0rXFwpKT8hKD86Oi4rPyg/PVteXFx3L10/KD86XFxzfCQpKSk/Ly5zb3VyY2UpLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3NvdXJjZSc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8oXiEoPzo8TU9EPnw8UEFSPnxbPD49XSkqKSg/IVs8Pj1dKVteIVxccygpXSsoPzpcXChbXildK1xcKSk/KD89ISkvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAndXJsJ1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdtb2RpZmllcic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8oXiEpKD86PE1PRD58PFBBUj58Wzw+PV0pKy8uc291cmNlKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiBtb2RpZmllclRva2Vuc1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCd1cmwnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oOikuKy8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWyE6XS9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gRm9vdG5vdGVbMV1cblx0XHRcdFx0J2Zvb3Rub3RlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXGJcXFtcXGQrXFxdLyxcblx0XHRcdFx0XHRhbGlhczogJ2NvbW1lbnQnLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcW3xcXF0vXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENTUyhDYXNjYWRpbmcgU3R5bGUgU2hlZXQpXG5cdFx0XHRcdCdhY3JvbnltJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXGJbQS1aXFxkXStcXChbXildK1xcKS8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnY29tbWVudCc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyhcXCgpW14oKV0rKD89XFwpKS8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWygpXS9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gUHJpc20oQylcblx0XHRcdFx0J21hcmsnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xcYlxcKCg/OkN8UnxUTSlcXCkvLFxuXHRcdFx0XHRcdGFsaWFzOiAnY29tbWVudCcsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWygpXS9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdHZhciBwaHJhc2VJbnNpZGUgPSB0ZXh0aWxlWydwaHJhc2UnXS5pbnNpZGU7XG5cdHZhciBuZXN0ZWRQYXR0ZXJucyA9IHtcblx0XHQnaW5saW5lJzogcGhyYXNlSW5zaWRlWydpbmxpbmUnXSxcblx0XHQnbGluayc6IHBocmFzZUluc2lkZVsnbGluayddLFxuXHRcdCdpbWFnZSc6IHBocmFzZUluc2lkZVsnaW1hZ2UnXSxcblx0XHQnZm9vdG5vdGUnOiBwaHJhc2VJbnNpZGVbJ2Zvb3Rub3RlJ10sXG5cdFx0J2Fjcm9ueW0nOiBwaHJhc2VJbnNpZGVbJ2Fjcm9ueW0nXSxcblx0XHQnbWFyayc6IHBocmFzZUluc2lkZVsnbWFyayddXG5cdH07XG5cblx0Ly8gT25seSBhbGxvdyBhbHBoYS1udW1lcmljIEhUTUwgdGFncywgbm90IFhNTCB0YWdzXG5cdHRleHRpbGUudGFnLnBhdHRlcm4gPSAvPFxcLz8oPyFcXGQpW2EtejAtOV0rKD86XFxzK1teXFxzPlxcLz1dKyg/Oj0oPzooXCJ8JykoPzpcXFxcW1xcc1xcU118KD8hXFwxKVteXFxcXF0pKlxcMXxbXlxccydcIj49XSspKT8pKlxccypcXC8/Pi9pO1xuXG5cdC8vIEFsbG93IHNvbWUgbmVzdGluZ1xuXHR2YXIgcGhyYXNlSW5saW5lSW5zaWRlID0gcGhyYXNlSW5zaWRlWydpbmxpbmUnXS5pbnNpZGU7XG5cdHBocmFzZUlubGluZUluc2lkZVsnYm9sZCddLmluc2lkZSA9IG5lc3RlZFBhdHRlcm5zO1xuXHRwaHJhc2VJbmxpbmVJbnNpZGVbJ2l0YWxpYyddLmluc2lkZSA9IG5lc3RlZFBhdHRlcm5zO1xuXHRwaHJhc2VJbmxpbmVJbnNpZGVbJ2luc2VydGVkJ10uaW5zaWRlID0gbmVzdGVkUGF0dGVybnM7XG5cdHBocmFzZUlubGluZUluc2lkZVsnZGVsZXRlZCddLmluc2lkZSA9IG5lc3RlZFBhdHRlcm5zO1xuXHRwaHJhc2VJbmxpbmVJbnNpZGVbJ3NwYW4nXS5pbnNpZGUgPSBuZXN0ZWRQYXR0ZXJucztcblxuXHQvLyBBbGxvdyBzb21lIHN0eWxlcyBpbnNpZGUgdGFibGUgY2VsbHNcblx0dmFyIHBocmFzZVRhYmxlSW5zaWRlID0gcGhyYXNlSW5zaWRlWyd0YWJsZSddLmluc2lkZTtcblx0cGhyYXNlVGFibGVJbnNpZGVbJ2lubGluZSddID0gbmVzdGVkUGF0dGVybnNbJ2lubGluZSddO1xuXHRwaHJhc2VUYWJsZUluc2lkZVsnbGluayddID0gbmVzdGVkUGF0dGVybnNbJ2xpbmsnXTtcblx0cGhyYXNlVGFibGVJbnNpZGVbJ2ltYWdlJ10gPSBuZXN0ZWRQYXR0ZXJuc1snaW1hZ2UnXTtcblx0cGhyYXNlVGFibGVJbnNpZGVbJ2Zvb3Rub3RlJ10gPSBuZXN0ZWRQYXR0ZXJuc1snZm9vdG5vdGUnXTtcblx0cGhyYXNlVGFibGVJbnNpZGVbJ2Fjcm9ueW0nXSA9IG5lc3RlZFBhdHRlcm5zWydhY3JvbnltJ107XG5cdHBocmFzZVRhYmxlSW5zaWRlWydtYXJrJ10gPSBuZXN0ZWRQYXR0ZXJuc1snbWFyayddO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIga2V5ID0gLyg/OltcXHctXSt8J1teJ1xcblxccl0qJ3xcIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCIpLy5zb3VyY2U7XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuXG5cdCAqL1xuXHRmdW5jdGlvbiBpbnNlcnRLZXkocGF0dGVybikge1xuXHRcdHJldHVybiBwYXR0ZXJuLnJlcGxhY2UoL19fL2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGtleTsgfSk7XG5cdH1cblxuXHRQcmlzbS5sYW5ndWFnZXMudG9tbCA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8jLiovLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQndGFibGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoaW5zZXJ0S2V5KC8oXltcXHQgXSpcXFtcXHMqKD86XFxbXFxzKik/KV9fKD86XFxzKlxcLlxccypfXykqKD89XFxzKlxcXSkvLnNvdXJjZSksICdtJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHRcdH0sXG5cdFx0J2tleSc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChpbnNlcnRLZXkoLyheW1xcdCBdKnxbeyxdXFxzKilfXyg/OlxccypcXC5cXHMqX18pKig/PVxccyo9KS8uc291cmNlKSwgJ20nKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIlwiXCIoPzpcXFxcW1xcc1xcU118W15cXFxcXSkqP1wiXCJcInwnJydbXFxzXFxTXSo/JycnfCdbXidcXG5cXHJdKid8XCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2RhdGUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIE9mZnNldCBEYXRlLVRpbWUsIExvY2FsIERhdGUtVGltZSwgTG9jYWwgRGF0ZVxuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn0oPzpbVFxcc11cXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZCspPyg/Olp8WystXVxcZHsyfTpcXGR7Mn0pPyk/XFxiL2ksXG5cdFx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gTG9jYWwgVGltZVxuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQrKT9cXGIvLFxuXHRcdFx0XHRhbGlhczogJ251bWJlcidcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdudW1iZXInOiAvKD86XFxiMCg/OnhbXFxkYS16QS1aXSsoPzpfW1xcZGEtekEtWl0rKSp8b1swLTddKyg/Ol9bMC03XSspKnxiWzEwXSsoPzpfWzEwXSspKikpXFxifFstK10/XFxiXFxkKyg/Ol9cXGQrKSooPzpcXC5cXGQrKD86X1xcZCspKik/KD86W2VFXVsrLV0/XFxkKyg/Ol9cXGQrKSopP1xcYnxbLStdP1xcYig/OmluZnxuYW4pXFxiLyxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1suLD1bXFxde31dL1xuXHR9O1xufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnRyZW1vciA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSg/OlxcL1xcKltcXHNcXFNdKj9cXCpcXC98KD86LS18XFwvXFwvfCMpLiopLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdpbnRlcnBvbGF0ZWQtc3RyaW5nJzogbnVsbCwgLy8gc2VlIGJlbG93XG5cdFx0J2V4dHJhY3Rvcic6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJbYS16X11cXHcqXFx8KD86W15cXHJcXG5cXFxcfF18XFxcXCg/OlxcclxcbnxbXFxzXFxTXSkpKlxcfC9pLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdyZWdleCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5yZSlcXHxbXFxzXFxTXSsvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J2Z1bmN0aW9uJzogL15cXHcrLyxcblx0XHRcdFx0J3ZhbHVlJzogL1xcfFtcXHNcXFNdKy9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdpZGVudGlmaWVyJzoge1xuXHRcdFx0cGF0dGVybjogL2BbXmBdKmAvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblxuXHRcdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKig/Ojo6XFxzKjx8XFwoKSlcXGIvLFxuXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86YXJnc3xhc3xieXxjYXNlfGNvbmZpZ3xjb25uZWN0fGNvbm5lY3Rvcnxjb25zdHxjb3B5fGNyZWF0ZXxkZWZhdWx0fGRlZmluZXxkZXBsb3l8ZHJvcHxlYWNofGVtaXR8ZW5kfGVyYXNlfGV2ZW50fGZsb3d8Zm58Zm9yfGZyb218Z3JvdXB8aGF2aW5nfGluc2VydHxpbnRvfGludHJpbnNpY3xsZXR8bGlua3N8bWF0Y2h8bWVyZ2V8bW9kfG1vdmV8b2Z8b3BlcmF0b3J8cGF0Y2h8cGlwZWxpbmV8cmVjdXJ8c2NyaXB0fHNlbGVjdHxzZXR8c2xpZGluZ3xzdGF0ZXxzdHJlYW18dG98dHVtYmxpbmd8dXBkYXRlfHVzZXx3aGVufHdoZXJlfHdpbmRvd3x3aXRoKVxcYi8sXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8bnVsbHx0cnVlKVxcYi9pLFxuXG5cdFx0J251bWJlcic6IC9cXGIoPzowYlswMV9dKnwweFswLTlhLWZBLUZfXSp8XFxkW1xcZF9dKig/OlxcLlxcZFtcXGRfXSopPyg/OltFZV1bKy1dP1tcXGRfXSspPylcXGIvLFxuXG5cdFx0J3BhdHRlcm4tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvJSg/PVsoe1tdKS8sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J29wZXJhdG9yJzogL1stKypcXC8lfiFeXT0/fD1bPT5dP3wmWyY9XT98XFx8W3w9XT98PDw/PT98Pj4/Pj89P3woPzphYnNlbnR8YW5kfG5vdHxvcnxwcmVzZW50fHhvcilcXGIvLFxuXHRcdCdwdW5jdHVhdGlvbic6IC86OnxbO1xcW1xcXSgpXFx7XFx9LC46XS8sXG5cdH07XG5cblx0dmFyIGludGVycG9sYXRpb25QYXR0ZXJuID0gLyNcXHsoPzpbXlwie31dfFxce1tee31dKlxcfXxcIig/OlteXCJcXFxcXFxyXFxuXXxcXFxcKD86XFxyXFxufFtcXHNcXFNdKSkqXCIpKlxcfS8uc291cmNlO1xuXG5cdFByaXNtLmxhbmd1YWdlcy50cmVtb3JbJ2ludGVycG9sYXRlZC1zdHJpbmcnXSA9IHtcblx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHQvKF58W15cXFxcXSkvLnNvdXJjZSArXG5cdFx0XHQnKD86JyArXG5cdFx0XHQnXCJcIlwiKD86JyArIC9bXlwiXFxcXCNdfFxcXFxbXFxzXFxTXXxcIig/IVwiXCIpfCMoPyFcXHspLy5zb3VyY2UgKyAnfCcgKyBpbnRlcnBvbGF0aW9uUGF0dGVybiArICcpKlwiXCJcIicgK1xuXHRcdFx0J3wnICtcblx0XHRcdCdcIig/OicgKyAvW15cIlxcXFxcXHJcXG4jXXxcXFxcKD86XFxyXFxufFtcXHNcXFNdKXwjKD8hXFx7KS8uc291cmNlICsgJ3wnICsgaW50ZXJwb2xhdGlvblBhdHRlcm4gKyAnKSpcIicgK1xuXHRcdFx0JyknXG5cdFx0KSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoaW50ZXJwb2xhdGlvblBhdHRlcm4pLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXiNcXHt8XFx9JC8sXG5cdFx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnRyZW1vclxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMudHJveSA9IFByaXNtLmxhbmd1YWdlc1sndHJlbW9yJ107XG5cdFByaXNtLmxhbmd1YWdlcy50cmlja2xlID0gUHJpc20ubGFuZ3VhZ2VzWyd0cmVtb3InXTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMudHdpZyA9IHtcblx0J2NvbW1lbnQnOiAvXlxceyNbXFxzXFxTXSo/I1xcfSQvLFxuXG5cdCd0YWctbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKF5cXHslLT9cXHMqKVxcdysvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnZGVsaW1pdGVyJzoge1xuXHRcdHBhdHRlcm46IC9eXFx7W3slXS0/fC0/WyV9XVxcfSQvLFxuXHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdH0sXG5cblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFwifCcpKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXlsnXCJdfFsnXCJdJC9cblx0XHR9XG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmV2ZW58aWZ8b2RkKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfG51bGx8dHJ1ZSlcXGIvLFxuXHQnbnVtYmVyJzogL1xcYjB4W1xcZEEtRmEtZl0rfCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpbRWVdWy0rXT9cXGQrKT8vLFxuXHQnb3BlcmF0b3InOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhcXHMpKD86YW5kfGItYW5kfGItb3J8Yi14b3J8ZW5kcyB3aXRofGlufGlzfG1hdGNoZXN8bm90fG9yfHNhbWUgYXN8c3RhcnRzIHdpdGgpKD89XFxzKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvWz08Pl09P3whPXxcXCpcXCo/fFxcL1xcLz98XFw/Oj98Wy0rfiV8XS9cblx0XSxcblx0J3B1bmN0dWF0aW9uJzogL1soKVxcW1xcXXt9Oi4sXS9cbn07XG5cblByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRpZiAoZW52Lmxhbmd1YWdlICE9PSAndHdpZycpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR2YXIgcGF0dGVybiA9IC9cXHsoPzojW1xcc1xcU10qPyN8JVtcXHNcXFNdKj8lfFxce1tcXHNcXFNdKj9cXH0pXFx9L2c7XG5cdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS5idWlsZFBsYWNlaG9sZGVycyhlbnYsICd0d2lnJywgcGF0dGVybik7XG59KTtcblxuUHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLnRva2VuaXplUGxhY2Vob2xkZXJzKGVudiwgJ3R3aWcnKTtcbn0pO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGtleXdvcmRzID0gL1xcYig/OkFDVHxBQ1RJRlNVQnxDQVJSQVl8Q0FTRXxDTEVBUkdJRnxDT0F8Q09BX0lOVHxDT05TVEFOVFN8Q09OVEVOVHxDVVJ8RURJVFBBTkVMfEVGRkVDVHxFWFR8RklMRXxGTFVJRFRFTVBMQVRFfEZPUk18RlJBTUV8RlJBTUVTRVR8R0lGQlVJTERFUnxHTUVOVXxHTUVOVV9GT0xET1VUfEdNRU5VX0xBWUVSU3xHUHxITUVOVXxIUlVMRVJ8SFRNTHxJRU5WfElGU1VCfElNQUdFfElNR01FTlV8SU1HTUVOVUlURU18SU1HVEVYVHxJTUdfUkVTT1VSQ0V8SU5DTFVERV9UWVBPU0NSSVBUfEpTTUVOVXxKU01FTlVJVEVNfExMTHxMT0FEX1JFR0lTVEVSfE5PfFBBR0V8UkVDT1JEU3xSRVNUT1JFX1JFR0lTVEVSfFRFTVBMQVRFfFRFWFR8VE1FTlV8VE1FTlVJVEVNfFRNRU5VX0xBWUVSU3xVU0VSfFVTRVJfSU5UfF9HSUZCVUlMREVSfGdsb2JhbHxnbG9iYWxTdHJpbmd8Z2xvYmFsVmFyKVxcYi87XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnR5cG9zY3JpcHQgPSB7XG5cdFx0J2NvbW1lbnQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIG11bHRpbGluZSBjb21tZW50cyAvKiAqL1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gZG91YmxlLXNsYXNoIGNvbW1lbnRzIC0gaWdub3JlZCB3aGVuIGJhY2tzbGFzaGVzIG9yIGNvbG9uIGlzIGZvdW5kIGluIGZyb250XG5cdFx0XHRcdC8vIGFsc28gaWdub3JlZCB3aGVuZXZlciBkaXJlY3RseSBhZnRlciBhbiBlcXVhbC1zaWduLCBiZWNhdXNlIGl0IHdvdWxkIHByb2JhYmx5IGJlIGFuIHVybCB3aXRob3V0IHByb3RvY29sXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFw6PSBcXHRdfCg/Ol58W149IFxcdF0pWyBcXHRdKylcXC9cXC8uKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gaGFzaCBjb21tZW50cyAtIGlnbm9yZWQgd2hlbiBsZWFkaW5nIHF1b3RlIGlzIGZvdW5kIGZvciBoZXggY29sb3JzIGluIHN0cmluZ3Ncblx0XHRcdFx0cGF0dGVybjogLyhefFteXCInXSkjLiovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdmdW5jdGlvbic6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gb2xkIGluY2x1ZGUgc3R5bGVcblx0XHRcdFx0cGF0dGVybjogLzxJTkNMVURFX1RZUE9TQ1JJUFQ6XFxzKnNvdXJjZVxccyo9XFxzKig/OlwiW15cIlxcclxcbl0qXCJ8J1teJ1xcclxcbl0qJylcXHMqPi8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXCJbXlwiXFxyXFxuXSpcInwnW14nXFxyXFxuXSonLyxcblx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL0lOQ0xVREVfVFlQT1NDUklQVC8sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIG5ldyBpbmNsdWRlIHN0eWxlXG5cdFx0XHRcdHBhdHRlcm46IC9AaW1wb3J0XFxzKig/OlwiW15cIlxcclxcbl0qXCJ8J1teJ1xcclxcbl0qJykvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnc3RyaW5nJzogL1wiW15cIlxcclxcbl0qXCJ8J1teJ1xcclxcbl0qJy8sXG5cdFx0XHRcdH0sXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL14oW149XSo9WzwgXT8pKD86KD8hXFxdXFxuKS4pKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdmdW5jdGlvbic6IC9cXHtcXCQuKlxcfS8sIC8vIGNvbnN0YW50cyBpbmNsdWRlXG5cdFx0XHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0XHRcdCdudW1iZXInOiAvXlxcZCskLyxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1ssfDpdLyxcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0J251bWJlcic6IHtcblx0XHRcdC8vIHNwZWNpYWwgaGlnaGxpZ2h0aW5nIGZvciBpbmRleGVzIG9mIGFycmF5cyBpbiB0YWdzXG5cdFx0XHRwYXR0ZXJuOiAvXFxiXFxkK1xccypbLns9XS8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J29wZXJhdG9yJzogL1suez1dLyxcblx0XHRcdH1cblx0XHR9LFxuXHRcdCd0YWcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwuP1stXFx3XFxcXF0rXFwuPy8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi8sXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSwuOnxdLyxcblx0XHQnb3BlcmF0b3InOiAvWzw+XT0/fFshPV09Pz0/fC0tP3xcXCtcXCs/fCYmP3xcXHxcXHw/fFs/Ki9+XiVdLyxcblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMudHNjb25maWcgPSBQcmlzbS5sYW5ndWFnZXMudHlwb3NjcmlwdDtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMudW5yZWFsc2NyaXB0ID0ge1xuXHQnY29tbWVudCc6IC9cXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFtcIiddKSg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2F0ZWdvcnknOiB7XG5cdFx0cGF0dGVybjogLyhcXGIoPzooPzphdXRvZXhwYW5kfGhpZGV8c2hvdyljYXRlZ29yaWVzfHZhcilcXHMqXFwoKVteKCldKyg/PVxcKSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cdCdtZXRhZGF0YSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcd1xccyopPFxccypcXHcrXFxzKj1bXjw+fD1cXHJcXG5dKyg/OlxcfFxccypcXHcrXFxzKj1bXjw+fD1cXHJcXG5dKykqPi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHJvcGVydHknOiAvXFxiXFx3Kyg/PVxccyo9KS8sXG5cdFx0XHQnb3BlcmF0b3InOiAvPS8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvWzw+fF0vXG5cdFx0fVxuXHR9LFxuXHQnbWFjcm8nOiB7XG5cdFx0cGF0dGVybjogL2BcXHcrLyxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYig/OmNsYXNzfGVudW18ZXh0ZW5kc3xpbnRlcmZhY2V8c3RhdGUoPzpcXChcXCkpP3xzdHJ1Y3R8d2l0aGluKVxccyspXFx3Ky8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXG5cdCdrZXl3b3JkJzogL1xcYig/OmFic3RyYWN0fGFjdG9yfGFycmF5fGF1dG98YXV0b2V4cGFuZGNhdGVnb3JpZXN8Ym9vbHxicmVha3xieXRlfGNhc2V8Y2xhc3N8Y2xhc3Nncm91cHxjbGllbnR8Y29lcmNlfGNvbGxhcHNlY2F0ZWdvcmllc3xjb25maWd8Y29uc3R8Y29udGludWV8ZGVmYXVsdHxkZWZhdWx0cHJvcGVydGllc3xkZWxlZ2F0ZXxkZXBlbmRzb258ZGVwcmVjYXRlZHxkb3xkb250Y29sbGFwc2VjYXRlZ29yaWVzfGVkaXRjb25zdHxlZGl0aW5saW5lbmV3fGVsc2V8ZW51bXxldmVudHxleGVjfGV4cG9ydHxleHRlbmRzfGZpbmFsfGZsb2F0fGZvcnxmb3JjZXNjcmlwdG9yZGVyfGZvcmVhY2h8ZnVuY3Rpb258Z290b3xndWlkfGhpZGVjYXRlZ29yaWVzfGhpZGVkcm9wZG93bnxpZnxpZ25vcmVzfGltcGxlbWVudHN8aW5oZXJpdHN8aW5wdXR8aW50fGludGVyZmFjZXxpdGVyYXRvcnxsYXRlbnR8bG9jYWx8bWF0ZXJpYWx8bmFtZXxuYXRpdmV8bmF0aXZlcmVwbGljYXRpb258bm9leHBvcnR8bm9udHJhbnNpZW50fG5vdGVkaXRpbmxpbmVuZXd8bm90cGxhY2VhYmxlfG9wZXJhdG9yfG9wdGlvbmFsfG91dHxwYXdufHBlcm9iamVjdGNvbmZpZ3xwZXJvYmplY3Rsb2NhbGl6ZWR8cGxhY2VhYmxlfHBvc3RvcGVyYXRvcnxwcmVvcGVyYXRvcnxwcml2YXRlfHByb3RlY3RlZHxyZWxpYWJsZXxyZXBsaWNhdGlvbnxyZXR1cm58c2VydmVyfHNob3djYXRlZ29yaWVzfHNpbXVsYXRlZHxzaW5ndWxhcnxzdGF0ZXxzdGF0aWN8c3RyaW5nfHN0cnVjdHxzdHJ1Y3RkZWZhdWx0fHN0cnVjdGRlZmF1bHRwcm9wZXJ0aWVzfHN3aXRjaHx0ZXh0dXJlfHRyYW5zaWVudHx0cmF2ZWx8dW5yZWxpYWJsZXx1bnRpbHx2YXJ8dmVjdG9yfHdoaWxlfHdpdGhpbilcXGIvLFxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpL2ksXG5cblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnbnVtYmVyJzogL1xcYjB4W1xcZGEtZl0rXFxifCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzplWystXT9cXGQrKT8vaSxcblx0Ly8gaHR0cHM6Ly9kb2NzLnVucmVhbGVuZ2luZS5jb20vdWRrL1RocmVlL1VucmVhbFNjcmlwdEV4cHJlc3Npb25zLmh0bWxcblx0J29wZXJhdG9yJzogLz4+fDw8fC0tfFxcK1xcK3xcXCpcXCp8Wy0rKi9+IT08PiRAXT0/fCYmP3xcXHxcXHw/fFxcXlxcXj98Wz86JV18XFxiKD86Q2xvY2t3aXNlRnJvbXxDcm9zc3xEb3QpXFxiLyxcblx0J3B1bmN0dWF0aW9uJzogL1soKVtcXF17fTssLl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMudWMgPSBQcmlzbS5sYW5ndWFnZXMudXNjcmlwdCA9IFByaXNtLmxhbmd1YWdlcy51bnJlYWxzY3JpcHQ7XG5cblByaXNtLmxhbmd1YWdlcy51b3Jhem9yID0ge1xuXHQnY29tbWVudC1oYXNoJzoge1xuXHRcdHBhdHRlcm46IC8jLiovLFxuXHRcdGFsaWFzOiAnY29tbWVudCcsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjb21tZW50LXNsYXNoJzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXC8uKi8sXG5cdFx0YWxpYXM6ICdjb21tZW50Jyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFwifCcpKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXlsnXCJdfFsnXCJdJC9cblx0XHR9LFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc291cmNlLWxheWVycyc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86YXJtc3xiYWNrcGFja3xibHVlfGJyYWNlbGV0fGNhbmNlbHxjbGVhcnxjbG9ha3xjcmltaW5hbHxlYXJyaW5nc3xlbmVteXxmYWNpYWxoYWlyfGZyaWVuZHxmcmllbmRseXxnbG92ZXN8Z3JheXxncmV5fGdyb3VuZHxoYWlyfGhlYWR8aW5uZXJsZWdzfGlubmVydG9yc298aW5ub2NlbnR8bGVmdGhhbmR8bWlkZGxldG9yc298bXVyZGVyZXJ8bmVja3xub25mcmllbmRseXxvbmVoYW5kZWRzZWNvbmRhcnl8b3V0ZXJsZWdzfG91dGVydG9yc298cGFudHN8cmVkfHJpZ2h0aGFuZHxyaW5nfHNlbGZ8c2hpcnR8c2hvZXN8dGFsaXNtYW58d2Fpc3QpXFxiL2ksXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J3NvdXJjZS1jb21tYW5kcyc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86YWxsaWFuY2V8YXR0YWNrfGNhc3R8Y2xlYXJhbGx8Y2xlYXJpZ25vcmV8Y2xlYXJqb3VybmFsfGNsZWFybGlzdHxjbGVhcnN5c21zZ3xjcmVhdGVsaXN0fGNyZWF0ZXRpbWVyfGRjbGlja3xkY2xpY2t0eXBlfGRjbGlja3ZhcnxkcmVzc3xkcmVzc2NvbmZpZ3xkcm9wfGRyb3ByZWxsb2N8ZW1vdGV8Z2V0bGFiZWx8Z3VpbGR8Z3VtcGNsb3NlfGd1bXByZXNwb25zZXxob3RrZXl8aWdub3JlfGxhc3R0YXJnZXR8bGlmdHxsaWZ0dHlwZXxtZW51fG1lbnVyZXNwb25zZXxtc2d8b3JnfG9yZ2FuaXplfG9yZ2FuaXplcnxvdmVyaGVhZHxwYXVzZXxwb3BsaXN0fHBvdGlvbnxwcm9tcHRyZXNwb25zZXxwdXNobGlzdHxyZW1vdmVsaXN0fHJlbW92ZXRpbWVyfHJlbmFtZXxyZXN0b2NrfHNheXxzY2F2fHNjYXZlbmdlcnxzY3JpcHR8c2V0YWJpbGl0eXxzZXRsYXN0dGFyZ2V0fHNldHNraWxsfHNldHRpbWVyfHNldHZhcnxzeXNtc2d8dGFyZ2V0fHRhcmdldGxvY3x0YXJnZXRyZWxsb2N8dGFyZ2V0dHlwZXx1bmRyZXNzfHVuaWdub3JlfHVuc2V0dmFyfHVzZW9iamVjdHx1c2VvbmNlfHVzZXNraWxsfHVzZXR5cGV8dmlydHVlfHdhaXR8d2FpdGZvcmd1bXB8d2FpdGZvcm1lbnV8d2FpdGZvcnByb21wdHx3YWl0Zm9yc3RhdHx3YWl0Zm9yc3lzbXNnfHdhaXRmb3J0YXJnZXR8d2Fsa3x3ZnN5c21zZ3x3ZnR8d2hpc3Blcnx5ZWxsKVxcYi8sXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J3RhZy1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oXlxceyUtP1xccyopXFx3Ky8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdkZWxpbWl0ZXInOiB7XG5cdFx0cGF0dGVybjogL15cXHtbeyVdLT98LT9bJX1dXFx9JC8sXG5cdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0fSxcblx0J2Z1bmN0aW9uJzogL1xcYig/OmF0bGlzdHxjbG9zZXxjbG9zZXN0fGNvdW50fGNvdW50ZXJ8Y291bnR0eXBlfGRlYWR8ZGV4fGRpZmZoaXRzfGRpZmZtYW5hfGRpZmZzdGFtfGRpZmZ3ZWlnaHR8ZmluZHxmaW5kYnVmZnxmaW5kZGVidWZmfGZpbmRsYXllcnxmaW5kdHlwZXxmaW5kdHlwZWxpc3R8Zm9sbG93ZXJzfGd1bXBleGlzdHN8aGlkZGVufGhpdHN8aHB8aHVlfGh1bWFufGh1bWFub2lkfGluZ3VtcHxpbmxpc3R8aW5zeXNtZXNzYWdlfGluc3lzbXNnfGludHxpbnZ1bHxsaGFuZGVtcHR5fGxpc3R8bGlzdGV4aXN0c3xtYW5hfG1heGhpdHN8bWF4aHB8bWF4bWFuYXxtYXhzdGFtfG1heHdlaWdodHxtb25zdGVyfG1vdW50ZWR8bmFtZXxuZXh0fG5vdG98cGFyYWx5emVkfHBvaXNvbmVkfHBvc2l0aW9ufHByZXZ8cHJldmlvdXN8cXVldWVkfHJhbmR8cmFuZG9tfHJoYW5kZW1wdHl8c2tpbGx8c3RhbXxzdHJ8dGFyZ2V0ZXhpc3RzfHRpbWVyfHRpbWVyZXhpc3RzfHZhcmV4aXN0fHdhcm1vZGV8d2VpZ2h0KVxcYi8sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFuZHxhc3xicmVha3xjb250aW51ZXxlbHNlfGVsc2VpZnxlbmRmb3J8ZW5kaWZ8ZW5kd2hpbGV8Zm9yfGlmfGxvb3B8bm90fG9yfHJlcGxheXxzdG9wfHdoaWxlKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfG51bGx8dHJ1ZSlcXGIvLFxuXHQnbnVtYmVyJzogL1xcYjB4W1xcZEEtRmEtZl0rfCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpbRWVdWy0rXT9cXGQrKT8vLFxuXHQnb3BlcmF0b3InOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhcXHMpKD86YW5kfGItYW5kfGItb3J8Yi14b3J8ZW5kcyB3aXRofGlufGlzfG1hdGNoZXN8bm90fG9yfHNhbWUgYXN8c3RhcnRzIHdpdGgpKD89XFxzKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvWz08Pl09P3whPXxcXCpcXCo/fFxcL1xcLz98XFw/Oj98Wy0rfiV8XS9cblx0XSxcblx0J3B1bmN0dWF0aW9uJzogL1soKVxcW1xcXXt9Oi4sXS9cbn07XG5cbi8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I2FwcGVuZGl4LUFcblxuUHJpc20ubGFuZ3VhZ2VzLnVyaSA9IHtcblx0J3NjaGVtZSc6IHtcblx0XHRwYXR0ZXJuOiAvXlthLXpdW2EtejAtOSsuLV0qOi9pbSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnc2NoZW1lLWRlbGltaXRlcic6IC86JC9cblx0XHR9XG5cdH0sXG5cdCdmcmFnbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvI1tcXHdcXC0ufiEkJicoKSorLDs9JTpALz9dKi8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnZnJhZ21lbnQtZGVsaW1pdGVyJzogL14jL1xuXHRcdH1cblx0fSxcblx0J3F1ZXJ5Jzoge1xuXHRcdHBhdHRlcm46IC9cXD9bXFx3XFwtLn4hJCYnKCkqKyw7PSU6QC8/XSovLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3F1ZXJ5LWRlbGltaXRlcic6IHtcblx0XHRcdFx0cGF0dGVybjogL15cXD8vLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQncGFpci1kZWxpbWl0ZXInOiAvWyY7XS8sXG5cdFx0XHQncGFpcic6IHtcblx0XHRcdFx0cGF0dGVybjogL15bXj1dW1xcc1xcU10qLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2tleSc6IC9eW149XSsvLFxuXHRcdFx0XHRcdCd2YWx1ZSc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXj0pW1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdhdXRob3JpdHknOiB7XG5cdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0L15cXC9cXC8vLnNvdXJjZVxuXHRcdFx0Ly8gWyB1c2VyaW5mbyBcIkBcIiBdXG5cdFx0XHQrIC8oPzpbXFx3XFwtLn4hJCYnKCkqKyw7PSU6XSpAKT8vLnNvdXJjZVxuXHRcdFx0Ly8gaG9zdFxuXHRcdFx0KyAoXG5cdFx0XHRcdCcoPzonXG5cdFx0XHRcdC8vIElQLWxpdGVyYWxcblx0XHRcdFx0KyAvXFxbKD86WzAtOWEtZkEtRjouXXsyLDQ4fXx2WzAtOWEtZkEtRl0rXFwuW1xcd1xcLS5+ISQmJygpKissOz1dKylcXF0vLnNvdXJjZVxuXHRcdFx0XHQrICd8J1xuXHRcdFx0XHQvLyBJUHY0YWRkcmVzcyBvciByZWdpc3RlcmVkIG5hbWVcblx0XHRcdFx0KyAvW1xcd1xcLS5+ISQmJygpKissOz0lXSovLnNvdXJjZVxuXHRcdFx0XHQrICcpJ1xuXHRcdFx0KVxuXHRcdFx0Ly8gWyBcIjpcIiBwb3J0IF1cblx0XHRcdCsgLyg/OjpcXGQqKT8vLnNvdXJjZSxcblx0XHRcdCdtJ1xuXHRcdCksXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnYXV0aG9yaXR5LWRlbGltaXRlcic6IC9eXFwvXFwvLyxcblx0XHRcdCd1c2VyLWluZm8tc2VnbWVudCc6IHtcblx0XHRcdFx0cGF0dGVybjogL15bXFx3XFwtLn4hJCYnKCkqKyw7PSU6XSpALyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3VzZXItaW5mby1kZWxpbWl0ZXInOiAvQCQvLFxuXHRcdFx0XHRcdCd1c2VyLWluZm8nOiAvXltcXHdcXC0ufiEkJicoKSorLDs9JTpdKy9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdwb3J0LXNlZ21lbnQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC86XFxkKiQvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncG9ydC1kZWxpbWl0ZXInOiAvXjovLFxuXHRcdFx0XHRcdCdwb3J0JzogL15cXGQrL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J2hvc3QnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaXAtbGl0ZXJhbCc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eXFxbW1xcc1xcU10rXFxdJC8sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0J2lwLWxpdGVyYWwtZGVsaW1pdGVyJzogL15cXFt8XFxdJC8sXG5cdFx0XHRcdFx0XHRcdCdpcHYtZnV0dXJlJzogL152W1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdFx0J2lwdjYtYWRkcmVzcyc6IC9eW1xcc1xcU10rL1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J2lwdjQtYWRkcmVzcyc6IC9eKD86KD86WzAzLTldXFxkP3xbMTJdXFxkezAsMn0pXFwuKXszfSg/OlswMy05XVxcZD98WzEyXVxcZHswLDJ9KSQvXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdwYXRoJzoge1xuXHRcdHBhdHRlcm46IC9eW1xcd1xcLS5+ISQmJygpKissOz0lOkAvXSsvbSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwYXRoLXNlcGFyYXRvcic6IC9cXC8vXG5cdFx0fVxuXHR9XG59O1xuXG5QcmlzbS5sYW5ndWFnZXMudXJsID0gUHJpc20ubGFuZ3VhZ2VzLnVyaTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHR2YXIgaW50ZXJwb2xhdGlvbkV4cHIgPSB7XG5cdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0aW5zaWRlOiBudWxsXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnYgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL3I/KFtcIiddKSg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdFx0YWxpYXM6ICdxdW90ZWQtc3RyaW5nJyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXFxcXSkoPzpcXFxcezJ9KSopXFwkKD86XFx7W157fV0qXFx9fFxcdysoPzpcXC5cXHcrKD86XFwoW15cXChcXCldKlxcKSk/fFxcW1teXFxbXFxdXStcXF0pKikvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbi12YXJpYWJsZSc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL15cXCRcXHdbXFxzXFxTXSokLyxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL15cXCRcXHt8XFx9JC8sXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J2ludGVycG9sYXRpb24tZXhwcmVzc2lvbic6IGludGVycG9sYXRpb25FeHByXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnY2xhc3MtbmFtZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxiKD86ZW51bXxpbnRlcmZhY2V8c3RydWN0fHR5cGUpXFxzKykoPzpDXFwuKT9cXHcrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzogLyg/OlxcYig/Ol9fZ2xvYmFsfGFzfGFzbXxhc3NlcnR8YXRvbWljfGJyZWFrfGNoYW58Y29uc3R8Y29udGludWV8ZGVmZXJ8ZWxzZXxlbWJlZHxlbnVtfGZufGZvcnxnbyg/OnRvKT98aWZ8aW1wb3J0fGlufGludGVyZmFjZXxpc3xsb2NrfG1hdGNofG1vZHVsZXxtdXR8bm9uZXxvcnxwdWJ8cmV0dXJufHJsb2NrfHNlbGVjdHxzaGFyZWR8c2l6ZW9mfHN0YXRpY3xzdHJ1Y3R8dHlwZSg/Om9mKT98dW5pb258dW5zYWZlKXxcXCQoPzplbHNlfGZvcnxpZil8Iyg/OmZsYWd8aW5jbHVkZSkpXFxiLyxcblx0XHQnbnVtYmVyJzogL1xcYig/OjB4W2EtZlxcZF0rKD86X1thLWZcXGRdKykqfDBiWzAxXSsoPzpfWzAxXSspKnwwb1swLTddKyg/Ol9bMC03XSspKnxcXGQrKD86X1xcZCspKig/OlxcLlxcZCsoPzpfXFxkKykqKT8pXFxiL2ksXG5cdFx0J29wZXJhdG9yJzogL358XFw/fFsqXFwvJV4hPV09P3xcXCtbPStdP3wtWz0tXT98XFx8Wz18XT98Jig/Oj18JnxcXF49Pyk/fD4oPzo+PT98PSk/fDwoPzo8PT98PXwtKT98Oj18XFwuXFwuXFwuPy8sXG5cdFx0J2J1aWx0aW4nOiAvXFxiKD86YW55KD86X2Zsb2F0fF9pbnQpP3xib29sfGJ5dGUoPzpwdHIpP3xjaGFycHRyfGYoPzozMnw2NCl8aSg/Ojh8MTZ8NjR8MTI4fG50KXxydW5lfHNpemVfdHxzdHJpbmd8dSg/OjE2fDMyfDY0fDEyOCl8dm9pZHB0cilcXGIvXG5cdH0pO1xuXG5cdGludGVycG9sYXRpb25FeHByLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy52O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3YnLCAnc3RyaW5nJywge1xuXHRcdCdjaGFyJzoge1xuXHRcdFx0cGF0dGVybjogL2AoPzpcXFxcYHxcXFxcP1teYF17MSwyfSlgLywgLy8gdXNpbmcgezEsMn0gaW5zdGVhZCBvZiBgdWAgZmxhZyBmb3IgY29tcGF0aWJpbGl0eVxuXHRcdFx0YWxpYXM6ICdydW5lJ1xuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgndicsICdvcGVyYXRvcicsIHtcblx0XHQnYXR0cmlidXRlJzoge1xuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKilcXFsoPzpkZXByZWNhdGVkfGRpcmVjdF9hcnJheV9hY2Nlc3N8ZmxhZ3xpbmxpbmV8bGl2ZXxyZWZfb25seXx0eXBlZGVmfHVuc2FmZV9mbnx3aW5kb3dzX3N0ZGNhbGwpXFxdL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdhbm5vdGF0aW9uJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXV0vLFxuXHRcdFx0XHQna2V5d29yZCc6IC9cXHcrL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2dlbmVyaWMnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvPFxcdys+KD89XFxzKltcXClcXHtdKS8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1s8Pl0vLFxuXHRcdFx0XHQnY2xhc3MtbmFtZSc6IC9cXHcrL1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgndicsICdmdW5jdGlvbicsIHtcblx0XHQnZ2VuZXJpYy1mdW5jdGlvbic6IHtcblx0XHRcdC8vIGUuZy4gZm9vPFQ+KCAuLi5cblx0XHRcdHBhdHRlcm46IC9cXGJcXHcrXFxzKjxcXHcrPig/PVxcKCkvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdmdW5jdGlvbic6IC9eXFx3Ky8sXG5cdFx0XHRcdCdnZW5lcmljJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC88XFx3Kz4vLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnYuZ2VuZXJpYy5pbnNpZGVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy52YWxhID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdC8vIENsYXNzZXMgY29waWVkIGZyb20gcHJpc20tY3NoYXJwXG5cdCdjbGFzcy1uYW1lJzogW1xuXHRcdHtcblx0XHRcdC8vIChGb28gYmFyLCBCYXIgYmF6KVxuXHRcdFx0cGF0dGVybjogL1xcYltBLVpdXFx3Kig/OlxcLlxcdyspKlxcYig/PSg/OlxcP1xccyt8XFwqP1xccytcXCo/KVxcdykvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdHB1bmN0dWF0aW9uOiAvXFwuL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gW0Zvb11cblx0XHRcdHBhdHRlcm46IC8oXFxbKVtBLVpdXFx3Kig/OlxcLlxcdyspKlxcYi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdHB1bmN0dWF0aW9uOiAvXFwuL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gY2xhc3MgRm9vIDogQmFyXG5cdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmNsYXNzfGludGVyZmFjZSlcXHMrW0EtWl1cXHcqKD86XFwuXFx3KykqXFxzKjpcXHMqKVtBLVpdXFx3Kig/OlxcLlxcdyspKlxcYi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdHB1bmN0dWF0aW9uOiAvXFwuL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gY2xhc3MgRm9vXG5cdFx0XHRwYXR0ZXJuOiAvKCg/OlxcYig/OmNsYXNzfGVudW18aW50ZXJmYWNlfG5ld3xzdHJ1Y3QpXFxzKyl8KD86Y2F0Y2hcXHMrXFwoKSlbQS1aXVxcdyooPzpcXC5cXHcrKSpcXGIvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRwdW5jdHVhdGlvbjogL1xcLi9cblx0XHRcdH1cblx0XHR9XG5cdF0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFic3RyYWN0fGFzfGFzc2VydHxhc3luY3xiYXNlfGJvb2x8YnJlYWt8Y2FzZXxjYXRjaHxjaGFyfGNsYXNzfGNvbnN0fGNvbnN0cnVjdHxjb250aW51ZXxkZWZhdWx0fGRlbGVnYXRlfGRlbGV0ZXxkb3xkb3VibGV8ZHluYW1pY3xlbHNlfGVuc3VyZXN8ZW51bXxlcnJvcmRvbWFpbnxleHRlcm58ZmluYWxseXxmbG9hdHxmb3J8Zm9yZWFjaHxnZXR8aWZ8aW58aW5saW5lfGludHxpbnQxNnxpbnQzMnxpbnQ2NHxpbnQ4fGludGVyZmFjZXxpbnRlcm5hbHxpc3xsb2NrfGxvbmd8bmFtZXNwYWNlfG5ld3xudWxsfG91dHxvdmVycmlkZXxvd25lZHxwYXJhbXN8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlZnxyZXF1aXJlc3xyZXR1cm58c2V0fHNob3J0fHNpZ25hbHxzaXplb2Z8c2l6ZV90fHNzaXplX3R8c3RhdGljfHN0cmluZ3xzdHJ1Y3R8c3dpdGNofHRoaXN8dGhyb3d8dGhyb3dzfHRyeXx0eXBlb2Z8dWNoYXJ8dWludHx1aW50MTZ8dWludDMyfHVpbnQ2NHx1aW50OHx1bG9uZ3x1bmljaGFyfHVub3duZWR8dXNob3J0fHVzaW5nfHZhbHVlfHZhcnx2aXJ0dWFsfHZvaWR8dm9sYXRpbGV8d2Vha3x3aGlsZXx5aWVsZClcXGIvaSxcblx0J2Z1bmN0aW9uJzogL1xcYlxcdysoPz1cXHMqXFwoKS8sXG5cdCdudW1iZXInOiAvKD86XFxiMHhbXFxkYS1mXStcXGJ8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspPykoPzpmfHU/bD8pPy9pLFxuXHQnb3BlcmF0b3InOiAvXFwrXFwrfC0tfCYmfFxcfFxcfHw8PD0/fD4+PT98PT58LT58fnxbK1xcLSpcXC8lJl58PSE8Pl09P3xcXD9cXD8/fFxcLlxcLlxcLi8sXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLC46XS8sXG5cdCdjb25zdGFudCc6IC9cXGJbQS1aMC05X10rXFxiL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3ZhbGEnLCAnc3RyaW5nJywge1xuXHQncmF3LXN0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCJcIlwiW1xcc1xcU10qP1wiXCJcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHR9LFxuXHQndGVtcGxhdGUtc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9AXCJbXFxzXFxTXSo/XCIvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwkKD86XFwoW14pXSpcXCl8W2EtekEtWl1cXHcqKS8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcJFxcKD98XFwpJC8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0cmVzdDogUHJpc20ubGFuZ3VhZ2VzLnZhbGFcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3ZhbGEnLCAna2V5d29yZCcsIHtcblx0J3JlZ2V4Jzoge1xuXHRcdHBhdHRlcm46IC9cXC8oPzpcXFsoPzpbXlxcXVxcXFxcXHJcXG5dfFxcXFwuKSpcXF18XFxcXC58W14vXFxcXFxcW1xcclxcbl0pK1xcL1tpbXN4XXswLDR9KD89XFxzKig/OiR8W1xcclxcbiwuO30pXFxdXSkpLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncmVnZXgtc291cmNlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXihcXC8pW1xcc1xcU10rKD89XFwvW2Etel0qJCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLXJlZ2V4Jyxcblx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucmVnZXhcblx0XHRcdH0sXG5cdFx0XHQncmVnZXgtZGVsaW1pdGVyJzogL15cXC8vLFxuXHRcdFx0J3JlZ2V4LWZsYWdzJzogL15bYS16XSskLyxcblx0XHR9XG5cdH1cbn0pO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdFByaXNtLmxhbmd1YWdlcy52ZWxvY2l0eSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ21hcmt1cCcsIHt9KTtcblxuXHR2YXIgdmVsb2NpdHkgPSB7XG5cdFx0J3ZhcmlhYmxlJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0oPzpcXFxcXFxcXCkqKVxcJCE/KD86W2Etel1bXFx3LV0qKD86XFwoW14pXSpcXCkpPyg/OlxcLlthLXpdW1xcdy1dKig/OlxcKFteKV0qXFwpKT98XFxbW15cXF1dK1xcXSkqfFxce1tefV0rXFx9KS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge30gLy8gU2VlIGJlbG93XG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiW15cIl0qXCJ8J1teJ10qJy8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdudW1iZXInOiAvXFxiXFxkK1xcYi8sXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHRcdCdvcGVyYXRvcic6IC9bPSE8Pl09P3xbKyovJS1dfCYmfFxcfFxcfHxcXC5cXC58XFxiKD86ZXF8Z1tldF18bFtldF18big/OmV8b3QpKVxcYi8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKXt9W1xcXTosLl0vXG5cdH07XG5cblx0dmVsb2NpdHkudmFyaWFibGUuaW5zaWRlID0ge1xuXHRcdCdzdHJpbmcnOiB2ZWxvY2l0eVsnc3RyaW5nJ10sXG5cdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhbXlxcdy1dKVthLXpdW1xcdy1dKig/PVxcKCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J251bWJlcic6IHZlbG9jaXR5WydudW1iZXInXSxcblx0XHQnYm9vbGVhbic6IHZlbG9jaXR5Wydib29sZWFuJ10sXG5cdFx0J3B1bmN0dWF0aW9uJzogdmVsb2NpdHlbJ3B1bmN0dWF0aW9uJ11cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCd2ZWxvY2l0eScsICdjb21tZW50Jywge1xuXHRcdCd1bnBhcnNlZCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSNcXFtcXFtbXFxzXFxTXSo/XFxdXFxdIy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eI1xcW1xcW3xcXF1cXF0jJC9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCd2ZWxvY2l0eS1jb21tZW50JzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkjXFwqW1xcc1xcU10qP1xcKiMvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnY29tbWVudCdcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSMjLiovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnY29tbWVudCdcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdkaXJlY3RpdmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSg/OlxcXFxcXFxcKSopI0A/KD86W2Etel1bXFx3LV0qfFxce1thLXpdW1xcdy1dKlxcfSkoPzpcXHMqXFwoKD86W14oKV18XFwoW14oKV0qXFwpKSpcXCkpPy9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQna2V5d29yZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXiNAPyg/OlthLXpdW1xcdy1dKnxcXHtbYS16XVtcXHctXSpcXH0pfFxcYmluXFxiLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9be31dL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0cmVzdDogdmVsb2NpdHlcblx0XHRcdH1cblx0XHR9LFxuXHRcdCd2YXJpYWJsZSc6IHZlbG9jaXR5Wyd2YXJpYWJsZSddXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy52ZWxvY2l0eVsndGFnJ10uaW5zaWRlWydhdHRyLXZhbHVlJ10uaW5zaWRlLnJlc3QgPSBQcmlzbS5sYW5ndWFnZXMudmVsb2NpdHk7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnZlcmlsb2cgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXlwiXFxcXFxcclxcbl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tlcm5lbC1mdW5jdGlvbic6IHtcblx0XHQvLyBzdXBwb3J0IGZvciBhbnkga2VybmVsIGZ1bmN0aW9uIChleDogJGRpc3BsYXkoKSlcblx0XHRwYXR0ZXJuOiAvXFxCXFwkXFx3K1xcYi8sXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblx0Ly8gc3VwcG9ydCBmb3IgdXNlciBkZWZpbmVkIGNvbnN0YW50cyAoZXg6IGBkZWZpbmUpXG5cdCdjb25zdGFudCc6IC9cXEJgXFx3K1xcYi8sXG5cdCdmdW5jdGlvbic6IC9cXGJcXHcrKD89XFwoKS8sXG5cdC8vIHN1cHBvcnQgZm9yIHZlcmlsb2cgYW5kIHN5c3RlbSB2ZXJpbG9nIGtleXdvcmRzXG5cdCdrZXl3b3JkJzogL1xcYig/OmFsaWFzfGFuZHxhc3NlcnR8YXNzaWdufGFzc3VtZXxhdXRvbWF0aWN8YmVmb3JlfGJlZ2lufGJpbmR8Ymluc3xiaW5zb2Z8Yml0fGJyZWFrfGJ1ZnxidWZpZjB8YnVmaWYxfGJ5dGV8Y2FzZXxjYXNleHxjYXNlenxjZWxsfGNoYW5kbGV8Y2xhc3N8Y2xvY2tpbmd8Y21vc3xjb25maWd8Y29uc3R8Y29uc3RyYWludHxjb250ZXh0fGNvbnRpbnVlfGNvdmVyfGNvdmVyZ3JvdXB8Y292ZXJwb2ludHxjcm9zc3xkZWFzc2lnbnxkZWZhdWx0fGRlZnBhcmFtfGRlc2lnbnxkaXNhYmxlfGRpc3R8ZG98ZWRnZXxlbHNlfGVuZHxlbmRjYXNlfGVuZGNsYXNzfGVuZGNsb2NraW5nfGVuZGNvbmZpZ3xlbmRmdW5jdGlvbnxlbmRnZW5lcmF0ZXxlbmRncm91cHxlbmRpbnRlcmZhY2V8ZW5kbW9kdWxlfGVuZHBhY2thZ2V8ZW5kcHJpbWl0aXZlfGVuZHByb2dyYW18ZW5kcHJvcGVydHl8ZW5kc2VxdWVuY2V8ZW5kc3BlY2lmeXxlbmR0YWJsZXxlbmR0YXNrfGVudW18ZXZlbnR8ZXhwZWN0fGV4cG9ydHxleHRlbmRzfGV4dGVybnxmaW5hbHxmaXJzdF9tYXRjaHxmb3J8Zm9yY2V8Zm9yZWFjaHxmb3JldmVyfGZvcmt8Zm9ya2pvaW58ZnVuY3Rpb258Z2VuZXJhdGV8Z2VudmFyfGhpZ2h6MHxoaWdoejF8aWZ8aWZmfGlmbm9uZXxpZ25vcmVfYmluc3xpbGxlZ2FsX2JpbnN8aW1wb3J0fGluY2RpcnxpbmNsdWRlfGluaXRpYWx8aW5vdXR8aW5wdXR8aW5zaWRlfGluc3RhbmNlfGludHxpbnRlZ2VyfGludGVyZmFjZXxpbnRlcnNlY3R8am9pbnxqb2luX2FueXxqb2luX25vbmV8bGFyZ2V8bGlibGlzdHxsaWJyYXJ5fGxvY2FsfGxvY2FscGFyYW18bG9naWN8bG9uZ2ludHxtYWNyb21vZHVsZXxtYXRjaGVzfG1lZGl1bXxtb2Rwb3J0fG1vZHVsZXxuYW5kfG5lZ2VkZ2V8bmV3fG5tb3N8bm9yfG5vc2hvd2NhbmNlbGxlZHxub3R8bm90aWYwfG5vdGlmMXxudWxsfG9yfG91dHB1dHxwYWNrYWdlfHBhY2tlZHxwYXJhbWV0ZXJ8cG1vc3xwb3NlZGdlfHByaW1pdGl2ZXxwcmlvcml0eXxwcm9ncmFtfHByb3BlcnR5fHByb3RlY3RlZHxwdWxsMHxwdWxsMXxwdWxsZG93bnxwdWxsdXB8cHVsc2VzdHlsZV9vbmRldGVjdHxwdWxzZXN0eWxlX29uZXZlbnR8cHVyZXxyYW5kfHJhbmRjfHJhbmRjYXNlfHJhbmRzZXF1ZW5jZXxyY21vc3xyZWFsfHJlYWx0aW1lfHJlZnxyZWd8cmVsZWFzZXxyZXBlYXR8cmV0dXJufHJubW9zfHJwbW9zfHJ0cmFufHJ0cmFuaWYwfHJ0cmFuaWYxfHNjYWxhcmVkfHNlcXVlbmNlfHNob3J0aW50fHNob3J0cmVhbHxzaG93Y2FuY2VsbGVkfHNpZ25lZHxzbWFsbHxzb2x2ZXxzcGVjaWZ5fHNwZWNwYXJhbXxzdGF0aWN8c3RyaW5nfHN0cm9uZzB8c3Ryb25nMXxzdHJ1Y3R8c3VwZXJ8c3VwcGx5MHxzdXBwbHkxfHRhYmxlfHRhZ2dlZHx0YXNrfHRoaXN8dGhyb3VnaG91dHx0aW1lfHRpbWVwcmVjaXNpb258dGltZXVuaXR8dHJhbnx0cmFuaWYwfHRyYW5pZjF8dHJpfHRyaTB8dHJpMXx0cmlhbmR8dHJpb3J8dHJpcmVnfHR5cGV8dHlwZWRlZnx1bmlvbnx1bmlxdWV8dW5zaWduZWR8dXNlfHV3aXJlfHZhcnx2ZWN0b3JlZHx2aXJ0dWFsfHZvaWR8d2FpdHx3YWl0X29yZGVyfHdhbmR8d2VhazB8d2VhazF8d2hpbGV8d2lsZGNhcmR8d2lyZXx3aXRofHdpdGhpbnx3b3J8eG5vcnx4b3IpXFxiLyxcblx0Ly8gYm9sZCBoaWdobGlnaHRpbmcgZm9yIGFsbCB2ZXJpbG9nIGFuZCBzeXN0ZW0gdmVyaWxvZyBsb2dpYyBibG9ja3Ncblx0J2ltcG9ydGFudCc6IC9cXGIoPzphbHdheXN8YWx3YXlzX2NvbWJ8YWx3YXlzX2ZmfGFsd2F5c19sYXRjaClcXGIoPzogKkApPy8sXG5cdC8vIHN1cHBvcnQgZm9yIHRpbWUgdGlja3MsIHZlY3RvcnMsIGFuZCByZWFsIG51bWJlcnNcblx0J251bWJlcic6IC9cXEIjIz9cXGQrfCg/OlxcYlxcZCspPydbb2RiaF0gP1tcXGRhLWZ6eF8/XSt8XFxiKD86XFxkKlsuX10pP1xcZCsoPzplWy0rXT9cXGQrKT8vaSxcblx0J29wZXJhdG9yJzogL1stK3t9Xn4lKlxcLz89ITw+JnxdKy8sXG5cdCdwdW5jdHVhdGlvbic6IC9bW1xcXTsoKSwuOl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMudmhkbCA9IHtcblx0J2NvbW1lbnQnOiAvLS0uKy8sXG5cdC8vIHN1cHBvcnQgZm9yIGFsbCBsb2dpYyB2ZWN0b3JzXG5cdCd2aGRsLXZlY3RvcnMnOiB7XG5cdFx0J3BhdHRlcm4nOiAvXFxiW294Yl1cIltcXGRhLWZfXStcInxcIlswMXV4endsaC1dK1wiL2ksXG5cdFx0J2FsaWFzJzogJ251bWJlcidcblx0fSxcblx0Ly8gc3VwcG9ydCBmb3Igb3BlcmF0b3Igb3ZlcmxvYWRpbmcgaW5jbHVkZWRcblx0J3F1b3RlZC1mdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvXCJcXFMrP1wiKD89XFwoKS8sXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J3N0cmluZyc6IC9cIig/OlteXFxcXFwiXFxyXFxuXXxcXFxcKD86XFxyXFxufFtcXHNcXFNdKSkqXCIvLFxuXHQnYXR0cmlidXRlJzoge1xuXHRcdHBhdHRlcm46IC9cXGInXFx3Ky8sXG5cdFx0YWxpYXM6ICdhdHRyLW5hbWUnXG5cdH0sXG5cdC8vIHN1cHBvcnQgZm9yIHByZWRlZmluZWQgYXR0cmlidXRlcyBpbmNsdWRlZFxuXHQna2V5d29yZCc6IC9cXGIoPzphY2Nlc3N8YWZ0ZXJ8YWxpYXN8YWxsfGFyY2hpdGVjdHVyZXxhcnJheXxhc3NlcnR8YXR0cmlidXRlfGJlZ2lufGJsb2NrfGJvZHl8YnVmZmVyfGJ1c3xjYXNlfGNvbXBvbmVudHxjb25maWd1cmF0aW9ufGNvbnN0YW50fGRpc2Nvbm5lY3R8ZG93bnRvfGVsc2V8ZWxzaWZ8ZW5kfGVudGl0eXxleGl0fGZpbGV8Zm9yfGZ1bmN0aW9ufGdlbmVyYXRlfGdlbmVyaWN8Z3JvdXB8Z3VhcmRlZHxpZnxpbXB1cmV8aW58aW5lcnRpYWx8aW5vdXR8aXN8bGFiZWx8bGlicmFyeXxsaW5rYWdlfGxpdGVyYWx8bG9vcHxtYXB8bmV3fG5leHR8bnVsbHxvZnxvbnxvcGVufG90aGVyc3xvdXR8cGFja2FnZXxwb3J0fHBvc3Rwb25lZHxwcml2YXRlfHByb2NlZHVyZXxwcm9jZXNzfHB1cmV8cmFuZ2V8cmVjb3JkfHJlZ2lzdGVyfHJlamVjdHxyZXBvcnR8cmV0dXJufHNlbGVjdHxzZXZlcml0eXxzaGFyZWR8c2lnbmFsfHN1YnR5cGV8dGhlbnx0b3x0cmFuc3BvcnR8dHlwZXx1bmFmZmVjdGVkfHVuaXRzfHVudGlsfHVzZXx2YXJpYWJsZXx2aWV3fHdhaXR8d2hlbnx3aGlsZXx3aXRoKVxcYi9pLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi9pLFxuXHQnZnVuY3Rpb24nOiAvXFx3Kyg/PVxcKCkvLFxuXHQvLyBkZWNpbWFsLCBiYXNlZCwgcGh5c2ljYWwsIGFuZCBleHBvbmVudGlhbCBudW1iZXJzIHN1cHBvcnRlZFxuXHQnbnVtYmVyJzogLydbMDF1eHp3bGgtXSd8XFxiKD86XFxkKyNbXFxkYS1mXy5dKyN8XFxkW1xcZF8uXSopKD86ZVstK10/XFxkKyk/L2ksXG5cdCdvcGVyYXRvcic6IC9bPD5dPT98Oj18Wy0rKi8mPV18XFxiKD86YWJzfGFuZHxtb2R8bmFuZHxub3J8bm90fG9yfHJlbXxyb2x8cm9yfHNsYXxzbGx8c3JhfHNybHx4bm9yfHhvcilcXGIvaSxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksLjpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnZpbSA9IHtcblx0J3N0cmluZyc6IC9cIig/OlteXCJcXFxcXFxyXFxuXXxcXFxcLikqXCJ8Jyg/OlteJ1xcclxcbl18JycpKicvLFxuXHQnY29tbWVudCc6IC9cIi4qLyxcblx0J2Z1bmN0aW9uJzogL1xcYlxcdysoPz1cXCgpLyxcblx0J2tleXdvcmQnOiAvXFxiKD86TnxOZXh0fFB8UHJpbnR8WHxYTUxlbnR8WE1MbnN8YWJ8YWJicmV2aWF0ZXxhYmN8YWJjbGVhcnxhYm98YWJvdmVsZWZ0fGFsfGFsbHxhcnxhcmdhfGFyZ2FkZHxhcmdkfGFyZ2RlbGV0ZXxhcmdkb3xhcmdlfGFyZ2VkaXR8YXJnZ3xhcmdnbG9iYWx8YXJnbHxhcmdsb2NhbHxhcmdzfGFyZ3V8YXJndW1lbnR8YXN8YXNjaWl8YnxiTnxiTmV4dHxiYXxiYWR8YmFkZHxiYWxsfGJkfGJkZWxldGV8YmV8YmVsfGJlbG93cmlnaHR8YmZ8YmZpcnN0fGJsfGJsYXN0fGJtfGJtb2RpZmllZHxibnxibmV4dHxib3xib3RyaWdodHxicHxicHJldmlvdXN8YnJ8YnJlYXxicmVha3xicmVha2F8YnJlYWthZGR8YnJlYWtkfGJyZWFrZGVsfGJyZWFrbHxicmVha2xpc3R8YnJld2luZHxicm98YnJvd3NlfGJ1ZmRvfGJ1ZmZlcnxidWZmZXJzfGJ1bnxidW5sb2FkfGJ3fGJ3aXBlb3V0fGN8Y058Y05leHR8Y05mY05maWxlfGNhfGNhYmJyZXZ8Y2FiY3xjYWJjbGVhcnxjYWR8Y2FkZGJ8Y2FkZGJ1ZmZlcnxjYWRkZXhwcnxjYWRkZnxjYWRkZmlsZXxjYWx8Y2FsbHxjYXR8Y2F0Y2h8Y2J8Y2J1ZmZlcnxjY3xjY2x8Y2Nsb3NlfGNkfGNlfGNlbnRlcnxjZXh8Y2V4cHJ8Y2Z8Y2ZpbGV8Y2ZpcnxjZmlyc3R8Y2d8Y2dldGJ8Y2dldGJ1ZmZlcnxjZ2V0ZXxjZ2V0ZXhwcnxjZ2V0ZmlsZXxjaGFuZ2V8Y2hhbmdlc3xjaGR8Y2hkaXJ8Y2hlfGNoZWNrcGF0aHxjaGVja3R8Y2hlY2t0aW1lfGNsfGNsYXxjbGFzdHxjbGlzdHxjbG98Y2xvc2V8Y21hcGN8Y21hcGNsZWFyfGNufGNuZXd8Y25ld2VyfGNuZXh0fGNuZnxjbmZpbGV8Y25vcmVhfGNub3JlYWJicmV2fGNvfGNvbHxjb2xkZXJ8Y29sb3xjb2xvcnNjaGVtZXxjb21jfGNvbWNsZWFyfGNvbXB8Y29tcGlsZXJ8Y29ufGNvbmZ8Y29uZmlybXxjb250aW51ZXxjb3BlfGNvcGVufGNvcHl8Y3B8Y3BmfGNwZmlsZXxjcHJldmlvdXN8Y3F8Y3F1aXR8Y3J8Y3Jld2luZHxjdXxjdW5hfGN1bmFiYnJldnxjdW5tYXB8Y3d8Y3dpbmRvd3xkfGRlYnVnZ3xkZWJ1Z2dyZWVkeXxkZWxjfGRlbGNvbW1hbmR8ZGVsZXRlfGRlbGZ8ZGVsZnVuY3Rpb258ZGVsbXxkZWxtYXJrc3xkaXxkaWZmZ3xkaWZmZ2V0fGRpZmZvZmZ8ZGlmZnBhdGNofGRpZmZwdXxkaWZmcHV0fGRpZmZzcGxpdHxkaWZmdGhpc3xkaWZmdXxkaWZmdXBkYXRlfGRpZ3xkaWdyYXBoc3xkaXNwbGF5fGRqfGRqdW1wfGRsfGRsaXN0fGRyfGRyb3B8ZHN8ZHNlYXJjaHxkc3B8ZHNwbGl0fGV8ZWFybGllcnxlY2hvZXxlY2hvZXJyfGVjaG9tfGVjaG9tc2d8ZWNob258ZWRpdHxlbHxlbHNlfGVsc2VpfGVsc2VpZnxlbXxlbWVudXxlbnxlbmRmfGVuZGZvfGVuZGZvcnxlbmRmdW58ZW5kZnVuY3Rpb258ZW5kaWZ8ZW5kdHxlbmR0cnl8ZW5kd3xlbmR3aGlsZXxlbmV8ZW5ld3xleHxleGl8ZXhpdHxleHV8ZXh1c2FnZXxmfGZpbGV8ZmlsZXN8ZmlsZXR5cGV8ZmlufGZpbmF8ZmluYWxseXxmaW5kfGZpbml8ZmluaXNofGZpcnxmaXJzdHxmaXh8Zml4ZGVsfGZvfGZvbGR8Zm9sZGN8Zm9sZGNsb3NlfGZvbGRkfGZvbGRkb2N8Zm9sZGRvY2xvc2VkfGZvbGRkb29wZW58Zm9sZG98Zm9sZG9wZW58Zm9yfGZ1fGZ1bnxmdW5jdGlvbnxnb3xnb3RvfGdyfGdyZXB8Z3JlcGF8Z3JlcGFkZHxofGhhfGhhcmRjb3B5fGhlbHB8aGVscGZ8aGVscGZpbmR8aGVscGd8aGVscGdyZXB8aGVscHR8aGVscHRhZ3N8aGlkfGhpZGV8aGlzfGhpc3Rvcnl8aWF8aWFiYnJldnxpYWJjfGlhYmNsZWFyfGlmfGlqfGlqdW1wfGlsfGlsaXN0fGltYXBjfGltYXBjbGVhcnxpbnxpbm9yZWF8aW5vcmVhYmJyZXZ8aXNlYXJjaHxpc3B8aXNwbGl0fGl1fGl1bmF8aXVuYWJicmV2fGl1bm1hcHxqfGpvaW58anV8anVtcHN8a3xrZWV8a2VlcGFsdHxrZWVwanxrZWVwanVtcHN8a2VlcG1hcmtzfGx8bE58bE5leHR8bE5mfGxOZmlsZXxsYXxsYWR8bGFkZGJ8bGFkZGJ1ZmZlcnxsYWRkZXhwcnxsYWRkZnxsYWRkZmlsZXxsYW58bGFuZ3VhZ2V8bGFzdHxsYXRlcnxsYnxsYnVmZmVyfGxjfGxjZHxsY2h8bGNoZGlyfGxjbHxsY2xvc2V8bGVmdHxsZWZ0YXxsZWZ0YWJvdmV8bGV0fGxleHxsZXhwcnxsZnxsZmlsZXxsZmlyfGxmaXJzdHxsZ3xsZ2V0YnxsZ2V0YnVmZmVyfGxnZXRlfGxnZXRleHByfGxnZXRmaWxlfGxncnxsZ3JlcHxsZ3JlcGF8bGdyZXBhZGR8bGh8bGhlbHBncmVwfGxpc3R8bGx8bGxhfGxsYXN0fGxsaXxsbGlzdHxsbXxsbWFrfGxtYWtlfGxtYXB8bG1hcGN8bG1hcGNsZWFyfGxufGxuZXxsbmV3fGxuZXdlcnxsbmV4dHxsbmZ8bG5maWxlfGxub3JlbWFwfGxvfGxvYWR2aWV3fGxvY3xsb2NrbWFya3N8bG9ja3Z8bG9ja3Zhcnxsb2x8bG9sZGVyfGxvcHxsb3BlbnxscHxscGZ8bHBmaWxlfGxwcmV2aW91c3xscnxscmV3aW5kfGxzfGx0fGx0YWd8bHV8bHVubWFwfGx2fGx2aW1ncmVwfGx2aW1ncmVwYXxsdmltZ3JlcGFkZHxsd3xsd2luZG93fG18bWF8bWFrfG1ha2V8bWFya3xtYXJrc3xtYXR8bWF0Y2h8bWVudXR8bWVudXRyYW5zbGF0ZXxta3xta2V4cmN8bWtzfG1rc2Vzc2lvbnxta3NwfG1rc3BlbGx8bWt2fG1rdmllfG1rdmlld3xta3ZpbXJjfG1vZHxtb2RlfG1vdmV8bXp8bXpmfG16ZmlsZXxtenNjaGVtZXxufG5ia2V5fG5ld3xuZXh0fG5tYXBjfG5tYXBjbGVhcnxub2h8bm9obHNlYXJjaHxub3JlYXxub3JlYWJicmV2fG51fG51bWJlcnxudW58bnVubWFwfG98b21hcGN8b21hcGNsZWFyfG9ufG9ubHl8b3BlbnxvcHR8b3B0aW9uc3xvdXxvdW5tYXB8cHxwY3xwY2xvc2V8cGV8cGVkfHBlZGl0fHBlcmx8cGVybGR8cGVybGRvfHBvfHBvcHxwb3B1fHBvcHVwfHBwfHBwb3B8cHJlfHByZXNlcnZlfHByZXZ8cHJldmlvdXN8cHJpbnR8cHJvZnxwcm9mZHxwcm9mZGVsfHByb2ZpbGV8cHJvbXB0Znxwcm9tcHRmaW5kfHByb21wdHJ8cHJvbXB0cmVwbHxwc3xwc2VhcmNofHB0TnxwdE5leHR8cHRhfHB0YWd8cHRmfHB0Zmlyc3R8cHRqfHB0anVtcHxwdGx8cHRsYXN0fHB0bnxwdG5leHR8cHRwfHB0cHJldmlvdXN8cHRyfHB0cmV3aW5kfHB0c3xwdHNlbGVjdHxwdXxwdXR8cHd8cHdkfHB5fHB5ZnxweWZpbGV8cHl0aG9ufHF8cWF8cWFsbHxxdWl0fHF1aXRhfHF1aXRhbGx8cnxyZWFkfHJlY3xyZWNvdmVyfHJlZHxyZWRpfHJlZGlyfHJlZG98cmVkcnxyZWRyYXd8cmVkcmF3c3xyZWRyYXdzdGF0dXN8cmVnfHJlZ2lzdGVyc3xyZXN8cmVzaXplfHJldHxyZXRhYnxyZXR1fHJldHVybnxyZXd8cmV3aW5kfHJpfHJpZ2h0fHJpZ2h0YnxyaWdodGJlbG93fHJ1fHJ1YnxydWJ5fHJ1YnlkfHJ1Ynlkb3xydWJ5ZnxydWJ5ZmlsZXxydW50aW1lfHJ2fHJ2aW1pbmZvfHNOfHNOZXh0fHNhfHNhbHxzYWxsfHNhbnxzYW5kYm94fHNhcmd1bWVudHxzYXZ8c2F2ZWFzfHNifHNiTnxzYk5leHR8c2JhfHNiYWxsfHNiZnxzYmZpcnN0fHNibHxzYmxhc3R8c2JtfHNibW9kaWZpZWR8c2JufHNibmV4dHxzYnB8c2JwcmV2aW91c3xzYnJ8c2JyZXdpbmR8c2J1ZmZlcnxzY3JpcHxzY3JpcHRlfHNjcmlwdGVuY29kaW5nfHNjcmlwdG5hbWVzfHNlfHNldHxzZXRmfHNldGZpbGV0eXBlfHNldGd8c2V0Z2xvYmFsfHNldGx8c2V0bG9jYWx8c2Z8c2ZpbmR8c2ZpcnxzZmlyc3R8c2h8c2hlbGx8c2lnbnxzaWx8c2lsZW50fHNpbXxzaW1hbHR8c2x8c2xhfHNsYXN0fHNsZWVwfHNtfHNtYWdpY3xzbWFwfHNtYXBjfHNtYXBjbGVhcnxzbWV8c21lbnV8c258c25leHR8c25pfHNuaWZmfHNub3xzbm9tYWdpY3xzbm9yfHNub3JlbWFwfHNub3JlbWV8c25vcmVtZW51fHNvfHNvcnxzb3J0fHNvdXJjZXxzcHxzcGV8c3BlbGxkfHNwZWxsZHVtcHxzcGVsbGdvb2R8c3BlbGxpfHNwZWxsaW5mb3xzcGVsbHJ8c3BlbGxyZXBhbGx8c3BlbGx1fHNwZWxsdW5kb3xzcGVsbHd8c3BlbGx3cm9uZ3xzcGxpdHxzcHJ8c3ByZXZpb3VzfHNyZXxzcmV3aW5kfHN0fHN0YXxzdGFnfHN0YXJ8c3RhcnRnfHN0YXJ0Z3JlcGxhY2V8c3RhcnRpbnNlcnR8c3RhcnRyfHN0YXJ0cmVwbGFjZXxzdGp8c3RqdW1wfHN0b3B8c3RvcGl8c3RvcGluc2VydHxzdHN8c3RzZWxlY3R8c3VufHN1bmhpZGV8c3VubXxzdW5tYXB8c3VzfHN1c3BlbmR8c3Z8c3ZpZXd8c3luY2JpbmR8dHx0Tnx0TmV4dHx0YXx0YWJ8dGFiTnx0YWJOZXh0fHRhYmN8dGFiY2xvc2V8dGFiZHx0YWJkb3x0YWJlfHRhYmVkaXR8dGFiZnx0YWJmaW5kfHRhYmZpcnx0YWJmaXJzdHx0YWJsfHRhYmxhc3R8dGFibXx0YWJtb3ZlfHRhYm58dGFibmV3fHRhYm5leHR8dGFib3x0YWJvbmx5fHRhYnB8dGFicHJldmlvdXN8dGFicnx0YWJyZXdpbmR8dGFic3x0YWd8dGFnc3x0Y3x0Y2x8dGNsZHx0Y2xkb3x0Y2xmfHRjbGZpbGV8dGV8dGVhcm9mZnx0Znx0Zmlyc3R8dGh8dGhyb3d8dGp8dGp1bXB8dGx8dGxhc3R8dG18dG1lbnV8dG58dG5leHR8dG98dG9wbGVmdHx0cHx0cHJldmlvdXN8dHJ8dHJld2luZHx0cnl8dHN8dHNlbGVjdHx0dXx0dW5tZW51fHV8dW5hfHVuYWJicmV2aWF0ZXx1bmRvfHVuZG9qfHVuZG9qb2lufHVuZG9sfHVuZG9saXN0fHVuaHx1bmhpZGV8dW5sZXR8dW5sb3x1bmxvY2t2YXJ8dW5tfHVubWFwfHVwfHVwZGF0ZXx2ZXx2ZXJifHZlcmJvc2V8dmVyc2lvbnx2ZXJ0fHZlcnRpY2FsfHZpfHZpZXx2aWV3fHZpbXx2aW1ncmVwfHZpbWdyZXBhfHZpbWdyZXBhZGR8dmlzdWFsfHZpdXx2aXVzYWdlfHZtYXBjfHZtYXBjbGVhcnx2bmV8dm5ld3x2c3x2c3BsaXR8dnV8dnVubWFwfHd8d058d05leHR8d2F8d2FsbHx3aHx3aGlsZXx3aW58d2luY3x3aW5jbWR8d2luZG98d2lucHx3aW5wb3N8d2luc2l6ZXx3bnx3bmV4dHx3cHx3cHJldmlvdXN8d3F8d3FhfHdxYWxsfHdyaXRlfHdzfHdzdmVyYnx3dnx3dmltaW5mb3x4fHhhfHhhbGx8eGl0fHhtfHhtYXB8eG1hcGN8eG1hcGNsZWFyfHhtZXx4bWVudXx4bnx4bm9yZW1hcHx4bm9yZW1lfHhub3JlbWVudXx4dXx4dW5tYXB8eXx5YW5rKVxcYi8sXG5cdCdidWlsdGluJzogL1xcYig/OmFjZHxhaXxha218YWxlcGh8YWxsb3dyZXZpbnN8YWx0a2V5bWFwfGFtYml3aWR0aHxhbWJ3fGFudGl8YW50aWFsaWFzfGFyYWJ8YXJhYmljfGFyYWJpY3NoYXBlfGFyaXxhcnNoYXBlfGF1dG9jaGRpcnxhdXRvY21kfGF1dG9pbmRlbnR8YXV0b3JlYWR8YXV0b3dyaXRlfGF1dG93cml0ZWFsbHxhd3xhd2F8YmFja2dyb3VuZHxiYWNrc3BhY2V8YmFja3VwfGJhY2t1cGNvcHl8YmFja3VwZGlyfGJhY2t1cGV4dHxiYWNrdXBza2lwfGJhbGxvb25kZWxheXxiYWxsb29uZXZhbHxiYWxsb29uZXhwcnxiZGlyfGJkbGF5fGJldmFsfGJleHxiZXhwcnxiZ3xiaHxiaW58YmluYXJ5fGJpb3NrfGJpb3NrZXl8Ymt8YmtjfGJvbWJ8YnJlYWthdHxicmt8YnJvd3NlZGlyfGJzfGJzZGlyfGJza3xidHxidWZoaWRkZW58YnVmbGlzdGVkfGJ1ZnR5cGV8Y2FzZW1hcHxjY3Z8Y2RwYXRofGNlZGl0fGNmdXxjaHxjaGFyY29udmVydHxjaXxjaW58Y2luZGVudHxjaW5rfGNpbmtleXN8Y2lub3xjaW5vcHRpb25zfGNpbnd8Y2lud29yZHN8Y2xpcGJvYXJkfGNtZGhlaWdodHxjbWR3aW5oZWlnaHR8Y21wfGNtc3xjb2x1bW5zfGNvbXxjb21tZW50c3xjb21tZW50c3RyaW5nfGNvbXBhdGlibGV8Y29tcGxldGV8Y29tcGxldGVmdW5jfGNvbXBsZXRlb3B0fGNvbnNrfGNvbnNrZXl8Y29weWluZGVudHxjb3R8Y3BvfGNwb3B0aW9uc3xjcHR8Y3Njb3BlcGF0aGNvbXB8Y3Njb3BlcHJnfGNzY29wZXF1aWNrZml4fGNzY29wZXRhZ3xjc2NvcGV0YWdvcmRlcnxjc2NvcGV2ZXJib3NlfGNzcGN8Y3Nwcmd8Y3NxZnxjc3R8Y3N0b3xjc3ZlcmJ8Y3VjfGN1bHxjdXJzb3Jjb2x1bW58Y3Vyc29ybGluZXxjd2h8ZGVidWd8ZGVjb3xkZWZ8ZGVmaW5lfGRlbGNvbWJpbmV8ZGV4fGRnfGRpY3R8ZGljdGlvbmFyeXxkaWZmfGRpZmZleHByfGRpZmZvcHR8ZGlncmFwaHxkaXB8ZGlyfGRpcmVjdG9yeXxkeXxlYXxlYWR8ZWFkaXJlY3Rpb258ZWJ8ZWR8ZWRjb21wYXRpYmxlfGVmfGVmbXxlaXxla3xlbmN8ZW5jb2Rpbmd8ZW5kb2ZsaW5lfGVvbHxlcHxlcXVhbGFsd2F5c3xlcXVhbHByZ3xlcnJvcmJlbGxzfGVycm9yZmlsZXxlcnJvcmZvcm1hdHxlc2NrZXlzfGV0fGV2ZW50aWdub3JlfGV4cGFuZHRhYnxleHJjfGZjbHxmY3N8ZmRjfGZkZXxmZGl8ZmRsfGZkbHN8ZmRtfGZkbnxmZG98ZmR0fGZlbnxmZW5jfGZlbmNzfGZleHxmZnxmZnN8ZmlsZWVuY29kaW5nfGZpbGVlbmNvZGluZ3N8ZmlsZWZvcm1hdHxmaWxlZm9ybWF0c3xmaWxsY2hhcnN8Zmt8ZmttYXB8ZmxwfGZtbHxmbXJ8Zm9sZGNvbHVtbnxmb2xkZW5hYmxlfGZvbGRleHByfGZvbGRpZ25vcmV8Zm9sZGxldmVsfGZvbGRsZXZlbHN0YXJ0fGZvbGRtYXJrZXJ8Zm9sZG1ldGhvZHxmb2xkbWlubGluZXN8Zm9sZG5lc3RtYXh8Zm9sZHRleHR8Zm9ybWF0ZXhwcnxmb3JtYXRsaXN0cGF0fGZvcm1hdG9wdGlvbnN8Zm9ybWF0cHJnfGZwfGZzfGZzeW5jfGZ0fGdjcnxnZHxnZGVmYXVsdHxnZm18Z2ZufGdmc3xnZnd8Z2hyfGdwfGdyZXBmb3JtYXR8Z3JlcHByZ3xndGx8Z3R0fGd1aWN1cnNvcnxndWlmb250fGd1aWZvbnRzZXR8Z3VpZm9udHdpZGV8Z3VpaGVhZHJvb218Z3Vpb3B0aW9uc3xndWlwdHl8Z3VpdGFibGFiZWx8Z3VpdGFidG9vbHRpcHxoZWxwZmlsZXxoZWxwaGVpZ2h0fGhlbHBsYW5nfGhmfGhofGhpfGhpZGRlbnxoaWdobGlnaHR8aGt8aGttYXB8aGttYXBwfGhrcHxobHxobGd8aGxzfGhsc2VhcmNofGljfGljb258aWNvbnN0cmluZ3xpZ25vcmVjYXNlfGltfGltYWN0aXZhdGVrZXl8aW1ha3xpbWN8aW1jbWRsaW5lfGltZHxpbWRpc2FibGV8aW1pfGltaW5zZXJ0fGltc3xpbXNlYXJjaHxpbmN8aW5jbHVkZXxpbmNsdWRlZXhwcnxpbmNzZWFyY2h8aW5kZXxpbmRlbnRleHByfGluZGVudGtleXN8aW5ka3xpbmV4fGluZnxpbmZlcmNhc2V8aW5zZXJ0bW9kZXxpbnZhY2R8aW52YWl8aW52YWttfGludmFsbG93cmV2aW5zfGludmFsdGtleW1hcHxpbnZhbnRpfGludmFudGlhbGlhc3xpbnZhcnxpbnZhcmFifGludmFyYWJpY3xpbnZhcmFiaWNzaGFwZXxpbnZhcml8aW52YXJzaGFwZXxpbnZhdXRvY2hkaXJ8aW52YXV0b2luZGVudHxpbnZhdXRvcmVhZHxpbnZhdXRvd3JpdGV8aW52YXV0b3dyaXRlYWxsfGludmF3fGludmF3YXxpbnZiYWNrdXB8aW52YmFsbG9vbmV2YWx8aW52YmV2YWx8aW52YmlufGludmJpbmFyeXxpbnZiaW9za3xpbnZiaW9za2V5fGludmJrfGludmJsfGludmJvbWJ8aW52YnVmbGlzdGVkfGludmNmfGludmNpfGludmNpbnxpbnZjaW5kZW50fGludmNvbXBhdGlibGV8aW52Y29uZmlybXxpbnZjb25za3xpbnZjb25za2V5fGludmNvcHlpbmRlbnR8aW52Y3B8aW52Y3Njb3BldGFnfGludmNzY29wZXZlcmJvc2V8aW52Y3N0fGludmNzdmVyYnxpbnZjdWN8aW52Y3VsfGludmN1cnNvcmNvbHVtbnxpbnZjdXJzb3JsaW5lfGludmRlY298aW52ZGVsY29tYmluZXxpbnZkZ3xpbnZkaWZmfGludmRpZ3JhcGh8aW52ZGlzYWJsZXxpbnZlYXxpbnZlYnxpbnZlZHxpbnZlZGNvbXBhdGlibGV8aW52ZWt8aW52ZW5kb2ZsaW5lfGludmVvbHxpbnZlcXVhbGFsd2F5c3xpbnZlcnJvcmJlbGxzfGludmVzY2tleXN8aW52ZXR8aW52ZXh8aW52ZXhwYW5kdGFifGludmV4cmN8aW52ZmVufGludmZrfGludmZrbWFwfGludmZvbGRlbmFibGV8aW52Z2R8aW52Z2RlZmF1bHR8aW52Z3VpcHR5fGludmhpZHxpbnZoaWRkZW58aW52aGt8aW52aGttYXB8aW52aGttYXBwfGludmhrcHxpbnZobHN8aW52aGxzZWFyY2h8aW52aWN8aW52aWNvbnxpbnZpZ25vcmVjYXNlfGludmltfGludmltY3xpbnZpbWNtZGxpbmV8aW52aW1kfGludmluY3NlYXJjaHxpbnZpbmZ8aW52aW5mZXJjYXNlfGludmluc2VydG1vZGV8aW52aXN8aW52am9pbnNwYWNlc3xpbnZqc3xpbnZsYXp5cmVkcmF3fGludmxicnxpbnZsaW5lYnJlYWt8aW52bGlzcHxpbnZsaXN0fGludmxvYWRwbHVnaW5zfGludmxwbHxpbnZsenxpbnZtYXxpbnZtYWNhdHN1aXxpbnZtYWdpY3xpbnZtaHxpbnZtbHxpbnZtb2R8aW52bW9kZWxpbmV8aW52bW9kaWZpYWJsZXxpbnZtb2RpZmllZHxpbnZtb3JlfGludm1vdXNlZnxpbnZtb3VzZWZvY3VzfGludm1vdXNlaGlkZXxpbnZudXxpbnZudW1iZXJ8aW52b2RldnxpbnZvcGVuZGV2aWNlfGludnBhc3RlfGludnBpfGludnByZXNlcnZlaW5kZW50fGludnByZXZpZXd3aW5kb3d8aW52cHJvbXB0fGludnB2d3xpbnZyZWFkb25seXxpbnZyZW1hcHxpbnZyZXN0b3Jlc2NyZWVufGludnJldmluc3xpbnZyaXxpbnZyaWdodGxlZnR8aW52cmlnaHRsZWZ0Y21kfGludnJsfGludnJsY3xpbnZyb3xpbnZyc3xpbnZydXxpbnZydWxlcnxpbnZzYnxpbnZzY3xpbnZzY2J8aW52c2Nyb2xsYmluZHxpbnZzY3N8aW52c2VjdXJlfGludnNmdHxpbnZzaGVsbHNsYXNofGludnNoZWxsdGVtcHxpbnZzaGlmdHJvdW5kfGludnNob3J0bmFtZXxpbnZzaG93Y21kfGludnNob3dmdWxsdGFnfGludnNob3dtYXRjaHxpbnZzaG93bW9kZXxpbnZzaXxpbnZzbXxpbnZzbWFydGNhc2V8aW52c21hcnRpbmRlbnR8aW52c21hcnR0YWJ8aW52c21kfGludnNufGludnNvbHxpbnZzcGVsbHxpbnZzcGxpdGJlbG93fGludnNwbGl0cmlnaHR8aW52c3ByfGludnNyfGludnNzbHxpbnZzdGF8aW52c3RhcnRvZmxpbmV8aW52c3RtcHxpbnZzd2FwZmlsZXxpbnZzd2Z8aW52dGF8aW52dGFnYnNlYXJjaHxpbnZ0YWdyZWxhdGl2ZXxpbnZ0YWdzdGFja3xpbnZ0Yml8aW52dGJpZGl8aW52dGJzfGludnRlcm1iaWRpfGludnRlcnNlfGludnRleHRhdXRvfGludnRleHRtb2RlfGludnRmfGludnRnc3R8aW52dGlsZGVvcHxpbnZ0aW1lb3V0fGludnRpdGxlfGludnRvfGludnRvcHxpbnZ0cnxpbnZ0dGltZW91dHxpbnZ0dHlidWlsdGlufGludnR0eWZhc3R8aW52dHh8aW52dmJ8aW52dmlzdWFsYmVsbHxpbnZ3YXxpbnZ3YXJufGludndifGludndlaXJkaW52ZXJ0fGludndmaHxpbnZ3Znd8aW52d2lsZG1lbnV8aW52d2luZml4aGVpZ2h0fGludndpbmZpeHdpZHRofGludndpdnxpbnZ3bW51fGludndyYXB8aW52d3JhcHNjYW58aW52d3JpdGV8aW52d3JpdGVhbnl8aW52d3JpdGViYWNrdXB8aW52d3N8aXNmfGlzZm5hbWV8aXNpfGlzaWRlbnR8aXNrfGlza2V5d29yZHxpc3ByaW50fGpvaW5zcGFjZXN8anN8a2V5fGtleW1hcHxrZXltb2RlbHxrZXl3b3JkcHJnfGttfGttcHxrcHxsYW5nbWFwfGxhbmdtZW51fGxhc3RzdGF0dXN8bGF6eXJlZHJhd3xsYnJ8bGNzfGxpbmVicmVha3xsaW5lc3xsaW5lc3BhY2V8bGlzcHxsaXNwd29yZHN8bGlzdGNoYXJzfGxvYWRwbHVnaW5zfGxwbHxsc3B8bHp8bWFjYXRzdWl8bWFnaWN8bWFrZWVmfG1ha2Vwcmd8bWF0Y2hwYWlyc3xtYXRjaHRpbWV8bWF4Y29tYmluZXxtYXhmdW5jZGVwdGh8bWF4bWFwZGVwdGh8bWF4bWVtfG1heG1lbXBhdHRlcm58bWF4bWVtdG90fG1jb3xtZWZ8bWVudWl0ZW1zfG1mZHxtaHxtaXN8bWtzcGVsbG1lbXxtbHxtbHN8bW18bW1kfG1tcHxtbXR8bW9kZWxpbmV8bW9kZWxpbmVzfG1vZGlmaWFibGV8bW9kaWZpZWR8bW9yZXxtb3VzZXxtb3VzZWZ8bW91c2Vmb2N1c3xtb3VzZWhpZGV8bW91c2VtfG1vdXNlbW9kZWx8bW91c2VzfG1vdXNlc2hhcGV8bW91c2V0fG1vdXNldGltZXxtcHxtcHN8bXNtfG16cXxtenF1YW50dW18bmZ8bm9hY2R8bm9haXxub2FrbXxub2FsbG93cmV2aW5zfG5vYWx0a2V5bWFwfG5vYW50aXxub2FudGlhbGlhc3xub2FyfG5vYXJhYnxub2FyYWJpY3xub2FyYWJpY3NoYXBlfG5vYXJpfG5vYXJzaGFwZXxub2F1dG9jaGRpcnxub2F1dG9pbmRlbnR8bm9hdXRvcmVhZHxub2F1dG93cml0ZXxub2F1dG93cml0ZWFsbHxub2F3fG5vYXdhfG5vYmFja3VwfG5vYmFsbG9vbmV2YWx8bm9iZXZhbHxub2Jpbnxub2JpbmFyeXxub2Jpb3NrfG5vYmlvc2tleXxub2JrfG5vYmx8bm9ib21ifG5vYnVmbGlzdGVkfG5vY2Z8bm9jaXxub2Npbnxub2NpbmRlbnR8bm9jb21wYXRpYmxlfG5vY29uZmlybXxub2NvbnNrfG5vY29uc2tleXxub2NvcHlpbmRlbnR8bm9jcHxub2NzY29wZXRhZ3xub2NzY29wZXZlcmJvc2V8bm9jc3R8bm9jc3ZlcmJ8bm9jdWN8bm9jdWx8bm9jdXJzb3Jjb2x1bW58bm9jdXJzb3JsaW5lfG5vZGVjb3xub2RlbGNvbWJpbmV8bm9kZ3xub2RpZmZ8bm9kaWdyYXBofG5vZGlzYWJsZXxub2VhfG5vZWJ8bm9lZHxub2VkY29tcGF0aWJsZXxub2VrfG5vZW5kb2ZsaW5lfG5vZW9sfG5vZXF1YWxhbHdheXN8bm9lcnJvcmJlbGxzfG5vZXNja2V5c3xub2V0fG5vZXh8bm9leHBhbmR0YWJ8bm9leHJjfG5vZmVufG5vZmt8bm9ma21hcHxub2ZvbGRlbmFibGV8bm9nZHxub2dkZWZhdWx0fG5vZ3VpcHR5fG5vaGlkfG5vaGlkZGVufG5vaGt8bm9oa21hcHxub2hrbWFwcHxub2hrcHxub2hsc3xub2ljfG5vaWNvbnxub2lnbm9yZWNhc2V8bm9pbXxub2ltY3xub2ltY21kbGluZXxub2ltZHxub2luY3NlYXJjaHxub2luZnxub2luZmVyY2FzZXxub2luc2VydG1vZGV8bm9pc3xub2pvaW5zcGFjZXN8bm9qc3xub2xhenlyZWRyYXd8bm9sYnJ8bm9saW5lYnJlYWt8bm9saXNwfG5vbGlzdHxub2xvYWRwbHVnaW5zfG5vbHBsfG5vbHp8bm9tYXxub21hY2F0c3VpfG5vbWFnaWN8bm9taHxub21sfG5vbW9kfG5vbW9kZWxpbmV8bm9tb2RpZmlhYmxlfG5vbW9kaWZpZWR8bm9tb3JlfG5vbW91c2VmfG5vbW91c2Vmb2N1c3xub21vdXNlaGlkZXxub251fG5vbnVtYmVyfG5vb2Rldnxub29wZW5kZXZpY2V8bm9wYXN0ZXxub3BpfG5vcHJlc2VydmVpbmRlbnR8bm9wcmV2aWV3d2luZG93fG5vcHJvbXB0fG5vcHZ3fG5vcmVhZG9ubHl8bm9yZW1hcHxub3Jlc3RvcmVzY3JlZW58bm9yZXZpbnN8bm9yaXxub3JpZ2h0bGVmdHxub3JpZ2h0bGVmdGNtZHxub3JsfG5vcmxjfG5vcm98bm9yc3xub3J1fG5vcnVsZXJ8bm9zYnxub3NjfG5vc2NifG5vc2Nyb2xsYmluZHxub3Njc3xub3NlY3VyZXxub3NmdHxub3NoZWxsc2xhc2h8bm9zaGVsbHRlbXB8bm9zaGlmdHJvdW5kfG5vc2hvcnRuYW1lfG5vc2hvd2NtZHxub3Nob3dmdWxsdGFnfG5vc2hvd21hdGNofG5vc2hvd21vZGV8bm9zaXxub3NtfG5vc21hcnRjYXNlfG5vc21hcnRpbmRlbnR8bm9zbWFydHRhYnxub3NtZHxub3NufG5vc29sfG5vc3BlbGx8bm9zcGxpdGJlbG93fG5vc3BsaXRyaWdodHxub3Nwcnxub3NyfG5vc3NsfG5vc3RhfG5vc3RhcnRvZmxpbmV8bm9zdG1wfG5vc3dhcGZpbGV8bm9zd2Z8bm90YXxub3RhZ2JzZWFyY2h8bm90YWdyZWxhdGl2ZXxub3RhZ3N0YWNrfG5vdGJpfG5vdGJpZGl8bm90YnN8bm90ZXJtYmlkaXxub3RlcnNlfG5vdGV4dGF1dG98bm90ZXh0bW9kZXxub3RmfG5vdGdzdHxub3RpbGRlb3B8bm90aW1lb3V0fG5vdGl0bGV8bm90b3xub3RvcHxub3RyfG5vdHRpbWVvdXR8bm90dHlidWlsdGlufG5vdHR5ZmFzdHxub3R4fG5vdmJ8bm92aXN1YWxiZWxsfG5vd2F8bm93YXJufG5vd2J8bm93ZWlyZGludmVydHxub3dmaHxub3dmd3xub3dpbGRtZW51fG5vd2luZml4aGVpZ2h0fG5vd2luZml4d2lkdGh8bm93aXZ8bm93bW51fG5vd3JhcHxub3dyYXBzY2FufG5vd3JpdGV8bm93cml0ZWFueXxub3dyaXRlYmFja3VwfG5vd3N8bnJmb3JtYXRzfG51bWJlcndpZHRofG51d3xvZGV2fG9mdHxvZnV8b21uaWZ1bmN8b3BlbmRldmljZXxvcGVyYXRvcmZ1bmN8b3BmdW5jfG9zZmlsZXR5cGV8cGF8cGFyYXxwYXJhZ3JhcGhzfHBhc3RlfHBhc3RldG9nZ2xlfHBhdGNoZXhwcnxwYXRjaG1vZGV8cGF0aHxwZGV2fHBlbmN8cGV4fHBleHByfHBmbnxwaHxwaGVhZGVyfHBpfHBtfHBtYmNzfHBtYmZufHBvcHR8cHJlc2VydmVpbmRlbnR8cHJldmlld2hlaWdodHxwcmV2aWV3d2luZG93fHByaW50ZGV2aWNlfHByaW50ZW5jb2Rpbmd8cHJpbnRleHByfHByaW50Zm9udHxwcmludGhlYWRlcnxwcmludG1iY2hhcnNldHxwcmludG1iZm9udHxwcmludG9wdGlvbnN8cHJvbXB0fHB0fHB1bWhlaWdodHxwdmh8cHZ3fHFlfHF1b3RlZXNjYXBlfHJlYWRvbmx5fHJlbWFwfHJlcG9ydHxyZXN0b3Jlc2NyZWVufHJldmluc3xyaWdodGxlZnR8cmlnaHRsZWZ0Y21kfHJsfHJsY3xyb3xyc3xydHB8cnVmfHJ1bGVyfHJ1bGVyZm9ybWF0fHJ1bnRpbWVwYXRofHNib3xzY3xzY2J8c2NyfHNjcm9sbHxzY3JvbGxiaW5kfHNjcm9sbGp1bXB8c2Nyb2xsb2ZmfHNjcm9sbG9wdHxzY3N8c2VjdHxzZWN0aW9uc3xzZWN1cmV8c2VsfHNlbGVjdGlvbnxzZWxlY3Rtb2RlfHNlc3Npb25vcHRpb25zfHNmdHxzaGNmfHNoZWxsY21kZmxhZ3xzaGVsbHBpcGV8c2hlbGxxdW90ZXxzaGVsbHJlZGlyfHNoZWxsc2xhc2h8c2hlbGx0ZW1wfHNoZWxsdHlwZXxzaGVsbHhxdW90ZXxzaGlmdHJvdW5kfHNoaWZ0d2lkdGh8c2htfHNob3J0bWVzc3xzaG9ydG5hbWV8c2hvd2JyZWFrfHNob3djbWR8c2hvd2Z1bGx0YWd8c2hvd21hdGNofHNob3dtb2RlfHNob3d0YWJsaW5lfHNocXxzaXxzaWRlc2Nyb2xsfHNpZGVzY3JvbGxvZmZ8c2lzb3xzanxzbG18c21hcnRjYXNlfHNtYXJ0aW5kZW50fHNtYXJ0dGFifHNtY3xzbWR8c29mdHRhYnN0b3B8c29sfHNwY3xzcGVsbHxzcGVsbGNhcGNoZWNrfHNwZWxsZmlsZXxzcGVsbGxhbmd8c3BlbGxzdWdnZXN0fHNwZnxzcGx8c3BsaXRiZWxvd3xzcGxpdHJpZ2h0fHNwc3xzcnxzcnJ8c3N8c3NsfHNzb3B8c3RhbHxzdGFydG9mbGluZXxzdGF0dXNsaW5lfHN0bHxzdG1wfHN1fHN1YXxzdWZmaXhlc3xzdWZmaXhlc2FkZHxzd3xzd2FwZmlsZXxzd2Fwc3luY3xzd2J8c3dmfHN3aXRjaGJ1Znxzd3N8c3hxfHN5bnxzeW5tYXhjb2x8c3ludGF4fHRfQUJ8dF9BRnx0X0FMfHRfQ1N8dF9DVnx0X0NlfHRfQ298dF9Dc3x0X0RMfHRfRUl8dF9GMXx0X0YyfHRfRjN8dF9GNHx0X0Y1fHRfRjZ8dF9GN3x0X0Y4fHRfRjl8dF9JRXx0X0lTfHRfSzF8dF9LM3x0X0s0fHRfSzV8dF9LNnx0X0s3fHRfSzh8dF9LOXx0X0tBfHRfS0J8dF9LQ3x0X0tEfHRfS0V8dF9LRnx0X0tHfHRfS0h8dF9LSXx0X0tKfHRfS0t8dF9LTHx0X1JJfHRfUlZ8dF9TSXx0X1NifHRfU2Z8dF9XUHx0X1dTfHRfWkh8dF9aUnx0X2FsfHRfYmN8dF9jZHx0X2NlfHRfY2x8dF9jbXx0X2NzfHRfZGF8dF9kYnx0X2RsfHRfZnN8dF9rMXx0X2syfHRfazN8dF9rNHx0X2s1fHRfazZ8dF9rN3x0X2s4fHRfazl8dF9rQnx0X2tEfHRfa0l8dF9rTnx0X2tQfHRfa2J8dF9rZHx0X2tlfHRfa2h8dF9rbHx0X2tyfHRfa3N8dF9rdXx0X2xlfHRfbWJ8dF9tZHx0X21lfHRfbXJ8dF9tc3x0X25kfHRfb3B8dF9zZXx0X3NvfHRfc3J8dF90ZXx0X3RpfHRfdHN8dF91ZXx0X3VzfHRfdXR8dF92Ynx0X3ZlfHRfdml8dF92c3x0X3hzfHRhYmxpbmV8dGFicGFnZW1heHx0YWJzdG9wfHRhZ2JzZWFyY2h8dGFnbGVuZ3RofHRhZ3JlbGF0aXZlfHRhZ3N0YWNrfHRhbHx0Ynx0Yml8dGJpZGl8dGJpc3x0YnN8dGVuY3x0ZXJtfHRlcm1iaWRpfHRlcm1lbmNvZGluZ3x0ZXJzZXx0ZXh0YXV0b3x0ZXh0bW9kZXx0ZXh0d2lkdGh8dGdzdHx0aGVzYXVydXN8dGlsZGVvcHx0aW1lb3V0fHRpbWVvdXRsZW58dGl0bGV8dGl0bGVsZW58dGl0bGVvbGR8dGl0bGVzdHJpbmd8dG9vbGJhcnx0b29sYmFyaWNvbnNpemV8dG9wfHRwbXx0c2x8dHNyfHR0aW1lb3V0fHR0aW1lb3V0bGVufHR0bXx0dHl8dHR5YnVpbHRpbnx0dHlmYXN0fHR0eW18dHR5bW91c2V8dHR5c2Nyb2xsfHR0eXR5cGV8dHd8dHh8dWN8dWx8dW5kb2xldmVsc3x1cGRhdGVjb3VudHx1cGRhdGV0aW1lfHV0fHZifHZic3x2ZGlyfHZlcmJvc2VmaWxlfHZmaWxlfHZpZXdkaXJ8dmlld29wdGlvbnN8dmltaW5mb3x2aXJ0dWFsZWRpdHx2aXN1YWxiZWxsfHZvcHx3YWt8d2Fybnx3Ynx3Y3x3Y218d2R8d2VpcmRpbnZlcnR8d2ZofHdmd3x3aGljaHdyYXB8d2l8d2lnfHdpbGRjaGFyfHdpbGRjaGFybXx3aWxkaWdub3JlfHdpbGRtZW51fHdpbGRtb2RlfHdpbGRvcHRpb25zfHdpbXx3aW5hbHRrZXlzfHdpbmRvd3x3aW5maXhoZWlnaHR8d2luZml4d2lkdGh8d2luaGVpZ2h0fHdpbm1pbmhlaWdodHx3aW5taW53aWR0aHx3aW53aWR0aHx3aXZ8d2l3fHdtfHdtaHx3bW51fHdtd3x3b3B8d3JhcHx3cmFwbWFyZ2lufHdyYXBzY2FufHdyaXRlYW55fHdyaXRlYmFja3VwfHdyaXRlZGVsYXl8d3cpXFxiLyxcblx0J251bWJlcic6IC9cXGIoPzoweFtcXGRhLWZdK3xcXGQrKD86XFwuXFxkKyk/KVxcYi9pLFxuXHQnb3BlcmF0b3InOiAvXFx8XFx8fCYmfFstKy5dPT98Wz0hXSg/Ols9fl1bIz9dPyk/fFs8Pl09P1sjP10/fFsqXFwvJT9dfFxcYig/OmlzKD86bm90KT8pXFxiLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF0oKSw7Ol0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXNbJ3Zpc3VhbC1iYXNpYyddID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKD86WydcdTIwMThcdTIwMTldfFJFTVxcYikoPzpbXlxcclxcbl9dfF8oPzpcXHJcXG4/fFxcbik/KSovaSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdrZXl3b3JkJzogL15SRU0vaVxuXHRcdH1cblx0fSxcblx0J2RpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvIyg/OkNvbnN0fEVsc2V8RWxzZUlmfEVuZHxFeHRlcm5hbENoZWNrc3VtfEV4dGVybmFsU291cmNlfElmfFJlZ2lvbikoPzpcXGJfWyBcXHRdKig/Olxcclxcbj98XFxuKXwuKSsvaSxcblx0XHRhbGlhczogJ3Byb3BlcnR5Jyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXFwkP1tcIlx1MjAxQ1x1MjAxRF0oPzpbXCJcdTIwMUNcdTIwMURdezJ9fFteXCJcdTIwMUNcdTIwMURdKSpbXCJcdTIwMUNcdTIwMURdQz8vaSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2RhdGUnOiB7XG5cdFx0cGF0dGVybjogLyNbIFxcdF0qKD86XFxkKyhbLy1dKVxcZCtcXDFcXGQrKD86WyBcXHRdKyg/OlxcZCtbIFxcdF0qKD86QU18UE0pfFxcZCs6XFxkKyg/OjpcXGQrKT8oPzpbIFxcdF0qKD86QU18UE0pKT8pKT98XFxkK1sgXFx0XSooPzpBTXxQTSl8XFxkKzpcXGQrKD86OlxcZCspPyg/OlsgXFx0XSooPzpBTXxQTSkpPylbIFxcdF0qIy9pLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQnbnVtYmVyJzogLyg/Oig/OlxcYlxcZCsoPzpcXC5cXGQrKT98XFwuXFxkKykoPzpFWystXT9cXGQrKT98JltIT11bXFxkQS1GXSspKD86W0ZSRF18VT9bSUxTXSk/L2ksXG5cdCdib29sZWFuJzogL1xcYig/OkZhbHNlfE5vdGhpbmd8VHJ1ZSlcXGIvaSxcblx0J2tleXdvcmQnOiAvXFxiKD86QWRkSGFuZGxlcnxBZGRyZXNzT2Z8QWxpYXN8QW5kKD86QWxzbyk/fEFzfEJvb2xlYW58QnlSZWZ8Qnl0ZXxCeVZhbHxDYWxsfENhc2V8Q2F0Y2h8Qyg/OkJvb2x8Qnl0ZXxDaGFyfERhdGV8RGJsfERlY3xJbnR8TG5nfE9ianxTQnl0ZXxTaG9ydHxTbmd8U3RyfFR5cGV8VUludHxVTG5nfFVTaG9ydCl8Q2hhcnxDbGFzc3xDb25zdHxDb250aW51ZXxDdXJyZW5jeXxEYXRlfERlY2ltYWx8RGVjbGFyZXxEZWZhdWx0fERlbGVnYXRlfERpbXxEaXJlY3RDYXN0fERvfERvdWJsZXxFYWNofEVsc2UoPzpJZik/fEVuZCg/OklmKT98RW51bXxFcmFzZXxFcnJvcnxFdmVudHxFeGl0fEZpbmFsbHl8Rm9yfEZyaWVuZHxGdW5jdGlvbnxHZXQoPzpUeXBlfFhNTE5hbWVzcGFjZSk/fEdsb2JhbHxHb1N1YnxHb1RvfEhhbmRsZXN8SWZ8SW1wbGVtZW50c3xJbXBvcnRzfElufEluaGVyaXRzfEludGVnZXJ8SW50ZXJmYWNlfElzfElzTm90fExldHxMaWJ8TGlrZXxMb25nfExvb3B8TWV8TW9kfE1vZHVsZXxNdXN0KD86SW5oZXJpdHxPdmVycmlkZSl8TXkoPzpCYXNlfENsYXNzKXxOYW1lc3BhY2V8TmFycm93aW5nfE5ld3xOZXh0fE5vdCg/OkluaGVyaXRhYmxlfE92ZXJyaWRhYmxlKT98T2JqZWN0fE9mfE9ufE9wZXJhdG9yfE9wdGlvbig/OmFsKT98T3IoPzpFbHNlKT98T3V0fE92ZXJsb2Fkc3xPdmVycmlkYWJsZXxPdmVycmlkZXN8UGFyYW1BcnJheXxQYXJ0aWFsfFByaXZhdGV8UHJvcGVydHl8UHJvdGVjdGVkfFB1YmxpY3xSYWlzZUV2ZW50fFJlYWRPbmx5fFJlRGltfFJlbW92ZUhhbmRsZXJ8UmVzdW1lfFJldHVybnxTQnl0ZXxTZWxlY3R8U2V0fFNoYWRvd3N8U2hhcmVkfHNob3J0fFNpbmdsZXxTdGF0aWN8U3RlcHxTdG9wfFN0cmluZ3xTdHJ1Y3R1cmV8U3VifFN5bmNMb2NrfFRoZW58VGhyb3d8VG98VHJ5fFRyeUNhc3R8VHlwZXxUeXBlT2Z8VSg/OkludGVnZXJ8TG9uZ3xTaG9ydCl8VW50aWx8VXNpbmd8VmFyaWFudHxXZW5kfFdoZW58V2hpbGV8V2lkZW5pbmd8V2l0aCg/OkV2ZW50cyk/fFdyaXRlT25seXxYb3IpXFxiL2ksXG5cdCdvcGVyYXRvcic6IC9bK1xcLSovXFxcXF48PT4mI0AkJSFdfFxcYl8oPz1bIFxcdF0qW1xcclxcbl0pLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fSgpLiw6P10vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMudmIgPSBQcmlzbS5sYW5ndWFnZXNbJ3Zpc3VhbC1iYXNpYyddO1xuUHJpc20ubGFuZ3VhZ2VzLnZiYSA9IFByaXNtLmxhbmd1YWdlc1sndmlzdWFsLWJhc2ljJ107XG5cblByaXNtLmxhbmd1YWdlcy53YXJwc2NyaXB0ID0ge1xuXHQnY29tbWVudCc6IC8jLip8XFwvXFwvLip8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cIlxcXFxcXHJcXG5dfFxcXFwuKSpcInwnKD86W14nXFxcXFxcclxcbl18XFxcXC4pKid8PCcoPzpbXlxcXFwnXXwnKD8hPil8XFxcXC4pKic+Lyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3ZhcmlhYmxlJzogL1xcJFxcUysvLFxuXHQnbWFjcm8nOiB7XG5cdFx0cGF0dGVybjogL0BcXFMrLyxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXHQvLyBXYXJwU2NyaXB0IGRvZXNuJ3QgaGF2ZSBhbnkga2V5d29yZHMsIHRoZXNlIGFyZSBhbGwgZnVuY3Rpb25zIHVuZGVyIHRoZSBjb250cm9sIGNhdGVnb3J5XG5cdC8vIGh0dHBzOi8vd3d3LndhcnAxMC5pby90YWdzL2NvbnRyb2xcblx0J2tleXdvcmQnOiAvXFxiKD86QlJFQUt8Q0hFQ0tNQUNST3xDT05USU5VRXxDVURGfERFRklORUR8REVGSU5FRE1BQ1JPfEVWQUx8RkFJTHxGT1J8Rk9SRUFDSHxGT1JTVEVQfElGVHxJRlRFfE1TR0ZBSUx8TlJFVFVSTnxSRVRIUk9XfFJFVFVSTnxTV0lUQ0h8VFJZfFVERnxVTlRJTHxXSElMRSlcXGIvLFxuXHQnbnVtYmVyJzogL1srLV0/XFxiKD86TmFOfEluZmluaXR5fFxcZCsoPzpcXC5cXGQqKT8oPzpbRWVdWystXT9cXGQrKT98MHhbXFxkYS1mQS1GXSt8MGJbMDFdKylcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpGfFR8ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvPCV8JT58W3t9W1xcXSgpXS8sXG5cdC8vIFNvbWUgb3BlcmF0b3JzIGZyb20gdGhlIFwib3BlcmF0b3JzXCIgY2F0ZWdvcnlcblx0Ly8gaHR0cHM6Ly93d3cud2FycDEwLmlvL3RhZ3Mvb3BlcmF0b3JzXG5cdCdvcGVyYXRvcic6IC89PXwmJj98XFx8XFx8P3xcXCpcXCo/fD4+Pj98PDx8Wzw+IX5dPT98Wy0vJV5dfFxcKyE/fFxcYig/OkFORHxOT1R8T1IpXFxiL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLndhc20gPSB7XG5cdCdjb21tZW50JzogW1xuXHRcdC9cXCg7W1xcc1xcU10qPztcXCkvLFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC87Oy4qLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcW1xcc1xcU118W15cIlxcXFxdKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzphbGlnbnxvZmZzZXQpPS8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J29wZXJhdG9yJzogLz0vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86KD86ZjMyfGY2NHxpMzJ8aTY0KSg/OlxcLig/OmFic3xhZGR8YW5kfGNlaWx8Y2x6fGNvbnN0fGNvbnZlcnRfW3N1XVxcL2koPzozMnw2NCl8Y29weXNpZ258Y3R6fGRlbW90ZVxcL2Y2NHxkaXYoPzpfW3N1XSk/fGVxej98ZXh0ZW5kX1tzdV1cXC9pMzJ8Zmxvb3J8Z2UoPzpfW3N1XSk/fGd0KD86X1tzdV0pP3xsZSg/Ol9bc3VdKT98bG9hZCg/Oig/Ojh8MTZ8MzIpX1tzdV0pP3xsdCg/Ol9bc3VdKT98bWF4fG1pbnxtdWx8bmVnP3xuZWFyZXN0fG9yfHBvcGNudHxwcm9tb3RlXFwvZjMyfHJlaW50ZXJwcmV0XFwvW2ZpXSg/OjMyfDY0KXxyZW1fW3N1XXxyb3RbbHJdfHNobHxzaHJfW3N1XXxzcXJ0fHN0b3JlKD86OHwxNnwzMik/fHN1Ynx0cnVuYyg/Ol9bc3VdXFwvZig/OjMyfDY0KSk/fHdyYXBcXC9pNjR8eG9yKSk/fG1lbW9yeVxcLig/Omdyb3d8c2l6ZSkpXFxiLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0L1xcYig/OmFueWZ1bmN8YmxvY2t8YnIoPzpfaWZ8X3RhYmxlKT98Y2FsbCg/Ol9pbmRpcmVjdCk/fGRhdGF8ZHJvcHxlbGVtfGVsc2V8ZW5kfGV4cG9ydHxmdW5jfGdldF8oPzpnbG9iYWx8bG9jYWwpfGdsb2JhbHxpZnxpbXBvcnR8bG9jYWx8bG9vcHxtZW1vcnl8bW9kdWxlfG11dHxub3B8b2Zmc2V0fHBhcmFtfHJlc3VsdHxyZXR1cm58c2VsZWN0fHNldF8oPzpnbG9iYWx8bG9jYWwpfHN0YXJ0fHRhYmxlfHRlZV9sb2NhbHx0aGVufHR5cGV8dW5yZWFjaGFibGUpXFxiL1xuXHRdLFxuXHQndmFyaWFibGUnOiAvXFwkW1xcdyEjJCUmJyorXFwtLi86PD0+P0BcXFxcXmB8fl0rLyxcblx0J251bWJlcic6IC9bKy1dP1xcYig/OlxcZCg/Ol8/XFxkKSooPzpcXC5cXGQoPzpfP1xcZCkqKT8oPzpbZUVdWystXT9cXGQoPzpfP1xcZCkqKT98MHhbXFxkYS1mQS1GXSg/Ol8/W1xcZGEtZkEtRl0pKig/OlxcLltcXGRhLWZBLUZdKD86Xz9bXFxkYS1mQS1EXSkqKT8oPzpbcFBdWystXT9cXGQoPzpfP1xcZCkqKT8pXFxifFxcYmluZlxcYnxcXGJuYW4oPzo6MHhbXFxkYS1mQS1GXSg/Ol8/W1xcZGEtZkEtRF0pKik/XFxiLyxcblx0J3B1bmN0dWF0aW9uJzogL1soKV0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGlkID0gLyg/OlxcQi18XFxiX3xcXGIpW0EtWmEtel1bXFx3LV0qKD8hW1xcdy1dKS8uc291cmNlO1xuXHR2YXIgdHlwZSA9XG5cdFx0Jyg/OicgK1xuXHRcdC9cXGIoPzp1bnNpZ25lZFxccyspP2xvbmdcXHMrbG9uZyg/IVtcXHctXSkvLnNvdXJjZSArXG5cdFx0J3wnICtcblx0XHQvXFxiKD86dW5yZXN0cmljdGVkfHVuc2lnbmVkKVxccytbYS16XSsoPyFbXFx3LV0pLy5zb3VyY2UgK1xuXHRcdCd8JyArXG5cdFx0Lyg/ISg/OnVucmVzdHJpY3RlZHx1bnNpZ25lZClcXGIpLy5zb3VyY2UgKyBpZCArIC8oPzpcXHMqPCg/OltePD5dfDxbXjw+XSo+KSo+KT8vLnNvdXJjZSArXG5cdFx0JyknICsgLyg/OlxccypcXD8pPy8uc291cmNlO1xuXG5cdHZhciB0eXBlSW5zaWRlID0ge307XG5cblx0UHJpc20ubGFuZ3VhZ2VzWyd3ZWItaWRsJ10gPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCJbXlwiXSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXG5cdFx0J25hbWVzcGFjZSc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKFxcYm5hbWVzcGFjZVxccyspLy5zb3VyY2UgKyBpZCksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdH0sXG5cdFx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdy1dKSg/Oml0ZXJhYmxlfG1hcGxpa2V8c2V0bGlrZSlcXHMqPCg/OltePD5dfDxbXjw+XSo+KSo+Lyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhcXGIoPzphdHRyaWJ1dGV8Y29uc3R8ZGVsZXRlcnxnZXR0ZXJ8b3B0aW9uYWx8c2V0dGVyKVxccyspLy5zb3VyY2UgKyB0eXBlKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBjYWxsYmFjayByZXR1cm4gdHlwZVxuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJygnICsgL1xcYmNhbGxiYWNrXFxzKy8uc291cmNlICsgaWQgKyAvXFxzKj1cXHMqLy5zb3VyY2UgKyAnKScgKyB0eXBlKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyB0eXBlZGVmXG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKFxcYnR5cGVkZWZcXGJcXHMqKS8uc291cmNlICsgdHlwZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdFx0fSxcblxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhcXGIoPzpjYWxsYmFja3xkaWN0aW9uYXJ5fGVudW18aW50ZXJmYWNlKD86XFxzK21peGluKT8pXFxzKykoPyEoPzppbnRlcmZhY2V8bWl4aW4pXFxiKS8uc291cmNlICsgaWQpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gaW5oZXJpdGFuY2Vcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oOlxccyopLy5zb3VyY2UgKyBpZCksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBpbmNsdWRlcyBhbmQgaW1wbGVtZW50c1xuXHRcdFx0UmVnRXhwKGlkICsgLyg/PVxccysoPzppbXBsZW1lbnRzfGluY2x1ZGVzKVxcYikvLnNvdXJjZSksXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKFxcYig/OmltcGxlbWVudHN8aW5jbHVkZXMpXFxzKykvLnNvdXJjZSArIGlkKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdH0sXG5cblx0XHRcdHtcblx0XHRcdFx0Ly8gZnVuY3Rpb24gcmV0dXJuIHR5cGUsIHBhcmFtZXRlciB0eXBlcywgYW5kIGRpY3Rpb25hcnkgbWVtYmVyc1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAodHlwZSArICcoPz0nICsgL1xccyooPzpcXC57M31cXHMqKT8vLnNvdXJjZSArIGlkICsgL1xccypbKCksOz1dLy5zb3VyY2UgKyAnKScpLFxuXHRcdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHRcdH0sXG5cdFx0XSxcblxuXHRcdCdidWlsdGluJzogL1xcYig/OkFycmF5QnVmZmVyfEJpZ0ludDY0QXJyYXl8QmlnVWludDY0QXJyYXl8Qnl0ZVN0cmluZ3xET01TdHJpbmd8RGF0YVZpZXd8RmxvYXQzMkFycmF5fEZsb2F0NjRBcnJheXxGcm96ZW5BcnJheXxJbnQxNkFycmF5fEludDMyQXJyYXl8SW50OEFycmF5fE9ic2VydmFibGVBcnJheXxQcm9taXNlfFVTVlN0cmluZ3xVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5KVxcYi8sXG5cdFx0J2tleXdvcmQnOiBbXG5cdFx0XHQvXFxiKD86YXN5bmN8YXR0cmlidXRlfGNhbGxiYWNrfGNvbnN0fGNvbnN0cnVjdG9yfGRlbGV0ZXJ8ZGljdGlvbmFyeXxlbnVtfGdldHRlcnxpbXBsZW1lbnRzfGluY2x1ZGVzfGluaGVyaXR8aW50ZXJmYWNlfG1peGlufG5hbWVzcGFjZXxudWxsfG9wdGlvbmFsfG9yfHBhcnRpYWx8cmVhZG9ubHl8cmVxdWlyZWR8c2V0dGVyfHN0YXRpY3xzdHJpbmdpZmllcnx0eXBlZGVmfHVucmVzdHJpY3RlZClcXGIvLFxuXHRcdFx0Ly8gdHlwZSBrZXl3b3Jkc1xuXHRcdFx0L1xcYig/OmFueXxiaWdpbnR8Ym9vbGVhbnxieXRlfGRvdWJsZXxmbG9hdHxpdGVyYWJsZXxsb25nfG1hcGxpa2V8b2JqZWN0fG9jdGV0fHJlY29yZHxzZXF1ZW5jZXxzZXRsaWtlfHNob3J0fHN5bWJvbHx1bmRlZmluZWR8dW5zaWduZWR8dm9pZClcXGIvXG5cdFx0XSxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cblx0XHQnbnVtYmVyJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3LV0pLT8oPzoweFswLTlhLWZdK3woPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/fE5hTnxJbmZpbml0eSkoPyFbXFx3LV0pL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnb3BlcmF0b3InOiAvXFwuezN9fFs9Oj88Pi1dLyxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpe31bXFxdLiw7XS9cblx0fTtcblxuXHRmb3IgKHZhciBrZXkgaW4gUHJpc20ubGFuZ3VhZ2VzWyd3ZWItaWRsJ10pIHtcblx0XHRpZiAoa2V5ICE9PSAnY2xhc3MtbmFtZScpIHtcblx0XHRcdHR5cGVJbnNpZGVba2V5XSA9IFByaXNtLmxhbmd1YWdlc1snd2ViLWlkbCddW2tleV07XG5cdFx0fVxuXHR9XG5cblx0UHJpc20ubGFuZ3VhZ2VzWyd3ZWJpZGwnXSA9IFByaXNtLmxhbmd1YWdlc1snd2ViLWlkbCddO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy53Z3NsID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHR9LFxuXHQnYnVpbHRpbi1hdHRyaWJ1dGUnOiB7XG5cdFx0cGF0dGVybjogLyhAKWJ1aWx0aW5cXCguKj9cXCkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnYXR0cmlidXRlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXmJ1aWx0aW4vLFxuXHRcdFx0XHRhbGlhczogJ2F0dHItbmFtZScsXG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1soKSxdLyxcblx0XHRcdCdidWlsdC1pbi12YWx1ZXMnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXGIoPzpmcmFnX2RlcHRofGZyb250X2ZhY2luZ3xnbG9iYWxfaW52b2NhdGlvbl9pZHxpbnN0YW5jZV9pbmRleHxsb2NhbF9pbnZvY2F0aW9uX2lkfGxvY2FsX2ludm9jYXRpb25faW5kZXh8bnVtX3dvcmtncm91cHN8cG9zaXRpb258c2FtcGxlX2luZGV4fHNhbXBsZV9tYXNrfHZlcnRleF9pbmRleHx3b3JrZ3JvdXBfaWQpXFxiLyxcblx0XHRcdFx0YWxpYXM6ICdhdHRyLXZhbHVlJyxcblx0XHRcdH0sXG5cdFx0fSxcblx0fSxcblx0J2F0dHJpYnV0ZXMnOiB7XG5cdFx0cGF0dGVybjogLyhAKSg/OmFsaWdufGJpbmRpbmd8Y29tcHV0ZXxjb25zdHxmcmFnbWVudHxncm91cHxpZHxpbnRlcnBvbGF0ZXxpbnZhcmlhbnR8bG9jYXRpb258c2l6ZXx2ZXJ0ZXh8d29ya2dyb3VwX3NpemUpL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2F0dHItbmFtZScsXG5cdH0sXG5cdCdmdW5jdGlvbnMnOiB7XG5cdFx0cGF0dGVybjogL1xcYihmblxccyspW19hLXpBLVpdXFx3Kig/PVsoPF0pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nLFxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpiaXRjYXN0fGJyZWFrfGNhc2V8Y29uc3R8Y29udGludWV8Y29udGludWluZ3xkZWZhdWx0fGRpc2NhcmR8ZWxzZXxlbmFibGV8ZmFsbHRocm91Z2h8Zm58Zm9yfGZ1bmN0aW9ufGlmfGxldHxsb29wfHByaXZhdGV8cmV0dXJufHN0b3JhZ2V8c3RydWN0fHN3aXRjaHx0eXBlfHVuaWZvcm18dmFyfHdoaWxlfHdvcmtncm91cClcXGIvLFxuXHQnYnVpbHRpbic6IC9cXGIoPzphYnN8YWNvc3xhY29zaHxhbGx8YW55fGFycmF5fGFzaW58YXNpbmh8YXRhbnxhdGFuMnxhdGFuaHxhdG9taWN8YXRvbWljQWRkfGF0b21pY0FuZHxhdG9taWNDb21wYXJlRXhjaGFuZ2VXZWFrfGF0b21pY0V4Y2hhbmdlfGF0b21pY0xvYWR8YXRvbWljTWF4fGF0b21pY01pbnxhdG9taWNPcnxhdG9taWNTdG9yZXxhdG9taWNTdWJ8YXRvbWljWG9yfGJvb2x8Y2VpbHxjbGFtcHxjb3N8Y29zaHxjb3VudExlYWRpbmdaZXJvc3xjb3VudE9uZUJpdHN8Y291bnRUcmFpbGluZ1plcm9zfGNyb3NzfGRlZ3JlZXN8ZGV0ZXJtaW5hbnR8ZGlzdGFuY2V8ZG90fGRwZHh8ZHBkeENvYXJzZXxkcGR4RmluZXxkcGR5fGRwZHlDb2Fyc2V8ZHBkeUZpbmV8ZXhwfGV4cDJ8ZXh0cmFjdEJpdHN8ZjMyfGY2NHxmYWNlRm9yd2FyZHxmaXJzdExlYWRpbmdCaXR8Zmxvb3J8Zm1hfGZyYWN0fGZyZXhwfGZ3aWR0aHxmd2lkdGhDb2Fyc2V8ZndpZHRoRmluZXxpMzJ8aTY0fGluc2VydEJpdHN8aW52ZXJzZVNxcnR8bGRleHB8bGVuZ3RofGxvZ3xsb2cyfG1hdFsyLTRdeFsyLTRdfG1heHxtaW58bWl4fG1vZGZ8bm9ybWFsaXplfG92ZXJyaWRlfHBhY2syeDE2ZmxvYXR8cGFjazJ4MTZzbm9ybXxwYWNrMngxNnVub3JtfHBhY2s0eDhzbm9ybXxwYWNrNHg4dW5vcm18cG93fHB0cnxxdWFudGl6ZVRvRjE2fHJhZGlhbnN8cmVmbGVjdHxyZWZyYWN0fHJldmVyc2VCaXRzfHJvdW5kfHNhbXBsZXJ8c2FtcGxlcl9jb21wYXJpc29ufHNlbGVjdHxzaGlmdExlZnR8c2hpZnRSaWdodHxzaWdufHNpbnxzaW5ofHNtb290aHN0ZXB8c3FydHxzdGF0aWNBc3NlcnR8c3RlcHxzdG9yYWdlQmFycmllcnx0YW58dGFuaHx0ZXh0dXJlRGltZW5zaW9uc3x0ZXh0dXJlR2F0aGVyfHRleHR1cmVHYXRoZXJDb21wYXJlfHRleHR1cmVMb2FkfHRleHR1cmVOdW1MYXllcnN8dGV4dHVyZU51bUxldmVsc3x0ZXh0dXJlTnVtU2FtcGxlc3x0ZXh0dXJlU2FtcGxlfHRleHR1cmVTYW1wbGVCaWFzfHRleHR1cmVTYW1wbGVDb21wYXJlfHRleHR1cmVTYW1wbGVDb21wYXJlTGV2ZWx8dGV4dHVyZVNhbXBsZUdyYWR8dGV4dHVyZVNhbXBsZUxldmVsfHRleHR1cmVTdG9yZXx0ZXh0dXJlXzFkfHRleHR1cmVfMmR8dGV4dHVyZV8yZF9hcnJheXx0ZXh0dXJlXzNkfHRleHR1cmVfY3ViZXx0ZXh0dXJlX2N1YmVfYXJyYXl8dGV4dHVyZV9kZXB0aF8yZHx0ZXh0dXJlX2RlcHRoXzJkX2FycmF5fHRleHR1cmVfZGVwdGhfY3ViZXx0ZXh0dXJlX2RlcHRoX2N1YmVfYXJyYXl8dGV4dHVyZV9kZXB0aF9tdWx0aXNhbXBsZWRfMmR8dGV4dHVyZV9tdWx0aXNhbXBsZWRfMmR8dGV4dHVyZV9zdG9yYWdlXzFkfHRleHR1cmVfc3RvcmFnZV8yZHx0ZXh0dXJlX3N0b3JhZ2VfMmRfYXJyYXl8dGV4dHVyZV9zdG9yYWdlXzNkfHRyYW5zcG9zZXx0cnVuY3x1MzJ8dTY0fHVucGFjazJ4MTZmbG9hdHx1bnBhY2syeDE2c25vcm18dW5wYWNrMngxNnVub3JtfHVucGFjazR4OHNub3JtfHVucGFjazR4OHVub3JtfHZlY1syLTRdfHdvcmtncm91cEJhcnJpZXIpXFxiLyxcblx0J2Z1bmN0aW9uLWNhbGxzJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbX2Etel1cXHcqKD89XFwoKS9pLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nLFxuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IC9cXGIoPzpbQS1aXVtBLVphLXowLTldKilcXGIvLFxuXHQnYm9vbC1saXRlcmFsJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdFx0YWxpYXM6ICdib29sZWFuJyxcblx0fSxcblx0J2hleC1pbnQtbGl0ZXJhbCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiMFt4WF1bMC05YS1mQS1GXStbaXVdP1xcYig/IVsucFBdKS8sXG5cdFx0YWxpYXM6ICdudW1iZXInLFxuXHR9LFxuXHQnaGV4LWZsb2F0LWxpdGVyYWwnOiB7XG5cdFx0cGF0dGVybjogL1xcYjBbeFhdWzAtOWEtZkEtRl0qKD86XFwuWzAtOWEtZkEtRl0qKT8oPzpbcFBdWystXT9cXGQrW2ZoXT8pPy8sIGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQnZGVjaW1hbC1mbG9hdC1saXRlcmFsJzogW1xuXHRcdHsgcGF0dGVybjogL1xcZCpcXC5cXGQrKD86W2VFXSg/OlxcK3wtKT9cXGQrKT9bZmhdPy8sIGFsaWFzOiAnbnVtYmVyJyB9LFxuXHRcdHsgcGF0dGVybjogL1xcZCtcXC5cXGQqKD86W2VFXSg/OlxcK3wtKT9cXGQrKT9bZmhdPy8sIGFsaWFzOiAnbnVtYmVyJyB9LFxuXHRcdHsgcGF0dGVybjogL1xcZCtbZUVdKD86XFwrfC0pP1xcZCtbZmhdPy8sIGFsaWFzOiAnbnVtYmVyJyB9LFxuXHRcdHsgcGF0dGVybjogL1xcYlxcZCtbZmhdXFxiLywgYWxpYXM6ICdudW1iZXInIH0sXG5cdF0sXG5cdCdpbnQtbGl0ZXJhbCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiXFxkK1tpdV0/XFxiLyxcblx0XHRhbGlhczogJ251bWJlcicsXG5cdH0sXG5cdCdvcGVyYXRvcic6IFtcblx0XHR7IHBhdHRlcm46IC8oPzpcXF58fnxcXHwoPyFcXHwpfFxcfFxcfHwmJnw8PHw+PnwhKSg/IT0pLyB9LFxuXHRcdHsgcGF0dGVybjogLyYoPyFbJj1dKS8gfSxcblx0XHR7IHBhdHRlcm46IC8oPzpcXCs9fC09fFxcKj18XFwvPXwlPXxcXF49fCY9fFxcfD18PDw9fD4+PSkvIH0sXG5cdFx0eyBwYXR0ZXJuOiAvKF58W148Pj0hXSk9KD8hWz0+XSkvLCBsb29rYmVoaW5kOiB0cnVlIH0sXG5cdFx0eyBwYXR0ZXJuOiAvKD86PT18IT18PD18XFwrXFwrfC0tfChefFtePV0pPj0pLywgbG9va2JlaGluZDogdHJ1ZSB9LFxuXHRcdHsgcGF0dGVybjogLyg/Oig/OlsrJV18KD86XFwqKD8hXFx3KSkpKD8hPSkpfCg/Oi0oPyE+KSl8KD86XFwvKD8hXFwvKSkvIH0sXG5cdFx0eyBwYXR0ZXJuOiAvLT4vIH0sXG5cdF0sXG5cdCdwdW5jdHVhdGlvbic6IC9bQCgpe31bXFxdLDs8PjouXS8sXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMud2lraSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ21hcmt1cCcsIHtcblx0J2Jsb2NrLWNvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdH0sXG5cdCdoZWFkaW5nJzoge1xuXHRcdHBhdHRlcm46IC9eKD0rKVtePVxcclxcbl0uKj9cXDEvbSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9ePSt8PSskLyxcblx0XHRcdCdpbXBvcnRhbnQnOiAvLisvXG5cdFx0fVxuXHR9LFxuXHQnZW1waGFzaXMnOiB7XG5cdFx0Ly8gVE9ETyBNdWx0aS1saW5lXG5cdFx0cGF0dGVybjogLygnezIsNX0pLis/XFwxLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdib2xkLWl0YWxpYyc6IHtcblx0XHRcdFx0cGF0dGVybjogLygnJycnJykuKz8oPz1cXDEpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6IFsnYm9sZCcsICdpdGFsaWMnXVxuXHRcdFx0fSxcblx0XHRcdCdib2xkJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCcnJylbXiddKD86Lio/W14nXSk/KD89XFwxKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQnaXRhbGljJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCcnKVteJ10oPzouKj9bXiddKT8oPz1cXDEpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9eJycrfCcnKyQvXG5cdFx0fVxuXHR9LFxuXHQnaHInOiB7XG5cdFx0cGF0dGVybjogL14tezQsfS9tLFxuXHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdH0sXG5cdCd1cmwnOiBbXG5cdFx0L0lTQk4gKyg/Ojk3Wzg5XVsgLV0/KT8oPzpcXGRbIC1dPyl7OX1bXFxkeF1cXGJ8KD86UE1JRHxSRkMpICtcXGQrL2ksXG5cdFx0L1xcW1xcWy4rP1xcXVxcXXxcXFsuKz9cXF0vXG5cdF0sXG5cdCd2YXJpYWJsZSc6IFtcblx0XHQvX19bQS1aXStfXy8sXG5cdFx0Ly8gRklYTUUgTmVzdGVkIHN0cnVjdHVyZXMgc2hvdWxkIGJlIGhhbmRsZWRcblx0XHQvLyB7e2Zvcm1hdG51bTp7eyNleHByOnt7ezN9fX19fX19XG5cdFx0L1xce3szfS4rP1xcfXszfS8sXG5cdFx0L1xce1xcey4rP1xcfVxcfS9cblx0XSxcblx0J3N5bWJvbCc6IFtcblx0XHQvXiNyZWRpcmVjdC9pbSxcblx0XHQvfnszLDV9L1xuXHRdLFxuXHQvLyBIYW5kbGUgdGFibGUgYXR0cnM6XG5cdC8vIHt8XG5cdC8vICEgc3R5bGU9XCJ0ZXh0LWFsaWduOmxlZnQ7XCJ8IEl0ZW1cblx0Ly8gfH1cblx0J3RhYmxlLXRhZyc6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58W3whXSlbfCFdKVtefFxcclxcbl0rXFx8KD8hXFx8KS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndGFibGUtYmFyJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFx8JC8sXG5cdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHR9LFxuXHRcdFx0cmVzdDogUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cFsndGFnJ10uaW5zaWRlXG5cdFx0fVxuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvXig/Olxce1xcfHxcXHxcXH18XFx8LXxbKiM6OyF8XSl8XFx8XFx8fCEhL21cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCd3aWtpJywgJ3RhZycsIHtcblx0Ly8gUHJldmVudCBoaWdobGlnaHRpbmcgaW5zaWRlIDxub3dpa2k+LCA8c291cmNlPiBhbmQgPHByZT4gdGFnc1xuXHQnbm93aWtpJzoge1xuXHRcdHBhdHRlcm46IC88KG5vd2lraXxwcmV8c291cmNlKVxcYltePl0qPltcXHNcXFNdKj88XFwvXFwxPi9pLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3RhZyc6IHtcblx0XHRcdFx0cGF0dGVybjogLzwoPzpub3dpa2l8cHJlfHNvdXJjZSlcXGJbXj5dKj58PFxcLyg/Om5vd2lraXxwcmV8c291cmNlKT4vaSxcblx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMubWFya3VwWyd0YWcnXS5pbnNpZGVcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMud29sZnJhbSA9IHtcblx0J2NvbW1lbnQnOiAvLyBBbGxvdyBvbmUgbGV2ZWwgb2YgbmVzdGluZyAtIG5vdGU6IHJlZ2V4IHRha2VuIGZyb20gYXBwbGVzY2lwdFxuXHRcdC9cXChcXCooPzpcXChcXCooPzpbXipdfFxcKig/IVxcKSkpKlxcKlxcKXwoPyFcXChcXCopW1xcc1xcU10pKj9cXCpcXCkvLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlxcXFwufFteXCJcXFxcXFxyXFxuXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpBYnN8QWJzQXJnfEFjY3VyYWN5fEJsb2NrfERvfEZvcnxGdW5jdGlvbnxJZnxNYW5pcHVsYXRlfE1vZHVsZXxOZXN0fE5lc3RMaXN0fE5vbmV8UmV0dXJufFN3aXRjaHxUYWJsZXxXaGljaHxXaGlsZSlcXGIvLFxuXHQnY29udGV4dCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiXFx3K2ArXFx3Ki8sXG5cdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHR9LFxuXHQnYmxhbmsnOiB7XG5cdFx0cGF0dGVybjogL1xcYlxcdytfXFxiLyxcblx0XHRhbGlhczogJ3JlZ2V4J1xuXHR9LFxuXHQnZ2xvYmFsLXZhcmlhYmxlJzoge1xuXHRcdHBhdHRlcm46IC9cXCRcXHcrLyxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9LFxuXHQnYm9vbGVhbic6IC9cXGIoPzpGYWxzZXxUcnVlKVxcYi8sXG5cdCdudW1iZXInOiAvKD86XFxiKD89XFxkKXxcXEIoPz1cXC4pKSg/OjBbYm9dKT8oPzooPzpcXGR8MHhbXFxkYS1mXSlbXFxkYS1mXSooPzpcXC5cXGQqKT98XFwuXFxkKykoPzplWystXT9cXGQrKT9qP1xcYi9pLFxuXHQnb3BlcmF0b3InOiAvXFwvXFwufDt8PVxcLnxcXF49fFxcXjo9fDo9fDw8fD4+fDxcXHx8XFx8Pnw6PnxcXHwtPnwtPnw8LXxAQEB8QEB8QHxcXC9AfD0hPXw9PT18PT18PXxcXCt8LXxcXFtcXC8tKyU9XFxdPT98IT18XFwqXFwqPz0/fFxcL1xcLz89P3w8Wzw9Pl0/fD5bPT5dP3xbJnxefl0vLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSwuOl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMubWF0aGVtYXRpY2EgPSBQcmlzbS5sYW5ndWFnZXMud29sZnJhbTtcblByaXNtLmxhbmd1YWdlcy53bCA9IFByaXNtLmxhbmd1YWdlcy53b2xmcmFtO1xuUHJpc20ubGFuZ3VhZ2VzLm5iID0gUHJpc20ubGFuZ3VhZ2VzLndvbGZyYW07XG5cbi8vIGh0dHBzOi8vd3Jlbi5pby9cblxuUHJpc20ubGFuZ3VhZ2VzLndyZW4gPSB7XG5cdC8vIE11bHRpbGluZSBjb21tZW50cyBpbiBXcmVuIGNhbiBoYXZlIG5lc3RlZCBtdWx0aWxpbmUgY29tbWVudHNcblx0Ly8gQ29tbWVudHM6IC8vIGFuZCAvKiAqL1xuXHQnY29tbWVudCc6IFtcblx0XHR7XG5cdFx0XHQvLyBzdXBwb3J0IDMgbGV2ZWxzIG9mIG5lc3Rpbmdcblx0XHRcdC8vIHJlZ2V4OiBcXC9cXCooPzpbXiovXXxcXCooPyFcXC8pfFxcLyg/IVxcKil8PHNlbGY+KSpcXCpcXC9cblx0XHRcdHBhdHRlcm46IC9cXC9cXCooPzpbXiovXXxcXCooPyFcXC8pfFxcLyg/IVxcKil8XFwvXFwqKD86W14qL118XFwqKD8hXFwvKXxcXC8oPyFcXCopfFxcL1xcKig/OlteKi9dfFxcKig/IVxcLyl8XFwvKD8hXFwqKSkqXFwqXFwvKSpcXCpcXC8pKlxcKlxcLy8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFw6XSlcXC9cXC8uKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXG5cdC8vIFRyaXBsZSBxdW90ZWQgc3RyaW5ncyBhcmUgbXVsdGlsaW5lIGJ1dCBjYW5ub3QgaGF2ZSBpbnRlcnBvbGF0aW9uIChyYXcgc3RyaW5ncylcblx0Ly8gQmFzZWQgb24gcHJpc20tcHl0aG9uLmpzXG5cdCd0cmlwbGUtcXVvdGVkLXN0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCJcIlwiW1xcc1xcU10qP1wiXCJcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHR9LFxuXG5cdC8vIHNlZSBiZWxvd1xuXHQnc3RyaW5nLWxpdGVyYWwnOiBudWxsLFxuXG5cdC8vICMhL3Vzci9iaW4vZW52IHdyZW4gb24gdGhlIGZpcnN0IGxpbmVcblx0J2hhc2hiYW5nJzoge1xuXHRcdHBhdHRlcm46IC9eIyFcXC8uKy8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnY29tbWVudCdcblx0fSxcblxuXHQvLyBBdHRyaWJ1dGVzIGFyZSBzcGVjaWFsIGtleXdvcmRzIHRvIGFkZCBtZXRhIGRhdGEgdG8gY2xhc3Nlc1xuXHQnYXR0cmlidXRlJzoge1xuXHRcdC8vICMhIGF0dHJpYnV0ZXMgYXJlIHN0b3JlZCBpbiBjbGFzcyBwcm9wZXJ0aWVzXG5cdFx0Ly8gIyFteXZhciA9IHRydWVcblx0XHQvLyAjYXR0cmlidXRlcyBhcmUgbm90IHN0b3JlZCBhbmQgZGlzbWlzc2VkIGF0IGNvbXBpbGF0aW9uXG5cdFx0cGF0dGVybjogLyMhP1sgXFx0XFx1MzAwMF0qXFx3Ky8sXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IFtcblx0XHR7XG5cdFx0XHQvLyBjbGFzcyBkZWZpbml0aW9uXG5cdFx0XHQvLyBjbGFzcyBNZXRhIHt9XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYmNsYXNzXFxzKylcXHcrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC8vIEEgY2xhc3MgbXVzdCBhbHdheXMgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UuXG5cdFx0Ly8gRmlsZS5yZWFkXG5cdFx0L1xcYltBLVpdW2EtelxcZF9dKlxcYi8sXG5cdF0sXG5cblx0Ly8gQSBjb25zdGFudCBjYW4gYmUgYSB2YXJpYWJsZSwgY2xhc3MsIHByb3BlcnR5IG9yIG1ldGhvZC4gSnVzdCBuYW1lZCBpbiBhbGwgdXBwZXJjYXNlIGxldHRlcnNcblx0J2NvbnN0YW50JzogL1xcYltBLVpdW0EtWlxcZF9dKlxcYi8sXG5cblx0J251bGwnOiB7XG5cdFx0cGF0dGVybjogL1xcYm51bGxcXGIvLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YXN8YnJlYWt8Y2xhc3N8Y29uc3RydWN0fGNvbnRpbnVlfGVsc2V8Zm9yfGZvcmVpZ258aWZ8aW1wb3J0fGlufGlzfHJldHVybnxzdGF0aWN8c3VwZXJ8dGhpc3x2YXJ8d2hpbGUpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnbnVtYmVyJzogL1xcYig/OjB4W1xcZGEtZl0rfFxcZCsoPzpcXC5cXGQrKT8oPzplWystXT9cXGQrKT8pXFxiL2ksXG5cblx0Ly8gRnVuY3Rpb25zIGNhbiBiZSBDbGFzcy5tZXRob2QoKVxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypbKHtdKS9pLFxuXG5cdCdvcGVyYXRvcic6IC88PHw+PnxbPSE8Pl09P3wmJnxcXHxcXHx8Wy0rKi8lfl4mfD86XXxcXC57MiwzfS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxdKCl7fS4sO10vLFxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLndyZW5bJ3N0cmluZy1saXRlcmFsJ10gPSB7XG5cdC8vIEEgc2luZ2xlIHF1b3RlIHN0cmluZyBpcyBtdWx0aWxpbmUgYW5kIGNhbiBoYXZlIGludGVycG9sYXRpb24gKHNpbWlsYXIgdG8gSlMgYmFja3RpY2tzIGBgKVxuXHRwYXR0ZXJuOiAvKF58W15cXFxcXCJdKVwiKD86W15cXFxcXCIlXXxcXFxcW1xcc1xcU118JSg/IVxcKCl8JVxcKCg/OlteKCldfFxcKCg/OlteKCldfFxcKFteKV0qXFwpKSpcXCkpKlxcKSkqXCIvLFxuXHRsb29rYmVoaW5kOiB0cnVlLFxuXHRncmVlZHk6IHRydWUsXG5cdGluc2lkZToge1xuXHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0Ly8gXCIlKGludGVycG9sYXRpb24pXCJcblx0XHRcdHBhdHRlcm46IC8oKD86XnxbXlxcXFxdKSg/OlxcXFx7Mn0pKiklXFwoKD86W14oKV18XFwoKD86W14oKV18XFwoW14pXSpcXCkpKlxcKSkqXFwpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oJVxcKClbXFxzXFxTXSsoPz1cXCkkKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy53cmVuXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eJVxcKHxcXCkkLyxcblx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHR9LFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdH1cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0UHJpc20ubGFuZ3VhZ2VzLnhlb3JhID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnbWFya3VwJywge1xuXHRcdCdjb25zdGFudCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXCQoPzpEb21haW5Db250ZW50c3xQYWdlUmVuZGVyRHVyYXRpb24pXFwkLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xcJC9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3ZhcmlhYmxlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcJEA/KD86Iyt8Wy0rKn49Xl0pP1tcXHcuXStcXCQvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvWyQuXS9cblx0XHRcdFx0fSxcblx0XHRcdFx0J29wZXJhdG9yJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8jK3xbLSsqfj1eQF0vXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdmdW5jdGlvbi1pbmxpbmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwkRjpbLVxcdy5dK1xcP1stXFx3Ll0rKD86LCg/Oig/OkBbLSNdKlxcdytcXC5bXFx3Ky5dXFwuKikqXFx8KSooPzooPzpbXFx3K118Wy0jKi5+Xl0rW1xcdytdfD1cXFMpKD86W14kPV18PStbXj1dKSo9KnwoPzpAWy0jXSpcXHcrXFwuW1xcdysuXVxcLiopKyg/Oig/OltcXHcrXXxbLSMqfl5dWy0jKi5+Xl0qW1xcdytdfD1cXFMpKD86W14kPV18PStbXj1dKSo9Kik/KT8pP1xcJC8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3ZhcmlhYmxlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oPzpbLHxdKUA/KD86Iyt8Wy0rKn49Xl0pP1tcXHcuXSsvLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvWywufF0vXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J29wZXJhdG9yJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvIyt8Wy0rKn49XkBdL1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXCRcXHc6fFskOj8uLHxdL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXHRcdCdmdW5jdGlvbi1ibG9jayc6IHtcblx0XHRcdHBhdHRlcm46IC9cXCRYRjpcXHtbLVxcdy5dK1xcP1stXFx3Ll0rKD86LCg/Oig/OkBbLSNdKlxcdytcXC5bXFx3Ky5dXFwuKikqXFx8KSooPzooPzpbXFx3K118Wy0jKi5+Xl0rW1xcdytdfD1cXFMpKD86W14kPV18PStbXj1dKSo9KnwoPzpAWy0jXSpcXHcrXFwuW1xcdysuXVxcLiopKyg/Oig/OltcXHcrXXxbLSMqfl5dWy0jKi5+Xl0qW1xcdytdfD1cXFMpKD86W14kPV18PStbXj1dKSo9Kik/KT8pP1xcfTpYRlxcJC8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9bJDp7fT8uLHxdL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXHRcdCdkaXJlY3RpdmUtaW5saW5lJzoge1xuXHRcdFx0cGF0dGVybjogL1xcJFxcdyg/OiNcXGQrXFwrPyk/KD86XFxbWy1cXHcuXStcXF0pPzpbLVxcL1xcdy5dK1xcJC8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXCQoPzpcXHc6fEMoPzpcXFt8I1xcZCkpP3xbOntbXFxdXS8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQndGFnJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvI1xcZC9cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cdFx0J2RpcmVjdGl2ZS1ibG9jay1vcGVuJzoge1xuXHRcdFx0cGF0dGVybjogL1xcJFxcdys6XFx7fFxcJFxcdyg/OiNcXGQrXFwrPyk/KD86XFxbWy1cXHcuXStcXF0pPzpbLVxcdy5dKzpcXHsoPzohW0EtWl0rKT8vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFwkKD86XFx3OnxDKD86XFxbfCNcXGQpKT98Wzp7W1xcXV0vLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3RhZyc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyNcXGQvXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnYXR0cmlidXRlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8hW0EtWl0rJC8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8hL1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXHRcdCdkaXJlY3RpdmUtYmxvY2stc2VwYXJhdG9yJzoge1xuXHRcdFx0cGF0dGVybjogL1xcfTpbLVxcdy5dKzpcXHsvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvWzp7fV0vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cdFx0J2RpcmVjdGl2ZS1ibG9jay1jbG9zZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXH06Wy1cXHcuXStcXCQvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvWzp7fSRdL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2luc2lkZScsICdwdW5jdHVhdGlvbicsIHtcblx0XHQndmFyaWFibGUnOiBQcmlzbS5sYW5ndWFnZXMueGVvcmFbJ2Z1bmN0aW9uLWlubGluZSddLmluc2lkZVsndmFyaWFibGUnXVxuXHR9LCBQcmlzbS5sYW5ndWFnZXMueGVvcmFbJ2Z1bmN0aW9uLWJsb2NrJ10pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy54ZW9yYWN1YmUgPSBQcmlzbS5sYW5ndWFnZXMueGVvcmE7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8qKlxuXHQgKiBJZiB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgaXMgcHJlc2VudCwgaXQgd2lsbCBpbnNlcnQgdGhlIGdpdmVuIGRvYyBjb21tZW50IGdyYW1tYXIgdG9rZW4gaW50byBpdC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGxhbmdcblx0ICogQHBhcmFtIHthbnl9IGRvY0NvbW1lbnRcblx0ICovXG5cdGZ1bmN0aW9uIGluc2VydERvY0NvbW1lbnQobGFuZywgZG9jQ29tbWVudCkge1xuXHRcdGlmIChQcmlzbS5sYW5ndWFnZXNbbGFuZ10pIHtcblx0XHRcdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUobGFuZywgJ2NvbW1lbnQnLCB7XG5cdFx0XHRcdCdkb2MtY29tbWVudCc6IGRvY0NvbW1lbnRcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHZhciB0YWcgPSBQcmlzbS5sYW5ndWFnZXMubWFya3VwLnRhZztcblxuXHR2YXIgc2xhc2hEb2NDb21tZW50ID0ge1xuXHRcdHBhdHRlcm46IC9cXC9cXC9cXC8uKi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnY29tbWVudCcsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndGFnJzogdGFnXG5cdFx0fVxuXHR9O1xuXHR2YXIgdGlja0RvY0NvbW1lbnQgPSB7XG5cdFx0cGF0dGVybjogLycnJy4qLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdjb21tZW50Jyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd0YWcnOiB0YWdcblx0XHR9XG5cdH07XG5cblx0aW5zZXJ0RG9jQ29tbWVudCgnY3NoYXJwJywgc2xhc2hEb2NDb21tZW50KTtcblx0aW5zZXJ0RG9jQ29tbWVudCgnZnNoYXJwJywgc2xhc2hEb2NDb21tZW50KTtcblx0aW5zZXJ0RG9jQ29tbWVudCgndmJuZXQnLCB0aWNrRG9jQ29tbWVudCk7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnhvam8gPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oPzonfFxcL1xcL3xSZW1cXGIpLisvaSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpcIlwifFteXCJdKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdudW1iZXInOiBbXG5cdFx0Lyg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpFWystXT9cXGQrKT8vaSxcblx0XHQvJltiY2hvdV1bYS16XFxkXSsvaVxuXHRdLFxuXHQnZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC8jKD86RWxzZXxFbHNlSWZ8RW5kaWZ8SWZ8UHJhZ21hKVxcYi9pLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OkFkZEhhbmRsZXJ8QXBwfEFycmF5fEFzKD86c2lnbnMpP3xBdXRvfEJvb2xlYW58QnJlYWt8QnkoPzpSZWZ8VmFsKXxCeXRlfENhbGx8Q2FzZXxDYXRjaHxDRlN0cmluZ1JlZnxDR0Zsb2F0fENsYXNzfENvbG9yfENvbnN0fENvbnRpbnVlfENTdHJpbmd8Q3VycmVuY3l8Q3VycmVudE1ldGhvZE5hbWV8RGVjbGFyZXxEZWxlZ2F0ZXxEaW18RG8oPzp1YmxlfHduVG8pP3xFYWNofEVsc2UoPzpJZik/fEVuZHxFbnVtZXJhdGlvbnxFdmVudHxFeGNlcHRpb258RXhpdHxFeHRlbmRzfEZhbHNlfEZpbmFsbHl8Rm9yfEZ1bmN0aW9ufEdldHxHZXRUeXBlSW5mb3xHbG9iYWx8R09UT3xJZnxJbXBsZW1lbnRzfElufEluaGVyaXRzfEludCg/Ojh8MTZ8MzJ8NjR8ZWdlcnxlcmZhY2UpP3xMaWJ8TG9vcHxNZXxNb2R1bGV8TmV4dHxOaWx8T2JqZWN0fE9wdGlvbmFsfE9TVHlwZXxQYXJhbUFycmF5fFByaXZhdGV8UHJvcGVydHl8UHJvdGVjdGVkfFBTdHJpbmd8UHRyfFJhaXNlKD86RXZlbnQpP3xSZURpbXxSZW1vdmVIYW5kbGVyfFJldHVybnxTZWxlY3QoPzpvcik/fFNlbGZ8U2V0fFNoYXJlZHxTaG9ydHxTaW5nbGV8U29mdHxTdGF0aWN8U3RlcHxTdHJpbmd8U3VifFN1cGVyfFRleHR8VGhlbnxUb3xUcnVlfFRyeXxVYm91bmR8VUludCg/Ojh8MTZ8MzJ8NjR8ZWdlcik/fFVudGlsfFVzaW5nfFZhcig/OmlhbnQpP3xXZW5kfFdoaWxlfFdpbmRvd1B0cnxXU3RyaW5nKVxcYi9pLFxuXHQnb3BlcmF0b3InOiAvPFs9Pl0/fD49P3xbK1xcLSpcXC9cXFxcXj1dfFxcYig/OkFkZHJlc3NPZnxBbmR8Q3R5cGV8SXNBP3xNb2R8TmV3fE5vdHxPcnxXZWFrQWRkcmVzc09mfFhvcilcXGIvaSxcblx0J3B1bmN0dWF0aW9uJzogL1suLDs6KCldL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdFByaXNtLmxhbmd1YWdlcy54cXVlcnkgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdtYXJrdXAnLCB7XG5cdFx0J3hxdWVyeS1jb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcKDpbXFxzXFxTXSo/OlxcKS8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyhbXCInXSkoPzpcXDFcXDF8KD8hXFwxKVtcXHNcXFNdKSpcXDEvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnZXh0ZW5zaW9uJzoge1xuXHRcdFx0cGF0dGVybjogL1xcKCMuKz8jXFwpLyxcblx0XHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHRcdH0sXG5cdFx0J3ZhcmlhYmxlJzogL1xcJFstXFx3Ol0rLyxcblx0XHQnYXhpcyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXi1dKSg/OmFuY2VzdG9yKD86LW9yLXNlbGYpP3xhdHRyaWJ1dGV8Y2hpbGR8ZGVzY2VuZGFudCg/Oi1vci1zZWxmKT98Zm9sbG93aW5nKD86LXNpYmxpbmcpP3xwYXJlbnR8cHJlY2VkaW5nKD86LXNpYmxpbmcpP3xzZWxmKSg/PTo6KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9LFxuXHRcdCdrZXl3b3JkLW9wZXJhdG9yJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteOi1dKVxcYig/OmFuZHxjYXN0YWJsZSBhc3xkaXZ8ZXF8ZXhjZXB0fGdlfGd0fGlkaXZ8aW5zdGFuY2Ugb2Z8aW50ZXJzZWN0fGlzfGxlfGx0fG1vZHxuZXxvcnx1bmlvbilcXGIoPz0kfFteOi1dKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteOi1dKVxcYig/OmFzfGFzY2VuZGluZ3xhdHxiYXNlLXVyaXxib3VuZGFyeS1zcGFjZXxjYXNlfGNhc3QgYXN8Y29sbGF0aW9ufGNvbnN0cnVjdGlvbnxjb3B5LW5hbWVzcGFjZXN8ZGVjbGFyZXxkZWZhdWx0fGRlc2NlbmRpbmd8ZWxzZXxlbXB0eSAoPzpncmVhdGVzdHxsZWFzdCl8ZW5jb2Rpbmd8ZXZlcnl8ZXh0ZXJuYWx8Zm9yfGZ1bmN0aW9ufGlmfGltcG9ydHxpbnxpbmhlcml0fGxheHxsZXR8bWFwfG1vZHVsZXxuYW1lc3BhY2V8bm8taW5oZXJpdHxuby1wcmVzZXJ2ZXxvcHRpb258b3JkZXIoPzogYnl8ZWR8aW5nKT98cHJlc2VydmV8cmV0dXJufHNhdGlzZmllc3xzY2hlbWF8c29tZXxzdGFibGV8c3RyaWN0fHN0cmlwfHRoZW58dG98dHJlYXQgYXN8dHlwZXN3aXRjaHx1bm9yZGVyZWR8dmFsaWRhdGV8dmFyaWFibGV8dmVyc2lvbnx3aGVyZXx4cXVlcnkpXFxiKD89JHxbXjotXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2Z1bmN0aW9uJzogL1tcXHctXSsoPzo6W1xcdy1dKykqKD89XFxzKlxcKCkvLFxuXHRcdCd4cXVlcnktZWxlbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8oZWxlbWVudFxccyspW1xcdy1dKyg/OjpbXFx3LV0rKSovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAndGFnJ1xuXHRcdH0sXG5cdFx0J3hxdWVyeS1hdHRyaWJ1dGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKGF0dHJpYnV0ZVxccyspW1xcdy1dKyg/OjpbXFx3LV0rKSovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnYXR0ci1uYW1lJ1xuXHRcdH0sXG5cdFx0J2J1aWx0aW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W146LV0pXFxiKD86YXR0cmlidXRlfGNvbW1lbnR8ZG9jdW1lbnR8ZWxlbWVudHxwcm9jZXNzaW5nLWluc3RydWN0aW9ufHRleHR8eHM6KD86RU5USVRJRVN8RU5USVRZfElEfElEUkVGUz98TkNOYW1lfE5NVE9LRU5TP3xOT1RBVElPTnxOYW1lfFFOYW1lfGFueUF0b21pY1R5cGV8YW55VHlwZXxhbnlVUkl8YmFzZTY0QmluYXJ5fGJvb2xlYW58Ynl0ZXxkYXRlfGRhdGVUaW1lfGRheVRpbWVEdXJhdGlvbnxkZWNpbWFsfGRvdWJsZXxkdXJhdGlvbnxmbG9hdHxnRGF5fGdNb250aHxnTW9udGhEYXl8Z1llYXJ8Z1llYXJNb250aHxoZXhCaW5hcnl8aW50fGludGVnZXJ8bGFuZ3VhZ2V8bG9uZ3xuZWdhdGl2ZUludGVnZXJ8bm9uTmVnYXRpdmVJbnRlZ2VyfG5vblBvc2l0aXZlSW50ZWdlcnxub3JtYWxpemVkU3RyaW5nfHBvc2l0aXZlSW50ZWdlcnxzaG9ydHxzdHJpbmd8dGltZXx0b2tlbnx1bnNpZ25lZCg/OkJ5dGV8SW50fExvbmd8U2hvcnQpfHVudHlwZWQoPzpBdG9taWMpP3x5ZWFyTW9udGhEdXJhdGlvbikpXFxiKD89JHxbXjotXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J251bWJlcic6IC9cXGJcXGQrKD86XFwuXFxkKyk/KD86RVsrLV0/XFxkKyk/Lyxcblx0XHQnb3BlcmF0b3InOiBbXG5cdFx0XHQvWysqPT98QF18XFwuXFwuP3w6PXwhPXw8Wz08XT98Pls9Pl0/Lyxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXHMpLSg/PVxccykvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQncHVuY3R1YXRpb24nOiAvW1tcXF0oKXt9LDs6L10vXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy54cXVlcnkudGFnLnBhdHRlcm4gPSAvPFxcLz8oPyFcXGQpW15cXHM+XFwvPSQ8JV0rKD86XFxzK1teXFxzPlxcLz1dKyg/Oj0oPzooXCJ8JykoPzpcXFxcW1xcc1xcU118XFx7KD8hXFx7KSg/Olxceyg/Olxce1tee31dKlxcfXxbXnt9XSkqXFx9fFtee31dKStcXH18KD8hXFwxKVteXFxcXF0pKlxcMXxbXlxccydcIj49XSspKT8pKlxccypcXC8/Pi87XG5cdFByaXNtLmxhbmd1YWdlcy54cXVlcnlbJ3RhZyddLmluc2lkZVsnYXR0ci12YWx1ZSddLnBhdHRlcm4gPSAvPSg/OihcInwnKSg/OlxcXFxbXFxzXFxTXXxcXHsoPyFcXHspKD86XFx7KD86XFx7W157fV0qXFx9fFtee31dKSpcXH18W157fV0pK1xcfXwoPyFcXDEpW15cXFxcXSkqXFwxfFteXFxzJ1wiPj1dKykvO1xuXHRQcmlzbS5sYW5ndWFnZXMueHF1ZXJ5Wyd0YWcnXS5pbnNpZGVbJ2F0dHItdmFsdWUnXS5pbnNpZGVbJ3B1bmN0dWF0aW9uJ10gPSAvXj1cInxcIiQvO1xuXHRQcmlzbS5sYW5ndWFnZXMueHF1ZXJ5Wyd0YWcnXS5pbnNpZGVbJ2F0dHItdmFsdWUnXS5pbnNpZGVbJ2V4cHJlc3Npb24nXSA9IHtcblx0XHQvLyBBbGxvdyBmb3IgdHdvIGxldmVscyBvZiBuZXN0aW5nXG5cdFx0cGF0dGVybjogL1xceyg/IVxceykoPzpcXHsoPzpcXHtbXnt9XSpcXH18W157fV0pKlxcfXxbXnt9XSkrXFx9Lyxcblx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy54cXVlcnksXG5cdFx0YWxpYXM6ICdsYW5ndWFnZS14cXVlcnknXG5cdH07XG5cblx0Ly8gVGhlIGZvbGxvd2luZyB3aWxsIGhhbmRsZSBwbGFpbiB0ZXh0IGluc2lkZSB0YWdzXG5cdHZhciBzdHJpbmdpZnlUb2tlbiA9IGZ1bmN0aW9uICh0b2tlbikge1xuXHRcdGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gdG9rZW47XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgdG9rZW4uY29udGVudCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiB0b2tlbi5jb250ZW50O1xuXHRcdH1cblx0XHRyZXR1cm4gdG9rZW4uY29udGVudC5tYXAoc3RyaW5naWZ5VG9rZW4pLmpvaW4oJycpO1xuXHR9O1xuXG5cdHZhciB3YWxrVG9rZW5zID0gZnVuY3Rpb24gKHRva2Vucykge1xuXHRcdHZhciBvcGVuZWRUYWdzID0gW107XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciB0b2tlbiA9IHRva2Vuc1tpXTtcblx0XHRcdHZhciBub3RUYWdOb3JCcmFjZSA9IGZhbHNlO1xuXG5cdFx0XHRpZiAodHlwZW9mIHRva2VuICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHRpZiAodG9rZW4udHlwZSA9PT0gJ3RhZycgJiYgdG9rZW4uY29udGVudFswXSAmJiB0b2tlbi5jb250ZW50WzBdLnR5cGUgPT09ICd0YWcnKSB7XG5cdFx0XHRcdFx0Ly8gV2UgZm91bmQgYSB0YWcsIG5vdyBmaW5kIGl0cyBraW5kXG5cblx0XHRcdFx0XHRpZiAodG9rZW4uY29udGVudFswXS5jb250ZW50WzBdLmNvbnRlbnQgPT09ICc8LycpIHtcblx0XHRcdFx0XHRcdC8vIENsb3NpbmcgdGFnXG5cdFx0XHRcdFx0XHRpZiAob3BlbmVkVGFncy5sZW5ndGggPiAwICYmIG9wZW5lZFRhZ3Nbb3BlbmVkVGFncy5sZW5ndGggLSAxXS50YWdOYW1lID09PSBzdHJpbmdpZnlUb2tlbih0b2tlbi5jb250ZW50WzBdLmNvbnRlbnRbMV0pKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFBvcCBtYXRjaGluZyBvcGVuaW5nIHRhZ1xuXHRcdFx0XHRcdFx0XHRvcGVuZWRUYWdzLnBvcCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAodG9rZW4uY29udGVudFt0b2tlbi5jb250ZW50Lmxlbmd0aCAtIDFdLmNvbnRlbnQgPT09ICcvPicpIHtcblx0XHRcdFx0XHRcdFx0Ly8gQXV0b2Nsb3NlZCB0YWcsIGlnbm9yZVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gT3BlbmluZyB0YWdcblx0XHRcdFx0XHRcdFx0b3BlbmVkVGFncy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHR0YWdOYW1lOiBzdHJpbmdpZnlUb2tlbih0b2tlbi5jb250ZW50WzBdLmNvbnRlbnRbMV0pLFxuXHRcdFx0XHRcdFx0XHRcdG9wZW5lZEJyYWNlczogMFxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0b3BlbmVkVGFncy5sZW5ndGggPiAwICYmIHRva2VuLnR5cGUgPT09ICdwdW5jdHVhdGlvbicgJiYgdG9rZW4uY29udGVudCA9PT0gJ3snICYmXG5cdFx0XHRcdFx0Ly8gSWdub3JlIGB7e2Bcblx0XHRcdFx0XHQoIXRva2Vuc1tpICsgMV0gfHwgdG9rZW5zW2kgKyAxXS50eXBlICE9PSAncHVuY3R1YXRpb24nIHx8IHRva2Vuc1tpICsgMV0uY29udGVudCAhPT0gJ3snKSAmJlxuXHRcdFx0XHRcdCghdG9rZW5zW2kgLSAxXSB8fCB0b2tlbnNbaSAtIDFdLnR5cGUgIT09ICdwbGFpbi10ZXh0JyB8fCB0b2tlbnNbaSAtIDFdLmNvbnRlbnQgIT09ICd7Jylcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gSGVyZSB3ZSBtaWdodCBoYXZlIGVudGVyZWQgYW4gWFF1ZXJ5IGV4cHJlc3Npb24gaW5zaWRlIGEgdGFnXG5cdFx0XHRcdFx0b3BlbmVkVGFnc1tvcGVuZWRUYWdzLmxlbmd0aCAtIDFdLm9wZW5lZEJyYWNlcysrO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAob3BlbmVkVGFncy5sZW5ndGggPiAwICYmIG9wZW5lZFRhZ3Nbb3BlbmVkVGFncy5sZW5ndGggLSAxXS5vcGVuZWRCcmFjZXMgPiAwICYmIHRva2VuLnR5cGUgPT09ICdwdW5jdHVhdGlvbicgJiYgdG9rZW4uY29udGVudCA9PT0gJ30nKSB7XG5cblx0XHRcdFx0XHQvLyBIZXJlIHdlIG1pZ2h0IGhhdmUgbGVmdCBhbiBYUXVlcnkgZXhwcmVzc2lvbiBpbnNpZGUgYSB0YWdcblx0XHRcdFx0XHRvcGVuZWRUYWdzW29wZW5lZFRhZ3MubGVuZ3RoIC0gMV0ub3BlbmVkQnJhY2VzLS07XG5cblx0XHRcdFx0fSBlbHNlIGlmICh0b2tlbi50eXBlICE9PSAnY29tbWVudCcpIHtcblx0XHRcdFx0XHRub3RUYWdOb3JCcmFjZSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChub3RUYWdOb3JCcmFjZSB8fCB0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdGlmIChvcGVuZWRUYWdzLmxlbmd0aCA+IDAgJiYgb3BlbmVkVGFnc1tvcGVuZWRUYWdzLmxlbmd0aCAtIDFdLm9wZW5lZEJyYWNlcyA9PT0gMCkge1xuXHRcdFx0XHRcdC8vIEhlcmUgd2UgYXJlIGluc2lkZSBhIHRhZywgYW5kIG5vdCBpbnNpZGUgYW4gWFF1ZXJ5IGV4cHJlc3Npb24uXG5cdFx0XHRcdFx0Ly8gVGhhdCdzIHBsYWluIHRleHQ6IGRyb3AgYW55IHRva2VucyBtYXRjaGVkLlxuXHRcdFx0XHRcdHZhciBwbGFpblRleHQgPSBzdHJpbmdpZnlUb2tlbih0b2tlbik7XG5cblx0XHRcdFx0XHQvLyBBbmQgbWVyZ2UgdGV4dCB3aXRoIGFkamFjZW50IHRleHRcblx0XHRcdFx0XHRpZiAoaSA8IHRva2Vucy5sZW5ndGggLSAxICYmICh0eXBlb2YgdG9rZW5zW2kgKyAxXSA9PT0gJ3N0cmluZycgfHwgdG9rZW5zW2kgKyAxXS50eXBlID09PSAncGxhaW4tdGV4dCcpKSB7XG5cdFx0XHRcdFx0XHRwbGFpblRleHQgKz0gc3RyaW5naWZ5VG9rZW4odG9rZW5zW2kgKyAxXSk7XG5cdFx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKGkgKyAxLCAxKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGkgPiAwICYmICh0eXBlb2YgdG9rZW5zW2kgLSAxXSA9PT0gJ3N0cmluZycgfHwgdG9rZW5zW2kgLSAxXS50eXBlID09PSAncGxhaW4tdGV4dCcpKSB7XG5cdFx0XHRcdFx0XHRwbGFpblRleHQgPSBzdHJpbmdpZnlUb2tlbih0b2tlbnNbaSAtIDFdKSArIHBsYWluVGV4dDtcblx0XHRcdFx0XHRcdHRva2Vucy5zcGxpY2UoaSAtIDEsIDEpO1xuXHRcdFx0XHRcdFx0aS0tO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICgvXlxccyskLy50ZXN0KHBsYWluVGV4dCkpIHtcblx0XHRcdFx0XHRcdHRva2Vuc1tpXSA9IHBsYWluVGV4dDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dG9rZW5zW2ldID0gbmV3IFByaXNtLlRva2VuKCdwbGFpbi10ZXh0JywgcGxhaW5UZXh0LCBudWxsLCBwbGFpblRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodG9rZW4uY29udGVudCAmJiB0eXBlb2YgdG9rZW4uY29udGVudCAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0d2Fsa1Rva2Vucyh0b2tlbi5jb250ZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRpZiAoZW52Lmxhbmd1YWdlICE9PSAneHF1ZXJ5Jykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR3YWxrVG9rZW5zKGVudi50b2tlbnMpO1xuXHR9KTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMueWFuZyA9IHtcblx0Ly8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYwMjAjcGFnZS0zNFxuXHQvLyBodHRwOi8vd3d3LnlhbmctY2VudHJhbC5vcmcvdHdpa2kvYmluL3ZpZXcvTWFpbi9ZYW5nRXhhbXBsZXNcblx0J2NvbW1lbnQnOiAvXFwvXFwqW1xcc1xcU10qP1xcKlxcL3xcXC9cXC8uKi8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cXFxcXCJdfFxcXFwuKSpcInwnW14nXSonLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiB7XG5cdFx0cGF0dGVybjogLyhefFt7fTtcXHJcXG5dWyBcXHRdKilbYS16X11bXFx3Li1dKi9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J25hbWVzcGFjZSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxccylbYS16X11bXFx3Li1dKig/PTopL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdvcGVyYXRvcic6IC9cXCsvLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9OzpdL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdGZ1bmN0aW9uIGxpdGVyYWwoc3RyKSB7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0cjsgfTtcblx0fVxuXG5cdHZhciBrZXl3b3JkID0gL1xcYig/OmFsaWdufGFsbG93emVyb3xhbmR8YW55ZnJhbWV8YW55dHlwZXxhc218YXN5bmN8YXdhaXR8YnJlYWt8Y2FuY2VsfGNhdGNofGNvbXB0aW1lfGNvbnN0fGNvbnRpbnVlfGRlZmVyfGVsc2V8ZW51bXxlcnJkZWZlcnxlcnJvcnxleHBvcnR8ZXh0ZXJufGZufGZvcnxpZnxpbmxpbmV8bGlua3NlY3Rpb258bmFrZWRjY3xub2FsaWFzfG5vc3VzcGVuZHxudWxsfG9yfG9yZWxzZXxwYWNrZWR8cHJvbWlzZXxwdWJ8cmVzdW1lfHJldHVybnxzdGRjYWxsY2N8c3RydWN0fHN1c3BlbmR8c3dpdGNofHRlc3R8dGhyZWFkbG9jYWx8dHJ5fHVuZGVmaW5lZHx1bmlvbnx1bnJlYWNoYWJsZXx1c2luZ25hbWVzcGFjZXx2YXJ8dm9sYXRpbGV8d2hpbGUpXFxiLztcblxuXHR2YXIgSURFTlRJRklFUiA9ICdcXFxcYig/IScgKyBrZXl3b3JkLnNvdXJjZSArICcpKD8hXFxcXGQpXFxcXHcrXFxcXGInO1xuXHR2YXIgQUxJR04gPSAvYWxpZ25cXHMqXFwoKD86W14oKV18XFwoW14oKV0qXFwpKSpcXCkvLnNvdXJjZTtcblx0dmFyIFBSRUZJWF9UWVBFX09QID0gLyg/OlxcP3xcXGJwcm9taXNlLT58KD86XFxbW15bXFxdXSpcXF18XFwqKD8hXFwqKXxcXCpcXCopKD86XFxzKjxBTElHTj58XFxzKmNvbnN0XFxifFxccyp2b2xhdGlsZVxcYnxcXHMqYWxsb3d6ZXJvXFxiKSopLy5zb3VyY2UucmVwbGFjZSgvPEFMSUdOPi9nLCBsaXRlcmFsKEFMSUdOKSk7XG5cdHZhciBTVUZGSVhfRVhQUiA9IC8oPzpcXGJwcm9taXNlXFxifCg/OlxcYmVycm9yXFwuKT88SUQ+KD86XFwuPElEPikqKD8hXFxzKzxJRD4pKS8uc291cmNlLnJlcGxhY2UoLzxJRD4vZywgbGl0ZXJhbChJREVOVElGSUVSKSk7XG5cdHZhciBUWVBFID0gJyg/IVxcXFxzKSg/OiE/XFxcXHMqKD86JyArIFBSRUZJWF9UWVBFX09QICsgJ1xcXFxzKikqJyArIFNVRkZJWF9FWFBSICsgJykrJztcblxuXHQvKlxuXHQgKiBBIHNpbXBsaWZpZWQgZ3JhbW1hciBmb3IgWmlnIGNvbXBpbGUgdGltZSB0eXBlIGxpdGVyYWxzOlxuXHQgKlxuXHQgKiBUeXBlRXhwciA9ICggXCIhXCI/IFBSRUZJWF9UWVBFX09QKiBTVUZGSVhfRVhQUiApK1xuXHQgKlxuXHQgKiBTVUZGSVhfRVhQUiA9ICggXFxiIFwicHJvbWlzZVwiIFxcYiB8ICggXFxiIFwiZXJyb3JcIiBcIi5cIiApPyBJREVOVElGSUVSICggXCIuXCIgSURFTlRJRklFUiApKiAoPyEgXFxzKyBJREVOVElGSUVSICkgKVxuXHQgKlxuXHQgKiBQUkVGSVhfVFlQRV9PUCA9IFwiP1wiXG5cdCAqICAgICAgICAgICAgICAgIHwgXFxiIFwicHJvbWlzZVwiIFwiLT5cIlxuXHQgKiAgICAgICAgICAgICAgICB8ICggXCJbXCIgW15cXFtcXF1dKiBcIl1cIiB8IFwiKlwiIHwgXCIqKlwiICkgKCBBTElHTiB8IFwiY29uc3RcIiBcXGIgfCBcInZvbGF0aWxlXCIgXFxiIHwgXCJhbGxvd3plcm9cIiBcXGIgKSpcblx0ICpcblx0ICogQUxJR04gPSBcImFsaWduXCIgXCIoXCIgKCBbXigpXSB8IFwiKFwiIFteKCldKiBcIilcIiApKiBcIilcIlxuXHQgKlxuXHQgKiBJREVOVElGSUVSID0gXFxiICg/ISBLRVlXT1JEICkgW2EtekEtWl9dIFxcdyogXFxiXG5cdCAqXG5cdCovXG5cblx0UHJpc20ubGFuZ3VhZ2VzLnppZyA9IHtcblx0XHQnY29tbWVudCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcL1xcL1svIV0uKi8sXG5cdFx0XHRcdGFsaWFzOiAnZG9jLWNvbW1lbnQnXG5cdFx0XHR9LFxuXHRcdFx0L1xcL3syfS4qL1xuXHRcdF0sXG5cdFx0J3N0cmluZyc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gXCJzdHJpbmdcIiBhbmQgY1wic3RyaW5nXCJcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXEBdKWM/XCIoPzpbXlwiXFxcXFxcclxcbl18XFxcXC4pKlwiLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBtdWx0aWxpbmUgc3RyaW5ncyBhbmQgYy1zdHJpbmdzXG5cdFx0XHRcdHBhdHRlcm46IC8oW1xcclxcbl0pKFsgXFx0XStjP1xcXFx7Mn0pLiooPzooPzpcXHJcXG4/fFxcbilcXDIuKikqLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnY2hhcic6IHtcblx0XHRcdC8vIGNoYXJhY3RlcnMgJ2EnLCAnXFxuJywgJ1xceEZGJywgJ1xcdXsxMEZGRkZ9J1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pJyg/OlteJ1xcXFxcXHJcXG5dfFtcXHVEODAwLVxcdURGRkZdezJ9fFxcXFwoPzoufHhbYS1mQS1GXFxkXXsyfXx1XFx7W2EtZkEtRlxcZF17MSw2fVxcfSkpJy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnYnVpbHRpbic6IC9cXEJAKD8hXFxkKVxcdysoPz1cXHMqXFwoKS8sXG5cdFx0J2xhYmVsJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGIoPzpicmVha3xjb250aW51ZSlcXHMqOlxccyopXFx3K1xcYnxcXGIoPyFcXGQpXFx3K1xcYig/PVxccyo6XFxzKig/Olxce3x3aGlsZVxcYikpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdjbGFzcy1uYW1lJzogW1xuXHRcdFx0Ly8gY29uc3QgRm9vID0gc3RydWN0IHt9O1xuXHRcdFx0L1xcYig/IVxcZClcXHcrKD89XFxzKj1cXHMqKD86KD86ZXh0ZXJufHBhY2tlZClcXHMrKT8oPzplbnVtfHN0cnVjdHx1bmlvbilcXHMqWyh7XSkvLFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBjb25zdCB4OiBpMzIgPSA5O1xuXHRcdFx0XHQvLyB2YXIgeDogQmFyO1xuXHRcdFx0XHQvLyBmbiBmb28oeDogYm9vbCwgeTogZjMyKSB2b2lkIHt9XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKDpcXHMqKTxUWVBFPig/PVxccyooPzo8QUxJR04+XFxzKik/Wz07LCldKXw8VFlQRT4oPz1cXHMqKD86PEFMSUdOPlxccyopP1xceykvLnNvdXJjZS5yZXBsYWNlKC88VFlQRT4vZywgbGl0ZXJhbChUWVBFKSkucmVwbGFjZSgvPEFMSUdOPi9nLCBsaXRlcmFsKEFMSUdOKSkpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBleHRlcm4gZm4gZm9vKHg6IGY2NCkgZjY0OyAob3B0aW9uYWwgYWxpZ25tZW50KVxuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhcXClcXHMqKTxUWVBFPig/PVxccyooPzo8QUxJR04+XFxzKik/OykvLnNvdXJjZS5yZXBsYWNlKC88VFlQRT4vZywgbGl0ZXJhbChUWVBFKSkucmVwbGFjZSgvPEFMSUdOPi9nLCBsaXRlcmFsKEFMSUdOKSkpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnYnVpbHRpbi10eXBlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYig/OmFueWVycm9yfGJvb2x8Y191Pyg/OmludHxsb25nfGxvbmdsb25nfHNob3J0KXxjX2xvbmdkb3VibGV8Y192b2lkfGNvbXB0aW1lXyg/OmZsb2F0fGludCl8Zig/OjE2fDMyfDY0fDEyOCl8W2l1XSg/Ojh8MTZ8MzJ8NjR8MTI4fHNpemUpfG5vcmV0dXJufHR5cGV8dm9pZClcXGIvLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiBrZXl3b3JkLFxuXHRcdCdmdW5jdGlvbic6IC9cXGIoPyFcXGQpXFx3Kyg/PVxccypcXCgpLyxcblx0XHQnbnVtYmVyJzogL1xcYig/OjBiWzAxXSt8MG9bMC03XSt8MHhbYS1mQS1GXFxkXSsoPzpcXC5bYS1mQS1GXFxkXSopPyg/OltwUF1bKy1dP1thLWZBLUZcXGRdKyk/fFxcZCsoPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pXFxiLyxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdFx0J29wZXJhdG9yJzogL1xcLlsqP118XFwuezIsM318Wy09XT58XFwqXFwqfFxcK1xcK3xcXHxcXHx8KD86PDx8Pj58Wy0rKl0lfFstKyovJV4mfDw+IT1dKT0/fFs/fl0vLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bLjosOygpe31bXFxdXS9cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuemlnWydjbGFzcy1uYW1lJ10uZm9yRWFjaChmdW5jdGlvbiAob2JqKSB7XG5cdFx0aWYgKG9iai5pbnNpZGUgPT09IG51bGwpIHtcblx0XHRcdG9iai5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuemlnO1xuXHRcdH1cblx0fSk7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uICgpIHtcblxuXHRpZiAodHlwZW9mIFByaXNtID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBsdWdpbiBuYW1lIHdoaWNoIGlzIHVzZWQgYXMgYSBjbGFzcyBuYW1lIGZvciA8cHJlPiB3aGljaCBpcyBhY3RpdmF0aW5nIHRoZSBwbHVnaW5cblx0ICpcblx0ICogQHR5cGUge3N0cmluZ31cblx0ICovXG5cdHZhciBQTFVHSU5fTkFNRSA9ICdsaW5lLW51bWJlcnMnO1xuXG5cdC8qKlxuXHQgKiBSZWd1bGFyIGV4cHJlc3Npb24gdXNlZCBmb3IgZGV0ZXJtaW5pbmcgbGluZSBicmVha3Ncblx0ICpcblx0ICogQHR5cGUge1JlZ0V4cH1cblx0ICovXG5cdHZhciBORVdfTElORV9FWFAgPSAvXFxuKD8hJCkvZztcblxuXG5cdC8qKlxuXHQgKiBHbG9iYWwgZXhwb3J0c1xuXHQgKi9cblx0dmFyIGNvbmZpZyA9IFByaXNtLnBsdWdpbnMubGluZU51bWJlcnMgPSB7XG5cdFx0LyoqXG5cdFx0ICogR2V0IG5vZGUgZm9yIHByb3ZpZGVkIGxpbmUgbnVtYmVyXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgcHJlIGVsZW1lbnRcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIGxpbmUgbnVtYmVyXG5cdFx0ICogQHJldHVybnMge0VsZW1lbnR8dW5kZWZpbmVkfVxuXHRcdCAqL1xuXHRcdGdldExpbmU6IGZ1bmN0aW9uIChlbGVtZW50LCBudW1iZXIpIHtcblx0XHRcdGlmIChlbGVtZW50LnRhZ05hbWUgIT09ICdQUkUnIHx8ICFlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhQTFVHSU5fTkFNRSkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbGluZU51bWJlclJvd3MgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5saW5lLW51bWJlcnMtcm93cycpO1xuXHRcdFx0aWYgKCFsaW5lTnVtYmVyUm93cykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR2YXIgbGluZU51bWJlclN0YXJ0ID0gcGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhcnQnKSwgMTApIHx8IDE7XG5cdFx0XHR2YXIgbGluZU51bWJlckVuZCA9IGxpbmVOdW1iZXJTdGFydCArIChsaW5lTnVtYmVyUm93cy5jaGlsZHJlbi5sZW5ndGggLSAxKTtcblxuXHRcdFx0aWYgKG51bWJlciA8IGxpbmVOdW1iZXJTdGFydCkge1xuXHRcdFx0XHRudW1iZXIgPSBsaW5lTnVtYmVyU3RhcnQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAobnVtYmVyID4gbGluZU51bWJlckVuZCkge1xuXHRcdFx0XHRudW1iZXIgPSBsaW5lTnVtYmVyRW5kO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbGluZUluZGV4ID0gbnVtYmVyIC0gbGluZU51bWJlclN0YXJ0O1xuXG5cdFx0XHRyZXR1cm4gbGluZU51bWJlclJvd3MuY2hpbGRyZW5bbGluZUluZGV4XTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogUmVzaXplcyB0aGUgbGluZSBudW1iZXJzIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuXHRcdCAqXG5cdFx0ICogVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBhZGQgbGluZSBudW1iZXJzLiBJdCB3aWxsIG9ubHkgcmVzaXplIGV4aXN0aW5nIG9uZXMuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IEEgYDxwcmU+YCBlbGVtZW50IHdpdGggbGluZSBudW1iZXJzLlxuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxuXHRcdCAqL1xuXHRcdHJlc2l6ZTogZnVuY3Rpb24gKGVsZW1lbnQpIHtcblx0XHRcdHJlc2l6ZUVsZW1lbnRzKFtlbGVtZW50XSk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFdoZXRoZXIgdGhlIHBsdWdpbiBjYW4gYXNzdW1lIHRoYXQgdGhlIHVuaXRzIGZvbnQgc2l6ZXMgYW5kIG1hcmdpbnMgYXJlIG5vdCBkZXBlbmRlZCBvbiB0aGUgc2l6ZSBvZlxuXHRcdCAqIHRoZSBjdXJyZW50IHZpZXdwb3J0LlxuXHRcdCAqXG5cdFx0ICogU2V0dGluZyB0aGlzIHRvIGB0cnVlYCB3aWxsIGFsbG93IHRoZSBwbHVnaW4gdG8gZG8gY2VydGFpbiBvcHRpbWl6YXRpb25zIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuXG5cdFx0ICpcblx0XHQgKiBTZXQgdGhpcyB0byBgZmFsc2VgIGlmIHlvdSB1c2UgYW55IG9mIHRoZSBmb2xsb3dpbmcgQ1NTIHVuaXRzOiBgdmhgLCBgdndgLCBgdm1pbmAsIGB2bWF4YC5cblx0XHQgKlxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxuXHRcdCAqL1xuXHRcdGFzc3VtZVZpZXdwb3J0SW5kZXBlbmRlbmNlOiB0cnVlXG5cdH07XG5cblx0LyoqXG5cdCAqIFJlc2l6ZXMgdGhlIGdpdmVuIGVsZW1lbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50W119IGVsZW1lbnRzXG5cdCAqL1xuXHRmdW5jdGlvbiByZXNpemVFbGVtZW50cyhlbGVtZW50cykge1xuXHRcdGVsZW1lbnRzID0gZWxlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG5cdFx0XHR2YXIgY29kZVN0eWxlcyA9IGdldFN0eWxlcyhlKTtcblx0XHRcdHZhciB3aGl0ZVNwYWNlID0gY29kZVN0eWxlc1snd2hpdGUtc3BhY2UnXTtcblx0XHRcdHJldHVybiB3aGl0ZVNwYWNlID09PSAncHJlLXdyYXAnIHx8IHdoaXRlU3BhY2UgPT09ICdwcmUtbGluZSc7XG5cdFx0fSk7XG5cblx0XHRpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgaW5mb3MgPSBlbGVtZW50cy5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcblx0XHRcdHZhciBjb2RlRWxlbWVudCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignY29kZScpO1xuXHRcdFx0dmFyIGxpbmVOdW1iZXJzV3JhcHBlciA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmxpbmUtbnVtYmVycy1yb3dzJyk7XG5cdFx0XHRpZiAoIWNvZGVFbGVtZW50IHx8ICFsaW5lTnVtYmVyc1dyYXBwZXIpIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0LyoqIEB0eXBlIHtIVE1MRWxlbWVudH0gKi9cblx0XHRcdHZhciBsaW5lTnVtYmVyU2l6ZXIgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5saW5lLW51bWJlcnMtc2l6ZXInKTtcblx0XHRcdHZhciBjb2RlTGluZXMgPSBjb2RlRWxlbWVudC50ZXh0Q29udGVudC5zcGxpdChORVdfTElORV9FWFApO1xuXG5cdFx0XHRpZiAoIWxpbmVOdW1iZXJTaXplcikge1xuXHRcdFx0XHRsaW5lTnVtYmVyU2l6ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cdFx0XHRcdGxpbmVOdW1iZXJTaXplci5jbGFzc05hbWUgPSAnbGluZS1udW1iZXJzLXNpemVyJztcblxuXHRcdFx0XHRjb2RlRWxlbWVudC5hcHBlbmRDaGlsZChsaW5lTnVtYmVyU2l6ZXIpO1xuXHRcdFx0fVxuXG5cdFx0XHRsaW5lTnVtYmVyU2l6ZXIuaW5uZXJIVE1MID0gJzAnO1xuXHRcdFx0bGluZU51bWJlclNpemVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG5cdFx0XHR2YXIgb25lTGluZXJIZWlnaHQgPSBsaW5lTnVtYmVyU2l6ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXHRcdFx0bGluZU51bWJlclNpemVyLmlubmVySFRNTCA9ICcnO1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRlbGVtZW50OiBlbGVtZW50LFxuXHRcdFx0XHRsaW5lczogY29kZUxpbmVzLFxuXHRcdFx0XHRsaW5lSGVpZ2h0czogW10sXG5cdFx0XHRcdG9uZUxpbmVySGVpZ2h0OiBvbmVMaW5lckhlaWdodCxcblx0XHRcdFx0c2l6ZXI6IGxpbmVOdW1iZXJTaXplcixcblx0XHRcdH07XG5cdFx0fSkuZmlsdGVyKEJvb2xlYW4pO1xuXG5cdFx0aW5mb3MuZm9yRWFjaChmdW5jdGlvbiAoaW5mbykge1xuXHRcdFx0dmFyIGxpbmVOdW1iZXJTaXplciA9IGluZm8uc2l6ZXI7XG5cdFx0XHR2YXIgbGluZXMgPSBpbmZvLmxpbmVzO1xuXHRcdFx0dmFyIGxpbmVIZWlnaHRzID0gaW5mby5saW5lSGVpZ2h0cztcblx0XHRcdHZhciBvbmVMaW5lckhlaWdodCA9IGluZm8ub25lTGluZXJIZWlnaHQ7XG5cblx0XHRcdGxpbmVIZWlnaHRzW2xpbmVzLmxlbmd0aCAtIDFdID0gdW5kZWZpbmVkO1xuXHRcdFx0bGluZXMuZm9yRWFjaChmdW5jdGlvbiAobGluZSwgaW5kZXgpIHtcblx0XHRcdFx0aWYgKGxpbmUgJiYgbGluZS5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0dmFyIGUgPSBsaW5lTnVtYmVyU2l6ZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpKTtcblx0XHRcdFx0XHRlLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXHRcdFx0XHRcdGUudGV4dENvbnRlbnQgPSBsaW5lO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGxpbmVIZWlnaHRzW2luZGV4XSA9IG9uZUxpbmVySGVpZ2h0O1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdGluZm9zLmZvckVhY2goZnVuY3Rpb24gKGluZm8pIHtcblx0XHRcdHZhciBsaW5lTnVtYmVyU2l6ZXIgPSBpbmZvLnNpemVyO1xuXHRcdFx0dmFyIGxpbmVIZWlnaHRzID0gaW5mby5saW5lSGVpZ2h0cztcblxuXHRcdFx0dmFyIGNoaWxkSW5kZXggPSAwO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lSGVpZ2h0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAobGluZUhlaWdodHNbaV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGxpbmVIZWlnaHRzW2ldID0gbGluZU51bWJlclNpemVyLmNoaWxkcmVuW2NoaWxkSW5kZXgrK10uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRpbmZvcy5mb3JFYWNoKGZ1bmN0aW9uIChpbmZvKSB7XG5cdFx0XHR2YXIgbGluZU51bWJlclNpemVyID0gaW5mby5zaXplcjtcblx0XHRcdHZhciB3cmFwcGVyID0gaW5mby5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5saW5lLW51bWJlcnMtcm93cycpO1xuXG5cdFx0XHRsaW5lTnVtYmVyU2l6ZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdGxpbmVOdW1iZXJTaXplci5pbm5lckhUTUwgPSAnJztcblxuXHRcdFx0aW5mby5saW5lSGVpZ2h0cy5mb3JFYWNoKGZ1bmN0aW9uIChoZWlnaHQsIGxpbmVOdW1iZXIpIHtcblx0XHRcdFx0d3JhcHBlci5jaGlsZHJlbltsaW5lTnVtYmVyXS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBzdHlsZSBkZWNsYXJhdGlvbnMgZm9yIHRoZSBlbGVtZW50XG5cdCAqXG5cdCAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0U3R5bGVzKGVsZW1lbnQpIHtcblx0XHRpZiAoIWVsZW1lbnQpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdHJldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSA/IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkgOiAoZWxlbWVudC5jdXJyZW50U3R5bGUgfHwgbnVsbCk7XG5cdH1cblxuXHR2YXIgbGFzdFdpZHRoID0gdW5kZWZpbmVkO1xuXHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuXHRcdGlmIChjb25maWcuYXNzdW1lVmlld3BvcnRJbmRlcGVuZGVuY2UgJiYgbGFzdFdpZHRoID09PSB3aW5kb3cuaW5uZXJXaWR0aCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRsYXN0V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcblxuXHRcdHJlc2l6ZUVsZW1lbnRzKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3ByZS4nICsgUExVR0lOX05BTUUpKSk7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnY29tcGxldGUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0aWYgKCFlbnYuY29kZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBjb2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAoZW52LmVsZW1lbnQpO1xuXHRcdHZhciBwcmUgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqLyAoY29kZS5wYXJlbnROb2RlKTtcblxuXHRcdC8vIHdvcmtzIG9ubHkgZm9yIDxjb2RlPiB3cmFwcGVkIGluc2lkZSA8cHJlPiAobm90IGlubGluZSlcblx0XHRpZiAoIXByZSB8fCAhL3ByZS9pLnRlc3QocHJlLm5vZGVOYW1lKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIEFib3J0IGlmIGxpbmUgbnVtYmVycyBhbHJlYWR5IGV4aXN0c1xuXHRcdGlmIChjb2RlLnF1ZXJ5U2VsZWN0b3IoJy5saW5lLW51bWJlcnMtcm93cycpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gb25seSBhZGQgbGluZSBudW1iZXJzIGlmIDxjb2RlPiBvciBvbmUgb2YgaXRzIGFuY2VzdG9ycyBoYXMgdGhlIGBsaW5lLW51bWJlcnNgIGNsYXNzXG5cdFx0aWYgKCFQcmlzbS51dGlsLmlzQWN0aXZlKGNvZGUsIFBMVUdJTl9OQU1FKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSB0aGUgY2xhc3MgJ2xpbmUtbnVtYmVycycgZnJvbSB0aGUgPGNvZGU+XG5cdFx0Y29kZS5jbGFzc0xpc3QucmVtb3ZlKFBMVUdJTl9OQU1FKTtcblx0XHQvLyBBZGQgdGhlIGNsYXNzICdsaW5lLW51bWJlcnMnIHRvIHRoZSA8cHJlPlxuXHRcdHByZS5jbGFzc0xpc3QuYWRkKFBMVUdJTl9OQU1FKTtcblxuXHRcdHZhciBtYXRjaCA9IGVudi5jb2RlLm1hdGNoKE5FV19MSU5FX0VYUCk7XG5cdFx0dmFyIGxpbmVzTnVtID0gbWF0Y2ggPyBtYXRjaC5sZW5ndGggKyAxIDogMTtcblx0XHR2YXIgbGluZU51bWJlcnNXcmFwcGVyO1xuXG5cdFx0dmFyIGxpbmVzID0gbmV3IEFycmF5KGxpbmVzTnVtICsgMSkuam9pbignPHNwYW4+PC9zcGFuPicpO1xuXG5cdFx0bGluZU51bWJlcnNXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXHRcdGxpbmVOdW1iZXJzV3JhcHBlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcblx0XHRsaW5lTnVtYmVyc1dyYXBwZXIuY2xhc3NOYW1lID0gJ2xpbmUtbnVtYmVycy1yb3dzJztcblx0XHRsaW5lTnVtYmVyc1dyYXBwZXIuaW5uZXJIVE1MID0gbGluZXM7XG5cblx0XHRpZiAocHJlLmhhc0F0dHJpYnV0ZSgnZGF0YS1zdGFydCcpKSB7XG5cdFx0XHRwcmUuc3R5bGUuY291bnRlclJlc2V0ID0gJ2xpbmVudW1iZXIgJyArIChwYXJzZUludChwcmUuZ2V0QXR0cmlidXRlKCdkYXRhLXN0YXJ0JyksIDEwKSAtIDEpO1xuXHRcdH1cblxuXHRcdGVudi5lbGVtZW50LmFwcGVuZENoaWxkKGxpbmVOdW1iZXJzV3JhcHBlcik7XG5cblx0XHRyZXNpemVFbGVtZW50cyhbcHJlXSk7XG5cblx0XHRQcmlzbS5ob29rcy5ydW4oJ2xpbmUtbnVtYmVycycsIGVudik7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnbGluZS1udW1iZXJzJywgZnVuY3Rpb24gKGVudikge1xuXHRcdGVudi5wbHVnaW5zID0gZW52LnBsdWdpbnMgfHwge307XG5cdFx0ZW52LnBsdWdpbnMubGluZU51bWJlcnMgPSB0cnVlO1xuXHR9KTtcblxufSgpKTtcblxuKGZ1bmN0aW9uICgpIHtcblxuXHRpZiAodHlwZW9mIFByaXNtID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvbWF0Y2hlcyNQb2x5ZmlsbFxuXHRpZiAoIUVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMpIHtcblx0XHRFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzID0gRWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1xuXHR9XG5cblx0dmFyIExPQURJTkdfTUVTU0FHRSA9ICdMb2FkaW5nXHUyMDI2Jztcblx0dmFyIEZBSUxVUkVfTUVTU0FHRSA9IGZ1bmN0aW9uIChzdGF0dXMsIG1lc3NhZ2UpIHtcblx0XHRyZXR1cm4gJ1x1MjcxNiBFcnJvciAnICsgc3RhdHVzICsgJyB3aGlsZSBmZXRjaGluZyBmaWxlOiAnICsgbWVzc2FnZTtcblx0fTtcblx0dmFyIEZBSUxVUkVfRU1QVFlfTUVTU0FHRSA9ICdcdTI3MTYgRXJyb3I6IEZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaXMgZW1wdHknO1xuXG5cdHZhciBFWFRFTlNJT05TID0ge1xuXHRcdCdqcyc6ICdqYXZhc2NyaXB0Jyxcblx0XHQncHknOiAncHl0aG9uJyxcblx0XHQncmInOiAncnVieScsXG5cdFx0J3BzMSc6ICdwb3dlcnNoZWxsJyxcblx0XHQncHNtMSc6ICdwb3dlcnNoZWxsJyxcblx0XHQnc2gnOiAnYmFzaCcsXG5cdFx0J2JhdCc6ICdiYXRjaCcsXG5cdFx0J2gnOiAnYycsXG5cdFx0J3RleCc6ICdsYXRleCdcblx0fTtcblxuXHR2YXIgU1RBVFVTX0FUVFIgPSAnZGF0YS1zcmMtc3RhdHVzJztcblx0dmFyIFNUQVRVU19MT0FESU5HID0gJ2xvYWRpbmcnO1xuXHR2YXIgU1RBVFVTX0xPQURFRCA9ICdsb2FkZWQnO1xuXHR2YXIgU1RBVFVTX0ZBSUxFRCA9ICdmYWlsZWQnO1xuXG5cdHZhciBTRUxFQ1RPUiA9ICdwcmVbZGF0YS1zcmNdOm5vdChbJyArIFNUQVRVU19BVFRSICsgJz1cIicgKyBTVEFUVVNfTE9BREVEICsgJ1wiXSknXG5cdFx0KyAnOm5vdChbJyArIFNUQVRVU19BVFRSICsgJz1cIicgKyBTVEFUVVNfTE9BRElORyArICdcIl0pJztcblxuXHQvKipcblx0ICogTG9hZHMgdGhlIGdpdmVuIGZpbGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgVGhlIFVSTCBvciBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZSB0byBsb2FkLlxuXHQgKiBAcGFyYW0geyhyZXN1bHQ6IHN0cmluZykgPT4gdm9pZH0gc3VjY2Vzc1xuXHQgKiBAcGFyYW0geyhyZWFzb246IHN0cmluZykgPT4gdm9pZH0gZXJyb3Jcblx0ICovXG5cdGZ1bmN0aW9uIGxvYWRGaWxlKHNyYywgc3VjY2VzcywgZXJyb3IpIHtcblx0XHR2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cdFx0eGhyLm9wZW4oJ0dFVCcsIHNyYywgdHJ1ZSk7XG5cdFx0eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmICh4aHIucmVhZHlTdGF0ZSA9PSA0KSB7XG5cdFx0XHRcdGlmICh4aHIuc3RhdHVzIDwgNDAwICYmIHhoci5yZXNwb25zZVRleHQpIHtcblx0XHRcdFx0XHRzdWNjZXNzKHhoci5yZXNwb25zZVRleHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmICh4aHIuc3RhdHVzID49IDQwMCkge1xuXHRcdFx0XHRcdFx0ZXJyb3IoRkFJTFVSRV9NRVNTQUdFKHhoci5zdGF0dXMsIHhoci5zdGF0dXNUZXh0KSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGVycm9yKEZBSUxVUkVfRU1QVFlfTUVTU0FHRSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHR4aHIuc2VuZChudWxsKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQYXJzZXMgdGhlIGdpdmVuIHJhbmdlLlxuXHQgKlxuXHQgKiBUaGlzIHJldHVybnMgYSByYW5nZSB3aXRoIGluY2x1c2l2ZSBlbmRzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IHJhbmdlXG5cdCAqIEByZXR1cm5zIHtbbnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWRdIHwgdW5kZWZpbmVkfVxuXHQgKi9cblx0ZnVuY3Rpb24gcGFyc2VSYW5nZShyYW5nZSkge1xuXHRcdHZhciBtID0gL15cXHMqKFxcZCspXFxzKig/OigsKVxccyooPzooXFxkKylcXHMqKT8pPyQvLmV4ZWMocmFuZ2UgfHwgJycpO1xuXHRcdGlmIChtKSB7XG5cdFx0XHR2YXIgc3RhcnQgPSBOdW1iZXIobVsxXSk7XG5cdFx0XHR2YXIgY29tbWEgPSBtWzJdO1xuXHRcdFx0dmFyIGVuZCA9IG1bM107XG5cblx0XHRcdGlmICghY29tbWEpIHtcblx0XHRcdFx0cmV0dXJuIFtzdGFydCwgc3RhcnRdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFlbmQpIHtcblx0XHRcdFx0cmV0dXJuIFtzdGFydCwgdW5kZWZpbmVkXTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBbc3RhcnQsIE51bWJlcihlbmQpXTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLWhpZ2hsaWdodGFsbCcsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRlbnYuc2VsZWN0b3IgKz0gJywgJyArIFNFTEVDVE9SO1xuXHR9KTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS1zYW5pdHktY2hlY2snLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0dmFyIHByZSA9IC8qKiBAdHlwZSB7SFRNTFByZUVsZW1lbnR9ICovIChlbnYuZWxlbWVudCk7XG5cdFx0aWYgKHByZS5tYXRjaGVzKFNFTEVDVE9SKSkge1xuXHRcdFx0ZW52LmNvZGUgPSAnJzsgLy8gZmFzdC1wYXRoIHRoZSB3aG9sZSB0aGluZyBhbmQgZ28gdG8gY29tcGxldGVcblxuXHRcdFx0cHJlLnNldEF0dHJpYnV0ZShTVEFUVVNfQVRUUiwgU1RBVFVTX0xPQURJTkcpOyAvLyBtYXJrIGFzIGxvYWRpbmdcblxuXHRcdFx0Ly8gYWRkIGNvZGUgZWxlbWVudCB3aXRoIGxvYWRpbmcgbWVzc2FnZVxuXHRcdFx0dmFyIGNvZGUgPSBwcmUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnQ09ERScpKTtcblx0XHRcdGNvZGUudGV4dENvbnRlbnQgPSBMT0FESU5HX01FU1NBR0U7XG5cblx0XHRcdHZhciBzcmMgPSBwcmUuZ2V0QXR0cmlidXRlKCdkYXRhLXNyYycpO1xuXG5cdFx0XHR2YXIgbGFuZ3VhZ2UgPSBlbnYubGFuZ3VhZ2U7XG5cdFx0XHRpZiAobGFuZ3VhZ2UgPT09ICdub25lJykge1xuXHRcdFx0XHQvLyB0aGUgbGFuZ3VhZ2UgbWlnaHQgYmUgJ25vbmUnIGJlY2F1c2UgdGhlcmUgaXMgbm8gbGFuZ3VhZ2Ugc2V0O1xuXHRcdFx0XHQvLyBpbiB0aGlzIGNhc2UsIHdlIHdhbnQgdG8gdXNlIHRoZSBleHRlbnNpb24gYXMgdGhlIGxhbmd1YWdlXG5cdFx0XHRcdHZhciBleHRlbnNpb24gPSAoL1xcLihcXHcrKSQvLmV4ZWMoc3JjKSB8fCBbLCAnbm9uZSddKVsxXTtcblx0XHRcdFx0bGFuZ3VhZ2UgPSBFWFRFTlNJT05TW2V4dGVuc2lvbl0gfHwgZXh0ZW5zaW9uO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBzZXQgbGFuZ3VhZ2UgY2xhc3Nlc1xuXHRcdFx0UHJpc20udXRpbC5zZXRMYW5ndWFnZShjb2RlLCBsYW5ndWFnZSk7XG5cdFx0XHRQcmlzbS51dGlsLnNldExhbmd1YWdlKHByZSwgbGFuZ3VhZ2UpO1xuXG5cdFx0XHQvLyBwcmVsb2FkIHRoZSBsYW5ndWFnZVxuXHRcdFx0dmFyIGF1dG9sb2FkZXIgPSBQcmlzbS5wbHVnaW5zLmF1dG9sb2FkZXI7XG5cdFx0XHRpZiAoYXV0b2xvYWRlcikge1xuXHRcdFx0XHRhdXRvbG9hZGVyLmxvYWRMYW5ndWFnZXMobGFuZ3VhZ2UpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBsb2FkIGZpbGVcblx0XHRcdGxvYWRGaWxlKFxuXHRcdFx0XHRzcmMsXG5cdFx0XHRcdGZ1bmN0aW9uICh0ZXh0KSB7XG5cdFx0XHRcdFx0Ly8gbWFyayBhcyBsb2FkZWRcblx0XHRcdFx0XHRwcmUuc2V0QXR0cmlidXRlKFNUQVRVU19BVFRSLCBTVEFUVVNfTE9BREVEKTtcblxuXHRcdFx0XHRcdC8vIGhhbmRsZSBkYXRhLXJhbmdlXG5cdFx0XHRcdFx0dmFyIHJhbmdlID0gcGFyc2VSYW5nZShwcmUuZ2V0QXR0cmlidXRlKCdkYXRhLXJhbmdlJykpO1xuXHRcdFx0XHRcdGlmIChyYW5nZSkge1xuXHRcdFx0XHRcdFx0dmFyIGxpbmVzID0gdGV4dC5zcGxpdCgvXFxyXFxuP3xcXG4vZyk7XG5cblx0XHRcdFx0XHRcdC8vIHRoZSByYW5nZSBpcyBvbmUtYmFzZWQgYW5kIGluY2x1c2l2ZSBvbiBib3RoIGVuZHNcblx0XHRcdFx0XHRcdHZhciBzdGFydCA9IHJhbmdlWzBdO1xuXHRcdFx0XHRcdFx0dmFyIGVuZCA9IHJhbmdlWzFdID09IG51bGwgPyBsaW5lcy5sZW5ndGggOiByYW5nZVsxXTtcblxuXHRcdFx0XHRcdFx0aWYgKHN0YXJ0IDwgMCkgeyBzdGFydCArPSBsaW5lcy5sZW5ndGg7IH1cblx0XHRcdFx0XHRcdHN0YXJ0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc3RhcnQgLSAxLCBsaW5lcy5sZW5ndGgpKTtcblx0XHRcdFx0XHRcdGlmIChlbmQgPCAwKSB7IGVuZCArPSBsaW5lcy5sZW5ndGg7IH1cblx0XHRcdFx0XHRcdGVuZCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGVuZCwgbGluZXMubGVuZ3RoKSk7XG5cblx0XHRcdFx0XHRcdHRleHQgPSBsaW5lcy5zbGljZShzdGFydCwgZW5kKS5qb2luKCdcXG4nKTtcblxuXHRcdFx0XHRcdFx0Ly8gYWRkIGRhdGEtc3RhcnQgZm9yIGxpbmUgbnVtYmVyc1xuXHRcdFx0XHRcdFx0aWYgKCFwcmUuaGFzQXR0cmlidXRlKCdkYXRhLXN0YXJ0JykpIHtcblx0XHRcdFx0XHRcdFx0cHJlLnNldEF0dHJpYnV0ZSgnZGF0YS1zdGFydCcsIFN0cmluZyhzdGFydCArIDEpKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBoaWdobGlnaHQgY29kZVxuXHRcdFx0XHRcdGNvZGUudGV4dENvbnRlbnQgPSB0ZXh0O1xuXHRcdFx0XHRcdFByaXNtLmhpZ2hsaWdodEVsZW1lbnQoY29kZSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGZ1bmN0aW9uIChlcnJvcikge1xuXHRcdFx0XHRcdC8vIG1hcmsgYXMgZmFpbGVkXG5cdFx0XHRcdFx0cHJlLnNldEF0dHJpYnV0ZShTVEFUVVNfQVRUUiwgU1RBVFVTX0ZBSUxFRCk7XG5cblx0XHRcdFx0XHRjb2RlLnRleHRDb250ZW50ID0gZXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5wbHVnaW5zLmZpbGVIaWdobGlnaHQgPSB7XG5cdFx0LyoqXG5cdFx0ICogRXhlY3V0ZXMgdGhlIEZpbGUgSGlnaGxpZ2h0IHBsdWdpbiBmb3IgYWxsIG1hdGNoaW5nIGBwcmVgIGVsZW1lbnRzIHVuZGVyIHRoZSBnaXZlbiBjb250YWluZXIuXG5cdFx0ICpcblx0XHQgKiBOb3RlOiBFbGVtZW50cyB3aGljaCBhcmUgYWxyZWFkeSBsb2FkZWQgb3IgY3VycmVudGx5IGxvYWRpbmcgd2lsbCBub3QgYmUgdG91Y2hlZCBieSB0aGlzIG1ldGhvZC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gW2NvbnRhaW5lcj1kb2N1bWVudF1cblx0XHQgKi9cblx0XHRoaWdobGlnaHQ6IGZ1bmN0aW9uIGhpZ2hsaWdodChjb250YWluZXIpIHtcblx0XHRcdHZhciBlbGVtZW50cyA9IChjb250YWluZXIgfHwgZG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1IpO1xuXG5cdFx0XHRmb3IgKHZhciBpID0gMCwgZWxlbWVudDsgKGVsZW1lbnQgPSBlbGVtZW50c1tpKytdKTspIHtcblx0XHRcdFx0UHJpc20uaGlnaGxpZ2h0RWxlbWVudChlbGVtZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0dmFyIGxvZ2dlZCA9IGZhbHNlO1xuXHQvKiogQGRlcHJlY2F0ZWQgVXNlIGBQcmlzbS5wbHVnaW5zLmZpbGVIaWdobGlnaHQuaGlnaGxpZ2h0YCBpbnN0ZWFkLiAqL1xuXHRQcmlzbS5maWxlSGlnaGxpZ2h0ID0gZnVuY3Rpb24gKCkge1xuXHRcdGlmICghbG9nZ2VkKSB7XG5cdFx0XHRjb25zb2xlLndhcm4oJ1ByaXNtLmZpbGVIaWdobGlnaHQgaXMgZGVwcmVjYXRlZC4gVXNlIGBQcmlzbS5wbHVnaW5zLmZpbGVIaWdobGlnaHQuaGlnaGxpZ2h0YCBpbnN0ZWFkLicpO1xuXHRcdFx0bG9nZ2VkID0gdHJ1ZTtcblx0XHR9XG5cdFx0UHJpc20ucGx1Z2lucy5maWxlSGlnaGxpZ2h0LmhpZ2hsaWdodC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHR9O1xuXG59KCkpO1xuXG4iLCAiLyoqXG4gKiBAbGljZW5zZSBNSVRcbiAqIHRvcGJhciAxLjAuMCwgMjAyMS0wMS0wNlxuICogaHR0cDovL2J1dW5ndXllbi5naXRodWIuaW8vdG9wYmFyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgQnV1IE5ndXllblxuICovXG4oZnVuY3Rpb24gKHdpbmRvdywgZG9jdW1lbnQpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vcGF1bGlyaXNoLzE1Nzk2NzFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGFzdFRpbWUgPSAwO1xuICAgIHZhciB2ZW5kb3JzID0gW1wibXNcIiwgXCJtb3pcIiwgXCJ3ZWJraXRcIiwgXCJvXCJdO1xuICAgIGZvciAodmFyIHggPSAwOyB4IDwgdmVuZG9ycy5sZW5ndGggJiYgIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7ICsreCkge1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9XG4gICAgICAgIHdpbmRvd1t2ZW5kb3JzW3hdICsgXCJSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIl07XG4gICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPVxuICAgICAgICB3aW5kb3dbdmVuZG9yc1t4XSArIFwiQ2FuY2VsQW5pbWF0aW9uRnJhbWVcIl0gfHxcbiAgICAgICAgd2luZG93W3ZlbmRvcnNbeF0gKyBcIkNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZVwiXTtcbiAgICB9XG4gICAgaWYgKCF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKVxuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIChjYWxsYmFjaywgZWxlbWVudCkge1xuICAgICAgICB2YXIgY3VyclRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgdmFyIHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSk7XG4gICAgICAgIHZhciBpZCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjYWxsYmFjayhjdXJyVGltZSArIHRpbWVUb0NhbGwpO1xuICAgICAgICB9LCB0aW1lVG9DYWxsKTtcbiAgICAgICAgbGFzdFRpbWUgPSBjdXJyVGltZSArIHRpbWVUb0NhbGw7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICAgIH07XG4gICAgaWYgKCF3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUpXG4gICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGlkKTtcbiAgICAgIH07XG4gIH0pKCk7XG5cbiAgdmFyIGNhbnZhcyxcbiAgICBwcm9ncmVzc1RpbWVySWQsXG4gICAgZmFkZVRpbWVySWQsXG4gICAgY3VycmVudFByb2dyZXNzLFxuICAgIHNob3dpbmcsXG4gICAgYWRkRXZlbnQgPSBmdW5jdGlvbiAoZWxlbSwgdHlwZSwgaGFuZGxlcikge1xuICAgICAgaWYgKGVsZW0uYWRkRXZlbnRMaXN0ZW5lcikgZWxlbS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgIGVsc2UgaWYgKGVsZW0uYXR0YWNoRXZlbnQpIGVsZW0uYXR0YWNoRXZlbnQoXCJvblwiICsgdHlwZSwgaGFuZGxlcik7XG4gICAgICBlbHNlIGVsZW1bXCJvblwiICsgdHlwZV0gPSBoYW5kbGVyO1xuICAgIH0sXG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIGF1dG9SdW46IHRydWUsXG4gICAgICBiYXJUaGlja25lc3M6IDMsXG4gICAgICBiYXJDb2xvcnM6IHtcbiAgICAgICAgMDogXCJyZ2JhKDI2LCAgMTg4LCAxNTYsIC45KVwiLFxuICAgICAgICBcIi4yNVwiOiBcInJnYmEoNTIsICAxNTIsIDIxOSwgLjkpXCIsXG4gICAgICAgIFwiLjUwXCI6IFwicmdiYSgyNDEsIDE5NiwgMTUsICAuOSlcIixcbiAgICAgICAgXCIuNzVcIjogXCJyZ2JhKDIzMCwgMTI2LCAzNCwgIC45KVwiLFxuICAgICAgICBcIjEuMFwiOiBcInJnYmEoMjExLCA4NCwgIDAsICAgLjkpXCIsXG4gICAgICB9LFxuICAgICAgc2hhZG93Qmx1cjogMTAsXG4gICAgICBzaGFkb3dDb2xvcjogXCJyZ2JhKDAsICAgMCwgICAwLCAgIC42KVwiLFxuICAgICAgY2xhc3NOYW1lOiBudWxsLFxuICAgIH0sXG4gICAgcmVwYWludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbnZhcy53aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgY2FudmFzLmhlaWdodCA9IG9wdGlvbnMuYmFyVGhpY2tuZXNzICogNTsgLy8gbmVlZCBzcGFjZSBmb3Igc2hhZG93XG5cbiAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgY3R4LnNoYWRvd0JsdXIgPSBvcHRpb25zLnNoYWRvd0JsdXI7XG4gICAgICBjdHguc2hhZG93Q29sb3IgPSBvcHRpb25zLnNoYWRvd0NvbG9yO1xuXG4gICAgICB2YXIgbGluZUdyYWRpZW50ID0gY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsIDAsIGNhbnZhcy53aWR0aCwgMCk7XG4gICAgICBmb3IgKHZhciBzdG9wIGluIG9wdGlvbnMuYmFyQ29sb3JzKVxuICAgICAgICBsaW5lR3JhZGllbnQuYWRkQ29sb3JTdG9wKHN0b3AsIG9wdGlvbnMuYmFyQ29sb3JzW3N0b3BdKTtcbiAgICAgIGN0eC5saW5lV2lkdGggPSBvcHRpb25zLmJhclRoaWNrbmVzcztcbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGN0eC5tb3ZlVG8oMCwgb3B0aW9ucy5iYXJUaGlja25lc3MgLyAyKTtcbiAgICAgIGN0eC5saW5lVG8oXG4gICAgICAgIE1hdGguY2VpbChjdXJyZW50UHJvZ3Jlc3MgKiBjYW52YXMud2lkdGgpLFxuICAgICAgICBvcHRpb25zLmJhclRoaWNrbmVzcyAvIDJcbiAgICAgICk7XG4gICAgICBjdHguc3Ryb2tlU3R5bGUgPSBsaW5lR3JhZGllbnQ7XG4gICAgICBjdHguc3Ryb2tlKCk7XG4gICAgfSxcbiAgICBjcmVhdGVDYW52YXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgdmFyIHN0eWxlID0gY2FudmFzLnN0eWxlO1xuICAgICAgc3R5bGUucG9zaXRpb24gPSBcImZpeGVkXCI7XG4gICAgICBzdHlsZS50b3AgPSBzdHlsZS5sZWZ0ID0gc3R5bGUucmlnaHQgPSBzdHlsZS5tYXJnaW4gPSBzdHlsZS5wYWRkaW5nID0gMDtcbiAgICAgIHN0eWxlLnpJbmRleCA9IDEwMDAwMTtcbiAgICAgIHN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIGlmIChvcHRpb25zLmNsYXNzTmFtZSkgY2FudmFzLmNsYXNzTGlzdC5hZGQob3B0aW9ucy5jbGFzc05hbWUpO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgICAgYWRkRXZlbnQod2luZG93LCBcInJlc2l6ZVwiLCByZXBhaW50KTtcbiAgICB9LFxuICAgIHRvcGJhciA9IHtcbiAgICAgIGNvbmZpZzogZnVuY3Rpb24gKG9wdHMpIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIG9wdHMpXG4gICAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSkgb3B0aW9uc1trZXldID0gb3B0c1trZXldO1xuICAgICAgfSxcbiAgICAgIHNob3c6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHNob3dpbmcpIHJldHVybjtcbiAgICAgICAgc2hvd2luZyA9IHRydWU7XG4gICAgICAgIGlmIChmYWRlVGltZXJJZCAhPT0gbnVsbCkgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGZhZGVUaW1lcklkKTtcbiAgICAgICAgaWYgKCFjYW52YXMpIGNyZWF0ZUNhbnZhcygpO1xuICAgICAgICBjYW52YXMuc3R5bGUub3BhY2l0eSA9IDE7XG4gICAgICAgIGNhbnZhcy5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICB0b3BiYXIucHJvZ3Jlc3MoMCk7XG4gICAgICAgIGlmIChvcHRpb25zLmF1dG9SdW4pIHtcbiAgICAgICAgICAoZnVuY3Rpb24gbG9vcCgpIHtcbiAgICAgICAgICAgIHByb2dyZXNzVGltZXJJZCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG4gICAgICAgICAgICB0b3BiYXIucHJvZ3Jlc3MoXG4gICAgICAgICAgICAgIFwiK1wiICsgMC4wNSAqIE1hdGgucG93KDEgLSBNYXRoLnNxcnQoY3VycmVudFByb2dyZXNzKSwgMilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSkoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAodG8pIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0byA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGN1cnJlbnRQcm9ncmVzcztcbiAgICAgICAgaWYgKHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHRvID1cbiAgICAgICAgICAgICh0by5pbmRleE9mKFwiK1wiKSA+PSAwIHx8IHRvLmluZGV4T2YoXCItXCIpID49IDBcbiAgICAgICAgICAgICAgPyBjdXJyZW50UHJvZ3Jlc3NcbiAgICAgICAgICAgICAgOiAwKSArIHBhcnNlRmxvYXQodG8pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRQcm9ncmVzcyA9IHRvID4gMSA/IDEgOiB0bztcbiAgICAgICAgcmVwYWludCgpO1xuICAgICAgICByZXR1cm4gY3VycmVudFByb2dyZXNzO1xuICAgICAgfSxcbiAgICAgIGhpZGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFzaG93aW5nKSByZXR1cm47XG4gICAgICAgIHNob3dpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHByb2dyZXNzVGltZXJJZCAhPSBudWxsKSB7XG4gICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHByb2dyZXNzVGltZXJJZCk7XG4gICAgICAgICAgcHJvZ3Jlc3NUaW1lcklkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAoZnVuY3Rpb24gbG9vcCgpIHtcbiAgICAgICAgICBpZiAodG9wYmFyLnByb2dyZXNzKFwiKy4xXCIpID49IDEpIHtcbiAgICAgICAgICAgIGNhbnZhcy5zdHlsZS5vcGFjaXR5IC09IDAuMDU7XG4gICAgICAgICAgICBpZiAoY2FudmFzLnN0eWxlLm9wYWNpdHkgPD0gMC4wNSkge1xuICAgICAgICAgICAgICBjYW52YXMuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgICBmYWRlVGltZXJJZCA9IG51bGw7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZmFkZVRpbWVySWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApO1xuICAgICAgICB9KSgpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gIGlmICh0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gdG9wYmFyO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0b3BiYXI7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy50b3BiYXIgPSB0b3BiYXI7XG4gIH1cbn0uY2FsbCh0aGlzLCB3aW5kb3csIGRvY3VtZW50KSk7XG4iLCAiaW1wb3J0ICQgZnJvbSBcImpxdWVyeVwiO1xud2luZG93LiQgPSAkO1xud2luZG93LmpRdWVyeSA9ICQ7XG5cbmltcG9ydCBcImJvb3RzdHJhcFwiO1xuaW1wb3J0IFwiLi4vdmVuZG9yL3ByaXNtXCI7XG5cbmltcG9ydCBcIi4vcmVwb3NpdG9yeVwiO1xuaW1wb3J0IFwiLi9rbXhfYW5pbVwiO1xuXG4vLyBJZiB5b3Ugd2FudCB0byB1c2UgUGhvZW5peCBjaGFubmVscywgcnVuIGBtaXggaGVscCBwaHguZ2VuLmNoYW5uZWxgXG4vLyB0byBnZXQgc3RhcnRlZCBhbmQgdGhlbiB1bmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cuXG4vLyBpbXBvcnQgXCIuL3VzZXJfc29ja2V0LmpzXCJcblxuLy8gSW5jbHVkZSBwaG9lbml4X2h0bWwgdG8gaGFuZGxlIG1ldGhvZD1QVVQvREVMRVRFIGluIGZvcm1zIGFuZCBidXR0b25zLlxuaW1wb3J0IFwicGhvZW5peF9odG1sXCI7XG4vLyBFc3RhYmxpc2ggUGhvZW5peCBTb2NrZXQgYW5kIExpdmVWaWV3IGNvbmZpZ3VyYXRpb24uXG5pbXBvcnQge1NvY2tldH0gZnJvbSBcInBob2VuaXhcIjtcbmltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCI7XG5pbXBvcnQgdG9wYmFyIGZyb20gXCIuLi92ZW5kb3IvdG9wYmFyXCI7XG5cbmxldCBjc3JmVG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIikuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKTtcbmxldCBsaXZlU29ja2V0ID0gbmV3IExpdmVTb2NrZXQoXCIvbGl2ZVwiLCBTb2NrZXQsIHtwYXJhbXM6IHtfY3NyZl90b2tlbjogY3NyZlRva2VufX0pO1xuXG4vLyBTaG93IHByb2dyZXNzIGJhciBvbiBsaXZlIG5hdmlnYXRpb24gYW5kIGZvcm0gc3VibWl0c1xudG9wYmFyLmNvbmZpZyh7YmFyQ29sb3JzOiB7MDogXCIjMjlkXCJ9LCBzaGFkb3dDb2xvcjogXCJyZ2JhKDAsIDAsIDAsIC4zKVwifSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBoeDpwYWdlLWxvYWRpbmctc3RhcnRcIiwgaW5mbyA9PiB0b3BiYXIuc2hvdygpKTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGh4OnBhZ2UtbG9hZGluZy1zdG9wXCIsIGluZm8gPT4gdG9wYmFyLmhpZGUoKSk7XG5cbi8vIGNvbm5lY3QgaWYgdGhlcmUgYXJlIGFueSBMaXZlVmlld3Mgb24gdGhlIHBhZ2VcbmxpdmVTb2NrZXQuY29ubmVjdCgpO1xuXG4vLyBleHBvc2UgbGl2ZVNvY2tldCBvbiB3aW5kb3cgZm9yIHdlYiBjb25zb2xlIGRlYnVnIGxvZ3MgYW5kIGxhdGVuY3kgc2ltdWxhdGlvbjpcbi8vID4+IGxpdmVTb2NrZXQuZW5hYmxlRGVidWcoKVxuLy8gPj4gbGl2ZVNvY2tldC5lbmFibGVMYXRlbmN5U2ltKDEwMDApICAvLyBlbmFibGVkIGZvciBkdXJhdGlvbiBvZiBicm93c2VyIHNlc3Npb25cbi8vID4+IGxpdmVTb2NrZXQuZGlzYWJsZUxhdGVuY3lTaW0oKVxud2luZG93LmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0O1xuIiwgImV4cG9ydCAqIGZyb20gXCIuL2VudW1zLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2RpZmllcnMvaW5kZXguanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBwb3BwZXJHZW5lcmF0b3IsIGRldGVjdE92ZXJmbG93LCBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyQmFzZSB9IGZyb20gXCIuL2NyZWF0ZVBvcHBlci5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciB9IGZyb20gXCIuL3BvcHBlci5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciBhcyBjcmVhdGVQb3BwZXJMaXRlIH0gZnJvbSBcIi4vcG9wcGVyLWxpdGUuanNcIjsiLCAiZXhwb3J0IHZhciB0b3AgPSAndG9wJztcbmV4cG9ydCB2YXIgYm90dG9tID0gJ2JvdHRvbSc7XG5leHBvcnQgdmFyIHJpZ2h0ID0gJ3JpZ2h0JztcbmV4cG9ydCB2YXIgbGVmdCA9ICdsZWZ0JztcbmV4cG9ydCB2YXIgYXV0byA9ICdhdXRvJztcbmV4cG9ydCB2YXIgYmFzZVBsYWNlbWVudHMgPSBbdG9wLCBib3R0b20sIHJpZ2h0LCBsZWZ0XTtcbmV4cG9ydCB2YXIgc3RhcnQgPSAnc3RhcnQnO1xuZXhwb3J0IHZhciBlbmQgPSAnZW5kJztcbmV4cG9ydCB2YXIgY2xpcHBpbmdQYXJlbnRzID0gJ2NsaXBwaW5nUGFyZW50cyc7XG5leHBvcnQgdmFyIHZpZXdwb3J0ID0gJ3ZpZXdwb3J0JztcbmV4cG9ydCB2YXIgcG9wcGVyID0gJ3BvcHBlcic7XG5leHBvcnQgdmFyIHJlZmVyZW5jZSA9ICdyZWZlcmVuY2UnO1xuZXhwb3J0IHZhciB2YXJpYXRpb25QbGFjZW1lbnRzID0gLyojX19QVVJFX18qL2Jhc2VQbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIGFjYy5jb25jYXQoW3BsYWNlbWVudCArIFwiLVwiICsgc3RhcnQsIHBsYWNlbWVudCArIFwiLVwiICsgZW5kXSk7XG59LCBbXSk7XG5leHBvcnQgdmFyIHBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovW10uY29uY2F0KGJhc2VQbGFjZW1lbnRzLCBbYXV0b10pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIGFjYy5jb25jYXQoW3BsYWNlbWVudCwgcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTsgLy8gbW9kaWZpZXJzIHRoYXQgbmVlZCB0byByZWFkIHRoZSBET01cblxuZXhwb3J0IHZhciBiZWZvcmVSZWFkID0gJ2JlZm9yZVJlYWQnO1xuZXhwb3J0IHZhciByZWFkID0gJ3JlYWQnO1xuZXhwb3J0IHZhciBhZnRlclJlYWQgPSAnYWZ0ZXJSZWFkJzsgLy8gcHVyZS1sb2dpYyBtb2RpZmllcnNcblxuZXhwb3J0IHZhciBiZWZvcmVNYWluID0gJ2JlZm9yZU1haW4nO1xuZXhwb3J0IHZhciBtYWluID0gJ21haW4nO1xuZXhwb3J0IHZhciBhZnRlck1haW4gPSAnYWZ0ZXJNYWluJzsgLy8gbW9kaWZpZXIgd2l0aCB0aGUgcHVycG9zZSB0byB3cml0ZSB0byB0aGUgRE9NIChvciB3cml0ZSBpbnRvIGEgZnJhbWV3b3JrIHN0YXRlKVxuXG5leHBvcnQgdmFyIGJlZm9yZVdyaXRlID0gJ2JlZm9yZVdyaXRlJztcbmV4cG9ydCB2YXIgd3JpdGUgPSAnd3JpdGUnO1xuZXhwb3J0IHZhciBhZnRlcldyaXRlID0gJ2FmdGVyV3JpdGUnO1xuZXhwb3J0IHZhciBtb2RpZmllclBoYXNlcyA9IFtiZWZvcmVSZWFkLCByZWFkLCBhZnRlclJlYWQsIGJlZm9yZU1haW4sIG1haW4sIGFmdGVyTWFpbiwgYmVmb3JlV3JpdGUsIHdyaXRlLCBhZnRlcldyaXRlXTsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Tm9kZU5hbWUoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudCA/IChlbGVtZW50Lm5vZGVOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93KG5vZGUpIHtcbiAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICBpZiAobm9kZS50b1N0cmluZygpICE9PSAnW29iamVjdCBXaW5kb3ddJykge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIHJldHVybiBvd25lckRvY3VtZW50ID8gb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3cgOiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcblxuZnVuY3Rpb24gaXNFbGVtZW50KG5vZGUpIHtcbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBpc0hUTUxFbGVtZW50KG5vZGUpIHtcbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuSFRNTEVsZW1lbnQ7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzU2hhZG93Um9vdChub2RlKSB7XG4gIC8vIElFIDExIGhhcyBubyBTaGFkb3dSb290XG4gIGlmICh0eXBlb2YgU2hhZG93Um9vdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5TaGFkb3dSb290O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q7XG59XG5cbmV4cG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCwgaXNTaGFkb3dSb290IH07IiwgImltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4uL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7IC8vIFRoaXMgbW9kaWZpZXIgdGFrZXMgdGhlIHN0eWxlcyBwcmVwYXJlZCBieSB0aGUgYGNvbXB1dGVTdHlsZXNgIG1vZGlmaWVyXG4vLyBhbmQgYXBwbGllcyB0aGVtIHRvIHRoZSBIVE1MRWxlbWVudHMgc3VjaCBhcyBwb3BwZXIgYW5kIGFycm93XG5cbmZ1bmN0aW9uIGFwcGx5U3R5bGVzKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZTtcbiAgT2JqZWN0LmtleXMoc3RhdGUuZWxlbWVudHMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgc3R5bGUgPSBzdGF0ZS5zdHlsZXNbbmFtZV0gfHwge307XG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBzdGF0ZS5hdHRyaWJ1dGVzW25hbWVdIHx8IHt9O1xuICAgIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbbmFtZV07IC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuXG4gICAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8ICFnZXROb2RlTmFtZShlbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gRmxvdyBkb2Vzbid0IHN1cHBvcnQgdG8gZXh0ZW5kIHRoaXMgcHJvcGVydHksIGJ1dCBpdCdzIHRoZSBtb3N0XG4gICAgLy8gZWZmZWN0aXZlIHdheSB0byBhcHBseSBzdHlsZXMgdG8gYW4gSFRNTEVsZW1lbnRcbiAgICAvLyAkRmxvd0ZpeE1lW2Nhbm5vdC13cml0ZV1cblxuXG4gICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSk7XG4gICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIHZhbHVlID0gYXR0cmlidXRlc1tuYW1lXTtcblxuICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlID09PSB0cnVlID8gJycgOiB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlZmZlY3QoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGU7XG4gIHZhciBpbml0aWFsU3R5bGVzID0ge1xuICAgIHBvcHBlcjoge1xuICAgICAgcG9zaXRpb246IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBsZWZ0OiAnMCcsXG4gICAgICB0b3A6ICcwJyxcbiAgICAgIG1hcmdpbjogJzAnXG4gICAgfSxcbiAgICBhcnJvdzoge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICB9LFxuICAgIHJlZmVyZW5jZToge31cbiAgfTtcbiAgT2JqZWN0LmFzc2lnbihzdGF0ZS5lbGVtZW50cy5wb3BwZXIuc3R5bGUsIGluaXRpYWxTdHlsZXMucG9wcGVyKTtcbiAgc3RhdGUuc3R5bGVzID0gaW5pdGlhbFN0eWxlcztcblxuICBpZiAoc3RhdGUuZWxlbWVudHMuYXJyb3cpIHtcbiAgICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLmFycm93LnN0eWxlLCBpbml0aWFsU3R5bGVzLmFycm93KTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgT2JqZWN0LmtleXMoc3RhdGUuZWxlbWVudHMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbbmFtZV07XG4gICAgICB2YXIgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG4gICAgICB2YXIgc3R5bGVQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoc3RhdGUuc3R5bGVzLmhhc093blByb3BlcnR5KG5hbWUpID8gc3RhdGUuc3R5bGVzW25hbWVdIDogaW5pdGlhbFN0eWxlc1tuYW1lXSk7IC8vIFNldCBhbGwgdmFsdWVzIHRvIGFuIGVtcHR5IHN0cmluZyB0byB1bnNldCB0aGVtXG5cbiAgICAgIHZhciBzdHlsZSA9IHN0eWxlUHJvcGVydGllcy5yZWR1Y2UoZnVuY3Rpb24gKHN0eWxlLCBwcm9wZXJ0eSkge1xuICAgICAgICBzdHlsZVtwcm9wZXJ0eV0gPSAnJztcbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgfSwge30pOyAvLyBhcnJvdyBpcyBvcHRpb25hbCArIHZpcnR1YWwgZWxlbWVudHNcblxuICAgICAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8ICFnZXROb2RlTmFtZShlbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuICAgICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2FwcGx5U3R5bGVzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICd3cml0ZScsXG4gIGZuOiBhcHBseVN0eWxlcyxcbiAgZWZmZWN0OiBlZmZlY3QsXG4gIHJlcXVpcmVzOiBbJ2NvbXB1dGVTdHlsZXMnXVxufTsiLCAiaW1wb3J0IHsgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xufSIsICJleHBvcnQgdmFyIG1heCA9IE1hdGgubWF4O1xuZXhwb3J0IHZhciBtaW4gPSBNYXRoLm1pbjtcbmV4cG9ydCB2YXIgcm91bmQgPSBNYXRoLnJvdW5kOyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRVQVN0cmluZygpIHtcbiAgdmFyIHVhRGF0YSA9IG5hdmlnYXRvci51c2VyQWdlbnREYXRhO1xuXG4gIGlmICh1YURhdGEgIT0gbnVsbCAmJiB1YURhdGEuYnJhbmRzICYmIEFycmF5LmlzQXJyYXkodWFEYXRhLmJyYW5kcykpIHtcbiAgICByZXR1cm4gdWFEYXRhLmJyYW5kcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtLmJyYW5kICsgXCIvXCIgKyBpdGVtLnZlcnNpb247XG4gICAgfSkuam9pbignICcpO1xuICB9XG5cbiAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQ7XG59IiwgImltcG9ydCBnZXRVQVN0cmluZyBmcm9tIFwiLi4vdXRpbHMvdXNlckFnZW50LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0xheW91dFZpZXdwb3J0KCkge1xuICByZXR1cm4gIS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG59IiwgImltcG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgaXNMYXlvdXRWaWV3cG9ydCBmcm9tIFwiLi9pc0xheW91dFZpZXdwb3J0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgaW5jbHVkZVNjYWxlLCBpc0ZpeGVkU3RyYXRlZ3kpIHtcbiAgaWYgKGluY2x1ZGVTY2FsZSA9PT0gdm9pZCAwKSB7XG4gICAgaW5jbHVkZVNjYWxlID0gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNGaXhlZFN0cmF0ZWd5ID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkU3RyYXRlZ3kgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBjbGllbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNjYWxlWCA9IDE7XG4gIHZhciBzY2FsZVkgPSAxO1xuXG4gIGlmIChpbmNsdWRlU2NhbGUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIHNjYWxlWCA9IGVsZW1lbnQub2Zmc2V0V2lkdGggPiAwID8gcm91bmQoY2xpZW50UmVjdC53aWR0aCkgLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDEgOiAxO1xuICAgIHNjYWxlWSA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gMCA/IHJvdW5kKGNsaWVudFJlY3QuaGVpZ2h0KSAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDEgOiAxO1xuICB9XG5cbiAgdmFyIF9yZWYgPSBpc0VsZW1lbnQoZWxlbWVudCkgPyBnZXRXaW5kb3coZWxlbWVudCkgOiB3aW5kb3csXG4gICAgICB2aXN1YWxWaWV3cG9ydCA9IF9yZWYudmlzdWFsVmlld3BvcnQ7XG5cbiAgdmFyIGFkZFZpc3VhbE9mZnNldHMgPSAhaXNMYXlvdXRWaWV3cG9ydCgpICYmIGlzRml4ZWRTdHJhdGVneTtcbiAgdmFyIHggPSAoY2xpZW50UmVjdC5sZWZ0ICsgKGFkZFZpc3VhbE9mZnNldHMgJiYgdmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0IDogMCkpIC8gc2NhbGVYO1xuICB2YXIgeSA9IChjbGllbnRSZWN0LnRvcCArIChhZGRWaXN1YWxPZmZzZXRzICYmIHZpc3VhbFZpZXdwb3J0ID8gdmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wIDogMCkpIC8gc2NhbGVZO1xuICB2YXIgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoIC8gc2NhbGVYO1xuICB2YXIgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQgLyBzY2FsZVk7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHRvcDogeSxcbiAgICByaWdodDogeCArIHdpZHRoLFxuICAgIGJvdHRvbTogeSArIGhlaWdodCxcbiAgICBsZWZ0OiB4LFxuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xufSIsICJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiOyAvLyBSZXR1cm5zIHRoZSBsYXlvdXQgcmVjdCBvZiBhbiBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyBvZmZzZXRQYXJlbnQuIExheW91dFxuLy8gbWVhbnMgaXQgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zLlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRMYXlvdXRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIGNsaWVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCk7IC8vIFVzZSB0aGUgY2xpZW50UmVjdCBzaXplcyBpZiBpdCdzIG5vdCBiZWVuIHRyYW5zZm9ybWVkLlxuICAvLyBGaXhlcyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzEyMjNcblxuICB2YXIgd2lkdGggPSBlbGVtZW50Lm9mZnNldFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3Qud2lkdGggLSB3aWR0aCkgPD0gMSkge1xuICAgIHdpZHRoID0gY2xpZW50UmVjdC53aWR0aDtcbiAgfVxuXG4gIGlmIChNYXRoLmFicyhjbGllbnRSZWN0LmhlaWdodCAtIGhlaWdodCkgPD0gMSkge1xuICAgIGhlaWdodCA9IGNsaWVudFJlY3QuaGVpZ2h0O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiBlbGVtZW50Lm9mZnNldExlZnQsXG4gICAgeTogZWxlbWVudC5vZmZzZXRUb3AsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG59IiwgImltcG9ydCB7IGlzU2hhZG93Um9vdCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHtcbiAgdmFyIHJvb3ROb2RlID0gY2hpbGQuZ2V0Um9vdE5vZGUgJiYgY2hpbGQuZ2V0Um9vdE5vZGUoKTsgLy8gRmlyc3QsIGF0dGVtcHQgd2l0aCBmYXN0ZXIgbmF0aXZlIG1ldGhvZFxuXG4gIGlmIChwYXJlbnQuY29udGFpbnMoY2hpbGQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gdGhlbiBmYWxsYmFjayB0byBjdXN0b20gaW1wbGVtZW50YXRpb24gd2l0aCBTaGFkb3cgRE9NIHN1cHBvcnRcbiAgZWxzZSBpZiAocm9vdE5vZGUgJiYgaXNTaGFkb3dSb290KHJvb3ROb2RlKSkge1xuICAgICAgdmFyIG5leHQgPSBjaGlsZDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAobmV4dCAmJiBwYXJlbnQuaXNTYW1lTm9kZShuZXh0KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXTogbmVlZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuLi5cblxuXG4gICAgICAgIG5leHQgPSBuZXh0LnBhcmVudE5vZGUgfHwgbmV4dC5ob3N0O1xuICAgICAgfSB3aGlsZSAobmV4dCk7XG4gICAgfSAvLyBHaXZlIHVwLCB0aGUgcmVzdWx0IGlzIGZhbHNlXG5cblxuICByZXR1cm4gZmFsc2U7XG59IiwgImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldFdpbmRvdyhlbGVtZW50KS5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xufSIsICJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzVGFibGVFbGVtZW50KGVsZW1lbnQpIHtcbiAgcmV0dXJuIFsndGFibGUnLCAndGQnLCAndGgnXS5pbmRleE9mKGdldE5vZGVOYW1lKGVsZW1lbnQpKSA+PSAwO1xufSIsICJpbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkge1xuICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gIHJldHVybiAoKGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQub3duZXJEb2N1bWVudCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICBlbGVtZW50LmRvY3VtZW50KSB8fCB3aW5kb3cuZG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudDtcbn0iLCAiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IHsgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShlbGVtZW50KSB7XG4gIGlmIChnZXROb2RlTmFtZShlbGVtZW50KSA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gKC8vIHRoaXMgaXMgYSBxdWlja2VyIChidXQgbGVzcyB0eXBlIHNhZmUpIHdheSB0byBzYXZlIHF1aXRlIHNvbWUgYnl0ZXMgZnJvbSB0aGUgYnVuZGxlXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXVxuICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgIGVsZW1lbnQuYXNzaWduZWRTbG90IHx8IC8vIHN0ZXAgaW50byB0aGUgc2hhZG93IERPTSBvZiB0aGUgcGFyZW50IG9mIGEgc2xvdHRlZCBub2RlXG4gICAgZWxlbWVudC5wYXJlbnROb2RlIHx8ICggLy8gRE9NIEVsZW1lbnQgZGV0ZWN0ZWRcbiAgICBpc1NoYWRvd1Jvb3QoZWxlbWVudCkgPyBlbGVtZW50Lmhvc3QgOiBudWxsKSB8fCAvLyBTaGFkb3dSb290IGRldGVjdGVkXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IEhUTUxFbGVtZW50IGlzIGEgTm9kZVxuICAgIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSAvLyBmYWxsYmFja1xuXG4gICk7XG59IiwgImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQsIGlzU2hhZG93Um9vdCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBpc1RhYmxlRWxlbWVudCBmcm9tIFwiLi9pc1RhYmxlRWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGdldFVBU3RyaW5nIGZyb20gXCIuLi91dGlscy91c2VyQWdlbnQuanNcIjtcblxuZnVuY3Rpb24gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzgzN1xuICBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uID09PSAnZml4ZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudC5vZmZzZXRQYXJlbnQ7XG59IC8vIGAub2Zmc2V0UGFyZW50YCByZXBvcnRzIGBudWxsYCBmb3IgZml4ZWQgZWxlbWVudHMsIHdoaWxlIGFic29sdXRlIGVsZW1lbnRzXG4vLyByZXR1cm4gdGhlIGNvbnRhaW5pbmcgYmxvY2tcblxuXG5mdW5jdGlvbiBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkge1xuICB2YXIgaXNGaXJlZm94ID0gL2ZpcmVmb3gvaS50ZXN0KGdldFVBU3RyaW5nKCkpO1xuICB2YXIgaXNJRSA9IC9UcmlkZW50L2kudGVzdChnZXRVQVN0cmluZygpKTtcblxuICBpZiAoaXNJRSAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgLy8gSW4gSUUgOSwgMTAgYW5kIDExIGZpeGVkIGVsZW1lbnRzIGNvbnRhaW5pbmcgYmxvY2sgaXMgYWx3YXlzIGVzdGFibGlzaGVkIGJ5IHRoZSB2aWV3cG9ydFxuICAgIHZhciBlbGVtZW50Q3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcblxuICAgIGlmIChlbGVtZW50Q3NzLnBvc2l0aW9uID09PSAnZml4ZWQnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICB2YXIgY3VycmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuXG4gIGlmIChpc1NoYWRvd1Jvb3QoY3VycmVudE5vZGUpKSB7XG4gICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5ob3N0O1xuICB9XG5cbiAgd2hpbGUgKGlzSFRNTEVsZW1lbnQoY3VycmVudE5vZGUpICYmIFsnaHRtbCcsICdib2R5J10uaW5kZXhPZihnZXROb2RlTmFtZShjdXJyZW50Tm9kZSkpIDwgMCkge1xuICAgIHZhciBjc3MgPSBnZXRDb21wdXRlZFN0eWxlKGN1cnJlbnROb2RlKTsgLy8gVGhpcyBpcyBub24tZXhoYXVzdGl2ZSBidXQgY292ZXJzIHRoZSBtb3N0IGNvbW1vbiBDU1MgcHJvcGVydGllcyB0aGF0XG4gICAgLy8gY3JlYXRlIGEgY29udGFpbmluZyBibG9jay5cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ29udGFpbmluZ19ibG9jayNpZGVudGlmeWluZ190aGVfY29udGFpbmluZ19ibG9ja1xuXG4gICAgaWYgKGNzcy50cmFuc2Zvcm0gIT09ICdub25lJyB8fCBjc3MucGVyc3BlY3RpdmUgIT09ICdub25lJyB8fCBjc3MuY29udGFpbiA9PT0gJ3BhaW50JyB8fCBbJ3RyYW5zZm9ybScsICdwZXJzcGVjdGl2ZSddLmluZGV4T2YoY3NzLndpbGxDaGFuZ2UpICE9PSAtMSB8fCBpc0ZpcmVmb3ggJiYgY3NzLndpbGxDaGFuZ2UgPT09ICdmaWx0ZXInIHx8IGlzRmlyZWZveCAmJiBjc3MuZmlsdGVyICYmIGNzcy5maWx0ZXIgIT09ICdub25lJykge1xuICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59IC8vIEdldHMgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgcG9zaXRpb25lZCBlbGVtZW50LiBIYW5kbGVzIHNvbWUgZWRnZSBjYXNlcyxcbi8vIHN1Y2ggYXMgdGFibGUgYW5jZXN0b3JzIGFuZCBjcm9zcyBicm93c2VyIGJ1Z3MuXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgdmFyIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCk7XG5cbiAgd2hpbGUgKG9mZnNldFBhcmVudCAmJiBpc1RhYmxlRWxlbWVudChvZmZzZXRQYXJlbnQpICYmIGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcbiAgICBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KG9mZnNldFBhcmVudCk7XG4gIH1cblxuICBpZiAob2Zmc2V0UGFyZW50ICYmIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnaHRtbCcgfHwgZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSA9PT0gJ2JvZHknICYmIGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpKSB7XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxuXG4gIHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHx8IHdpbmRvdztcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpID49IDAgPyAneCcgOiAneSc7XG59IiwgImltcG9ydCB7IG1heCBhcyBtYXRoTWF4LCBtaW4gYXMgbWF0aE1pbiB9IGZyb20gXCIuL21hdGguanNcIjtcbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KSB7XG4gIHJldHVybiBtYXRoTWF4KG1pbiwgbWF0aE1pbih2YWx1ZSwgbWF4KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gd2l0aGluTWF4Q2xhbXAobWluLCB2YWx1ZSwgbWF4KSB7XG4gIHZhciB2ID0gd2l0aGluKG1pbiwgdmFsdWUsIG1heCk7XG4gIHJldHVybiB2ID4gbWF4ID8gbWF4IDogdjtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RnJlc2hTaWRlT2JqZWN0KCkge1xuICByZXR1cm4ge1xuICAgIHRvcDogMCxcbiAgICByaWdodDogMCxcbiAgICBib3R0b206IDAsXG4gICAgbGVmdDogMFxuICB9O1xufSIsICJpbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gXCIuL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VQYWRkaW5nT2JqZWN0KHBhZGRpbmdPYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGdldEZyZXNoU2lkZU9iamVjdCgpLCBwYWRkaW5nT2JqZWN0KTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhwYW5kVG9IYXNoTWFwKHZhbHVlLCBrZXlzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAoaGFzaE1hcCwga2V5KSB7XG4gICAgaGFzaE1hcFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGhhc2hNYXA7XG4gIH0sIHt9KTtcbn0iLCAiaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCIuLi9kb20tdXRpbHMvY29udGFpbnMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgd2l0aGluIH0gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IG1lcmdlUGFkZGluZ09iamVjdCBmcm9tIFwiLi4vdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzXCI7XG5pbXBvcnQgZXhwYW5kVG9IYXNoTWFwIGZyb20gXCIuLi91dGlscy9leHBhbmRUb0hhc2hNYXAuanNcIjtcbmltcG9ydCB7IGxlZnQsIHJpZ2h0LCBiYXNlUGxhY2VtZW50cywgdG9wLCBib3R0b20gfSBmcm9tIFwiLi4vZW51bXMuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgdG9QYWRkaW5nT2JqZWN0ID0gZnVuY3Rpb24gdG9QYWRkaW5nT2JqZWN0KHBhZGRpbmcsIHN0YXRlKSB7XG4gIHBhZGRpbmcgPSB0eXBlb2YgcGFkZGluZyA9PT0gJ2Z1bmN0aW9uJyA/IHBhZGRpbmcoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiBwYWRkaW5nO1xuICByZXR1cm4gbWVyZ2VQYWRkaW5nT2JqZWN0KHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpKTtcbn07XG5cbmZ1bmN0aW9uIGFycm93KF9yZWYpIHtcbiAgdmFyIF9zdGF0ZSRtb2RpZmllcnNEYXRhJDtcblxuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgYXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGlzVmVydGljYWwgPSBbbGVmdCwgcmlnaHRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgdmFyIGxlbiA9IGlzVmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgaWYgKCFhcnJvd0VsZW1lbnQgfHwgIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGFkZGluZ09iamVjdCA9IHRvUGFkZGluZ09iamVjdChvcHRpb25zLnBhZGRpbmcsIHN0YXRlKTtcbiAgdmFyIGFycm93UmVjdCA9IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KTtcbiAgdmFyIG1pblByb3AgPSBheGlzID09PSAneScgPyB0b3AgOiBsZWZ0O1xuICB2YXIgbWF4UHJvcCA9IGF4aXMgPT09ICd5JyA/IGJvdHRvbSA6IHJpZ2h0O1xuICB2YXIgZW5kRGlmZiA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtsZW5dICsgc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdIC0gcG9wcGVyT2Zmc2V0c1theGlzXSAtIHN0YXRlLnJlY3RzLnBvcHBlcltsZW5dO1xuICB2YXIgc3RhcnREaWZmID0gcG9wcGVyT2Zmc2V0c1theGlzXSAtIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXTtcbiAgdmFyIGFycm93T2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KGFycm93RWxlbWVudCk7XG4gIHZhciBjbGllbnRTaXplID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBheGlzID09PSAneScgPyBhcnJvd09mZnNldFBhcmVudC5jbGllbnRIZWlnaHQgfHwgMCA6IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFdpZHRoIHx8IDAgOiAwO1xuICB2YXIgY2VudGVyVG9SZWZlcmVuY2UgPSBlbmREaWZmIC8gMiAtIHN0YXJ0RGlmZiAvIDI7IC8vIE1ha2Ugc3VyZSB0aGUgYXJyb3cgZG9lc24ndCBvdmVyZmxvdyB0aGUgcG9wcGVyIGlmIHRoZSBjZW50ZXIgcG9pbnQgaXNcbiAgLy8gb3V0c2lkZSBvZiB0aGUgcG9wcGVyIGJvdW5kc1xuXG4gIHZhciBtaW4gPSBwYWRkaW5nT2JqZWN0W21pblByb3BdO1xuICB2YXIgbWF4ID0gY2xpZW50U2l6ZSAtIGFycm93UmVjdFtsZW5dIC0gcGFkZGluZ09iamVjdFttYXhQcm9wXTtcbiAgdmFyIGNlbnRlciA9IGNsaWVudFNpemUgLyAyIC0gYXJyb3dSZWN0W2xlbl0gLyAyICsgY2VudGVyVG9SZWZlcmVuY2U7XG4gIHZhciBvZmZzZXQgPSB3aXRoaW4obWluLCBjZW50ZXIsIG1heCk7IC8vIFByZXZlbnRzIGJyZWFraW5nIHN5bnRheCBoaWdobGlnaHRpbmcuLi5cblxuICB2YXIgYXhpc1Byb3AgPSBheGlzO1xuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gKF9zdGF0ZSRtb2RpZmllcnNEYXRhJCA9IHt9LCBfc3RhdGUkbW9kaWZpZXJzRGF0YSRbYXhpc1Byb3BdID0gb2Zmc2V0LCBfc3RhdGUkbW9kaWZpZXJzRGF0YSQuY2VudGVyT2Zmc2V0ID0gb2Zmc2V0IC0gY2VudGVyLCBfc3RhdGUkbW9kaWZpZXJzRGF0YSQpO1xufVxuXG5mdW5jdGlvbiBlZmZlY3QoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJGVsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQsXG4gICAgICBhcnJvd0VsZW1lbnQgPSBfb3B0aW9ucyRlbGVtZW50ID09PSB2b2lkIDAgPyAnW2RhdGEtcG9wcGVyLWFycm93XScgOiBfb3B0aW9ucyRlbGVtZW50O1xuXG4gIGlmIChhcnJvd0VsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBDU1Mgc2VsZWN0b3JcblxuXG4gIGlmICh0eXBlb2YgYXJyb3dFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLnBvcHBlci5xdWVyeVNlbGVjdG9yKGFycm93RWxlbWVudCk7XG5cbiAgICBpZiAoIWFycm93RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29udGFpbnMoc3RhdGUuZWxlbWVudHMucG9wcGVyLCBhcnJvd0VsZW1lbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3RhdGUuZWxlbWVudHMuYXJyb3cgPSBhcnJvd0VsZW1lbnQ7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdhcnJvdycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBhcnJvdyxcbiAgZWZmZWN0OiBlZmZlY3QsXG4gIHJlcXVpcmVzOiBbJ3BvcHBlck9mZnNldHMnXSxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydwcmV2ZW50T3ZlcmZsb3cnXVxufTsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG59IiwgImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgdW5zZXRTaWRlcyA9IHtcbiAgdG9wOiAnYXV0bycsXG4gIHJpZ2h0OiAnYXV0bycsXG4gIGJvdHRvbTogJ2F1dG8nLFxuICBsZWZ0OiAnYXV0bydcbn07IC8vIFJvdW5kIHRoZSBvZmZzZXRzIHRvIHRoZSBuZWFyZXN0IHN1aXRhYmxlIHN1YnBpeGVsIGJhc2VkIG9uIHRoZSBEUFIuXG4vLyBab29taW5nIGNhbiBjaGFuZ2UgdGhlIERQUiwgYnV0IGl0IHNlZW1zIHRvIHJlcG9ydCBhIHZhbHVlIHRoYXQgd2lsbFxuLy8gY2xlYW5seSBkaXZpZGUgdGhlIHZhbHVlcyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBzdWJwaXhlbHMuXG5cbmZ1bmN0aW9uIHJvdW5kT2Zmc2V0c0J5RFBSKF9yZWYsIHdpbikge1xuICB2YXIgeCA9IF9yZWYueCxcbiAgICAgIHkgPSBfcmVmLnk7XG4gIHZhciBkcHIgPSB3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICByZXR1cm4ge1xuICAgIHg6IHJvdW5kKHggKiBkcHIpIC8gZHByIHx8IDAsXG4gICAgeTogcm91bmQoeSAqIGRwcikgLyBkcHIgfHwgMFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9TdHlsZXMoX3JlZjIpIHtcbiAgdmFyIF9PYmplY3QkYXNzaWduMjtcblxuICB2YXIgcG9wcGVyID0gX3JlZjIucG9wcGVyLFxuICAgICAgcG9wcGVyUmVjdCA9IF9yZWYyLnBvcHBlclJlY3QsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmMi5wbGFjZW1lbnQsXG4gICAgICB2YXJpYXRpb24gPSBfcmVmMi52YXJpYXRpb24sXG4gICAgICBvZmZzZXRzID0gX3JlZjIub2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uID0gX3JlZjIucG9zaXRpb24sXG4gICAgICBncHVBY2NlbGVyYXRpb24gPSBfcmVmMi5ncHVBY2NlbGVyYXRpb24sXG4gICAgICBhZGFwdGl2ZSA9IF9yZWYyLmFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzID0gX3JlZjIucm91bmRPZmZzZXRzLFxuICAgICAgaXNGaXhlZCA9IF9yZWYyLmlzRml4ZWQ7XG4gIHZhciBfb2Zmc2V0cyR4ID0gb2Zmc2V0cy54LFxuICAgICAgeCA9IF9vZmZzZXRzJHggPT09IHZvaWQgMCA/IDAgOiBfb2Zmc2V0cyR4LFxuICAgICAgX29mZnNldHMkeSA9IG9mZnNldHMueSxcbiAgICAgIHkgPSBfb2Zmc2V0cyR5ID09PSB2b2lkIDAgPyAwIDogX29mZnNldHMkeTtcblxuICB2YXIgX3JlZjMgPSB0eXBlb2Ygcm91bmRPZmZzZXRzID09PSAnZnVuY3Rpb24nID8gcm91bmRPZmZzZXRzKHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfSkgOiB7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG5cbiAgeCA9IF9yZWYzLng7XG4gIHkgPSBfcmVmMy55O1xuICB2YXIgaGFzWCA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3gnKTtcbiAgdmFyIGhhc1kgPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd5Jyk7XG4gIHZhciBzaWRlWCA9IGxlZnQ7XG4gIHZhciBzaWRlWSA9IHRvcDtcbiAgdmFyIHdpbiA9IHdpbmRvdztcblxuICBpZiAoYWRhcHRpdmUpIHtcbiAgICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KHBvcHBlcik7XG4gICAgdmFyIGhlaWdodFByb3AgPSAnY2xpZW50SGVpZ2h0JztcbiAgICB2YXIgd2lkdGhQcm9wID0gJ2NsaWVudFdpZHRoJztcblxuICAgIGlmIChvZmZzZXRQYXJlbnQgPT09IGdldFdpbmRvdyhwb3BwZXIpKSB7XG4gICAgICBvZmZzZXRQYXJlbnQgPSBnZXREb2N1bWVudEVsZW1lbnQocG9wcGVyKTtcblxuICAgICAgaWYgKGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiAhPT0gJ3N0YXRpYycgJiYgcG9zaXRpb24gPT09ICdhYnNvbHV0ZScpIHtcbiAgICAgICAgaGVpZ2h0UHJvcCA9ICdzY3JvbGxIZWlnaHQnO1xuICAgICAgICB3aWR0aFByb3AgPSAnc2Nyb2xsV2lkdGgnO1xuICAgICAgfVxuICAgIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FzdF06IGZvcmNlIHR5cGUgcmVmaW5lbWVudCwgd2UgY29tcGFyZSBvZmZzZXRQYXJlbnQgd2l0aCB3aW5kb3cgYWJvdmUsIGJ1dCBGbG93IGRvZXNuJ3QgZGV0ZWN0IGl0XG5cblxuICAgIG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudDtcblxuICAgIGlmIChwbGFjZW1lbnQgPT09IHRvcCB8fCAocGxhY2VtZW50ID09PSBsZWZ0IHx8IHBsYWNlbWVudCA9PT0gcmlnaHQpICYmIHZhcmlhdGlvbiA9PT0gZW5kKSB7XG4gICAgICBzaWRlWSA9IGJvdHRvbTtcbiAgICAgIHZhciBvZmZzZXRZID0gaXNGaXhlZCAmJiBvZmZzZXRQYXJlbnQgPT09IHdpbiAmJiB3aW4udmlzdWFsVmlld3BvcnQgPyB3aW4udmlzdWFsVmlld3BvcnQuaGVpZ2h0IDogLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgICBvZmZzZXRQYXJlbnRbaGVpZ2h0UHJvcF07XG4gICAgICB5IC09IG9mZnNldFkgLSBwb3BwZXJSZWN0LmhlaWdodDtcbiAgICAgIHkgKj0gZ3B1QWNjZWxlcmF0aW9uID8gMSA6IC0xO1xuICAgIH1cblxuICAgIGlmIChwbGFjZW1lbnQgPT09IGxlZnQgfHwgKHBsYWNlbWVudCA9PT0gdG9wIHx8IHBsYWNlbWVudCA9PT0gYm90dG9tKSAmJiB2YXJpYXRpb24gPT09IGVuZCkge1xuICAgICAgc2lkZVggPSByaWdodDtcbiAgICAgIHZhciBvZmZzZXRYID0gaXNGaXhlZCAmJiBvZmZzZXRQYXJlbnQgPT09IHdpbiAmJiB3aW4udmlzdWFsVmlld3BvcnQgPyB3aW4udmlzdWFsVmlld3BvcnQud2lkdGggOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgIG9mZnNldFBhcmVudFt3aWR0aFByb3BdO1xuICAgICAgeCAtPSBvZmZzZXRYIC0gcG9wcGVyUmVjdC53aWR0aDtcbiAgICAgIHggKj0gZ3B1QWNjZWxlcmF0aW9uID8gMSA6IC0xO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb21tb25TdHlsZXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICBwb3NpdGlvbjogcG9zaXRpb25cbiAgfSwgYWRhcHRpdmUgJiYgdW5zZXRTaWRlcyk7XG5cbiAgdmFyIF9yZWY0ID0gcm91bmRPZmZzZXRzID09PSB0cnVlID8gcm91bmRPZmZzZXRzQnlEUFIoe1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9LCBnZXRXaW5kb3cocG9wcGVyKSkgOiB7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG5cbiAgeCA9IF9yZWY0Lng7XG4gIHkgPSBfcmVmNC55O1xuXG4gIGlmIChncHVBY2NlbGVyYXRpb24pIHtcbiAgICB2YXIgX09iamVjdCRhc3NpZ247XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCAoX09iamVjdCRhc3NpZ24gPSB7fSwgX09iamVjdCRhc3NpZ25bc2lkZVldID0gaGFzWSA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbltzaWRlWF0gPSBoYXNYID8gJzAnIDogJycsIF9PYmplY3QkYXNzaWduLnRyYW5zZm9ybSA9ICh3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSA8PSAxID8gXCJ0cmFuc2xhdGUoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweClcIiA6IFwidHJhbnNsYXRlM2QoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweCwgMClcIiwgX09iamVjdCRhc3NpZ24pKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbjIgPSB7fSwgX09iamVjdCRhc3NpZ24yW3NpZGVZXSA9IGhhc1kgPyB5ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMltzaWRlWF0gPSBoYXNYID8geCArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjIudHJhbnNmb3JtID0gJycsIF9PYmplY3QkYXNzaWduMikpO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3R5bGVzKF9yZWY1KSB7XG4gIHZhciBzdGF0ZSA9IF9yZWY1LnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWY1Lm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPSBvcHRpb25zLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGdwdUFjY2VsZXJhdCxcbiAgICAgIF9vcHRpb25zJGFkYXB0aXZlID0gb3B0aW9ucy5hZGFwdGl2ZSxcbiAgICAgIGFkYXB0aXZlID0gX29wdGlvbnMkYWRhcHRpdmUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhZGFwdGl2ZSxcbiAgICAgIF9vcHRpb25zJHJvdW5kT2Zmc2V0cyA9IG9wdGlvbnMucm91bmRPZmZzZXRzLFxuICAgICAgcm91bmRPZmZzZXRzID0gX29wdGlvbnMkcm91bmRPZmZzZXRzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcm91bmRPZmZzZXRzO1xuICB2YXIgY29tbW9uU3R5bGVzID0ge1xuICAgIHBsYWNlbWVudDogZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHZhcmlhdGlvbjogZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCksXG4gICAgcG9wcGVyOiBzdGF0ZS5lbGVtZW50cy5wb3BwZXIsXG4gICAgcG9wcGVyUmVjdDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIGdwdUFjY2VsZXJhdGlvbjogZ3B1QWNjZWxlcmF0aW9uLFxuICAgIGlzRml4ZWQ6IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3kgPT09ICdmaXhlZCdcbiAgfTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzICE9IG51bGwpIHtcbiAgICBzdGF0ZS5zdHlsZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc3R5bGVzLnBvcHBlciwgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMsXG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGFkYXB0aXZlOiBhZGFwdGl2ZSxcbiAgICAgIHJvdW5kT2Zmc2V0czogcm91bmRPZmZzZXRzXG4gICAgfSkpKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93ICE9IG51bGwpIHtcbiAgICBzdGF0ZS5zdHlsZXMuYXJyb3cgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMuYXJyb3csIG1hcFRvU3R5bGVzKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywge1xuICAgICAgb2Zmc2V0czogc3RhdGUubW9kaWZpZXJzRGF0YS5hcnJvdyxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgYWRhcHRpdmU6IGZhbHNlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgICdkYXRhLXBvcHBlci1wbGFjZW1lbnQnOiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdjb21wdXRlU3R5bGVzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdiZWZvcmVXcml0ZScsXG4gIGZuOiBjb21wdXRlU3R5bGVzLFxuICBkYXRhOiB7fVxufTsiLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldFdpbmRvdy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciBwYXNzaXZlID0ge1xuICBwYXNzaXZlOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBlZmZlY3QoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgaW5zdGFuY2UgPSBfcmVmLmluc3RhbmNlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJHNjcm9sbCA9IG9wdGlvbnMuc2Nyb2xsLFxuICAgICAgc2Nyb2xsID0gX29wdGlvbnMkc2Nyb2xsID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkc2Nyb2xsLFxuICAgICAgX29wdGlvbnMkcmVzaXplID0gb3B0aW9ucy5yZXNpemUsXG4gICAgICByZXNpemUgPSBfb3B0aW9ucyRyZXNpemUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRyZXNpemU7XG4gIHZhciB3aW5kb3cgPSBnZXRXaW5kb3coc3RhdGUuZWxlbWVudHMucG9wcGVyKTtcbiAgdmFyIHNjcm9sbFBhcmVudHMgPSBbXS5jb25jYXQoc3RhdGUuc2Nyb2xsUGFyZW50cy5yZWZlcmVuY2UsIHN0YXRlLnNjcm9sbFBhcmVudHMucG9wcGVyKTtcblxuICBpZiAoc2Nyb2xsKSB7XG4gICAgc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzY3JvbGxQYXJlbnQpIHtcbiAgICAgIHNjcm9sbFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKHJlc2l6ZSkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2Nyb2xsKSB7XG4gICAgICBzY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbFBhcmVudCkge1xuICAgICAgICBzY3JvbGxQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyZXNpemUpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgIH1cbiAgfTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2V2ZW50TGlzdGVuZXJzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICd3cml0ZScsXG4gIGZuOiBmdW5jdGlvbiBmbigpIHt9LFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgZGF0YToge31cbn07IiwgInZhciBoYXNoID0ge1xuICBsZWZ0OiAncmlnaHQnLFxuICByaWdodDogJ2xlZnQnLFxuICBib3R0b206ICd0b3AnLFxuICB0b3A6ICdib3R0b20nXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufSIsICJ2YXIgaGFzaCA9IHtcbiAgc3RhcnQ6ICdlbmQnLFxuICBlbmQ6ICdzdGFydCdcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9zdGFydHxlbmQvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59IiwgImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGwobm9kZSkge1xuICB2YXIgd2luID0gZ2V0V2luZG93KG5vZGUpO1xuICB2YXIgc2Nyb2xsTGVmdCA9IHdpbi5wYWdlWE9mZnNldDtcbiAgdmFyIHNjcm9sbFRvcCA9IHdpbi5wYWdlWU9mZnNldDtcbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0OiBzY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wXG4gIH07XG59IiwgImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCkge1xuICAvLyBJZiA8aHRtbD4gaGFzIGEgQ1NTIHdpZHRoIGdyZWF0ZXIgdGhhbiB0aGUgdmlld3BvcnQsIHRoZW4gdGhpcyB3aWxsIGJlXG4gIC8vIGluY29ycmVjdCBmb3IgUlRMLlxuICAvLyBQb3BwZXIgMSBpcyBicm9rZW4gaW4gdGhpcyBjYXNlIGFuZCBuZXZlciBoYWQgYSBidWcgcmVwb3J0IHNvIGxldCdzIGFzc3VtZVxuICAvLyBpdCdzIG5vdCBhbiBpc3N1ZS4gSSBkb24ndCB0aGluayBhbnlvbmUgZXZlciBzcGVjaWZpZXMgd2lkdGggb24gPGh0bWw+XG4gIC8vIGFueXdheS5cbiAgLy8gQnJvd3NlcnMgd2hlcmUgdGhlIGxlZnQgc2Nyb2xsYmFyIGRvZXNuJ3QgY2F1c2UgYW4gaXNzdWUgcmVwb3J0IGAwYCBmb3JcbiAgLy8gdGhpcyAoZS5nLiBFZGdlIDIwMTksIElFMTEsIFNhZmFyaSlcbiAgcmV0dXJuIGdldEJvdW5kaW5nQ2xpZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpLmxlZnQgKyBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCkuc2Nyb2xsTGVmdDtcbn0iLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgaXNMYXlvdXRWaWV3cG9ydCBmcm9tIFwiLi9pc0xheW91dFZpZXdwb3J0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB2aXN1YWxWaWV3cG9ydCA9IHdpbi52aXN1YWxWaWV3cG9ydDtcbiAgdmFyIHdpZHRoID0gaHRtbC5jbGllbnRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGh0bWwuY2xpZW50SGVpZ2h0O1xuICB2YXIgeCA9IDA7XG4gIHZhciB5ID0gMDtcblxuICBpZiAodmlzdWFsVmlld3BvcnQpIHtcbiAgICB3aWR0aCA9IHZpc3VhbFZpZXdwb3J0LndpZHRoO1xuICAgIGhlaWdodCA9IHZpc3VhbFZpZXdwb3J0LmhlaWdodDtcbiAgICB2YXIgbGF5b3V0Vmlld3BvcnQgPSBpc0xheW91dFZpZXdwb3J0KCk7XG5cbiAgICBpZiAobGF5b3V0Vmlld3BvcnQgfHwgIWxheW91dFZpZXdwb3J0ICYmIHN0cmF0ZWd5ID09PSAnZml4ZWQnKSB7XG4gICAgICB4ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdDtcbiAgICAgIHkgPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCksXG4gICAgeTogeVxuICB9O1xufSIsICJpbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmltcG9ydCB7IG1heCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7IC8vIEdldHMgdGhlIGVudGlyZSBzaXplIG9mIHRoZSBzY3JvbGxhYmxlIGRvY3VtZW50IGFyZWEsIGV2ZW4gZXh0ZW5kaW5nIG91dHNpZGVcbi8vIG9mIHRoZSBgPGh0bWw+YCBhbmQgYDxib2R5PmAgcmVjdCBib3VuZHMgaWYgaG9yaXpvbnRhbGx5IHNjcm9sbGFibGVcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICB2YXIgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgdmFyIHdpblNjcm9sbCA9IGdldFdpbmRvd1Njcm9sbChlbGVtZW50KTtcbiAgdmFyIGJvZHkgPSAoX2VsZW1lbnQkb3duZXJEb2N1bWVuID0gZWxlbWVudC5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2VsZW1lbnQkb3duZXJEb2N1bWVuLmJvZHk7XG4gIHZhciB3aWR0aCA9IG1heChodG1sLnNjcm9sbFdpZHRoLCBodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5zY3JvbGxXaWR0aCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCk7XG4gIHZhciBoZWlnaHQgPSBtYXgoaHRtbC5zY3JvbGxIZWlnaHQsIGh0bWwuY2xpZW50SGVpZ2h0LCBib2R5ID8gYm9keS5zY3JvbGxIZWlnaHQgOiAwLCBib2R5ID8gYm9keS5jbGllbnRIZWlnaHQgOiAwKTtcbiAgdmFyIHggPSAtd2luU2Nyb2xsLnNjcm9sbExlZnQgKyBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpO1xuICB2YXIgeSA9IC13aW5TY3JvbGwuc2Nyb2xsVG9wO1xuXG4gIGlmIChnZXRDb21wdXRlZFN0eWxlKGJvZHkgfHwgaHRtbCkuZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgIHggKz0gbWF4KGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCkgLSB3aWR0aDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xufSIsICJpbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1Njcm9sbFBhcmVudChlbGVtZW50KSB7XG4gIC8vIEZpcmVmb3ggd2FudHMgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcbiAgdmFyIF9nZXRDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSxcbiAgICAgIG92ZXJmbG93ID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1gsXG4gICAgICBvdmVyZmxvd1kgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1k7XG5cbiAgcmV0dXJuIC9hdXRvfHNjcm9sbHxvdmVybGF5fGhpZGRlbi8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCk7XG59IiwgImltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KG5vZGUpIHtcbiAgaWYgKFsnaHRtbCcsICdib2R5JywgJyNkb2N1bWVudCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUobm9kZSkpID49IDApIHtcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgaWYgKGlzSFRNTEVsZW1lbnQobm9kZSkgJiYgaXNTY3JvbGxQYXJlbnQobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHJldHVybiBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShub2RlKSk7XG59IiwgImltcG9ydCBnZXRTY3JvbGxQYXJlbnQgZnJvbSBcIi4vZ2V0U2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG4vKlxuZ2l2ZW4gYSBET00gZWxlbWVudCwgcmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBzY3JvbGwgcGFyZW50cywgdXAgdGhlIGxpc3Qgb2YgYW5jZXNvcnNcbnVudGlsIHdlIGdldCB0byB0aGUgdG9wIHdpbmRvdyBvYmplY3QuIFRoaXMgbGlzdCBpcyB3aGF0IHdlIGF0dGFjaCBzY3JvbGwgbGlzdGVuZXJzXG50bywgYmVjYXVzZSBpZiBhbnkgb2YgdGhlc2UgcGFyZW50IGVsZW1lbnRzIHNjcm9sbCwgd2UnbGwgbmVlZCB0byByZS1jYWxjdWxhdGUgdGhlXG5yZWZlcmVuY2UgZWxlbWVudCdzIHBvc2l0aW9uLlxuKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGlzdFNjcm9sbFBhcmVudHMoZWxlbWVudCwgbGlzdCkge1xuICB2YXIgX2VsZW1lbnQkb3duZXJEb2N1bWVuO1xuXG4gIGlmIChsaXN0ID09PSB2b2lkIDApIHtcbiAgICBsaXN0ID0gW107XG4gIH1cblxuICB2YXIgc2Nyb2xsUGFyZW50ID0gZ2V0U2Nyb2xsUGFyZW50KGVsZW1lbnQpO1xuICB2YXIgaXNCb2R5ID0gc2Nyb2xsUGFyZW50ID09PSAoKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5KTtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhzY3JvbGxQYXJlbnQpO1xuICB2YXIgdGFyZ2V0ID0gaXNCb2R5ID8gW3dpbl0uY29uY2F0KHdpbi52aXN1YWxWaWV3cG9ydCB8fCBbXSwgaXNTY3JvbGxQYXJlbnQoc2Nyb2xsUGFyZW50KSA/IHNjcm9sbFBhcmVudCA6IFtdKSA6IHNjcm9sbFBhcmVudDtcbiAgdmFyIHVwZGF0ZWRMaXN0ID0gbGlzdC5jb25jYXQodGFyZ2V0KTtcbiAgcmV0dXJuIGlzQm9keSA/IHVwZGF0ZWRMaXN0IDogLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IGlzQm9keSB0ZWxscyB1cyB0YXJnZXQgd2lsbCBiZSBhbiBIVE1MRWxlbWVudCBoZXJlXG4gIHVwZGF0ZWRMaXN0LmNvbmNhdChsaXN0U2Nyb2xsUGFyZW50cyhnZXRQYXJlbnROb2RlKHRhcmdldCkpKTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVjdFRvQ2xpZW50UmVjdChyZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCByZWN0LCB7XG4gICAgbGVmdDogcmVjdC54LFxuICAgIHRvcDogcmVjdC55LFxuICAgIHJpZ2h0OiByZWN0LnggKyByZWN0LndpZHRoLFxuICAgIGJvdHRvbTogcmVjdC55ICsgcmVjdC5oZWlnaHRcbiAgfSk7XG59IiwgImltcG9ydCB7IHZpZXdwb3J0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0Vmlld3BvcnRSZWN0IGZyb20gXCIuL2dldFZpZXdwb3J0UmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50UmVjdCBmcm9tIFwiLi9nZXREb2N1bWVudFJlY3QuanNcIjtcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tIFwiLi9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQsIGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCIuL2NvbnRhaW5zLmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gXCIuLi91dGlscy9yZWN0VG9DbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgeyBtYXgsIG1pbiB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSB7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIGZhbHNlLCBzdHJhdGVneSA9PT0gJ2ZpeGVkJyk7XG4gIHJlY3QudG9wID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudFRvcDtcbiAgcmVjdC5sZWZ0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0O1xuICByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LndpZHRoID0gZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC5oZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC54ID0gcmVjdC5sZWZ0O1xuICByZWN0LnkgPSByZWN0LnRvcDtcbiAgcmV0dXJuIHJlY3Q7XG59XG5cbmZ1bmN0aW9uIGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSkge1xuICByZXR1cm4gY2xpcHBpbmdQYXJlbnQgPT09IHZpZXdwb3J0ID8gcmVjdFRvQ2xpZW50UmVjdChnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpKSA6IGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgPyBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChjbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpIDogcmVjdFRvQ2xpZW50UmVjdChnZXREb2N1bWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKSk7XG59IC8vIEEgXCJjbGlwcGluZyBwYXJlbnRcIiBpcyBhbiBvdmVyZmxvd2FibGUgY29udGFpbmVyIHdpdGggdGhlIGNoYXJhY3RlcmlzdGljIG9mXG4vLyBjbGlwcGluZyAob3IgaGlkaW5nKSBvdmVyZmxvd2luZyBlbGVtZW50cyB3aXRoIGEgcG9zaXRpb24gZGlmZmVyZW50IGZyb21cbi8vIGBpbml0aWFsYFxuXG5cbmZ1bmN0aW9uIGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSB7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBsaXN0U2Nyb2xsUGFyZW50cyhnZXRQYXJlbnROb2RlKGVsZW1lbnQpKTtcbiAgdmFyIGNhbkVzY2FwZUNsaXBwaW5nID0gWydhYnNvbHV0ZScsICdmaXhlZCddLmluZGV4T2YoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbikgPj0gMDtcbiAgdmFyIGNsaXBwZXJFbGVtZW50ID0gY2FuRXNjYXBlQ2xpcHBpbmcgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSA/IGdldE9mZnNldFBhcmVudChlbGVtZW50KSA6IGVsZW1lbnQ7XG5cbiAgaWYgKCFpc0VsZW1lbnQoY2xpcHBlckVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8xNDE0XG5cblxuICByZXR1cm4gY2xpcHBpbmdQYXJlbnRzLmZpbHRlcihmdW5jdGlvbiAoY2xpcHBpbmdQYXJlbnQpIHtcbiAgICByZXR1cm4gaXNFbGVtZW50KGNsaXBwaW5nUGFyZW50KSAmJiBjb250YWlucyhjbGlwcGluZ1BhcmVudCwgY2xpcHBlckVsZW1lbnQpICYmIGdldE5vZGVOYW1lKGNsaXBwaW5nUGFyZW50KSAhPT0gJ2JvZHknO1xuICB9KTtcbn0gLy8gR2V0cyB0aGUgbWF4aW11bSBhcmVhIHRoYXQgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiBkdWUgdG8gYW55IG51bWJlciBvZlxuLy8gY2xpcHBpbmcgcGFyZW50c1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENsaXBwaW5nUmVjdChlbGVtZW50LCBib3VuZGFyeSwgcm9vdEJvdW5kYXJ5LCBzdHJhdGVneSkge1xuICB2YXIgbWFpbkNsaXBwaW5nUGFyZW50cyA9IGJvdW5kYXJ5ID09PSAnY2xpcHBpbmdQYXJlbnRzJyA/IGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSA6IFtdLmNvbmNhdChib3VuZGFyeSk7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBbXS5jb25jYXQobWFpbkNsaXBwaW5nUGFyZW50cywgW3Jvb3RCb3VuZGFyeV0pO1xuICB2YXIgZmlyc3RDbGlwcGluZ1BhcmVudCA9IGNsaXBwaW5nUGFyZW50c1swXTtcbiAgdmFyIGNsaXBwaW5nUmVjdCA9IGNsaXBwaW5nUGFyZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjY1JlY3QsIGNsaXBwaW5nUGFyZW50KSB7XG4gICAgdmFyIHJlY3QgPSBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpO1xuICAgIGFjY1JlY3QudG9wID0gbWF4KHJlY3QudG9wLCBhY2NSZWN0LnRvcCk7XG4gICAgYWNjUmVjdC5yaWdodCA9IG1pbihyZWN0LnJpZ2h0LCBhY2NSZWN0LnJpZ2h0KTtcbiAgICBhY2NSZWN0LmJvdHRvbSA9IG1pbihyZWN0LmJvdHRvbSwgYWNjUmVjdC5ib3R0b20pO1xuICAgIGFjY1JlY3QubGVmdCA9IG1heChyZWN0LmxlZnQsIGFjY1JlY3QubGVmdCk7XG4gICAgcmV0dXJuIGFjY1JlY3Q7XG4gIH0sIGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGZpcnN0Q2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSk7XG4gIGNsaXBwaW5nUmVjdC53aWR0aCA9IGNsaXBwaW5nUmVjdC5yaWdodCAtIGNsaXBwaW5nUmVjdC5sZWZ0O1xuICBjbGlwcGluZ1JlY3QuaGVpZ2h0ID0gY2xpcHBpbmdSZWN0LmJvdHRvbSAtIGNsaXBwaW5nUmVjdC50b3A7XG4gIGNsaXBwaW5nUmVjdC54ID0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC55ID0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgcmV0dXJuIGNsaXBwaW5nUmVjdDtcbn0iLCAiaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4vZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSBcIi4vZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHN0YXJ0LCBlbmQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXB1dGVPZmZzZXRzKF9yZWYpIHtcbiAgdmFyIHJlZmVyZW5jZSA9IF9yZWYucmVmZXJlbmNlLFxuICAgICAgZWxlbWVudCA9IF9yZWYuZWxlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudCA/IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA6IG51bGw7XG4gIHZhciB2YXJpYXRpb24gPSBwbGFjZW1lbnQgPyBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA6IG51bGw7XG4gIHZhciBjb21tb25YID0gcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGggLyAyIC0gZWxlbWVudC53aWR0aCAvIDI7XG4gIHZhciBjb21tb25ZID0gcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0IC8gMiAtIGVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgdmFyIG9mZnNldHM7XG5cbiAgc3dpdGNoIChiYXNlUGxhY2VtZW50KSB7XG4gICAgY2FzZSB0b3A6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSAtIGVsZW1lbnQuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIGJvdHRvbTpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSByaWdodDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIGxlZnQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCAtIGVsZW1lbnQud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnlcbiAgICAgIH07XG4gIH1cblxuICB2YXIgbWFpbkF4aXMgPSBiYXNlUGxhY2VtZW50ID8gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpIDogbnVsbDtcblxuICBpZiAobWFpbkF4aXMgIT0gbnVsbCkge1xuICAgIHZhciBsZW4gPSBtYWluQXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gICAgc3dpdGNoICh2YXJpYXRpb24pIHtcbiAgICAgIGNhc2Ugc3RhcnQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gb2Zmc2V0c1ttYWluQXhpc10gLSAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIGVuZDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPSBvZmZzZXRzW21haW5BeGlzXSArIChyZWZlcmVuY2VbbGVuXSAvIDIgLSBlbGVtZW50W2xlbl0gLyAyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9mZnNldHM7XG59IiwgImltcG9ydCBnZXRDbGlwcGluZ1JlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRDbGlwcGluZ1JlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi9jb21wdXRlT2Zmc2V0cy5qc1wiO1xuaW1wb3J0IHJlY3RUb0NsaWVudFJlY3QgZnJvbSBcIi4vcmVjdFRvQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IHsgY2xpcHBpbmdQYXJlbnRzLCByZWZlcmVuY2UsIHBvcHBlciwgYm90dG9tLCB0b3AsIHJpZ2h0LCBiYXNlUGxhY2VtZW50cywgdmlld3BvcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IG1lcmdlUGFkZGluZ09iamVjdCBmcm9tIFwiLi9tZXJnZVBhZGRpbmdPYmplY3QuanNcIjtcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSBcIi4vZXhwYW5kVG9IYXNoTWFwLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBfb3B0aW9ucyRwbGFjZW1lbnQgPSBfb3B0aW9ucy5wbGFjZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfb3B0aW9ucyRwbGFjZW1lbnQgPT09IHZvaWQgMCA/IHN0YXRlLnBsYWNlbWVudCA6IF9vcHRpb25zJHBsYWNlbWVudCxcbiAgICAgIF9vcHRpb25zJHN0cmF0ZWd5ID0gX29wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBzdHJhdGVneSA9IF9vcHRpb25zJHN0cmF0ZWd5ID09PSB2b2lkIDAgPyBzdGF0ZS5zdHJhdGVneSA6IF9vcHRpb25zJHN0cmF0ZWd5LFxuICAgICAgX29wdGlvbnMkYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMkYm91bmRhcnkgPT09IHZvaWQgMCA/IGNsaXBwaW5nUGFyZW50cyA6IF9vcHRpb25zJGJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMkcm9vdEJvdW5kYXJ5ID09PSB2b2lkIDAgPyB2aWV3cG9ydCA6IF9vcHRpb25zJHJvb3RCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJGVsZW1lbnRDb250ZSA9IF9vcHRpb25zLmVsZW1lbnRDb250ZXh0LFxuICAgICAgZWxlbWVudENvbnRleHQgPSBfb3B0aW9ucyRlbGVtZW50Q29udGUgPT09IHZvaWQgMCA/IHBvcHBlciA6IF9vcHRpb25zJGVsZW1lbnRDb250ZSxcbiAgICAgIF9vcHRpb25zJGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IF9vcHRpb25zJGFsdEJvdW5kYXJ5ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkcGFkZGluZyA9IF9vcHRpb25zLnBhZGRpbmcsXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMkcGFkZGluZyA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHBhZGRpbmc7XG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gbWVyZ2VQYWRkaW5nT2JqZWN0KHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpKTtcbiAgdmFyIGFsdENvbnRleHQgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcmVmZXJlbmNlIDogcG9wcGVyO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1thbHRCb3VuZGFyeSA/IGFsdENvbnRleHQgOiBlbGVtZW50Q29udGV4dF07XG4gIHZhciBjbGlwcGluZ0NsaWVudFJlY3QgPSBnZXRDbGlwcGluZ1JlY3QoaXNFbGVtZW50KGVsZW1lbnQpID8gZWxlbWVudCA6IGVsZW1lbnQuY29udGV4dEVsZW1lbnQgfHwgZ2V0RG9jdW1lbnRFbGVtZW50KHN0YXRlLmVsZW1lbnRzLnBvcHBlciksIGJvdW5kYXJ5LCByb290Qm91bmRhcnksIHN0cmF0ZWd5KTtcbiAgdmFyIHJlZmVyZW5jZUNsaWVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qoc3RhdGUuZWxlbWVudHMucmVmZXJlbmNlKTtcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiByZWZlcmVuY2VDbGllbnRSZWN0LFxuICAgIGVsZW1lbnQ6IHBvcHBlclJlY3QsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnRcbiAgfSk7XG4gIHZhciBwb3BwZXJDbGllbnRSZWN0ID0gcmVjdFRvQ2xpZW50UmVjdChPYmplY3QuYXNzaWduKHt9LCBwb3BwZXJSZWN0LCBwb3BwZXJPZmZzZXRzKSk7XG4gIHZhciBlbGVtZW50Q2xpZW50UmVjdCA9IGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgPyBwb3BwZXJDbGllbnRSZWN0IDogcmVmZXJlbmNlQ2xpZW50UmVjdDsgLy8gcG9zaXRpdmUgPSBvdmVyZmxvd2luZyB0aGUgY2xpcHBpbmcgcmVjdFxuICAvLyAwIG9yIG5lZ2F0aXZlID0gd2l0aGluIHRoZSBjbGlwcGluZyByZWN0XG5cbiAgdmFyIG92ZXJmbG93T2Zmc2V0cyA9IHtcbiAgICB0b3A6IGNsaXBwaW5nQ2xpZW50UmVjdC50b3AgLSBlbGVtZW50Q2xpZW50UmVjdC50b3AgKyBwYWRkaW5nT2JqZWN0LnRvcCxcbiAgICBib3R0b206IGVsZW1lbnRDbGllbnRSZWN0LmJvdHRvbSAtIGNsaXBwaW5nQ2xpZW50UmVjdC5ib3R0b20gKyBwYWRkaW5nT2JqZWN0LmJvdHRvbSxcbiAgICBsZWZ0OiBjbGlwcGluZ0NsaWVudFJlY3QubGVmdCAtIGVsZW1lbnRDbGllbnRSZWN0LmxlZnQgKyBwYWRkaW5nT2JqZWN0LmxlZnQsXG4gICAgcmlnaHQ6IGVsZW1lbnRDbGllbnRSZWN0LnJpZ2h0IC0gY2xpcHBpbmdDbGllbnRSZWN0LnJpZ2h0ICsgcGFkZGluZ09iamVjdC5yaWdodFxuICB9O1xuICB2YXIgb2Zmc2V0RGF0YSA9IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0OyAvLyBPZmZzZXRzIGNhbiBiZSBhcHBsaWVkIG9ubHkgdG8gdGhlIHBvcHBlciBlbGVtZW50XG5cbiAgaWYgKGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgJiYgb2Zmc2V0RGF0YSkge1xuICAgIHZhciBvZmZzZXQgPSBvZmZzZXREYXRhW3BsYWNlbWVudF07XG4gICAgT2JqZWN0LmtleXMob3ZlcmZsb3dPZmZzZXRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBtdWx0aXBseSA9IFtyaWdodCwgYm90dG9tXS5pbmRleE9mKGtleSkgPj0gMCA/IDEgOiAtMTtcbiAgICAgIHZhciBheGlzID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKGtleSkgPj0gMCA/ICd5JyA6ICd4JztcbiAgICAgIG92ZXJmbG93T2Zmc2V0c1trZXldICs9IG9mZnNldFtheGlzXSAqIG11bHRpcGx5O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG92ZXJmbG93T2Zmc2V0cztcbn0iLCAiaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCB7IHZhcmlhdGlvblBsYWNlbWVudHMsIGJhc2VQbGFjZW1lbnRzLCBwbGFjZW1lbnRzIGFzIGFsbFBsYWNlbWVudHMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4vZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZUF1dG9QbGFjZW1lbnQoc3RhdGUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBwbGFjZW1lbnQgPSBfb3B0aW9ucy5wbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeSA9IF9vcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZyA9IF9vcHRpb25zLnBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9ucyA9IF9vcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgX29wdGlvbnMkYWxsb3dlZEF1dG9QID0gX29wdGlvbnMuYWxsb3dlZEF1dG9QbGFjZW1lbnRzLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzID0gX29wdGlvbnMkYWxsb3dlZEF1dG9QID09PSB2b2lkIDAgPyBhbGxQbGFjZW1lbnRzIDogX29wdGlvbnMkYWxsb3dlZEF1dG9QO1xuICB2YXIgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCk7XG4gIHZhciBwbGFjZW1lbnRzID0gdmFyaWF0aW9uID8gZmxpcFZhcmlhdGlvbnMgPyB2YXJpYXRpb25QbGFjZW1lbnRzIDogdmFyaWF0aW9uUGxhY2VtZW50cy5maWx0ZXIoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHJldHVybiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA9PT0gdmFyaWF0aW9uO1xuICB9KSA6IGJhc2VQbGFjZW1lbnRzO1xuICB2YXIgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGFsbG93ZWRBdXRvUGxhY2VtZW50cy5pbmRleE9mKHBsYWNlbWVudCkgPj0gMDtcbiAgfSk7XG5cbiAgaWYgKGFsbG93ZWRQbGFjZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cztcbiAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS10eXBlXTogRmxvdyBzZWVtcyB0byBoYXZlIHByb2JsZW1zIHdpdGggdHdvIGFycmF5IHVuaW9ucy4uLlxuXG5cbiAgdmFyIG92ZXJmbG93cyA9IGFsbG93ZWRQbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pW2dldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KV07XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICByZXR1cm4gT2JqZWN0LmtleXMob3ZlcmZsb3dzKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIG92ZXJmbG93c1thXSAtIG92ZXJmbG93c1tiXTtcbiAgfSk7XG59IiwgImltcG9ydCBnZXRPcHBvc2l0ZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0T3Bwb3NpdGVQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgY29tcHV0ZUF1dG9QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyBib3R0b20sIHRvcCwgc3RhcnQsIHJpZ2h0LCBsZWZ0LCBhdXRvIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5mdW5jdGlvbiBnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyhwbGFjZW1lbnQpIHtcbiAgaWYgKGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA9PT0gYXV0bykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBvcHBvc2l0ZVBsYWNlbWVudCA9IGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHJldHVybiBbZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQocGxhY2VtZW50KSwgb3Bwb3NpdGVQbGFjZW1lbnQsIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KG9wcG9zaXRlUGxhY2VtZW50KV07XG59XG5cbmZ1bmN0aW9uIGZsaXAoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0uX3NraXApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgX29wdGlvbnMkbWFpbkF4aXMgPSBvcHRpb25zLm1haW5BeGlzLFxuICAgICAgY2hlY2tNYWluQXhpcyA9IF9vcHRpb25zJG1haW5BeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkbWFpbkF4aXMsXG4gICAgICBfb3B0aW9ucyRhbHRBeGlzID0gb3B0aW9ucy5hbHRBeGlzLFxuICAgICAgY2hlY2tBbHRBeGlzID0gX29wdGlvbnMkYWx0QXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGFsdEF4aXMsXG4gICAgICBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgPSBvcHRpb25zLmZhbGxiYWNrUGxhY2VtZW50cyxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcsXG4gICAgICBib3VuZGFyeSA9IG9wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBvcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJGZsaXBWYXJpYXRpbyA9IG9wdGlvbnMuZmxpcFZhcmlhdGlvbnMsXG4gICAgICBmbGlwVmFyaWF0aW9ucyA9IF9vcHRpb25zJGZsaXBWYXJpYXRpbyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGZsaXBWYXJpYXRpbyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50cyA9IG9wdGlvbnMuYWxsb3dlZEF1dG9QbGFjZW1lbnRzO1xuICB2YXIgcHJlZmVycmVkUGxhY2VtZW50ID0gc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpO1xuICB2YXIgaXNCYXNlUGxhY2VtZW50ID0gYmFzZVBsYWNlbWVudCA9PT0gcHJlZmVycmVkUGxhY2VtZW50O1xuICB2YXIgZmFsbGJhY2tQbGFjZW1lbnRzID0gc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzIHx8IChpc0Jhc2VQbGFjZW1lbnQgfHwgIWZsaXBWYXJpYXRpb25zID8gW2dldE9wcG9zaXRlUGxhY2VtZW50KHByZWZlcnJlZFBsYWNlbWVudCldIDogZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocHJlZmVycmVkUGxhY2VtZW50KSk7XG4gIHZhciBwbGFjZW1lbnRzID0gW3ByZWZlcnJlZFBsYWNlbWVudF0uY29uY2F0KGZhbGxiYWNrUGxhY2VtZW50cykucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIHJldHVybiBhY2MuY29uY2F0KGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA9PT0gYXV0byA/IGNvbXB1dGVBdXRvUGxhY2VtZW50KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZyxcbiAgICAgIGZsaXBWYXJpYXRpb25zOiBmbGlwVmFyaWF0aW9ucyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50czogYWxsb3dlZEF1dG9QbGFjZW1lbnRzXG4gICAgfSkgOiBwbGFjZW1lbnQpO1xuICB9LCBbXSk7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIGNoZWNrc01hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIG1ha2VGYWxsYmFja0NoZWNrcyA9IHRydWU7XG4gIHZhciBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzWzBdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGxhY2VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwbGFjZW1lbnQgPSBwbGFjZW1lbnRzW2ldO1xuXG4gICAgdmFyIF9iYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuXG4gICAgdmFyIGlzU3RhcnRWYXJpYXRpb24gPSBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA9PT0gc3RhcnQ7XG4gICAgdmFyIGlzVmVydGljYWwgPSBbdG9wLCBib3R0b21dLmluZGV4T2YoX2Jhc2VQbGFjZW1lbnQpID49IDA7XG4gICAgdmFyIGxlbiA9IGlzVmVydGljYWwgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG4gICAgdmFyIG92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeTogYWx0Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSk7XG4gICAgdmFyIG1haW5WYXJpYXRpb25TaWRlID0gaXNWZXJ0aWNhbCA/IGlzU3RhcnRWYXJpYXRpb24gPyByaWdodCA6IGxlZnQgOiBpc1N0YXJ0VmFyaWF0aW9uID8gYm90dG9tIDogdG9wO1xuXG4gICAgaWYgKHJlZmVyZW5jZVJlY3RbbGVuXSA+IHBvcHBlclJlY3RbbGVuXSkge1xuICAgICAgbWFpblZhcmlhdGlvblNpZGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChtYWluVmFyaWF0aW9uU2lkZSk7XG4gICAgfVxuXG4gICAgdmFyIGFsdFZhcmlhdGlvblNpZGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChtYWluVmFyaWF0aW9uU2lkZSk7XG4gICAgdmFyIGNoZWNrcyA9IFtdO1xuXG4gICAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICAgIGNoZWNrcy5wdXNoKG92ZXJmbG93W19iYXNlUGxhY2VtZW50XSA8PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1ttYWluVmFyaWF0aW9uU2lkZV0gPD0gMCwgb3ZlcmZsb3dbYWx0VmFyaWF0aW9uU2lkZV0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrcy5ldmVyeShmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgIHJldHVybiBjaGVjaztcbiAgICB9KSkge1xuICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50O1xuICAgICAgbWFrZUZhbGxiYWNrQ2hlY2tzID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjaGVja3NNYXAuc2V0KHBsYWNlbWVudCwgY2hlY2tzKTtcbiAgfVxuXG4gIGlmIChtYWtlRmFsbGJhY2tDaGVja3MpIHtcbiAgICAvLyBgMmAgbWF5IGJlIGRlc2lyZWQgaW4gc29tZSBjYXNlcyBcdTIwMTMgcmVzZWFyY2ggbGF0ZXJcbiAgICB2YXIgbnVtYmVyT2ZDaGVja3MgPSBmbGlwVmFyaWF0aW9ucyA/IDMgOiAxO1xuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoX2kpIHtcbiAgICAgIHZhciBmaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50cy5maW5kKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICAgICAgdmFyIGNoZWNrcyA9IGNoZWNrc01hcC5nZXQocGxhY2VtZW50KTtcblxuICAgICAgICBpZiAoY2hlY2tzKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrcy5zbGljZSgwLCBfaSkuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hlY2s7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZml0dGluZ1BsYWNlbWVudCkge1xuICAgICAgICBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBmaXR0aW5nUGxhY2VtZW50O1xuICAgICAgICByZXR1cm4gXCJicmVha1wiO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKHZhciBfaSA9IG51bWJlck9mQ2hlY2tzOyBfaSA+IDA7IF9pLS0pIHtcbiAgICAgIHZhciBfcmV0ID0gX2xvb3AoX2kpO1xuXG4gICAgICBpZiAoX3JldCA9PT0gXCJicmVha1wiKSBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUucGxhY2VtZW50ICE9PSBmaXJzdEZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwID0gdHJ1ZTtcbiAgICBzdGF0ZS5wbGFjZW1lbnQgPSBmaXJzdEZpdHRpbmdQbGFjZW1lbnQ7XG4gICAgc3RhdGUucmVzZXQgPSB0cnVlO1xuICB9XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdmbGlwJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IGZsaXAsXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsnb2Zmc2V0J10sXG4gIGRhdGE6IHtcbiAgICBfc2tpcDogZmFsc2VcbiAgfVxufTsiLCAiaW1wb3J0IHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5cbmZ1bmN0aW9uIGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0LCBwcmV2ZW50ZWRPZmZzZXRzKSB7XG4gIGlmIChwcmV2ZW50ZWRPZmZzZXRzID09PSB2b2lkIDApIHtcbiAgICBwcmV2ZW50ZWRPZmZzZXRzID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0b3A6IG92ZXJmbG93LnRvcCAtIHJlY3QuaGVpZ2h0IC0gcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIHJpZ2h0OiBvdmVyZmxvdy5yaWdodCAtIHJlY3Qud2lkdGggKyBwcmV2ZW50ZWRPZmZzZXRzLngsXG4gICAgYm90dG9tOiBvdmVyZmxvdy5ib3R0b20gLSByZWN0LmhlaWdodCArIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICBsZWZ0OiBvdmVyZmxvdy5sZWZ0IC0gcmVjdC53aWR0aCAtIHByZXZlbnRlZE9mZnNldHMueFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0FueVNpZGVGdWxseUNsaXBwZWQob3ZlcmZsb3cpIHtcbiAgcmV0dXJuIFt0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnRdLnNvbWUoZnVuY3Rpb24gKHNpZGUpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dbc2lkZV0gPj0gMDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhpZGUoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgcHJldmVudGVkT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucHJldmVudE92ZXJmbG93O1xuICB2YXIgcmVmZXJlbmNlT3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGVsZW1lbnRDb250ZXh0OiAncmVmZXJlbmNlJ1xuICB9KTtcbiAgdmFyIHBvcHBlckFsdE92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBhbHRCb3VuZGFyeTogdHJ1ZVxuICB9KTtcbiAgdmFyIHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKHJlZmVyZW5jZU92ZXJmbG93LCByZWZlcmVuY2VSZWN0KTtcbiAgdmFyIHBvcHBlckVzY2FwZU9mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhwb3BwZXJBbHRPdmVyZmxvdywgcG9wcGVyUmVjdCwgcHJldmVudGVkT2Zmc2V0cyk7XG4gIHZhciBpc1JlZmVyZW5jZUhpZGRlbiA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChyZWZlcmVuY2VDbGlwcGluZ09mZnNldHMpO1xuICB2YXIgaGFzUG9wcGVyRXNjYXBlZCA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChwb3BwZXJFc2NhcGVPZmZzZXRzKTtcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IHtcbiAgICByZWZlcmVuY2VDbGlwcGluZ09mZnNldHM6IHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyxcbiAgICBwb3BwZXJFc2NhcGVPZmZzZXRzOiBwb3BwZXJFc2NhcGVPZmZzZXRzLFxuICAgIGlzUmVmZXJlbmNlSGlkZGVuOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICBoYXNQb3BwZXJFc2NhcGVkOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH07XG4gIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIsIHtcbiAgICAnZGF0YS1wb3BwZXItcmVmZXJlbmNlLWhpZGRlbic6IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgICdkYXRhLXBvcHBlci1lc2NhcGVkJzogaGFzUG9wcGVyRXNjYXBlZFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2hpZGUnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddLFxuICBmbjogaGlkZVxufTsiLCAiaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIHBsYWNlbWVudHMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2VBbmRTa2lkZGluZ1RvWFkocGxhY2VtZW50LCByZWN0cywgb2Zmc2V0KSB7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICB2YXIgaW52ZXJ0RGlzdGFuY2UgPSBbbGVmdCwgdG9wXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyAtMSA6IDE7XG5cbiAgdmFyIF9yZWYgPSB0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nID8gb2Zmc2V0KE9iamVjdC5hc3NpZ24oe30sIHJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnRcbiAgfSkpIDogb2Zmc2V0LFxuICAgICAgc2tpZGRpbmcgPSBfcmVmWzBdLFxuICAgICAgZGlzdGFuY2UgPSBfcmVmWzFdO1xuXG4gIHNraWRkaW5nID0gc2tpZGRpbmcgfHwgMDtcbiAgZGlzdGFuY2UgPSAoZGlzdGFuY2UgfHwgMCkgKiBpbnZlcnREaXN0YW5jZTtcbiAgcmV0dXJuIFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwID8ge1xuICAgIHg6IGRpc3RhbmNlLFxuICAgIHk6IHNraWRkaW5nXG4gIH0gOiB7XG4gICAgeDogc2tpZGRpbmcsXG4gICAgeTogZGlzdGFuY2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gb2Zmc2V0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYyLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZjIubmFtZTtcbiAgdmFyIF9vcHRpb25zJG9mZnNldCA9IG9wdGlvbnMub2Zmc2V0LFxuICAgICAgb2Zmc2V0ID0gX29wdGlvbnMkb2Zmc2V0ID09PSB2b2lkIDAgPyBbMCwgMF0gOiBfb3B0aW9ucyRvZmZzZXQ7XG4gIHZhciBkYXRhID0gcGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHN0YXRlLnJlY3RzLCBvZmZzZXQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgdmFyIF9kYXRhJHN0YXRlJHBsYWNlbWVudCA9IGRhdGFbc3RhdGUucGxhY2VtZW50XSxcbiAgICAgIHggPSBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQueCxcbiAgICAgIHkgPSBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQueTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzICE9IG51bGwpIHtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueCArPSB4O1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy55ICs9IHk7XG4gIH1cblxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gZGF0YTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ29mZnNldCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIHJlcXVpcmVzOiBbJ3BvcHBlck9mZnNldHMnXSxcbiAgZm46IG9mZnNldFxufTsiLCAiaW1wb3J0IGNvbXB1dGVPZmZzZXRzIGZyb20gXCIuLi91dGlscy9jb21wdXRlT2Zmc2V0cy5qc1wiO1xuXG5mdW5jdGlvbiBwb3BwZXJPZmZzZXRzKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIC8vIE9mZnNldHMgYXJlIHRoZSBhY3R1YWwgcG9zaXRpb24gdGhlIHBvcHBlciBuZWVkcyB0byBoYXZlIHRvIGJlXG4gIC8vIHByb3Blcmx5IHBvc2l0aW9uZWQgbmVhciBpdHMgcmVmZXJlbmNlIGVsZW1lbnRcbiAgLy8gVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBwbGFjZW1lbnQsIGFuZCB3aWxsIGJlIGFkanVzdGVkIGJ5XG4gIC8vIHRoZSBtb2RpZmllcnMgaW4gdGhlIG5leHQgc3RlcFxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogc3RhdGUucmVjdHMucmVmZXJlbmNlLFxuICAgIGVsZW1lbnQ6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ3BvcHBlck9mZnNldHMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3JlYWQnLFxuICBmbjogcG9wcGVyT2Zmc2V0cyxcbiAgZGF0YToge31cbn07IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEFsdEF4aXMoYXhpcykge1xuICByZXR1cm4gYXhpcyA9PT0gJ3gnID8gJ3knIDogJ3gnO1xufSIsICJpbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHN0YXJ0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QWx0QXhpcyBmcm9tIFwiLi4vdXRpbHMvZ2V0QWx0QXhpcy5qc1wiO1xuaW1wb3J0IHsgd2l0aGluLCB3aXRoaW5NYXhDbGFtcCB9IGZyb20gXCIuLi91dGlscy93aXRoaW4uanNcIjtcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gXCIuLi91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanNcIjtcbmltcG9ydCB7IG1pbiBhcyBtYXRoTWluLCBtYXggYXMgbWF0aE1heCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIHByZXZlbnRPdmVyZmxvdyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IGZhbHNlIDogX29wdGlvbnMkYWx0QXhpcyxcbiAgICAgIGJvdW5kYXJ5ID0gb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IG9wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBvcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyxcbiAgICAgIF9vcHRpb25zJHRldGhlciA9IG9wdGlvbnMudGV0aGVyLFxuICAgICAgdGV0aGVyID0gX29wdGlvbnMkdGV0aGVyID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkdGV0aGVyLFxuICAgICAgX29wdGlvbnMkdGV0aGVyT2Zmc2V0ID0gb3B0aW9ucy50ZXRoZXJPZmZzZXQsXG4gICAgICB0ZXRoZXJPZmZzZXQgPSBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQ7XG4gIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5XG4gIH0pO1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIHZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgaXNCYXNlUGxhY2VtZW50ID0gIXZhcmlhdGlvbjtcbiAgdmFyIG1haW5BeGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgYWx0QXhpcyA9IGdldEFsdEF4aXMobWFpbkF4aXMpO1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgdGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0ID09PSAnZnVuY3Rpb24nID8gdGV0aGVyT2Zmc2V0KE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSkpIDogdGV0aGVyT2Zmc2V0O1xuICB2YXIgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlID0gdHlwZW9mIHRldGhlck9mZnNldFZhbHVlID09PSAnbnVtYmVyJyA/IHtcbiAgICBtYWluQXhpczogdGV0aGVyT2Zmc2V0VmFsdWUsXG4gICAgYWx0QXhpczogdGV0aGVyT2Zmc2V0VmFsdWVcbiAgfSA6IE9iamVjdC5hc3NpZ24oe1xuICAgIG1haW5BeGlzOiAwLFxuICAgIGFsdEF4aXM6IDBcbiAgfSwgdGV0aGVyT2Zmc2V0VmFsdWUpO1xuICB2YXIgb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0ID8gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXRbc3RhdGUucGxhY2VtZW50XSA6IG51bGw7XG4gIHZhciBkYXRhID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIGlmICghcG9wcGVyT2Zmc2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclN0YXRlJDtcblxuICAgIHZhciBtYWluU2lkZSA9IG1haW5BeGlzID09PSAneScgPyB0b3AgOiBsZWZ0O1xuICAgIHZhciBhbHRTaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IGJvdHRvbSA6IHJpZ2h0O1xuICAgIHZhciBsZW4gPSBtYWluQXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICAgIHZhciBvZmZzZXQgPSBwb3BwZXJPZmZzZXRzW21haW5BeGlzXTtcbiAgICB2YXIgbWluID0gb2Zmc2V0ICsgb3ZlcmZsb3dbbWFpblNpZGVdO1xuICAgIHZhciBtYXggPSBvZmZzZXQgLSBvdmVyZmxvd1thbHRTaWRlXTtcbiAgICB2YXIgYWRkaXRpdmUgPSB0ZXRoZXIgPyAtcG9wcGVyUmVjdFtsZW5dIC8gMiA6IDA7XG4gICAgdmFyIG1pbkxlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyByZWZlcmVuY2VSZWN0W2xlbl0gOiBwb3BwZXJSZWN0W2xlbl07XG4gICAgdmFyIG1heExlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyAtcG9wcGVyUmVjdFtsZW5dIDogLXJlZmVyZW5jZVJlY3RbbGVuXTsgLy8gV2UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcnJvdyBpbiB0aGUgY2FsY3VsYXRpb24gc28gdGhlIGFycm93IGRvZXNuJ3QgZ29cbiAgICAvLyBvdXRzaWRlIHRoZSByZWZlcmVuY2UgYm91bmRzXG5cbiAgICB2YXIgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3c7XG4gICAgdmFyIGFycm93UmVjdCA9IHRldGhlciAmJiBhcnJvd0VsZW1lbnQgPyBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCkgOiB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG4gICAgdmFyIGFycm93UGFkZGluZ09iamVjdCA9IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXSA/IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXS5wYWRkaW5nIDogZ2V0RnJlc2hTaWRlT2JqZWN0KCk7XG4gICAgdmFyIGFycm93UGFkZGluZ01pbiA9IGFycm93UGFkZGluZ09iamVjdFttYWluU2lkZV07XG4gICAgdmFyIGFycm93UGFkZGluZ01heCA9IGFycm93UGFkZGluZ09iamVjdFthbHRTaWRlXTsgLy8gSWYgdGhlIHJlZmVyZW5jZSBsZW5ndGggaXMgc21hbGxlciB0aGFuIHRoZSBhcnJvdyBsZW5ndGgsIHdlIGRvbid0IHdhbnRcbiAgICAvLyB0byBpbmNsdWRlIGl0cyBmdWxsIHNpemUgaW4gdGhlIGNhbGN1bGF0aW9uLiBJZiB0aGUgcmVmZXJlbmNlIGlzIHNtYWxsXG4gICAgLy8gYW5kIG5lYXIgdGhlIGVkZ2Ugb2YgYSBib3VuZGFyeSwgdGhlIHBvcHBlciBjYW4gb3ZlcmZsb3cgZXZlbiBpZiB0aGVcbiAgICAvLyByZWZlcmVuY2UgaXMgbm90IG92ZXJmbG93aW5nIGFzIHdlbGwgKGUuZy4gdmlydHVhbCBlbGVtZW50cyB3aXRoIG5vXG4gICAgLy8gd2lkdGggb3IgaGVpZ2h0KVxuXG4gICAgdmFyIGFycm93TGVuID0gd2l0aGluKDAsIHJlZmVyZW5jZVJlY3RbbGVuXSwgYXJyb3dSZWN0W2xlbl0pO1xuICAgIHZhciBtaW5PZmZzZXQgPSBpc0Jhc2VQbGFjZW1lbnQgPyByZWZlcmVuY2VSZWN0W2xlbl0gLyAyIC0gYWRkaXRpdmUgLSBhcnJvd0xlbiAtIGFycm93UGFkZGluZ01pbiAtIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcyA6IG1pbkxlbiAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIHZhciBtYXhPZmZzZXQgPSBpc0Jhc2VQbGFjZW1lbnQgPyAtcmVmZXJlbmNlUmVjdFtsZW5dIC8gMiArIGFkZGl0aXZlICsgYXJyb3dMZW4gKyBhcnJvd1BhZGRpbmdNYXggKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXMgOiBtYXhMZW4gKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcztcbiAgICB2YXIgYXJyb3dPZmZzZXRQYXJlbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdyAmJiBnZXRPZmZzZXRQYXJlbnQoc3RhdGUuZWxlbWVudHMuYXJyb3cpO1xuICAgIHZhciBjbGllbnRPZmZzZXQgPSBhcnJvd09mZnNldFBhcmVudCA/IG1haW5BeGlzID09PSAneScgPyBhcnJvd09mZnNldFBhcmVudC5jbGllbnRUb3AgfHwgMCA6IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudExlZnQgfHwgMCA6IDA7XG4gICAgdmFyIG9mZnNldE1vZGlmaWVyVmFsdWUgPSAoX29mZnNldE1vZGlmaWVyU3RhdGUkID0gb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogb2Zmc2V0TW9kaWZpZXJTdGF0ZVttYWluQXhpc10pICE9IG51bGwgPyBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQgOiAwO1xuICAgIHZhciB0ZXRoZXJNaW4gPSBvZmZzZXQgKyBtaW5PZmZzZXQgLSBvZmZzZXRNb2RpZmllclZhbHVlIC0gY2xpZW50T2Zmc2V0O1xuICAgIHZhciB0ZXRoZXJNYXggPSBvZmZzZXQgKyBtYXhPZmZzZXQgLSBvZmZzZXRNb2RpZmllclZhbHVlO1xuICAgIHZhciBwcmV2ZW50ZWRPZmZzZXQgPSB3aXRoaW4odGV0aGVyID8gbWF0aE1pbihtaW4sIHRldGhlck1pbikgOiBtaW4sIG9mZnNldCwgdGV0aGVyID8gbWF0aE1heChtYXgsIHRldGhlck1heCkgOiBtYXgpO1xuICAgIHBvcHBlck9mZnNldHNbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0IC0gb2Zmc2V0O1xuICB9XG5cbiAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyO1xuXG4gICAgdmFyIF9tYWluU2lkZSA9IG1haW5BeGlzID09PSAneCcgPyB0b3AgOiBsZWZ0O1xuXG4gICAgdmFyIF9hbHRTaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IGJvdHRvbSA6IHJpZ2h0O1xuXG4gICAgdmFyIF9vZmZzZXQgPSBwb3BwZXJPZmZzZXRzW2FsdEF4aXNdO1xuXG4gICAgdmFyIF9sZW4gPSBhbHRBeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICB2YXIgX21pbiA9IF9vZmZzZXQgKyBvdmVyZmxvd1tfbWFpblNpZGVdO1xuXG4gICAgdmFyIF9tYXggPSBfb2Zmc2V0IC0gb3ZlcmZsb3dbX2FsdFNpZGVdO1xuXG4gICAgdmFyIGlzT3JpZ2luU2lkZSA9IFt0b3AsIGxlZnRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgIT09IC0xO1xuXG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclZhbHVlID0gKF9vZmZzZXRNb2RpZmllclN0YXRlJDIgPSBvZmZzZXRNb2RpZmllclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBvZmZzZXRNb2RpZmllclN0YXRlW2FsdEF4aXNdKSAhPSBudWxsID8gX29mZnNldE1vZGlmaWVyU3RhdGUkMiA6IDA7XG5cbiAgICB2YXIgX3RldGhlck1pbiA9IGlzT3JpZ2luU2lkZSA/IF9taW4gOiBfb2Zmc2V0IC0gcmVmZXJlbmNlUmVjdFtfbGVuXSAtIHBvcHBlclJlY3RbX2xlbl0gLSBfb2Zmc2V0TW9kaWZpZXJWYWx1ZSArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5hbHRBeGlzO1xuXG4gICAgdmFyIF90ZXRoZXJNYXggPSBpc09yaWdpblNpZGUgPyBfb2Zmc2V0ICsgcmVmZXJlbmNlUmVjdFtfbGVuXSArIHBvcHBlclJlY3RbX2xlbl0gLSBfb2Zmc2V0TW9kaWZpZXJWYWx1ZSAtIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5hbHRBeGlzIDogX21heDtcblxuICAgIHZhciBfcHJldmVudGVkT2Zmc2V0ID0gdGV0aGVyICYmIGlzT3JpZ2luU2lkZSA/IHdpdGhpbk1heENsYW1wKF90ZXRoZXJNaW4sIF9vZmZzZXQsIF90ZXRoZXJNYXgpIDogd2l0aGluKHRldGhlciA/IF90ZXRoZXJNaW4gOiBfbWluLCBfb2Zmc2V0LCB0ZXRoZXIgPyBfdGV0aGVyTWF4IDogX21heCk7XG5cbiAgICBwb3BwZXJPZmZzZXRzW2FsdEF4aXNdID0gX3ByZXZlbnRlZE9mZnNldDtcbiAgICBkYXRhW2FsdEF4aXNdID0gX3ByZXZlbnRlZE9mZnNldCAtIF9vZmZzZXQ7XG4gIH1cblxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gZGF0YTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBwcmV2ZW50T3ZlcmZsb3csXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsnb2Zmc2V0J11cbn07IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEhUTUxFbGVtZW50U2Nyb2xsKGVsZW1lbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0OiBlbGVtZW50LnNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBlbGVtZW50LnNjcm9sbFRvcFxuICB9O1xufSIsICJpbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0SFRNTEVsZW1lbnRTY3JvbGwgZnJvbSBcIi4vZ2V0SFRNTEVsZW1lbnRTY3JvbGwuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVTY3JvbGwobm9kZSkge1xuICBpZiAobm9kZSA9PT0gZ2V0V2luZG93KG5vZGUpIHx8ICFpc0hUTUxFbGVtZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIGdldFdpbmRvd1Njcm9sbChub2RlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0SFRNTEVsZW1lbnRTY3JvbGwobm9kZSk7XG4gIH1cbn0iLCAiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXROb2RlU2Nyb2xsIGZyb20gXCIuL2dldE5vZGVTY3JvbGwuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gaXNFbGVtZW50U2NhbGVkKGVsZW1lbnQpIHtcbiAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gcm91bmQocmVjdC53aWR0aCkgLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDE7XG4gIHZhciBzY2FsZVkgPSByb3VuZChyZWN0LmhlaWdodCkgLyBlbGVtZW50Lm9mZnNldEhlaWdodCB8fCAxO1xuICByZXR1cm4gc2NhbGVYICE9PSAxIHx8IHNjYWxlWSAhPT0gMTtcbn0gLy8gUmV0dXJucyB0aGUgY29tcG9zaXRlIHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LlxuLy8gQ29tcG9zaXRlIG1lYW5zIGl0IHRha2VzIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zIGFzIHdlbGwgYXMgbGF5b3V0LlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXBvc2l0ZVJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudCwgaXNGaXhlZCkge1xuICBpZiAoaXNGaXhlZCA9PT0gdm9pZCAwKSB7XG4gICAgaXNGaXhlZCA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50SXNTY2FsZWQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgaXNFbGVtZW50U2NhbGVkKG9mZnNldFBhcmVudCk7XG4gIHZhciBkb2N1bWVudEVsZW1lbnQgPSBnZXREb2N1bWVudEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudElzU2NhbGVkLCBpc0ZpeGVkKTtcbiAgdmFyIHNjcm9sbCA9IHtcbiAgICBzY3JvbGxMZWZ0OiAwLFxuICAgIHNjcm9sbFRvcDogMFxuICB9O1xuICB2YXIgb2Zmc2V0cyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmICFpc0ZpeGVkKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzEwNzhcbiAgICBpc1Njcm9sbFBhcmVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgb2Zmc2V0cyA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQsIHRydWUpO1xuICAgICAgb2Zmc2V0cy54ICs9IG9mZnNldFBhcmVudC5jbGllbnRMZWZ0O1xuICAgICAgb2Zmc2V0cy55ICs9IG9mZnNldFBhcmVudC5jbGllbnRUb3A7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIG9mZnNldHMueCA9IGdldFdpbmRvd1Njcm9sbEJhclgoZG9jdW1lbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IHJlY3QubGVmdCArIHNjcm9sbC5zY3JvbGxMZWZ0IC0gb2Zmc2V0cy54LFxuICAgIHk6IHJlY3QudG9wICsgc2Nyb2xsLnNjcm9sbFRvcCAtIG9mZnNldHMueSxcbiAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0XG4gIH07XG59IiwgImltcG9ydCB7IG1vZGlmaWVyUGhhc2VzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIHNvdXJjZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDk4NzUyNTVcblxuZnVuY3Rpb24gb3JkZXIobW9kaWZpZXJzKSB7XG4gIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIG1hcC5zZXQobW9kaWZpZXIubmFtZSwgbW9kaWZpZXIpO1xuICB9KTsgLy8gT24gdmlzaXRpbmcgb2JqZWN0LCBjaGVjayBmb3IgaXRzIGRlcGVuZGVuY2llcyBhbmQgdmlzaXQgdGhlbSByZWN1cnNpdmVseVxuXG4gIGZ1bmN0aW9uIHNvcnQobW9kaWZpZXIpIHtcbiAgICB2aXNpdGVkLmFkZChtb2RpZmllci5uYW1lKTtcbiAgICB2YXIgcmVxdWlyZXMgPSBbXS5jb25jYXQobW9kaWZpZXIucmVxdWlyZXMgfHwgW10sIG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMgfHwgW10pO1xuICAgIHJlcXVpcmVzLmZvckVhY2goZnVuY3Rpb24gKGRlcCkge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhkZXApKSB7XG4gICAgICAgIHZhciBkZXBNb2RpZmllciA9IG1hcC5nZXQoZGVwKTtcblxuICAgICAgICBpZiAoZGVwTW9kaWZpZXIpIHtcbiAgICAgICAgICBzb3J0KGRlcE1vZGlmaWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJlc3VsdC5wdXNoKG1vZGlmaWVyKTtcbiAgfVxuXG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIGlmICghdmlzaXRlZC5oYXMobW9kaWZpZXIubmFtZSkpIHtcbiAgICAgIC8vIGNoZWNrIGZvciB2aXNpdGVkIG9iamVjdFxuICAgICAgc29ydChtb2RpZmllcik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3JkZXJNb2RpZmllcnMobW9kaWZpZXJzKSB7XG4gIC8vIG9yZGVyIGJhc2VkIG9uIGRlcGVuZGVuY2llc1xuICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyKG1vZGlmaWVycyk7IC8vIG9yZGVyIGJhc2VkIG9uIHBoYXNlXG5cbiAgcmV0dXJuIG1vZGlmaWVyUGhhc2VzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwaGFzZSkge1xuICAgIHJldHVybiBhY2MuY29uY2F0KG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgcmV0dXJuIG1vZGlmaWVyLnBoYXNlID09PSBwaGFzZTtcbiAgICB9KSk7XG4gIH0sIFtdKTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVib3VuY2UoZm4pIHtcbiAgdmFyIHBlbmRpbmc7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBwZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcGVuZGluZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXNvbHZlKGZuKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwZW5kaW5nO1xuICB9O1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZUJ5TmFtZShtb2RpZmllcnMpIHtcbiAgdmFyIG1lcmdlZCA9IG1vZGlmaWVycy5yZWR1Y2UoZnVuY3Rpb24gKG1lcmdlZCwgY3VycmVudCkge1xuICAgIHZhciBleGlzdGluZyA9IG1lcmdlZFtjdXJyZW50Lm5hbWVdO1xuICAgIG1lcmdlZFtjdXJyZW50Lm5hbWVdID0gZXhpc3RpbmcgPyBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZywgY3VycmVudCwge1xuICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3Rpbmcub3B0aW9ucywgY3VycmVudC5vcHRpb25zKSxcbiAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLmRhdGEsIGN1cnJlbnQuZGF0YSlcbiAgICB9KSA6IGN1cnJlbnQ7XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfSwge30pOyAvLyBJRTExIGRvZXMgbm90IHN1cHBvcnQgT2JqZWN0LnZhbHVlc1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhtZXJnZWQpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIG1lcmdlZFtrZXldO1xuICB9KTtcbn0iLCAiaW1wb3J0IGdldENvbXBvc2l0ZVJlY3QgZnJvbSBcIi4vZG9tLXV0aWxzL2dldENvbXBvc2l0ZVJlY3QuanNcIjtcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gXCIuL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgbGlzdFNjcm9sbFBhcmVudHMgZnJvbSBcIi4vZG9tLXV0aWxzL2xpc3RTY3JvbGxQYXJlbnRzLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBvcmRlck1vZGlmaWVycyBmcm9tIFwiLi91dGlscy9vcmRlck1vZGlmaWVycy5qc1wiO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gXCIuL3V0aWxzL2RlYm91bmNlLmpzXCI7XG5pbXBvcnQgbWVyZ2VCeU5hbWUgZnJvbSBcIi4vdXRpbHMvbWVyZ2VCeU5hbWUuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbnZhciBERUZBVUxUX09QVElPTlMgPSB7XG4gIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gIG1vZGlmaWVyczogW10sXG4gIHN0cmF0ZWd5OiAnYWJzb2x1dGUnXG59O1xuXG5mdW5jdGlvbiBhcmVWYWxpZEVsZW1lbnRzKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuICFhcmdzLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gIShlbGVtZW50ICYmIHR5cGVvZiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA9PT0gJ2Z1bmN0aW9uJyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9wcGVyR2VuZXJhdG9yKGdlbmVyYXRvck9wdGlvbnMpIHtcbiAgaWYgKGdlbmVyYXRvck9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIGdlbmVyYXRvck9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfZ2VuZXJhdG9yT3B0aW9ucyA9IGdlbmVyYXRvck9wdGlvbnMsXG4gICAgICBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0TW9kaWZpZXJzLFxuICAgICAgZGVmYXVsdE1vZGlmaWVycyA9IF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9PT0gdm9pZCAwID8gW10gOiBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYsXG4gICAgICBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyID0gX2dlbmVyYXRvck9wdGlvbnMuZGVmYXVsdE9wdGlvbnMsXG4gICAgICBkZWZhdWx0T3B0aW9ucyA9IF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPT09IHZvaWQgMCA/IERFRkFVTFRfT1BUSU9OUyA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZjI7XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVQb3BwZXIocmVmZXJlbmNlLCBwb3BwZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0gZGVmYXVsdE9wdGlvbnM7XG4gICAgfVxuXG4gICAgdmFyIHN0YXRlID0ge1xuICAgICAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgICAgIG9yZGVyZWRNb2RpZmllcnM6IFtdLFxuICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRJT05TLCBkZWZhdWx0T3B0aW9ucyksXG4gICAgICBtb2RpZmllcnNEYXRhOiB7fSxcbiAgICAgIGVsZW1lbnRzOiB7XG4gICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlLFxuICAgICAgICBwb3BwZXI6IHBvcHBlclxuICAgICAgfSxcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgc3R5bGVzOiB7fVxuICAgIH07XG4gICAgdmFyIGVmZmVjdENsZWFudXBGbnMgPSBbXTtcbiAgICB2YXIgaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB2YXIgaW5zdGFuY2UgPSB7XG4gICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICBzZXRPcHRpb25zOiBmdW5jdGlvbiBzZXRPcHRpb25zKHNldE9wdGlvbnNBY3Rpb24pIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygc2V0T3B0aW9uc0FjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IHNldE9wdGlvbnNBY3Rpb24oc3RhdGUub3B0aW9ucykgOiBzZXRPcHRpb25zQWN0aW9uO1xuICAgICAgICBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIHN0YXRlLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucywgc3RhdGUub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIHN0YXRlLnNjcm9sbFBhcmVudHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBpc0VsZW1lbnQocmVmZXJlbmNlKSA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZSkgOiByZWZlcmVuY2UuY29udGV4dEVsZW1lbnQgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UuY29udGV4dEVsZW1lbnQpIDogW10sXG4gICAgICAgICAgcG9wcGVyOiBsaXN0U2Nyb2xsUGFyZW50cyhwb3BwZXIpXG4gICAgICAgIH07IC8vIE9yZGVycyB0aGUgbW9kaWZpZXJzIGJhc2VkIG9uIHRoZWlyIGRlcGVuZGVuY2llcyBhbmQgYHBoYXNlYFxuICAgICAgICAvLyBwcm9wZXJ0aWVzXG5cbiAgICAgICAgdmFyIG9yZGVyZWRNb2RpZmllcnMgPSBvcmRlck1vZGlmaWVycyhtZXJnZUJ5TmFtZShbXS5jb25jYXQoZGVmYXVsdE1vZGlmaWVycywgc3RhdGUub3B0aW9ucy5tb2RpZmllcnMpKSk7IC8vIFN0cmlwIG91dCBkaXNhYmxlZCBtb2RpZmllcnNcblxuICAgICAgICBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzID0gb3JkZXJlZE1vZGlmaWVycy5maWx0ZXIoZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICByZXR1cm4gbS5lbmFibGVkO1xuICAgICAgICB9KTtcbiAgICAgICAgcnVuTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICAgIH0sXG4gICAgICAvLyBTeW5jIHVwZGF0ZSBcdTIwMTMgaXQgd2lsbCBhbHdheXMgYmUgZXhlY3V0ZWQsIGV2ZW4gaWYgbm90IG5lY2Vzc2FyeS4gVGhpc1xuICAgICAgLy8gaXMgdXNlZnVsIGZvciBsb3cgZnJlcXVlbmN5IHVwZGF0ZXMgd2hlcmUgc3luYyBiZWhhdmlvciBzaW1wbGlmaWVzIHRoZVxuICAgICAgLy8gbG9naWMuXG4gICAgICAvLyBGb3IgaGlnaCBmcmVxdWVuY3kgdXBkYXRlcyAoZS5nLiBgcmVzaXplYCBhbmQgYHNjcm9sbGAgZXZlbnRzKSwgYWx3YXlzXG4gICAgICAvLyBwcmVmZXIgdGhlIGFzeW5jIFBvcHBlciN1cGRhdGUgbWV0aG9kXG4gICAgICBmb3JjZVVwZGF0ZTogZnVuY3Rpb24gZm9yY2VVcGRhdGUoKSB7XG4gICAgICAgIGlmIChpc0Rlc3Ryb3llZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfc3RhdGUkZWxlbWVudHMgPSBzdGF0ZS5lbGVtZW50cyxcbiAgICAgICAgICAgIHJlZmVyZW5jZSA9IF9zdGF0ZSRlbGVtZW50cy5yZWZlcmVuY2UsXG4gICAgICAgICAgICBwb3BwZXIgPSBfc3RhdGUkZWxlbWVudHMucG9wcGVyOyAvLyBEb24ndCBwcm9jZWVkIGlmIGByZWZlcmVuY2VgIG9yIGBwb3BwZXJgIGFyZSBub3QgdmFsaWQgZWxlbWVudHNcbiAgICAgICAgLy8gYW55bW9yZVxuXG4gICAgICAgIGlmICghYXJlVmFsaWRFbGVtZW50cyhyZWZlcmVuY2UsIHBvcHBlcikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gU3RvcmUgdGhlIHJlZmVyZW5jZSBhbmQgcG9wcGVyIHJlY3RzIHRvIGJlIHJlYWQgYnkgbW9kaWZpZXJzXG5cblxuICAgICAgICBzdGF0ZS5yZWN0cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGdldENvbXBvc2l0ZVJlY3QocmVmZXJlbmNlLCBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKSwgc3RhdGUub3B0aW9ucy5zdHJhdGVneSA9PT0gJ2ZpeGVkJyksXG4gICAgICAgICAgcG9wcGVyOiBnZXRMYXlvdXRSZWN0KHBvcHBlcilcbiAgICAgICAgfTsgLy8gTW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gcmVzZXQgdGhlIGN1cnJlbnQgdXBkYXRlIGN5Y2xlLiBUaGVcbiAgICAgICAgLy8gbW9zdCBjb21tb24gdXNlIGNhc2UgZm9yIHRoaXMgaXMgdGhlIGBmbGlwYCBtb2RpZmllciBjaGFuZ2luZyB0aGVcbiAgICAgICAgLy8gcGxhY2VtZW50LCB3aGljaCB0aGVuIG5lZWRzIHRvIHJlLXJ1biBhbGwgdGhlIG1vZGlmaWVycywgYmVjYXVzZSB0aGVcbiAgICAgICAgLy8gbG9naWMgd2FzIHByZXZpb3VzbHkgcmFuIGZvciB0aGUgcHJldmlvdXMgcGxhY2VtZW50IGFuZCBpcyB0aGVyZWZvcmVcbiAgICAgICAgLy8gc3RhbGUvaW5jb3JyZWN0XG5cbiAgICAgICAgc3RhdGUucmVzZXQgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUucGxhY2VtZW50ID0gc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQ7IC8vIE9uIGVhY2ggdXBkYXRlIGN5Y2xlLCB0aGUgYG1vZGlmaWVyc0RhdGFgIHByb3BlcnR5IGZvciBlYWNoIG1vZGlmaWVyXG4gICAgICAgIC8vIGlzIGZpbGxlZCB3aXRoIHRoZSBpbml0aWFsIGRhdGEgc3BlY2lmaWVkIGJ5IHRoZSBtb2RpZmllci4gVGhpcyBtZWFuc1xuICAgICAgICAvLyBpdCBkb2Vzbid0IHBlcnNpc3QgYW5kIGlzIGZyZXNoIG9uIGVhY2ggdXBkYXRlLlxuICAgICAgICAvLyBUbyBlbnN1cmUgcGVyc2lzdGVudCBkYXRhLCB1c2UgYCR7bmFtZX0jcGVyc2lzdGVudGBcblxuICAgICAgICBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlLm1vZGlmaWVyc0RhdGFbbW9kaWZpZXIubmFtZV0gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RpZmllci5kYXRhKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHN0YXRlLm9yZGVyZWRNb2RpZmllcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgaWYgKHN0YXRlLnJlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfc3RhdGUkb3JkZXJlZE1vZGlmaWUgPSBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzW2luZGV4XSxcbiAgICAgICAgICAgICAgZm4gPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUuZm4sXG4gICAgICAgICAgICAgIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUub3B0aW9ucyxcbiAgICAgICAgICAgICAgX29wdGlvbnMgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID09PSB2b2lkIDAgPyB7fSA6IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIsXG4gICAgICAgICAgICAgIG5hbWUgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUubmFtZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHN0YXRlID0gZm4oe1xuICAgICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IF9vcHRpb25zLFxuICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2VcbiAgICAgICAgICAgIH0pIHx8IHN0YXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIEFzeW5jIGFuZCBvcHRpbWlzdGljYWxseSBvcHRpbWl6ZWQgdXBkYXRlIFx1MjAxMyBpdCB3aWxsIG5vdCBiZSBleGVjdXRlZCBpZlxuICAgICAgLy8gbm90IG5lY2Vzc2FyeSAoZGVib3VuY2VkIHRvIHJ1biBhdCBtb3N0IG9uY2UtcGVyLXRpY2spXG4gICAgICB1cGRhdGU6IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgaW5zdGFuY2UuZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgICByZXNvbHZlKHN0YXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgaW5zdGFuY2Uuc2V0T3B0aW9ucyhvcHRpb25zKS50aGVuKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgaWYgKCFpc0Rlc3Ryb3llZCAmJiBvcHRpb25zLm9uRmlyc3RVcGRhdGUpIHtcbiAgICAgICAgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKHN0YXRlKTtcbiAgICAgIH1cbiAgICB9KTsgLy8gTW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBhcmJpdHJhcnkgY29kZSBiZWZvcmUgdGhlIGZpcnN0XG4gICAgLy8gdXBkYXRlIGN5Y2xlIHJ1bnMuIFRoZXkgd2lsbCBiZSBleGVjdXRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgdXBkYXRlXG4gICAgLy8gY3ljbGUuIFRoaXMgaXMgdXNlZnVsIHdoZW4gYSBtb2RpZmllciBhZGRzIHNvbWUgcGVyc2lzdGVudCBkYXRhIHRoYXRcbiAgICAvLyBvdGhlciBtb2RpZmllcnMgbmVlZCB0byB1c2UsIGJ1dCB0aGUgbW9kaWZpZXIgaXMgcnVuIGFmdGVyIHRoZSBkZXBlbmRlbnRcbiAgICAvLyBvbmUuXG5cbiAgICBmdW5jdGlvbiBydW5Nb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICAgICAgICBfcmVmJG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zID0gX3JlZiRvcHRpb25zID09PSB2b2lkIDAgPyB7fSA6IF9yZWYkb3B0aW9ucyxcbiAgICAgICAgICAgIGVmZmVjdCA9IF9yZWYuZWZmZWN0O1xuXG4gICAgICAgIGlmICh0eXBlb2YgZWZmZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIGNsZWFudXBGbiA9IGVmZmVjdCh7XG4gICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdmFyIG5vb3BGbiA9IGZ1bmN0aW9uIG5vb3BGbigpIHt9O1xuXG4gICAgICAgICAgZWZmZWN0Q2xlYW51cEZucy5wdXNoKGNsZWFudXBGbiB8fCBub29wRm4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgZWZmZWN0Q2xlYW51cEZucy5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgIH0pO1xuICAgICAgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcbn1cbmV4cG9ydCB2YXIgY3JlYXRlUG9wcGVyID0gLyojX19QVVJFX18qL3BvcHBlckdlbmVyYXRvcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGRldGVjdE92ZXJmbG93IH07IiwgImltcG9ydCB7IHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjtcbmltcG9ydCBldmVudExpc3RlbmVycyBmcm9tIFwiLi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanNcIjtcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gXCIuL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzXCI7XG5pbXBvcnQgY29tcHV0ZVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qc1wiO1xuaW1wb3J0IGFwcGx5U3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9hcHBseVN0eWxlcy5qc1wiO1xudmFyIGRlZmF1bHRNb2RpZmllcnMgPSBbZXZlbnRMaXN0ZW5lcnMsIHBvcHBlck9mZnNldHMsIGNvbXB1dGVTdHlsZXMsIGFwcGx5U3R5bGVzXTtcbnZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKHtcbiAgZGVmYXVsdE1vZGlmaWVyczogZGVmYXVsdE1vZGlmaWVyc1xufSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgY3JlYXRlUG9wcGVyLCBwb3BwZXJHZW5lcmF0b3IsIGRlZmF1bHRNb2RpZmllcnMsIGRldGVjdE92ZXJmbG93IH07IiwgImltcG9ydCB7IHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjtcbmltcG9ydCBldmVudExpc3RlbmVycyBmcm9tIFwiLi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanNcIjtcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gXCIuL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzXCI7XG5pbXBvcnQgY29tcHV0ZVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qc1wiO1xuaW1wb3J0IGFwcGx5U3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9hcHBseVN0eWxlcy5qc1wiO1xuaW1wb3J0IG9mZnNldCBmcm9tIFwiLi9tb2RpZmllcnMvb2Zmc2V0LmpzXCI7XG5pbXBvcnQgZmxpcCBmcm9tIFwiLi9tb2RpZmllcnMvZmxpcC5qc1wiO1xuaW1wb3J0IHByZXZlbnRPdmVyZmxvdyBmcm9tIFwiLi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgYXJyb3cgZnJvbSBcIi4vbW9kaWZpZXJzL2Fycm93LmpzXCI7XG5pbXBvcnQgaGlkZSBmcm9tIFwiLi9tb2RpZmllcnMvaGlkZS5qc1wiO1xudmFyIGRlZmF1bHRNb2RpZmllcnMgPSBbZXZlbnRMaXN0ZW5lcnMsIHBvcHBlck9mZnNldHMsIGNvbXB1dGVTdHlsZXMsIGFwcGx5U3R5bGVzLCBvZmZzZXQsIGZsaXAsIHByZXZlbnRPdmVyZmxvdywgYXJyb3csIGhpZGVdO1xudmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3Ioe1xuICBkZWZhdWx0TW9kaWZpZXJzOiBkZWZhdWx0TW9kaWZpZXJzXG59KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIsIHBvcHBlckdlbmVyYXRvciwgZGVmYXVsdE1vZGlmaWVycywgZGV0ZWN0T3ZlcmZsb3cgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyTGl0ZSB9IGZyb20gXCIuL3BvcHBlci1saXRlLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0ICogZnJvbSBcIi4vbW9kaWZpZXJzL2luZGV4LmpzXCI7IiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkb20vZGF0YS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgZWxlbWVudE1hcCA9IG5ldyBNYXAoKVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHNldChlbGVtZW50LCBrZXksIGluc3RhbmNlKSB7XG4gICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgZWxlbWVudE1hcC5zZXQoZWxlbWVudCwgbmV3IE1hcCgpKVxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlTWFwID0gZWxlbWVudE1hcC5nZXQoZWxlbWVudClcblxuICAgIC8vIG1ha2UgaXQgY2xlYXIgd2Ugb25seSB3YW50IG9uZSBpbnN0YW5jZSBwZXIgZWxlbWVudFxuICAgIC8vIGNhbiBiZSByZW1vdmVkIGxhdGVyIHdoZW4gbXVsdGlwbGUga2V5L2luc3RhbmNlcyBhcmUgZmluZSB0byBiZSB1c2VkXG4gICAgaWYgKCFpbnN0YW5jZU1hcC5oYXMoa2V5KSAmJiBpbnN0YW5jZU1hcC5zaXplICE9PSAwKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihgQm9vdHN0cmFwIGRvZXNuJ3QgYWxsb3cgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBwZXIgZWxlbWVudC4gQm91bmQgaW5zdGFuY2U6ICR7QXJyYXkuZnJvbShpbnN0YW5jZU1hcC5rZXlzKCkpWzBdfS5gKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaW5zdGFuY2VNYXAuc2V0KGtleSwgaW5zdGFuY2UpXG4gIH0sXG5cbiAgZ2V0KGVsZW1lbnQsIGtleSkge1xuICAgIGlmIChlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpLmdldChrZXkpIHx8IG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9LFxuXG4gIHJlbW92ZShlbGVtZW50LCBrZXkpIHtcbiAgICBpZiAoIWVsZW1lbnRNYXAuaGFzKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZU1hcCA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpXG5cbiAgICBpbnN0YW5jZU1hcC5kZWxldGUoa2V5KVxuXG4gICAgLy8gZnJlZSB1cCBlbGVtZW50IHJlZmVyZW5jZXMgaWYgdGhlcmUgYXJlIG5vIGluc3RhbmNlcyBsZWZ0IGZvciBhbiBlbGVtZW50XG4gICAgaWYgKGluc3RhbmNlTWFwLnNpemUgPT09IDApIHtcbiAgICAgIGVsZW1lbnRNYXAuZGVsZXRlKGVsZW1lbnQpXG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvaW5kZXguanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBNQVhfVUlEID0gMV8wMDBfMDAwXG5jb25zdCBNSUxMSVNFQ09ORFNfTVVMVElQTElFUiA9IDEwMDBcbmNvbnN0IFRSQU5TSVRJT05fRU5EID0gJ3RyYW5zaXRpb25lbmQnXG5cbi8qKlxuICogUHJvcGVybHkgZXNjYXBlIElEcyBzZWxlY3RvcnMgdG8gaGFuZGxlIHdlaXJkIElEc1xuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBwYXJzZVNlbGVjdG9yID0gc2VsZWN0b3IgPT4ge1xuICBpZiAoc2VsZWN0b3IgJiYgd2luZG93LkNTUyAmJiB3aW5kb3cuQ1NTLmVzY2FwZSkge1xuICAgIC8vIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgbmVlZHMgZXNjYXBpbmcgdG8gaGFuZGxlIElEcyAoaHRtbDUrKSBjb250YWluaW5nIGZvciBpbnN0YW5jZSAvXG4gICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKC8jKFteXFxzXCIjJ10rKS9nLCAobWF0Y2gsIGlkKSA9PiBgIyR7Q1NTLmVzY2FwZShpZCl9YClcbiAgfVxuXG4gIHJldHVybiBzZWxlY3RvclxufVxuXG4vLyBTaG91dC1vdXQgQW5ndXMgQ3JvbGwgKGh0dHBzOi8vZ29vLmdsL3B4d1FHcClcbmNvbnN0IHRvVHlwZSA9IG9iamVjdCA9PiB7XG4gIGlmIChvYmplY3QgPT09IG51bGwgfHwgb2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYCR7b2JqZWN0fWBcbiAgfVxuXG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KS5tYXRjaCgvXFxzKFthLXpdKykvaSlbMV0udG9Mb3dlckNhc2UoKVxufVxuXG4vKipcbiAqIFB1YmxpYyBVdGlsIEFQSVxuICovXG5cbmNvbnN0IGdldFVJRCA9IHByZWZpeCA9PiB7XG4gIGRvIHtcbiAgICBwcmVmaXggKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTUFYX1VJRClcbiAgfSB3aGlsZSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHJlZml4KSlcblxuICByZXR1cm4gcHJlZml4XG59XG5cbmNvbnN0IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50ID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiAwXG4gIH1cblxuICAvLyBHZXQgdHJhbnNpdGlvbi1kdXJhdGlvbiBvZiB0aGUgZWxlbWVudFxuICBsZXQgeyB0cmFuc2l0aW9uRHVyYXRpb24sIHRyYW5zaXRpb25EZWxheSB9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcblxuICBjb25zdCBmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiA9IE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbilcbiAgY29uc3QgZmxvYXRUcmFuc2l0aW9uRGVsYXkgPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRGVsYXkpXG5cbiAgLy8gUmV0dXJuIDAgaWYgZWxlbWVudCBvciB0cmFuc2l0aW9uIGR1cmF0aW9uIGlzIG5vdCBmb3VuZFxuICBpZiAoIWZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uICYmICFmbG9hdFRyYW5zaXRpb25EZWxheSkge1xuICAgIHJldHVybiAwXG4gIH1cblxuICAvLyBJZiBtdWx0aXBsZSBkdXJhdGlvbnMgYXJlIGRlZmluZWQsIHRha2UgdGhlIGZpcnN0XG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IHRyYW5zaXRpb25EdXJhdGlvbi5zcGxpdCgnLCcpWzBdXG4gIHRyYW5zaXRpb25EZWxheSA9IHRyYW5zaXRpb25EZWxheS5zcGxpdCgnLCcpWzBdXG5cbiAgcmV0dXJuIChOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pICsgTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkRlbGF5KSkgKiBNSUxMSVNFQ09ORFNfTVVMVElQTElFUlxufVxuXG5jb25zdCB0cmlnZ2VyVHJhbnNpdGlvbkVuZCA9IGVsZW1lbnQgPT4ge1xuICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFRSQU5TSVRJT05fRU5EKSlcbn1cblxuY29uc3QgaXNFbGVtZW50ID0gb2JqZWN0ID0+IHtcbiAgaWYgKCFvYmplY3QgfHwgdHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqZWN0LmpxdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvYmplY3QgPSBvYmplY3RbMF1cbiAgfVxuXG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0Lm5vZGVUeXBlICE9PSAndW5kZWZpbmVkJ1xufVxuXG5jb25zdCBnZXRFbGVtZW50ID0gb2JqZWN0ID0+IHtcbiAgLy8gaXQncyBhIGpRdWVyeSBvYmplY3Qgb3IgYSBub2RlIGVsZW1lbnRcbiAgaWYgKGlzRWxlbWVudChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdC5qcXVlcnkgPyBvYmplY3RbMF0gOiBvYmplY3RcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnc3RyaW5nJyAmJiBvYmplY3QubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHBhcnNlU2VsZWN0b3Iob2JqZWN0KSlcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IGlzVmlzaWJsZSA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWlzRWxlbWVudChlbGVtZW50KSB8fCBlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBlbGVtZW50SXNWaXNpYmxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCd2aXNpYmlsaXR5JykgPT09ICd2aXNpYmxlJ1xuICAvLyBIYW5kbGUgYGRldGFpbHNgIGVsZW1lbnQgYXMgaXRzIGNvbnRlbnQgbWF5IGZhbHNpZSBhcHBlYXIgdmlzaWJsZSB3aGVuIGl0IGlzIGNsb3NlZFxuICBjb25zdCBjbG9zZWREZXRhaWxzID0gZWxlbWVudC5jbG9zZXN0KCdkZXRhaWxzOm5vdChbb3Blbl0pJylcblxuICBpZiAoIWNsb3NlZERldGFpbHMpIHtcbiAgICByZXR1cm4gZWxlbWVudElzVmlzaWJsZVxuICB9XG5cbiAgaWYgKGNsb3NlZERldGFpbHMgIT09IGVsZW1lbnQpIHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gZWxlbWVudC5jbG9zZXN0KCdzdW1tYXJ5JylcbiAgICBpZiAoc3VtbWFyeSAmJiBzdW1tYXJ5LnBhcmVudE5vZGUgIT09IGNsb3NlZERldGFpbHMpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChzdW1tYXJ5ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudElzVmlzaWJsZVxufVxuXG5jb25zdCBpc0Rpc2FibGVkID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCB8fCBlbGVtZW50Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiBlbGVtZW50LmRpc2FibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBlbGVtZW50LmRpc2FibGVkXG4gIH1cblxuICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgIT09ICdmYWxzZSdcbn1cblxuY29uc3QgZmluZFNoYWRvd1Jvb3QgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIENhbiBmaW5kIHRoZSBzaGFkb3cgcm9vdCBvdGhlcndpc2UgaXQnbGwgcmV0dXJuIHRoZSBkb2N1bWVudFxuICBpZiAodHlwZW9mIGVsZW1lbnQuZ2V0Um9vdE5vZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCByb290ID0gZWxlbWVudC5nZXRSb290Tm9kZSgpXG4gICAgcmV0dXJuIHJvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290ID8gcm9vdCA6IG51bGxcbiAgfVxuXG4gIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgIHJldHVybiBlbGVtZW50XG4gIH1cblxuICAvLyB3aGVuIHdlIGRvbid0IGZpbmQgYSBzaGFkb3cgcm9vdFxuICBpZiAoIWVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gZmluZFNoYWRvd1Jvb3QoZWxlbWVudC5wYXJlbnROb2RlKVxufVxuXG5jb25zdCBub29wID0gKCkgPT4ge31cblxuLyoqXG4gKiBUcmljayB0byByZXN0YXJ0IGFuIGVsZW1lbnQncyBhbmltYXRpb25cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJuIHZvaWRcbiAqXG4gKiBAc2VlIGh0dHBzOi8vd3d3LmNoYXJpc3RoZW8uaW8vYmxvZy8yMDIxLzAyL3Jlc3RhcnQtYS1jc3MtYW5pbWF0aW9uLXdpdGgtamF2YXNjcmlwdC8jcmVzdGFydGluZy1hLWNzcy1hbmltYXRpb25cbiAqL1xuY29uc3QgcmVmbG93ID0gZWxlbWVudCA9PiB7XG4gIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG59XG5cbmNvbnN0IGdldGpRdWVyeSA9ICgpID0+IHtcbiAgaWYgKHdpbmRvdy5qUXVlcnkgJiYgIWRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCdkYXRhLWJzLW5vLWpxdWVyeScpKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5qUXVlcnlcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IERPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MgPSBbXVxuXG5jb25zdCBvbkRPTUNvbnRlbnRMb2FkZWQgPSBjYWxsYmFjayA9PiB7XG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAvLyBhZGQgbGlzdGVuZXIgb24gdGhlIGZpcnN0IGNhbGwgd2hlbiB0aGUgZG9jdW1lbnQgaXMgaW4gbG9hZGluZyBzdGF0ZVxuICAgIGlmICghRE9NQ29udGVudExvYWRlZENhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgRE9NQ29udGVudExvYWRlZENhbGxiYWNrcykge1xuICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spXG4gIH0gZWxzZSB7XG4gICAgY2FsbGJhY2soKVxuICB9XG59XG5cbmNvbnN0IGlzUlRMID0gKCkgPT4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRpciA9PT0gJ3J0bCdcblxuY29uc3QgZGVmaW5lSlF1ZXJ5UGx1Z2luID0gcGx1Z2luID0+IHtcbiAgb25ET01Db250ZW50TG9hZGVkKCgpID0+IHtcbiAgICBjb25zdCAkID0gZ2V0alF1ZXJ5KClcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoJCkge1xuICAgICAgY29uc3QgbmFtZSA9IHBsdWdpbi5OQU1FXG4gICAgICBjb25zdCBKUVVFUllfTk9fQ09ORkxJQ1QgPSAkLmZuW25hbWVdXG4gICAgICAkLmZuW25hbWVdID0gcGx1Z2luLmpRdWVyeUludGVyZmFjZVxuICAgICAgJC5mbltuYW1lXS5Db25zdHJ1Y3RvciA9IHBsdWdpblxuICAgICAgJC5mbltuYW1lXS5ub0NvbmZsaWN0ID0gKCkgPT4ge1xuICAgICAgICAkLmZuW25hbWVdID0gSlFVRVJZX05PX0NPTkZMSUNUXG4gICAgICAgIHJldHVybiBwbHVnaW4ualF1ZXJ5SW50ZXJmYWNlXG4gICAgICB9XG4gICAgfVxuICB9KVxufVxuXG5jb25zdCBleGVjdXRlID0gKHBvc3NpYmxlQ2FsbGJhY2ssIGFyZ3MgPSBbXSwgZGVmYXVsdFZhbHVlID0gcG9zc2libGVDYWxsYmFjaykgPT4ge1xuICByZXR1cm4gdHlwZW9mIHBvc3NpYmxlQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBwb3NzaWJsZUNhbGxiYWNrKC4uLmFyZ3MpIDogZGVmYXVsdFZhbHVlXG59XG5cbmNvbnN0IGV4ZWN1dGVBZnRlclRyYW5zaXRpb24gPSAoY2FsbGJhY2ssIHRyYW5zaXRpb25FbGVtZW50LCB3YWl0Rm9yVHJhbnNpdGlvbiA9IHRydWUpID0+IHtcbiAgaWYgKCF3YWl0Rm9yVHJhbnNpdGlvbikge1xuICAgIGV4ZWN1dGUoY2FsbGJhY2spXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBkdXJhdGlvblBhZGRpbmcgPSA1XG4gIGNvbnN0IGVtdWxhdGVkRHVyYXRpb24gPSBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0cmFuc2l0aW9uRWxlbWVudCkgKyBkdXJhdGlvblBhZGRpbmdcblxuICBsZXQgY2FsbGVkID0gZmFsc2VcblxuICBjb25zdCBoYW5kbGVyID0gKHsgdGFyZ2V0IH0pID0+IHtcbiAgICBpZiAodGFyZ2V0ICE9PSB0cmFuc2l0aW9uRWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY2FsbGVkID0gdHJ1ZVxuICAgIHRyYW5zaXRpb25FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoVFJBTlNJVElPTl9FTkQsIGhhbmRsZXIpXG4gICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgfVxuXG4gIHRyYW5zaXRpb25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoVFJBTlNJVElPTl9FTkQsIGhhbmRsZXIpXG4gIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGlmICghY2FsbGVkKSB7XG4gICAgICB0cmlnZ2VyVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRWxlbWVudClcbiAgICB9XG4gIH0sIGVtdWxhdGVkRHVyYXRpb24pXG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwcmV2aW91cy9uZXh0IGVsZW1lbnQgb2YgYSBsaXN0LlxuICpcbiAqIEBwYXJhbSB7YXJyYXl9IGxpc3QgICAgVGhlIGxpc3Qgb2YgZWxlbWVudHNcbiAqIEBwYXJhbSBhY3RpdmVFbGVtZW50ICAgVGhlIGFjdGl2ZSBlbGVtZW50XG4gKiBAcGFyYW0gc2hvdWxkR2V0TmV4dCAgIENob29zZSB0byBnZXQgbmV4dCBvciBwcmV2aW91cyBlbGVtZW50XG4gKiBAcGFyYW0gaXNDeWNsZUFsbG93ZWRcbiAqIEByZXR1cm4ge0VsZW1lbnR8ZWxlbX0gVGhlIHByb3BlciBlbGVtZW50XG4gKi9cbmNvbnN0IGdldE5leHRBY3RpdmVFbGVtZW50ID0gKGxpc3QsIGFjdGl2ZUVsZW1lbnQsIHNob3VsZEdldE5leHQsIGlzQ3ljbGVBbGxvd2VkKSA9PiB7XG4gIGNvbnN0IGxpc3RMZW5ndGggPSBsaXN0Lmxlbmd0aFxuICBsZXQgaW5kZXggPSBsaXN0LmluZGV4T2YoYWN0aXZlRWxlbWVudClcblxuICAvLyBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbGlzdCByZXR1cm4gYW4gZWxlbWVudFxuICAvLyBkZXBlbmRpbmcgb24gdGhlIGRpcmVjdGlvbiBhbmQgaWYgY3ljbGUgaXMgYWxsb3dlZFxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuICFzaG91bGRHZXROZXh0ICYmIGlzQ3ljbGVBbGxvd2VkID8gbGlzdFtsaXN0TGVuZ3RoIC0gMV0gOiBsaXN0WzBdXG4gIH1cblxuICBpbmRleCArPSBzaG91bGRHZXROZXh0ID8gMSA6IC0xXG5cbiAgaWYgKGlzQ3ljbGVBbGxvd2VkKSB7XG4gICAgaW5kZXggPSAoaW5kZXggKyBsaXN0TGVuZ3RoKSAlIGxpc3RMZW5ndGhcbiAgfVxuXG4gIHJldHVybiBsaXN0W01hdGgubWF4KDAsIE1hdGgubWluKGluZGV4LCBsaXN0TGVuZ3RoIC0gMSkpXVxufVxuXG5leHBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGV4ZWN1dGUsXG4gIGV4ZWN1dGVBZnRlclRyYW5zaXRpb24sXG4gIGZpbmRTaGFkb3dSb290LFxuICBnZXRFbGVtZW50LFxuICBnZXRqUXVlcnksXG4gIGdldE5leHRBY3RpdmVFbGVtZW50LFxuICBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCxcbiAgZ2V0VUlELFxuICBpc0Rpc2FibGVkLFxuICBpc0VsZW1lbnQsXG4gIGlzUlRMLFxuICBpc1Zpc2libGUsXG4gIG5vb3AsXG4gIG9uRE9NQ29udGVudExvYWRlZCxcbiAgcGFyc2VTZWxlY3RvcixcbiAgcmVmbG93LFxuICB0cmlnZ2VyVHJhbnNpdGlvbkVuZCxcbiAgdG9UeXBlXG59XG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRvbS9ldmVudC1oYW5kbGVyLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IHsgZ2V0alF1ZXJ5IH0gZnJvbSAnLi4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBuYW1lc3BhY2VSZWdleCA9IC9bXi5dKig/PVxcLi4qKVxcLnwuKi9cbmNvbnN0IHN0cmlwTmFtZVJlZ2V4ID0gL1xcLi4qL1xuY29uc3Qgc3RyaXBVaWRSZWdleCA9IC86OlxcZCskL1xuY29uc3QgZXZlbnRSZWdpc3RyeSA9IHt9IC8vIEV2ZW50cyBzdG9yYWdlXG5sZXQgdWlkRXZlbnQgPSAxXG5jb25zdCBjdXN0b21FdmVudHMgPSB7XG4gIG1vdXNlZW50ZXI6ICdtb3VzZW92ZXInLFxuICBtb3VzZWxlYXZlOiAnbW91c2VvdXQnXG59XG5cbmNvbnN0IG5hdGl2ZUV2ZW50cyA9IG5ldyBTZXQoW1xuICAnY2xpY2snLFxuICAnZGJsY2xpY2snLFxuICAnbW91c2V1cCcsXG4gICdtb3VzZWRvd24nLFxuICAnY29udGV4dG1lbnUnLFxuICAnbW91c2V3aGVlbCcsXG4gICdET01Nb3VzZVNjcm9sbCcsXG4gICdtb3VzZW92ZXInLFxuICAnbW91c2VvdXQnLFxuICAnbW91c2Vtb3ZlJyxcbiAgJ3NlbGVjdHN0YXJ0JyxcbiAgJ3NlbGVjdGVuZCcsXG4gICdrZXlkb3duJyxcbiAgJ2tleXByZXNzJyxcbiAgJ2tleXVwJyxcbiAgJ29yaWVudGF0aW9uY2hhbmdlJyxcbiAgJ3RvdWNoc3RhcnQnLFxuICAndG91Y2htb3ZlJyxcbiAgJ3RvdWNoZW5kJyxcbiAgJ3RvdWNoY2FuY2VsJyxcbiAgJ3BvaW50ZXJkb3duJyxcbiAgJ3BvaW50ZXJtb3ZlJyxcbiAgJ3BvaW50ZXJ1cCcsXG4gICdwb2ludGVybGVhdmUnLFxuICAncG9pbnRlcmNhbmNlbCcsXG4gICdnZXN0dXJlc3RhcnQnLFxuICAnZ2VzdHVyZWNoYW5nZScsXG4gICdnZXN0dXJlZW5kJyxcbiAgJ2ZvY3VzJyxcbiAgJ2JsdXInLFxuICAnY2hhbmdlJyxcbiAgJ3Jlc2V0JyxcbiAgJ3NlbGVjdCcsXG4gICdzdWJtaXQnLFxuICAnZm9jdXNpbicsXG4gICdmb2N1c291dCcsXG4gICdsb2FkJyxcbiAgJ3VubG9hZCcsXG4gICdiZWZvcmV1bmxvYWQnLFxuICAncmVzaXplJyxcbiAgJ21vdmUnLFxuICAnRE9NQ29udGVudExvYWRlZCcsXG4gICdyZWFkeXN0YXRlY2hhbmdlJyxcbiAgJ2Vycm9yJyxcbiAgJ2Fib3J0JyxcbiAgJ3Njcm9sbCdcbl0pXG5cbi8qKlxuICogUHJpdmF0ZSBtZXRob2RzXG4gKi9cblxuZnVuY3Rpb24gbWFrZUV2ZW50VWlkKGVsZW1lbnQsIHVpZCkge1xuICByZXR1cm4gKHVpZCAmJiBgJHt1aWR9Ojoke3VpZEV2ZW50Kyt9YCkgfHwgZWxlbWVudC51aWRFdmVudCB8fCB1aWRFdmVudCsrXG59XG5cbmZ1bmN0aW9uIGdldEVsZW1lbnRFdmVudHMoZWxlbWVudCkge1xuICBjb25zdCB1aWQgPSBtYWtlRXZlbnRVaWQoZWxlbWVudClcblxuICBlbGVtZW50LnVpZEV2ZW50ID0gdWlkXG4gIGV2ZW50UmVnaXN0cnlbdWlkXSA9IGV2ZW50UmVnaXN0cnlbdWlkXSB8fCB7fVxuXG4gIHJldHVybiBldmVudFJlZ2lzdHJ5W3VpZF1cbn1cblxuZnVuY3Rpb24gYm9vdHN0cmFwSGFuZGxlcihlbGVtZW50LCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgIGh5ZHJhdGVPYmooZXZlbnQsIHsgZGVsZWdhdGVUYXJnZXQ6IGVsZW1lbnQgfSlcblxuICAgIGlmIChoYW5kbGVyLm9uZU9mZikge1xuICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCBldmVudC50eXBlLCBmbilcbiAgICB9XG5cbiAgICByZXR1cm4gZm4uYXBwbHkoZWxlbWVudCwgW2V2ZW50XSlcbiAgfVxufVxuXG5mdW5jdGlvbiBib290c3RyYXBEZWxlZ2F0aW9uSGFuZGxlcihlbGVtZW50LCBzZWxlY3RvciwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcbiAgICBjb25zdCBkb21FbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcblxuICAgIGZvciAobGV0IHsgdGFyZ2V0IH0gPSBldmVudDsgdGFyZ2V0ICYmIHRhcmdldCAhPT0gdGhpczsgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGUpIHtcbiAgICAgIGZvciAoY29uc3QgZG9tRWxlbWVudCBvZiBkb21FbGVtZW50cykge1xuICAgICAgICBpZiAoZG9tRWxlbWVudCAhPT0gdGFyZ2V0KSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGh5ZHJhdGVPYmooZXZlbnQsIHsgZGVsZWdhdGVUYXJnZXQ6IHRhcmdldCB9KVxuXG4gICAgICAgIGlmIChoYW5kbGVyLm9uZU9mZikge1xuICAgICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgZXZlbnQudHlwZSwgc2VsZWN0b3IsIGZuKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRhcmdldCwgW2V2ZW50XSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEhhbmRsZXIoZXZlbnRzLCBjYWxsYWJsZSwgZGVsZWdhdGlvblNlbGVjdG9yID0gbnVsbCkge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhldmVudHMpXG4gICAgLmZpbmQoZXZlbnQgPT4gZXZlbnQuY2FsbGFibGUgPT09IGNhbGxhYmxlICYmIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvciA9PT0gZGVsZWdhdGlvblNlbGVjdG9yKVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgY29uc3QgaXNEZWxlZ2F0ZWQgPSB0eXBlb2YgaGFuZGxlciA9PT0gJ3N0cmluZydcbiAgLy8gVE9ETzogdG9vbHRpcCBwYXNzZXMgYGZhbHNlYCBpbnN0ZWFkIG9mIHNlbGVjdG9yLCBzbyB3ZSBuZWVkIHRvIGNoZWNrXG4gIGNvbnN0IGNhbGxhYmxlID0gaXNEZWxlZ2F0ZWQgPyBkZWxlZ2F0aW9uRnVuY3Rpb24gOiAoaGFuZGxlciB8fCBkZWxlZ2F0aW9uRnVuY3Rpb24pXG4gIGxldCB0eXBlRXZlbnQgPSBnZXRUeXBlRXZlbnQob3JpZ2luYWxUeXBlRXZlbnQpXG5cbiAgaWYgKCFuYXRpdmVFdmVudHMuaGFzKHR5cGVFdmVudCkpIHtcbiAgICB0eXBlRXZlbnQgPSBvcmlnaW5hbFR5cGVFdmVudFxuICB9XG5cbiAgcmV0dXJuIFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF1cbn1cblxuZnVuY3Rpb24gYWRkSGFuZGxlcihlbGVtZW50LCBvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uLCBvbmVPZmYpIHtcbiAgaWYgKHR5cGVvZiBvcmlnaW5hbFR5cGVFdmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGxldCBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdID0gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKVxuXG4gIC8vIGluIGNhc2Ugb2YgbW91c2VlbnRlciBvciBtb3VzZWxlYXZlIHdyYXAgdGhlIGhhbmRsZXIgd2l0aGluIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgZm9yIGl0cyBET00gcG9zaXRpb25cbiAgLy8gdGhpcyBwcmV2ZW50cyB0aGUgaGFuZGxlciBmcm9tIGJlaW5nIGRpc3BhdGNoZWQgdGhlIHNhbWUgd2F5IGFzIG1vdXNlb3ZlciBvciBtb3VzZW91dCBkb2VzXG4gIGlmIChvcmlnaW5hbFR5cGVFdmVudCBpbiBjdXN0b21FdmVudHMpIHtcbiAgICBjb25zdCB3cmFwRnVuY3Rpb24gPSBmbiA9PiB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmICghZXZlbnQucmVsYXRlZFRhcmdldCB8fCAoZXZlbnQucmVsYXRlZFRhcmdldCAhPT0gZXZlbnQuZGVsZWdhdGVUYXJnZXQgJiYgIWV2ZW50LmRlbGVnYXRlVGFyZ2V0LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSkge1xuICAgICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FsbGFibGUgPSB3cmFwRnVuY3Rpb24oY2FsbGFibGUpXG4gIH1cblxuICBjb25zdCBldmVudHMgPSBnZXRFbGVtZW50RXZlbnRzKGVsZW1lbnQpXG4gIGNvbnN0IGhhbmRsZXJzID0gZXZlbnRzW3R5cGVFdmVudF0gfHwgKGV2ZW50c1t0eXBlRXZlbnRdID0ge30pXG4gIGNvbnN0IHByZXZpb3VzRnVuY3Rpb24gPSBmaW5kSGFuZGxlcihoYW5kbGVycywgY2FsbGFibGUsIGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGwpXG5cbiAgaWYgKHByZXZpb3VzRnVuY3Rpb24pIHtcbiAgICBwcmV2aW91c0Z1bmN0aW9uLm9uZU9mZiA9IHByZXZpb3VzRnVuY3Rpb24ub25lT2ZmICYmIG9uZU9mZlxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB1aWQgPSBtYWtlRXZlbnRVaWQoY2FsbGFibGUsIG9yaWdpbmFsVHlwZUV2ZW50LnJlcGxhY2UobmFtZXNwYWNlUmVnZXgsICcnKSlcbiAgY29uc3QgZm4gPSBpc0RlbGVnYXRlZCA/XG4gICAgYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIoZWxlbWVudCwgaGFuZGxlciwgY2FsbGFibGUpIDpcbiAgICBib290c3RyYXBIYW5kbGVyKGVsZW1lbnQsIGNhbGxhYmxlKVxuXG4gIGZuLmRlbGVnYXRpb25TZWxlY3RvciA9IGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGxcbiAgZm4uY2FsbGFibGUgPSBjYWxsYWJsZVxuICBmbi5vbmVPZmYgPSBvbmVPZmZcbiAgZm4udWlkRXZlbnQgPSB1aWRcbiAgaGFuZGxlcnNbdWlkXSA9IGZuXG5cbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGVFdmVudCwgZm4sIGlzRGVsZWdhdGVkKVxufVxuXG5mdW5jdGlvbiByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpIHtcbiAgY29uc3QgZm4gPSBmaW5kSGFuZGxlcihldmVudHNbdHlwZUV2ZW50XSwgaGFuZGxlciwgZGVsZWdhdGlvblNlbGVjdG9yKVxuXG4gIGlmICghZm4pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlRXZlbnQsIGZuLCBCb29sZWFuKGRlbGVnYXRpb25TZWxlY3RvcikpXG4gIGRlbGV0ZSBldmVudHNbdHlwZUV2ZW50XVtmbi51aWRFdmVudF1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlTmFtZXNwYWNlZEhhbmRsZXJzKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBuYW1lc3BhY2UpIHtcbiAgY29uc3Qgc3RvcmVFbGVtZW50RXZlbnQgPSBldmVudHNbdHlwZUV2ZW50XSB8fCB7fVxuXG4gIGZvciAoY29uc3QgW2hhbmRsZXJLZXksIGV2ZW50XSBvZiBPYmplY3QuZW50cmllcyhzdG9yZUVsZW1lbnRFdmVudCkpIHtcbiAgICBpZiAoaGFuZGxlcktleS5pbmNsdWRlcyhuYW1lc3BhY2UpKSB7XG4gICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUeXBlRXZlbnQoZXZlbnQpIHtcbiAgLy8gYWxsb3cgdG8gZ2V0IHRoZSBuYXRpdmUgZXZlbnRzIGZyb20gbmFtZXNwYWNlZCBldmVudHMgKCdjbGljay5icy5idXR0b24nIC0tPiAnY2xpY2snKVxuICBldmVudCA9IGV2ZW50LnJlcGxhY2Uoc3RyaXBOYW1lUmVnZXgsICcnKVxuICByZXR1cm4gY3VzdG9tRXZlbnRzW2V2ZW50XSB8fCBldmVudFxufVxuXG5jb25zdCBFdmVudEhhbmRsZXIgPSB7XG4gIG9uKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICBhZGRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIGZhbHNlKVxuICB9LFxuXG4gIG9uZShlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgYWRkSGFuZGxlcihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uLCB0cnVlKVxuICB9LFxuXG4gIG9mZihlbGVtZW50LCBvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgaWYgKHR5cGVvZiBvcmlnaW5hbFR5cGVFdmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF0gPSBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pXG4gICAgY29uc3QgaW5OYW1lc3BhY2UgPSB0eXBlRXZlbnQgIT09IG9yaWdpbmFsVHlwZUV2ZW50XG4gICAgY29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KVxuICAgIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge31cbiAgICBjb25zdCBpc05hbWVzcGFjZSA9IG9yaWdpbmFsVHlwZUV2ZW50LnN0YXJ0c1dpdGgoJy4nKVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYWJsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIFNpbXBsZXN0IGNhc2U6IGhhbmRsZXIgaXMgcGFzc2VkLCByZW1vdmUgdGhhdCBsaXN0ZW5lciBPTkxZLlxuICAgICAgaWYgKCFPYmplY3Qua2V5cyhzdG9yZUVsZW1lbnRFdmVudCkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBjYWxsYWJsZSwgaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpc05hbWVzcGFjZSkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50RXZlbnQgb2YgT2JqZWN0LmtleXMoZXZlbnRzKSkge1xuICAgICAgICByZW1vdmVOYW1lc3BhY2VkSGFuZGxlcnMoZWxlbWVudCwgZXZlbnRzLCBlbGVtZW50RXZlbnQsIG9yaWdpbmFsVHlwZUV2ZW50LnNsaWNlKDEpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleUhhbmRsZXJzLCBldmVudF0gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmVFbGVtZW50RXZlbnQpKSB7XG4gICAgICBjb25zdCBoYW5kbGVyS2V5ID0ga2V5SGFuZGxlcnMucmVwbGFjZShzdHJpcFVpZFJlZ2V4LCAnJylcblxuICAgICAgaWYgKCFpbk5hbWVzcGFjZSB8fCBvcmlnaW5hbFR5cGVFdmVudC5pbmNsdWRlcyhoYW5kbGVyS2V5KSkge1xuICAgICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB0cmlnZ2VyKGVsZW1lbnQsIGV2ZW50LCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBldmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgJCA9IGdldGpRdWVyeSgpXG4gICAgY29uc3QgdHlwZUV2ZW50ID0gZ2V0VHlwZUV2ZW50KGV2ZW50KVxuICAgIGNvbnN0IGluTmFtZXNwYWNlID0gZXZlbnQgIT09IHR5cGVFdmVudFxuXG4gICAgbGV0IGpRdWVyeUV2ZW50ID0gbnVsbFxuICAgIGxldCBidWJibGVzID0gdHJ1ZVxuICAgIGxldCBuYXRpdmVEaXNwYXRjaCA9IHRydWVcbiAgICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlXG5cbiAgICBpZiAoaW5OYW1lc3BhY2UgJiYgJCkge1xuICAgICAgalF1ZXJ5RXZlbnQgPSAkLkV2ZW50KGV2ZW50LCBhcmdzKVxuXG4gICAgICAkKGVsZW1lbnQpLnRyaWdnZXIoalF1ZXJ5RXZlbnQpXG4gICAgICBidWJibGVzID0gIWpRdWVyeUV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKClcbiAgICAgIG5hdGl2ZURpc3BhdGNoID0gIWpRdWVyeUV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKClcbiAgICAgIGRlZmF1bHRQcmV2ZW50ZWQgPSBqUXVlcnlFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKVxuICAgIH1cblxuICAgIGNvbnN0IGV2dCA9IGh5ZHJhdGVPYmoobmV3IEV2ZW50KGV2ZW50LCB7IGJ1YmJsZXMsIGNhbmNlbGFibGU6IHRydWUgfSksIGFyZ3MpXG5cbiAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KClcbiAgICB9XG5cbiAgICBpZiAobmF0aXZlRGlzcGF0Y2gpIHtcbiAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldnQpXG4gICAgfVxuXG4gICAgaWYgKGV2dC5kZWZhdWx0UHJldmVudGVkICYmIGpRdWVyeUV2ZW50KSB7XG4gICAgICBqUXVlcnlFdmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGV2dFxuICB9XG59XG5cbmZ1bmN0aW9uIGh5ZHJhdGVPYmoob2JqLCBtZXRhID0ge30pIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWV0YSkpIHtcbiAgICB0cnkge1xuICAgICAgb2JqW2tleV0gPSB2YWx1ZVxuICAgIH0gY2F0Y2gge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cblxuZXhwb3J0IGRlZmF1bHQgRXZlbnRIYW5kbGVyXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRvbS9tYW5pcHVsYXRvci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAodmFsdWUgPT09IE51bWJlcih2YWx1ZSkudG9TdHJpbmcoKSkge1xuICAgIHJldHVybiBOdW1iZXIodmFsdWUpXG4gIH1cblxuICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSAnbnVsbCcpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSlcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRGF0YUtleShrZXkpIHtcbiAgcmV0dXJuIGtleS5yZXBsYWNlKC9bQS1aXS9nLCBjaHIgPT4gYC0ke2Noci50b0xvd2VyQ2FzZSgpfWApXG59XG5cbmNvbnN0IE1hbmlwdWxhdG9yID0ge1xuICBzZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSwgdmFsdWUpIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gLCB2YWx1ZSlcbiAgfSxcblxuICByZW1vdmVEYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSkge1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWApXG4gIH0sXG5cbiAgZ2V0RGF0YUF0dHJpYnV0ZXMoZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHt9XG4gICAgY29uc3QgYnNLZXlzID0gT2JqZWN0LmtleXMoZWxlbWVudC5kYXRhc2V0KS5maWx0ZXIoa2V5ID0+IGtleS5zdGFydHNXaXRoKCdicycpICYmICFrZXkuc3RhcnRzV2l0aCgnYnNDb25maWcnKSlcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGJzS2V5cykge1xuICAgICAgbGV0IHB1cmVLZXkgPSBrZXkucmVwbGFjZSgvXmJzLywgJycpXG4gICAgICBwdXJlS2V5ID0gcHVyZUtleS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHB1cmVLZXkuc2xpY2UoMSwgcHVyZUtleS5sZW5ndGgpXG4gICAgICBhdHRyaWJ1dGVzW3B1cmVLZXldID0gbm9ybWFsaXplRGF0YShlbGVtZW50LmRhdGFzZXRba2V5XSlcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlc1xuICB9LFxuXG4gIGdldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5KSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZURhdGEoZWxlbWVudC5nZXRBdHRyaWJ1dGUoYGRhdGEtYnMtJHtub3JtYWxpemVEYXRhS2V5KGtleSl9YCkpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFuaXB1bGF0b3JcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9jb25maWcuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgTWFuaXB1bGF0b3IgZnJvbSAnLi4vZG9tL21hbmlwdWxhdG9yLmpzJ1xuaW1wb3J0IHsgaXNFbGVtZW50LCB0b1R5cGUgfSBmcm9tICcuL2luZGV4LmpzJ1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBDb25maWcge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIHN0YXRpYyBtZXRob2QgXCJOQU1FXCIsIGZvciBlYWNoIGNvbXBvbmVudCEnKVxuICB9XG5cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25maWcgPSB0aGlzLl9tZXJnZUNvbmZpZ09iaihjb25maWcpXG4gICAgY29uZmlnID0gdGhpcy5fY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpXG4gICAgdGhpcy5fdHlwZUNoZWNrQ29uZmlnKGNvbmZpZylcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfbWVyZ2VDb25maWdPYmooY29uZmlnLCBlbGVtZW50KSB7XG4gICAgY29uc3QganNvbkNvbmZpZyA9IGlzRWxlbWVudChlbGVtZW50KSA/IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgJ2NvbmZpZycpIDoge30gLy8gdHJ5IHRvIHBhcnNlXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LFxuICAgICAgLi4uKHR5cGVvZiBqc29uQ29uZmlnID09PSAnb2JqZWN0JyA/IGpzb25Db25maWcgOiB7fSksXG4gICAgICAuLi4oaXNFbGVtZW50KGVsZW1lbnQpID8gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZXMoZWxlbWVudCkgOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgPyBjb25maWcgOiB7fSlcbiAgICB9XG4gIH1cblxuICBfdHlwZUNoZWNrQ29uZmlnKGNvbmZpZywgY29uZmlnVHlwZXMgPSB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKSB7XG4gICAgZm9yIChjb25zdCBbcHJvcGVydHksIGV4cGVjdGVkVHlwZXNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ1R5cGVzKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb25maWdbcHJvcGVydHldXG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSBpc0VsZW1lbnQodmFsdWUpID8gJ2VsZW1lbnQnIDogdG9UeXBlKHZhbHVlKVxuXG4gICAgICBpZiAoIW5ldyBSZWdFeHAoZXhwZWN0ZWRUeXBlcykudGVzdCh2YWx1ZVR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgYCR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FLnRvVXBwZXJDYXNlKCl9OiBPcHRpb24gXCIke3Byb3BlcnR5fVwiIHByb3ZpZGVkIHR5cGUgXCIke3ZhbHVlVHlwZX1cIiBidXQgZXhwZWN0ZWQgdHlwZSBcIiR7ZXhwZWN0ZWRUeXBlc31cIi5gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29uZmlnXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGJhc2UtY29tcG9uZW50LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IERhdGEgZnJvbSAnLi9kb20vZGF0YS5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBDb25maWcgZnJvbSAnLi91dGlsL2NvbmZpZy5qcydcbmltcG9ydCB7IGV4ZWN1dGVBZnRlclRyYW5zaXRpb24sIGdldEVsZW1lbnQgfSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgVkVSU0lPTiA9ICc1LjMuMydcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQmFzZUNvbXBvbmVudCBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKClcblxuICAgIGVsZW1lbnQgPSBnZXRFbGVtZW50KGVsZW1lbnQpXG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudFxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpXG5cbiAgICBEYXRhLnNldCh0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZLCB0aGlzKVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGRpc3Bvc2UoKSB7XG4gICAgRGF0YS5yZW1vdmUodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSlcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuRVZFTlRfS0VZKVxuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHtcbiAgICAgIHRoaXNbcHJvcGVydHlOYW1lXSA9IG51bGxcbiAgICB9XG4gIH1cblxuICBfcXVldWVDYWxsYmFjayhjYWxsYmFjaywgZWxlbWVudCwgaXNBbmltYXRlZCA9IHRydWUpIHtcbiAgICBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uKGNhbGxiYWNrLCBlbGVtZW50LCBpc0FuaW1hdGVkKVxuICB9XG5cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25maWcgPSB0aGlzLl9tZXJnZUNvbmZpZ09iaihjb25maWcsIHRoaXMuX2VsZW1lbnQpXG4gICAgY29uZmlnID0gdGhpcy5fY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpXG4gICAgdGhpcy5fdHlwZUNoZWNrQ29uZmlnKGNvbmZpZylcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGdldEluc3RhbmNlKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gRGF0YS5nZXQoZ2V0RWxlbWVudChlbGVtZW50KSwgdGhpcy5EQVRBX0tFWSlcbiAgfVxuXG4gIHN0YXRpYyBnZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIGNvbmZpZyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SW5zdGFuY2UoZWxlbWVudCkgfHwgbmV3IHRoaXMoZWxlbWVudCwgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgPyBjb25maWcgOiBudWxsKVxuICB9XG5cbiAgc3RhdGljIGdldCBWRVJTSU9OKCkge1xuICAgIHJldHVybiBWRVJTSU9OXG4gIH1cblxuICBzdGF0aWMgZ2V0IERBVEFfS0VZKCkge1xuICAgIHJldHVybiBgYnMuJHt0aGlzLk5BTUV9YFxuICB9XG5cbiAgc3RhdGljIGdldCBFVkVOVF9LRVkoKSB7XG4gICAgcmV0dXJuIGAuJHt0aGlzLkRBVEFfS0VZfWBcbiAgfVxuXG4gIHN0YXRpYyBldmVudE5hbWUobmFtZSkge1xuICAgIHJldHVybiBgJHtuYW1lfSR7dGhpcy5FVkVOVF9LRVl9YFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2VDb21wb25lbnRcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL3NlbGVjdG9yLWVuZ2luZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCB7IGlzRGlzYWJsZWQsIGlzVmlzaWJsZSwgcGFyc2VTZWxlY3RvciB9IGZyb20gJy4uL3V0aWwvaW5kZXguanMnXG5cbmNvbnN0IGdldFNlbGVjdG9yID0gZWxlbWVudCA9PiB7XG4gIGxldCBzZWxlY3RvciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLXRhcmdldCcpXG5cbiAgaWYgKCFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gJyMnKSB7XG4gICAgbGV0IGhyZWZBdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpXG5cbiAgICAvLyBUaGUgb25seSB2YWxpZCBjb250ZW50IHRoYXQgY291bGQgZG91YmxlIGFzIGEgc2VsZWN0b3IgYXJlIElEcyBvciBjbGFzc2VzLFxuICAgIC8vIHNvIGV2ZXJ5dGhpbmcgc3RhcnRpbmcgd2l0aCBgI2Agb3IgYC5gLiBJZiBhIFwicmVhbFwiIFVSTCBpcyB1c2VkIGFzIHRoZSBzZWxlY3RvcixcbiAgICAvLyBgZG9jdW1lbnQucXVlcnlTZWxlY3RvcmAgd2lsbCByaWdodGZ1bGx5IGNvbXBsYWluIGl0IGlzIGludmFsaWQuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMzIyNzNcbiAgICBpZiAoIWhyZWZBdHRyaWJ1dGUgfHwgKCFocmVmQXR0cmlidXRlLmluY2x1ZGVzKCcjJykgJiYgIWhyZWZBdHRyaWJ1dGUuc3RhcnRzV2l0aCgnLicpKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICAvLyBKdXN0IGluIGNhc2Ugc29tZSBDTVMgcHV0cyBvdXQgYSBmdWxsIFVSTCB3aXRoIHRoZSBhbmNob3IgYXBwZW5kZWRcbiAgICBpZiAoaHJlZkF0dHJpYnV0ZS5pbmNsdWRlcygnIycpICYmICFocmVmQXR0cmlidXRlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgaHJlZkF0dHJpYnV0ZSA9IGAjJHtocmVmQXR0cmlidXRlLnNwbGl0KCcjJylbMV19YFxuICAgIH1cblxuICAgIHNlbGVjdG9yID0gaHJlZkF0dHJpYnV0ZSAmJiBocmVmQXR0cmlidXRlICE9PSAnIycgPyBocmVmQXR0cmlidXRlLnRyaW0oKSA6IG51bGxcbiAgfVxuXG4gIHJldHVybiBzZWxlY3RvciA/IHNlbGVjdG9yLnNwbGl0KCcsJykubWFwKHNlbCA9PiBwYXJzZVNlbGVjdG9yKHNlbCkpLmpvaW4oJywnKSA6IG51bGxcbn1cblxuY29uc3QgU2VsZWN0b3JFbmdpbmUgPSB7XG4gIGZpbmQoc2VsZWN0b3IsIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KC4uLkVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwuY2FsbChlbGVtZW50LCBzZWxlY3RvcikpXG4gIH0sXG5cbiAgZmluZE9uZShzZWxlY3RvciwgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgIHJldHVybiBFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpXG4gIH0sXG5cbiAgY2hpbGRyZW4oZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KC4uLmVsZW1lbnQuY2hpbGRyZW4pLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5tYXRjaGVzKHNlbGVjdG9yKSlcbiAgfSxcblxuICBwYXJlbnRzKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgY29uc3QgcGFyZW50cyA9IFtdXG4gICAgbGV0IGFuY2VzdG9yID0gZWxlbWVudC5wYXJlbnROb2RlLmNsb3Nlc3Qoc2VsZWN0b3IpXG5cbiAgICB3aGlsZSAoYW5jZXN0b3IpIHtcbiAgICAgIHBhcmVudHMucHVzaChhbmNlc3RvcilcbiAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50Tm9kZS5jbG9zZXN0KHNlbGVjdG9yKVxuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnRzXG4gIH0sXG5cbiAgcHJldihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGxldCBwcmV2aW91cyA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZ1xuXG4gICAgd2hpbGUgKHByZXZpb3VzKSB7XG4gICAgICBpZiAocHJldmlvdXMubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgcmV0dXJuIFtwcmV2aW91c11cbiAgICAgIH1cblxuICAgICAgcHJldmlvdXMgPSBwcmV2aW91cy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXG4gICAgfVxuXG4gICAgcmV0dXJuIFtdXG4gIH0sXG4gIC8vIFRPRE86IHRoaXMgaXMgbm93IHVudXNlZDsgcmVtb3ZlIGxhdGVyIGFsb25nIHdpdGggcHJldigpXG4gIG5leHQoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICBsZXQgbmV4dCA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nXG5cbiAgICB3aGlsZSAobmV4dCkge1xuICAgICAgaWYgKG5leHQubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgcmV0dXJuIFtuZXh0XVxuICAgICAgfVxuXG4gICAgICBuZXh0ID0gbmV4dC5uZXh0RWxlbWVudFNpYmxpbmdcbiAgICB9XG5cbiAgICByZXR1cm4gW11cbiAgfSxcblxuICBmb2N1c2FibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgY29uc3QgZm9jdXNhYmxlcyA9IFtcbiAgICAgICdhJyxcbiAgICAgICdidXR0b24nLFxuICAgICAgJ2lucHV0JyxcbiAgICAgICd0ZXh0YXJlYScsXG4gICAgICAnc2VsZWN0JyxcbiAgICAgICdkZXRhaWxzJyxcbiAgICAgICdbdGFiaW5kZXhdJyxcbiAgICAgICdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSdcbiAgICBdLm1hcChzZWxlY3RvciA9PiBgJHtzZWxlY3Rvcn06bm90KFt0YWJpbmRleF49XCItXCJdKWApLmpvaW4oJywnKVxuXG4gICAgcmV0dXJuIHRoaXMuZmluZChmb2N1c2FibGVzLCBlbGVtZW50KS5maWx0ZXIoZWwgPT4gIWlzRGlzYWJsZWQoZWwpICYmIGlzVmlzaWJsZShlbCkpXG4gIH0sXG5cbiAgZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KVxuXG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvcikgPyBzZWxlY3RvciA6IG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9LFxuXG4gIGdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudCkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoZWxlbWVudClcblxuICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IpIDogbnVsbFxuICB9LFxuXG4gIGdldE11bHRpcGxlRWxlbWVudHNGcm9tU2VsZWN0b3IoZWxlbWVudCkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoZWxlbWVudClcblxuICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IpIDogW11cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTZWxlY3RvckVuZ2luZVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4uL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4uL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQgeyBpc0Rpc2FibGVkIH0gZnJvbSAnLi9pbmRleC5qcydcblxuY29uc3QgZW5hYmxlRGlzbWlzc1RyaWdnZXIgPSAoY29tcG9uZW50LCBtZXRob2QgPSAnaGlkZScpID0+IHtcbiAgY29uc3QgY2xpY2tFdmVudCA9IGBjbGljay5kaXNtaXNzJHtjb21wb25lbnQuRVZFTlRfS0VZfWBcbiAgY29uc3QgbmFtZSA9IGNvbXBvbmVudC5OQU1FXG5cbiAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBjbGlja0V2ZW50LCBgW2RhdGEtYnMtZGlzbWlzcz1cIiR7bmFtZX1cIl1gLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfVxuXG4gICAgaWYgKGlzRGlzYWJsZWQodGhpcykpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcykgfHwgdGhpcy5jbG9zZXN0KGAuJHtuYW1lfWApXG4gICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnQuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpXG5cbiAgICAvLyBNZXRob2QgYXJndW1lbnQgaXMgbGVmdCwgZm9yIEFsZXJ0IGFuZCBvbmx5LCBhcyBpdCBkb2Vzbid0IGltcGxlbWVudCB0aGUgJ2hpZGUnIG1ldGhvZFxuICAgIGluc3RhbmNlW21ldGhvZF0oKVxuICB9KVxufVxuXG5leHBvcnQge1xuICBlbmFibGVEaXNtaXNzVHJpZ2dlclxufVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBhbGVydC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgeyBlbmFibGVEaXNtaXNzVHJpZ2dlciB9IGZyb20gJy4vdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zLmpzJ1xuaW1wb3J0IHsgZGVmaW5lSlF1ZXJ5UGx1Z2luIH0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnYWxlcnQnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5hbGVydCdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5cbmNvbnN0IEVWRU5UX0NMT1NFID0gYGNsb3NlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xPU0VEID0gYGNsb3NlZCR7RVZFTlRfS0VZfWBcbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEFsZXJ0IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgY2xvc2UoKSB7XG4gICAgY29uc3QgY2xvc2VFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0NMT1NFKVxuXG4gICAgaWYgKGNsb3NlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcblxuICAgIGNvbnN0IGlzQW5pbWF0ZWQgPSB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUpXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB0aGlzLl9kZXN0cm95RWxlbWVudCgpLCB0aGlzLl9lbGVtZW50LCBpc0FuaW1hdGVkKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfZGVzdHJveUVsZW1lbnQoKSB7XG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKVxuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0NMT1NFRClcbiAgICB0aGlzLmRpc3Bvc2UoKVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQWxlcnQuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSh0aGlzKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbmVuYWJsZURpc21pc3NUcmlnZ2VyKEFsZXJ0LCAnY2xvc2UnKVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihBbGVydClcblxuZXhwb3J0IGRlZmF1bHQgQWxlcnRcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgYnV0dG9uLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiB9IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2J1dHRvbidcbmNvbnN0IERBVEFfS0VZID0gJ2JzLmJ1dHRvbidcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuXG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSA9ICdhY3RpdmUnXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJidXR0b25cIl0nXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQnV0dG9uIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKCkge1xuICAgIC8vIFRvZ2dsZSBjbGFzcyBhbmQgc3luYyB0aGUgYGFyaWEtcHJlc3NlZGAgYXR0cmlidXRlIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYC50b2dnbGUoKWAgbWV0aG9kXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShDTEFTU19OQU1FX0FDVElWRSkpXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBCdXR0b24uZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKVxuXG4gICAgICBpZiAoY29uZmlnID09PSAndG9nZ2xlJykge1xuICAgICAgICBkYXRhW2NvbmZpZ10oKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBldmVudCA9PiB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICBjb25zdCBidXR0b24gPSBldmVudC50YXJnZXQuY2xvc2VzdChTRUxFQ1RPUl9EQVRBX1RPR0dMRSlcbiAgY29uc3QgZGF0YSA9IEJ1dHRvbi5nZXRPckNyZWF0ZUluc3RhbmNlKGJ1dHRvbilcblxuICBkYXRhLnRvZ2dsZSgpXG59KVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihCdXR0b24pXG5cbmV4cG9ydCBkZWZhdWx0IEJ1dHRvblxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL3N3aXBlLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBDb25maWcgZnJvbSAnLi9jb25maWcuanMnXG5pbXBvcnQgeyBleGVjdXRlIH0gZnJvbSAnLi9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ3N3aXBlJ1xuY29uc3QgRVZFTlRfS0VZID0gJy5icy5zd2lwZSdcbmNvbnN0IEVWRU5UX1RPVUNIU1RBUlQgPSBgdG91Y2hzdGFydCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1RPVUNITU9WRSA9IGB0b3VjaG1vdmUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9UT1VDSEVORCA9IGB0b3VjaGVuZCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1BPSU5URVJET1dOID0gYHBvaW50ZXJkb3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfUE9JTlRFUlVQID0gYHBvaW50ZXJ1cCR7RVZFTlRfS0VZfWBcbmNvbnN0IFBPSU5URVJfVFlQRV9UT1VDSCA9ICd0b3VjaCdcbmNvbnN0IFBPSU5URVJfVFlQRV9QRU4gPSAncGVuJ1xuY29uc3QgQ0xBU1NfTkFNRV9QT0lOVEVSX0VWRU5UID0gJ3BvaW50ZXItZXZlbnQnXG5jb25zdCBTV0lQRV9USFJFU0hPTEQgPSA0MFxuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBlbmRDYWxsYmFjazogbnVsbCxcbiAgbGVmdENhbGxiYWNrOiBudWxsLFxuICByaWdodENhbGxiYWNrOiBudWxsXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBlbmRDYWxsYmFjazogJyhmdW5jdGlvbnxudWxsKScsXG4gIGxlZnRDYWxsYmFjazogJyhmdW5jdGlvbnxudWxsKScsXG4gIHJpZ2h0Q2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFN3aXBlIGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50XG5cbiAgICBpZiAoIWVsZW1lbnQgfHwgIVN3aXBlLmlzU3VwcG9ydGVkKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpXG4gICAgdGhpcy5fZGVsdGFYID0gMFxuICAgIHRoaXMuX3N1cHBvcnRQb2ludGVyRXZlbnRzID0gQm9vbGVhbih3aW5kb3cuUG9pbnRlckV2ZW50KVxuICAgIHRoaXMuX2luaXRFdmVudHMoKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBkaXNwb3NlKCkge1xuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfc3RhcnQoZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuX3N1cHBvcnRQb2ludGVyRXZlbnRzKSB7XG4gICAgICB0aGlzLl9kZWx0YVggPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFhcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2V2ZW50SXNQb2ludGVyUGVuVG91Y2goZXZlbnQpKSB7XG4gICAgICB0aGlzLl9kZWx0YVggPSBldmVudC5jbGllbnRYXG4gICAgfVxuICB9XG5cbiAgX2VuZChldmVudCkge1xuICAgIGlmICh0aGlzLl9ldmVudElzUG9pbnRlclBlblRvdWNoKGV2ZW50KSkge1xuICAgICAgdGhpcy5fZGVsdGFYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuX2RlbHRhWFxuICAgIH1cblxuICAgIHRoaXMuX2hhbmRsZVN3aXBlKClcbiAgICBleGVjdXRlKHRoaXMuX2NvbmZpZy5lbmRDYWxsYmFjaylcbiAgfVxuXG4gIF9tb3ZlKGV2ZW50KSB7XG4gICAgdGhpcy5fZGVsdGFYID0gZXZlbnQudG91Y2hlcyAmJiBldmVudC50b3VjaGVzLmxlbmd0aCA+IDEgP1xuICAgICAgMCA6XG4gICAgICBldmVudC50b3VjaGVzWzBdLmNsaWVudFggLSB0aGlzLl9kZWx0YVhcbiAgfVxuXG4gIF9oYW5kbGVTd2lwZSgpIHtcbiAgICBjb25zdCBhYnNEZWx0YVggPSBNYXRoLmFicyh0aGlzLl9kZWx0YVgpXG5cbiAgICBpZiAoYWJzRGVsdGFYIDw9IFNXSVBFX1RIUkVTSE9MRCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZGlyZWN0aW9uID0gYWJzRGVsdGFYIC8gdGhpcy5fZGVsdGFYXG5cbiAgICB0aGlzLl9kZWx0YVggPSAwXG5cbiAgICBpZiAoIWRpcmVjdGlvbikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZXhlY3V0ZShkaXJlY3Rpb24gPiAwID8gdGhpcy5fY29uZmlnLnJpZ2h0Q2FsbGJhY2sgOiB0aGlzLl9jb25maWcubGVmdENhbGxiYWNrKVxuICB9XG5cbiAgX2luaXRFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuX3N1cHBvcnRQb2ludGVyRXZlbnRzKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfUE9JTlRFUkRPV04sIGV2ZW50ID0+IHRoaXMuX3N0YXJ0KGV2ZW50KSlcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9QT0lOVEVSVVAsIGV2ZW50ID0+IHRoaXMuX2VuZChldmVudCkpXG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1BPSU5URVJfRVZFTlQpXG4gICAgfSBlbHNlIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9UT1VDSFNUQVJULCBldmVudCA9PiB0aGlzLl9zdGFydChldmVudCkpXG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfVE9VQ0hNT1ZFLCBldmVudCA9PiB0aGlzLl9tb3ZlKGV2ZW50KSlcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9UT1VDSEVORCwgZXZlbnQgPT4gdGhpcy5fZW5kKGV2ZW50KSlcbiAgICB9XG4gIH1cblxuICBfZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaChldmVudCkge1xuICAgIHJldHVybiB0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cyAmJiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFBPSU5URVJfVFlQRV9QRU4gfHwgZXZlbnQucG9pbnRlclR5cGUgPT09IFBPSU5URVJfVFlQRV9UT1VDSClcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgaXNTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuICdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3dpcGVcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgY2Fyb3VzZWwuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50LmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4vZG9tL21hbmlwdWxhdG9yLmpzJ1xuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4vZG9tL3NlbGVjdG9yLWVuZ2luZS5qcydcbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbixcbiAgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQsXG4gIGlzUlRMLFxuICBpc1Zpc2libGUsXG4gIHJlZmxvdyxcbiAgdHJpZ2dlclRyYW5zaXRpb25FbmRcbn0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuaW1wb3J0IFN3aXBlIGZyb20gJy4vdXRpbC9zd2lwZS5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2Nhcm91c2VsJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMuY2Fyb3VzZWwnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgQVJST1dfTEVGVF9LRVkgPSAnQXJyb3dMZWZ0J1xuY29uc3QgQVJST1dfUklHSFRfS0VZID0gJ0Fycm93UmlnaHQnXG5jb25zdCBUT1VDSEVWRU5UX0NPTVBBVF9XQUlUID0gNTAwIC8vIFRpbWUgZm9yIG1vdXNlIGNvbXBhdCBldmVudHMgdG8gZmlyZSBhZnRlciB0b3VjaFxuXG5jb25zdCBPUkRFUl9ORVhUID0gJ25leHQnXG5jb25zdCBPUkRFUl9QUkVWID0gJ3ByZXYnXG5jb25zdCBESVJFQ1RJT05fTEVGVCA9ICdsZWZ0J1xuY29uc3QgRElSRUNUSU9OX1JJR0hUID0gJ3JpZ2h0J1xuXG5jb25zdCBFVkVOVF9TTElERSA9IGBzbGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NMSUQgPSBgc2xpZCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0tFWURPV04gPSBga2V5ZG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX01PVVNFRU5URVIgPSBgbW91c2VlbnRlciR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX01PVVNFTEVBVkUgPSBgbW91c2VsZWF2ZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0RSQUdfU1RBUlQgPSBgZHJhZ3N0YXJ0JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfTE9BRF9EQVRBX0FQSSA9IGBsb2FkJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbmNvbnN0IENMQVNTX05BTUVfQ0FST1VTRUwgPSAnY2Fyb3VzZWwnXG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSA9ICdhY3RpdmUnXG5jb25zdCBDTEFTU19OQU1FX1NMSURFID0gJ3NsaWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9FTkQgPSAnY2Fyb3VzZWwtaXRlbS1lbmQnXG5jb25zdCBDTEFTU19OQU1FX1NUQVJUID0gJ2Nhcm91c2VsLWl0ZW0tc3RhcnQnXG5jb25zdCBDTEFTU19OQU1FX05FWFQgPSAnY2Fyb3VzZWwtaXRlbS1uZXh0J1xuY29uc3QgQ0xBU1NfTkFNRV9QUkVWID0gJ2Nhcm91c2VsLWl0ZW0tcHJldidcblxuY29uc3QgU0VMRUNUT1JfQUNUSVZFID0gJy5hY3RpdmUnXG5jb25zdCBTRUxFQ1RPUl9JVEVNID0gJy5jYXJvdXNlbC1pdGVtJ1xuY29uc3QgU0VMRUNUT1JfQUNUSVZFX0lURU0gPSBTRUxFQ1RPUl9BQ1RJVkUgKyBTRUxFQ1RPUl9JVEVNXG5jb25zdCBTRUxFQ1RPUl9JVEVNX0lNRyA9ICcuY2Fyb3VzZWwtaXRlbSBpbWcnXG5jb25zdCBTRUxFQ1RPUl9JTkRJQ0FUT1JTID0gJy5jYXJvdXNlbC1pbmRpY2F0b3JzJ1xuY29uc3QgU0VMRUNUT1JfREFUQV9TTElERSA9ICdbZGF0YS1icy1zbGlkZV0sIFtkYXRhLWJzLXNsaWRlLXRvXSdcbmNvbnN0IFNFTEVDVE9SX0RBVEFfUklERSA9ICdbZGF0YS1icy1yaWRlPVwiY2Fyb3VzZWxcIl0nXG5cbmNvbnN0IEtFWV9UT19ESVJFQ1RJT04gPSB7XG4gIFtBUlJPV19MRUZUX0tFWV06IERJUkVDVElPTl9SSUdIVCxcbiAgW0FSUk9XX1JJR0hUX0tFWV06IERJUkVDVElPTl9MRUZUXG59XG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGludGVydmFsOiA1MDAwLFxuICBrZXlib2FyZDogdHJ1ZSxcbiAgcGF1c2U6ICdob3ZlcicsXG4gIHJpZGU6IGZhbHNlLFxuICB0b3VjaDogdHJ1ZSxcbiAgd3JhcDogdHJ1ZVxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgaW50ZXJ2YWw6ICcobnVtYmVyfGJvb2xlYW4pJywgLy8gVE9ETzp2NiByZW1vdmUgYm9vbGVhbiBzdXBwb3J0XG4gIGtleWJvYXJkOiAnYm9vbGVhbicsXG4gIHBhdXNlOiAnKHN0cmluZ3xib29sZWFuKScsXG4gIHJpZGU6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgdG91Y2g6ICdib29sZWFuJyxcbiAgd3JhcDogJ2Jvb2xlYW4nXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIENhcm91c2VsIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZylcblxuICAgIHRoaXMuX2ludGVydmFsID0gbnVsbFxuICAgIHRoaXMuX2FjdGl2ZUVsZW1lbnQgPSBudWxsXG4gICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2VcbiAgICB0aGlzLnRvdWNoVGltZW91dCA9IG51bGxcbiAgICB0aGlzLl9zd2lwZUhlbHBlciA9IG51bGxcblxuICAgIHRoaXMuX2luZGljYXRvcnNFbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9JTkRJQ0FUT1JTLCB0aGlzLl9lbGVtZW50KVxuICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKClcblxuICAgIGlmICh0aGlzLl9jb25maWcucmlkZSA9PT0gQ0xBU1NfTkFNRV9DQVJPVVNFTCkge1xuICAgICAgdGhpcy5jeWNsZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBuZXh0KCkge1xuICAgIHRoaXMuX3NsaWRlKE9SREVSX05FWFQpXG4gIH1cblxuICBuZXh0V2hlblZpc2libGUoKSB7XG4gICAgLy8gRklYTUUgVE9ETyB1c2UgYGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZWBcbiAgICAvLyBEb24ndCBjYWxsIG5leHQgd2hlbiB0aGUgcGFnZSBpc24ndCB2aXNpYmxlXG4gICAgLy8gb3IgdGhlIGNhcm91c2VsIG9yIGl0cyBwYXJlbnQgaXNuJ3QgdmlzaWJsZVxuICAgIGlmICghZG9jdW1lbnQuaGlkZGVuICYmIGlzVmlzaWJsZSh0aGlzLl9lbGVtZW50KSkge1xuICAgICAgdGhpcy5uZXh0KClcbiAgICB9XG4gIH1cblxuICBwcmV2KCkge1xuICAgIHRoaXMuX3NsaWRlKE9SREVSX1BSRVYpXG4gIH1cblxuICBwYXVzZSgpIHtcbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICB0cmlnZ2VyVHJhbnNpdGlvbkVuZCh0aGlzLl9lbGVtZW50KVxuICAgIH1cblxuICAgIHRoaXMuX2NsZWFySW50ZXJ2YWwoKVxuICB9XG5cbiAgY3ljbGUoKSB7XG4gICAgdGhpcy5fY2xlYXJJbnRlcnZhbCgpXG4gICAgdGhpcy5fdXBkYXRlSW50ZXJ2YWwoKVxuXG4gICAgdGhpcy5faW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLm5leHRXaGVuVmlzaWJsZSgpLCB0aGlzLl9jb25maWcuaW50ZXJ2YWwpXG4gIH1cblxuICBfbWF5YmVFbmFibGVDeWNsZSgpIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5yaWRlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICBFdmVudEhhbmRsZXIub25lKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NMSUQsICgpID0+IHRoaXMuY3ljbGUoKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuY3ljbGUoKVxuICB9XG5cbiAgdG8oaW5kZXgpIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2dldEl0ZW1zKClcbiAgICBpZiAoaW5kZXggPiBpdGVtcy5sZW5ndGggLSAxIHx8IGluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uZSh0aGlzLl9lbGVtZW50LCBFVkVOVF9TTElELCAoKSA9PiB0aGlzLnRvKGluZGV4KSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KHRoaXMuX2dldEFjdGl2ZSgpKVxuICAgIGlmIChhY3RpdmVJbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG9yZGVyID0gaW5kZXggPiBhY3RpdmVJbmRleCA/IE9SREVSX05FWFQgOiBPUkRFUl9QUkVWXG5cbiAgICB0aGlzLl9zbGlkZShvcmRlciwgaXRlbXNbaW5kZXhdKVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5fc3dpcGVIZWxwZXIpIHtcbiAgICAgIHRoaXMuX3N3aXBlSGVscGVyLmRpc3Bvc2UoKVxuICAgIH1cblxuICAgIHN1cGVyLmRpc3Bvc2UoKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICBjb25maWcuZGVmYXVsdEludGVydmFsID0gY29uZmlnLmludGVydmFsXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOLCBldmVudCA9PiB0aGlzLl9rZXlkb3duKGV2ZW50KSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnBhdXNlID09PSAnaG92ZXInKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VFTlRFUiwgKCkgPT4gdGhpcy5wYXVzZSgpKVxuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFTEVBVkUsICgpID0+IHRoaXMuX21heWJlRW5hYmxlQ3ljbGUoKSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnRvdWNoICYmIFN3aXBlLmlzU3VwcG9ydGVkKCkpIHtcbiAgICAgIHRoaXMuX2FkZFRvdWNoRXZlbnRMaXN0ZW5lcnMoKVxuICAgIH1cbiAgfVxuXG4gIF9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGZvciAoY29uc3QgaW1nIG9mIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfSVRFTV9JTUcsIHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24oaW1nLCBFVkVOVF9EUkFHX1NUQVJULCBldmVudCA9PiBldmVudC5wcmV2ZW50RGVmYXVsdCgpKVxuICAgIH1cblxuICAgIGNvbnN0IGVuZENhbGxCYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5wYXVzZSAhPT0gJ2hvdmVyJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gSWYgaXQncyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlLCBtb3VzZWVudGVyL2xlYXZlIGFyZSBmaXJlZCBhc1xuICAgICAgLy8gcGFydCBvZiB0aGUgbW91c2UgY29tcGF0aWJpbGl0eSBldmVudHMgb24gZmlyc3QgdGFwIC0gdGhlIGNhcm91c2VsXG4gICAgICAvLyB3b3VsZCBzdG9wIGN5Y2xpbmcgdW50aWwgdXNlciB0YXBwZWQgb3V0IG9mIGl0O1xuICAgICAgLy8gaGVyZSwgd2UgbGlzdGVuIGZvciB0b3VjaGVuZCwgZXhwbGljaXRseSBwYXVzZSB0aGUgY2Fyb3VzZWxcbiAgICAgIC8vIChhcyBpZiBpdCdzIHRoZSBzZWNvbmQgdGltZSB3ZSB0YXAgb24gaXQsIG1vdXNlZW50ZXIgY29tcGF0IGV2ZW50XG4gICAgICAvLyBpcyBOT1QgZmlyZWQpIGFuZCBhZnRlciBhIHRpbWVvdXQgKHRvIGFsbG93IGZvciBtb3VzZSBjb21wYXRpYmlsaXR5XG4gICAgICAvLyBldmVudHMgdG8gZmlyZSkgd2UgZXhwbGljaXRseSByZXN0YXJ0IGN5Y2xpbmdcblxuICAgICAgdGhpcy5wYXVzZSgpXG4gICAgICBpZiAodGhpcy50b3VjaFRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG91Y2hUaW1lb3V0KVxuICAgICAgfVxuXG4gICAgICB0aGlzLnRvdWNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fbWF5YmVFbmFibGVDeWNsZSgpLCBUT1VDSEVWRU5UX0NPTVBBVF9XQUlUICsgdGhpcy5fY29uZmlnLmludGVydmFsKVxuICAgIH1cblxuICAgIGNvbnN0IHN3aXBlQ29uZmlnID0ge1xuICAgICAgbGVmdENhbGxiYWNrOiAoKSA9PiB0aGlzLl9zbGlkZSh0aGlzLl9kaXJlY3Rpb25Ub09yZGVyKERJUkVDVElPTl9MRUZUKSksXG4gICAgICByaWdodENhbGxiYWNrOiAoKSA9PiB0aGlzLl9zbGlkZSh0aGlzLl9kaXJlY3Rpb25Ub09yZGVyKERJUkVDVElPTl9SSUdIVCkpLFxuICAgICAgZW5kQ2FsbGJhY2s6IGVuZENhbGxCYWNrXG4gICAgfVxuXG4gICAgdGhpcy5fc3dpcGVIZWxwZXIgPSBuZXcgU3dpcGUodGhpcy5fZWxlbWVudCwgc3dpcGVDb25maWcpXG4gIH1cblxuICBfa2V5ZG93bihldmVudCkge1xuICAgIGlmICgvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZGlyZWN0aW9uID0gS0VZX1RPX0RJUkVDVElPTltldmVudC5rZXldXG4gICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihkaXJlY3Rpb24pKVxuICAgIH1cbiAgfVxuXG4gIF9nZXRJdGVtSW5kZXgoZWxlbWVudCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRJdGVtcygpLmluZGV4T2YoZWxlbWVudClcbiAgfVxuXG4gIF9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50KGluZGV4KSB7XG4gICAgaWYgKCF0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgYWN0aXZlSW5kaWNhdG9yID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9BQ1RJVkUsIHRoaXMuX2luZGljYXRvcnNFbGVtZW50KVxuXG4gICAgYWN0aXZlSW5kaWNhdG9yLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgYWN0aXZlSW5kaWNhdG9yLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JylcblxuICAgIGNvbnN0IG5ld0FjdGl2ZUluZGljYXRvciA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoYFtkYXRhLWJzLXNsaWRlLXRvPVwiJHtpbmRleH1cIl1gLCB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudClcblxuICAgIGlmIChuZXdBY3RpdmVJbmRpY2F0b3IpIHtcbiAgICAgIG5ld0FjdGl2ZUluZGljYXRvci5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKVxuICAgICAgbmV3QWN0aXZlSW5kaWNhdG9yLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JywgJ3RydWUnKVxuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVJbnRlcnZhbCgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fYWN0aXZlRWxlbWVudCB8fCB0aGlzLl9nZXRBY3RpdmUoKVxuXG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50SW50ZXJ2YWwgPSBOdW1iZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtaW50ZXJ2YWwnKSwgMTApXG5cbiAgICB0aGlzLl9jb25maWcuaW50ZXJ2YWwgPSBlbGVtZW50SW50ZXJ2YWwgfHwgdGhpcy5fY29uZmlnLmRlZmF1bHRJbnRlcnZhbFxuICB9XG5cbiAgX3NsaWRlKG9yZGVyLCBlbGVtZW50ID0gbnVsbCkge1xuICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9nZXRBY3RpdmUoKVxuICAgIGNvbnN0IGlzTmV4dCA9IG9yZGVyID09PSBPUkRFUl9ORVhUXG4gICAgY29uc3QgbmV4dEVsZW1lbnQgPSBlbGVtZW50IHx8IGdldE5leHRBY3RpdmVFbGVtZW50KHRoaXMuX2dldEl0ZW1zKCksIGFjdGl2ZUVsZW1lbnQsIGlzTmV4dCwgdGhpcy5fY29uZmlnLndyYXApXG5cbiAgICBpZiAobmV4dEVsZW1lbnQgPT09IGFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG5leHRFbGVtZW50SW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgobmV4dEVsZW1lbnQpXG5cbiAgICBjb25zdCB0cmlnZ2VyRXZlbnQgPSBldmVudE5hbWUgPT4ge1xuICAgICAgcmV0dXJuIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIGV2ZW50TmFtZSwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiBuZXh0RWxlbWVudCxcbiAgICAgICAgZGlyZWN0aW9uOiB0aGlzLl9vcmRlclRvRGlyZWN0aW9uKG9yZGVyKSxcbiAgICAgICAgZnJvbTogdGhpcy5fZ2V0SXRlbUluZGV4KGFjdGl2ZUVsZW1lbnQpLFxuICAgICAgICB0bzogbmV4dEVsZW1lbnRJbmRleFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCBzbGlkZUV2ZW50ID0gdHJpZ2dlckV2ZW50KEVWRU5UX1NMSURFKVxuXG4gICAgaWYgKHNsaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFhY3RpdmVFbGVtZW50IHx8ICFuZXh0RWxlbWVudCkge1xuICAgICAgLy8gU29tZSB3ZWlyZG5lc3MgaXMgaGFwcGVuaW5nLCBzbyB3ZSBiYWlsXG4gICAgICAvLyBUT0RPOiBjaGFuZ2UgdGVzdHMgdGhhdCB1c2UgZW1wdHkgZGl2cyB0byBhdm9pZCB0aGlzIGNoZWNrXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBpc0N5Y2xpbmcgPSBCb29sZWFuKHRoaXMuX2ludGVydmFsKVxuICAgIHRoaXMucGF1c2UoKVxuXG4gICAgdGhpcy5faXNTbGlkaW5nID0gdHJ1ZVxuXG4gICAgdGhpcy5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChuZXh0RWxlbWVudEluZGV4KVxuICAgIHRoaXMuX2FjdGl2ZUVsZW1lbnQgPSBuZXh0RWxlbWVudFxuXG4gICAgY29uc3QgZGlyZWN0aW9uYWxDbGFzc05hbWUgPSBpc05leHQgPyBDTEFTU19OQU1FX1NUQVJUIDogQ0xBU1NfTkFNRV9FTkRcbiAgICBjb25zdCBvcmRlckNsYXNzTmFtZSA9IGlzTmV4dCA/IENMQVNTX05BTUVfTkVYVCA6IENMQVNTX05BTUVfUFJFVlxuXG4gICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmFkZChvcmRlckNsYXNzTmFtZSlcblxuICAgIHJlZmxvdyhuZXh0RWxlbWVudClcblxuICAgIGFjdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChkaXJlY3Rpb25hbENsYXNzTmFtZSlcbiAgICBuZXh0RWxlbWVudC5jbGFzc0xpc3QuYWRkKGRpcmVjdGlvbmFsQ2xhc3NOYW1lKVxuXG4gICAgY29uc3QgY29tcGxldGVDYWxsQmFjayA9ICgpID0+IHtcbiAgICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoZGlyZWN0aW9uYWxDbGFzc05hbWUsIG9yZGVyQ2xhc3NOYW1lKVxuICAgICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSlcblxuICAgICAgYWN0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFLCBvcmRlckNsYXNzTmFtZSwgZGlyZWN0aW9uYWxDbGFzc05hbWUpXG5cbiAgICAgIHRoaXMuX2lzU2xpZGluZyA9IGZhbHNlXG5cbiAgICAgIHRyaWdnZXJFdmVudChFVkVOVF9TTElEKVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsQmFjaywgYWN0aXZlRWxlbWVudCwgdGhpcy5faXNBbmltYXRlZCgpKVxuXG4gICAgaWYgKGlzQ3ljbGluZykge1xuICAgICAgdGhpcy5jeWNsZSgpXG4gICAgfVxuICB9XG5cbiAgX2lzQW5pbWF0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0xJREUpXG4gIH1cblxuICBfZ2V0QWN0aXZlKCkge1xuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0FDVElWRV9JVEVNLCB0aGlzLl9lbGVtZW50KVxuICB9XG5cbiAgX2dldEl0ZW1zKCkge1xuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lURU0sIHRoaXMuX2VsZW1lbnQpXG4gIH1cblxuICBfY2xlYXJJbnRlcnZhbCgpIHtcbiAgICBpZiAodGhpcy5faW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5faW50ZXJ2YWwpXG4gICAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGxcbiAgICB9XG4gIH1cblxuICBfZGlyZWN0aW9uVG9PcmRlcihkaXJlY3Rpb24pIHtcbiAgICBpZiAoaXNSVEwoKSkge1xuICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gRElSRUNUSU9OX0xFRlQgPyBPUkRFUl9QUkVWIDogT1JERVJfTkVYVFxuICAgIH1cblxuICAgIHJldHVybiBkaXJlY3Rpb24gPT09IERJUkVDVElPTl9MRUZUID8gT1JERVJfTkVYVCA6IE9SREVSX1BSRVZcbiAgfVxuXG4gIF9vcmRlclRvRGlyZWN0aW9uKG9yZGVyKSB7XG4gICAgaWYgKGlzUlRMKCkpIHtcbiAgICAgIHJldHVybiBvcmRlciA9PT0gT1JERVJfUFJFViA/IERJUkVDVElPTl9MRUZUIDogRElSRUNUSU9OX1JJR0hUXG4gICAgfVxuXG4gICAgcmV0dXJuIG9yZGVyID09PSBPUkRFUl9QUkVWID8gRElSRUNUSU9OX1JJR0hUIDogRElSRUNUSU9OX0xFRlRcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IENhcm91c2VsLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgZGF0YS50byhjb25maWcpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKGRhdGFbY29uZmlnXSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5zdGFydHNXaXRoKCdfJykgfHwgY29uZmlnID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVtjb25maWddKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1NMSURFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgY29uc3QgdGFyZ2V0ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0aGlzKVxuXG4gIGlmICghdGFyZ2V0IHx8ICF0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQ0FST1VTRUwpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgY29uc3QgY2Fyb3VzZWwgPSBDYXJvdXNlbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldClcbiAgY29uc3Qgc2xpZGVJbmRleCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLXNsaWRlLXRvJylcblxuICBpZiAoc2xpZGVJbmRleCkge1xuICAgIGNhcm91c2VsLnRvKHNsaWRlSW5kZXgpXG4gICAgY2Fyb3VzZWwuX21heWJlRW5hYmxlQ3ljbGUoKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGUodGhpcywgJ3NsaWRlJykgPT09ICduZXh0Jykge1xuICAgIGNhcm91c2VsLm5leHQoKVxuICAgIGNhcm91c2VsLl9tYXliZUVuYWJsZUN5Y2xlKClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNhcm91c2VsLnByZXYoKVxuICBjYXJvdXNlbC5fbWF5YmVFbmFibGVDeWNsZSgpXG59KVxuXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJLCAoKSA9PiB7XG4gIGNvbnN0IGNhcm91c2VscyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfREFUQV9SSURFKVxuXG4gIGZvciAoY29uc3QgY2Fyb3VzZWwgb2YgY2Fyb3VzZWxzKSB7XG4gICAgQ2Fyb3VzZWwuZ2V0T3JDcmVhdGVJbnN0YW5jZShjYXJvdXNlbClcbiAgfVxufSlcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oQ2Fyb3VzZWwpXG5cbmV4cG9ydCBkZWZhdWx0IENhcm91c2VsXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGNvbGxhcHNlLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGdldEVsZW1lbnQsXG4gIHJlZmxvd1xufSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdjb2xsYXBzZSdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLmNvbGxhcHNlJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5cbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcbmNvbnN0IENMQVNTX05BTUVfQ09MTEFQU0UgPSAnY29sbGFwc2UnXG5jb25zdCBDTEFTU19OQU1FX0NPTExBUFNJTkcgPSAnY29sbGFwc2luZydcbmNvbnN0IENMQVNTX05BTUVfQ09MTEFQU0VEID0gJ2NvbGxhcHNlZCdcbmNvbnN0IENMQVNTX05BTUVfREVFUEVSX0NISUxEUkVOID0gYDpzY29wZSAuJHtDTEFTU19OQU1FX0NPTExBUFNFfSAuJHtDTEFTU19OQU1FX0NPTExBUFNFfWBcbmNvbnN0IENMQVNTX05BTUVfSE9SSVpPTlRBTCA9ICdjb2xsYXBzZS1ob3Jpem9udGFsJ1xuXG5jb25zdCBXSURUSCA9ICd3aWR0aCdcbmNvbnN0IEhFSUdIVCA9ICdoZWlnaHQnXG5cbmNvbnN0IFNFTEVDVE9SX0FDVElWRVMgPSAnLmNvbGxhcHNlLnNob3csIC5jb2xsYXBzZS5jb2xsYXBzaW5nJ1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiY29sbGFwc2VcIl0nXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIHBhcmVudDogbnVsbCxcbiAgdG9nZ2xlOiB0cnVlXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBwYXJlbnQ6ICcobnVsbHxlbGVtZW50KScsXG4gIHRvZ2dsZTogJ2Jvb2xlYW4nXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIENvbGxhcHNlIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZylcblxuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlXG4gICAgdGhpcy5fdHJpZ2dlckFycmF5ID0gW11cblxuICAgIGNvbnN0IHRvZ2dsZUxpc3QgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfVE9HR0xFKVxuXG4gICAgZm9yIChjb25zdCBlbGVtIG9mIHRvZ2dsZUxpc3QpIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gU2VsZWN0b3JFbmdpbmUuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtKVxuICAgICAgY29uc3QgZmlsdGVyRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IpXG4gICAgICAgIC5maWx0ZXIoZm91bmRFbGVtZW50ID0+IGZvdW5kRWxlbWVudCA9PT0gdGhpcy5fZWxlbWVudClcblxuICAgICAgaWYgKHNlbGVjdG9yICE9PSBudWxsICYmIGZpbHRlckVsZW1lbnQubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX3RyaWdnZXJBcnJheS5wdXNoKGVsZW0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faW5pdGlhbGl6ZUNoaWxkcmVuKClcblxuICAgIGlmICghdGhpcy5fY29uZmlnLnBhcmVudCkge1xuICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX3RyaWdnZXJBcnJheSwgdGhpcy5faXNTaG93bigpKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcudG9nZ2xlKSB7XG4gICAgICB0aGlzLnRvZ2dsZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgdGhpcy5oaWRlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93KClcbiAgICB9XG4gIH1cblxuICBzaG93KCkge1xuICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25pbmcgfHwgdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsZXQgYWN0aXZlQ2hpbGRyZW4gPSBbXVxuXG4gICAgLy8gZmluZCBhY3RpdmUgY2hpbGRyZW5cbiAgICBpZiAodGhpcy5fY29uZmlnLnBhcmVudCkge1xuICAgICAgYWN0aXZlQ2hpbGRyZW4gPSB0aGlzLl9nZXRGaXJzdExldmVsQ2hpbGRyZW4oU0VMRUNUT1JfQUNUSVZFUylcbiAgICAgICAgLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQpXG4gICAgICAgIC5tYXAoZWxlbWVudCA9PiBDb2xsYXBzZS5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIHsgdG9nZ2xlOiBmYWxzZSB9KSlcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZlQ2hpbGRyZW4ubGVuZ3RoICYmIGFjdGl2ZUNoaWxkcmVuWzBdLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XKVxuICAgIGlmIChzdGFydEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGZvciAoY29uc3QgYWN0aXZlSW5zdGFuY2Ugb2YgYWN0aXZlQ2hpbGRyZW4pIHtcbiAgICAgIGFjdGl2ZUluc3RhbmNlLmhpZGUoKVxuICAgIH1cblxuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuX2dldERpbWVuc2lvbigpXG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTRSlcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKVxuXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gMFxuXG4gICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX3RyaWdnZXJBcnJheSwgdHJ1ZSlcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlXG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNJTkcpXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTRSwgQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAnJ1xuXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTilcbiAgICB9XG5cbiAgICBjb25zdCBjYXBpdGFsaXplZERpbWVuc2lvbiA9IGRpbWVuc2lvblswXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKDEpXG4gICAgY29uc3Qgc2Nyb2xsU2l6ZSA9IGBzY3JvbGwke2NhcGl0YWxpemVkRGltZW5zaW9ufWBcblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRydWUpXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gYCR7dGhpcy5fZWxlbWVudFtzY3JvbGxTaXplXX1weGBcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzVHJhbnNpdGlvbmluZyB8fCAhdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzdGFydEV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSlcbiAgICBpZiAoc3RhcnRFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBkaW1lbnNpb24gPSB0aGlzLl9nZXREaW1lbnNpb24oKVxuXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gYCR7dGhpcy5fZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkaW1lbnNpb25dfXB4YFxuXG4gICAgcmVmbG93KHRoaXMuX2VsZW1lbnQpXG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNFLCBDTEFTU19OQU1FX1NIT1cpXG5cbiAgICBmb3IgKGNvbnN0IHRyaWdnZXIgb2YgdGhpcy5fdHJpZ2dlckFycmF5KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0cmlnZ2VyKVxuXG4gICAgICBpZiAoZWxlbWVudCAmJiAhdGhpcy5faXNTaG93bihlbGVtZW50KSkge1xuICAgICAgICB0aGlzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoW3RyaWdnZXJdLCBmYWxzZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0UpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4pXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gJydcblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRydWUpXG4gIH1cblxuICBfaXNTaG93bihlbGVtZW50ID0gdGhpcy5fZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIGNvbmZpZy50b2dnbGUgPSBCb29sZWFuKGNvbmZpZy50b2dnbGUpIC8vIENvZXJjZSBzdHJpbmcgdmFsdWVzXG4gICAgY29uZmlnLnBhcmVudCA9IGdldEVsZW1lbnQoY29uZmlnLnBhcmVudClcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfZ2V0RGltZW5zaW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0hPUklaT05UQUwpID8gV0lEVEggOiBIRUlHSFRcbiAgfVxuXG4gIF9pbml0aWFsaXplQ2hpbGRyZW4oKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuX2dldEZpcnN0TGV2ZWxDaGlsZHJlbihTRUxFQ1RPUl9EQVRBX1RPR0dMRSlcblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBjaGlsZHJlbikge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpXG5cbiAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICB0aGlzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoW2VsZW1lbnRdLCB0aGlzLl9pc1Nob3duKHNlbGVjdGVkKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBTZWxlY3RvckVuZ2luZS5maW5kKENMQVNTX05BTUVfREVFUEVSX0NISUxEUkVOLCB0aGlzLl9jb25maWcucGFyZW50KVxuICAgIC8vIHJlbW92ZSBjaGlsZHJlbiBpZiBncmVhdGVyIGRlcHRoXG4gICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IsIHRoaXMuX2NvbmZpZy5wYXJlbnQpLmZpbHRlcihlbGVtZW50ID0+ICFjaGlsZHJlbi5pbmNsdWRlcyhlbGVtZW50KSlcbiAgfVxuXG4gIF9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModHJpZ2dlckFycmF5LCBpc09wZW4pIHtcbiAgICBpZiAoIXRyaWdnZXJBcnJheS5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0cmlnZ2VyQXJyYXkpIHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShDTEFTU19OQU1FX0NPTExBUFNFRCwgIWlzT3BlbilcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgaXNPcGVuKVxuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIGNvbnN0IF9jb25maWcgPSB7fVxuICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJyAmJiAvc2hvd3xoaWRlLy50ZXN0KGNvbmZpZykpIHtcbiAgICAgIF9jb25maWcudG9nZ2xlID0gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBDb2xsYXBzZS5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIF9jb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICAgIH1cblxuICAgICAgICBkYXRhW2NvbmZpZ10oKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgLy8gcHJldmVudERlZmF1bHQgb25seSBmb3IgPGE+IGVsZW1lbnRzICh3aGljaCBjaGFuZ2UgdGhlIFVSTCkgbm90IGluc2lkZSB0aGUgY29sbGFwc2libGUgZWxlbWVudFxuICBpZiAoZXZlbnQudGFyZ2V0LnRhZ05hbWUgPT09ICdBJyB8fCAoZXZlbnQuZGVsZWdhdGVUYXJnZXQgJiYgZXZlbnQuZGVsZWdhdGVUYXJnZXQudGFnTmFtZSA9PT0gJ0EnKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5nZXRNdWx0aXBsZUVsZW1lbnRzRnJvbVNlbGVjdG9yKHRoaXMpKSB7XG4gICAgQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCB7IHRvZ2dsZTogZmFsc2UgfSkudG9nZ2xlKClcbiAgfVxufSlcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oQ29sbGFwc2UpXG5cbmV4cG9ydCBkZWZhdWx0IENvbGxhcHNlXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRyb3Bkb3duLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0ICogYXMgUG9wcGVyIGZyb20gJ0Bwb3BwZXJqcy9jb3JlJ1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuL2RvbS9tYW5pcHVsYXRvci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGV4ZWN1dGUsXG4gIGdldEVsZW1lbnQsXG4gIGdldE5leHRBY3RpdmVFbGVtZW50LFxuICBpc0Rpc2FibGVkLFxuICBpc0VsZW1lbnQsXG4gIGlzUlRMLFxuICBpc1Zpc2libGUsXG4gIG5vb3Bcbn0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnZHJvcGRvd24nXG5jb25zdCBEQVRBX0tFWSA9ICdicy5kcm9wZG93bidcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuXG5jb25zdCBFU0NBUEVfS0VZID0gJ0VzY2FwZSdcbmNvbnN0IFRBQl9LRVkgPSAnVGFiJ1xuY29uc3QgQVJST1dfVVBfS0VZID0gJ0Fycm93VXAnXG5jb25zdCBBUlJPV19ET1dOX0tFWSA9ICdBcnJvd0Rvd24nXG5jb25zdCBSSUdIVF9NT1VTRV9CVVRUT04gPSAyIC8vIE1vdXNlRXZlbnQuYnV0dG9uIHZhbHVlIGZvciB0aGUgc2Vjb25kYXJ5IGJ1dHRvbiwgdXN1YWxseSB0aGUgcmlnaHQgYnV0dG9uXG5cbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSA9IGBrZXlkb3duJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuY29uc3QgRVZFTlRfS0VZVVBfREFUQV9BUEkgPSBga2V5dXAke0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QVVAgPSAnZHJvcHVwJ1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QRU5EID0gJ2Ryb3BlbmQnXG5jb25zdCBDTEFTU19OQU1FX0RST1BTVEFSVCA9ICdkcm9wc3RhcnQnXG5jb25zdCBDTEFTU19OQU1FX0RST1BVUF9DRU5URVIgPSAnZHJvcHVwLWNlbnRlcidcbmNvbnN0IENMQVNTX05BTUVfRFJPUERPV05fQ0VOVEVSID0gJ2Ryb3Bkb3duLWNlbnRlcidcblxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIl06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCknXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TSE9XTiA9IGAke1NFTEVDVE9SX0RBVEFfVE9HR0xFfS4ke0NMQVNTX05BTUVfU0hPV31gXG5jb25zdCBTRUxFQ1RPUl9NRU5VID0gJy5kcm9wZG93bi1tZW51J1xuY29uc3QgU0VMRUNUT1JfTkFWQkFSID0gJy5uYXZiYXInXG5jb25zdCBTRUxFQ1RPUl9OQVZCQVJfTkFWID0gJy5uYXZiYXItbmF2J1xuY29uc3QgU0VMRUNUT1JfVklTSUJMRV9JVEVNUyA9ICcuZHJvcGRvd24tbWVudSAuZHJvcGRvd24taXRlbTpub3QoLmRpc2FibGVkKTpub3QoOmRpc2FibGVkKSdcblxuY29uc3QgUExBQ0VNRU5UX1RPUCA9IGlzUlRMKCkgPyAndG9wLWVuZCcgOiAndG9wLXN0YXJ0J1xuY29uc3QgUExBQ0VNRU5UX1RPUEVORCA9IGlzUlRMKCkgPyAndG9wLXN0YXJ0JyA6ICd0b3AtZW5kJ1xuY29uc3QgUExBQ0VNRU5UX0JPVFRPTSA9IGlzUlRMKCkgPyAnYm90dG9tLWVuZCcgOiAnYm90dG9tLXN0YXJ0J1xuY29uc3QgUExBQ0VNRU5UX0JPVFRPTUVORCA9IGlzUlRMKCkgPyAnYm90dG9tLXN0YXJ0JyA6ICdib3R0b20tZW5kJ1xuY29uc3QgUExBQ0VNRU5UX1JJR0hUID0gaXNSVEwoKSA/ICdsZWZ0LXN0YXJ0JyA6ICdyaWdodC1zdGFydCdcbmNvbnN0IFBMQUNFTUVOVF9MRUZUID0gaXNSVEwoKSA/ICdyaWdodC1zdGFydCcgOiAnbGVmdC1zdGFydCdcbmNvbnN0IFBMQUNFTUVOVF9UT1BDRU5URVIgPSAndG9wJ1xuY29uc3QgUExBQ0VNRU5UX0JPVFRPTUNFTlRFUiA9ICdib3R0b20nXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGF1dG9DbG9zZTogdHJ1ZSxcbiAgYm91bmRhcnk6ICdjbGlwcGluZ1BhcmVudHMnLFxuICBkaXNwbGF5OiAnZHluYW1pYycsXG4gIG9mZnNldDogWzAsIDJdLFxuICBwb3BwZXJDb25maWc6IG51bGwsXG4gIHJlZmVyZW5jZTogJ3RvZ2dsZSdcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGF1dG9DbG9zZTogJyhib29sZWFufHN0cmluZyknLFxuICBib3VuZGFyeTogJyhzdHJpbmd8ZWxlbWVudCknLFxuICBkaXNwbGF5OiAnc3RyaW5nJyxcbiAgb2Zmc2V0OiAnKGFycmF5fHN0cmluZ3xmdW5jdGlvbiknLFxuICBwb3BwZXJDb25maWc6ICcobnVsbHxvYmplY3R8ZnVuY3Rpb24pJyxcbiAgcmVmZXJlbmNlOiAnKHN0cmluZ3xlbGVtZW50fG9iamVjdCknXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIERyb3Bkb3duIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZylcblxuICAgIHRoaXMuX3BvcHBlciA9IG51bGxcbiAgICB0aGlzLl9wYXJlbnQgPSB0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUgLy8gZHJvcGRvd24gd3JhcHBlclxuICAgIC8vIFRPRE86IHY2IHJldmVydCAjMzcwMTEgJiBjaGFuZ2UgbWFya3VwIGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS9kb2NzLzUuMy9mb3Jtcy9pbnB1dC1ncm91cC9cbiAgICB0aGlzLl9tZW51ID0gU2VsZWN0b3JFbmdpbmUubmV4dCh0aGlzLl9lbGVtZW50LCBTRUxFQ1RPUl9NRU5VKVswXSB8fFxuICAgICAgU2VsZWN0b3JFbmdpbmUucHJldih0aGlzLl9lbGVtZW50LCBTRUxFQ1RPUl9NRU5VKVswXSB8fFxuICAgICAgU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9NRU5VLCB0aGlzLl9wYXJlbnQpXG4gICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU2hvd24oKSA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KClcbiAgfVxuXG4gIHNob3coKSB7XG4gICAgaWYgKGlzRGlzYWJsZWQodGhpcy5fZWxlbWVudCkgfHwgdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgIH1cblxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1csIHJlbGF0ZWRUYXJnZXQpXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2NyZWF0ZVBvcHBlcigpXG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgYWRkIGV4dHJhXG4gICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB0byB0aGUgYm9keSdzIGltbWVkaWF0ZSBjaGlsZHJlbjtcbiAgICAvLyBvbmx5IG5lZWRlZCBiZWNhdXNlIG9mIGJyb2tlbiBldmVudCBkZWxlZ2F0aW9uIG9uIGlPU1xuICAgIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxNC8wMi9tb3VzZV9ldmVudF9idWIuaHRtbFxuICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgIXRoaXMuX3BhcmVudC5jbG9zZXN0KFNFTEVDVE9SX05BVkJBUl9OQVYpKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbihlbGVtZW50LCAnbW91c2VvdmVyJywgbm9vcClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LmZvY3VzKClcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHRydWUpXG5cbiAgICB0aGlzLl9tZW51LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpXG4gICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04sIHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMuX2VsZW1lbnQpIHx8ICF0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICByZWxhdGVkVGFyZ2V0OiB0aGlzLl9lbGVtZW50XG4gICAgfVxuXG4gICAgdGhpcy5fY29tcGxldGVIaWRlKHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHRoaXMuX3BvcHBlci5kZXN0cm95KClcbiAgICB9XG5cbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIHVwZGF0ZSgpIHtcbiAgICB0aGlzLl9pbk5hdmJhciA9IHRoaXMuX2RldGVjdE5hdmJhcigpXG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLnVwZGF0ZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29tcGxldGVIaWRlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFLCByZWxhdGVkVGFyZ2V0KVxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIHJlbW92ZSB0aGUgZXh0cmFcbiAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHdlIGFkZGVkIGZvciBpT1Mgc3VwcG9ydFxuICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBbXS5jb25jYXQoLi4uZG9jdW1lbnQuYm9keS5jaGlsZHJlbikpIHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCAnbW91c2VvdmVyJywgbm9vcClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpXG4gICAgfVxuXG4gICAgdGhpcy5fbWVudS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJylcbiAgICBNYW5pcHVsYXRvci5yZW1vdmVEYXRhQXR0cmlidXRlKHRoaXMuX21lbnUsICdwb3BwZXInKVxuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTiwgcmVsYXRlZFRhcmdldClcbiAgfVxuXG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gc3VwZXIuX2dldENvbmZpZyhjb25maWcpXG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5yZWZlcmVuY2UgPT09ICdvYmplY3QnICYmICFpc0VsZW1lbnQoY29uZmlnLnJlZmVyZW5jZSkgJiZcbiAgICAgIHR5cGVvZiBjb25maWcucmVmZXJlbmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gJ2Z1bmN0aW9uJ1xuICAgICkge1xuICAgICAgLy8gUG9wcGVyIHZpcnR1YWwgZWxlbWVudHMgcmVxdWlyZSBhIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBtZXRob2RcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7TkFNRS50b1VwcGVyQ2FzZSgpfTogT3B0aW9uIFwicmVmZXJlbmNlXCIgcHJvdmlkZWQgdHlwZSBcIm9iamVjdFwiIHdpdGhvdXQgYSByZXF1aXJlZCBcImdldEJvdW5kaW5nQ2xpZW50UmVjdFwiIG1ldGhvZC5gKVxuICAgIH1cblxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9jcmVhdGVQb3BwZXIoKSB7XG4gICAgaWYgKHR5cGVvZiBQb3BwZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIGRyb3Bkb3ducyByZXF1aXJlIFBvcHBlciAoaHR0cHM6Ly9wb3BwZXIuanMub3JnKScpXG4gICAgfVxuXG4gICAgbGV0IHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9lbGVtZW50XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnJlZmVyZW5jZSA9PT0gJ3BhcmVudCcpIHtcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9wYXJlbnRcbiAgICB9IGVsc2UgaWYgKGlzRWxlbWVudCh0aGlzLl9jb25maWcucmVmZXJlbmNlKSkge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IGdldEVsZW1lbnQodGhpcy5fY29uZmlnLnJlZmVyZW5jZSlcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9jb25maWcucmVmZXJlbmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IHRoaXMuX2NvbmZpZy5yZWZlcmVuY2VcbiAgICB9XG5cbiAgICBjb25zdCBwb3BwZXJDb25maWcgPSB0aGlzLl9nZXRQb3BwZXJDb25maWcoKVxuICAgIHRoaXMuX3BvcHBlciA9IFBvcHBlci5jcmVhdGVQb3BwZXIocmVmZXJlbmNlRWxlbWVudCwgdGhpcy5fbWVudSwgcG9wcGVyQ29uZmlnKVxuICB9XG5cbiAgX2lzU2hvd24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lbnUuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVylcbiAgfVxuXG4gIF9nZXRQbGFjZW1lbnQoKSB7XG4gICAgY29uc3QgcGFyZW50RHJvcGRvd24gPSB0aGlzLl9wYXJlbnRcblxuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRU5EKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9SSUdIVFxuICAgIH1cblxuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QU1RBUlQpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX0xFRlRcbiAgICB9XG5cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUFVQX0NFTlRFUikpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfVE9QQ0VOVEVSXG4gICAgfVxuXG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BET1dOX0NFTlRFUikpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfQk9UVE9NQ0VOVEVSXG4gICAgfVxuXG4gICAgLy8gV2UgbmVlZCB0byB0cmltIHRoZSB2YWx1ZSBiZWNhdXNlIGN1c3RvbSBwcm9wZXJ0aWVzIGNhbiBhbHNvIGluY2x1ZGUgc3BhY2VzXG4gICAgY29uc3QgaXNFbmQgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX21lbnUpLmdldFByb3BlcnR5VmFsdWUoJy0tYnMtcG9zaXRpb24nKS50cmltKCkgPT09ICdlbmQnXG5cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUFVQKSkge1xuICAgICAgcmV0dXJuIGlzRW5kID8gUExBQ0VNRU5UX1RPUEVORCA6IFBMQUNFTUVOVF9UT1BcbiAgICB9XG5cbiAgICByZXR1cm4gaXNFbmQgPyBQTEFDRU1FTlRfQk9UVE9NRU5EIDogUExBQ0VNRU5UX0JPVFRPTVxuICB9XG5cbiAgX2RldGVjdE5hdmJhcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX05BVkJBUikgIT09IG51bGxcbiAgfVxuXG4gIF9nZXRPZmZzZXQoKSB7XG4gICAgY29uc3QgeyBvZmZzZXQgfSA9IHRoaXMuX2NvbmZpZ1xuXG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gb2Zmc2V0LnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcG9wcGVyRGF0YSA9PiBvZmZzZXQocG9wcGVyRGF0YSwgdGhpcy5fZWxlbWVudClcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0XG4gIH1cblxuICBfZ2V0UG9wcGVyQ29uZmlnKCkge1xuICAgIGNvbnN0IGRlZmF1bHRCc1BvcHBlckNvbmZpZyA9IHtcbiAgICAgIHBsYWNlbWVudDogdGhpcy5fZ2V0UGxhY2VtZW50KCksXG4gICAgICBtb2RpZmllcnM6IFt7XG4gICAgICAgIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgYm91bmRhcnk6IHRoaXMuX2NvbmZpZy5ib3VuZGFyeVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG9mZnNldDogdGhpcy5fZ2V0T2Zmc2V0KClcbiAgICAgICAgfVxuICAgICAgfV1cbiAgICB9XG5cbiAgICAvLyBEaXNhYmxlIFBvcHBlciBpZiB3ZSBoYXZlIGEgc3RhdGljIGRpc3BsYXkgb3IgRHJvcGRvd24gaXMgaW4gTmF2YmFyXG4gICAgaWYgKHRoaXMuX2luTmF2YmFyIHx8IHRoaXMuX2NvbmZpZy5kaXNwbGF5ID09PSAnc3RhdGljJykge1xuICAgICAgTWFuaXB1bGF0b3Iuc2V0RGF0YUF0dHJpYnV0ZSh0aGlzLl9tZW51LCAncG9wcGVyJywgJ3N0YXRpYycpIC8vIFRPRE86IHY2IHJlbW92ZVxuICAgICAgZGVmYXVsdEJzUG9wcGVyQ29uZmlnLm1vZGlmaWVycyA9IFt7XG4gICAgICAgIG5hbWU6ICdhcHBseVN0eWxlcycsXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICB9XVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZhdWx0QnNQb3BwZXJDb25maWcsXG4gICAgICAuLi5leGVjdXRlKHRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWcsIFtkZWZhdWx0QnNQb3BwZXJDb25maWddKVxuICAgIH1cbiAgfVxuXG4gIF9zZWxlY3RNZW51SXRlbSh7IGtleSwgdGFyZ2V0IH0pIHtcbiAgICBjb25zdCBpdGVtcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfVklTSUJMRV9JVEVNUywgdGhpcy5fbWVudSkuZmlsdGVyKGVsZW1lbnQgPT4gaXNWaXNpYmxlKGVsZW1lbnQpKVxuXG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGlmIHRhcmdldCBpc24ndCBpbmNsdWRlZCBpbiBpdGVtcyAoZS5nLiB3aGVuIGV4cGFuZGluZyB0aGUgZHJvcGRvd24pXG4gICAgLy8gYWxsb3cgY3ljbGluZyB0byBnZXQgdGhlIGxhc3QgaXRlbSBpbiBjYXNlIGtleSBlcXVhbHMgQVJST1dfVVBfS0VZXG4gICAgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQoaXRlbXMsIHRhcmdldCwga2V5ID09PSBBUlJPV19ET1dOX0tFWSwgIWl0ZW1zLmluY2x1ZGVzKHRhcmdldCkpLmZvY3VzKClcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IERyb3Bkb3duLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgfSlcbiAgfVxuXG4gIHN0YXRpYyBjbGVhck1lbnVzKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gUklHSFRfTU9VU0VfQlVUVE9OIHx8IChldmVudC50eXBlID09PSAna2V5dXAnICYmIGV2ZW50LmtleSAhPT0gVEFCX0tFWSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG9wZW5Ub2dnbGVzID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TSE9XTilcblxuICAgIGZvciAoY29uc3QgdG9nZ2xlIG9mIG9wZW5Ub2dnbGVzKSB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gRHJvcGRvd24uZ2V0SW5zdGFuY2UodG9nZ2xlKVxuICAgICAgaWYgKCFjb250ZXh0IHx8IGNvbnRleHQuX2NvbmZpZy5hdXRvQ2xvc2UgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBvc2VkUGF0aCA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpXG4gICAgICBjb25zdCBpc01lbnVUYXJnZXQgPSBjb21wb3NlZFBhdGguaW5jbHVkZXMoY29udGV4dC5fbWVudSlcbiAgICAgIGlmIChcbiAgICAgICAgY29tcG9zZWRQYXRoLmluY2x1ZGVzKGNvbnRleHQuX2VsZW1lbnQpIHx8XG4gICAgICAgIChjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSAnaW5zaWRlJyAmJiAhaXNNZW51VGFyZ2V0KSB8fFxuICAgICAgICAoY29udGV4dC5fY29uZmlnLmF1dG9DbG9zZSA9PT0gJ291dHNpZGUnICYmIGlzTWVudVRhcmdldClcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBUYWIgbmF2aWdhdGlvbiB0aHJvdWdoIHRoZSBkcm9wZG93biBtZW51IG9yIGV2ZW50cyBmcm9tIGNvbnRhaW5lZCBpbnB1dHMgc2hvdWxkbid0IGNsb3NlIHRoZSBtZW51XG4gICAgICBpZiAoY29udGV4dC5fbWVudS5jb250YWlucyhldmVudC50YXJnZXQpICYmICgoZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC5rZXkgPT09IFRBQl9LRVkpIHx8IC9pbnB1dHxzZWxlY3R8b3B0aW9ufHRleHRhcmVhfGZvcm0vaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSkpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IHsgcmVsYXRlZFRhcmdldDogY29udGV4dC5fZWxlbWVudCB9XG5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQuY2xpY2tFdmVudCA9IGV2ZW50XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBkYXRhQXBpS2V5ZG93bkhhbmRsZXIoZXZlbnQpIHtcbiAgICAvLyBJZiBub3QgYW4gVVAgfCBET1dOIHwgRVNDQVBFIGtleSA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgLy8gSWYgaW5wdXQvdGV4dGFyZWEgJiYgaWYga2V5IGlzIG90aGVyIHRoYW4gRVNDQVBFID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcblxuICAgIGNvbnN0IGlzSW5wdXQgPSAvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKVxuICAgIGNvbnN0IGlzRXNjYXBlRXZlbnQgPSBldmVudC5rZXkgPT09IEVTQ0FQRV9LRVlcbiAgICBjb25zdCBpc1VwT3JEb3duRXZlbnQgPSBbQVJST1dfVVBfS0VZLCBBUlJPV19ET1dOX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KVxuXG4gICAgaWYgKCFpc1VwT3JEb3duRXZlbnQgJiYgIWlzRXNjYXBlRXZlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpc0lucHV0ICYmICFpc0VzY2FwZUV2ZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAvLyBUT0RPOiB2NiByZXZlcnQgIzM3MDExICYgY2hhbmdlIG1hcmt1cCBodHRwczovL2dldGJvb3RzdHJhcC5jb20vZG9jcy81LjMvZm9ybXMvaW5wdXQtZ3JvdXAvXG4gICAgY29uc3QgZ2V0VG9nZ2xlQnV0dG9uID0gdGhpcy5tYXRjaGVzKFNFTEVDVE9SX0RBVEFfVE9HR0xFKSA/XG4gICAgICB0aGlzIDpcbiAgICAgIChTZWxlY3RvckVuZ2luZS5wcmV2KHRoaXMsIFNFTEVDVE9SX0RBVEFfVE9HR0xFKVswXSB8fFxuICAgICAgICBTZWxlY3RvckVuZ2luZS5uZXh0KHRoaXMsIFNFTEVDVE9SX0RBVEFfVE9HR0xFKVswXSB8fFxuICAgICAgICBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBldmVudC5kZWxlZ2F0ZVRhcmdldC5wYXJlbnROb2RlKSlcblxuICAgIGNvbnN0IGluc3RhbmNlID0gRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZShnZXRUb2dnbGVCdXR0b24pXG5cbiAgICBpZiAoaXNVcE9yRG93bkV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgaW5zdGFuY2Uuc2hvdygpXG4gICAgICBpbnN0YW5jZS5fc2VsZWN0TWVudUl0ZW0oZXZlbnQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuX2lzU2hvd24oKSkgeyAvLyBlbHNlIGlzIGVzY2FwZSBhbmQgd2UgY2hlY2sgaWYgaXQgaXMgc2hvd25cbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICBpbnN0YW5jZS5oaWRlKClcbiAgICAgIGdldFRvZ2dsZUJ1dHRvbi5mb2N1cygpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBEcm9wZG93bi5kYXRhQXBpS2V5ZG93bkhhbmRsZXIpXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fREFUQV9BUEksIFNFTEVDVE9SX01FTlUsIERyb3Bkb3duLmRhdGFBcGlLZXlkb3duSGFuZGxlcilcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIERyb3Bkb3duLmNsZWFyTWVudXMpXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWVVQX0RBVEFfQVBJLCBEcm9wZG93bi5jbGVhck1lbnVzKVxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIERyb3Bkb3duLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykudG9nZ2xlKClcbn0pXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKERyb3Bkb3duKVxuXG5leHBvcnQgZGVmYXVsdCBEcm9wZG93blxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2JhY2tkcm9wLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBDb25maWcgZnJvbSAnLi9jb25maWcuanMnXG5pbXBvcnQge1xuICBleGVjdXRlLCBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uLCBnZXRFbGVtZW50LCByZWZsb3dcbn0gZnJvbSAnLi9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2JhY2tkcm9wJ1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcbmNvbnN0IEVWRU5UX01PVVNFRE9XTiA9IGBtb3VzZWRvd24uYnMuJHtOQU1FfWBcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgY2xhc3NOYW1lOiAnbW9kYWwtYmFja2Ryb3AnLFxuICBjbGlja0NhbGxiYWNrOiBudWxsLFxuICBpc0FuaW1hdGVkOiBmYWxzZSxcbiAgaXNWaXNpYmxlOiB0cnVlLCAvLyBpZiBmYWxzZSwgd2UgdXNlIHRoZSBiYWNrZHJvcCBoZWxwZXIgd2l0aG91dCBhZGRpbmcgYW55IGVsZW1lbnQgdG8gdGhlIGRvbVxuICByb290RWxlbWVudDogJ2JvZHknIC8vIGdpdmUgdGhlIGNob2ljZSB0byBwbGFjZSBiYWNrZHJvcCB1bmRlciBkaWZmZXJlbnQgZWxlbWVudHNcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gIGNsaWNrQ2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknLFxuICBpc0FuaW1hdGVkOiAnYm9vbGVhbicsXG4gIGlzVmlzaWJsZTogJ2Jvb2xlYW4nLFxuICByb290RWxlbWVudDogJyhlbGVtZW50fHN0cmluZyknXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEJhY2tkcm9wIGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpXG4gICAgdGhpcy5faXNBcHBlbmRlZCA9IGZhbHNlXG4gICAgdGhpcy5fZWxlbWVudCA9IG51bGxcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgc2hvdyhjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmlzVmlzaWJsZSkge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2FwcGVuZCgpXG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudCgpXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5pc0FuaW1hdGVkKSB7XG4gICAgICByZWZsb3coZWxlbWVudClcbiAgICB9XG5cbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgdGhpcy5fZW11bGF0ZUFuaW1hdGlvbigoKSA9PiB7XG4gICAgICBleGVjdXRlKGNhbGxiYWNrKVxuICAgIH0pXG4gIH1cblxuICBoaWRlKGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuaXNWaXNpYmxlKSB7XG4gICAgICBleGVjdXRlKGNhbGxiYWNrKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZ2V0RWxlbWVudCgpLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgdGhpcy5fZW11bGF0ZUFuaW1hdGlvbigoKSA9PiB7XG4gICAgICB0aGlzLmRpc3Bvc2UoKVxuICAgICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICB9KVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzQXBwZW5kZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOKVxuXG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKVxuICAgIHRoaXMuX2lzQXBwZW5kZWQgPSBmYWxzZVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfZ2V0RWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMuX2VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGJhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgIGJhY2tkcm9wLmNsYXNzTmFtZSA9IHRoaXMuX2NvbmZpZy5jbGFzc05hbWVcbiAgICAgIGlmICh0aGlzLl9jb25maWcuaXNBbmltYXRlZCkge1xuICAgICAgICBiYWNrZHJvcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZWxlbWVudCA9IGJhY2tkcm9wXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRcbiAgfVxuXG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIC8vIHVzZSBnZXRFbGVtZW50KCkgd2l0aCB0aGUgZGVmYXVsdCBcImJvZHlcIiB0byBnZXQgYSBmcmVzaCBFbGVtZW50IG9uIGVhY2ggaW5zdGFudGlhdGlvblxuICAgIGNvbmZpZy5yb290RWxlbWVudCA9IGdldEVsZW1lbnQoY29uZmlnLnJvb3RFbGVtZW50KVxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9hcHBlbmQoKSB7XG4gICAgaWYgKHRoaXMuX2lzQXBwZW5kZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9nZXRFbGVtZW50KClcbiAgICB0aGlzLl9jb25maWcucm9vdEVsZW1lbnQuYXBwZW5kKGVsZW1lbnQpXG5cbiAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOLCAoKSA9PiB7XG4gICAgICBleGVjdXRlKHRoaXMuX2NvbmZpZy5jbGlja0NhbGxiYWNrKVxuICAgIH0pXG5cbiAgICB0aGlzLl9pc0FwcGVuZGVkID0gdHJ1ZVxuICB9XG5cbiAgX2VtdWxhdGVBbmltYXRpb24oY2FsbGJhY2spIHtcbiAgICBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uKGNhbGxiYWNrLCB0aGlzLl9nZXRFbGVtZW50KCksIHRoaXMuX2NvbmZpZy5pc0FuaW1hdGVkKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhY2tkcm9wXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvZm9jdXN0cmFwLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IENvbmZpZyBmcm9tICcuL2NvbmZpZy5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2ZvY3VzdHJhcCdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLmZvY3VzdHJhcCdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBFVkVOVF9GT0NVU0lOID0gYGZvY3VzaW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOX1RBQiA9IGBrZXlkb3duLnRhYiR7RVZFTlRfS0VZfWBcblxuY29uc3QgVEFCX0tFWSA9ICdUYWInXG5jb25zdCBUQUJfTkFWX0ZPUldBUkQgPSAnZm9yd2FyZCdcbmNvbnN0IFRBQl9OQVZfQkFDS1dBUkQgPSAnYmFja3dhcmQnXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGF1dG9mb2N1czogdHJ1ZSxcbiAgdHJhcEVsZW1lbnQ6IG51bGwgLy8gVGhlIGVsZW1lbnQgdG8gdHJhcCBmb2N1cyBpbnNpZGUgb2Zcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGF1dG9mb2N1czogJ2Jvb2xlYW4nLFxuICB0cmFwRWxlbWVudDogJ2VsZW1lbnQnXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEZvY3VzVHJhcCBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKVxuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2VcbiAgICB0aGlzLl9sYXN0VGFiTmF2RGlyZWN0aW9uID0gbnVsbFxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBhY3RpdmF0ZSgpIHtcbiAgICBpZiAodGhpcy5faXNBY3RpdmUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcuYXV0b2ZvY3VzKSB7XG4gICAgICB0aGlzLl9jb25maWcudHJhcEVsZW1lbnQuZm9jdXMoKVxuICAgIH1cblxuICAgIEV2ZW50SGFuZGxlci5vZmYoZG9jdW1lbnQsIEVWRU5UX0tFWSkgLy8gZ3VhcmQgYWdhaW5zdCBpbmZpbml0ZSBmb2N1cyBsb29wXG4gICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9GT0NVU0lOLCBldmVudCA9PiB0aGlzLl9oYW5kbGVGb2N1c2luKGV2ZW50KSlcbiAgICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fVEFCLCBldmVudCA9PiB0aGlzLl9oYW5kbGVLZXlkb3duKGV2ZW50KSlcblxuICAgIHRoaXMuX2lzQWN0aXZlID0gdHJ1ZVxuICB9XG5cbiAgZGVhY3RpdmF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlXG4gICAgRXZlbnRIYW5kbGVyLm9mZihkb2N1bWVudCwgRVZFTlRfS0VZKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaGFuZGxlRm9jdXNpbihldmVudCkge1xuICAgIGNvbnN0IHsgdHJhcEVsZW1lbnQgfSA9IHRoaXMuX2NvbmZpZ1xuXG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gZG9jdW1lbnQgfHwgZXZlbnQudGFyZ2V0ID09PSB0cmFwRWxlbWVudCB8fCB0cmFwRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50cyA9IFNlbGVjdG9yRW5naW5lLmZvY3VzYWJsZUNoaWxkcmVuKHRyYXBFbGVtZW50KVxuXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdHJhcEVsZW1lbnQuZm9jdXMoKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9PT0gVEFCX05BVl9CQUNLV0FSRCkge1xuICAgICAgZWxlbWVudHNbZWxlbWVudHMubGVuZ3RoIC0gMV0uZm9jdXMoKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50c1swXS5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgX2hhbmRsZUtleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ICE9PSBUQUJfS0VZKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9sYXN0VGFiTmF2RGlyZWN0aW9uID0gZXZlbnQuc2hpZnRLZXkgPyBUQUJfTkFWX0JBQ0tXQVJEIDogVEFCX05BVl9GT1JXQVJEXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRm9jdXNUcmFwXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvc2Nyb2xsQmFyLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4uL2RvbS9tYW5pcHVsYXRvci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSAnLi9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBTRUxFQ1RPUl9GSVhFRF9DT05URU5UID0gJy5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AnXG5jb25zdCBTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCA9ICcuc3RpY2t5LXRvcCdcbmNvbnN0IFBST1BFUlRZX1BBRERJTkcgPSAncGFkZGluZy1yaWdodCdcbmNvbnN0IFBST1BFUlRZX01BUkdJTiA9ICdtYXJnaW4tcmlnaHQnXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFNjcm9sbEJhckhlbHBlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2VsZW1lbnQgPSBkb2N1bWVudC5ib2R5XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZ2V0V2lkdGgoKSB7XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9pbm5lcldpZHRoI3VzYWdlX25vdGVzXG4gICAgY29uc3QgZG9jdW1lbnRXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aFxuICAgIHJldHVybiBNYXRoLmFicyh3aW5kb3cuaW5uZXJXaWR0aCAtIGRvY3VtZW50V2lkdGgpXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5nZXRXaWR0aCgpXG4gICAgdGhpcy5fZGlzYWJsZU92ZXJGbG93KClcbiAgICAvLyBnaXZlIHBhZGRpbmcgdG8gZWxlbWVudCB0byBiYWxhbmNlIHRoZSBoaWRkZW4gc2Nyb2xsYmFyIHdpZHRoXG4gICAgdGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXModGhpcy5fZWxlbWVudCwgUFJPUEVSVFlfUEFERElORywgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSArIHdpZHRoKVxuICAgIC8vIHRyaWNrOiBXZSBhZGp1c3QgcG9zaXRpdmUgcGFkZGluZ1JpZ2h0IGFuZCBuZWdhdGl2ZSBtYXJnaW5SaWdodCB0byBzdGlja3ktdG9wIGVsZW1lbnRzIHRvIGtlZXAgc2hvd2luZyBmdWxsd2lkdGhcbiAgICB0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9GSVhFRF9DT05URU5ULCBQUk9QRVJUWV9QQURESU5HLCBjYWxjdWxhdGVkVmFsdWUgPT4gY2FsY3VsYXRlZFZhbHVlICsgd2lkdGgpXG4gICAgdGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQsIFBST1BFUlRZX01BUkdJTiwgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSAtIHdpZHRoKVxuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LCAnb3ZlcmZsb3cnKVxuICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXModGhpcy5fZWxlbWVudCwgUFJPUEVSVFlfUEFERElORylcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQsIFBST1BFUlRZX1BBRERJTkcpXG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCwgUFJPUEVSVFlfTUFSR0lOKVxuICB9XG5cbiAgaXNPdmVyZmxvd2luZygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRXaWR0aCgpID4gMFxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfZGlzYWJsZU92ZXJGbG93KCkge1xuICAgIHRoaXMuX3NhdmVJbml0aWFsQXR0cmlidXRlKHRoaXMuX2VsZW1lbnQsICdvdmVyZmxvdycpXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nXG4gIH1cblxuICBfc2V0RWxlbWVudEF0dHJpYnV0ZXMoc2VsZWN0b3IsIHN0eWxlUHJvcGVydHksIGNhbGxiYWNrKSB7XG4gICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLmdldFdpZHRoKClcbiAgICBjb25zdCBtYW5pcHVsYXRpb25DYWxsQmFjayA9IGVsZW1lbnQgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQgJiYgd2luZG93LmlubmVyV2lkdGggPiBlbGVtZW50LmNsaWVudFdpZHRoICsgc2Nyb2xsYmFyV2lkdGgpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3NhdmVJbml0aWFsQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpXG4gICAgICBjb25zdCBjYWxjdWxhdGVkVmFsdWUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpXG4gICAgICBlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHN0eWxlUHJvcGVydHksIGAke2NhbGxiYWNrKE51bWJlci5wYXJzZUZsb2F0KGNhbGN1bGF0ZWRWYWx1ZSkpfXB4YClcbiAgICB9XG5cbiAgICB0aGlzLl9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBtYW5pcHVsYXRpb25DYWxsQmFjaylcbiAgfVxuXG4gIF9zYXZlSW5pdGlhbEF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KSB7XG4gICAgY29uc3QgYWN0dWFsVmFsdWUgPSBlbGVtZW50LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoc3R5bGVQcm9wZXJ0eSlcbiAgICBpZiAoYWN0dWFsVmFsdWUpIHtcbiAgICAgIE1hbmlwdWxhdG9yLnNldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSwgYWN0dWFsVmFsdWUpXG4gICAgfVxuICB9XG5cbiAgX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoc2VsZWN0b3IsIHN0eWxlUHJvcGVydHkpIHtcbiAgICBjb25zdCBtYW5pcHVsYXRpb25DYWxsQmFjayA9IGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpXG4gICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gcmVtb3ZlIHRoZSBwcm9wZXJ0eSBpZiB0aGUgdmFsdWUgaXMgYG51bGxgOyB0aGUgdmFsdWUgY2FuIGFsc28gYmUgemVyb1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoc3R5bGVQcm9wZXJ0eSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIE1hbmlwdWxhdG9yLnJlbW92ZURhdGFBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSlcbiAgICAgIGVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVQcm9wZXJ0eSwgdmFsdWUpXG4gICAgfVxuXG4gICAgdGhpcy5fYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayhzZWxlY3RvciwgbWFuaXB1bGF0aW9uQ2FsbEJhY2spXG4gIH1cblxuICBfYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayhzZWxlY3RvciwgY2FsbEJhY2spIHtcbiAgICBpZiAoaXNFbGVtZW50KHNlbGVjdG9yKSkge1xuICAgICAgY2FsbEJhY2soc2VsZWN0b3IpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNlbCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yLCB0aGlzLl9lbGVtZW50KSkge1xuICAgICAgY2FsbEJhY2soc2VsKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTY3JvbGxCYXJIZWxwZXJcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgbW9kYWwuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50LmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4vZG9tL3NlbGVjdG9yLWVuZ2luZS5qcydcbmltcG9ydCBCYWNrZHJvcCBmcm9tICcuL3V0aWwvYmFja2Ryb3AuanMnXG5pbXBvcnQgeyBlbmFibGVEaXNtaXNzVHJpZ2dlciB9IGZyb20gJy4vdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zLmpzJ1xuaW1wb3J0IEZvY3VzVHJhcCBmcm9tICcuL3V0aWwvZm9jdXN0cmFwLmpzJ1xuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLCBpc1JUTCwgaXNWaXNpYmxlLCByZWZsb3dcbn0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuaW1wb3J0IFNjcm9sbEJhckhlbHBlciBmcm9tICcuL3V0aWwvc2Nyb2xsYmFyLmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnbW9kYWwnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5tb2RhbCdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuY29uc3QgRVNDQVBFX0tFWSA9ICdFc2NhcGUnXG5cbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREVfUFJFVkVOVEVEID0gYGhpZGVQcmV2ZW50ZWQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPVyA9IGBzaG93JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPV04gPSBgc2hvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9SRVNJWkUgPSBgcmVzaXplJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfRElTTUlTUyA9IGBjbGljay5kaXNtaXNzJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfTU9VU0VET1dOX0RJU01JU1MgPSBgbW91c2Vkb3duLmRpc21pc3Mke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOX0RJU01JU1MgPSBga2V5ZG93bi5kaXNtaXNzJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbmNvbnN0IENMQVNTX05BTUVfT1BFTiA9ICdtb2RhbC1vcGVuJ1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcbmNvbnN0IENMQVNTX05BTUVfU1RBVElDID0gJ21vZGFsLXN0YXRpYydcblxuY29uc3QgT1BFTl9TRUxFQ1RPUiA9ICcubW9kYWwuc2hvdydcbmNvbnN0IFNFTEVDVE9SX0RJQUxPRyA9ICcubW9kYWwtZGlhbG9nJ1xuY29uc3QgU0VMRUNUT1JfTU9EQUxfQk9EWSA9ICcubW9kYWwtYm9keSdcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLWJzLXRvZ2dsZT1cIm1vZGFsXCJdJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBiYWNrZHJvcDogdHJ1ZSxcbiAgZm9jdXM6IHRydWUsXG4gIGtleWJvYXJkOiB0cnVlXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBiYWNrZHJvcDogJyhib29sZWFufHN0cmluZyknLFxuICBmb2N1czogJ2Jvb2xlYW4nLFxuICBrZXlib2FyZDogJ2Jvb2xlYW4nXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIE1vZGFsIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZylcblxuICAgIHRoaXMuX2RpYWxvZyA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfRElBTE9HLCB0aGlzLl9lbGVtZW50KVxuICAgIHRoaXMuX2JhY2tkcm9wID0gdGhpcy5faW5pdGlhbGl6ZUJhY2tEcm9wKClcbiAgICB0aGlzLl9mb2N1c3RyYXAgPSB0aGlzLl9pbml0aWFsaXplRm9jdXNUcmFwKClcbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2VcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuICAgIHRoaXMuX3Njcm9sbEJhciA9IG5ldyBTY3JvbGxCYXJIZWxwZXIoKVxuXG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUocmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldClcbiAgfVxuXG4gIHNob3cocmVsYXRlZFRhcmdldCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duIHx8IHRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVywge1xuICAgICAgcmVsYXRlZFRhcmdldFxuICAgIH0pXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2lzU2hvd24gPSB0cnVlXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuXG4gICAgdGhpcy5fc2Nyb2xsQmFyLmhpZGUoKVxuXG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfT1BFTilcblxuICAgIHRoaXMuX2FkanVzdERpYWxvZygpXG5cbiAgICB0aGlzLl9iYWNrZHJvcC5zaG93KCgpID0+IHRoaXMuX3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpKVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzU2hvd24gfHwgdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFKVxuXG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2VcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlXG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4gdGhpcy5faGlkZU1vZGFsKCksIHRoaXMuX2VsZW1lbnQsIHRoaXMuX2lzQW5pbWF0ZWQoKSlcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9mZih3aW5kb3csIEVWRU5UX0tFWSlcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2RpYWxvZywgRVZFTlRfS0VZKVxuXG4gICAgdGhpcy5fYmFja2Ryb3AuZGlzcG9zZSgpXG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKVxuXG4gICAgc3VwZXIuZGlzcG9zZSgpXG4gIH1cblxuICBoYW5kbGVVcGRhdGUoKSB7XG4gICAgdGhpcy5fYWRqdXN0RGlhbG9nKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2luaXRpYWxpemVCYWNrRHJvcCgpIHtcbiAgICByZXR1cm4gbmV3IEJhY2tkcm9wKHtcbiAgICAgIGlzVmlzaWJsZTogQm9vbGVhbih0aGlzLl9jb25maWcuYmFja2Ryb3ApLCAvLyAnc3RhdGljJyBvcHRpb24gd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRydWUsIGFuZCBib29sZWFucyB3aWxsIGtlZXAgdGhlaXIgdmFsdWUsXG4gICAgICBpc0FuaW1hdGVkOiB0aGlzLl9pc0FuaW1hdGVkKClcbiAgICB9KVxuICB9XG5cbiAgX2luaXRpYWxpemVGb2N1c1RyYXAoKSB7XG4gICAgcmV0dXJuIG5ldyBGb2N1c1RyYXAoe1xuICAgICAgdHJhcEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9KVxuICB9XG5cbiAgX3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAvLyB0cnkgdG8gYXBwZW5kIGR5bmFtaWMgbW9kYWxcbiAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnModGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHRoaXMuX2VsZW1lbnQpXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCB0cnVlKVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2RpYWxvZycpXG4gICAgdGhpcy5fZWxlbWVudC5zY3JvbGxUb3AgPSAwXG5cbiAgICBjb25zdCBtb2RhbEJvZHkgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX01PREFMX0JPRFksIHRoaXMuX2RpYWxvZylcbiAgICBpZiAobW9kYWxCb2R5KSB7XG4gICAgICBtb2RhbEJvZHkuc2Nyb2xsVG9wID0gMFxuICAgIH1cblxuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcblxuICAgIGNvbnN0IHRyYW5zaXRpb25Db21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcuZm9jdXMpIHtcbiAgICAgICAgdGhpcy5fZm9jdXN0cmFwLmFjdGl2YXRlKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXRcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayh0cmFuc2l0aW9uQ29tcGxldGUsIHRoaXMuX2RpYWxvZywgdGhpcy5faXNBbmltYXRlZCgpKVxuICB9XG5cbiAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgIT09IEVTQ0FQRV9LRVkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgICAgdGhpcy5oaWRlKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKVxuICAgIH0pXG5cbiAgICBFdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9SRVNJWkUsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc1Nob3duICYmICF0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgdGhpcy5fYWRqdXN0RGlhbG9nKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRE9XTl9ESVNNSVNTLCBldmVudCA9PiB7XG4gICAgICAvLyBhIGJhZCB0cmljayB0byBzZWdyZWdhdGUgY2xpY2tzIHRoYXQgbWF5IHN0YXJ0IGluc2lkZSBkaWFsb2cgYnV0IGVuZCBvdXRzaWRlLCBhbmQgYXZvaWQgbGlzdGVuIHRvIHNjcm9sbGJhciBjbGlja3NcbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfQ0xJQ0tfRElTTUlTUywgZXZlbnQyID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQgIT09IGV2ZW50LnRhcmdldCB8fCB0aGlzLl9lbGVtZW50ICE9PSBldmVudDIudGFyZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmJhY2tkcm9wID09PSAnc3RhdGljJykge1xuICAgICAgICAgIHRoaXMuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCkge1xuICAgICAgICAgIHRoaXMuaGlkZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIF9oaWRlTW9kYWwoKSB7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgdHJ1ZSlcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcpXG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKVxuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlXG5cbiAgICB0aGlzLl9iYWNrZHJvcC5oaWRlKCgpID0+IHtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX09QRU4pXG4gICAgICB0aGlzLl9yZXNldEFkanVzdG1lbnRzKClcbiAgICAgIHRoaXMuX3Njcm9sbEJhci5yZXNldCgpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4pXG4gICAgfSlcbiAgfVxuXG4gIF9pc0FuaW1hdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUpXG4gIH1cblxuICBfdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpIHtcbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFX1BSRVZFTlRFRClcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGlzTW9kYWxPdmVyZmxvd2luZyA9IHRoaXMuX2VsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodFxuICAgIGNvbnN0IGluaXRpYWxPdmVyZmxvd1kgPSB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WVxuICAgIC8vIHJldHVybiBpZiB0aGUgZm9sbG93aW5nIGJhY2tncm91bmQgdHJhbnNpdGlvbiBoYXNuJ3QgeWV0IGNvbXBsZXRlZFxuICAgIGlmIChpbml0aWFsT3ZlcmZsb3dZID09PSAnaGlkZGVuJyB8fCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NUQVRJQykpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU1RBVElDKVxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU1RBVElDKVxuICAgICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gaW5pdGlhbE92ZXJmbG93WVxuICAgICAgfSwgdGhpcy5fZGlhbG9nKVxuICAgIH0sIHRoaXMuX2RpYWxvZylcblxuICAgIHRoaXMuX2VsZW1lbnQuZm9jdXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBoYW5kbGUgb3ZlcmZsb3dpbmcgbW9kYWxzXG4gICAqL1xuXG4gIF9hZGp1c3REaWFsb2coKSB7XG4gICAgY29uc3QgaXNNb2RhbE92ZXJmbG93aW5nID0gdGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0XG4gICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLl9zY3JvbGxCYXIuZ2V0V2lkdGgoKVxuICAgIGNvbnN0IGlzQm9keU92ZXJmbG93aW5nID0gc2Nyb2xsYmFyV2lkdGggPiAwXG5cbiAgICBpZiAoaXNCb2R5T3ZlcmZsb3dpbmcgJiYgIWlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSBpc1JUTCgpID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnXG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IGAke3Njcm9sbGJhcldpZHRofXB4YFxuICAgIH1cblxuICAgIGlmICghaXNCb2R5T3ZlcmZsb3dpbmcgJiYgaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IGlzUlRMKCkgPyAncGFkZGluZ1JpZ2h0JyA6ICdwYWRkaW5nTGVmdCdcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbcHJvcGVydHldID0gYCR7c2Nyb2xsYmFyV2lkdGh9cHhgXG4gICAgfVxuICB9XG5cbiAgX3Jlc2V0QWRqdXN0bWVudHMoKSB7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCA9ICcnXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnJ1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnLCByZWxhdGVkVGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKHJlbGF0ZWRUYXJnZXQpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpXG5cbiAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9TSE9XLCBzaG93RXZlbnQgPT4ge1xuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgLy8gb25seSByZWdpc3RlciBmb2N1cyByZXN0b3JlciBpZiBtb2RhbCB3aWxsIGFjdHVhbGx5IGdldCBzaG93blxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uZSh0YXJnZXQsIEVWRU5UX0hJRERFTiwgKCkgPT4ge1xuICAgICAgaWYgKGlzVmlzaWJsZSh0aGlzKSkge1xuICAgICAgICB0aGlzLmZvY3VzKClcbiAgICAgIH1cbiAgICB9KVxuICB9KVxuXG4gIC8vIGF2b2lkIGNvbmZsaWN0IHdoZW4gY2xpY2tpbmcgbW9kYWwgdG9nZ2xlciB3aGlsZSBhbm90aGVyIG9uZSBpcyBvcGVuXG4gIGNvbnN0IGFscmVhZHlPcGVuID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShPUEVOX1NFTEVDVE9SKVxuICBpZiAoYWxyZWFkeU9wZW4pIHtcbiAgICBNb2RhbC5nZXRJbnN0YW5jZShhbHJlYWR5T3BlbikuaGlkZSgpXG4gIH1cblxuICBjb25zdCBkYXRhID0gTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpXG5cbiAgZGF0YS50b2dnbGUodGhpcylcbn0pXG5cbmVuYWJsZURpc21pc3NUcmlnZ2VyKE1vZGFsKVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihNb2RhbClcblxuZXhwb3J0IGRlZmF1bHQgTW9kYWxcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgb2ZmY2FudmFzLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQgQmFja2Ryb3AgZnJvbSAnLi91dGlsL2JhY2tkcm9wLmpzJ1xuaW1wb3J0IHsgZW5hYmxlRGlzbWlzc1RyaWdnZXIgfSBmcm9tICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qcydcbmltcG9ydCBGb2N1c1RyYXAgZnJvbSAnLi91dGlsL2ZvY3VzdHJhcC5qcydcbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbixcbiAgaXNEaXNhYmxlZCxcbiAgaXNWaXNpYmxlXG59IGZyb20gJy4vdXRpbC9pbmRleC5qcydcbmltcG9ydCBTY3JvbGxCYXJIZWxwZXIgZnJvbSAnLi91dGlsL3Njcm9sbGJhci5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ29mZmNhbnZhcydcbmNvbnN0IERBVEFfS0VZID0gJ2JzLm9mZmNhbnZhcydcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuY29uc3QgRVZFTlRfTE9BRF9EQVRBX0FQSSA9IGBsb2FkJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuY29uc3QgRVNDQVBFX0tFWSA9ICdFc2NhcGUnXG5cbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XSU5HID0gJ3Nob3dpbmcnXG5jb25zdCBDTEFTU19OQU1FX0hJRElORyA9ICdoaWRpbmcnXG5jb25zdCBDTEFTU19OQU1FX0JBQ0tEUk9QID0gJ29mZmNhbnZhcy1iYWNrZHJvcCdcbmNvbnN0IE9QRU5fU0VMRUNUT1IgPSAnLm9mZmNhbnZhcy5zaG93J1xuXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREVfUFJFVkVOVEVEID0gYGhpZGVQcmV2ZW50ZWQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfUkVTSVpFID0gYHJlc2l6ZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTl9ESVNNSVNTID0gYGtleWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZfWBcblxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwib2ZmY2FudmFzXCJdJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBiYWNrZHJvcDogdHJ1ZSxcbiAga2V5Ym9hcmQ6IHRydWUsXG4gIHNjcm9sbDogZmFsc2Vcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGJhY2tkcm9wOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIGtleWJvYXJkOiAnYm9vbGVhbicsXG4gIHNjcm9sbDogJ2Jvb2xlYW4nXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIE9mZmNhbnZhcyBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2VcbiAgICB0aGlzLl9iYWNrZHJvcCA9IHRoaXMuX2luaXRpYWxpemVCYWNrRHJvcCgpXG4gICAgdGhpcy5fZm9jdXN0cmFwID0gdGhpcy5faW5pdGlhbGl6ZUZvY3VzVHJhcCgpXG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUocmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldClcbiAgfVxuXG4gIHNob3cocmVsYXRlZFRhcmdldCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XLCB7IHJlbGF0ZWRUYXJnZXQgfSlcblxuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNTaG93biA9IHRydWVcbiAgICB0aGlzLl9iYWNrZHJvcC5zaG93KClcblxuICAgIGlmICghdGhpcy5fY29uZmlnLnNjcm9sbCkge1xuICAgICAgbmV3IFNjcm9sbEJhckhlbHBlcigpLmhpZGUoKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgdHJ1ZSlcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdkaWFsb2cnKVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1dJTkcpXG5cbiAgICBjb25zdCBjb21wbGV0ZUNhbGxCYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jb25maWcuc2Nyb2xsIHx8IHRoaXMuX2NvbmZpZy5iYWNrZHJvcCkge1xuICAgICAgICB0aGlzLl9mb2N1c3RyYXAuYWN0aXZhdGUoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPV0lORylcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOLCB7IHJlbGF0ZWRUYXJnZXQgfSlcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbEJhY2ssIHRoaXMuX2VsZW1lbnQsIHRydWUpXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5faXNTaG93bikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSlcblxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKVxuICAgIHRoaXMuX2VsZW1lbnQuYmx1cigpXG4gICAgdGhpcy5faXNTaG93biA9IGZhbHNlXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfSElESU5HKVxuICAgIHRoaXMuX2JhY2tkcm9wLmhpZGUoKVxuXG4gICAgY29uc3QgY29tcGxldGVDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1csIENMQVNTX05BTUVfSElESU5HKVxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnKVxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKVxuXG4gICAgICBpZiAoIXRoaXMuX2NvbmZpZy5zY3JvbGwpIHtcbiAgICAgICAgbmV3IFNjcm9sbEJhckhlbHBlcigpLnJlc2V0KClcbiAgICAgIH1cblxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsYmFjaywgdGhpcy5fZWxlbWVudCwgdHJ1ZSlcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5fYmFja2Ryb3AuZGlzcG9zZSgpXG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKVxuICAgIHN1cGVyLmRpc3Bvc2UoKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaW5pdGlhbGl6ZUJhY2tEcm9wKCkge1xuICAgIGNvbnN0IGNsaWNrQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmJhY2tkcm9wID09PSAnc3RhdGljJykge1xuICAgICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFX1BSRVZFTlRFRClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGlkZSgpXG4gICAgfVxuXG4gICAgLy8gJ3N0YXRpYycgb3B0aW9uIHdpbGwgYmUgdHJhbnNsYXRlZCB0byB0cnVlLCBhbmQgYm9vbGVhbnMgd2lsbCBrZWVwIHRoZWlyIHZhbHVlXG4gICAgY29uc3QgaXNWaXNpYmxlID0gQm9vbGVhbih0aGlzLl9jb25maWcuYmFja2Ryb3ApXG5cbiAgICByZXR1cm4gbmV3IEJhY2tkcm9wKHtcbiAgICAgIGNsYXNzTmFtZTogQ0xBU1NfTkFNRV9CQUNLRFJPUCxcbiAgICAgIGlzVmlzaWJsZSxcbiAgICAgIGlzQW5pbWF0ZWQ6IHRydWUsXG4gICAgICByb290RWxlbWVudDogdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLFxuICAgICAgY2xpY2tDYWxsYmFjazogaXNWaXNpYmxlID8gY2xpY2tDYWxsYmFjayA6IG51bGxcbiAgICB9KVxuICB9XG5cbiAgX2luaXRpYWxpemVGb2N1c1RyYXAoKSB7XG4gICAgcmV0dXJuIG5ldyBGb2N1c1RyYXAoe1xuICAgICAgdHJhcEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9KVxuICB9XG5cbiAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgIT09IEVTQ0FQRV9LRVkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgICAgdGhpcy5oaWRlKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEKVxuICAgIH0pXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBPZmZjYW52YXMuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGFbY29uZmlnXSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5zdGFydHNXaXRoKCdfJykgfHwgY29uZmlnID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKHRoaXMpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpXG5cbiAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfSElEREVOLCAoKSA9PiB7XG4gICAgLy8gZm9jdXMgb24gdHJpZ2dlciB3aGVuIGl0IGlzIGNsb3NlZFxuICAgIGlmIChpc1Zpc2libGUodGhpcykpIHtcbiAgICAgIHRoaXMuZm9jdXMoKVxuICAgIH1cbiAgfSlcblxuICAvLyBhdm9pZCBjb25mbGljdCB3aGVuIGNsaWNraW5nIGEgdG9nZ2xlciBvZiBhbiBvZmZjYW52YXMsIHdoaWxlIGFub3RoZXIgaXMgb3BlblxuICBjb25zdCBhbHJlYWR5T3BlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoT1BFTl9TRUxFQ1RPUilcbiAgaWYgKGFscmVhZHlPcGVuICYmIGFscmVhZHlPcGVuICE9PSB0YXJnZXQpIHtcbiAgICBPZmZjYW52YXMuZ2V0SW5zdGFuY2UoYWxyZWFkeU9wZW4pLmhpZGUoKVxuICB9XG5cbiAgY29uc3QgZGF0YSA9IE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldClcbiAgZGF0YS50b2dnbGUodGhpcylcbn0pXG5cbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEksICgpID0+IHtcbiAgZm9yIChjb25zdCBzZWxlY3RvciBvZiBTZWxlY3RvckVuZ2luZS5maW5kKE9QRU5fU0VMRUNUT1IpKSB7XG4gICAgT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2Uoc2VsZWN0b3IpLnNob3coKVxuICB9XG59KVxuXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9SRVNJWkUsICgpID0+IHtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIFNlbGVjdG9yRW5naW5lLmZpbmQoJ1thcmlhLW1vZGFsXVtjbGFzcyo9c2hvd11bY2xhc3MqPW9mZmNhbnZhcy1dJykpIHtcbiAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiAhPT0gJ2ZpeGVkJykge1xuICAgICAgT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCkuaGlkZSgpXG4gICAgfVxuICB9XG59KVxuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihPZmZjYW52YXMpXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKE9mZmNhbnZhcylcblxuZXhwb3J0IGRlZmF1bHQgT2ZmY2FudmFzXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvc2FuaXRpemVyLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuLy8ganMtZG9jcy1zdGFydCBhbGxvdy1saXN0XG5jb25zdCBBUklBX0FUVFJJQlVURV9QQVRURVJOID0gL15hcmlhLVtcXHctXSokL2lcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRBbGxvd2xpc3QgPSB7XG4gIC8vIEdsb2JhbCBhdHRyaWJ1dGVzIGFsbG93ZWQgb24gYW55IHN1cHBsaWVkIGVsZW1lbnQgYmVsb3cuXG4gICcqJzogWydjbGFzcycsICdkaXInLCAnaWQnLCAnbGFuZycsICdyb2xlJywgQVJJQV9BVFRSSUJVVEVfUEFUVEVSTl0sXG4gIGE6IFsndGFyZ2V0JywgJ2hyZWYnLCAndGl0bGUnLCAncmVsJ10sXG4gIGFyZWE6IFtdLFxuICBiOiBbXSxcbiAgYnI6IFtdLFxuICBjb2w6IFtdLFxuICBjb2RlOiBbXSxcbiAgZGQ6IFtdLFxuICBkaXY6IFtdLFxuICBkbDogW10sXG4gIGR0OiBbXSxcbiAgZW06IFtdLFxuICBocjogW10sXG4gIGgxOiBbXSxcbiAgaDI6IFtdLFxuICBoMzogW10sXG4gIGg0OiBbXSxcbiAgaDU6IFtdLFxuICBoNjogW10sXG4gIGk6IFtdLFxuICBpbWc6IFsnc3JjJywgJ3NyY3NldCcsICdhbHQnLCAndGl0bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gIGxpOiBbXSxcbiAgb2w6IFtdLFxuICBwOiBbXSxcbiAgcHJlOiBbXSxcbiAgczogW10sXG4gIHNtYWxsOiBbXSxcbiAgc3BhbjogW10sXG4gIHN1YjogW10sXG4gIHN1cDogW10sXG4gIHN0cm9uZzogW10sXG4gIHU6IFtdLFxuICB1bDogW11cbn1cbi8vIGpzLWRvY3MtZW5kIGFsbG93LWxpc3RcblxuY29uc3QgdXJpQXR0cmlidXRlcyA9IG5ldyBTZXQoW1xuICAnYmFja2dyb3VuZCcsXG4gICdjaXRlJyxcbiAgJ2hyZWYnLFxuICAnaXRlbXR5cGUnLFxuICAnbG9uZ2Rlc2MnLFxuICAncG9zdGVyJyxcbiAgJ3NyYycsXG4gICd4bGluazpocmVmJ1xuXSlcblxuLyoqXG4gKiBBIHBhdHRlcm4gdGhhdCByZWNvZ25pemVzIFVSTHMgdGhhdCBhcmUgc2FmZSB3cnQuIFhTUyBpbiBVUkwgbmF2aWdhdGlvblxuICogY29udGV4dHMuXG4gKlxuICogU2hvdXQtb3V0IHRvIEFuZ3VsYXIgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iLzE1LjIuOC9wYWNrYWdlcy9jb3JlL3NyYy9zYW5pdGl6YXRpb24vdXJsX3Nhbml0aXplci50cyNMMzhcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vYmV0dGVyLXJlZ2V4XG5jb25zdCBTQUZFX1VSTF9QQVRURVJOID0gL14oPyFqYXZhc2NyaXB0OikoPzpbYS16MC05Ky4tXSs6fFteJjovPyNdKig/OlsvPyNdfCQpKS9pXG5cbmNvbnN0IGFsbG93ZWRBdHRyaWJ1dGUgPSAoYXR0cmlidXRlLCBhbGxvd2VkQXR0cmlidXRlTGlzdCkgPT4ge1xuICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKClcblxuICBpZiAoYWxsb3dlZEF0dHJpYnV0ZUxpc3QuaW5jbHVkZXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICBpZiAodXJpQXR0cmlidXRlcy5oYXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKFNBRkVfVVJMX1BBVFRFUk4udGVzdChhdHRyaWJ1dGUubm9kZVZhbHVlKSlcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgYSByZWd1bGFyIGV4cHJlc3Npb24gdmFsaWRhdGVzIHRoZSBhdHRyaWJ1dGUuXG4gIHJldHVybiBhbGxvd2VkQXR0cmlidXRlTGlzdC5maWx0ZXIoYXR0cmlidXRlUmVnZXggPT4gYXR0cmlidXRlUmVnZXggaW5zdGFuY2VvZiBSZWdFeHApXG4gICAgLnNvbWUocmVnZXggPT4gcmVnZXgudGVzdChhdHRyaWJ1dGVOYW1lKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplSHRtbCh1bnNhZmVIdG1sLCBhbGxvd0xpc3QsIHNhbml0aXplRnVuY3Rpb24pIHtcbiAgaWYgKCF1bnNhZmVIdG1sLmxlbmd0aCkge1xuICAgIHJldHVybiB1bnNhZmVIdG1sXG4gIH1cblxuICBpZiAoc2FuaXRpemVGdW5jdGlvbiAmJiB0eXBlb2Ygc2FuaXRpemVGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzYW5pdGl6ZUZ1bmN0aW9uKHVuc2FmZUh0bWwpXG4gIH1cblxuICBjb25zdCBkb21QYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpXG4gIGNvbnN0IGNyZWF0ZWREb2N1bWVudCA9IGRvbVBhcnNlci5wYXJzZUZyb21TdHJpbmcodW5zYWZlSHRtbCwgJ3RleHQvaHRtbCcpXG4gIGNvbnN0IGVsZW1lbnRzID0gW10uY29uY2F0KC4uLmNyZWF0ZWREb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSlcblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICBjb25zdCBlbGVtZW50TmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKVxuXG4gICAgaWYgKCFPYmplY3Qua2V5cyhhbGxvd0xpc3QpLmluY2x1ZGVzKGVsZW1lbnROYW1lKSkge1xuICAgICAgZWxlbWVudC5yZW1vdmUoKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVMaXN0ID0gW10uY29uY2F0KC4uLmVsZW1lbnQuYXR0cmlidXRlcylcbiAgICBjb25zdCBhbGxvd2VkQXR0cmlidXRlcyA9IFtdLmNvbmNhdChhbGxvd0xpc3RbJyonXSB8fCBbXSwgYWxsb3dMaXN0W2VsZW1lbnROYW1lXSB8fCBbXSlcblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZUxpc3QpIHtcbiAgICAgIGlmICghYWxsb3dlZEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGFsbG93ZWRBdHRyaWJ1dGVzKSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUubm9kZU5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZWREb2N1bWVudC5ib2R5LmlubmVySFRNTFxufVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL3RlbXBsYXRlLWZhY3RvcnkuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZS5qcydcbmltcG9ydCBDb25maWcgZnJvbSAnLi9jb25maWcuanMnXG5pbXBvcnQgeyBEZWZhdWx0QWxsb3dsaXN0LCBzYW5pdGl6ZUh0bWwgfSBmcm9tICcuL3Nhbml0aXplci5qcydcbmltcG9ydCB7IGV4ZWN1dGUsIGdldEVsZW1lbnQsIGlzRWxlbWVudCB9IGZyb20gJy4vaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdUZW1wbGF0ZUZhY3RvcnknXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGFsbG93TGlzdDogRGVmYXVsdEFsbG93bGlzdCxcbiAgY29udGVudDoge30sIC8vIHsgc2VsZWN0b3IgOiB0ZXh0ICwgIHNlbGVjdG9yMiA6IHRleHQyICwgfVxuICBleHRyYUNsYXNzOiAnJyxcbiAgaHRtbDogZmFsc2UsXG4gIHNhbml0aXplOiB0cnVlLFxuICBzYW5pdGl6ZUZuOiBudWxsLFxuICB0ZW1wbGF0ZTogJzxkaXY+PC9kaXY+J1xufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYWxsb3dMaXN0OiAnb2JqZWN0JyxcbiAgY29udGVudDogJ29iamVjdCcsXG4gIGV4dHJhQ2xhc3M6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gIGh0bWw6ICdib29sZWFuJyxcbiAgc2FuaXRpemU6ICdib29sZWFuJyxcbiAgc2FuaXRpemVGbjogJyhudWxsfGZ1bmN0aW9uKScsXG4gIHRlbXBsYXRlOiAnc3RyaW5nJ1xufVxuXG5jb25zdCBEZWZhdWx0Q29udGVudFR5cGUgPSB7XG4gIGVudHJ5OiAnKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9ufG51bGwpJyxcbiAgc2VsZWN0b3I6ICcoc3RyaW5nfGVsZW1lbnQpJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBUZW1wbGF0ZUZhY3RvcnkgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZ2V0Q29udGVudCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9jb25maWcuY29udGVudClcbiAgICAgIC5tYXAoY29uZmlnID0+IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKGNvbmZpZykpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gIH1cblxuICBoYXNDb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLmdldENvbnRlbnQoKS5sZW5ndGggPiAwXG4gIH1cblxuICBjaGFuZ2VDb250ZW50KGNvbnRlbnQpIHtcbiAgICB0aGlzLl9jaGVja0NvbnRlbnQoY29udGVudClcbiAgICB0aGlzLl9jb25maWcuY29udGVudCA9IHsgLi4udGhpcy5fY29uZmlnLmNvbnRlbnQsIC4uLmNvbnRlbnQgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB0b0h0bWwoKSB7XG4gICAgY29uc3QgdGVtcGxhdGVXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICB0ZW1wbGF0ZVdyYXBwZXIuaW5uZXJIVE1MID0gdGhpcy5fbWF5YmVTYW5pdGl6ZSh0aGlzLl9jb25maWcudGVtcGxhdGUpXG5cbiAgICBmb3IgKGNvbnN0IFtzZWxlY3RvciwgdGV4dF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fY29uZmlnLmNvbnRlbnQpKSB7XG4gICAgICB0aGlzLl9zZXRDb250ZW50KHRlbXBsYXRlV3JhcHBlciwgdGV4dCwgc2VsZWN0b3IpXG4gICAgfVxuXG4gICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZVdyYXBwZXIuY2hpbGRyZW5bMF1cbiAgICBjb25zdCBleHRyYUNsYXNzID0gdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odGhpcy5fY29uZmlnLmV4dHJhQ2xhc3MpXG5cbiAgICBpZiAoZXh0cmFDbGFzcykge1xuICAgICAgdGVtcGxhdGUuY2xhc3NMaXN0LmFkZCguLi5leHRyYUNsYXNzLnNwbGl0KCcgJykpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRlbXBsYXRlXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF90eXBlQ2hlY2tDb25maWcoY29uZmlnKSB7XG4gICAgc3VwZXIuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpXG4gICAgdGhpcy5fY2hlY2tDb250ZW50KGNvbmZpZy5jb250ZW50KVxuICB9XG5cbiAgX2NoZWNrQ29udGVudChhcmcpIHtcbiAgICBmb3IgKGNvbnN0IFtzZWxlY3RvciwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoYXJnKSkge1xuICAgICAgc3VwZXIuX3R5cGVDaGVja0NvbmZpZyh7IHNlbGVjdG9yLCBlbnRyeTogY29udGVudCB9LCBEZWZhdWx0Q29udGVudFR5cGUpXG4gICAgfVxuICB9XG5cbiAgX3NldENvbnRlbnQodGVtcGxhdGUsIGNvbnRlbnQsIHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdGVtcGxhdGVFbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvciwgdGVtcGxhdGUpXG5cbiAgICBpZiAoIXRlbXBsYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29udGVudCA9IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKGNvbnRlbnQpXG5cbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGlzRWxlbWVudChjb250ZW50KSkge1xuICAgICAgdGhpcy5fcHV0RWxlbWVudEluVGVtcGxhdGUoZ2V0RWxlbWVudChjb250ZW50KSwgdGVtcGxhdGVFbGVtZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5odG1sKSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5fbWF5YmVTYW5pdGl6ZShjb250ZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGVtcGxhdGVFbGVtZW50LnRleHRDb250ZW50ID0gY29udGVudFxuICB9XG5cbiAgX21heWJlU2FuaXRpemUoYXJnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5zYW5pdGl6ZSA/IHNhbml0aXplSHRtbChhcmcsIHRoaXMuX2NvbmZpZy5hbGxvd0xpc3QsIHRoaXMuX2NvbmZpZy5zYW5pdGl6ZUZuKSA6IGFyZ1xuICB9XG5cbiAgX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBleGVjdXRlKGFyZywgW3RoaXNdKVxuICB9XG5cbiAgX3B1dEVsZW1lbnRJblRlbXBsYXRlKGVsZW1lbnQsIHRlbXBsYXRlRWxlbWVudCkge1xuICAgIGlmICh0aGlzLl9jb25maWcuaHRtbCkge1xuICAgICAgdGVtcGxhdGVFbGVtZW50LmlubmVySFRNTCA9ICcnXG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQuYXBwZW5kKGVsZW1lbnQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0ZW1wbGF0ZUVsZW1lbnQudGV4dENvbnRlbnQgPSBlbGVtZW50LnRleHRDb250ZW50XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGVtcGxhdGVGYWN0b3J5XG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHRvb2x0aXAuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgKiBhcyBQb3BwZXIgZnJvbSAnQHBvcHBlcmpzL2NvcmUnXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50LmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4vZG9tL21hbmlwdWxhdG9yLmpzJ1xuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLCBleGVjdXRlLCBmaW5kU2hhZG93Um9vdCwgZ2V0RWxlbWVudCwgZ2V0VUlELCBpc1JUTCwgbm9vcFxufSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5pbXBvcnQgeyBEZWZhdWx0QWxsb3dsaXN0IH0gZnJvbSAnLi91dGlsL3Nhbml0aXplci5qcydcbmltcG9ydCBUZW1wbGF0ZUZhY3RvcnkgZnJvbSAnLi91dGlsL3RlbXBsYXRlLWZhY3RvcnkuanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICd0b29sdGlwJ1xuY29uc3QgRElTQUxMT1dFRF9BVFRSSUJVVEVTID0gbmV3IFNldChbJ3Nhbml0aXplJywgJ2FsbG93TGlzdCcsICdzYW5pdGl6ZUZuJ10pXG5cbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9NT0RBTCA9ICdtb2RhbCdcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuXG5jb25zdCBTRUxFQ1RPUl9UT09MVElQX0lOTkVSID0gJy50b29sdGlwLWlubmVyJ1xuY29uc3QgU0VMRUNUT1JfTU9EQUwgPSBgLiR7Q0xBU1NfTkFNRV9NT0RBTH1gXG5cbmNvbnN0IEVWRU5UX01PREFMX0hJREUgPSAnaGlkZS5icy5tb2RhbCdcblxuY29uc3QgVFJJR0dFUl9IT1ZFUiA9ICdob3ZlcidcbmNvbnN0IFRSSUdHRVJfRk9DVVMgPSAnZm9jdXMnXG5jb25zdCBUUklHR0VSX0NMSUNLID0gJ2NsaWNrJ1xuY29uc3QgVFJJR0dFUl9NQU5VQUwgPSAnbWFudWFsJ1xuXG5jb25zdCBFVkVOVF9ISURFID0gJ2hpZGUnXG5jb25zdCBFVkVOVF9ISURERU4gPSAnaGlkZGVuJ1xuY29uc3QgRVZFTlRfU0hPVyA9ICdzaG93J1xuY29uc3QgRVZFTlRfU0hPV04gPSAnc2hvd24nXG5jb25zdCBFVkVOVF9JTlNFUlRFRCA9ICdpbnNlcnRlZCdcbmNvbnN0IEVWRU5UX0NMSUNLID0gJ2NsaWNrJ1xuY29uc3QgRVZFTlRfRk9DVVNJTiA9ICdmb2N1c2luJ1xuY29uc3QgRVZFTlRfRk9DVVNPVVQgPSAnZm9jdXNvdXQnXG5jb25zdCBFVkVOVF9NT1VTRUVOVEVSID0gJ21vdXNlZW50ZXInXG5jb25zdCBFVkVOVF9NT1VTRUxFQVZFID0gJ21vdXNlbGVhdmUnXG5cbmNvbnN0IEF0dGFjaG1lbnRNYXAgPSB7XG4gIEFVVE86ICdhdXRvJyxcbiAgVE9QOiAndG9wJyxcbiAgUklHSFQ6IGlzUlRMKCkgPyAnbGVmdCcgOiAncmlnaHQnLFxuICBCT1RUT006ICdib3R0b20nLFxuICBMRUZUOiBpc1JUTCgpID8gJ3JpZ2h0JyA6ICdsZWZ0J1xufVxuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBhbGxvd0xpc3Q6IERlZmF1bHRBbGxvd2xpc3QsXG4gIGFuaW1hdGlvbjogdHJ1ZSxcbiAgYm91bmRhcnk6ICdjbGlwcGluZ1BhcmVudHMnLFxuICBjb250YWluZXI6IGZhbHNlLFxuICBjdXN0b21DbGFzczogJycsXG4gIGRlbGF5OiAwLFxuICBmYWxsYmFja1BsYWNlbWVudHM6IFsndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10sXG4gIGh0bWw6IGZhbHNlLFxuICBvZmZzZXQ6IFswLCA2XSxcbiAgcGxhY2VtZW50OiAndG9wJyxcbiAgcG9wcGVyQ29uZmlnOiBudWxsLFxuICBzYW5pdGl6ZTogdHJ1ZSxcbiAgc2FuaXRpemVGbjogbnVsbCxcbiAgc2VsZWN0b3I6IGZhbHNlLFxuICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJ0b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIj4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwidG9vbHRpcC1hcnJvd1wiPjwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ0b29sdGlwLWlubmVyXCI+PC9kaXY+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyxcbiAgdGl0bGU6ICcnLFxuICB0cmlnZ2VyOiAnaG92ZXIgZm9jdXMnXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBhbGxvd0xpc3Q6ICdvYmplY3QnLFxuICBhbmltYXRpb246ICdib29sZWFuJyxcbiAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgY29udGFpbmVyOiAnKHN0cmluZ3xlbGVtZW50fGJvb2xlYW4pJyxcbiAgY3VzdG9tQ2xhc3M6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gIGRlbGF5OiAnKG51bWJlcnxvYmplY3QpJyxcbiAgZmFsbGJhY2tQbGFjZW1lbnRzOiAnYXJyYXknLFxuICBodG1sOiAnYm9vbGVhbicsXG4gIG9mZnNldDogJyhhcnJheXxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgcGxhY2VtZW50OiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICBwb3BwZXJDb25maWc6ICcobnVsbHxvYmplY3R8ZnVuY3Rpb24pJyxcbiAgc2FuaXRpemU6ICdib29sZWFuJyxcbiAgc2FuaXRpemVGbjogJyhudWxsfGZ1bmN0aW9uKScsXG4gIHNlbGVjdG9yOiAnKHN0cmluZ3xib29sZWFuKScsXG4gIHRlbXBsYXRlOiAnc3RyaW5nJyxcbiAgdGl0bGU6ICcoc3RyaW5nfGVsZW1lbnR8ZnVuY3Rpb24pJyxcbiAgdHJpZ2dlcjogJ3N0cmluZydcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVG9vbHRpcCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBpZiAodHlwZW9mIFBvcHBlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Jvb3RzdHJhcFxcJ3MgdG9vbHRpcHMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZyknKVxuICAgIH1cblxuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZylcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlXG4gICAgdGhpcy5fdGltZW91dCA9IDBcbiAgICB0aGlzLl9pc0hvdmVyZWQgPSBudWxsXG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlciA9IHt9XG4gICAgdGhpcy5fcG9wcGVyID0gbnVsbFxuICAgIHRoaXMuX3RlbXBsYXRlRmFjdG9yeSA9IG51bGxcbiAgICB0aGlzLl9uZXdDb250ZW50ID0gbnVsbFxuXG4gICAgLy8gUHJvdGVjdGVkXG4gICAgdGhpcy50aXAgPSBudWxsXG5cbiAgICB0aGlzLl9zZXRMaXN0ZW5lcnMoKVxuXG4gICAgaWYgKCF0aGlzLl9jb25maWcuc2VsZWN0b3IpIHtcbiAgICAgIHRoaXMuX2ZpeFRpdGxlKClcbiAgICB9XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlXG4gIH1cblxuICBkaXNhYmxlKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9IGZhbHNlXG4gIH1cblxuICB0b2dnbGVFbmFibGVkKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9ICF0aGlzLl9pc0VuYWJsZWRcbiAgfVxuXG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlci5jbGljayA9ICF0aGlzLl9hY3RpdmVUcmlnZ2VyLmNsaWNrXG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgdGhpcy5fbGVhdmUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZW50ZXIoKVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dClcblxuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX01PREFMKSwgRVZFTlRfTU9EQUxfSElERSwgdGhpcy5faGlkZU1vZGFsSGFuZGxlcilcblxuICAgIGlmICh0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy1vcmlnaW5hbC10aXRsZScpKSB7XG4gICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCB0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy1vcmlnaW5hbC10aXRsZScpKVxuICAgIH1cblxuICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKVxuICAgIHN1cGVyLmRpc3Bvc2UoKVxuICB9XG5cbiAgc2hvdygpIHtcbiAgICBpZiAodGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHVzZSBzaG93IG9uIHZpc2libGUgZWxlbWVudHMnKVxuICAgIH1cblxuICAgIGlmICghKHRoaXMuX2lzV2l0aENvbnRlbnQoKSAmJiB0aGlzLl9pc0VuYWJsZWQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9TSE9XKSlcbiAgICBjb25zdCBzaGFkb3dSb290ID0gZmluZFNoYWRvd1Jvb3QodGhpcy5fZWxlbWVudClcbiAgICBjb25zdCBpc0luVGhlRG9tID0gKHNoYWRvd1Jvb3QgfHwgdGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuY29udGFpbnModGhpcy5fZWxlbWVudClcblxuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCB8fCAhaXNJblRoZURvbSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVE9ETzogdjYgcmVtb3ZlIHRoaXMgb3IgbWFrZSBpdCBvcHRpb25hbFxuICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKVxuXG4gICAgY29uc3QgdGlwID0gdGhpcy5fZ2V0VGlwRWxlbWVudCgpXG5cbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIHRpcC5nZXRBdHRyaWJ1dGUoJ2lkJykpXG5cbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gdGhpcy5fY29uZmlnXG5cbiAgICBpZiAoIXRoaXMuX2VsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnModGhpcy50aXApKSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kKHRpcClcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0lOU0VSVEVEKSlcbiAgICB9XG5cbiAgICB0aGlzLl9wb3BwZXIgPSB0aGlzLl9jcmVhdGVQb3BwZXIodGlwKVxuXG4gICAgdGlwLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbihlbGVtZW50LCAnbW91c2VvdmVyJywgbm9vcClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX1NIT1dOKSlcblxuICAgICAgaWYgKHRoaXMuX2lzSG92ZXJlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fbGVhdmUoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9pc0hvdmVyZWQgPSBmYWxzZVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMudGlwLCB0aGlzLl9pc0FuaW1hdGVkKCkpXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9ISURFKSlcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHRpcCA9IHRoaXMuX2dldFRpcEVsZW1lbnQoKVxuICAgIHRpcC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSByZW1vdmUgdGhlIGV4dHJhXG4gICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0NMSUNLXSA9IGZhbHNlXG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0ZPQ1VTXSA9IGZhbHNlXG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0hPVkVSXSA9IGZhbHNlXG4gICAgdGhpcy5faXNIb3ZlcmVkID0gbnVsbCAvLyBpdCBpcyBhIHRyaWNrIHRvIHN1cHBvcnQgbWFudWFsIHRyaWdnZXJpbmdcblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5JylcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0hJRERFTikpXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy50aXAsIHRoaXMuX2lzQW5pbWF0ZWQoKSlcbiAgfVxuXG4gIHVwZGF0ZSgpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIudXBkYXRlKClcbiAgICB9XG4gIH1cblxuICAvLyBQcm90ZWN0ZWRcbiAgX2lzV2l0aENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fZ2V0VGl0bGUoKSlcbiAgfVxuXG4gIF9nZXRUaXBFbGVtZW50KCkge1xuICAgIGlmICghdGhpcy50aXApIHtcbiAgICAgIHRoaXMudGlwID0gdGhpcy5fY3JlYXRlVGlwRWxlbWVudCh0aGlzLl9uZXdDb250ZW50IHx8IHRoaXMuX2dldENvbnRlbnRGb3JUZW1wbGF0ZSgpKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRpcFxuICB9XG5cbiAgX2NyZWF0ZVRpcEVsZW1lbnQoY29udGVudCkge1xuICAgIGNvbnN0IHRpcCA9IHRoaXMuX2dldFRlbXBsYXRlRmFjdG9yeShjb250ZW50KS50b0h0bWwoKVxuXG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgY2hlY2sgaW4gdjZcbiAgICBpZiAoIXRpcCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB0aXAuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0ZBREUsIENMQVNTX05BTUVfU0hPVylcbiAgICAvLyBUT0RPOiB2NiB0aGUgZm9sbG93aW5nIGNhbiBiZSBhY2hpZXZlZCB3aXRoIENTUyBvbmx5XG4gICAgdGlwLmNsYXNzTGlzdC5hZGQoYGJzLSR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FfS1hdXRvYClcblxuICAgIGNvbnN0IHRpcElkID0gZ2V0VUlEKHRoaXMuY29uc3RydWN0b3IuTkFNRSkudG9TdHJpbmcoKVxuXG4gICAgdGlwLnNldEF0dHJpYnV0ZSgnaWQnLCB0aXBJZClcblxuICAgIGlmICh0aGlzLl9pc0FuaW1hdGVkKCkpIHtcbiAgICAgIHRpcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGlwXG4gIH1cblxuICBzZXRDb250ZW50KGNvbnRlbnQpIHtcbiAgICB0aGlzLl9uZXdDb250ZW50ID0gY29udGVudFxuICAgIGlmICh0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKVxuICAgICAgdGhpcy5zaG93KClcbiAgICB9XG4gIH1cblxuICBfZ2V0VGVtcGxhdGVGYWN0b3J5KGNvbnRlbnQpIHtcbiAgICBpZiAodGhpcy5fdGVtcGxhdGVGYWN0b3J5KSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZUZhY3RvcnkuY2hhbmdlQ29udGVudChjb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZUZhY3RvcnkgPSBuZXcgVGVtcGxhdGVGYWN0b3J5KHtcbiAgICAgICAgLi4udGhpcy5fY29uZmlnLFxuICAgICAgICAvLyB0aGUgYGNvbnRlbnRgIHZhciBoYXMgdG8gYmUgYWZ0ZXIgYHRoaXMuX2NvbmZpZ2BcbiAgICAgICAgLy8gdG8gb3ZlcnJpZGUgY29uZmlnLmNvbnRlbnQgaW4gY2FzZSBvZiBwb3BvdmVyXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGV4dHJhQ2xhc3M6IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5jdXN0b21DbGFzcylcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlRmFjdG9yeVxuICB9XG5cbiAgX2dldENvbnRlbnRGb3JUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW1NFTEVDVE9SX1RPT0xUSVBfSU5ORVJdOiB0aGlzLl9nZXRUaXRsZSgpXG4gICAgfVxuICB9XG5cbiAgX2dldFRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcudGl0bGUpIHx8IHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJylcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudCkge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLmdldE9yQ3JlYXRlSW5zdGFuY2UoZXZlbnQuZGVsZWdhdGVUYXJnZXQsIHRoaXMuX2dldERlbGVnYXRlQ29uZmlnKCkpXG4gIH1cblxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmFuaW1hdGlvbiB8fCAodGhpcy50aXAgJiYgdGhpcy50aXAuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSkpXG4gIH1cblxuICBfaXNTaG93bigpIHtcbiAgICByZXR1cm4gdGhpcy50aXAgJiYgdGhpcy50aXAuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVylcbiAgfVxuXG4gIF9jcmVhdGVQb3BwZXIodGlwKSB7XG4gICAgY29uc3QgcGxhY2VtZW50ID0gZXhlY3V0ZSh0aGlzLl9jb25maWcucGxhY2VtZW50LCBbdGhpcywgdGlwLCB0aGlzLl9lbGVtZW50XSlcbiAgICBjb25zdCBhdHRhY2htZW50ID0gQXR0YWNobWVudE1hcFtwbGFjZW1lbnQudG9VcHBlckNhc2UoKV1cbiAgICByZXR1cm4gUG9wcGVyLmNyZWF0ZVBvcHBlcih0aGlzLl9lbGVtZW50LCB0aXAsIHRoaXMuX2dldFBvcHBlckNvbmZpZyhhdHRhY2htZW50KSlcbiAgfVxuXG4gIF9nZXRPZmZzZXQoKSB7XG4gICAgY29uc3QgeyBvZmZzZXQgfSA9IHRoaXMuX2NvbmZpZ1xuXG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gb2Zmc2V0LnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcG9wcGVyRGF0YSA9PiBvZmZzZXQocG9wcGVyRGF0YSwgdGhpcy5fZWxlbWVudClcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0XG4gIH1cblxuICBfcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGUoYXJnLCBbdGhpcy5fZWxlbWVudF0pXG4gIH1cblxuICBfZ2V0UG9wcGVyQ29uZmlnKGF0dGFjaG1lbnQpIHtcbiAgICBjb25zdCBkZWZhdWx0QnNQb3BwZXJDb25maWcgPSB7XG4gICAgICBwbGFjZW1lbnQ6IGF0dGFjaG1lbnQsXG4gICAgICBtb2RpZmllcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdmbGlwJyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBmYWxsYmFja1BsYWNlbWVudHM6IHRoaXMuX2NvbmZpZy5mYWxsYmFja1BsYWNlbWVudHNcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgYm91bmRhcnk6IHRoaXMuX2NvbmZpZy5ib3VuZGFyeVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdhcnJvdycsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgZWxlbWVudDogYC4ke3RoaXMuY29uc3RydWN0b3IuTkFNRX0tYXJyb3dgXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3ByZVNldFBsYWNlbWVudCcsXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBwaGFzZTogJ2JlZm9yZU1haW4nLFxuICAgICAgICAgIGZuOiBkYXRhID0+IHtcbiAgICAgICAgICAgIC8vIFByZS1zZXQgUG9wcGVyJ3MgcGxhY2VtZW50IGF0dHJpYnV0ZSBpbiBvcmRlciB0byByZWFkIHRoZSBhcnJvdyBzaXplcyBwcm9wZXJseS5cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgUG9wcGVyIG1peGVzIHVwIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRpbWVuc2lvbnMgc2luY2UgdGhlIGluaXRpYWwgYXJyb3cgc3R5bGUgaXMgZm9yIHRvcCBwbGFjZW1lbnRcbiAgICAgICAgICAgIHRoaXMuX2dldFRpcEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCcsIGRhdGEuc3RhdGUucGxhY2VtZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZhdWx0QnNQb3BwZXJDb25maWcsXG4gICAgICAuLi5leGVjdXRlKHRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWcsIFtkZWZhdWx0QnNQb3BwZXJDb25maWddKVxuICAgIH1cbiAgfVxuXG4gIF9zZXRMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSB0aGlzLl9jb25maWcudHJpZ2dlci5zcGxpdCgnICcpXG5cbiAgICBmb3IgKGNvbnN0IHRyaWdnZXIgb2YgdHJpZ2dlcnMpIHtcbiAgICAgIGlmICh0cmlnZ2VyID09PSAnY2xpY2snKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9DTElDSyksIHRoaXMuX2NvbmZpZy5zZWxlY3RvciwgZXZlbnQgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpXG4gICAgICAgICAgY29udGV4dC50b2dnbGUoKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyICE9PSBUUklHR0VSX01BTlVBTCkge1xuICAgICAgICBjb25zdCBldmVudEluID0gdHJpZ2dlciA9PT0gVFJJR0dFUl9IT1ZFUiA/XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfTU9VU0VFTlRFUikgOlxuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0ZPQ1VTSU4pXG4gICAgICAgIGNvbnN0IGV2ZW50T3V0ID0gdHJpZ2dlciA9PT0gVFJJR0dFUl9IT1ZFUiA/XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfTU9VU0VMRUFWRSkgOlxuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0ZPQ1VTT1VUKVxuXG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudEluLCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KVxuICAgICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXJbZXZlbnQudHlwZSA9PT0gJ2ZvY3VzaW4nID8gVFJJR0dFUl9GT0NVUyA6IFRSSUdHRVJfSE9WRVJdID0gdHJ1ZVxuICAgICAgICAgIGNvbnRleHQuX2VudGVyKClcbiAgICAgICAgfSlcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIGV2ZW50T3V0LCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KVxuICAgICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXJbZXZlbnQudHlwZSA9PT0gJ2ZvY3Vzb3V0JyA/IFRSSUdHRVJfRk9DVVMgOiBUUklHR0VSX0hPVkVSXSA9XG4gICAgICAgICAgICBjb250ZXh0Ll9lbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpXG5cbiAgICAgICAgICBjb250ZXh0Ll9sZWF2ZSgpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faGlkZU1vZGFsSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgIHRoaXMuaGlkZSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9NT0RBTCksIEVWRU5UX01PREFMX0hJREUsIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpXG4gIH1cblxuICBfZml4VGl0bGUoKSB7XG4gICAgY29uc3QgdGl0bGUgPSB0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgndGl0bGUnKVxuXG4gICAgaWYgKCF0aXRsZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpICYmICF0aGlzLl9lbGVtZW50LnRleHRDb250ZW50LnRyaW0oKSkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0aXRsZSlcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1icy1vcmlnaW5hbC10aXRsZScsIHRpdGxlKSAvLyBETyBOT1QgVVNFIElULiBJcyBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0aXRsZScpXG4gIH1cblxuICBfZW50ZXIoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSB8fCB0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgIHRoaXMuX2lzSG92ZXJlZCA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IHRydWVcblxuICAgIHRoaXMuX3NldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2lzSG92ZXJlZCkge1xuICAgICAgICB0aGlzLnNob3coKVxuICAgICAgfVxuICAgIH0sIHRoaXMuX2NvbmZpZy5kZWxheS5zaG93KVxuICB9XG5cbiAgX2xlYXZlKCkge1xuICAgIGlmICh0aGlzLl9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IGZhbHNlXG5cbiAgICB0aGlzLl9zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5faXNIb3ZlcmVkKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpXG4gICAgICB9XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5LmhpZGUpXG4gIH1cblxuICBfc2V0VGltZW91dChoYW5kbGVyLCB0aW1lb3V0KSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpXG4gICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoaGFuZGxlciwgdGltZW91dClcbiAgfVxuXG4gIF9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX2FjdGl2ZVRyaWdnZXIpLmluY2x1ZGVzKHRydWUpXG4gIH1cblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbnN0IGRhdGFBdHRyaWJ1dGVzID0gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZXModGhpcy5fZWxlbWVudClcblxuICAgIGZvciAoY29uc3QgZGF0YUF0dHJpYnV0ZSBvZiBPYmplY3Qua2V5cyhkYXRhQXR0cmlidXRlcykpIHtcbiAgICAgIGlmIChESVNBTExPV0VEX0FUVFJJQlVURVMuaGFzKGRhdGFBdHRyaWJ1dGUpKSB7XG4gICAgICAgIGRlbGV0ZSBkYXRhQXR0cmlidXRlc1tkYXRhQXR0cmlidXRlXVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbmZpZyA9IHtcbiAgICAgIC4uLmRhdGFBdHRyaWJ1dGVzLFxuICAgICAgLi4uKHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZyA/IGNvbmZpZyA6IHt9KVxuICAgIH1cbiAgICBjb25maWcgPSB0aGlzLl9tZXJnZUNvbmZpZ09iaihjb25maWcpXG4gICAgY29uZmlnID0gdGhpcy5fY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpXG4gICAgdGhpcy5fdHlwZUNoZWNrQ29uZmlnKGNvbmZpZylcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICBjb25maWcuY29udGFpbmVyID0gY29uZmlnLmNvbnRhaW5lciA9PT0gZmFsc2UgPyBkb2N1bWVudC5ib2R5IDogZ2V0RWxlbWVudChjb25maWcuY29udGFpbmVyKVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcuZGVsYXkgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25maWcuZGVsYXkgPSB7XG4gICAgICAgIHNob3c6IGNvbmZpZy5kZWxheSxcbiAgICAgICAgaGlkZTogY29uZmlnLmRlbGF5XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcudGl0bGUgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25maWcudGl0bGUgPSBjb25maWcudGl0bGUudG9TdHJpbmcoKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29uZmlnLmNvbnRlbnQgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25maWcuY29udGVudCA9IGNvbmZpZy5jb250ZW50LnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfZ2V0RGVsZWdhdGVDb25maWcoKSB7XG4gICAgY29uc3QgY29uZmlnID0ge31cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZykpIHtcbiAgICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRba2V5XSAhPT0gdmFsdWUpIHtcbiAgICAgICAgY29uZmlnW2tleV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbmZpZy5zZWxlY3RvciA9IGZhbHNlXG4gICAgY29uZmlnLnRyaWdnZXIgPSAnbWFudWFsJ1xuXG4gICAgLy8gSW4gdGhlIGZ1dHVyZSBjYW4gYmUgcmVwbGFjZWQgd2l0aDpcbiAgICAvLyBjb25zdCBrZXlzV2l0aERpZmZlcmVudFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZykuZmlsdGVyKGVudHJ5ID0+IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtlbnRyeVswXV0gIT09IHRoaXMuX2NvbmZpZ1tlbnRyeVswXV0pXG4gICAgLy8gYE9iamVjdC5mcm9tRW50cmllcyhrZXlzV2l0aERpZmZlcmVudFZhbHVlcylgXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2Rpc3Bvc2VQb3BwZXIoKSB7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKVxuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbFxuICAgIH1cblxuICAgIGlmICh0aGlzLnRpcCkge1xuICAgICAgdGhpcy50aXAucmVtb3ZlKClcbiAgICAgIHRoaXMudGlwID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRvb2x0aXAuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRvb2x0aXApXG5cbmV4cG9ydCBkZWZhdWx0IFRvb2x0aXBcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgcG9wb3Zlci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBUb29sdGlwIGZyb20gJy4vdG9vbHRpcC5qcydcbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiB9IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ3BvcG92ZXInXG5cbmNvbnN0IFNFTEVDVE9SX1RJVExFID0gJy5wb3BvdmVyLWhlYWRlcidcbmNvbnN0IFNFTEVDVE9SX0NPTlRFTlQgPSAnLnBvcG92ZXItYm9keSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgLi4uVG9vbHRpcC5EZWZhdWx0LFxuICBjb250ZW50OiAnJyxcbiAgb2Zmc2V0OiBbMCwgOF0sXG4gIHBsYWNlbWVudDogJ3JpZ2h0JyxcbiAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwicG9wb3ZlclwiIHJvbGU9XCJ0b29sdGlwXCI+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwb3BvdmVyLWFycm93XCI+PC9kaXY+JyArXG4gICAgJzxoMyBjbGFzcz1cInBvcG92ZXItaGVhZGVyXCI+PC9oMz4nICtcbiAgICAnPGRpdiBjbGFzcz1cInBvcG92ZXItYm9keVwiPjwvZGl2PicgK1xuICAgICc8L2Rpdj4nLFxuICB0cmlnZ2VyOiAnY2xpY2snXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICAuLi5Ub29sdGlwLkRlZmF1bHRUeXBlLFxuICBjb250ZW50OiAnKG51bGx8c3RyaW5nfGVsZW1lbnR8ZnVuY3Rpb24pJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBQb3BvdmVyIGV4dGVuZHMgVG9vbHRpcCB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBPdmVycmlkZXNcbiAgX2lzV2l0aENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldFRpdGxlKCkgfHwgdGhpcy5fZ2V0Q29udGVudCgpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTRUxFQ1RPUl9USVRMRV06IHRoaXMuX2dldFRpdGxlKCksXG4gICAgICBbU0VMRUNUT1JfQ09OVEVOVF06IHRoaXMuX2dldENvbnRlbnQoKVxuICAgIH1cbiAgfVxuXG4gIF9nZXRDb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcuY29udGVudClcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFBvcG92ZXIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFBvcG92ZXIpXG5cbmV4cG9ydCBkZWZhdWx0IFBvcG92ZXJcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgc2Nyb2xsc3B5LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sIGdldEVsZW1lbnQsIGlzRGlzYWJsZWQsIGlzVmlzaWJsZVxufSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdzY3JvbGxzcHknXG5jb25zdCBEQVRBX0tFWSA9ICdicy5zY3JvbGxzcHknXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgRVZFTlRfQUNUSVZBVEUgPSBgYWN0aXZhdGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDSyA9IGBjbGljayR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcblxuY29uc3QgQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNID0gJ2Ryb3Bkb3duLWl0ZW0nXG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSA9ICdhY3RpdmUnXG5cbmNvbnN0IFNFTEVDVE9SX0RBVEFfU1BZID0gJ1tkYXRhLWJzLXNweT1cInNjcm9sbFwiXSdcbmNvbnN0IFNFTEVDVE9SX1RBUkdFVF9MSU5LUyA9ICdbaHJlZl0nXG5jb25zdCBTRUxFQ1RPUl9OQVZfTElTVF9HUk9VUCA9ICcubmF2LCAubGlzdC1ncm91cCdcbmNvbnN0IFNFTEVDVE9SX05BVl9MSU5LUyA9ICcubmF2LWxpbmsnXG5jb25zdCBTRUxFQ1RPUl9OQVZfSVRFTVMgPSAnLm5hdi1pdGVtJ1xuY29uc3QgU0VMRUNUT1JfTElTVF9JVEVNUyA9ICcubGlzdC1ncm91cC1pdGVtJ1xuY29uc3QgU0VMRUNUT1JfTElOS19JVEVNUyA9IGAke1NFTEVDVE9SX05BVl9MSU5LU30sICR7U0VMRUNUT1JfTkFWX0lURU1TfSA+ICR7U0VMRUNUT1JfTkFWX0xJTktTfSwgJHtTRUxFQ1RPUl9MSVNUX0lURU1TfWBcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOID0gJy5kcm9wZG93bidcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9ICcuZHJvcGRvd24tdG9nZ2xlJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBvZmZzZXQ6IG51bGwsIC8vIFRPRE86IHY2IEBkZXByZWNhdGVkLCBrZWVwIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zXG4gIHJvb3RNYXJnaW46ICcwcHggMHB4IC0yNSUnLFxuICBzbW9vdGhTY3JvbGw6IGZhbHNlLFxuICB0YXJnZXQ6IG51bGwsXG4gIHRocmVzaG9sZDogWzAuMSwgMC41LCAxXVxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgb2Zmc2V0OiAnKG51bWJlcnxudWxsKScsIC8vIFRPRE8gdjYgQGRlcHJlY2F0ZWQsIGtlZXAgaXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnNcbiAgcm9vdE1hcmdpbjogJ3N0cmluZycsXG4gIHNtb290aFNjcm9sbDogJ2Jvb2xlYW4nLFxuICB0YXJnZXQ6ICdlbGVtZW50JyxcbiAgdGhyZXNob2xkOiAnYXJyYXknXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFNjcm9sbFNweSBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICAvLyB0aGlzLl9lbGVtZW50IGlzIHRoZSBvYnNlcnZhYmxlc0NvbnRhaW5lciBhbmQgY29uZmlnLnRhcmdldCB0aGUgbWVudSBsaW5rcyB3cmFwcGVyXG4gICAgdGhpcy5fdGFyZ2V0TGlua3MgPSBuZXcgTWFwKClcbiAgICB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMgPSBuZXcgTWFwKClcbiAgICB0aGlzLl9yb290RWxlbWVudCA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5fZWxlbWVudCkub3ZlcmZsb3dZID09PSAndmlzaWJsZScgPyBudWxsIDogdGhpcy5fZWxlbWVudFxuICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IG51bGxcbiAgICB0aGlzLl9vYnNlcnZlciA9IG51bGxcbiAgICB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEgPSB7XG4gICAgICB2aXNpYmxlRW50cnlUb3A6IDAsXG4gICAgICBwYXJlbnRTY3JvbGxUb3A6IDBcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoKCkgLy8gaW5pdGlhbGl6ZVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICByZWZyZXNoKCkge1xuICAgIHRoaXMuX2luaXRpYWxpemVUYXJnZXRzQW5kT2JzZXJ2YWJsZXMoKVxuICAgIHRoaXMuX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKClcblxuICAgIGlmICh0aGlzLl9vYnNlcnZlcikge1xuICAgICAgdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29ic2VydmVyID0gdGhpcy5fZ2V0TmV3T2JzZXJ2ZXIoKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUoc2VjdGlvbilcbiAgICB9XG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICAgIHN1cGVyLmRpc3Bvc2UoKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICAvLyBUT0RPOiBvbiB2NiB0YXJnZXQgc2hvdWxkIGJlIGdpdmVuIGV4cGxpY2l0bHkgJiByZW1vdmUgdGhlIHt0YXJnZXQ6ICdzcy10YXJnZXQnfSBjYXNlXG4gICAgY29uZmlnLnRhcmdldCA9IGdldEVsZW1lbnQoY29uZmlnLnRhcmdldCkgfHwgZG9jdW1lbnQuYm9keVxuXG4gICAgLy8gVE9ETzogdjYgT25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gVXNlIHJvb3RNYXJnaW4gb25seVxuICAgIGNvbmZpZy5yb290TWFyZ2luID0gY29uZmlnLm9mZnNldCA/IGAke2NvbmZpZy5vZmZzZXR9cHggMHB4IC0zMCVgIDogY29uZmlnLnJvb3RNYXJnaW5cblxuICAgIGlmICh0eXBlb2YgY29uZmlnLnRocmVzaG9sZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZy50aHJlc2hvbGQgPSBjb25maWcudGhyZXNob2xkLnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUZsb2F0KHZhbHVlKSlcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfbWF5YmVFbmFibGVTbW9vdGhTY3JvbGwoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuc21vb3RoU2Nyb2xsKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyB1bnJlZ2lzdGVyIGFueSBwcmV2aW91cyBsaXN0ZW5lcnNcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2NvbmZpZy50YXJnZXQsIEVWRU5UX0NMSUNLKVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2NvbmZpZy50YXJnZXQsIEVWRU5UX0NMSUNLLCBTRUxFQ1RPUl9UQVJHRVRfTElOS1MsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IG9ic2VydmFibGVTZWN0aW9uID0gdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zLmdldChldmVudC50YXJnZXQuaGFzaClcbiAgICAgIGlmIChvYnNlcnZhYmxlU2VjdGlvbikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9yb290RWxlbWVudCB8fCB3aW5kb3dcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gb2JzZXJ2YWJsZVNlY3Rpb24ub2Zmc2V0VG9wIC0gdGhpcy5fZWxlbWVudC5vZmZzZXRUb3BcbiAgICAgICAgaWYgKHJvb3Quc2Nyb2xsVG8pIHtcbiAgICAgICAgICByb290LnNjcm9sbFRvKHsgdG9wOiBoZWlnaHQsIGJlaGF2aW9yOiAnc21vb3RoJyB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hyb21lIDYwIGRvZXNuJ3Qgc3VwcG9ydCBgc2Nyb2xsVG9gXG4gICAgICAgIHJvb3Quc2Nyb2xsVG9wID0gaGVpZ2h0XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIF9nZXROZXdPYnNlcnZlcigpIHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgcm9vdDogdGhpcy5fcm9vdEVsZW1lbnQsXG4gICAgICB0aHJlc2hvbGQ6IHRoaXMuX2NvbmZpZy50aHJlc2hvbGQsXG4gICAgICByb290TWFyZ2luOiB0aGlzLl9jb25maWcucm9vdE1hcmdpblxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZW50cmllcyA9PiB0aGlzLl9vYnNlcnZlckNhbGxiYWNrKGVudHJpZXMpLCBvcHRpb25zKVxuICB9XG5cbiAgLy8gVGhlIGxvZ2ljIG9mIHNlbGVjdGlvblxuICBfb2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzKSB7XG4gICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IGVudHJ5ID0+IHRoaXMuX3RhcmdldExpbmtzLmdldChgIyR7ZW50cnkudGFyZ2V0LmlkfWApXG4gICAgY29uc3QgYWN0aXZhdGUgPSBlbnRyeSA9PiB7XG4gICAgICB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEudmlzaWJsZUVudHJ5VG9wID0gZW50cnkudGFyZ2V0Lm9mZnNldFRvcFxuICAgICAgdGhpcy5fcHJvY2Vzcyh0YXJnZXRFbGVtZW50KGVudHJ5KSlcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRTY3JvbGxUb3AgPSAodGhpcy5fcm9vdEVsZW1lbnQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5zY3JvbGxUb3BcbiAgICBjb25zdCB1c2VyU2Nyb2xsc0Rvd24gPSBwYXJlbnRTY3JvbGxUb3AgPj0gdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnBhcmVudFNjcm9sbFRvcFxuICAgIHRoaXMuX3ByZXZpb3VzU2Nyb2xsRGF0YS5wYXJlbnRTY3JvbGxUb3AgPSBwYXJlbnRTY3JvbGxUb3BcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKCFlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsXG4gICAgICAgIHRoaXMuX2NsZWFyQWN0aXZlQ2xhc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpXG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW50cnlJc0xvd2VyVGhhblByZXZpb3VzID0gZW50cnkudGFyZ2V0Lm9mZnNldFRvcCA+PSB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEudmlzaWJsZUVudHJ5VG9wXG4gICAgICAvLyBpZiB3ZSBhcmUgc2Nyb2xsaW5nIGRvd24sIHBpY2sgdGhlIGJpZ2dlciBvZmZzZXRUb3BcbiAgICAgIGlmICh1c2VyU2Nyb2xsc0Rvd24gJiYgZW50cnlJc0xvd2VyVGhhblByZXZpb3VzKSB7XG4gICAgICAgIGFjdGl2YXRlKGVudHJ5KVxuICAgICAgICAvLyBpZiBwYXJlbnQgaXNuJ3Qgc2Nyb2xsZWQsIGxldCdzIGtlZXAgdGhlIGZpcnN0IHZpc2libGUgaXRlbSwgYnJlYWtpbmcgdGhlIGl0ZXJhdGlvblxuICAgICAgICBpZiAoIXBhcmVudFNjcm9sbFRvcCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gaWYgd2UgYXJlIHNjcm9sbGluZyB1cCwgcGljayB0aGUgc21hbGxlc3Qgb2Zmc2V0VG9wXG4gICAgICBpZiAoIXVzZXJTY3JvbGxzRG93biAmJiAhZW50cnlJc0xvd2VyVGhhblByZXZpb3VzKSB7XG4gICAgICAgIGFjdGl2YXRlKGVudHJ5KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9pbml0aWFsaXplVGFyZ2V0c0FuZE9ic2VydmFibGVzKCkge1xuICAgIHRoaXMuX3RhcmdldExpbmtzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zID0gbmV3IE1hcCgpXG5cbiAgICBjb25zdCB0YXJnZXRMaW5rcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfVEFSR0VUX0xJTktTLCB0aGlzLl9jb25maWcudGFyZ2V0KVxuXG4gICAgZm9yIChjb25zdCBhbmNob3Igb2YgdGFyZ2V0TGlua3MpIHtcbiAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBhbmNob3IgaGFzIGFuIGlkIGFuZCBpcyBub3QgZGlzYWJsZWRcbiAgICAgIGlmICghYW5jaG9yLmhhc2ggfHwgaXNEaXNhYmxlZChhbmNob3IpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9ic2VydmFibGVTZWN0aW9uID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShkZWNvZGVVUkkoYW5jaG9yLmhhc2gpLCB0aGlzLl9lbGVtZW50KVxuXG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgb2JzZXJ2YWJsZVNlY3Rpb24gZXhpc3RzICYgaXMgdmlzaWJsZVxuICAgICAgaWYgKGlzVmlzaWJsZShvYnNlcnZhYmxlU2VjdGlvbikpIHtcbiAgICAgICAgdGhpcy5fdGFyZ2V0TGlua3Muc2V0KGRlY29kZVVSSShhbmNob3IuaGFzaCksIGFuY2hvcilcbiAgICAgICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zLnNldChhbmNob3IuaGFzaCwgb2JzZXJ2YWJsZVNlY3Rpb24pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX3Byb2Nlc3ModGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZVRhcmdldCA9PT0gdGFyZ2V0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jbGVhckFjdGl2ZUNsYXNzKHRoaXMuX2NvbmZpZy50YXJnZXQpXG4gICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gdGFyZ2V0XG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgdGhpcy5fYWN0aXZhdGVQYXJlbnRzKHRhcmdldClcblxuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0FDVElWQVRFLCB7IHJlbGF0ZWRUYXJnZXQ6IHRhcmdldCB9KVxuICB9XG5cbiAgX2FjdGl2YXRlUGFyZW50cyh0YXJnZXQpIHtcbiAgICAvLyBBY3RpdmF0ZSBkcm9wZG93biBwYXJlbnRzXG4gICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNKSkge1xuICAgICAgU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUsIHRhcmdldC5jbG9zZXN0KFNFTEVDVE9SX0RST1BET1dOKSlcbiAgICAgICAgLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxpc3RHcm91cCBvZiBTZWxlY3RvckVuZ2luZS5wYXJlbnRzKHRhcmdldCwgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVApKSB7XG4gICAgICAvLyBTZXQgdHJpZ2dlcmVkIGxpbmtzIHBhcmVudHMgYXMgYWN0aXZlXG4gICAgICAvLyBXaXRoIGJvdGggPHVsPiBhbmQgPG5hdj4gbWFya3VwIGEgcGFyZW50IGlzIHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIGFueSBuYXYgYW5jZXN0b3JcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBTZWxlY3RvckVuZ2luZS5wcmV2KGxpc3RHcm91cCwgU0VMRUNUT1JfTElOS19JVEVNUykpIHtcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9jbGVhckFjdGl2ZUNsYXNzKHBhcmVudCkge1xuICAgIHBhcmVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuXG4gICAgY29uc3QgYWN0aXZlTm9kZXMgPSBTZWxlY3RvckVuZ2luZS5maW5kKGAke1NFTEVDVE9SX1RBUkdFVF9MSU5LU30uJHtDTEFTU19OQU1FX0FDVElWRX1gLCBwYXJlbnQpXG4gICAgZm9yIChjb25zdCBub2RlIG9mIGFjdGl2ZU5vZGVzKSB7XG4gICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgfVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gU2Nyb2xsU3B5LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSwgKCkgPT4ge1xuICBmb3IgKGNvbnN0IHNweSBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfU1BZKSkge1xuICAgIFNjcm9sbFNweS5nZXRPckNyZWF0ZUluc3RhbmNlKHNweSlcbiAgfVxufSlcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oU2Nyb2xsU3B5KVxuXG5leHBvcnQgZGVmYXVsdCBTY3JvbGxTcHlcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdGFiLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4sIGdldE5leHRBY3RpdmVFbGVtZW50LCBpc0Rpc2FibGVkIH0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAndGFiJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMudGFiJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcblxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOID0gYGtleWRvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJID0gYGxvYWQke0VWRU5UX0tFWX1gXG5cbmNvbnN0IEFSUk9XX0xFRlRfS0VZID0gJ0Fycm93TGVmdCdcbmNvbnN0IEFSUk9XX1JJR0hUX0tFWSA9ICdBcnJvd1JpZ2h0J1xuY29uc3QgQVJST1dfVVBfS0VZID0gJ0Fycm93VXAnXG5jb25zdCBBUlJPV19ET1dOX0tFWSA9ICdBcnJvd0Rvd24nXG5jb25zdCBIT01FX0tFWSA9ICdIb21lJ1xuY29uc3QgRU5EX0tFWSA9ICdFbmQnXG5cbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFID0gJ2FjdGl2ZSdcbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19EUk9QRE9XTiA9ICdkcm9wZG93bidcblxuY29uc3QgU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFID0gJy5kcm9wZG93bi10b2dnbGUnXG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTl9NRU5VID0gJy5kcm9wZG93bi1tZW51J1xuY29uc3QgTk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9IGA6bm90KCR7U0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfSlgXG5cbmNvbnN0IFNFTEVDVE9SX1RBQl9QQU5FTCA9ICcubGlzdC1ncm91cCwgLm5hdiwgW3JvbGU9XCJ0YWJsaXN0XCJdJ1xuY29uc3QgU0VMRUNUT1JfT1VURVIgPSAnLm5hdi1pdGVtLCAubGlzdC1ncm91cC1pdGVtJ1xuY29uc3QgU0VMRUNUT1JfSU5ORVIgPSBgLm5hdi1saW5rJHtOT1RfU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfSwgLmxpc3QtZ3JvdXAtaXRlbSR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX0sIFtyb2xlPVwidGFiXCJdJHtOT1RfU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfWBcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLWJzLXRvZ2dsZT1cInRhYlwiXSwgW2RhdGEtYnMtdG9nZ2xlPVwicGlsbFwiXSwgW2RhdGEtYnMtdG9nZ2xlPVwibGlzdFwiXScgLy8gVE9ETzogY291bGQgb25seSBiZSBgdGFiYCBpbiB2NlxuY29uc3QgU0VMRUNUT1JfSU5ORVJfRUxFTSA9IGAke1NFTEVDVE9SX0lOTkVSfSwgJHtTRUxFQ1RPUl9EQVRBX1RPR0dMRX1gXG5cbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFX0FDVElWRSA9IGAuJHtDTEFTU19OQU1FX0FDVElWRX1bZGF0YS1icy10b2dnbGU9XCJ0YWJcIl0sIC4ke0NMQVNTX05BTUVfQUNUSVZFfVtkYXRhLWJzLXRvZ2dsZT1cInBpbGxcIl0sIC4ke0NMQVNTX05BTUVfQUNUSVZFfVtkYXRhLWJzLXRvZ2dsZT1cImxpc3RcIl1gXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRhYiBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudClcbiAgICB0aGlzLl9wYXJlbnQgPSB0aGlzLl9lbGVtZW50LmNsb3Nlc3QoU0VMRUNUT1JfVEFCX1BBTkVMKVxuXG4gICAgaWYgKCF0aGlzLl9wYXJlbnQpIHtcbiAgICAgIHJldHVyblxuICAgICAgLy8gVE9ETzogc2hvdWxkIHRocm93IGV4Y2VwdGlvbiBpbiB2NlxuICAgICAgLy8gdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtlbGVtZW50Lm91dGVySFRNTH0gaGFzIG5vdCBhIHZhbGlkIHBhcmVudCAke1NFTEVDVE9SX0lOTkVSX0VMRU19YClcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgaW5pdGlhbCBhcmlhIGF0dHJpYnV0ZXNcbiAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlcyh0aGlzLl9wYXJlbnQsIHRoaXMuX2dldENoaWxkcmVuKCkpXG5cbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTiwgZXZlbnQgPT4gdGhpcy5fa2V5ZG93bihldmVudCkpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHNob3coKSB7IC8vIFNob3dzIHRoaXMgZWxlbSBhbmQgZGVhY3RpdmF0ZSB0aGUgYWN0aXZlIHNpYmxpbmcgaWYgZXhpc3RzXG4gICAgY29uc3QgaW5uZXJFbGVtID0gdGhpcy5fZWxlbWVudFxuICAgIGlmICh0aGlzLl9lbGVtSXNBY3RpdmUoaW5uZXJFbGVtKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gU2VhcmNoIGZvciBhY3RpdmUgdGFiIG9uIHNhbWUgcGFyZW50IHRvIGRlYWN0aXZhdGUgaXRcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLl9nZXRBY3RpdmVFbGVtKClcblxuICAgIGNvbnN0IGhpZGVFdmVudCA9IGFjdGl2ZSA/XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcihhY3RpdmUsIEVWRU5UX0hJREUsIHsgcmVsYXRlZFRhcmdldDogaW5uZXJFbGVtIH0pIDpcbiAgICAgIG51bGxcblxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKGlubmVyRWxlbSwgRVZFTlRfU0hPVywgeyByZWxhdGVkVGFyZ2V0OiBhY3RpdmUgfSlcblxuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCB8fCAoaGlkZUV2ZW50ICYmIGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZGVhY3RpdmF0ZShhY3RpdmUsIGlubmVyRWxlbSlcbiAgICB0aGlzLl9hY3RpdmF0ZShpbm5lckVsZW0sIGFjdGl2ZSlcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2FjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG5cbiAgICB0aGlzLl9hY3RpdmF0ZShTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpKSAvLyBTZWFyY2ggYW5kIGFjdGl2YXRlL3Nob3cgdGhlIHByb3BlciBzZWN0aW9uXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgncm9sZScpICE9PSAndGFiJykge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4JylcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgdHJ1ZSlcbiAgICAgIHRoaXMuX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIHRydWUpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcihlbGVtZW50LCBFVkVOVF9TSE9XTiwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiByZWxhdGVkRWxlbVxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCBlbGVtZW50LCBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUpKVxuICB9XG5cbiAgX2RlYWN0aXZhdGUoZWxlbWVudCwgcmVsYXRlZEVsZW0pIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSlcbiAgICBlbGVtZW50LmJsdXIoKVxuXG4gICAgdGhpcy5fZGVhY3RpdmF0ZShTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpKSAvLyBTZWFyY2ggYW5kIGRlYWN0aXZhdGUgdGhlIHNob3duIHNlY3Rpb24gdG9vXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgncm9sZScpICE9PSAndGFiJykge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBmYWxzZSlcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpXG4gICAgICB0aGlzLl90b2dnbGVEcm9wRG93bihlbGVtZW50LCBmYWxzZSlcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKGVsZW1lbnQsIEVWRU5UX0hJRERFTiwgeyByZWxhdGVkVGFyZ2V0OiByZWxhdGVkRWxlbSB9KVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIGVsZW1lbnQsIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSkpXG4gIH1cblxuICBfa2V5ZG93bihldmVudCkge1xuICAgIGlmICghKFtBUlJPV19MRUZUX0tFWSwgQVJST1dfUklHSFRfS0VZLCBBUlJPV19VUF9LRVksIEFSUk9XX0RPV05fS0VZLCBIT01FX0tFWSwgRU5EX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpLy8gc3RvcFByb3BhZ2F0aW9uL3ByZXZlbnREZWZhdWx0IGJvdGggYWRkZWQgdG8gc3VwcG9ydCB1cC9kb3duIGtleXMgd2l0aG91dCBzY3JvbGxpbmcgdGhlIHBhZ2VcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuX2dldENoaWxkcmVuKCkuZmlsdGVyKGVsZW1lbnQgPT4gIWlzRGlzYWJsZWQoZWxlbWVudCkpXG4gICAgbGV0IG5leHRBY3RpdmVFbGVtZW50XG5cbiAgICBpZiAoW0hPTUVfS0VZLCBFTkRfS0VZXS5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICBuZXh0QWN0aXZlRWxlbWVudCA9IGNoaWxkcmVuW2V2ZW50LmtleSA9PT0gSE9NRV9LRVkgPyAwIDogY2hpbGRyZW4ubGVuZ3RoIC0gMV1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNOZXh0ID0gW0FSUk9XX1JJR0hUX0tFWSwgQVJST1dfRE9XTl9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSlcbiAgICAgIG5leHRBY3RpdmVFbGVtZW50ID0gZ2V0TmV4dEFjdGl2ZUVsZW1lbnQoY2hpbGRyZW4sIGV2ZW50LnRhcmdldCwgaXNOZXh0LCB0cnVlKVxuICAgIH1cblxuICAgIGlmIChuZXh0QWN0aXZlRWxlbWVudCkge1xuICAgICAgbmV4dEFjdGl2ZUVsZW1lbnQuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pXG4gICAgICBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZShuZXh0QWN0aXZlRWxlbWVudCkuc2hvdygpXG4gICAgfVxuICB9XG5cbiAgX2dldENoaWxkcmVuKCkgeyAvLyBjb2xsZWN0aW9uIG9mIGlubmVyIGVsZW1lbnRzXG4gICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfSU5ORVJfRUxFTSwgdGhpcy5fcGFyZW50KVxuICB9XG5cbiAgX2dldEFjdGl2ZUVsZW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENoaWxkcmVuKCkuZmluZChjaGlsZCA9PiB0aGlzLl9lbGVtSXNBY3RpdmUoY2hpbGQpKSB8fCBudWxsXG4gIH1cblxuICBfc2V0SW5pdGlhbEF0dHJpYnV0ZXMocGFyZW50LCBjaGlsZHJlbikge1xuICAgIHRoaXMuX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKHBhcmVudCwgJ3JvbGUnLCAndGFibGlzdCcpXG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uQ2hpbGQoY2hpbGQpXG4gICAgfVxuICB9XG5cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzT25DaGlsZChjaGlsZCkge1xuICAgIGNoaWxkID0gdGhpcy5fZ2V0SW5uZXJFbGVtZW50KGNoaWxkKVxuICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5fZWxlbUlzQWN0aXZlKGNoaWxkKVxuICAgIGNvbnN0IG91dGVyRWxlbSA9IHRoaXMuX2dldE91dGVyRWxlbWVudChjaGlsZClcbiAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBpc0FjdGl2ZSlcblxuICAgIGlmIChvdXRlckVsZW0gIT09IGNoaWxkKSB7XG4gICAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhvdXRlckVsZW0sICdyb2xlJywgJ3ByZXNlbnRhdGlvbicpXG4gICAgfVxuXG4gICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpXG4gICAgfVxuXG4gICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMoY2hpbGQsICdyb2xlJywgJ3RhYicpXG5cbiAgICAvLyBzZXQgYXR0cmlidXRlcyB0byB0aGUgcmVsYXRlZCBwYW5lbCB0b29cbiAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwoY2hpbGQpXG4gIH1cblxuICBfc2V0SW5pdGlhbEF0dHJpYnV0ZXNPblRhcmdldFBhbmVsKGNoaWxkKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihjaGlsZClcblxuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyh0YXJnZXQsICdyb2xlJywgJ3RhYnBhbmVsJylcblxuICAgIGlmIChjaGlsZC5pZCkge1xuICAgICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHModGFyZ2V0LCAnYXJpYS1sYWJlbGxlZGJ5JywgYCR7Y2hpbGQuaWR9YClcbiAgICB9XG4gIH1cblxuICBfdG9nZ2xlRHJvcERvd24oZWxlbWVudCwgb3Blbikge1xuICAgIGNvbnN0IG91dGVyRWxlbSA9IHRoaXMuX2dldE91dGVyRWxlbWVudChlbGVtZW50KVxuICAgIGlmICghb3V0ZXJFbGVtLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19EUk9QRE9XTikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHRvZ2dsZSA9IChzZWxlY3RvciwgY2xhc3NOYW1lKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3Rvciwgb3V0ZXJFbGVtKVxuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGNsYXNzTmFtZSwgb3BlbilcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGUoU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFLCBDTEFTU19OQU1FX0FDVElWRSlcbiAgICB0b2dnbGUoU0VMRUNUT1JfRFJPUERPV05fTUVOVSwgQ0xBU1NfTkFNRV9TSE9XKVxuICAgIG91dGVyRWxlbS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBvcGVuKVxuICB9XG5cbiAgX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKGVsZW1lbnQsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSkpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpXG4gICAgfVxuICB9XG5cbiAgX2VsZW1Jc0FjdGl2ZShlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQUNUSVZFKVxuICB9XG5cbiAgLy8gVHJ5IHRvIGdldCB0aGUgaW5uZXIgZWxlbWVudCAodXN1YWxseSB0aGUgLm5hdi1saW5rKVxuICBfZ2V0SW5uZXJFbGVtZW50KGVsZW0pIHtcbiAgICByZXR1cm4gZWxlbS5tYXRjaGVzKFNFTEVDVE9SX0lOTkVSX0VMRU0pID8gZWxlbSA6IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfSU5ORVJfRUxFTSwgZWxlbSlcbiAgfVxuXG4gIC8vIFRyeSB0byBnZXQgdGhlIG91dGVyIGVsZW1lbnQgKHVzdWFsbHkgdGhlIC5uYXYtaXRlbSlcbiAgX2dldE91dGVyRWxlbWVudChlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0uY2xvc2VzdChTRUxFQ1RPUl9PVVRFUikgfHwgZWxlbVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YVtjb25maWddID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnN0YXJ0c1dpdGgoJ18nKSB8fCBjb25maWcgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10oKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKS5zaG93KClcbn0pXG5cbi8qKlxuICogSW5pdGlhbGl6ZSBvbiBmb2N1c1xuICovXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJLCAoKSA9PiB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfVE9HR0xFX0FDVElWRSkpIHtcbiAgICBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50KVxuICB9XG59KVxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oVGFiKVxuXG5leHBvcnQgZGVmYXVsdCBUYWJcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdG9hc3QuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50LmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IHsgZW5hYmxlRGlzbWlzc1RyaWdnZXIgfSBmcm9tICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qcydcbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiwgcmVmbG93IH0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAndG9hc3QnXG5jb25zdCBEQVRBX0tFWSA9ICdicy50b2FzdCdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5cbmNvbnN0IEVWRU5UX01PVVNFT1ZFUiA9IGBtb3VzZW92ZXIke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRU9VVCA9IGBtb3VzZW91dCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0ZPQ1VTSU4gPSBgZm9jdXNpbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0ZPQ1VTT1VUID0gYGZvY3Vzb3V0JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfSElERSA9ICdoaWRlJyAvLyBAZGVwcmVjYXRlZCAtIGtlcHQgaGVyZSBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19OQU1FX1NIT1dJTkcgPSAnc2hvd2luZydcblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGFuaW1hdGlvbjogJ2Jvb2xlYW4nLFxuICBhdXRvaGlkZTogJ2Jvb2xlYW4nLFxuICBkZWxheTogJ251bWJlcidcbn1cblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYW5pbWF0aW9uOiB0cnVlLFxuICBhdXRvaGlkZTogdHJ1ZSxcbiAgZGVsYXk6IDUwMDBcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVG9hc3QgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgdGhpcy5fdGltZW91dCA9IG51bGxcbiAgICB0aGlzLl9oYXNNb3VzZUludGVyYWN0aW9uID0gZmFsc2VcbiAgICB0aGlzLl9oYXNLZXlib2FyZEludGVyYWN0aW9uID0gZmFsc2VcbiAgICB0aGlzLl9zZXRMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBzaG93KCkge1xuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1cpXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2NsZWFyVGltZW91dCgpXG5cbiAgICBpZiAodGhpcy5fY29uZmlnLmFuaW1hdGlvbikge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSlcbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTilcblxuICAgICAgdGhpcy5fbWF5YmVTY2hlZHVsZUhpZGUoKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0hJREUpIC8vIEBkZXByZWNhdGVkXG4gICAgcmVmbG93KHRoaXMuX2VsZW1lbnQpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVywgQ0xBU1NfTkFNRV9TSE9XSU5HKVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdGhpcy5fY29uZmlnLmFuaW1hdGlvbilcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSlcblxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9ISURFKSAvLyBAZGVwcmVjYXRlZFxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPV0lORywgQ0xBU1NfTkFNRV9TSE9XKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1dJTkcpXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdGhpcy5fY29uZmlnLmFuaW1hdGlvbilcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5fY2xlYXJUaW1lb3V0KClcblxuICAgIGlmICh0aGlzLmlzU2hvd24oKSkge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICB9XG5cbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIGlzU2hvd24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVylcbiAgfVxuXG4gIC8vIFByaXZhdGVcblxuICBfbWF5YmVTY2hlZHVsZUhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuYXV0b2hpZGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9oYXNNb3VzZUludGVyYWN0aW9uIHx8IHRoaXMuX2hhc0tleWJvYXJkSW50ZXJhY3Rpb24pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaGlkZSgpXG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5KVxuICB9XG5cbiAgX29uSW50ZXJhY3Rpb24oZXZlbnQsIGlzSW50ZXJhY3RpbmcpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgICBjYXNlICdtb3VzZW91dCc6IHtcbiAgICAgICAgdGhpcy5faGFzTW91c2VJbnRlcmFjdGlvbiA9IGlzSW50ZXJhY3RpbmdcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICBjYXNlICdmb2N1c291dCc6IHtcbiAgICAgICAgdGhpcy5faGFzS2V5Ym9hcmRJbnRlcmFjdGlvbiA9IGlzSW50ZXJhY3RpbmdcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0ludGVyYWN0aW5nKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVvdXQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEVsZW1lbnQgPSBldmVudC5yZWxhdGVkVGFyZ2V0XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQgPT09IG5leHRFbGVtZW50IHx8IHRoaXMuX2VsZW1lbnQuY29udGFpbnMobmV4dEVsZW1lbnQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9tYXliZVNjaGVkdWxlSGlkZSgpXG4gIH1cblxuICBfc2V0TGlzdGVuZXJzKCkge1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRU9WRVIsIGV2ZW50ID0+IHRoaXMuX29uSW50ZXJhY3Rpb24oZXZlbnQsIHRydWUpKVxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRU9VVCwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgZmFsc2UpKVxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9GT0NVU0lOLCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCB0cnVlKSlcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfRk9DVVNPVVQsIGV2ZW50ID0+IHRoaXMuX29uSW50ZXJhY3Rpb24oZXZlbnQsIGZhbHNlKSlcbiAgfVxuXG4gIF9jbGVhclRpbWVvdXQoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpXG4gICAgdGhpcy5fdGltZW91dCA9IG51bGxcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRvYXN0LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVtjb25maWddKHRoaXMpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuZW5hYmxlRGlzbWlzc1RyaWdnZXIoVG9hc3QpXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRvYXN0KVxuXG5leHBvcnQgZGVmYXVsdCBUb2FzdFxuIiwgImltcG9ydCAkIGZyb20gXCJqcXVlcnlcIlxuXG4kKGZ1bmN0aW9uICgpIHtcbiAgJChcInNlbGVjdC50cmVlXCIpLmNoYW5nZShmdW5jdGlvbiAoKSB7XG4gICAgZG9jdW1lbnQubG9jYXRpb24gPSB0aGlzLnZhbHVlO1xuICB9KTtcbn0pO1xuIiwgImltcG9ydCAkIGZyb20gXCJqcXVlcnlcIjtcbmltcG9ydCBrbXhfY29sb3JzIGZyb20gXCIuL2tteF9jb2xvcnNcIjtcblxuZnVuY3Rpb24gZ2V0UmFuZG9tSW50KG1heCkge1xuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbWF4KTtcbn1cblxuJChmdW5jdGlvbigpIHtcbiAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgaSA9IGdldFJhbmRvbUludChrbXhfY29sb3JzLmluZGV4Lmxlbmd0aCk7XG4gICAgY29uc3QgbmFtZSA9IGtteF9jb2xvcnMuaW5kZXhbaV07XG4gICAgY29uc3QgY29sb3IgPSBrbXhfY29sb3JzW25hbWVdO1xuICAgIGNvbnN0IHggPSAoZ2V0UmFuZG9tSW50KDk5KSAtIDQ4KSAqIDAuMDAyO1xuICAgICQoXCJhXCIpLmNzcyhcInRleHQtc2hhZG93XCIsIFwiMCAwIDBcIik7XG4gICAgJChcImE6aG92ZXJcIikuY3NzKFwidGV4dC1zaGFkb3dcIiwgeCArIFwiZW0gMCAwIFwiICsgY29sb3IpO1xuICB9LCAyMDApO1xufSk7XG4iLCAiY29uc3Qga214X2NvbG9ycyA9IHtcbiAgXCJrbXgtYmxhY2tcIjogICBcIiMxZTFmMWRcIixcbiAgXCJrbXgtYmx1ZVwiOiAgICBcIiM1YTYwZjlcIixcbiAgXCJrbXgtYmx1ZTFcIjogICBcIiM2ZjcyZjlcIixcbiAgXCJrbXgtYmx1ZTJcIjogICBcIiM5Yzk5ZmRcIixcbiAgXCJrbXgtYmx1ZTNcIjogICBcIiM1YTYwZjlcIixcbiAgXCJrbXgtYmx1ZTRcIjogICBcIiM2ZjcyZjlcIixcbiAgXCJrbXgtYmx1ZTVcIjogICBcIiM5Yzk5ZmRcIixcbiAgXCJpbmRleFwiOiBbXG4gICAgXCJrbXgtYmxhY2tcIixcbiAgICBcImtteC1ibHVlXCIsXG4gICAgXCJrbXgtYmx1ZTFcIixcbiAgICBcImtteC1ibHVlMlwiLFxuICAgIFwia214LWJsdWUzXCIsXG4gICAgXCJrbXgtYmx1ZTRcIixcbiAgICBcImtteC1ibHVlNVwiLFxuICAgIFwia214LWN5YW5cIixcbiAgICBcImtteC1jeWFuMVwiLFxuICAgIFwia214LWdyZWVuXCIsXG4gICAgXCJrbXgtZ3JlZW4xXCIsXG4gICAgXCJrbXgtb3JhbmdlXCIsXG4gICAgXCJrbXgtb3JhbmdlMVwiLFxuICAgIFwia214LW9yYW5nZTJcIixcbiAgICBcImtteC1waW5rXCIsXG4gICAgXCJrbXgtd2hpdGVcIixcbiAgICBcImtteC13aGl0ZTFcIixcbiAgICBcImtteC13aGl0ZTJcIixcbiAgICBcImtteC15ZWxsb3dcIixcbiAgICBcImtteC15ZWxsb3cxXCIsXG4gICAgXCJrbXgteWVsbG93MlwiLFxuICAgIFwia214LXllbGxvdzNcIlxuICBdLFxuICBcImtteC1jeWFuXCI6ICAgIFwiI2Q0ZjNmNlwiLFxuICBcImtteC1jeWFuMVwiOiAgIFwiI2Q0ZjNmNlwiLFxuICBcImtteC1ncmVlblwiOiAgIFwiI2M0ZWQzYVwiLFxuICBcImtteC1ncmVlbjFcIjogIFwiI2M0ZWQzYVwiLFxuICBcImtteC1vcmFuZ2VcIjogIFwiI2Y4NjgxY1wiLFxuICBcImtteC1vcmFuZ2UxXCI6IFwiI2ZhNzczNFwiLFxuICBcImtteC1vcmFuZ2UyXCI6IFwiI2ZmYTUzMlwiLFxuICBcImtteC1waW5rXCI6ICAgIFwiI2ZjOWVmOVwiLFxuICBcImtteC13aGl0ZVwiOiAgIFwiI2Y1ZjhmNFwiLFxuICBcImtteC13aGl0ZTFcIjogIFwiI2ZmZjlmMlwiLFxuICBcImtteC13aGl0ZTJcIjogIFwiI2ZmZmZmZlwiLFxuICBcImtteC15ZWxsb3dcIjogIFwiI2VjZmU0OVwiLFxuICBcImtteC15ZWxsb3cxXCI6IFwiI2ZmZjQzZVwiLFxuICBcImtteC15ZWxsb3cyXCI6ICBcIiNlY2ZlNDlcIixcbiAgXCJrbXgteWVsbG93M1wiOiBcIiNmZmY0M2VcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGtteF9jb2xvcnM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbihmdW5jdGlvbigpIHtcbiAgdmFyIFBvbHlmaWxsRXZlbnQgPSBldmVudENvbnN0cnVjdG9yKCk7XG5cbiAgZnVuY3Rpb24gZXZlbnRDb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gd2luZG93LkN1c3RvbUV2ZW50O1xuICAgIC8vIElFPD05IFN1cHBvcnRcbiAgICBmdW5jdGlvbiBDdXN0b21FdmVudChldmVudCwgcGFyYW1zKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge2J1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWR9O1xuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICAgIHJldHVybiBldnQ7XG4gICAgfVxuICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50O1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRIaWRkZW5JbnB1dChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBpbnB1dC50eXBlID0gXCJoaWRkZW5cIjtcbiAgICBpbnB1dC5uYW1lID0gbmFtZTtcbiAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGVsZW1lbnQsIHRhcmdldE1vZGlmaWVyS2V5KSB7XG4gICAgdmFyIHRvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXRvXCIpLFxuICAgICAgICBtZXRob2QgPSBidWlsZEhpZGRlbklucHV0KFwiX21ldGhvZFwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbWV0aG9kXCIpKSxcbiAgICAgICAgY3NyZiA9IGJ1aWxkSGlkZGVuSW5wdXQoXCJfY3NyZl90b2tlblwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtY3NyZlwiKSksXG4gICAgICAgIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKSxcbiAgICAgICAgc3VibWl0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpLFxuICAgICAgICB0YXJnZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtcblxuICAgIGZvcm0ubWV0aG9kID0gKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1tZXRob2RcIikgPT09IFwiZ2V0XCIpID8gXCJnZXRcIiA6IFwicG9zdFwiO1xuICAgIGZvcm0uYWN0aW9uID0gdG87XG4gICAgZm9ybS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cbiAgICBpZiAodGFyZ2V0KSBmb3JtLnRhcmdldCA9IHRhcmdldDtcbiAgICBlbHNlIGlmICh0YXJnZXRNb2RpZmllcktleSkgZm9ybS50YXJnZXQgPSBcIl9ibGFua1wiO1xuXG4gICAgZm9ybS5hcHBlbmRDaGlsZChjc3JmKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKG1ldGhvZCk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTtcblxuICAgIC8vIEluc2VydCBhIGJ1dHRvbiBhbmQgY2xpY2sgaXQgaW5zdGVhZCBvZiB1c2luZyBgZm9ybS5zdWJtaXRgXG4gICAgLy8gYmVjYXVzZSB0aGUgYHN1Ym1pdGAgZnVuY3Rpb24gZG9lcyBub3QgZW1pdCBhIGBzdWJtaXRgIGV2ZW50LlxuICAgIHN1Ym1pdC50eXBlID0gXCJzdWJtaXRcIjtcbiAgICBmb3JtLmFwcGVuZENoaWxkKHN1Ym1pdCk7XG4gICAgc3VibWl0LmNsaWNrKCk7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWxlbWVudCA9IGUudGFyZ2V0O1xuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcblxuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKSB7XG4gICAgICB2YXIgcGhvZW5peExpbmtFdmVudCA9IG5ldyBQb2x5ZmlsbEV2ZW50KCdwaG9lbml4LmxpbmsuY2xpY2snLCB7XG4gICAgICAgIFwiYnViYmxlc1wiOiB0cnVlLCBcImNhbmNlbGFibGVcIjogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghZWxlbWVudC5kaXNwYXRjaEV2ZW50KHBob2VuaXhMaW5rRXZlbnQpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1ldGhvZFwiKSkge1xuICAgICAgICBoYW5kbGVDbGljayhlbGVtZW50LCBlLm1ldGFLZXkgfHwgZS5zaGlmdEtleSk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIGZhbHNlKTtcblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncGhvZW5peC5saW5rLmNsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgbWVzc2FnZSA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEtY29uZmlybVwiKTtcbiAgICBpZihtZXNzYWdlICYmICF3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSwgZmFsc2UpO1xufSkoKTtcbiIsICIvLyB3cmFwcyB2YWx1ZSBpbiBjbG9zdXJlIG9yIHJldHVybnMgY2xvc3VyZVxuZXhwb3J0IGxldCBjbG9zdXJlID0gKHZhbHVlKSA9PiB7XG4gIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKXtcbiAgICByZXR1cm4gdmFsdWVcbiAgfSBlbHNlIHtcbiAgICBsZXQgY2xvc3VyZSA9IGZ1bmN0aW9uICgpeyByZXR1cm4gdmFsdWUgfVxuICAgIHJldHVybiBjbG9zdXJlXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZ2xvYmFsU2VsZiA9IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IG51bGxcbmV4cG9ydCBjb25zdCBwaHhXaW5kb3cgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogbnVsbFxuZXhwb3J0IGNvbnN0IGdsb2JhbCA9IGdsb2JhbFNlbGYgfHwgcGh4V2luZG93IHx8IGdsb2JhbFxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVlNOID0gXCIyLjAuMFwiXG5leHBvcnQgY29uc3QgU09DS0VUX1NUQVRFUyA9IHtjb25uZWN0aW5nOiAwLCBvcGVuOiAxLCBjbG9zaW5nOiAyLCBjbG9zZWQ6IDN9XG5leHBvcnQgY29uc3QgREVGQVVMVF9USU1FT1VUID0gMTAwMDBcbmV4cG9ydCBjb25zdCBXU19DTE9TRV9OT1JNQUwgPSAxMDAwXG5leHBvcnQgY29uc3QgQ0hBTk5FTF9TVEFURVMgPSB7XG4gIGNsb3NlZDogXCJjbG9zZWRcIixcbiAgZXJyb3JlZDogXCJlcnJvcmVkXCIsXG4gIGpvaW5lZDogXCJqb2luZWRcIixcbiAgam9pbmluZzogXCJqb2luaW5nXCIsXG4gIGxlYXZpbmc6IFwibGVhdmluZ1wiLFxufVxuZXhwb3J0IGNvbnN0IENIQU5ORUxfRVZFTlRTID0ge1xuICBjbG9zZTogXCJwaHhfY2xvc2VcIixcbiAgZXJyb3I6IFwicGh4X2Vycm9yXCIsXG4gIGpvaW46IFwicGh4X2pvaW5cIixcbiAgcmVwbHk6IFwicGh4X3JlcGx5XCIsXG4gIGxlYXZlOiBcInBoeF9sZWF2ZVwiXG59XG5cbmV4cG9ydCBjb25zdCBUUkFOU1BPUlRTID0ge1xuICBsb25ncG9sbDogXCJsb25ncG9sbFwiLFxuICB3ZWJzb2NrZXQ6IFwid2Vic29ja2V0XCJcbn1cbmV4cG9ydCBjb25zdCBYSFJfU1RBVEVTID0ge1xuICBjb21wbGV0ZTogNFxufVxuIiwgIi8qKlxuICogSW5pdGlhbGl6ZXMgdGhlIFB1c2hcbiAqIEBwYXJhbSB7Q2hhbm5lbH0gY2hhbm5lbCAtIFRoZSBDaGFubmVsXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgLSBUaGUgZXZlbnQsIGZvciBleGFtcGxlIGBcInBoeF9qb2luXCJgXG4gKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZCAtIFRoZSBwYXlsb2FkLCBmb3IgZXhhbXBsZSBge3VzZXJfaWQ6IDEyM31gXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCAtIFRoZSBwdXNoIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFB1c2gge1xuICBjb25zdHJ1Y3RvcihjaGFubmVsLCBldmVudCwgcGF5bG9hZCwgdGltZW91dCl7XG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbFxuICAgIHRoaXMuZXZlbnQgPSBldmVudFxuICAgIHRoaXMucGF5bG9hZCA9IHBheWxvYWQgfHwgZnVuY3Rpb24gKCl7IHJldHVybiB7fSB9XG4gICAgdGhpcy5yZWNlaXZlZFJlc3AgPSBudWxsXG4gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dFxuICAgIHRoaXMudGltZW91dFRpbWVyID0gbnVsbFxuICAgIHRoaXMucmVjSG9va3MgPSBbXVxuICAgIHRoaXMuc2VudCA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXRcbiAgICovXG4gIHJlc2VuZCh0aW1lb3V0KXtcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgdGhpcy5yZXNldCgpXG4gICAgdGhpcy5zZW5kKClcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgc2VuZCgpe1xuICAgIGlmKHRoaXMuaGFzUmVjZWl2ZWQoXCJ0aW1lb3V0XCIpKXsgcmV0dXJuIH1cbiAgICB0aGlzLnN0YXJ0VGltZW91dCgpXG4gICAgdGhpcy5zZW50ID0gdHJ1ZVxuICAgIHRoaXMuY2hhbm5lbC5zb2NrZXQucHVzaCh7XG4gICAgICB0b3BpYzogdGhpcy5jaGFubmVsLnRvcGljLFxuICAgICAgZXZlbnQ6IHRoaXMuZXZlbnQsXG4gICAgICBwYXlsb2FkOiB0aGlzLnBheWxvYWQoKSxcbiAgICAgIHJlZjogdGhpcy5yZWYsXG4gICAgICBqb2luX3JlZjogdGhpcy5jaGFubmVsLmpvaW5SZWYoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHsqfSBzdGF0dXNcbiAgICogQHBhcmFtIHsqfSBjYWxsYmFja1xuICAgKi9cbiAgcmVjZWl2ZShzdGF0dXMsIGNhbGxiYWNrKXtcbiAgICBpZih0aGlzLmhhc1JlY2VpdmVkKHN0YXR1cykpe1xuICAgICAgY2FsbGJhY2sodGhpcy5yZWNlaXZlZFJlc3AucmVzcG9uc2UpXG4gICAgfVxuXG4gICAgdGhpcy5yZWNIb29rcy5wdXNoKHtzdGF0dXMsIGNhbGxiYWNrfSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXNldCgpe1xuICAgIHRoaXMuY2FuY2VsUmVmRXZlbnQoKVxuICAgIHRoaXMucmVmID0gbnVsbFxuICAgIHRoaXMucmVmRXZlbnQgPSBudWxsXG4gICAgdGhpcy5yZWNlaXZlZFJlc3AgPSBudWxsXG4gICAgdGhpcy5zZW50ID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbWF0Y2hSZWNlaXZlKHtzdGF0dXMsIHJlc3BvbnNlLCBfcmVmfSl7XG4gICAgdGhpcy5yZWNIb29rcy5maWx0ZXIoaCA9PiBoLnN0YXR1cyA9PT0gc3RhdHVzKVxuICAgICAgLmZvckVhY2goaCA9PiBoLmNhbGxiYWNrKHJlc3BvbnNlKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuY2VsUmVmRXZlbnQoKXtcbiAgICBpZighdGhpcy5yZWZFdmVudCl7IHJldHVybiB9XG4gICAgdGhpcy5jaGFubmVsLm9mZih0aGlzLnJlZkV2ZW50KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxUaW1lb3V0KCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFRpbWVyKVxuICAgIHRoaXMudGltZW91dFRpbWVyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzdGFydFRpbWVvdXQoKXtcbiAgICBpZih0aGlzLnRpbWVvdXRUaW1lcil7IHRoaXMuY2FuY2VsVGltZW91dCgpIH1cbiAgICB0aGlzLnJlZiA9IHRoaXMuY2hhbm5lbC5zb2NrZXQubWFrZVJlZigpXG4gICAgdGhpcy5yZWZFdmVudCA9IHRoaXMuY2hhbm5lbC5yZXBseUV2ZW50TmFtZSh0aGlzLnJlZilcblxuICAgIHRoaXMuY2hhbm5lbC5vbih0aGlzLnJlZkV2ZW50LCBwYXlsb2FkID0+IHtcbiAgICAgIHRoaXMuY2FuY2VsUmVmRXZlbnQoKVxuICAgICAgdGhpcy5jYW5jZWxUaW1lb3V0KClcbiAgICAgIHRoaXMucmVjZWl2ZWRSZXNwID0gcGF5bG9hZFxuICAgICAgdGhpcy5tYXRjaFJlY2VpdmUocGF5bG9hZClcbiAgICB9KVxuXG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudHJpZ2dlcihcInRpbWVvdXRcIiwge30pXG4gICAgfSwgdGhpcy50aW1lb3V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBoYXNSZWNlaXZlZChzdGF0dXMpe1xuICAgIHJldHVybiB0aGlzLnJlY2VpdmVkUmVzcCAmJiB0aGlzLnJlY2VpdmVkUmVzcC5zdGF0dXMgPT09IHN0YXR1c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyKHN0YXR1cywgcmVzcG9uc2Upe1xuICAgIHRoaXMuY2hhbm5lbC50cmlnZ2VyKHRoaXMucmVmRXZlbnQsIHtzdGF0dXMsIHJlc3BvbnNlfSlcbiAgfVxufVxuIiwgIi8qKlxuICpcbiAqIENyZWF0ZXMgYSB0aW1lciB0aGF0IGFjY2VwdHMgYSBgdGltZXJDYWxjYCBmdW5jdGlvbiB0byBwZXJmb3JtXG4gKiBjYWxjdWxhdGVkIHRpbWVvdXQgcmV0cmllcywgc3VjaCBhcyBleHBvbmVudGlhbCBiYWNrb2ZmLlxuICpcbiAqIEBleGFtcGxlXG4gKiBsZXQgcmVjb25uZWN0VGltZXIgPSBuZXcgVGltZXIoKCkgPT4gdGhpcy5jb25uZWN0KCksIGZ1bmN0aW9uKHRyaWVzKXtcbiAqICAgcmV0dXJuIFsxMDAwLCA1MDAwLCAxMDAwMF1bdHJpZXMgLSAxXSB8fCAxMDAwMFxuICogfSlcbiAqIHJlY29ubmVjdFRpbWVyLnNjaGVkdWxlVGltZW91dCgpIC8vIGZpcmVzIGFmdGVyIDEwMDBcbiAqIHJlY29ubmVjdFRpbWVyLnNjaGVkdWxlVGltZW91dCgpIC8vIGZpcmVzIGFmdGVyIDUwMDBcbiAqIHJlY29ubmVjdFRpbWVyLnJlc2V0KClcbiAqIHJlY29ubmVjdFRpbWVyLnNjaGVkdWxlVGltZW91dCgpIC8vIGZpcmVzIGFmdGVyIDEwMDBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHBhcmFtIHtGdW5jdGlvbn0gdGltZXJDYWxjXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbWVyIHtcbiAgY29uc3RydWN0b3IoY2FsbGJhY2ssIHRpbWVyQ2FsYyl7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgdGhpcy50aW1lckNhbGMgPSB0aW1lckNhbGNcbiAgICB0aGlzLnRpbWVyID0gbnVsbFxuICAgIHRoaXMudHJpZXMgPSAwXG4gIH1cblxuICByZXNldCgpe1xuICAgIHRoaXMudHJpZXMgPSAwXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpXG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyBhbnkgcHJldmlvdXMgc2NoZWR1bGVUaW1lb3V0IGFuZCBzY2hlZHVsZXMgY2FsbGJhY2tcbiAgICovXG4gIHNjaGVkdWxlVGltZW91dCgpe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKVxuXG4gICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmllcyA9IHRoaXMudHJpZXMgKyAxXG4gICAgICB0aGlzLmNhbGxiYWNrKClcbiAgICB9LCB0aGlzLnRpbWVyQ2FsYyh0aGlzLnRyaWVzICsgMSkpXG4gIH1cbn1cbiIsICJpbXBvcnQge2Nsb3N1cmV9IGZyb20gXCIuL3V0aWxzXCJcbmltcG9ydCB7XG4gIENIQU5ORUxfRVZFTlRTLFxuICBDSEFOTkVMX1NUQVRFUyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IFB1c2ggZnJvbSBcIi4vcHVzaFwiXG5pbXBvcnQgVGltZXIgZnJvbSBcIi4vdGltZXJcIlxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9waWNcbiAqIEBwYXJhbSB7KE9iamVjdHxmdW5jdGlvbil9IHBhcmFtc1xuICogQHBhcmFtIHtTb2NrZXR9IHNvY2tldFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaGFubmVsIHtcbiAgY29uc3RydWN0b3IodG9waWMsIHBhcmFtcywgc29ja2V0KXtcbiAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkXG4gICAgdGhpcy50b3BpYyA9IHRvcGljXG4gICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKHBhcmFtcyB8fCB7fSlcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldFxuICAgIHRoaXMuYmluZGluZ3MgPSBbXVxuICAgIHRoaXMuYmluZGluZ1JlZiA9IDBcbiAgICB0aGlzLnRpbWVvdXQgPSB0aGlzLnNvY2tldC50aW1lb3V0XG4gICAgdGhpcy5qb2luZWRPbmNlID0gZmFsc2VcbiAgICB0aGlzLmpvaW5QdXNoID0gbmV3IFB1c2godGhpcywgQ0hBTk5FTF9FVkVOVFMuam9pbiwgdGhpcy5wYXJhbXMsIHRoaXMudGltZW91dClcbiAgICB0aGlzLnB1c2hCdWZmZXIgPSBbXVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VSZWZzID0gW11cblxuICAgIHRoaXMucmVqb2luVGltZXIgPSBuZXcgVGltZXIoKCkgPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSl7IHRoaXMucmVqb2luKCkgfVxuICAgIH0sIHRoaXMuc29ja2V0LnJlam9pbkFmdGVyTXMpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZVJlZnMucHVzaCh0aGlzLnNvY2tldC5vbkVycm9yKCgpID0+IHRoaXMucmVqb2luVGltZXIucmVzZXQoKSkpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZVJlZnMucHVzaCh0aGlzLnNvY2tldC5vbk9wZW4oKCkgPT4ge1xuICAgICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpXG4gICAgICBpZih0aGlzLmlzRXJyb3JlZCgpKXsgdGhpcy5yZWpvaW4oKSB9XG4gICAgfSlcbiAgICApXG4gICAgdGhpcy5qb2luUHVzaC5yZWNlaXZlKFwib2tcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmpvaW5lZFxuICAgICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpXG4gICAgICB0aGlzLnB1c2hCdWZmZXIuZm9yRWFjaChwdXNoRXZlbnQgPT4gcHVzaEV2ZW50LnNlbmQoKSlcbiAgICAgIHRoaXMucHVzaEJ1ZmZlciA9IFtdXG4gICAgfSlcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJlcnJvclwiLCAoKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZFxuICAgICAgaWYodGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSl7IHRoaXMucmVqb2luVGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgfVxuICAgIH0pXG4gICAgdGhpcy5vbkNsb3NlKCgpID0+IHtcbiAgICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKVxuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGNsb3NlICR7dGhpcy50b3BpY30gJHt0aGlzLmpvaW5SZWYoKX1gKVxuICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmNsb3NlZFxuICAgICAgdGhpcy5zb2NrZXQucmVtb3ZlKHRoaXMpXG4gICAgfSlcbiAgICB0aGlzLm9uRXJyb3IocmVhc29uID0+IHtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIGBlcnJvciAke3RoaXMudG9waWN9YCwgcmVhc29uKVxuICAgICAgaWYodGhpcy5pc0pvaW5pbmcoKSl7IHRoaXMuam9pblB1c2gucmVzZXQoKSB9XG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZFxuICAgICAgaWYodGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSl7IHRoaXMucmVqb2luVGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgfVxuICAgIH0pXG4gICAgdGhpcy5qb2luUHVzaC5yZWNlaXZlKFwidGltZW91dFwiLCAoKSA9PiB7XG4gICAgICBpZih0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSkgdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLCBgdGltZW91dCAke3RoaXMudG9waWN9ICgke3RoaXMuam9pblJlZigpfSlgLCB0aGlzLmpvaW5QdXNoLnRpbWVvdXQpXG4gICAgICBsZXQgbGVhdmVQdXNoID0gbmV3IFB1c2godGhpcywgQ0hBTk5FTF9FVkVOVFMubGVhdmUsIGNsb3N1cmUoe30pLCB0aGlzLnRpbWVvdXQpXG4gICAgICBsZWF2ZVB1c2guc2VuZCgpXG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZFxuICAgICAgdGhpcy5qb2luUHVzaC5yZXNldCgpXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLm9uKENIQU5ORUxfRVZFTlRTLnJlcGx5LCAocGF5bG9hZCwgcmVmKSA9PiB7XG4gICAgICB0aGlzLnRyaWdnZXIodGhpcy5yZXBseUV2ZW50TmFtZShyZWYpLCBwYXlsb2FkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogSm9pbiB0aGUgY2hhbm5lbFxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbWVvdXRcbiAgICogQHJldHVybnMge1B1c2h9XG4gICAqL1xuICBqb2luKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIGlmKHRoaXMuam9pbmVkT25jZSl7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cmllZCB0byBqb2luIG11bHRpcGxlIHRpbWVzLiAnam9pbicgY2FuIG9ubHkgYmUgY2FsbGVkIGEgc2luZ2xlIHRpbWUgcGVyIGNoYW5uZWwgaW5zdGFuY2VcIilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dFxuICAgICAgdGhpcy5qb2luZWRPbmNlID0gdHJ1ZVxuICAgICAgdGhpcy5yZWpvaW4oKVxuICAgICAgcmV0dXJuIHRoaXMuam9pblB1c2hcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSG9vayBpbnRvIGNoYW5uZWwgY2xvc2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uQ2xvc2UoY2FsbGJhY2spe1xuICAgIHRoaXMub24oQ0hBTk5FTF9FVkVOVFMuY2xvc2UsIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIEhvb2sgaW50byBjaGFubmVsIGVycm9yc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25FcnJvcihjYWxsYmFjayl7XG4gICAgcmV0dXJuIHRoaXMub24oQ0hBTk5FTF9FVkVOVFMuZXJyb3IsIHJlYXNvbiA9PiBjYWxsYmFjayhyZWFzb24pKVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgb24gY2hhbm5lbCBldmVudHNcbiAgICpcbiAgICogU3Vic2NyaXB0aW9uIHJldHVybnMgYSByZWYgY291bnRlciwgd2hpY2ggY2FuIGJlIHVzZWQgbGF0ZXIgdG9cbiAgICogdW5zdWJzY3JpYmUgdGhlIGV4YWN0IGV2ZW50IGxpc3RlbmVyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IHJlZjEgPSBjaGFubmVsLm9uKFwiZXZlbnRcIiwgZG9fc3R1ZmYpXG4gICAqIGNvbnN0IHJlZjIgPSBjaGFubmVsLm9uKFwiZXZlbnRcIiwgZG9fb3RoZXJfc3R1ZmYpXG4gICAqIGNoYW5uZWwub2ZmKFwiZXZlbnRcIiwgcmVmMSlcbiAgICogLy8gU2luY2UgdW5zdWJzY3JpcHRpb24sIGRvX3N0dWZmIHdvbid0IGZpcmUsXG4gICAqIC8vIHdoaWxlIGRvX290aGVyX3N0dWZmIHdpbGwga2VlcCBmaXJpbmcgb24gdGhlIFwiZXZlbnRcIlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge2ludGVnZXJ9IHJlZlxuICAgKi9cbiAgb24oZXZlbnQsIGNhbGxiYWNrKXtcbiAgICBsZXQgcmVmID0gdGhpcy5iaW5kaW5nUmVmKytcbiAgICB0aGlzLmJpbmRpbmdzLnB1c2goe2V2ZW50LCByZWYsIGNhbGxiYWNrfSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVzIG9mZiBvZiBjaGFubmVsIGV2ZW50c1xuICAgKlxuICAgKiBVc2UgdGhlIHJlZiByZXR1cm5lZCBmcm9tIGEgY2hhbm5lbC5vbigpIHRvIHVuc3Vic2NyaWJlIG9uZVxuICAgKiBoYW5kbGVyLCBvciBwYXNzIG5vdGhpbmcgZm9yIHRoZSByZWYgdG8gdW5zdWJzY3JpYmUgYWxsXG4gICAqIGhhbmRsZXJzIGZvciB0aGUgZ2l2ZW4gZXZlbnQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFVuc3Vic2NyaWJlIHRoZSBkb19zdHVmZiBoYW5kbGVyXG4gICAqIGNvbnN0IHJlZjEgPSBjaGFubmVsLm9uKFwiZXZlbnRcIiwgZG9fc3R1ZmYpXG4gICAqIGNoYW5uZWwub2ZmKFwiZXZlbnRcIiwgcmVmMSlcbiAgICpcbiAgICogLy8gVW5zdWJzY3JpYmUgYWxsIGhhbmRsZXJzIGZyb20gZXZlbnRcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiKVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtpbnRlZ2VyfSByZWZcbiAgICovXG4gIG9mZihldmVudCwgcmVmKXtcbiAgICB0aGlzLmJpbmRpbmdzID0gdGhpcy5iaW5kaW5ncy5maWx0ZXIoKGJpbmQpID0+IHtcbiAgICAgIHJldHVybiAhKGJpbmQuZXZlbnQgPT09IGV2ZW50ICYmICh0eXBlb2YgcmVmID09PSBcInVuZGVmaW5lZFwiIHx8IHJlZiA9PT0gYmluZC5yZWYpKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhblB1c2goKXsgcmV0dXJuIHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkgJiYgdGhpcy5pc0pvaW5lZCgpIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBtZXNzYWdlIGBldmVudGAgdG8gcGhvZW5peCB3aXRoIHRoZSBwYXlsb2FkIGBwYXlsb2FkYC5cbiAgICogUGhvZW5peCByZWNlaXZlcyB0aGlzIGluIHRoZSBgaGFuZGxlX2luKGV2ZW50LCBwYXlsb2FkLCBzb2NrZXQpYFxuICAgKiBmdW5jdGlvbi4gaWYgcGhvZW5peCByZXBsaWVzIG9yIGl0IHRpbWVzIG91dCAoZGVmYXVsdCAxMDAwMG1zKSxcbiAgICogdGhlbiBvcHRpb25hbGx5IHRoZSByZXBseSBjYW4gYmUgcmVjZWl2ZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNoYW5uZWwucHVzaChcImV2ZW50XCIpXG4gICAqICAgLnJlY2VpdmUoXCJva1wiLCBwYXlsb2FkID0+IGNvbnNvbGUubG9nKFwicGhvZW5peCByZXBsaWVkOlwiLCBwYXlsb2FkKSlcbiAgICogICAucmVjZWl2ZShcImVycm9yXCIsIGVyciA9PiBjb25zb2xlLmxvZyhcInBob2VuaXggZXJyb3JlZFwiLCBlcnIpKVxuICAgKiAgIC5yZWNlaXZlKFwidGltZW91dFwiLCAoKSA9PiBjb25zb2xlLmxvZyhcInRpbWVkIG91dCBwdXNoaW5nXCIpKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIHB1c2goZXZlbnQsIHBheWxvYWQsIHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIHBheWxvYWQgPSBwYXlsb2FkIHx8IHt9XG4gICAgaWYoIXRoaXMuam9pbmVkT25jZSl7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyaWVkIHRvIHB1c2ggJyR7ZXZlbnR9JyB0byAnJHt0aGlzLnRvcGljfScgYmVmb3JlIGpvaW5pbmcuIFVzZSBjaGFubmVsLmpvaW4oKSBiZWZvcmUgcHVzaGluZyBldmVudHNgKVxuICAgIH1cbiAgICBsZXQgcHVzaEV2ZW50ID0gbmV3IFB1c2godGhpcywgZXZlbnQsIGZ1bmN0aW9uICgpeyByZXR1cm4gcGF5bG9hZCB9LCB0aW1lb3V0KVxuICAgIGlmKHRoaXMuY2FuUHVzaCgpKXtcbiAgICAgIHB1c2hFdmVudC5zZW5kKClcbiAgICB9IGVsc2Uge1xuICAgICAgcHVzaEV2ZW50LnN0YXJ0VGltZW91dCgpXG4gICAgICB0aGlzLnB1c2hCdWZmZXIucHVzaChwdXNoRXZlbnQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHB1c2hFdmVudFxuICB9XG5cbiAgLyoqIExlYXZlcyB0aGUgY2hhbm5lbFxuICAgKlxuICAgKiBVbnN1YnNjcmliZXMgZnJvbSBzZXJ2ZXIgZXZlbnRzLCBhbmRcbiAgICogaW5zdHJ1Y3RzIGNoYW5uZWwgdG8gdGVybWluYXRlIG9uIHNlcnZlclxuICAgKlxuICAgKiBUcmlnZ2VycyBvbkNsb3NlKCkgaG9va3NcbiAgICpcbiAgICogVG8gcmVjZWl2ZSBsZWF2ZSBhY2tub3dsZWRnZW1lbnRzLCB1c2UgdGhlIGByZWNlaXZlYFxuICAgKiBob29rIHRvIGJpbmQgdG8gdGhlIHNlcnZlciBhY2ssIGllOlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjaGFubmVsLmxlYXZlKCkucmVjZWl2ZShcIm9rXCIsICgpID0+IGFsZXJ0KFwibGVmdCFcIikgKVxuICAgKlxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbWVvdXRcbiAgICogQHJldHVybnMge1B1c2h9XG4gICAqL1xuICBsZWF2ZSh0aW1lb3V0ID0gdGhpcy50aW1lb3V0KXtcbiAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICB0aGlzLmpvaW5QdXNoLmNhbmNlbFRpbWVvdXQoKVxuXG4gICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmxlYXZpbmdcbiAgICBsZXQgb25DbG9zZSA9ICgpID0+IHtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIGBsZWF2ZSAke3RoaXMudG9waWN9YClcbiAgICAgIHRoaXMudHJpZ2dlcihDSEFOTkVMX0VWRU5UUy5jbG9zZSwgXCJsZWF2ZVwiKVxuICAgIH1cbiAgICBsZXQgbGVhdmVQdXNoID0gbmV3IFB1c2godGhpcywgQ0hBTk5FTF9FVkVOVFMubGVhdmUsIGNsb3N1cmUoe30pLCB0aW1lb3V0KVxuICAgIGxlYXZlUHVzaC5yZWNlaXZlKFwib2tcIiwgKCkgPT4gb25DbG9zZSgpKVxuICAgICAgLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IG9uQ2xvc2UoKSlcbiAgICBsZWF2ZVB1c2guc2VuZCgpXG4gICAgaWYoIXRoaXMuY2FuUHVzaCgpKXsgbGVhdmVQdXNoLnRyaWdnZXIoXCJva1wiLCB7fSkgfVxuXG4gICAgcmV0dXJuIGxlYXZlUHVzaFxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRhYmxlIG1lc3NhZ2UgaG9va1xuICAgKlxuICAgKiBSZWNlaXZlcyBhbGwgZXZlbnRzIGZvciBzcGVjaWFsaXplZCBtZXNzYWdlIGhhbmRsaW5nXG4gICAqIGJlZm9yZSBkaXNwYXRjaGluZyB0byB0aGUgY2hhbm5lbCBjYWxsYmFja3MuXG4gICAqXG4gICAqIE11c3QgcmV0dXJuIHRoZSBwYXlsb2FkLCBtb2RpZmllZCBvciB1bm1vZGlmaWVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IHJlZlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgb25NZXNzYWdlKF9ldmVudCwgcGF5bG9hZCwgX3JlZil7IHJldHVybiBwYXlsb2FkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzTWVtYmVyKHRvcGljLCBldmVudCwgcGF5bG9hZCwgam9pblJlZil7XG4gICAgaWYodGhpcy50b3BpYyAhPT0gdG9waWMpeyByZXR1cm4gZmFsc2UgfVxuXG4gICAgaWYoam9pblJlZiAmJiBqb2luUmVmICE9PSB0aGlzLmpvaW5SZWYoKSl7XG4gICAgICBpZih0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSkgdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLCBcImRyb3BwaW5nIG91dGRhdGVkIG1lc3NhZ2VcIiwge3RvcGljLCBldmVudCwgcGF5bG9hZCwgam9pblJlZn0pXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGpvaW5SZWYoKXsgcmV0dXJuIHRoaXMuam9pblB1c2gucmVmIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlam9pbih0aW1lb3V0ID0gdGhpcy50aW1lb3V0KXtcbiAgICBpZih0aGlzLmlzTGVhdmluZygpKXsgcmV0dXJuIH1cbiAgICB0aGlzLnNvY2tldC5sZWF2ZU9wZW5Ub3BpYyh0aGlzLnRvcGljKVxuICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5qb2luaW5nXG4gICAgdGhpcy5qb2luUHVzaC5yZXNlbmQodGltZW91dClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdHJpZ2dlcihldmVudCwgcGF5bG9hZCwgcmVmLCBqb2luUmVmKXtcbiAgICBsZXQgaGFuZGxlZFBheWxvYWQgPSB0aGlzLm9uTWVzc2FnZShldmVudCwgcGF5bG9hZCwgcmVmLCBqb2luUmVmKVxuICAgIGlmKHBheWxvYWQgJiYgIWhhbmRsZWRQYXlsb2FkKXsgdGhyb3cgbmV3IEVycm9yKFwiY2hhbm5lbCBvbk1lc3NhZ2UgY2FsbGJhY2tzIG11c3QgcmV0dXJuIHRoZSBwYXlsb2FkLCBtb2RpZmllZCBvciB1bm1vZGlmaWVkXCIpIH1cblxuICAgIGxldCBldmVudEJpbmRpbmdzID0gdGhpcy5iaW5kaW5ncy5maWx0ZXIoYmluZCA9PiBiaW5kLmV2ZW50ID09PSBldmVudClcblxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBldmVudEJpbmRpbmdzLmxlbmd0aDsgaSsrKXtcbiAgICAgIGxldCBiaW5kID0gZXZlbnRCaW5kaW5nc1tpXVxuICAgICAgYmluZC5jYWxsYmFjayhoYW5kbGVkUGF5bG9hZCwgcmVmLCBqb2luUmVmIHx8IHRoaXMuam9pblJlZigpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVwbHlFdmVudE5hbWUocmVmKXsgcmV0dXJuIGBjaGFuX3JlcGx5XyR7cmVmfWAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaXNDbG9zZWQoKXsgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmNsb3NlZCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0Vycm9yZWQoKXsgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmVycm9yZWQgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaXNKb2luZWQoKXsgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmpvaW5lZCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0pvaW5pbmcoKXsgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmpvaW5pbmcgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaXNMZWF2aW5nKCl7IHJldHVybiB0aGlzLnN0YXRlID09PSBDSEFOTkVMX1NUQVRFUy5sZWF2aW5nIH1cbn1cbiIsICJpbXBvcnQge1xuICBnbG9iYWwsXG4gIFhIUl9TVEFURVNcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWpheCB7XG5cbiAgc3RhdGljIHJlcXVlc3QobWV0aG9kLCBlbmRQb2ludCwgYWNjZXB0LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICBpZihnbG9iYWwuWERvbWFpblJlcXVlc3Qpe1xuICAgICAgbGV0IHJlcSA9IG5ldyBnbG9iYWwuWERvbWFpblJlcXVlc3QoKSAvLyBJRTgsIElFOVxuICAgICAgcmV0dXJuIHRoaXMueGRvbWFpblJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcmVxID0gbmV3IGdsb2JhbC5YTUxIdHRwUmVxdWVzdCgpIC8vIElFNyssIEZpcmVmb3gsIENocm9tZSwgT3BlcmEsIFNhZmFyaVxuICAgICAgcmV0dXJuIHRoaXMueGhyUmVxdWVzdChyZXEsIG1ldGhvZCwgZW5kUG9pbnQsIGFjY2VwdCwgYm9keSwgdGltZW91dCwgb250aW1lb3V0LCBjYWxsYmFjaylcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgeGRvbWFpblJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICByZXEudGltZW91dCA9IHRpbWVvdXRcbiAgICByZXEub3BlbihtZXRob2QsIGVuZFBvaW50KVxuICAgIHJlcS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICBsZXQgcmVzcG9uc2UgPSB0aGlzLnBhcnNlSlNPTihyZXEucmVzcG9uc2VUZXh0KVxuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socmVzcG9uc2UpXG4gICAgfVxuICAgIGlmKG9udGltZW91dCl7IHJlcS5vbnRpbWVvdXQgPSBvbnRpbWVvdXQgfVxuXG4gICAgLy8gV29yayBhcm91bmQgYnVnIGluIElFOSB0aGF0IHJlcXVpcmVzIGFuIGF0dGFjaGVkIG9ucHJvZ3Jlc3MgaGFuZGxlclxuICAgIHJlcS5vbnByb2dyZXNzID0gKCkgPT4geyB9XG5cbiAgICByZXEuc2VuZChib2R5KVxuICAgIHJldHVybiByZXFcbiAgfVxuXG4gIHN0YXRpYyB4aHJSZXF1ZXN0KHJlcSwgbWV0aG9kLCBlbmRQb2ludCwgYWNjZXB0LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICByZXEub3BlbihtZXRob2QsIGVuZFBvaW50LCB0cnVlKVxuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIGFjY2VwdClcbiAgICByZXEub25lcnJvciA9ICgpID0+IGNhbGxiYWNrICYmIGNhbGxiYWNrKG51bGwpXG4gICAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmKHJlcS5yZWFkeVN0YXRlID09PSBYSFJfU1RBVEVTLmNvbXBsZXRlICYmIGNhbGxiYWNrKXtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gdGhpcy5wYXJzZUpTT04ocmVxLnJlc3BvbnNlVGV4dClcbiAgICAgICAgY2FsbGJhY2socmVzcG9uc2UpXG4gICAgICB9XG4gICAgfVxuICAgIGlmKG9udGltZW91dCl7IHJlcS5vbnRpbWVvdXQgPSBvbnRpbWVvdXQgfVxuXG4gICAgcmVxLnNlbmQoYm9keSlcbiAgICByZXR1cm4gcmVxXG4gIH1cblxuICBzdGF0aWMgcGFyc2VKU09OKHJlc3Ape1xuICAgIGlmKCFyZXNwIHx8IHJlc3AgPT09IFwiXCIpeyByZXR1cm4gbnVsbCB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzcClcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgIGNvbnNvbGUgJiYgY29uc29sZS5sb2coXCJmYWlsZWQgdG8gcGFyc2UgSlNPTiByZXNwb25zZVwiLCByZXNwKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgc2VyaWFsaXplKG9iaiwgcGFyZW50S2V5KXtcbiAgICBsZXQgcXVlcnlTdHIgPSBbXVxuICAgIGZvcih2YXIga2V5IGluIG9iail7XG4gICAgICBpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSl7IGNvbnRpbnVlIH1cbiAgICAgIGxldCBwYXJhbUtleSA9IHBhcmVudEtleSA/IGAke3BhcmVudEtleX1bJHtrZXl9XWAgOiBrZXlcbiAgICAgIGxldCBwYXJhbVZhbCA9IG9ialtrZXldXG4gICAgICBpZih0eXBlb2YgcGFyYW1WYWwgPT09IFwib2JqZWN0XCIpe1xuICAgICAgICBxdWVyeVN0ci5wdXNoKHRoaXMuc2VyaWFsaXplKHBhcmFtVmFsLCBwYXJhbUtleSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeVN0ci5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChwYXJhbUtleSkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChwYXJhbVZhbCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBxdWVyeVN0ci5qb2luKFwiJlwiKVxuICB9XG5cbiAgc3RhdGljIGFwcGVuZFBhcmFtcyh1cmwsIHBhcmFtcyl7XG4gICAgaWYoT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGggPT09IDApeyByZXR1cm4gdXJsIH1cblxuICAgIGxldCBwcmVmaXggPSB1cmwubWF0Y2goL1xcPy8pID8gXCImXCIgOiBcIj9cIlxuICAgIHJldHVybiBgJHt1cmx9JHtwcmVmaXh9JHt0aGlzLnNlcmlhbGl6ZShwYXJhbXMpfWBcbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIFNPQ0tFVF9TVEFURVMsXG4gIFRSQU5TUE9SVFNcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IEFqYXggZnJvbSBcIi4vYWpheFwiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvbmdQb2xsIHtcblxuICBjb25zdHJ1Y3RvcihlbmRQb2ludCl7XG4gICAgdGhpcy5lbmRQb2ludCA9IG51bGxcbiAgICB0aGlzLnRva2VuID0gbnVsbFxuICAgIHRoaXMuc2tpcEhlYXJ0YmVhdCA9IHRydWVcbiAgICB0aGlzLnJlcXMgPSBuZXcgU2V0KClcbiAgICB0aGlzLm9ub3BlbiA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9uZXJyb3IgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgdGhpcy5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgdGhpcy5vbmNsb3NlID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgIHRoaXMucG9sbEVuZHBvaW50ID0gdGhpcy5ub3JtYWxpemVFbmRwb2ludChlbmRQb2ludClcbiAgICB0aGlzLnJlYWR5U3RhdGUgPSBTT0NLRVRfU1RBVEVTLmNvbm5lY3RpbmdcbiAgICB0aGlzLnBvbGwoKVxuICB9XG5cbiAgbm9ybWFsaXplRW5kcG9pbnQoZW5kUG9pbnQpe1xuICAgIHJldHVybiAoZW5kUG9pbnRcbiAgICAgIC5yZXBsYWNlKFwid3M6Ly9cIiwgXCJodHRwOi8vXCIpXG4gICAgICAucmVwbGFjZShcIndzczovL1wiLCBcImh0dHBzOi8vXCIpXG4gICAgICAucmVwbGFjZShuZXcgUmVnRXhwKFwiKC4qKVxcL1wiICsgVFJBTlNQT1JUUy53ZWJzb2NrZXQpLCBcIiQxL1wiICsgVFJBTlNQT1JUUy5sb25ncG9sbCkpXG4gIH1cblxuICBlbmRwb2ludFVSTCgpe1xuICAgIHJldHVybiBBamF4LmFwcGVuZFBhcmFtcyh0aGlzLnBvbGxFbmRwb2ludCwge3Rva2VuOiB0aGlzLnRva2VufSlcbiAgfVxuXG4gIGNsb3NlQW5kUmV0cnkoY29kZSwgcmVhc29uLCB3YXNDbGVhbil7XG4gICAgdGhpcy5jbG9zZShjb2RlLCByZWFzb24sIHdhc0NsZWFuKVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuICB9XG5cbiAgb250aW1lb3V0KCl7XG4gICAgdGhpcy5vbmVycm9yKFwidGltZW91dFwiKVxuICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgxMDA1LCBcInRpbWVvdXRcIiwgZmFsc2UpXG4gIH1cblxuICBpc0FjdGl2ZSgpeyByZXR1cm4gdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLm9wZW4gfHwgdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLmNvbm5lY3RpbmcgfVxuXG4gIHBvbGwoKXtcbiAgICB0aGlzLmFqYXgoXCJHRVRcIiwgbnVsbCwgKCkgPT4gdGhpcy5vbnRpbWVvdXQoKSwgcmVzcCA9PiB7XG4gICAgICBpZihyZXNwKXtcbiAgICAgICAgdmFyIHtzdGF0dXMsIHRva2VuLCBtZXNzYWdlc30gPSByZXNwXG4gICAgICAgIHRoaXMudG9rZW4gPSB0b2tlblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdHVzID0gMFxuICAgICAgfVxuXG4gICAgICBzd2l0Y2goc3RhdHVzKXtcbiAgICAgICAgY2FzZSAyMDA6XG4gICAgICAgICAgbWVzc2FnZXMuZm9yRWFjaChtc2cgPT4ge1xuICAgICAgICAgICAgLy8gVGFza3MgYXJlIHdoYXQgdGhpbmdzIGxpa2UgZXZlbnQgaGFuZGxlcnMsIHNldFRpbWVvdXQgY2FsbGJhY2tzLFxuICAgICAgICAgICAgLy8gcHJvbWlzZSByZXNvbHZlcyBhbmQgbW9yZSBhcmUgcnVuIHdpdGhpbi5cbiAgICAgICAgICAgIC8vIEluIG1vZGVybiBicm93c2VycywgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQga2luZHMgb2YgdGFza3MsXG4gICAgICAgICAgICAvLyBtaWNyb3Rhc2tzIGFuZCBtYWNyb3Rhc2tzLlxuICAgICAgICAgICAgLy8gTWljcm90YXNrcyBhcmUgbWFpbmx5IHVzZWQgZm9yIFByb21pc2VzLCB3aGlsZSBtYWNyb3Rhc2tzIGFyZVxuICAgICAgICAgICAgLy8gdXNlZCBmb3IgZXZlcnl0aGluZyBlbHNlLlxuICAgICAgICAgICAgLy8gTWljcm90YXNrcyBhbHdheXMgaGF2ZSBwcmlvcml0eSBvdmVyIG1hY3JvdGFza3MuIElmIHRoZSBKUyBlbmdpbmVcbiAgICAgICAgICAgIC8vIGlzIGxvb2tpbmcgZm9yIGEgdGFzayB0byBydW4sIGl0IHdpbGwgYWx3YXlzIHRyeSB0byBlbXB0eSB0aGVcbiAgICAgICAgICAgIC8vIG1pY3JvdGFzayBxdWV1ZSBiZWZvcmUgYXR0ZW1wdGluZyB0byBydW4gYW55dGhpbmcgZnJvbSB0aGVcbiAgICAgICAgICAgIC8vIG1hY3JvdGFzayBxdWV1ZS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBGb3IgdGhlIFdlYlNvY2tldCB0cmFuc3BvcnQsIG1lc3NhZ2VzIGFsd2F5cyBhcnJpdmUgaW4gdGhlaXIgb3duXG4gICAgICAgICAgICAvLyBldmVudC4gVGhpcyBtZWFucyB0aGF0IGlmIGFueSBwcm9taXNlcyBhcmUgcmVzb2x2ZWQgZnJvbSB3aXRoaW4sXG4gICAgICAgICAgICAvLyB0aGVpciBjYWxsYmFja3Mgd2lsbCBhbHdheXMgZmluaXNoIGV4ZWN1dGlvbiBieSB0aGUgdGltZSB0aGVcbiAgICAgICAgICAgIC8vIG5leHQgbWVzc2FnZSBldmVudCBoYW5kbGVyIGlzIHJ1bi5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJbiBvcmRlciB0byBlbXVsYXRlIHRoaXMgYmVoYXZpb3VyLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBlYWNoXG4gICAgICAgICAgICAvLyBvbm1lc3NhZ2UgaGFuZGxlciBpcyBydW4gd2l0aGluIGl0J3Mgb3duIG1hY3JvdGFzay5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbm1lc3NhZ2Uoe2RhdGE6IG1zZ30pLCAwKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy5wb2xsKClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICB0aGlzLnBvbGwoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDEwOlxuICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMub3BlblxuICAgICAgICAgIHRoaXMub25vcGVuKHt9KVxuICAgICAgICAgIHRoaXMucG9sbCgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKDQwMylcbiAgICAgICAgICB0aGlzLmNsb3NlKDEwMDgsIFwiZm9yYmlkZGVuXCIsIGZhbHNlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSA1MDA6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKDUwMClcbiAgICAgICAgICB0aGlzLmNsb3NlQW5kUmV0cnkoMTAxMSwgXCJpbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgNTAwKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgdW5oYW5kbGVkIHBvbGwgc3RhdHVzICR7c3RhdHVzfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHNlbmQoYm9keSl7XG4gICAgdGhpcy5hamF4KFwiUE9TVFwiLCBib2R5LCAoKSA9PiB0aGlzLm9uZXJyb3IoXCJ0aW1lb3V0XCIpLCByZXNwID0+IHtcbiAgICAgIGlmKCFyZXNwIHx8IHJlc3Auc3RhdHVzICE9PSAyMDApe1xuICAgICAgICB0aGlzLm9uZXJyb3IocmVzcCAmJiByZXNwLnN0YXR1cylcbiAgICAgICAgdGhpcy5jbG9zZUFuZFJldHJ5KDEwMTEsIFwiaW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIGZhbHNlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBjbG9zZShjb2RlLCByZWFzb24sIHdhc0NsZWFuKXtcbiAgICBmb3IobGV0IHJlcSBvZiB0aGlzLnJlcXMpeyByZXEuYWJvcnQoKSB9XG4gICAgdGhpcy5yZWFkeVN0YXRlID0gU09DS0VUX1NUQVRFUy5jbG9zZWRcbiAgICBsZXQgb3B0cyA9IE9iamVjdC5hc3NpZ24oe2NvZGU6IDEwMDAsIHJlYXNvbjogdW5kZWZpbmVkLCB3YXNDbGVhbjogdHJ1ZX0sIHtjb2RlLCByZWFzb24sIHdhc0NsZWFufSlcbiAgICBpZih0eXBlb2YoQ2xvc2VFdmVudCkgIT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgdGhpcy5vbmNsb3NlKG5ldyBDbG9zZUV2ZW50KFwiY2xvc2VcIiwgb3B0cykpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25jbG9zZShvcHRzKVxuICAgIH1cbiAgfVxuXG4gIGFqYXgobWV0aG9kLCBib2R5LCBvbkNhbGxlclRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICBsZXQgcmVxXG4gICAgbGV0IG9udGltZW91dCA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVxcy5kZWxldGUocmVxKVxuICAgICAgb25DYWxsZXJUaW1lb3V0KClcbiAgICB9XG4gICAgcmVxID0gQWpheC5yZXF1ZXN0KG1ldGhvZCwgdGhpcy5lbmRwb2ludFVSTCgpLCBcImFwcGxpY2F0aW9uL2pzb25cIiwgYm9keSwgdGhpcy50aW1lb3V0LCBvbnRpbWVvdXQsIHJlc3AgPT4ge1xuICAgICAgdGhpcy5yZXFzLmRlbGV0ZShyZXEpXG4gICAgICBpZih0aGlzLmlzQWN0aXZlKCkpeyBjYWxsYmFjayhyZXNwKSB9XG4gICAgfSlcbiAgICB0aGlzLnJlcXMuYWRkKHJlcSlcbiAgfVxufVxuIiwgIi8qKlxuICogSW5pdGlhbGl6ZXMgdGhlIFByZXNlbmNlXG4gKiBAcGFyYW0ge0NoYW5uZWx9IGNoYW5uZWwgLSBUaGUgQ2hhbm5lbFxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgb3B0aW9ucyxcbiAqICAgICAgICBmb3IgZXhhbXBsZSBge2V2ZW50czoge3N0YXRlOiBcInN0YXRlXCIsIGRpZmY6IFwiZGlmZlwifX1gXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByZXNlbmNlIHtcblxuICBjb25zdHJ1Y3RvcihjaGFubmVsLCBvcHRzID0ge30pe1xuICAgIGxldCBldmVudHMgPSBvcHRzLmV2ZW50cyB8fCB7c3RhdGU6IFwicHJlc2VuY2Vfc3RhdGVcIiwgZGlmZjogXCJwcmVzZW5jZV9kaWZmXCJ9XG4gICAgdGhpcy5zdGF0ZSA9IHt9XG4gICAgdGhpcy5wZW5kaW5nRGlmZnMgPSBbXVxuICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWxcbiAgICB0aGlzLmpvaW5SZWYgPSBudWxsXG4gICAgdGhpcy5jYWxsZXIgPSB7XG4gICAgICBvbkpvaW46IGZ1bmN0aW9uICgpeyB9LFxuICAgICAgb25MZWF2ZTogZnVuY3Rpb24gKCl7IH0sXG4gICAgICBvblN5bmM6IGZ1bmN0aW9uICgpeyB9XG4gICAgfVxuXG4gICAgdGhpcy5jaGFubmVsLm9uKGV2ZW50cy5zdGF0ZSwgbmV3U3RhdGUgPT4ge1xuICAgICAgbGV0IHtvbkpvaW4sIG9uTGVhdmUsIG9uU3luY30gPSB0aGlzLmNhbGxlclxuXG4gICAgICB0aGlzLmpvaW5SZWYgPSB0aGlzLmNoYW5uZWwuam9pblJlZigpXG4gICAgICB0aGlzLnN0YXRlID0gUHJlc2VuY2Uuc3luY1N0YXRlKHRoaXMuc3RhdGUsIG5ld1N0YXRlLCBvbkpvaW4sIG9uTGVhdmUpXG5cbiAgICAgIHRoaXMucGVuZGluZ0RpZmZzLmZvckVhY2goZGlmZiA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBQcmVzZW5jZS5zeW5jRGlmZih0aGlzLnN0YXRlLCBkaWZmLCBvbkpvaW4sIG9uTGVhdmUpXG4gICAgICB9KVxuICAgICAgdGhpcy5wZW5kaW5nRGlmZnMgPSBbXVxuICAgICAgb25TeW5jKClcbiAgICB9KVxuXG4gICAgdGhpcy5jaGFubmVsLm9uKGV2ZW50cy5kaWZmLCBkaWZmID0+IHtcbiAgICAgIGxldCB7b25Kb2luLCBvbkxlYXZlLCBvblN5bmN9ID0gdGhpcy5jYWxsZXJcblxuICAgICAgaWYodGhpcy5pblBlbmRpbmdTeW5jU3RhdGUoKSl7XG4gICAgICAgIHRoaXMucGVuZGluZ0RpZmZzLnB1c2goZGlmZilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBQcmVzZW5jZS5zeW5jRGlmZih0aGlzLnN0YXRlLCBkaWZmLCBvbkpvaW4sIG9uTGVhdmUpXG4gICAgICAgIG9uU3luYygpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIG9uSm9pbihjYWxsYmFjayl7IHRoaXMuY2FsbGVyLm9uSm9pbiA9IGNhbGxiYWNrIH1cblxuICBvbkxlYXZlKGNhbGxiYWNrKXsgdGhpcy5jYWxsZXIub25MZWF2ZSA9IGNhbGxiYWNrIH1cblxuICBvblN5bmMoY2FsbGJhY2speyB0aGlzLmNhbGxlci5vblN5bmMgPSBjYWxsYmFjayB9XG5cbiAgbGlzdChieSl7IHJldHVybiBQcmVzZW5jZS5saXN0KHRoaXMuc3RhdGUsIGJ5KSB9XG5cbiAgaW5QZW5kaW5nU3luY1N0YXRlKCl7XG4gICAgcmV0dXJuICF0aGlzLmpvaW5SZWYgfHwgKHRoaXMuam9pblJlZiAhPT0gdGhpcy5jaGFubmVsLmpvaW5SZWYoKSlcbiAgfVxuXG4gIC8vIGxvd2VyLWxldmVsIHB1YmxpYyBzdGF0aWMgQVBJXG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gc3luYyB0aGUgbGlzdCBvZiBwcmVzZW5jZXMgb24gdGhlIHNlcnZlclxuICAgKiB3aXRoIHRoZSBjbGllbnQncyBzdGF0ZS4gQW4gb3B0aW9uYWwgYG9uSm9pbmAgYW5kIGBvbkxlYXZlYCBjYWxsYmFjayBjYW5cbiAgICogYmUgcHJvdmlkZWQgdG8gcmVhY3QgdG8gY2hhbmdlcyBpbiB0aGUgY2xpZW50J3MgbG9jYWwgcHJlc2VuY2VzIGFjcm9zc1xuICAgKiBkaXNjb25uZWN0cyBhbmQgcmVjb25uZWN0cyB3aXRoIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcmVzZW5jZX1cbiAgICovXG4gIHN0YXRpYyBzeW5jU3RhdGUoY3VycmVudFN0YXRlLCBuZXdTdGF0ZSwgb25Kb2luLCBvbkxlYXZlKXtcbiAgICBsZXQgc3RhdGUgPSB0aGlzLmNsb25lKGN1cnJlbnRTdGF0ZSlcbiAgICBsZXQgam9pbnMgPSB7fVxuICAgIGxldCBsZWF2ZXMgPSB7fVxuXG4gICAgdGhpcy5tYXAoc3RhdGUsIChrZXksIHByZXNlbmNlKSA9PiB7XG4gICAgICBpZighbmV3U3RhdGVba2V5XSl7XG4gICAgICAgIGxlYXZlc1trZXldID0gcHJlc2VuY2VcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMubWFwKG5ld1N0YXRlLCAoa2V5LCBuZXdQcmVzZW5jZSkgPT4ge1xuICAgICAgbGV0IGN1cnJlbnRQcmVzZW5jZSA9IHN0YXRlW2tleV1cbiAgICAgIGlmKGN1cnJlbnRQcmVzZW5jZSl7XG4gICAgICAgIGxldCBuZXdSZWZzID0gbmV3UHJlc2VuY2UubWV0YXMubWFwKG0gPT4gbS5waHhfcmVmKVxuICAgICAgICBsZXQgY3VyUmVmcyA9IGN1cnJlbnRQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBqb2luZWRNZXRhcyA9IG5ld1ByZXNlbmNlLm1ldGFzLmZpbHRlcihtID0+IGN1clJlZnMuaW5kZXhPZihtLnBoeF9yZWYpIDwgMClcbiAgICAgICAgbGV0IGxlZnRNZXRhcyA9IGN1cnJlbnRQcmVzZW5jZS5tZXRhcy5maWx0ZXIobSA9PiBuZXdSZWZzLmluZGV4T2YobS5waHhfcmVmKSA8IDApXG4gICAgICAgIGlmKGpvaW5lZE1ldGFzLmxlbmd0aCA+IDApe1xuICAgICAgICAgIGpvaW5zW2tleV0gPSBuZXdQcmVzZW5jZVxuICAgICAgICAgIGpvaW5zW2tleV0ubWV0YXMgPSBqb2luZWRNZXRhc1xuICAgICAgICB9XG4gICAgICAgIGlmKGxlZnRNZXRhcy5sZW5ndGggPiAwKXtcbiAgICAgICAgICBsZWF2ZXNba2V5XSA9IHRoaXMuY2xvbmUoY3VycmVudFByZXNlbmNlKVxuICAgICAgICAgIGxlYXZlc1trZXldLm1ldGFzID0gbGVmdE1ldGFzXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpvaW5zW2tleV0gPSBuZXdQcmVzZW5jZVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHRoaXMuc3luY0RpZmYoc3RhdGUsIHtqb2luczogam9pbnMsIGxlYXZlczogbGVhdmVzfSwgb25Kb2luLCBvbkxlYXZlKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFVzZWQgdG8gc3luYyBhIGRpZmYgb2YgcHJlc2VuY2Ugam9pbiBhbmQgbGVhdmVcbiAgICogZXZlbnRzIGZyb20gdGhlIHNlcnZlciwgYXMgdGhleSBoYXBwZW4uIExpa2UgYHN5bmNTdGF0ZWAsIGBzeW5jRGlmZmBcbiAgICogYWNjZXB0cyBvcHRpb25hbCBgb25Kb2luYCBhbmQgYG9uTGVhdmVgIGNhbGxiYWNrcyB0byByZWFjdCB0byBhIHVzZXJcbiAgICogam9pbmluZyBvciBsZWF2aW5nIGZyb20gYSBkZXZpY2UuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcmVzZW5jZX1cbiAgICovXG4gIHN0YXRpYyBzeW5jRGlmZihzdGF0ZSwgZGlmZiwgb25Kb2luLCBvbkxlYXZlKXtcbiAgICBsZXQge2pvaW5zLCBsZWF2ZXN9ID0gdGhpcy5jbG9uZShkaWZmKVxuICAgIGlmKCFvbkpvaW4peyBvbkpvaW4gPSBmdW5jdGlvbiAoKXsgfSB9XG4gICAgaWYoIW9uTGVhdmUpeyBvbkxlYXZlID0gZnVuY3Rpb24gKCl7IH0gfVxuXG4gICAgdGhpcy5tYXAoam9pbnMsIChrZXksIG5ld1ByZXNlbmNlKSA9PiB7XG4gICAgICBsZXQgY3VycmVudFByZXNlbmNlID0gc3RhdGVba2V5XVxuICAgICAgc3RhdGVba2V5XSA9IHRoaXMuY2xvbmUobmV3UHJlc2VuY2UpXG4gICAgICBpZihjdXJyZW50UHJlc2VuY2Upe1xuICAgICAgICBsZXQgam9pbmVkUmVmcyA9IHN0YXRlW2tleV0ubWV0YXMubWFwKG0gPT4gbS5waHhfcmVmKVxuICAgICAgICBsZXQgY3VyTWV0YXMgPSBjdXJyZW50UHJlc2VuY2UubWV0YXMuZmlsdGVyKG0gPT4gam9pbmVkUmVmcy5pbmRleE9mKG0ucGh4X3JlZikgPCAwKVxuICAgICAgICBzdGF0ZVtrZXldLm1ldGFzLnVuc2hpZnQoLi4uY3VyTWV0YXMpXG4gICAgICB9XG4gICAgICBvbkpvaW4oa2V5LCBjdXJyZW50UHJlc2VuY2UsIG5ld1ByZXNlbmNlKVxuICAgIH0pXG4gICAgdGhpcy5tYXAobGVhdmVzLCAoa2V5LCBsZWZ0UHJlc2VuY2UpID0+IHtcbiAgICAgIGxldCBjdXJyZW50UHJlc2VuY2UgPSBzdGF0ZVtrZXldXG4gICAgICBpZighY3VycmVudFByZXNlbmNlKXsgcmV0dXJuIH1cbiAgICAgIGxldCByZWZzVG9SZW1vdmUgPSBsZWZ0UHJlc2VuY2UubWV0YXMubWFwKG0gPT4gbS5waHhfcmVmKVxuICAgICAgY3VycmVudFByZXNlbmNlLm1ldGFzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLmZpbHRlcihwID0+IHtcbiAgICAgICAgcmV0dXJuIHJlZnNUb1JlbW92ZS5pbmRleE9mKHAucGh4X3JlZikgPCAwXG4gICAgICB9KVxuICAgICAgb25MZWF2ZShrZXksIGN1cnJlbnRQcmVzZW5jZSwgbGVmdFByZXNlbmNlKVxuICAgICAgaWYoY3VycmVudFByZXNlbmNlLm1ldGFzLmxlbmd0aCA9PT0gMCl7XG4gICAgICAgIGRlbGV0ZSBzdGF0ZVtrZXldXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gc3RhdGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcmVzZW5jZXMsIHdpdGggc2VsZWN0ZWQgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcmVzZW5jZXNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2hvb3NlclxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJlc2VuY2V9XG4gICAqL1xuICBzdGF0aWMgbGlzdChwcmVzZW5jZXMsIGNob29zZXIpe1xuICAgIGlmKCFjaG9vc2VyKXsgY2hvb3NlciA9IGZ1bmN0aW9uIChrZXksIHByZXMpeyByZXR1cm4gcHJlcyB9IH1cblxuICAgIHJldHVybiB0aGlzLm1hcChwcmVzZW5jZXMsIChrZXksIHByZXNlbmNlKSA9PiB7XG4gICAgICByZXR1cm4gY2hvb3NlcihrZXksIHByZXNlbmNlKVxuICAgIH0pXG4gIH1cblxuICAvLyBwcml2YXRlXG5cbiAgc3RhdGljIG1hcChvYmosIGZ1bmMpe1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLm1hcChrZXkgPT4gZnVuYyhrZXksIG9ialtrZXldKSlcbiAgfVxuXG4gIHN0YXRpYyBjbG9uZShvYmopeyByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKSB9XG59XG4iLCAiLyogVGhlIGRlZmF1bHQgc2VyaWFsaXplciBmb3IgZW5jb2RpbmcgYW5kIGRlY29kaW5nIG1lc3NhZ2VzICovXG5pbXBvcnQge1xuICBDSEFOTkVMX0VWRU5UU1xufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIEhFQURFUl9MRU5HVEg6IDEsXG4gIE1FVEFfTEVOR1RIOiA0LFxuICBLSU5EUzoge3B1c2g6IDAsIHJlcGx5OiAxLCBicm9hZGNhc3Q6IDJ9LFxuXG4gIGVuY29kZShtc2csIGNhbGxiYWNrKXtcbiAgICBpZihtc2cucGF5bG9hZC5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpe1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuYmluYXJ5RW5jb2RlKG1zZykpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBwYXlsb2FkID0gW21zZy5qb2luX3JlZiwgbXNnLnJlZiwgbXNnLnRvcGljLCBtc2cuZXZlbnQsIG1zZy5wYXlsb2FkXVxuICAgICAgcmV0dXJuIGNhbGxiYWNrKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKVxuICAgIH1cbiAgfSxcblxuICBkZWNvZGUocmF3UGF5bG9hZCwgY2FsbGJhY2spe1xuICAgIGlmKHJhd1BheWxvYWQuY29uc3RydWN0b3IgPT09IEFycmF5QnVmZmVyKXtcbiAgICAgIHJldHVybiBjYWxsYmFjayh0aGlzLmJpbmFyeURlY29kZShyYXdQYXlsb2FkKSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IFtqb2luX3JlZiwgcmVmLCB0b3BpYywgZXZlbnQsIHBheWxvYWRdID0gSlNPTi5wYXJzZShyYXdQYXlsb2FkKVxuICAgICAgcmV0dXJuIGNhbGxiYWNrKHtqb2luX3JlZiwgcmVmLCB0b3BpYywgZXZlbnQsIHBheWxvYWR9KVxuICAgIH1cbiAgfSxcblxuICAvLyBwcml2YXRlXG5cbiAgYmluYXJ5RW5jb2RlKG1lc3NhZ2Upe1xuICAgIGxldCB7am9pbl9yZWYsIHJlZiwgZXZlbnQsIHRvcGljLCBwYXlsb2FkfSA9IG1lc3NhZ2VcbiAgICBsZXQgbWV0YUxlbmd0aCA9IHRoaXMuTUVUQV9MRU5HVEggKyBqb2luX3JlZi5sZW5ndGggKyByZWYubGVuZ3RoICsgdG9waWMubGVuZ3RoICsgZXZlbnQubGVuZ3RoXG4gICAgbGV0IGhlYWRlciA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLkhFQURFUl9MRU5HVEggKyBtZXRhTGVuZ3RoKVxuICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGhlYWRlcilcbiAgICBsZXQgb2Zmc2V0ID0gMFxuXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgdGhpcy5LSU5EUy5wdXNoKSAvLyBraW5kXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgam9pbl9yZWYubGVuZ3RoKVxuICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIHJlZi5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgdG9waWMubGVuZ3RoKVxuICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGV2ZW50Lmxlbmd0aClcbiAgICBBcnJheS5mcm9tKGpvaW5fcmVmLCBjaGFyID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpXG4gICAgQXJyYXkuZnJvbShyZWYsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKHRvcGljLCBjaGFyID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpXG4gICAgQXJyYXkuZnJvbShldmVudCwgY2hhciA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKVxuXG4gICAgdmFyIGNvbWJpbmVkID0gbmV3IFVpbnQ4QXJyYXkoaGVhZGVyLmJ5dGVMZW5ndGggKyBwYXlsb2FkLmJ5dGVMZW5ndGgpXG4gICAgY29tYmluZWQuc2V0KG5ldyBVaW50OEFycmF5KGhlYWRlciksIDApXG4gICAgY29tYmluZWQuc2V0KG5ldyBVaW50OEFycmF5KHBheWxvYWQpLCBoZWFkZXIuYnl0ZUxlbmd0aClcblxuICAgIHJldHVybiBjb21iaW5lZC5idWZmZXJcbiAgfSxcblxuICBiaW5hcnlEZWNvZGUoYnVmZmVyKXtcbiAgICBsZXQgdmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIpXG4gICAgbGV0IGtpbmQgPSB2aWV3LmdldFVpbnQ4KDApXG4gICAgbGV0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKVxuICAgIHN3aXRjaChraW5kKXtcbiAgICAgIGNhc2UgdGhpcy5LSU5EUy5wdXNoOiByZXR1cm4gdGhpcy5kZWNvZGVQdXNoKGJ1ZmZlciwgdmlldywgZGVjb2RlcilcbiAgICAgIGNhc2UgdGhpcy5LSU5EUy5yZXBseTogcmV0dXJuIHRoaXMuZGVjb2RlUmVwbHkoYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgICAgY2FzZSB0aGlzLktJTkRTLmJyb2FkY2FzdDogcmV0dXJuIHRoaXMuZGVjb2RlQnJvYWRjYXN0KGJ1ZmZlciwgdmlldywgZGVjb2RlcilcbiAgICB9XG4gIH0sXG5cbiAgZGVjb2RlUHVzaChidWZmZXIsIHZpZXcsIGRlY29kZXIpe1xuICAgIGxldCBqb2luUmVmU2l6ZSA9IHZpZXcuZ2V0VWludDgoMSlcbiAgICBsZXQgdG9waWNTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCBldmVudFNpemUgPSB2aWV3LmdldFVpbnQ4KDMpXG4gICAgbGV0IG9mZnNldCA9IHRoaXMuSEVBREVSX0xFTkdUSCArIHRoaXMuTUVUQV9MRU5HVEggLSAxIC8vIHB1c2hlcyBoYXZlIG5vIHJlZlxuICAgIGxldCBqb2luUmVmID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgam9pblJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGpvaW5SZWZTaXplXG4gICAgbGV0IHRvcGljID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdG9waWNTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyB0b3BpY1NpemVcbiAgICBsZXQgZXZlbnQgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBldmVudFNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGV2ZW50U2l6ZVxuICAgIGxldCBkYXRhID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgcmV0dXJuIHtqb2luX3JlZjogam9pblJlZiwgcmVmOiBudWxsLCB0b3BpYzogdG9waWMsIGV2ZW50OiBldmVudCwgcGF5bG9hZDogZGF0YX1cbiAgfSxcblxuICBkZWNvZGVSZXBseShidWZmZXIsIHZpZXcsIGRlY29kZXIpe1xuICAgIGxldCBqb2luUmVmU2l6ZSA9IHZpZXcuZ2V0VWludDgoMSlcbiAgICBsZXQgcmVmU2l6ZSA9IHZpZXcuZ2V0VWludDgoMilcbiAgICBsZXQgdG9waWNTaXplID0gdmlldy5nZXRVaW50OCgzKVxuICAgIGxldCBldmVudFNpemUgPSB2aWV3LmdldFVpbnQ4KDQpXG4gICAgbGV0IG9mZnNldCA9IHRoaXMuSEVBREVSX0xFTkdUSCArIHRoaXMuTUVUQV9MRU5HVEhcbiAgICBsZXQgam9pblJlZiA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGpvaW5SZWZTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyBqb2luUmVmU2l6ZVxuICAgIGxldCByZWYgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyByZWZTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyByZWZTaXplXG4gICAgbGV0IHRvcGljID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdG9waWNTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyB0b3BpY1NpemVcbiAgICBsZXQgZXZlbnQgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBldmVudFNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGV2ZW50U2l6ZVxuICAgIGxldCBkYXRhID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgbGV0IHBheWxvYWQgPSB7c3RhdHVzOiBldmVudCwgcmVzcG9uc2U6IGRhdGF9XG4gICAgcmV0dXJuIHtqb2luX3JlZjogam9pblJlZiwgcmVmOiByZWYsIHRvcGljOiB0b3BpYywgZXZlbnQ6IENIQU5ORUxfRVZFTlRTLnJlcGx5LCBwYXlsb2FkOiBwYXlsb2FkfVxuICB9LFxuXG4gIGRlY29kZUJyb2FkY2FzdChidWZmZXIsIHZpZXcsIGRlY29kZXIpe1xuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDEpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoMilcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgMlxuICAgIGxldCB0b3BpYyA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHRvcGljU2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgdG9waWNTaXplXG4gICAgbGV0IGV2ZW50ID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgZXZlbnRTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyBldmVudFNpemVcbiAgICBsZXQgZGF0YSA9IGJ1ZmZlci5zbGljZShvZmZzZXQsIGJ1ZmZlci5ieXRlTGVuZ3RoKVxuXG4gICAgcmV0dXJuIHtqb2luX3JlZjogbnVsbCwgcmVmOiBudWxsLCB0b3BpYzogdG9waWMsIGV2ZW50OiBldmVudCwgcGF5bG9hZDogZGF0YX1cbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIGdsb2JhbCxcbiAgcGh4V2luZG93LFxuICBDSEFOTkVMX0VWRU5UUyxcbiAgREVGQVVMVF9USU1FT1VULFxuICBERUZBVUxUX1ZTTixcbiAgU09DS0VUX1NUQVRFUyxcbiAgVFJBTlNQT1JUUyxcbiAgV1NfQ0xPU0VfTk9STUFMXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb3N1cmVcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgQWpheCBmcm9tIFwiLi9hamF4XCJcbmltcG9ydCBDaGFubmVsIGZyb20gXCIuL2NoYW5uZWxcIlxuaW1wb3J0IExvbmdQb2xsIGZyb20gXCIuL2xvbmdwb2xsXCJcbmltcG9ydCBTZXJpYWxpemVyIGZyb20gXCIuL3NlcmlhbGl6ZXJcIlxuaW1wb3J0IFRpbWVyIGZyb20gXCIuL3RpbWVyXCJcblxuLyoqIEluaXRpYWxpemVzIHRoZSBTb2NrZXQgKlxuICpcbiAqIEZvciBJRTggc3VwcG9ydCB1c2UgYW4gRVM1LXNoaW0gKGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5kUG9pbnQgLSBUaGUgc3RyaW5nIFdlYlNvY2tldCBlbmRwb2ludCwgaWUsIGBcIndzOi8vZXhhbXBsZS5jb20vc29ja2V0XCJgLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIndzczovL2V4YW1wbGUuY29tXCJgXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiL3NvY2tldFwiYCAoaW5oZXJpdGVkIGhvc3QgJiBwcm90b2NvbClcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy50cmFuc3BvcnRdIC0gVGhlIFdlYnNvY2tldCBUcmFuc3BvcnQsIGZvciBleGFtcGxlIFdlYlNvY2tldCBvciBQaG9lbml4LkxvbmdQb2xsLlxuICpcbiAqIERlZmF1bHRzIHRvIFdlYlNvY2tldCB3aXRoIGF1dG9tYXRpYyBMb25nUG9sbCBmYWxsYmFjay5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLmVuY29kZV0gLSBUaGUgZnVuY3Rpb24gdG8gZW5jb2RlIG91dGdvaW5nIG1lc3NhZ2VzLlxuICpcbiAqIERlZmF1bHRzIHRvIEpTT04gZW5jb2Rlci5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5kZWNvZGVdIC0gVGhlIGZ1bmN0aW9uIHRvIGRlY29kZSBpbmNvbWluZyBtZXNzYWdlcy5cbiAqXG4gKiBEZWZhdWx0cyB0byBKU09OOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIChwYXlsb2FkLCBjYWxsYmFjaykgPT4gY2FsbGJhY2soSlNPTi5wYXJzZShwYXlsb2FkKSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy50aW1lb3V0XSAtIFRoZSBkZWZhdWx0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHRyaWdnZXIgcHVzaCB0aW1lb3V0cy5cbiAqXG4gKiBEZWZhdWx0cyBgREVGQVVMVF9USU1FT1VUYFxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmhlYXJ0YmVhdEludGVydmFsTXNdIC0gVGhlIG1pbGxpc2VjIGludGVydmFsIHRvIHNlbmQgYSBoZWFydGJlYXQgbWVzc2FnZVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnJlY29ubmVjdEFmdGVyTXNdIC0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbWlsbGlzZWNcbiAqIHNvY2tldCByZWNvbm5lY3QgaW50ZXJ2YWwuXG4gKlxuICogRGVmYXVsdHMgdG8gc3RlcHBlZCBiYWNrb2ZmIG9mOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGZ1bmN0aW9uKHRyaWVzKXtcbiAqICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAqIH1cbiAqIGBgYGBcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMucmVqb2luQWZ0ZXJNc10gLSBUaGUgb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtaWxsaXNlY1xuICogcmVqb2luIGludGVydmFsIGZvciBpbmRpdmlkdWFsIGNoYW5uZWxzLlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGZ1bmN0aW9uKHRyaWVzKXtcbiAqICAgcmV0dXJuIFsxMDAwLCAyMDAwLCA1MDAwXVt0cmllcyAtIDFdIHx8IDEwMDAwXG4gKiB9XG4gKiBgYGBgXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMubG9nZ2VyXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiBmb3Igc3BlY2lhbGl6ZWQgbG9nZ2luZywgaWU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogZnVuY3Rpb24oa2luZCwgbXNnLCBkYXRhKSB7XG4gKiAgIGNvbnNvbGUubG9nKGAke2tpbmR9OiAke21zZ31gLCBkYXRhKVxuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmxvbmdwb2xsZXJUaW1lb3V0XSAtIFRoZSBtYXhpbXVtIHRpbWVvdXQgb2YgYSBsb25nIHBvbGwgQUpBWCByZXF1ZXN0LlxuICpcbiAqIERlZmF1bHRzIHRvIDIwcyAoZG91YmxlIHRoZSBzZXJ2ZXIgbG9uZyBwb2xsIHRpbWVyKS5cbiAqXG4gKiBAcGFyYW0geyhPYmplY3R8ZnVuY3Rpb24pfSBbb3B0cy5wYXJhbXNdIC0gVGhlIG9wdGlvbmFsIHBhcmFtcyB0byBwYXNzIHdoZW4gY29ubmVjdGluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmJpbmFyeVR5cGVdIC0gVGhlIGJpbmFyeSB0eXBlIHRvIHVzZSBmb3IgYmluYXJ5IFdlYlNvY2tldCBmcmFtZXMuXG4gKlxuICogRGVmYXVsdHMgdG8gXCJhcnJheWJ1ZmZlclwiXG4gKlxuICogQHBhcmFtIHt2c259IFtvcHRzLnZzbl0gLSBUaGUgc2VyaWFsaXplcidzIHByb3RvY29sIHZlcnNpb24gdG8gc2VuZCBvbiBjb25uZWN0LlxuICpcbiAqIERlZmF1bHRzIHRvIERFRkFVTFRfVlNOLlxuKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvY2tldCB7XG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50LCBvcHRzID0ge30pe1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MgPSB7b3BlbjogW10sIGNsb3NlOiBbXSwgZXJyb3I6IFtdLCBtZXNzYWdlOiBbXX1cbiAgICB0aGlzLmNoYW5uZWxzID0gW11cbiAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIHRoaXMucmVmID0gMFxuICAgIHRoaXMudGltZW91dCA9IG9wdHMudGltZW91dCB8fCBERUZBVUxUX1RJTUVPVVRcbiAgICB0aGlzLnRyYW5zcG9ydCA9IG9wdHMudHJhbnNwb3J0IHx8IGdsb2JhbC5XZWJTb2NrZXQgfHwgTG9uZ1BvbGxcbiAgICB0aGlzLmVzdGFibGlzaGVkQ29ubmVjdGlvbnMgPSAwXG4gICAgdGhpcy5kZWZhdWx0RW5jb2RlciA9IFNlcmlhbGl6ZXIuZW5jb2RlLmJpbmQoU2VyaWFsaXplcilcbiAgICB0aGlzLmRlZmF1bHREZWNvZGVyID0gU2VyaWFsaXplci5kZWNvZGUuYmluZChTZXJpYWxpemVyKVxuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IGZhbHNlXG4gICAgdGhpcy5iaW5hcnlUeXBlID0gb3B0cy5iaW5hcnlUeXBlIHx8IFwiYXJyYXlidWZmZXJcIlxuICAgIHRoaXMuY29ubmVjdENsb2NrID0gMVxuICAgIGlmKHRoaXMudHJhbnNwb3J0ICE9PSBMb25nUG9sbCl7XG4gICAgICB0aGlzLmVuY29kZSA9IG9wdHMuZW5jb2RlIHx8IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gb3B0cy5kZWNvZGUgfHwgdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuY29kZSA9IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH1cbiAgICBsZXQgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICBpZihwaHhXaW5kb3cgJiYgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIpe1xuICAgICAgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBfZSA9PiB7XG4gICAgICAgIGlmKHRoaXMuY29ubil7XG4gICAgICAgICAgdGhpcy5kaXNjb25uZWN0KClcbiAgICAgICAgICBhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID0gdGhpcy5jb25uZWN0Q2xvY2tcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHBoeFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZXNob3dcIiwgX2UgPT4ge1xuICAgICAgICBpZihhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID09PSB0aGlzLmNvbm5lY3RDbG9jayl7XG4gICAgICAgICAgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICAgICAgICB0aGlzLmNvbm5lY3QoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMgPSBvcHRzLmhlYXJ0YmVhdEludGVydmFsTXMgfHwgMzAwMDBcbiAgICB0aGlzLnJlam9pbkFmdGVyTXMgPSAodHJpZXMpID0+IHtcbiAgICAgIGlmKG9wdHMucmVqb2luQWZ0ZXJNcyl7XG4gICAgICAgIHJldHVybiBvcHRzLnJlam9pbkFmdGVyTXModHJpZXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gWzEwMDAsIDIwMDAsIDUwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWNvbm5lY3RBZnRlck1zID0gKHRyaWVzKSA9PiB7XG4gICAgICBpZihvcHRzLnJlY29ubmVjdEFmdGVyTXMpe1xuICAgICAgICByZXR1cm4gb3B0cy5yZWNvbm5lY3RBZnRlck1zKHRyaWVzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRzLmxvZ2dlciB8fCBudWxsXG4gICAgdGhpcy5sb25ncG9sbGVyVGltZW91dCA9IG9wdHMubG9uZ3BvbGxlclRpbWVvdXQgfHwgMjAwMDBcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUob3B0cy5wYXJhbXMgfHwge30pXG4gICAgdGhpcy5lbmRQb2ludCA9IGAke2VuZFBvaW50fS8ke1RSQU5TUE9SVFMud2Vic29ja2V0fWBcbiAgICB0aGlzLnZzbiA9IG9wdHMudnNuIHx8IERFRkFVTFRfVlNOXG4gICAgdGhpcy5oZWFydGJlYXRUaW1lb3V0VGltZXIgPSBudWxsXG4gICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IG51bGxcbiAgICB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYgPSBudWxsXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICB0aGlzLnRlYXJkb3duKCgpID0+IHRoaXMuY29ubmVjdCgpKVxuICAgIH0sIHRoaXMucmVjb25uZWN0QWZ0ZXJNcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBMb25nUG9sbCB0cmFuc3BvcnQgcmVmZXJlbmNlXG4gICAqL1xuICBnZXRMb25nUG9sbFRyYW5zcG9ydCgpeyByZXR1cm4gTG9uZ1BvbGwgfVxuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0cyBhbmQgcmVwbGFjZXMgdGhlIGFjdGl2ZSB0cmFuc3BvcnRcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV3VHJhbnNwb3J0IC0gVGhlIG5ldyB0cmFuc3BvcnQgY2xhc3MgdG8gaW5zdGFudGlhdGVcbiAgICpcbiAgICovXG4gIHJlcGxhY2VUcmFuc3BvcnQobmV3VHJhbnNwb3J0KXtcbiAgICB0aGlzLmNvbm5lY3RDbG9jaysrXG4gICAgdGhpcy5jbG9zZVdhc0NsZWFuID0gdHJ1ZVxuICAgIHRoaXMucmVjb25uZWN0VGltZXIucmVzZXQoKVxuICAgIHRoaXMuc2VuZEJ1ZmZlciA9IFtdXG4gICAgaWYodGhpcy5jb25uKXtcbiAgICAgIHRoaXMuY29ubi5jbG9zZSgpXG4gICAgICB0aGlzLmNvbm4gPSBudWxsXG4gICAgfVxuICAgIHRoaXMudHJhbnNwb3J0ID0gbmV3VHJhbnNwb3J0XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc29ja2V0IHByb3RvY29sXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBwcm90b2NvbCgpeyByZXR1cm4gbG9jYXRpb24ucHJvdG9jb2wubWF0Y2goL15odHRwcy8pID8gXCJ3c3NcIiA6IFwid3NcIiB9XG5cbiAgLyoqXG4gICAqIFRoZSBmdWxseSBxdWFsaWZpZWQgc29ja2V0IHVybFxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZW5kUG9pbnRVUkwoKXtcbiAgICBsZXQgdXJpID0gQWpheC5hcHBlbmRQYXJhbXMoXG4gICAgICBBamF4LmFwcGVuZFBhcmFtcyh0aGlzLmVuZFBvaW50LCB0aGlzLnBhcmFtcygpKSwge3ZzbjogdGhpcy52c259KVxuICAgIGlmKHVyaS5jaGFyQXQoMCkgIT09IFwiL1wiKXsgcmV0dXJuIHVyaSB9XG4gICAgaWYodXJpLmNoYXJBdCgxKSA9PT0gXCIvXCIpeyByZXR1cm4gYCR7dGhpcy5wcm90b2NvbCgpfToke3VyaX1gIH1cblxuICAgIHJldHVybiBgJHt0aGlzLnByb3RvY29sKCl9Oi8vJHtsb2NhdGlvbi5ob3N0fSR7dXJpfWBcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0cyB0aGUgc29ja2V0XG4gICAqXG4gICAqIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ2xvc2VFdmVudCNTdGF0dXNfY29kZXMgZm9yIHZhbGlkIHN0YXR1cyBjb2Rlcy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBPcHRpb25hbCBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgYWZ0ZXIgc29ja2V0IGlzIGRpc2Nvbm5lY3RlZC5cbiAgICogQHBhcmFtIHtpbnRlZ2VyfSBjb2RlIC0gQSBzdGF0dXMgY29kZSBmb3IgZGlzY29ubmVjdGlvbiAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gQSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gdG8gZGlzY29ubmVjdC4gKE9wdGlvbmFsKVxuICAgKi9cbiAgZGlzY29ubmVjdChjYWxsYmFjaywgY29kZSwgcmVhc29uKXtcbiAgICB0aGlzLmNvbm5lY3RDbG9jaysrXG4gICAgdGhpcy5jbG9zZVdhc0NsZWFuID0gdHJ1ZVxuICAgIHRoaXMucmVjb25uZWN0VGltZXIucmVzZXQoKVxuICAgIHRoaXMudGVhcmRvd24oY2FsbGJhY2ssIGNvZGUsIHJlYXNvbilcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVGhlIHBhcmFtcyB0byBzZW5kIHdoZW4gY29ubmVjdGluZywgZm9yIGV4YW1wbGUgYHt1c2VyX2lkOiB1c2VyVG9rZW59YFxuICAgKlxuICAgKiBQYXNzaW5nIHBhcmFtcyB0byBjb25uZWN0IGlzIGRlcHJlY2F0ZWQ7IHBhc3MgdGhlbSBpbiB0aGUgU29ja2V0IGNvbnN0cnVjdG9yIGluc3RlYWQ6XG4gICAqIGBuZXcgU29ja2V0KFwiL3NvY2tldFwiLCB7cGFyYW1zOiB7dXNlcl9pZDogdXNlclRva2VufX0pYC5cbiAgICovXG4gIGNvbm5lY3QocGFyYW1zKXtcbiAgICBpZihwYXJhbXMpe1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcInBhc3NpbmcgcGFyYW1zIHRvIGNvbm5lY3QgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCBwYXNzIDpwYXJhbXMgdG8gdGhlIFNvY2tldCBjb25zdHJ1Y3RvclwiKVxuICAgICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKHBhcmFtcylcbiAgICB9XG4gICAgaWYodGhpcy5jb25uKXsgcmV0dXJuIH1cblxuICAgIHRoaXMuY29ubmVjdENsb2NrKytcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuY29ubiA9IG5ldyB0aGlzLnRyYW5zcG9ydCh0aGlzLmVuZFBvaW50VVJMKCkpXG4gICAgdGhpcy5jb25uLmJpbmFyeVR5cGUgPSB0aGlzLmJpbmFyeVR5cGVcbiAgICB0aGlzLmNvbm4udGltZW91dCA9IHRoaXMubG9uZ3BvbGxlclRpbWVvdXRcbiAgICB0aGlzLmNvbm4ub25vcGVuID0gKCkgPT4gdGhpcy5vbkNvbm5PcGVuKClcbiAgICB0aGlzLmNvbm4ub25lcnJvciA9IGVycm9yID0+IHRoaXMub25Db25uRXJyb3IoZXJyb3IpXG4gICAgdGhpcy5jb25uLm9ubWVzc2FnZSA9IGV2ZW50ID0+IHRoaXMub25Db25uTWVzc2FnZShldmVudClcbiAgICB0aGlzLmNvbm4ub25jbG9zZSA9IGV2ZW50ID0+IHRoaXMub25Db25uQ2xvc2UoZXZlbnQpXG4gIH1cblxuICAvKipcbiAgICogTG9ncyB0aGUgbWVzc2FnZS4gT3ZlcnJpZGUgYHRoaXMubG9nZ2VyYCBmb3Igc3BlY2lhbGl6ZWQgbG9nZ2luZy4gbm9vcHMgYnkgZGVmYXVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2luZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbXNnXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqL1xuICBsb2coa2luZCwgbXNnLCBkYXRhKXsgdGhpcy5sb2dnZXIoa2luZCwgbXNnLCBkYXRhKSB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhIGxvZ2dlciBoYXMgYmVlbiBzZXQgb24gdGhpcyBzb2NrZXQuXG4gICAqL1xuICBoYXNMb2dnZXIoKXsgcmV0dXJuIHRoaXMubG9nZ2VyICE9PSBudWxsIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBvcGVuIGV2ZW50c1xuICAgKlxuICAgKiBAZXhhbXBsZSBzb2NrZXQub25PcGVuKGZ1bmN0aW9uKCl7IGNvbnNvbGUuaW5mbyhcInRoZSBzb2NrZXQgd2FzIG9wZW5lZFwiKSB9KVxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25PcGVuKGNhbGxiYWNrKXtcbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm9wZW4ucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjYWxsYmFja3MgZm9yIGNvbm5lY3Rpb24gY2xvc2UgZXZlbnRzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbkNsb3NlKGNhbGxiYWNrKXtcbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLmNsb3NlLnB1c2goW3JlZiwgY2FsbGJhY2tdKVxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgY2FsbGJhY2tzIGZvciBjb25uZWN0aW9uIGVycm9yIGV2ZW50c1xuICAgKlxuICAgKiBAZXhhbXBsZSBzb2NrZXQub25FcnJvcihmdW5jdGlvbihlcnJvcil7IGFsZXJ0KFwiQW4gZXJyb3Igb2NjdXJyZWRcIikgfSlcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uRXJyb3IoY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuZXJyb3IucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjYWxsYmFja3MgZm9yIGNvbm5lY3Rpb24gbWVzc2FnZSBldmVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uTWVzc2FnZShjYWxsYmFjayl7XG4gICAgbGV0IHJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5tZXNzYWdlLnB1c2goW3JlZiwgY2FsbGJhY2tdKVxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIC8qKlxuICAgKiBQaW5ncyB0aGUgc2VydmVyIGFuZCBpbnZva2VzIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBSVFQgaW4gbWlsbGlzZWNvbmRzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGluZyB3YXMgcHVzaGVkIG9yIGZhbHNlIGlmIHVuYWJsZSB0byBiZSBwdXNoZWQuXG4gICAqL1xuICBwaW5nKGNhbGxiYWNrKXtcbiAgICBpZighdGhpcy5pc0Nvbm5lY3RlZCgpKXsgcmV0dXJuIGZhbHNlIH1cbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIHRoaXMucHVzaCh7dG9waWM6IFwicGhvZW5peFwiLCBldmVudDogXCJoZWFydGJlYXRcIiwgcGF5bG9hZDoge30sIHJlZjogcmVmfSlcbiAgICBsZXQgb25Nc2dSZWYgPSB0aGlzLm9uTWVzc2FnZShtc2cgPT4ge1xuICAgICAgaWYobXNnLnJlZiA9PT0gcmVmKXtcbiAgICAgICAgdGhpcy5vZmYoW29uTXNnUmVmXSlcbiAgICAgICAgY2FsbGJhY2soRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgY2xlYXJIZWFydGJlYXRzKCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaGVhcnRiZWF0VGltZXIpXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaGVhcnRiZWF0VGltZW91dFRpbWVyKVxuICB9XG5cbiAgb25Db25uT3Blbigpe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBjb25uZWN0ZWQgdG8gJHt0aGlzLmVuZFBvaW50VVJMKCl9YClcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuZXN0YWJsaXNoZWRDb25uZWN0aW9ucysrXG4gICAgdGhpcy5mbHVzaFNlbmRCdWZmZXIoKVxuICAgIHRoaXMucmVjb25uZWN0VGltZXIucmVzZXQoKVxuICAgIHRoaXMucmVzZXRIZWFydGJlYXQoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mub3Blbi5mb3JFYWNoKChbLCBjYWxsYmFja10pID0+IGNhbGxiYWNrKCkpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgaGVhcnRiZWF0VGltZW91dCgpe1xuICAgIGlmKHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZil7XG4gICAgICB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYgPSBudWxsXG4gICAgICBpZih0aGlzLmhhc0xvZ2dlcigpKXsgdGhpcy5sb2coXCJ0cmFuc3BvcnRcIiwgXCJoZWFydGJlYXQgdGltZW91dC4gQXR0ZW1wdGluZyB0byByZS1lc3RhYmxpc2ggY29ubmVjdGlvblwiKSB9XG4gICAgICB0aGlzLnRyaWdnZXJDaGFuRXJyb3IoKVxuICAgICAgdGhpcy5jbG9zZVdhc0NsZWFuID0gZmFsc2VcbiAgICAgIHRoaXMudGVhcmRvd24oKCkgPT4gdGhpcy5yZWNvbm5lY3RUaW1lci5zY2hlZHVsZVRpbWVvdXQoKSwgV1NfQ0xPU0VfTk9STUFMLCBcImhlYXJ0YmVhdCB0aW1lb3V0XCIpXG4gICAgfVxuICB9XG5cbiAgcmVzZXRIZWFydGJlYXQoKXtcbiAgICBpZih0aGlzLmNvbm4gJiYgdGhpcy5jb25uLnNraXBIZWFydGJlYXQpeyByZXR1cm4gfVxuICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICB0aGlzLmNsZWFySGVhcnRiZWF0cygpXG4gICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZW5kSGVhcnRiZWF0KCksIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcylcbiAgfVxuXG4gIHRlYXJkb3duKGNhbGxiYWNrLCBjb2RlLCByZWFzb24pe1xuICAgIGlmKCF0aGlzLmNvbm4pe1xuICAgICAgcmV0dXJuIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcbiAgICB9XG5cbiAgICB0aGlzLndhaXRGb3JCdWZmZXJEb25lKCgpID0+IHtcbiAgICAgIGlmKHRoaXMuY29ubil7XG4gICAgICAgIGlmKGNvZGUpeyB0aGlzLmNvbm4uY2xvc2UoY29kZSwgcmVhc29uIHx8IFwiXCIpIH0gZWxzZSB7IHRoaXMuY29ubi5jbG9zZSgpIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy53YWl0Rm9yU29ja2V0Q2xvc2VkKCgpID0+IHtcbiAgICAgICAgaWYodGhpcy5jb25uKXtcbiAgICAgICAgICB0aGlzLmNvbm4ub25vcGVuID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgICAgICAgIHRoaXMuY29ubi5vbmVycm9yID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgICAgICAgIHRoaXMuY29ubi5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uLm9uY2xvc2UgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uID0gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgd2FpdEZvckJ1ZmZlckRvbmUoY2FsbGJhY2ssIHRyaWVzID0gMSl7XG4gICAgaWYodHJpZXMgPT09IDUgfHwgIXRoaXMuY29ubiB8fCAhdGhpcy5jb25uLmJ1ZmZlcmVkQW1vdW50KXtcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy53YWl0Rm9yQnVmZmVyRG9uZShjYWxsYmFjaywgdHJpZXMgKyAxKVxuICAgIH0sIDE1MCAqIHRyaWVzKVxuICB9XG5cbiAgd2FpdEZvclNvY2tldENsb3NlZChjYWxsYmFjaywgdHJpZXMgPSAxKXtcbiAgICBpZih0cmllcyA9PT0gNSB8fCAhdGhpcy5jb25uIHx8IHRoaXMuY29ubi5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLmNsb3NlZCl7XG4gICAgICBjYWxsYmFjaygpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMud2FpdEZvclNvY2tldENsb3NlZChjYWxsYmFjaywgdHJpZXMgKyAxKVxuICAgIH0sIDE1MCAqIHRyaWVzKVxuICB9XG5cbiAgb25Db25uQ2xvc2UoZXZlbnQpe1xuICAgIGxldCBjbG9zZUNvZGUgPSBldmVudCAmJiBldmVudC5jb2RlXG4gICAgaWYodGhpcy5oYXNMb2dnZXIoKSkgdGhpcy5sb2coXCJ0cmFuc3BvcnRcIiwgXCJjbG9zZVwiLCBldmVudClcbiAgICB0aGlzLnRyaWdnZXJDaGFuRXJyb3IoKVxuICAgIHRoaXMuY2xlYXJIZWFydGJlYXRzKClcbiAgICBpZighdGhpcy5jbG9zZVdhc0NsZWFuICYmIGNsb3NlQ29kZSAhPT0gMTAwMCl7XG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyLnNjaGVkdWxlVGltZW91dCgpXG4gICAgfVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuY2xvc2UuZm9yRWFjaCgoWywgY2FsbGJhY2tdKSA9PiBjYWxsYmFjayhldmVudCkpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uQ29ubkVycm9yKGVycm9yKXtcbiAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBlcnJvcilcbiAgICBsZXQgdHJhbnNwb3J0QmVmb3JlID0gdGhpcy50cmFuc3BvcnRcbiAgICBsZXQgZXN0YWJsaXNoZWRCZWZvcmUgPSB0aGlzLmVzdGFibGlzaGVkQ29ubmVjdGlvbnNcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLmVycm9yLmZvckVhY2goKFssIGNhbGxiYWNrXSkgPT4ge1xuICAgICAgY2FsbGJhY2soZXJyb3IsIHRyYW5zcG9ydEJlZm9yZSwgZXN0YWJsaXNoZWRCZWZvcmUpXG4gICAgfSlcbiAgICBpZih0cmFuc3BvcnRCZWZvcmUgPT09IHRoaXMudHJhbnNwb3J0IHx8IGVzdGFibGlzaGVkQmVmb3JlID4gMCl7XG4gICAgICB0aGlzLnRyaWdnZXJDaGFuRXJyb3IoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdHJpZ2dlckNoYW5FcnJvcigpe1xuICAgIHRoaXMuY2hhbm5lbHMuZm9yRWFjaChjaGFubmVsID0+IHtcbiAgICAgIGlmKCEoY2hhbm5lbC5pc0Vycm9yZWQoKSB8fCBjaGFubmVsLmlzTGVhdmluZygpIHx8IGNoYW5uZWwuaXNDbG9zZWQoKSkpe1xuICAgICAgICBjaGFubmVsLnRyaWdnZXIoQ0hBTk5FTF9FVkVOVFMuZXJyb3IpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgY29ubmVjdGlvblN0YXRlKCl7XG4gICAgc3dpdGNoKHRoaXMuY29ubiAmJiB0aGlzLmNvbm4ucmVhZHlTdGF0ZSl7XG4gICAgICBjYXNlIFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZzogcmV0dXJuIFwiY29ubmVjdGluZ1wiXG4gICAgICBjYXNlIFNPQ0tFVF9TVEFURVMub3BlbjogcmV0dXJuIFwib3BlblwiXG4gICAgICBjYXNlIFNPQ0tFVF9TVEFURVMuY2xvc2luZzogcmV0dXJuIFwiY2xvc2luZ1wiXG4gICAgICBkZWZhdWx0OiByZXR1cm4gXCJjbG9zZWRcIlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQ29ubmVjdGVkKCl7IHJldHVybiB0aGlzLmNvbm5lY3Rpb25TdGF0ZSgpID09PSBcIm9wZW5cIiB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqXG4gICAqIEBwYXJhbSB7Q2hhbm5lbH1cbiAgICovXG4gIHJlbW92ZShjaGFubmVsKXtcbiAgICB0aGlzLm9mZihjaGFubmVsLnN0YXRlQ2hhbmdlUmVmcylcbiAgICB0aGlzLmNoYW5uZWxzID0gdGhpcy5jaGFubmVscy5maWx0ZXIoYyA9PiBjLmpvaW5SZWYoKSAhPT0gY2hhbm5lbC5qb2luUmVmKCkpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBgb25PcGVuYCwgYG9uQ2xvc2VgLCBgb25FcnJvcixgIGFuZCBgb25NZXNzYWdlYCByZWdpc3RyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3JlZnN9IC0gbGlzdCBvZiByZWZzIHJldHVybmVkIGJ5IGNhbGxzIHRvXG4gICAqICAgICAgICAgICAgICAgICBgb25PcGVuYCwgYG9uQ2xvc2VgLCBgb25FcnJvcixgIGFuZCBgb25NZXNzYWdlYFxuICAgKi9cbiAgb2ZmKHJlZnMpe1xuICAgIGZvcihsZXQga2V5IGluIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mpe1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1trZXldID0gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1trZXldLmZpbHRlcigoW3JlZl0pID0+IHtcbiAgICAgICAgcmV0dXJuIHJlZnMuaW5kZXhPZihyZWYpID09PSAtMVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGVzIGEgbmV3IGNoYW5uZWwgZm9yIHRoZSBnaXZlbiB0b3BpY1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9waWNcbiAgICogQHBhcmFtIHtPYmplY3R9IGNoYW5QYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgY2hhbm5lbFxuICAgKiBAcmV0dXJucyB7Q2hhbm5lbH1cbiAgICovXG4gIGNoYW5uZWwodG9waWMsIGNoYW5QYXJhbXMgPSB7fSl7XG4gICAgbGV0IGNoYW4gPSBuZXcgQ2hhbm5lbCh0b3BpYywgY2hhblBhcmFtcywgdGhpcylcbiAgICB0aGlzLmNoYW5uZWxzLnB1c2goY2hhbilcbiAgICByZXR1cm4gY2hhblxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqL1xuICBwdXNoKGRhdGEpe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpe1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gZGF0YVxuICAgICAgdGhpcy5sb2coXCJwdXNoXCIsIGAke3RvcGljfSAke2V2ZW50fSAoJHtqb2luX3JlZn0sICR7cmVmfSlgLCBwYXlsb2FkKVxuICAgIH1cblxuICAgIGlmKHRoaXMuaXNDb25uZWN0ZWQoKSl7XG4gICAgICB0aGlzLmVuY29kZShkYXRhLCByZXN1bHQgPT4gdGhpcy5jb25uLnNlbmQocmVzdWx0KSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW5kQnVmZmVyLnB1c2goKCkgPT4gdGhpcy5lbmNvZGUoZGF0YSwgcmVzdWx0ID0+IHRoaXMuY29ubi5zZW5kKHJlc3VsdCkpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5leHQgbWVzc2FnZSByZWYsIGFjY291bnRpbmcgZm9yIG92ZXJmbG93c1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgbWFrZVJlZigpe1xuICAgIGxldCBuZXdSZWYgPSB0aGlzLnJlZiArIDFcbiAgICBpZihuZXdSZWYgPT09IHRoaXMucmVmKXsgdGhpcy5yZWYgPSAwIH0gZWxzZSB7IHRoaXMucmVmID0gbmV3UmVmIH1cblxuICAgIHJldHVybiB0aGlzLnJlZi50b1N0cmluZygpXG4gIH1cblxuICBzZW5kSGVhcnRiZWF0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmICYmICF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gfVxuICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5wdXNoKHt0b3BpYzogXCJwaG9lbml4XCIsIGV2ZW50OiBcImhlYXJ0YmVhdFwiLCBwYXlsb2FkOiB7fSwgcmVmOiB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWZ9KVxuICAgIHRoaXMuaGVhcnRiZWF0VGltZW91dFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmhlYXJ0YmVhdFRpbWVvdXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKVxuICB9XG5cbiAgZmx1c2hTZW5kQnVmZmVyKCl7XG4gICAgaWYodGhpcy5pc0Nvbm5lY3RlZCgpICYmIHRoaXMuc2VuZEJ1ZmZlci5sZW5ndGggPiAwKXtcbiAgICAgIHRoaXMuc2VuZEJ1ZmZlci5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKCkpXG4gICAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIH1cbiAgfVxuXG4gIG9uQ29ubk1lc3NhZ2UocmF3TWVzc2FnZSl7XG4gICAgdGhpcy5kZWNvZGUocmF3TWVzc2FnZS5kYXRhLCBtc2cgPT4ge1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gbXNnXG4gICAgICBpZihyZWYgJiYgcmVmID09PSB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpe1xuICAgICAgICB0aGlzLmNsZWFySGVhcnRiZWF0cygpXG4gICAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZW5kSGVhcnRiZWF0KCksIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcylcbiAgICAgIH1cblxuICAgICAgaWYodGhpcy5oYXNMb2dnZXIoKSkgdGhpcy5sb2coXCJyZWNlaXZlXCIsIGAke3BheWxvYWQuc3RhdHVzIHx8IFwiXCJ9ICR7dG9waWN9ICR7ZXZlbnR9ICR7cmVmICYmIFwiKFwiICsgcmVmICsgXCIpXCIgfHwgXCJcIn1gLCBwYXlsb2FkKVxuXG4gICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFubmVscy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzW2ldXG4gICAgICAgIGlmKCFjaGFubmVsLmlzTWVtYmVyKHRvcGljLCBldmVudCwgcGF5bG9hZCwgam9pbl9yZWYpKXsgY29udGludWUgfVxuICAgICAgICBjaGFubmVsLnRyaWdnZXIoZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWYpXG4gICAgICB9XG5cbiAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UubGVuZ3RoOyBpKyspe1xuICAgICAgICBsZXQgWywgY2FsbGJhY2tdID0gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5tZXNzYWdlW2ldXG4gICAgICAgIGNhbGxiYWNrKG1zZylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbGVhdmVPcGVuVG9waWModG9waWMpe1xuICAgIGxldCBkdXBDaGFubmVsID0gdGhpcy5jaGFubmVscy5maW5kKGMgPT4gYy50b3BpYyA9PT0gdG9waWMgJiYgKGMuaXNKb2luZWQoKSB8fCBjLmlzSm9pbmluZygpKSlcbiAgICBpZihkdXBDaGFubmVsKXtcbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBsZWF2aW5nIGR1cGxpY2F0ZSB0b3BpYyBcIiR7dG9waWN9XCJgKVxuICAgICAgZHVwQ2hhbm5lbC5sZWF2ZSgpXG4gICAgfVxuICB9XG59IiwgIlxuZXhwb3J0IGNvbnN0IENPTlNFQ1VUSVZFX1JFTE9BRFMgPSBcImNvbnNlY3V0aXZlLXJlbG9hZHNcIlxuZXhwb3J0IGNvbnN0IE1BWF9SRUxPQURTID0gMTBcbmV4cG9ydCBjb25zdCBSRUxPQURfSklUVEVSX01JTiA9IDUwMDBcbmV4cG9ydCBjb25zdCBSRUxPQURfSklUVEVSX01BWCA9IDEwMDAwXG5leHBvcnQgY29uc3QgRkFJTFNBRkVfSklUVEVSID0gMzAwMDBcbmV4cG9ydCBjb25zdCBQSFhfRVZFTlRfQ0xBU1NFUyA9IFtcbiAgXCJwaHgtY2xpY2stbG9hZGluZ1wiLCBcInBoeC1jaGFuZ2UtbG9hZGluZ1wiLCBcInBoeC1zdWJtaXQtbG9hZGluZ1wiLFxuICBcInBoeC1rZXlkb3duLWxvYWRpbmdcIiwgXCJwaHgta2V5dXAtbG9hZGluZ1wiLCBcInBoeC1ibHVyLWxvYWRpbmdcIiwgXCJwaHgtZm9jdXMtbG9hZGluZ1wiXG5dXG5leHBvcnQgY29uc3QgUEhYX0NPTVBPTkVOVCA9IFwiZGF0YS1waHgtY29tcG9uZW50XCJcbmV4cG9ydCBjb25zdCBQSFhfTElWRV9MSU5LID0gXCJkYXRhLXBoeC1saW5rXCJcbmV4cG9ydCBjb25zdCBQSFhfVFJBQ0tfU1RBVElDID0gXCJ0cmFjay1zdGF0aWNcIlxuZXhwb3J0IGNvbnN0IFBIWF9MSU5LX1NUQVRFID0gXCJkYXRhLXBoeC1saW5rLXN0YXRlXCJcbmV4cG9ydCBjb25zdCBQSFhfUkVGID0gXCJkYXRhLXBoeC1yZWZcIlxuZXhwb3J0IGNvbnN0IFBIWF9SRUZfU1JDID0gXCJkYXRhLXBoeC1yZWYtc3JjXCJcbmV4cG9ydCBjb25zdCBQSFhfVFJBQ0tfVVBMT0FEUyA9IFwidHJhY2stdXBsb2Fkc1wiXG5leHBvcnQgY29uc3QgUEhYX1VQTE9BRF9SRUYgPSBcImRhdGEtcGh4LXVwbG9hZC1yZWZcIlxuZXhwb3J0IGNvbnN0IFBIWF9QUkVGTElHSFRFRF9SRUZTID0gXCJkYXRhLXBoeC1wcmVmbGlnaHRlZC1yZWZzXCJcbmV4cG9ydCBjb25zdCBQSFhfRE9ORV9SRUZTID0gXCJkYXRhLXBoeC1kb25lLXJlZnNcIlxuZXhwb3J0IGNvbnN0IFBIWF9EUk9QX1RBUkdFVCA9IFwiZHJvcC10YXJnZXRcIlxuZXhwb3J0IGNvbnN0IFBIWF9BQ1RJVkVfRU5UUllfUkVGUyA9IFwiZGF0YS1waHgtYWN0aXZlLXJlZnNcIlxuZXhwb3J0IGNvbnN0IFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCA9IFwicGh4OmxpdmUtZmlsZTp1cGRhdGVkXCJcbmV4cG9ydCBjb25zdCBQSFhfU0tJUCA9IFwiZGF0YS1waHgtc2tpcFwiXG5leHBvcnQgY29uc3QgUEhYX1BSVU5FID0gXCJkYXRhLXBoeC1wcnVuZVwiXG5leHBvcnQgY29uc3QgUEhYX1BBR0VfTE9BRElORyA9IFwicGFnZS1sb2FkaW5nXCJcbmV4cG9ydCBjb25zdCBQSFhfQ09OTkVDVEVEX0NMQVNTID0gXCJwaHgtY29ubmVjdGVkXCJcbmV4cG9ydCBjb25zdCBQSFhfRElTQ09OTkVDVEVEX0NMQVNTID0gXCJwaHgtbG9hZGluZ1wiXG5leHBvcnQgY29uc3QgUEhYX05PX0ZFRURCQUNLX0NMQVNTID0gXCJwaHgtbm8tZmVlZGJhY2tcIlxuZXhwb3J0IGNvbnN0IFBIWF9FUlJPUl9DTEFTUyA9IFwicGh4LWVycm9yXCJcbmV4cG9ydCBjb25zdCBQSFhfUEFSRU5UX0lEID0gXCJkYXRhLXBoeC1wYXJlbnQtaWRcIlxuZXhwb3J0IGNvbnN0IFBIWF9NQUlOID0gXCJkYXRhLXBoeC1tYWluXCJcbmV4cG9ydCBjb25zdCBQSFhfUk9PVF9JRCA9IFwiZGF0YS1waHgtcm9vdC1pZFwiXG5leHBvcnQgY29uc3QgUEhYX1RSSUdHRVJfQUNUSU9OID0gXCJ0cmlnZ2VyLWFjdGlvblwiXG5leHBvcnQgY29uc3QgUEhYX0ZFRURCQUNLX0ZPUiA9IFwiZmVlZGJhY2stZm9yXCJcbmV4cG9ydCBjb25zdCBQSFhfSEFTX0ZPQ1VTRUQgPSBcInBoeC1oYXMtZm9jdXNlZFwiXG5leHBvcnQgY29uc3QgRk9DVVNBQkxFX0lOUFVUUyA9IFtcInRleHRcIiwgXCJ0ZXh0YXJlYVwiLCBcIm51bWJlclwiLCBcImVtYWlsXCIsIFwicGFzc3dvcmRcIiwgXCJzZWFyY2hcIiwgXCJ0ZWxcIiwgXCJ1cmxcIiwgXCJkYXRlXCIsIFwidGltZVwiLCBcImRhdGV0aW1lLWxvY2FsXCIsIFwiY29sb3JcIiwgXCJyYW5nZVwiXVxuZXhwb3J0IGNvbnN0IENIRUNLQUJMRV9JTlBVVFMgPSBbXCJjaGVja2JveFwiLCBcInJhZGlvXCJdXG5leHBvcnQgY29uc3QgUEhYX0hBU19TVUJNSVRURUQgPSBcInBoeC1oYXMtc3VibWl0dGVkXCJcbmV4cG9ydCBjb25zdCBQSFhfU0VTU0lPTiA9IFwiZGF0YS1waHgtc2Vzc2lvblwiXG5leHBvcnQgY29uc3QgUEhYX1ZJRVdfU0VMRUNUT1IgPSBgWyR7UEhYX1NFU1NJT059XWBcbmV4cG9ydCBjb25zdCBQSFhfU1RJQ0tZID0gXCJkYXRhLXBoeC1zdGlja3lcIlxuZXhwb3J0IGNvbnN0IFBIWF9TVEFUSUMgPSBcImRhdGEtcGh4LXN0YXRpY1wiXG5leHBvcnQgY29uc3QgUEhYX1JFQURPTkxZID0gXCJkYXRhLXBoeC1yZWFkb25seVwiXG5leHBvcnQgY29uc3QgUEhYX0RJU0FCTEVEID0gXCJkYXRhLXBoeC1kaXNhYmxlZFwiXG5leHBvcnQgY29uc3QgUEhYX0RJU0FCTEVfV0lUSCA9IFwiZGlzYWJsZS13aXRoXCJcbmV4cG9ydCBjb25zdCBQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUgPSBcImRhdGEtcGh4LWRpc2FibGUtd2l0aC1yZXN0b3JlXCJcbmV4cG9ydCBjb25zdCBQSFhfSE9PSyA9IFwiaG9va1wiXG5leHBvcnQgY29uc3QgUEhYX0RFQk9VTkNFID0gXCJkZWJvdW5jZVwiXG5leHBvcnQgY29uc3QgUEhYX1RIUk9UVExFID0gXCJ0aHJvdHRsZVwiXG5leHBvcnQgY29uc3QgUEhYX1VQREFURSA9IFwidXBkYXRlXCJcbmV4cG9ydCBjb25zdCBQSFhfS0VZID0gXCJrZXlcIlxuZXhwb3J0IGNvbnN0IFBIWF9QUklWQVRFID0gXCJwaHhQcml2YXRlXCJcbmV4cG9ydCBjb25zdCBQSFhfQVVUT19SRUNPVkVSID0gXCJhdXRvLXJlY292ZXJcIlxuZXhwb3J0IGNvbnN0IFBIWF9MVl9ERUJVRyA9IFwicGh4OmxpdmUtc29ja2V0OmRlYnVnXCJcbmV4cG9ydCBjb25zdCBQSFhfTFZfUFJPRklMRSA9IFwicGh4OmxpdmUtc29ja2V0OnByb2ZpbGluZ1wiXG5leHBvcnQgY29uc3QgUEhYX0xWX0xBVEVOQ1lfU0lNID0gXCJwaHg6bGl2ZS1zb2NrZXQ6bGF0ZW5jeS1zaW1cIlxuZXhwb3J0IGNvbnN0IFBIWF9QUk9HUkVTUyA9IFwicHJvZ3Jlc3NcIlxuZXhwb3J0IGNvbnN0IExPQURFUl9USU1FT1VUID0gMVxuZXhwb3J0IGNvbnN0IEJFRk9SRV9VTkxPQURfTE9BREVSX1RJTUVPVVQgPSAyMDBcbmV4cG9ydCBjb25zdCBCSU5ESU5HX1BSRUZJWCA9IFwicGh4LVwiXG5leHBvcnQgY29uc3QgUFVTSF9USU1FT1VUID0gMzAwMDBcbmV4cG9ydCBjb25zdCBMSU5LX0hFQURFUiA9IFwieC1yZXF1ZXN0ZWQtd2l0aFwiXG5leHBvcnQgY29uc3QgUkVTUE9OU0VfVVJMX0hFQURFUiA9IFwieC1yZXNwb25zZS11cmxcIlxuZXhwb3J0IGNvbnN0IERFQk9VTkNFX1RSSUdHRVIgPSBcImRlYm91bmNlLXRyaWdnZXJcIlxuZXhwb3J0IGNvbnN0IFRIUk9UVExFRCA9IFwidGhyb3R0bGVkXCJcbmV4cG9ydCBjb25zdCBERUJPVU5DRV9QUkVWX0tFWSA9IFwiZGVib3VuY2UtcHJldi1rZXlcIlxuZXhwb3J0IGNvbnN0IERFRkFVTFRTID0ge1xuICBkZWJvdW5jZTogMzAwLFxuICB0aHJvdHRsZTogMzAwXG59XG5cbi8vIFJlbmRlcmVkXG5leHBvcnQgY29uc3QgRFlOQU1JQ1MgPSBcImRcIlxuZXhwb3J0IGNvbnN0IFNUQVRJQyA9IFwic1wiXG5leHBvcnQgY29uc3QgQ09NUE9ORU5UUyA9IFwiY1wiXG5leHBvcnQgY29uc3QgRVZFTlRTID0gXCJlXCJcbmV4cG9ydCBjb25zdCBSRVBMWSA9IFwiclwiXG5leHBvcnQgY29uc3QgVElUTEUgPSBcInRcIlxuZXhwb3J0IGNvbnN0IFRFTVBMQVRFUyA9IFwicFwiXG4iLCAiaW1wb3J0IHtcbiAgbG9nRXJyb3Jcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbnRyeVVwbG9hZGVyIHtcbiAgY29uc3RydWN0b3IoZW50cnksIGNodW5rU2l6ZSwgbGl2ZVNvY2tldCl7XG4gICAgdGhpcy5saXZlU29ja2V0ID0gbGl2ZVNvY2tldFxuICAgIHRoaXMuZW50cnkgPSBlbnRyeVxuICAgIHRoaXMub2Zmc2V0ID0gMFxuICAgIHRoaXMuY2h1bmtTaXplID0gY2h1bmtTaXplXG4gICAgdGhpcy5jaHVua1RpbWVyID0gbnVsbFxuICAgIHRoaXMudXBsb2FkQ2hhbm5lbCA9IGxpdmVTb2NrZXQuY2hhbm5lbChgbHZ1OiR7ZW50cnkucmVmfWAsIHt0b2tlbjogZW50cnkubWV0YWRhdGEoKX0pXG4gIH1cblxuICBlcnJvcihyZWFzb24pe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmNodW5rVGltZXIpXG4gICAgdGhpcy51cGxvYWRDaGFubmVsLmxlYXZlKClcbiAgICB0aGlzLmVudHJ5LmVycm9yKHJlYXNvbilcbiAgfVxuXG4gIHVwbG9hZCgpe1xuICAgIHRoaXMudXBsb2FkQ2hhbm5lbC5vbkVycm9yKHJlYXNvbiA9PiB0aGlzLmVycm9yKHJlYXNvbikpXG4gICAgdGhpcy51cGxvYWRDaGFubmVsLmpvaW4oKVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCBfZGF0YSA9PiB0aGlzLnJlYWROZXh0Q2h1bmsoKSlcbiAgICAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgcmVhc29uID0+IHRoaXMuZXJyb3IocmVhc29uKSlcbiAgfVxuXG4gIGlzRG9uZSgpeyByZXR1cm4gdGhpcy5vZmZzZXQgPj0gdGhpcy5lbnRyeS5maWxlLnNpemUgfVxuXG4gIHJlYWROZXh0Q2h1bmsoKXtcbiAgICBsZXQgcmVhZGVyID0gbmV3IHdpbmRvdy5GaWxlUmVhZGVyKClcbiAgICBsZXQgYmxvYiA9IHRoaXMuZW50cnkuZmlsZS5zbGljZSh0aGlzLm9mZnNldCwgdGhpcy5jaHVua1NpemUgKyB0aGlzLm9mZnNldClcbiAgICByZWFkZXIub25sb2FkID0gKGUpID0+IHtcbiAgICAgIGlmKGUudGFyZ2V0LmVycm9yID09PSBudWxsKXtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gZS50YXJnZXQucmVzdWx0LmJ5dGVMZW5ndGhcbiAgICAgICAgdGhpcy5wdXNoQ2h1bmsoZS50YXJnZXQucmVzdWx0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKFwiUmVhZCBlcnJvcjogXCIgKyBlLnRhcmdldC5lcnJvcilcbiAgICAgIH1cbiAgICB9XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpXG4gIH1cblxuICBwdXNoQ2h1bmsoY2h1bmspe1xuICAgIGlmKCF0aGlzLnVwbG9hZENoYW5uZWwuaXNKb2luZWQoKSl7IHJldHVybiB9XG4gICAgdGhpcy51cGxvYWRDaGFubmVsLnB1c2goXCJjaHVua1wiLCBjaHVuaylcbiAgICAgIC5yZWNlaXZlKFwib2tcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLmVudHJ5LnByb2dyZXNzKCh0aGlzLm9mZnNldCAvIHRoaXMuZW50cnkuZmlsZS5zaXplKSAqIDEwMClcbiAgICAgICAgaWYoIXRoaXMuaXNEb25lKCkpe1xuICAgICAgICAgIHRoaXMuY2h1bmtUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWFkTmV4dENodW5rKCksIHRoaXMubGl2ZVNvY2tldC5nZXRMYXRlbmN5U2ltKCkgfHwgMClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIFBIWF9WSUVXX1NFTEVDVE9SXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCBFbnRyeVVwbG9hZGVyIGZyb20gXCIuL2VudHJ5X3VwbG9hZGVyXCJcblxuZXhwb3J0IGxldCBsb2dFcnJvciA9IChtc2csIG9iaikgPT4gY29uc29sZS5lcnJvciAmJiBjb25zb2xlLmVycm9yKG1zZywgb2JqKVxuXG5leHBvcnQgbGV0IGlzQ2lkID0gKGNpZCkgPT4ge1xuICBsZXQgdHlwZSA9IHR5cGVvZihjaWQpXG4gIHJldHVybiB0eXBlID09PSBcIm51bWJlclwiIHx8ICh0eXBlID09PSBcInN0cmluZ1wiICYmIC9eKDB8WzEtOV1cXGQqKSQvLnRlc3QoY2lkKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdER1cGxpY2F0ZUlkcygpe1xuICBsZXQgaWRzID0gbmV3IFNldCgpXG4gIGxldCBlbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2lkXVwiKVxuICBmb3IobGV0IGkgPSAwLCBsZW4gPSBlbGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7XG4gICAgaWYoaWRzLmhhcyhlbGVtc1tpXS5pZCkpe1xuICAgICAgY29uc29sZS5lcnJvcihgTXVsdGlwbGUgSURzIGRldGVjdGVkOiAke2VsZW1zW2ldLmlkfS4gRW5zdXJlIHVuaXF1ZSBlbGVtZW50IGlkcy5gKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZHMuYWRkKGVsZW1zW2ldLmlkKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgbGV0IGRlYnVnID0gKHZpZXcsIGtpbmQsIG1zZywgb2JqKSA9PiB7XG4gIGlmKHZpZXcubGl2ZVNvY2tldC5pc0RlYnVnRW5hYmxlZCgpKXtcbiAgICBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopXG4gIH1cbn1cblxuLy8gd3JhcHMgdmFsdWUgaW4gY2xvc3VyZSBvciByZXR1cm5zIGNsb3N1cmVcbmV4cG9ydCBsZXQgY2xvc3VyZSA9ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIiA/IHZhbCA6IGZ1bmN0aW9uICgpeyByZXR1cm4gdmFsIH1cblxuZXhwb3J0IGxldCBjbG9uZSA9IChvYmopID0+IHsgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSkgfVxuXG5leHBvcnQgbGV0IGNsb3Nlc3RQaHhCaW5kaW5nID0gKGVsLCBiaW5kaW5nLCBib3JkZXJFbCkgPT4ge1xuICBkbyB7XG4gICAgaWYoZWwubWF0Y2hlcyhgWyR7YmluZGluZ31dYCkpeyByZXR1cm4gZWwgfVxuICAgIGVsID0gZWwucGFyZW50RWxlbWVudCB8fCBlbC5wYXJlbnROb2RlXG4gIH0gd2hpbGUoZWwgIT09IG51bGwgJiYgZWwubm9kZVR5cGUgPT09IDEgJiYgISgoYm9yZGVyRWwgJiYgYm9yZGVyRWwuaXNTYW1lTm9kZShlbCkpIHx8IGVsLm1hdGNoZXMoUEhYX1ZJRVdfU0VMRUNUT1IpKSlcbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGxldCBpc09iamVjdCA9IChvYmopID0+IHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmICEob2JqIGluc3RhbmNlb2YgQXJyYXkpXG59XG5cbmV4cG9ydCBsZXQgaXNFcXVhbE9iaiA9IChvYmoxLCBvYmoyKSA9PiBKU09OLnN0cmluZ2lmeShvYmoxKSA9PT0gSlNPTi5zdHJpbmdpZnkob2JqMilcblxuZXhwb3J0IGxldCBpc0VtcHR5ID0gKG9iaikgPT4ge1xuICBmb3IobGV0IHggaW4gb2JqKXsgcmV0dXJuIGZhbHNlIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGxldCBtYXliZSA9IChlbCwgY2FsbGJhY2spID0+IGVsICYmIGNhbGxiYWNrKGVsKVxuXG5leHBvcnQgbGV0IGNoYW5uZWxVcGxvYWRlciA9IGZ1bmN0aW9uIChlbnRyaWVzLCBvbkVycm9yLCByZXNwLCBsaXZlU29ja2V0KXtcbiAgZW50cmllcy5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICBsZXQgZW50cnlVcGxvYWRlciA9IG5ldyBFbnRyeVVwbG9hZGVyKGVudHJ5LCByZXNwLmNvbmZpZy5jaHVua19zaXplLCBsaXZlU29ja2V0KVxuICAgIGVudHJ5VXBsb2FkZXIudXBsb2FkKClcbiAgfSlcbn1cbiIsICJsZXQgQnJvd3NlciA9IHtcbiAgY2FuUHVzaFN0YXRlKCl7IHJldHVybiAodHlwZW9mIChoaXN0b3J5LnB1c2hTdGF0ZSkgIT09IFwidW5kZWZpbmVkXCIpIH0sXG5cbiAgZHJvcExvY2FsKGxvY2FsU3RvcmFnZSwgbmFtZXNwYWNlLCBzdWJrZXkpe1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsS2V5KG5hbWVzcGFjZSwgc3Via2V5KSlcbiAgfSxcblxuICB1cGRhdGVMb2NhbChsb2NhbFN0b3JhZ2UsIG5hbWVzcGFjZSwgc3Via2V5LCBpbml0aWFsLCBmdW5jKXtcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuZ2V0TG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSlcbiAgICBsZXQga2V5ID0gdGhpcy5sb2NhbEtleShuYW1lc3BhY2UsIHN1YmtleSlcbiAgICBsZXQgbmV3VmFsID0gY3VycmVudCA9PT0gbnVsbCA/IGluaXRpYWwgOiBmdW5jKGN1cnJlbnQpXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShuZXdWYWwpKVxuICAgIHJldHVybiBuZXdWYWxcbiAgfSxcblxuICBnZXRMb2NhbChsb2NhbFN0b3JhZ2UsIG5hbWVzcGFjZSwgc3Via2V5KXtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsS2V5KG5hbWVzcGFjZSwgc3Via2V5KSkpXG4gIH0sXG5cbiAgdXBkYXRlQ3VycmVudFN0YXRlKGNhbGxiYWNrKXtcbiAgICBpZighdGhpcy5jYW5QdXNoU3RhdGUoKSl7IHJldHVybiB9XG4gICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoY2FsbGJhY2soaGlzdG9yeS5zdGF0ZSB8fCB7fSksIFwiXCIsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICB9LFxuXG4gIHB1c2hTdGF0ZShraW5kLCBtZXRhLCB0byl7XG4gICAgaWYodGhpcy5jYW5QdXNoU3RhdGUoKSl7XG4gICAgICBpZih0byAhPT0gd2luZG93LmxvY2F0aW9uLmhyZWYpe1xuICAgICAgICBpZihtZXRhLnR5cGUgPT0gXCJyZWRpcmVjdFwiICYmIG1ldGEuc2Nyb2xsKXtcbiAgICAgICAgICAvLyBJZiB3ZSdyZSByZWRpcmVjdGluZyBzdG9yZSB0aGUgY3VycmVudCBzY3JvbGxZIGZvciB0aGUgY3VycmVudCBoaXN0b3J5IHN0YXRlLlxuICAgICAgICAgIGxldCBjdXJyZW50U3RhdGUgPSBoaXN0b3J5LnN0YXRlIHx8IHt9XG4gICAgICAgICAgY3VycmVudFN0YXRlLnNjcm9sbCA9IG1ldGEuc2Nyb2xsXG4gICAgICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoY3VycmVudFN0YXRlLCBcIlwiLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSBtZXRhLnNjcm9sbCAvLyBPbmx5IHN0b3JlIHRoZSBzY3JvbGwgaW4gdGhlIHJlZGlyZWN0IGNhc2UuXG4gICAgICAgIGhpc3Rvcnlba2luZCArIFwiU3RhdGVcIl0obWV0YSwgXCJcIiwgdG8gfHwgbnVsbCkgLy8gSUUgd2lsbCBjb2VyY2UgdW5kZWZpbmVkIHRvIHN0cmluZ1xuICAgICAgICBsZXQgaGFzaEVsID0gdGhpcy5nZXRIYXNoVGFyZ2V0RWwod2luZG93LmxvY2F0aW9uLmhhc2gpXG5cbiAgICAgICAgaWYoaGFzaEVsKXtcbiAgICAgICAgICBoYXNoRWwuc2Nyb2xsSW50b1ZpZXcoKVxuICAgICAgICB9IGVsc2UgaWYobWV0YS50eXBlID09PSBcInJlZGlyZWN0XCIpe1xuICAgICAgICAgIHdpbmRvdy5zY3JvbGwoMCwgMClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZGlyZWN0KHRvKVxuICAgIH1cbiAgfSxcblxuICBzZXRDb29raWUobmFtZSwgdmFsdWUpe1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PSR7dmFsdWV9YFxuICB9LFxuXG4gIGdldENvb2tpZShuYW1lKXtcbiAgICByZXR1cm4gZG9jdW1lbnQuY29va2llLnJlcGxhY2UobmV3IFJlZ0V4cChgKD86KD86XnwuKjtcXHMqKSR7bmFtZX1cXHMqXFw9XFxzKihbXjtdKikuKiQpfF4uKiRgKSwgXCIkMVwiKVxuICB9LFxuXG4gIHJlZGlyZWN0KHRvVVJMLCBmbGFzaCl7XG4gICAgaWYoZmxhc2gpeyBCcm93c2VyLnNldENvb2tpZShcIl9fcGhvZW5peF9mbGFzaF9fXCIsIGZsYXNoICsgXCI7IG1heC1hZ2U9NjAwMDA7IHBhdGg9L1wiKSB9XG4gICAgd2luZG93LmxvY2F0aW9uID0gdG9VUkxcbiAgfSxcblxuICBsb2NhbEtleShuYW1lc3BhY2UsIHN1YmtleSl7IHJldHVybiBgJHtuYW1lc3BhY2V9LSR7c3Via2V5fWAgfSxcblxuICBnZXRIYXNoVGFyZ2V0RWwobWF5YmVIYXNoKXtcbiAgICBsZXQgaGFzaCA9IG1heWJlSGFzaC50b1N0cmluZygpLnN1YnN0cmluZygxKVxuICAgIGlmKGhhc2ggPT09IFwiXCIpeyByZXR1cm4gfVxuICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoYXNoKSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBhW25hbWU9XCIke2hhc2h9XCJdYClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCcm93c2VyXG4iLCAiaW1wb3J0IHtcbiAgQ0hFQ0tBQkxFX0lOUFVUUyxcbiAgREVCT1VOQ0VfUFJFVl9LRVksXG4gIERFQk9VTkNFX1RSSUdHRVIsXG4gIEZPQ1VTQUJMRV9JTlBVVFMsXG4gIFBIWF9DT01QT05FTlQsXG4gIFBIWF9FVkVOVF9DTEFTU0VTLFxuICBQSFhfSEFTX0ZPQ1VTRUQsXG4gIFBIWF9IQVNfU1VCTUlUVEVELFxuICBQSFhfTUFJTixcbiAgUEhYX05PX0ZFRURCQUNLX0NMQVNTLFxuICBQSFhfUEFSRU5UX0lELFxuICBQSFhfUFJJVkFURSxcbiAgUEhYX1JFRixcbiAgUEhYX1JFRl9TUkMsXG4gIFBIWF9ST09UX0lELFxuICBQSFhfU0VTU0lPTixcbiAgUEhYX1NUQVRJQyxcbiAgUEhYX1VQTE9BRF9SRUYsXG4gIFBIWF9WSUVXX1NFTEVDVE9SLFxuICBQSFhfU1RJQ0tZLFxuICBUSFJPVFRMRURcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IHtcbiAgbG9nRXJyb3Jcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5sZXQgRE9NID0ge1xuICBieUlkKGlkKXsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSB8fCBsb2dFcnJvcihgbm8gaWQgZm91bmQgZm9yICR7aWR9YCkgfSxcblxuICByZW1vdmVDbGFzcyhlbCwgY2xhc3NOYW1lKXtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSlcbiAgICBpZihlbC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKXsgZWwucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIikgfVxuICB9LFxuXG4gIGFsbChub2RlLCBxdWVyeSwgY2FsbGJhY2spe1xuICAgIGlmKCFub2RlKXsgcmV0dXJuIFtdIH1cbiAgICBsZXQgYXJyYXkgPSBBcnJheS5mcm9tKG5vZGUucXVlcnlTZWxlY3RvckFsbChxdWVyeSkpXG4gICAgcmV0dXJuIGNhbGxiYWNrID8gYXJyYXkuZm9yRWFjaChjYWxsYmFjaykgOiBhcnJheVxuICB9LFxuXG4gIGNoaWxkTm9kZUxlbmd0aChodG1sKXtcbiAgICBsZXQgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIilcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sXG4gICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRlbnQuY2hpbGRFbGVtZW50Q291bnRcbiAgfSxcblxuICBpc1VwbG9hZElucHV0KGVsKXsgcmV0dXJuIGVsLnR5cGUgPT09IFwiZmlsZVwiICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRikgIT09IG51bGwgfSxcblxuICBmaW5kVXBsb2FkSW5wdXRzKG5vZGUpeyByZXR1cm4gdGhpcy5hbGwobm9kZSwgYGlucHV0W3R5cGU9XCJmaWxlXCJdWyR7UEhYX1VQTE9BRF9SRUZ9XWApIH0sXG5cbiAgZmluZENvbXBvbmVudE5vZGVMaXN0KG5vZGUsIGNpZCl7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyV2l0aGluU2FtZUxpdmVWaWV3KHRoaXMuYWxsKG5vZGUsIGBbJHtQSFhfQ09NUE9ORU5UfT1cIiR7Y2lkfVwiXWApLCBub2RlKVxuICB9LFxuXG4gIGlzUGh4RGVzdHJveWVkKG5vZGUpe1xuICAgIHJldHVybiBub2RlLmlkICYmIERPTS5wcml2YXRlKG5vZGUsIFwiZGVzdHJveWVkXCIpID8gdHJ1ZSA6IGZhbHNlXG4gIH0sXG5cbiAgbWFya1BoeENoaWxkRGVzdHJveWVkKGVsKXtcbiAgICBpZih0aGlzLmlzUGh4Q2hpbGQoZWwpKXsgZWwuc2V0QXR0cmlidXRlKFBIWF9TRVNTSU9OLCBcIlwiKSB9XG4gICAgdGhpcy5wdXRQcml2YXRlKGVsLCBcImRlc3Ryb3llZFwiLCB0cnVlKVxuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbkluRnJhZ21lbnQoaHRtbCwgcGFyZW50SWQpe1xuICAgIGxldCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKVxuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWxcbiAgICByZXR1cm4gdGhpcy5maW5kUGh4Q2hpbGRyZW4odGVtcGxhdGUuY29udGVudCwgcGFyZW50SWQpXG4gIH0sXG5cbiAgaXNJZ25vcmVkKGVsLCBwaHhVcGRhdGUpe1xuICAgIHJldHVybiAoZWwuZ2V0QXR0cmlidXRlKHBoeFVwZGF0ZSkgfHwgZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtdXBkYXRlXCIpKSA9PT0gXCJpZ25vcmVcIlxuICB9LFxuXG4gIGlzUGh4VXBkYXRlKGVsLCBwaHhVcGRhdGUsIHVwZGF0ZVR5cGVzKXtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlICYmIHVwZGF0ZVR5cGVzLmluZGV4T2YoZWwuZ2V0QXR0cmlidXRlKHBoeFVwZGF0ZSkpID49IDBcbiAgfSxcblxuICBmaW5kUGh4U3RpY2t5KGVsKXsgcmV0dXJuIHRoaXMuYWxsKGVsLCBgWyR7UEhYX1NUSUNLWX1dYCkgfSxcblxuICBmaW5kUGh4Q2hpbGRyZW4oZWwsIHBhcmVudElkKXtcbiAgICByZXR1cm4gdGhpcy5hbGwoZWwsIGAke1BIWF9WSUVXX1NFTEVDVE9SfVske1BIWF9QQVJFTlRfSUR9PVwiJHtwYXJlbnRJZH1cIl1gKVxuICB9LFxuXG4gIGZpbmRQYXJlbnRDSURzKG5vZGUsIGNpZHMpe1xuICAgIGxldCBpbml0aWFsID0gbmV3IFNldChjaWRzKVxuICAgIHJldHVybiBjaWRzLnJlZHVjZSgoYWNjLCBjaWQpID0+IHtcbiAgICAgIGxldCBzZWxlY3RvciA9IGBbJHtQSFhfQ09NUE9ORU5UfT1cIiR7Y2lkfVwiXSBbJHtQSFhfQ09NUE9ORU5UfV1gXG5cbiAgICAgIHRoaXMuZmlsdGVyV2l0aGluU2FtZUxpdmVWaWV3KHRoaXMuYWxsKG5vZGUsIHNlbGVjdG9yKSwgbm9kZSlcbiAgICAgICAgLm1hcChlbCA9PiBwYXJzZUludChlbC5nZXRBdHRyaWJ1dGUoUEhYX0NPTVBPTkVOVCkpKVxuICAgICAgICAuZm9yRWFjaChjaGlsZENJRCA9PiBhY2MuZGVsZXRlKGNoaWxkQ0lEKSlcblxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0sIGluaXRpYWwpXG4gIH0sXG5cbiAgZmlsdGVyV2l0aGluU2FtZUxpdmVWaWV3KG5vZGVzLCBwYXJlbnQpe1xuICAgIGlmKHBhcmVudC5xdWVyeVNlbGVjdG9yKFBIWF9WSUVXX1NFTEVDVE9SKSl7XG4gICAgICByZXR1cm4gbm9kZXMuZmlsdGVyKGVsID0+IHRoaXMud2l0aGluU2FtZUxpdmVWaWV3KGVsLCBwYXJlbnQpKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbm9kZXNcbiAgICB9XG4gIH0sXG5cbiAgd2l0aGluU2FtZUxpdmVWaWV3KG5vZGUsIHBhcmVudCl7XG4gICAgd2hpbGUobm9kZSA9IG5vZGUucGFyZW50Tm9kZSl7XG4gICAgICBpZihub2RlLmlzU2FtZU5vZGUocGFyZW50KSl7IHJldHVybiB0cnVlIH1cbiAgICAgIGlmKG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9TRVNTSU9OKSAhPT0gbnVsbCl7IHJldHVybiBmYWxzZSB9XG4gICAgfVxuICB9LFxuXG4gIHByaXZhdGUoZWwsIGtleSl7IHJldHVybiBlbFtQSFhfUFJJVkFURV0gJiYgZWxbUEhYX1BSSVZBVEVdW2tleV0gfSxcblxuICBkZWxldGVQcml2YXRlKGVsLCBrZXkpeyBlbFtQSFhfUFJJVkFURV0gJiYgZGVsZXRlIChlbFtQSFhfUFJJVkFURV1ba2V5XSkgfSxcblxuICBwdXRQcml2YXRlKGVsLCBrZXksIHZhbHVlKXtcbiAgICBpZighZWxbUEhYX1BSSVZBVEVdKXsgZWxbUEhYX1BSSVZBVEVdID0ge30gfVxuICAgIGVsW1BIWF9QUklWQVRFXVtrZXldID0gdmFsdWVcbiAgfSxcblxuICB1cGRhdGVQcml2YXRlKGVsLCBrZXksIGRlZmF1bHRWYWwsIHVwZGF0ZUZ1bmMpe1xuICAgIGxldCBleGlzdGluZyA9IHRoaXMucHJpdmF0ZShlbCwga2V5KVxuICAgIGlmKGV4aXN0aW5nID09PSB1bmRlZmluZWQpe1xuICAgICAgdGhpcy5wdXRQcml2YXRlKGVsLCBrZXksIHVwZGF0ZUZ1bmMoZGVmYXVsdFZhbCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwga2V5LCB1cGRhdGVGdW5jKGV4aXN0aW5nKSlcbiAgICB9XG4gIH0sXG5cbiAgY29weVByaXZhdGVzKHRhcmdldCwgc291cmNlKXtcbiAgICBpZihzb3VyY2VbUEhYX1BSSVZBVEVdKXtcbiAgICAgIHRhcmdldFtQSFhfUFJJVkFURV0gPSBzb3VyY2VbUEhYX1BSSVZBVEVdXG4gICAgfVxuICB9LFxuXG4gIHB1dFRpdGxlKHN0cil7XG4gICAgbGV0IHRpdGxlRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIilcbiAgICBsZXQge3ByZWZpeCwgc3VmZml4fSA9IHRpdGxlRWwuZGF0YXNldFxuICAgIGRvY3VtZW50LnRpdGxlID0gYCR7cHJlZml4IHx8IFwiXCJ9JHtzdHJ9JHtzdWZmaXggfHwgXCJcIn1gXG4gIH0sXG5cbiAgZGVib3VuY2UoZWwsIGV2ZW50LCBwaHhEZWJvdW5jZSwgZGVmYXVsdERlYm91bmNlLCBwaHhUaHJvdHRsZSwgZGVmYXVsdFRocm90dGxlLCBhc3luY0ZpbHRlciwgY2FsbGJhY2spe1xuICAgIGxldCBkZWJvdW5jZSA9IGVsLmdldEF0dHJpYnV0ZShwaHhEZWJvdW5jZSlcbiAgICBsZXQgdGhyb3R0bGUgPSBlbC5nZXRBdHRyaWJ1dGUocGh4VGhyb3R0bGUpXG4gICAgaWYoZGVib3VuY2UgPT09IFwiXCIpeyBkZWJvdW5jZSA9IGRlZmF1bHREZWJvdW5jZSB9XG4gICAgaWYodGhyb3R0bGUgPT09IFwiXCIpeyB0aHJvdHRsZSA9IGRlZmF1bHRUaHJvdHRsZSB9XG4gICAgbGV0IHZhbHVlID0gZGVib3VuY2UgfHwgdGhyb3R0bGVcbiAgICBzd2l0Y2godmFsdWUpe1xuICAgICAgY2FzZSBudWxsOiByZXR1cm4gY2FsbGJhY2soKVxuXG4gICAgICBjYXNlIFwiYmx1clwiOlxuICAgICAgICBpZih0aGlzLm9uY2UoZWwsIFwiZGVib3VuY2UtYmx1clwiKSl7XG4gICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgKCkgPT4gY2FsbGJhY2soKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbGV0IHRpbWVvdXQgPSBwYXJzZUludCh2YWx1ZSlcbiAgICAgICAgbGV0IHRyaWdnZXIgPSAoKSA9PiB0aHJvdHRsZSA/IHRoaXMuZGVsZXRlUHJpdmF0ZShlbCwgVEhST1RUTEVEKSA6IGNhbGxiYWNrKClcbiAgICAgICAgbGV0IGN1cnJlbnRDeWNsZSA9IHRoaXMuaW5jQ3ljbGUoZWwsIERFQk9VTkNFX1RSSUdHRVIsIHRyaWdnZXIpXG4gICAgICAgIGlmKGlzTmFOKHRpbWVvdXQpKXsgcmV0dXJuIGxvZ0Vycm9yKGBpbnZhbGlkIHRocm90dGxlL2RlYm91bmNlIHZhbHVlOiAke3ZhbHVlfWApIH1cbiAgICAgICAgaWYodGhyb3R0bGUpe1xuICAgICAgICAgIGxldCBuZXdLZXlEb3duID0gZmFsc2VcbiAgICAgICAgICBpZihldmVudC50eXBlID09PSBcImtleWRvd25cIil7XG4gICAgICAgICAgICBsZXQgcHJldktleSA9IHRoaXMucHJpdmF0ZShlbCwgREVCT1VOQ0VfUFJFVl9LRVkpXG4gICAgICAgICAgICB0aGlzLnB1dFByaXZhdGUoZWwsIERFQk9VTkNFX1BSRVZfS0VZLCBldmVudC5rZXkpXG4gICAgICAgICAgICBuZXdLZXlEb3duID0gcHJldktleSAhPT0gZXZlbnQua2V5XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYoIW5ld0tleURvd24gJiYgdGhpcy5wcml2YXRlKGVsLCBUSFJPVFRMRUQpKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgICAgICB0aGlzLnB1dFByaXZhdGUoZWwsIFRIUk9UVExFRCwgdHJ1ZSlcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBpZihhc3luY0ZpbHRlcigpKXsgdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIERFQk9VTkNFX1RSSUdHRVIpIH1cbiAgICAgICAgICAgIH0sIHRpbWVvdXQpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYoYXN5bmNGaWx0ZXIoKSl7IHRoaXMudHJpZ2dlckN5Y2xlKGVsLCBERUJPVU5DRV9UUklHR0VSLCBjdXJyZW50Q3ljbGUpIH1cbiAgICAgICAgICB9LCB0aW1lb3V0KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZvcm0gPSBlbC5mb3JtXG4gICAgICAgIGlmKGZvcm0gJiYgdGhpcy5vbmNlKGZvcm0sIFwiYmluZC1kZWJvdW5jZVwiKSl7XG4gICAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsICgpID0+IHtcbiAgICAgICAgICAgIEFycmF5LmZyb20oKG5ldyBGb3JtRGF0YShmb3JtKSkuZW50cmllcygpLCAoW25hbWVdKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBpbnB1dCA9IGZvcm0ucXVlcnlTZWxlY3RvcihgW25hbWU9XCIke25hbWV9XCJdYClcbiAgICAgICAgICAgICAgdGhpcy5pbmNDeWNsZShpbnB1dCwgREVCT1VOQ0VfVFJJR0dFUilcbiAgICAgICAgICAgICAgdGhpcy5kZWxldGVQcml2YXRlKGlucHV0LCBUSFJPVFRMRUQpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5vbmNlKGVsLCBcImJpbmQtZGVib3VuY2VcIikpe1xuICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsICgpID0+IHRoaXMudHJpZ2dlckN5Y2xlKGVsLCBERUJPVU5DRV9UUklHR0VSKSlcbiAgICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB0cmlnZ2VyQ3ljbGUoZWwsIGtleSwgY3VycmVudEN5Y2xlKXtcbiAgICBsZXQgW2N5Y2xlLCB0cmlnZ2VyXSA9IHRoaXMucHJpdmF0ZShlbCwga2V5KVxuICAgIGlmKCFjdXJyZW50Q3ljbGUpeyBjdXJyZW50Q3ljbGUgPSBjeWNsZSB9XG4gICAgaWYoY3VycmVudEN5Y2xlID09PSBjeWNsZSl7XG4gICAgICB0aGlzLmluY0N5Y2xlKGVsLCBrZXkpXG4gICAgICB0cmlnZ2VyKClcbiAgICB9XG4gIH0sXG5cbiAgb25jZShlbCwga2V5KXtcbiAgICBpZih0aGlzLnByaXZhdGUoZWwsIGtleSkgPT09IHRydWUpeyByZXR1cm4gZmFsc2UgfVxuICAgIHRoaXMucHV0UHJpdmF0ZShlbCwga2V5LCB0cnVlKVxuICAgIHJldHVybiB0cnVlXG4gIH0sXG5cbiAgaW5jQ3ljbGUoZWwsIGtleSwgdHJpZ2dlciA9IGZ1bmN0aW9uICgpeyB9KXtcbiAgICBsZXQgW2N1cnJlbnRDeWNsZV0gPSB0aGlzLnByaXZhdGUoZWwsIGtleSkgfHwgWzAsIHRyaWdnZXJdXG4gICAgY3VycmVudEN5Y2xlKytcbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgW2N1cnJlbnRDeWNsZSwgdHJpZ2dlcl0pXG4gICAgcmV0dXJuIGN1cnJlbnRDeWNsZVxuICB9LFxuXG4gIGRpc2NhcmRFcnJvcihjb250YWluZXIsIGVsLCBwaHhGZWVkYmFja0Zvcil7XG4gICAgbGV0IGZpZWxkID0gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShwaHhGZWVkYmFja0ZvcilcbiAgICAvLyBUT0RPOiBSZW1vdmUgaWQgbG9va3VwIGFmdGVyIHdlIHVwZGF0ZSBQaG9lbml4IHRvIHVzZSBpbnB1dF9uYW1lIGluc3RlYWQgb2YgaW5wdXRfaWRcbiAgICBsZXQgaW5wdXQgPSBmaWVsZCAmJiBjb250YWluZXIucXVlcnlTZWxlY3RvcihgW2lkPVwiJHtmaWVsZH1cIl0sIFtuYW1lPVwiJHtmaWVsZH1cIl1gKVxuICAgIGlmKCFpbnB1dCl7IHJldHVybiB9XG5cbiAgICBpZighKHRoaXMucHJpdmF0ZShpbnB1dCwgUEhYX0hBU19GT0NVU0VEKSB8fCB0aGlzLnByaXZhdGUoaW5wdXQuZm9ybSwgUEhYX0hBU19TVUJNSVRURUQpKSl7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKFBIWF9OT19GRUVEQkFDS19DTEFTUylcbiAgICB9XG4gIH0sXG5cbiAgc2hvd0Vycm9yKGlucHV0RWwsIHBoeEZlZWRiYWNrRm9yKXtcbiAgICBpZihpbnB1dEVsLmlkIHx8IGlucHV0RWwubmFtZSl7XG4gICAgICB0aGlzLmFsbChpbnB1dEVsLmZvcm0sIGBbJHtwaHhGZWVkYmFja0Zvcn09XCIke2lucHV0RWwuaWR9XCJdLCBbJHtwaHhGZWVkYmFja0Zvcn09XCIke2lucHV0RWwubmFtZX1cIl1gLCAoZWwpID0+IHtcbiAgICAgICAgdGhpcy5yZW1vdmVDbGFzcyhlbCwgUEhYX05PX0ZFRURCQUNLX0NMQVNTKVxuICAgICAgfSlcbiAgICB9XG4gIH0sXG5cbiAgaXNQaHhDaGlsZChub2RlKXtcbiAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoUEhYX1BBUkVOVF9JRClcbiAgfSxcblxuICBpc1BoeFN0aWNreShub2RlKXtcbiAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoUEhYX1NUSUNLWSkgIT09IG51bGxcbiAgfSxcblxuICBmaXJzdFBoeENoaWxkKGVsKXtcbiAgICByZXR1cm4gdGhpcy5pc1BoeENoaWxkKGVsKSA/IGVsIDogdGhpcy5hbGwoZWwsIGBbJHtQSFhfUEFSRU5UX0lEfV1gKVswXVxuICB9LFxuXG4gIGRpc3BhdGNoRXZlbnQodGFyZ2V0LCBuYW1lLCBvcHRzID0ge30pe1xuICAgIGxldCBidWJibGVzID0gb3B0cy5idWJibGVzID09PSB1bmRlZmluZWQgPyB0cnVlIDogISFvcHRzLmJ1YmJsZXNcbiAgICBsZXQgZXZlbnRPcHRzID0ge2J1YmJsZXM6IGJ1YmJsZXMsIGNhbmNlbGFibGU6IHRydWUsIGRldGFpbDogb3B0cy5kZXRhaWwgfHwge319XG4gICAgbGV0IGV2ZW50ID0gbmFtZSA9PT0gXCJjbGlja1wiID8gbmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiLCBldmVudE9wdHMpIDogbmV3IEN1c3RvbUV2ZW50KG5hbWUsIGV2ZW50T3B0cylcbiAgICB0YXJnZXQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgfSxcblxuICBjbG9uZU5vZGUobm9kZSwgaHRtbCl7XG4gICAgaWYodHlwZW9mIChodG1sKSA9PT0gXCJ1bmRlZmluZWRcIil7XG4gICAgICByZXR1cm4gbm9kZS5jbG9uZU5vZGUodHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGNsb25lZCA9IG5vZGUuY2xvbmVOb2RlKGZhbHNlKVxuICAgICAgY2xvbmVkLmlubmVySFRNTCA9IGh0bWxcbiAgICAgIHJldHVybiBjbG9uZWRcbiAgICB9XG4gIH0sXG5cbiAgbWVyZ2VBdHRycyh0YXJnZXQsIHNvdXJjZSwgb3B0cyA9IHt9KXtcbiAgICBsZXQgZXhjbHVkZSA9IG9wdHMuZXhjbHVkZSB8fCBbXVxuICAgIGxldCBpc0lnbm9yZWQgPSBvcHRzLmlzSWdub3JlZFxuICAgIGxldCBzb3VyY2VBdHRycyA9IHNvdXJjZS5hdHRyaWJ1dGVzXG4gICAgZm9yKGxldCBpID0gc291cmNlQXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pe1xuICAgICAgbGV0IG5hbWUgPSBzb3VyY2VBdHRyc1tpXS5uYW1lXG4gICAgICBpZihleGNsdWRlLmluZGV4T2YobmFtZSkgPCAwKXsgdGFyZ2V0LnNldEF0dHJpYnV0ZShuYW1lLCBzb3VyY2UuZ2V0QXR0cmlidXRlKG5hbWUpKSB9XG4gICAgfVxuXG4gICAgbGV0IHRhcmdldEF0dHJzID0gdGFyZ2V0LmF0dHJpYnV0ZXNcbiAgICBmb3IobGV0IGkgPSB0YXJnZXRBdHRycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7XG4gICAgICBsZXQgbmFtZSA9IHRhcmdldEF0dHJzW2ldLm5hbWVcbiAgICAgIGlmKGlzSWdub3JlZCl7XG4gICAgICAgIGlmKG5hbWUuc3RhcnRzV2l0aChcImRhdGEtXCIpICYmICFzb3VyY2UuaGFzQXR0cmlidXRlKG5hbWUpKXsgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShuYW1lKSB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZighc291cmNlLmhhc0F0dHJpYnV0ZShuYW1lKSl7IHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUobmFtZSkgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXJnZUZvY3VzZWRJbnB1dCh0YXJnZXQsIHNvdXJjZSl7XG4gICAgLy8gc2tpcCBzZWxlY3RzIGJlY2F1c2UgRkYgd2lsbCByZXNldCBoaWdobGlnaHRlZCBpbmRleCBmb3IgYW55IHNldEF0dHJpYnV0ZVxuICAgIGlmKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQpKXsgRE9NLm1lcmdlQXR0cnModGFyZ2V0LCBzb3VyY2UsIHtleGNsdWRlOiBbXCJ2YWx1ZVwiXX0pIH1cbiAgICBpZihzb3VyY2UucmVhZE9ubHkpe1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcInJlYWRvbmx5XCIsIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJyZWFkb25seVwiKVxuICAgIH1cbiAgfSxcblxuICBoYXNTZWxlY3Rpb25SYW5nZShlbCl7XG4gICAgcmV0dXJuIGVsLnNldFNlbGVjdGlvblJhbmdlICYmIChlbC50eXBlID09PSBcInRleHRcIiB8fCBlbC50eXBlID09PSBcInRleHRhcmVhXCIpXG4gIH0sXG5cbiAgcmVzdG9yZUZvY3VzKGZvY3VzZWQsIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpe1xuICAgIGlmKCFET00uaXNUZXh0dWFsSW5wdXQoZm9jdXNlZCkpeyByZXR1cm4gfVxuICAgIGxldCB3YXNGb2N1c2VkID0gZm9jdXNlZC5tYXRjaGVzKFwiOmZvY3VzXCIpXG4gICAgaWYoZm9jdXNlZC5yZWFkT25seSl7IGZvY3VzZWQuYmx1cigpIH1cbiAgICBpZighd2FzRm9jdXNlZCl7IGZvY3VzZWQuZm9jdXMoKSB9XG4gICAgaWYodGhpcy5oYXNTZWxlY3Rpb25SYW5nZShmb2N1c2VkKSl7XG4gICAgICBmb2N1c2VkLnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpXG4gICAgfVxuICB9LFxuXG4gIGlzRm9ybUlucHV0KGVsKXsgcmV0dXJuIC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhKSQvaS50ZXN0KGVsLnRhZ05hbWUpICYmIGVsLnR5cGUgIT09IFwiYnV0dG9uXCIgfSxcblxuICBzeW5jQXR0cnNUb1Byb3BzKGVsKXtcbiAgICBpZihlbCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgQ0hFQ0tBQkxFX0lOUFVUUy5pbmRleE9mKGVsLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSkgPj0gMCl7XG4gICAgICBlbC5jaGVja2VkID0gZWwuZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKSAhPT0gbnVsbFxuICAgIH1cbiAgfSxcblxuICBpc1RleHR1YWxJbnB1dChlbCl7IHJldHVybiBGT0NVU0FCTEVfSU5QVVRTLmluZGV4T2YoZWwudHlwZSkgPj0gMCB9LFxuXG4gIGlzTm93VHJpZ2dlckZvcm1FeHRlcm5hbChlbCwgcGh4VHJpZ2dlckV4dGVybmFsKXtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShwaHhUcmlnZ2VyRXh0ZXJuYWwpICE9PSBudWxsXG4gIH0sXG5cbiAgc3luY1BlbmRpbmdSZWYoZnJvbUVsLCB0b0VsLCBkaXNhYmxlV2l0aCl7XG4gICAgbGV0IHJlZiA9IGZyb21FbC5nZXRBdHRyaWJ1dGUoUEhYX1JFRilcbiAgICBpZihyZWYgPT09IG51bGwpeyByZXR1cm4gdHJ1ZSB9XG4gICAgbGV0IHJlZlNyYyA9IGZyb21FbC5nZXRBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpXG5cbiAgICBpZihET00uaXNGb3JtSW5wdXQoZnJvbUVsKSB8fCBmcm9tRWwuZ2V0QXR0cmlidXRlKGRpc2FibGVXaXRoKSAhPT0gbnVsbCl7XG4gICAgICBpZihET00uaXNVcGxvYWRJbnB1dChmcm9tRWwpKXsgRE9NLm1lcmdlQXR0cnMoZnJvbUVsLCB0b0VsLCB7aXNJZ25vcmVkOiB0cnVlfSkgfVxuICAgICAgRE9NLnB1dFByaXZhdGUoZnJvbUVsLCBQSFhfUkVGLCB0b0VsKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2goY2xhc3NOYW1lID0+IHtcbiAgICAgICAgZnJvbUVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpICYmIHRvRWwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpXG4gICAgICB9KVxuICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoUEhYX1JFRiwgcmVmKVxuICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoUEhYX1JFRl9TUkMsIHJlZlNyYylcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9LFxuXG4gIGNsZWFuQ2hpbGROb2Rlcyhjb250YWluZXIsIHBoeFVwZGF0ZSl7XG4gICAgaWYoRE9NLmlzUGh4VXBkYXRlKGNvbnRhaW5lciwgcGh4VXBkYXRlLCBbXCJhcHBlbmRcIiwgXCJwcmVwZW5kXCJdKSl7XG4gICAgICBsZXQgdG9SZW1vdmUgPSBbXVxuICAgICAgY29udGFpbmVyLmNoaWxkTm9kZXMuZm9yRWFjaChjaGlsZE5vZGUgPT4ge1xuICAgICAgICBpZighY2hpbGROb2RlLmlkKXtcbiAgICAgICAgICAvLyBTa2lwIHdhcm5pbmcgaWYgaXQncyBhbiBlbXB0eSB0ZXh0IG5vZGUgKGUuZy4gYSBuZXctbGluZSlcbiAgICAgICAgICBsZXQgaXNFbXB0eVRleHROb2RlID0gY2hpbGROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZE5vZGUubm9kZVZhbHVlLnRyaW0oKSA9PT0gXCJcIlxuICAgICAgICAgIGlmKCFpc0VtcHR5VGV4dE5vZGUpe1xuICAgICAgICAgICAgbG9nRXJyb3IoXCJvbmx5IEhUTUwgZWxlbWVudCB0YWdzIHdpdGggYW4gaWQgYXJlIGFsbG93ZWQgaW5zaWRlIGNvbnRhaW5lcnMgd2l0aCBwaHgtdXBkYXRlLlxcblxcblwiICtcbiAgICAgICAgICAgICAgYHJlbW92aW5nIGlsbGVnYWwgbm9kZTogXCIkeyhjaGlsZE5vZGUub3V0ZXJIVE1MIHx8IGNoaWxkTm9kZS5ub2RlVmFsdWUpLnRyaW0oKX1cIlxcblxcbmApXG4gICAgICAgICAgfVxuICAgICAgICAgIHRvUmVtb3ZlLnB1c2goY2hpbGROb2RlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgdG9SZW1vdmUuZm9yRWFjaChjaGlsZE5vZGUgPT4gY2hpbGROb2RlLnJlbW92ZSgpKVxuICAgIH1cbiAgfSxcblxuICByZXBsYWNlUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhZ05hbWUsIGF0dHJzKXtcbiAgICBsZXQgcmV0YWluZWRBdHRycyA9IG5ldyBTZXQoW1wiaWRcIiwgUEhYX1NFU1NJT04sIFBIWF9TVEFUSUMsIFBIWF9NQUlOLCBQSFhfUk9PVF9JRF0pXG4gICAgaWYoY29udGFpbmVyLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpKXtcbiAgICAgIEFycmF5LmZyb20oY29udGFpbmVyLmF0dHJpYnV0ZXMpXG4gICAgICAgIC5maWx0ZXIoYXR0ciA9PiAhcmV0YWluZWRBdHRycy5oYXMoYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaChhdHRyID0+IGNvbnRhaW5lci5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKSlcblxuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpXG4gICAgICAgIC5maWx0ZXIobmFtZSA9PiAhcmV0YWluZWRBdHRycy5oYXMobmFtZS50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgLmZvckVhY2goYXR0ciA9PiBjb250YWluZXIuc2V0QXR0cmlidXRlKGF0dHIsIGF0dHJzW2F0dHJdKSlcblxuICAgICAgcmV0dXJuIGNvbnRhaW5lclxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZXdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpXG4gICAgICBPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChhdHRyID0+IG5ld0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0cnNbYXR0cl0pKVxuICAgICAgcmV0YWluZWRBdHRycy5mb3JFYWNoKGF0dHIgPT4gbmV3Q29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBjb250YWluZXIuZ2V0QXR0cmlidXRlKGF0dHIpKSlcbiAgICAgIG5ld0NvbnRhaW5lci5pbm5lckhUTUwgPSBjb250YWluZXIuaW5uZXJIVE1MXG4gICAgICBjb250YWluZXIucmVwbGFjZVdpdGgobmV3Q29udGFpbmVyKVxuICAgICAgcmV0dXJuIG5ld0NvbnRhaW5lclxuICAgIH1cbiAgfSxcblxuICBnZXRTdGlja3koZWwsIG5hbWUsIGRlZmF1bHRWYWwpe1xuICAgIGxldCBvcCA9IChET00ucHJpdmF0ZShlbCwgXCJzdGlja3lcIikgfHwgW10pLmZpbmQoKFtleGlzdGluZ05hbWUsIF0pID0+IG5hbWUgPT09IGV4aXN0aW5nTmFtZSlcbiAgICBpZihvcCl7XG4gICAgICBsZXQgW19uYW1lLCBfb3AsIHN0YXNoZWRSZXN1bHRdID0gb3BcbiAgICAgIHJldHVybiBzdGFzaGVkUmVzdWx0XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0eXBlb2YoZGVmYXVsdFZhbCkgPT09IFwiZnVuY3Rpb25cIiA/IGRlZmF1bHRWYWwoKSA6IGRlZmF1bHRWYWxcbiAgICB9XG4gIH0sXG5cbiAgZGVsZXRlU3RpY2t5KGVsLCBuYW1lKXtcbiAgICB0aGlzLnVwZGF0ZVByaXZhdGUoZWwsIFwic3RpY2t5XCIsIFtdLCBvcHMgPT4ge1xuICAgICAgcmV0dXJuIG9wcy5maWx0ZXIoKFtleGlzdGluZ05hbWUsIF9dKSA9PiBleGlzdGluZ05hbWUgIT09IG5hbWUpXG4gICAgfSlcbiAgfSxcblxuICBwdXRTdGlja3koZWwsIG5hbWUsIG9wKXtcbiAgICBsZXQgc3Rhc2hlZFJlc3VsdCA9IG9wKGVsKVxuICAgIHRoaXMudXBkYXRlUHJpdmF0ZShlbCwgXCJzdGlja3lcIiwgW10sIG9wcyA9PiB7XG4gICAgICBsZXQgZXhpc3RpbmdJbmRleCA9IG9wcy5maW5kSW5kZXgoKFtleGlzdGluZ05hbWUsIF0pID0+IG5hbWUgPT09IGV4aXN0aW5nTmFtZSlcbiAgICAgIGlmKGV4aXN0aW5nSW5kZXggPj0gMCl7XG4gICAgICAgIG9wc1tleGlzdGluZ0luZGV4XSA9IFtuYW1lLCBvcCwgc3Rhc2hlZFJlc3VsdF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wcy5wdXNoKFtuYW1lLCBvcCwgc3Rhc2hlZFJlc3VsdF0pXG4gICAgICB9XG4gICAgICByZXR1cm4gb3BzXG4gICAgfSlcbiAgfSxcblxuICBhcHBseVN0aWNreU9wZXJhdGlvbnMoZWwpe1xuICAgIGxldCBvcHMgPSBET00ucHJpdmF0ZShlbCwgXCJzdGlja3lcIilcbiAgICBpZighb3BzKXsgcmV0dXJuIH1cblxuICAgIG9wcy5mb3JFYWNoKChbbmFtZSwgb3AsIF9zdGFzaGVkXSkgPT4gdGhpcy5wdXRTdGlja3koZWwsIG5hbWUsIG9wKSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBET01cbiIsICJpbXBvcnQge1xuICBQSFhfQUNUSVZFX0VOVFJZX1JFRlMsXG4gIFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCxcbiAgUEhYX1BSRUZMSUdIVEVEX1JFRlNcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IHtcbiAgY2hhbm5lbFVwbG9hZGVyLFxuICBsb2dFcnJvclxufSBmcm9tIFwiLi91dGlsc1wiXG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVwbG9hZEVudHJ5IHtcbiAgc3RhdGljIGlzQWN0aXZlKGZpbGVFbCwgZmlsZSl7XG4gICAgbGV0IGlzTmV3ID0gZmlsZS5fcGh4UmVmID09PSB1bmRlZmluZWRcbiAgICBsZXQgYWN0aXZlUmVmcyA9IGZpbGVFbC5nZXRBdHRyaWJ1dGUoUEhYX0FDVElWRV9FTlRSWV9SRUZTKS5zcGxpdChcIixcIilcbiAgICBsZXQgaXNBY3RpdmUgPSBhY3RpdmVSZWZzLmluZGV4T2YoTGl2ZVVwbG9hZGVyLmdlbkZpbGVSZWYoZmlsZSkpID49IDBcbiAgICByZXR1cm4gZmlsZS5zaXplID4gMCAmJiAoaXNOZXcgfHwgaXNBY3RpdmUpXG4gIH1cblxuICBzdGF0aWMgaXNQcmVmbGlnaHRlZChmaWxlRWwsIGZpbGUpe1xuICAgIGxldCBwcmVmbGlnaHRlZFJlZnMgPSBmaWxlRWwuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKS5zcGxpdChcIixcIilcbiAgICBsZXQgaXNQcmVmbGlnaHRlZCA9IHByZWZsaWdodGVkUmVmcy5pbmRleE9mKExpdmVVcGxvYWRlci5nZW5GaWxlUmVmKGZpbGUpKSA+PSAwXG4gICAgcmV0dXJuIGlzUHJlZmxpZ2h0ZWQgJiYgdGhpcy5pc0FjdGl2ZShmaWxlRWwsIGZpbGUpXG4gIH1cblxuICBjb25zdHJ1Y3RvcihmaWxlRWwsIGZpbGUsIHZpZXcpe1xuICAgIHRoaXMucmVmID0gTGl2ZVVwbG9hZGVyLmdlbkZpbGVSZWYoZmlsZSlcbiAgICB0aGlzLmZpbGVFbCA9IGZpbGVFbFxuICAgIHRoaXMuZmlsZSA9IGZpbGVcbiAgICB0aGlzLnZpZXcgPSB2aWV3XG4gICAgdGhpcy5tZXRhID0gbnVsbFxuICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2VcbiAgICB0aGlzLl9pc0RvbmUgPSBmYWxzZVxuICAgIHRoaXMuX3Byb2dyZXNzID0gMFxuICAgIHRoaXMuX2xhc3RQcm9ncmVzc1NlbnQgPSAtMVxuICAgIHRoaXMuX29uRG9uZSA9IGZ1bmN0aW9uICgpeyB9XG4gICAgdGhpcy5fb25FbFVwZGF0ZWQgPSB0aGlzLm9uRWxVcGRhdGVkLmJpbmQodGhpcylcbiAgICB0aGlzLmZpbGVFbC5hZGRFdmVudExpc3RlbmVyKFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCwgdGhpcy5fb25FbFVwZGF0ZWQpXG4gIH1cblxuICBtZXRhZGF0YSgpeyByZXR1cm4gdGhpcy5tZXRhIH1cblxuICBwcm9ncmVzcyhwcm9ncmVzcyl7XG4gICAgdGhpcy5fcHJvZ3Jlc3MgPSBNYXRoLmZsb29yKHByb2dyZXNzKVxuICAgIGlmKHRoaXMuX3Byb2dyZXNzID4gdGhpcy5fbGFzdFByb2dyZXNzU2VudCl7XG4gICAgICBpZih0aGlzLl9wcm9ncmVzcyA+PSAxMDApe1xuICAgICAgICB0aGlzLl9wcm9ncmVzcyA9IDEwMFxuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gMTAwXG4gICAgICAgIHRoaXMuX2lzRG9uZSA9IHRydWVcbiAgICAgICAgdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsIHRoaXMucmVmLCAxMDAsICgpID0+IHtcbiAgICAgICAgICBMaXZlVXBsb2FkZXIudW50cmFja0ZpbGUodGhpcy5maWxlRWwsIHRoaXMuZmlsZSlcbiAgICAgICAgICB0aGlzLl9vbkRvbmUoKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzU2VudCA9IHRoaXMuX3Byb2dyZXNzXG4gICAgICAgIHRoaXMudmlldy5wdXNoRmlsZVByb2dyZXNzKHRoaXMuZmlsZUVsLCB0aGlzLnJlZiwgdGhpcy5fcHJvZ3Jlc3MpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2FuY2VsKCl7XG4gICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlXG4gICAgdGhpcy5faXNEb25lID0gdHJ1ZVxuICAgIHRoaXMuX29uRG9uZSgpXG4gIH1cblxuICBpc0RvbmUoKXsgcmV0dXJuIHRoaXMuX2lzRG9uZSB9XG5cbiAgZXJyb3IocmVhc29uID0gXCJmYWlsZWRcIil7XG4gICAgdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsIHRoaXMucmVmLCB7ZXJyb3I6IHJlYXNvbn0pXG4gICAgTGl2ZVVwbG9hZGVyLmNsZWFyRmlsZXModGhpcy5maWxlRWwpXG4gIH1cblxuICAvL3ByaXZhdGVcblxuICBvbkRvbmUoY2FsbGJhY2spe1xuICAgIHRoaXMuX29uRG9uZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuZmlsZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoUEhYX0xJVkVfRklMRV9VUERBVEVELCB0aGlzLl9vbkVsVXBkYXRlZClcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9XG4gIH1cblxuICBvbkVsVXBkYXRlZCgpe1xuICAgIGxldCBhY3RpdmVSZWZzID0gdGhpcy5maWxlRWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUykuc3BsaXQoXCIsXCIpXG4gICAgaWYoYWN0aXZlUmVmcy5pbmRleE9mKHRoaXMucmVmKSA9PT0gLTEpeyB0aGlzLmNhbmNlbCgpIH1cbiAgfVxuXG4gIHRvUHJlZmxpZ2h0UGF5bG9hZCgpe1xuICAgIHJldHVybiB7XG4gICAgICBsYXN0X21vZGlmaWVkOiB0aGlzLmZpbGUubGFzdE1vZGlmaWVkLFxuICAgICAgbmFtZTogdGhpcy5maWxlLm5hbWUsXG4gICAgICBzaXplOiB0aGlzLmZpbGUuc2l6ZSxcbiAgICAgIHR5cGU6IHRoaXMuZmlsZS50eXBlLFxuICAgICAgcmVmOiB0aGlzLnJlZlxuICAgIH1cbiAgfVxuXG4gIHVwbG9hZGVyKHVwbG9hZGVycyl7XG4gICAgaWYodGhpcy5tZXRhLnVwbG9hZGVyKXtcbiAgICAgIGxldCBjYWxsYmFjayA9IHVwbG9hZGVyc1t0aGlzLm1ldGEudXBsb2FkZXJdIHx8IGxvZ0Vycm9yKGBubyB1cGxvYWRlciBjb25maWd1cmVkIGZvciAke3RoaXMubWV0YS51cGxvYWRlcn1gKVxuICAgICAgcmV0dXJuIHtuYW1lOiB0aGlzLm1ldGEudXBsb2FkZXIsIGNhbGxiYWNrOiBjYWxsYmFja31cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtuYW1lOiBcImNoYW5uZWxcIiwgY2FsbGJhY2s6IGNoYW5uZWxVcGxvYWRlcn1cbiAgICB9XG4gIH1cblxuICB6aXBQb3N0RmxpZ2h0KHJlc3Ape1xuICAgIHRoaXMubWV0YSA9IHJlc3AuZW50cmllc1t0aGlzLnJlZl1cbiAgICBpZighdGhpcy5tZXRhKXsgbG9nRXJyb3IoYG5vIHByZWZsaWdodCB1cGxvYWQgcmVzcG9uc2UgcmV0dXJuZWQgd2l0aCByZWYgJHt0aGlzLnJlZn1gLCB7aW5wdXQ6IHRoaXMuZmlsZUVsLCByZXNwb25zZTogcmVzcH0pIH1cbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIFBIWF9ET05FX1JFRlMsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxuICBQSFhfVVBMT0FEX1JFRlxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQge1xufSBmcm9tIFwiLi91dGlsc1wiXG5cbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCJcbmltcG9ydCBVcGxvYWRFbnRyeSBmcm9tIFwiLi91cGxvYWRfZW50cnlcIlxuXG5sZXQgbGl2ZVVwbG9hZGVyRmlsZVJlZiA9IDBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZVVwbG9hZGVyIHtcbiAgc3RhdGljIGdlbkZpbGVSZWYoZmlsZSl7XG4gICAgbGV0IHJlZiA9IGZpbGUuX3BoeFJlZlxuICAgIGlmKHJlZiAhPT0gdW5kZWZpbmVkKXtcbiAgICAgIHJldHVybiByZWZcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsZS5fcGh4UmVmID0gKGxpdmVVcGxvYWRlckZpbGVSZWYrKykudG9TdHJpbmcoKVxuICAgICAgcmV0dXJuIGZpbGUuX3BoeFJlZlxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRFbnRyeURhdGFVUkwoaW5wdXRFbCwgcmVmLCBjYWxsYmFjayl7XG4gICAgbGV0IGZpbGUgPSB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpLmZpbmQoZmlsZSA9PiB0aGlzLmdlbkZpbGVSZWYoZmlsZSkgPT09IHJlZilcbiAgICBjYWxsYmFjayhVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpKVxuICB9XG5cbiAgc3RhdGljIGhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCl7XG4gICAgbGV0IGFjdGl2ZSA9IDBcbiAgICBET00uZmluZFVwbG9hZElucHV0cyhmb3JtRWwpLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgaWYoaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKSAhPT0gaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9ET05FX1JFRlMpKXtcbiAgICAgICAgYWN0aXZlKytcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBhY3RpdmUgPiAwXG4gIH1cblxuICBzdGF0aWMgc2VyaWFsaXplVXBsb2FkcyhpbnB1dEVsKXtcbiAgICBsZXQgZmlsZXMgPSB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpXG4gICAgbGV0IGZpbGVEYXRhID0ge31cbiAgICBmaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgbGV0IGVudHJ5ID0ge3BhdGg6IGlucHV0RWwubmFtZX1cbiAgICAgIGxldCB1cGxvYWRSZWYgPSBpbnB1dEVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRilcbiAgICAgIGZpbGVEYXRhW3VwbG9hZFJlZl0gPSBmaWxlRGF0YVt1cGxvYWRSZWZdIHx8IFtdXG4gICAgICBlbnRyeS5yZWYgPSB0aGlzLmdlbkZpbGVSZWYoZmlsZSlcbiAgICAgIGVudHJ5Lm5hbWUgPSBmaWxlLm5hbWUgfHwgZW50cnkucmVmXG4gICAgICBlbnRyeS50eXBlID0gZmlsZS50eXBlXG4gICAgICBlbnRyeS5zaXplID0gZmlsZS5zaXplXG4gICAgICBmaWxlRGF0YVt1cGxvYWRSZWZdLnB1c2goZW50cnkpXG4gICAgfSlcbiAgICByZXR1cm4gZmlsZURhdGFcbiAgfVxuXG4gIHN0YXRpYyBjbGVhckZpbGVzKGlucHV0RWwpe1xuICAgIGlucHV0RWwudmFsdWUgPSBudWxsXG4gICAgaW5wdXRFbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpXG4gICAgRE9NLnB1dFByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSlcbiAgfVxuXG4gIHN0YXRpYyB1bnRyYWNrRmlsZShpbnB1dEVsLCBmaWxlKXtcbiAgICBET00ucHV0UHJpdmF0ZShpbnB1dEVsLCBcImZpbGVzXCIsIERPTS5wcml2YXRlKGlucHV0RWwsIFwiZmlsZXNcIikuZmlsdGVyKGYgPT4gIU9iamVjdC5pcyhmLCBmaWxlKSkpXG4gIH1cblxuICBzdGF0aWMgdHJhY2tGaWxlcyhpbnB1dEVsLCBmaWxlcyl7XG4gICAgaWYoaW5wdXRFbC5nZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSAhPT0gbnVsbCl7XG4gICAgICBsZXQgbmV3RmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhdGhpcy5hY3RpdmVGaWxlcyhpbnB1dEVsKS5maW5kKGYgPT4gT2JqZWN0LmlzKGYsIGZpbGUpKSlcbiAgICAgIERPTS5wdXRQcml2YXRlKGlucHV0RWwsIFwiZmlsZXNcIiwgdGhpcy5hY3RpdmVGaWxlcyhpbnB1dEVsKS5jb25jYXQobmV3RmlsZXMpKVxuICAgICAgaW5wdXRFbC52YWx1ZSA9IG51bGxcbiAgICB9IGVsc2Uge1xuICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBmaWxlcylcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYWN0aXZlRmlsZUlucHV0cyhmb3JtRWwpe1xuICAgIGxldCBmaWxlSW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHMoZm9ybUVsKVxuICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVJbnB1dHMpLmZpbHRlcihlbCA9PiBlbC5maWxlcyAmJiB0aGlzLmFjdGl2ZUZpbGVzKGVsKS5sZW5ndGggPiAwKVxuICB9XG5cbiAgc3RhdGljIGFjdGl2ZUZpbGVzKGlucHV0KXtcbiAgICByZXR1cm4gKERPTS5wcml2YXRlKGlucHV0LCBcImZpbGVzXCIpIHx8IFtdKS5maWx0ZXIoZiA9PiBVcGxvYWRFbnRyeS5pc0FjdGl2ZShpbnB1dCwgZikpXG4gIH1cblxuICBzdGF0aWMgaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKXtcbiAgICBsZXQgZmlsZUlucHV0cyA9IERPTS5maW5kVXBsb2FkSW5wdXRzKGZvcm1FbClcbiAgICByZXR1cm4gQXJyYXkuZnJvbShmaWxlSW5wdXRzKS5maWx0ZXIoaW5wdXQgPT4gdGhpcy5maWxlc0F3YWl0aW5nUHJlZmxpZ2h0KGlucHV0KS5sZW5ndGggPiAwKVxuICB9XG5cbiAgc3RhdGljIGZpbGVzQXdhaXRpbmdQcmVmbGlnaHQoaW5wdXQpe1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0KS5maWx0ZXIoZiA9PiAhVXBsb2FkRW50cnkuaXNQcmVmbGlnaHRlZChpbnB1dCwgZikpXG4gIH1cblxuICBjb25zdHJ1Y3RvcihpbnB1dEVsLCB2aWV3LCBvbkNvbXBsZXRlKXtcbiAgICB0aGlzLnZpZXcgPSB2aWV3XG4gICAgdGhpcy5vbkNvbXBsZXRlID0gb25Db21wbGV0ZVxuICAgIHRoaXMuX2VudHJpZXMgPVxuICAgICAgQXJyYXkuZnJvbShMaXZlVXBsb2FkZXIuZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dEVsKSB8fCBbXSlcbiAgICAgICAgLm1hcChmaWxlID0+IG5ldyBVcGxvYWRFbnRyeShpbnB1dEVsLCBmaWxlLCB2aWV3KSlcblxuICAgIHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPSB0aGlzLl9lbnRyaWVzLmxlbmd0aFxuICB9XG5cbiAgZW50cmllcygpeyByZXR1cm4gdGhpcy5fZW50cmllcyB9XG5cbiAgaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgbGl2ZVNvY2tldCl7XG4gICAgdGhpcy5fZW50cmllcyA9XG4gICAgICB0aGlzLl9lbnRyaWVzLm1hcChlbnRyeSA9PiB7XG4gICAgICAgIGVudHJ5LnppcFBvc3RGbGlnaHQocmVzcClcbiAgICAgICAgZW50cnkub25Eb25lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm51bUVudHJpZXNJblByb2dyZXNzLS1cbiAgICAgICAgICBpZih0aGlzLm51bUVudHJpZXNJblByb2dyZXNzID09PSAwKXsgdGhpcy5vbkNvbXBsZXRlKCkgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZW50cnlcbiAgICAgIH0pXG5cbiAgICBsZXQgZ3JvdXBlZEVudHJpZXMgPSB0aGlzLl9lbnRyaWVzLnJlZHVjZSgoYWNjLCBlbnRyeSkgPT4ge1xuICAgICAgbGV0IHtuYW1lLCBjYWxsYmFja30gPSBlbnRyeS51cGxvYWRlcihsaXZlU29ja2V0LnVwbG9hZGVycylcbiAgICAgIGFjY1tuYW1lXSA9IGFjY1tuYW1lXSB8fCB7Y2FsbGJhY2s6IGNhbGxiYWNrLCBlbnRyaWVzOiBbXX1cbiAgICAgIGFjY1tuYW1lXS5lbnRyaWVzLnB1c2goZW50cnkpXG4gICAgICByZXR1cm4gYWNjXG4gICAgfSwge30pXG5cbiAgICBmb3IobGV0IG5hbWUgaW4gZ3JvdXBlZEVudHJpZXMpe1xuICAgICAgbGV0IHtjYWxsYmFjaywgZW50cmllc30gPSBncm91cGVkRW50cmllc1tuYW1lXVxuICAgICAgY2FsbGJhY2soZW50cmllcywgb25FcnJvciwgcmVzcCwgbGl2ZVNvY2tldClcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBQSFhfQUNUSVZFX0VOVFJZX1JFRlMsXG4gIFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCxcbiAgUEhYX1BSRUZMSUdIVEVEX1JFRlMsXG4gIFBIWF9VUExPQURfUkVGXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiXG5cbmxldCBIb29rcyA9IHtcbiAgTGl2ZUZpbGVVcGxvYWQ6IHtcbiAgICBhY3RpdmVSZWZzKCl7IHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfQUNUSVZFX0VOVFJZX1JFRlMpIH0sXG5cbiAgICBwcmVmbGlnaHRlZFJlZnMoKXsgcmV0dXJuIHRoaXMuZWwuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKSB9LFxuXG4gICAgbW91bnRlZCgpeyB0aGlzLnByZWZsaWdodGVkV2FzID0gdGhpcy5wcmVmbGlnaHRlZFJlZnMoKSB9LFxuXG4gICAgdXBkYXRlZCgpe1xuICAgICAgbGV0IG5ld1ByZWZsaWdodHMgPSB0aGlzLnByZWZsaWdodGVkUmVmcygpXG4gICAgICBpZih0aGlzLnByZWZsaWdodGVkV2FzICE9PSBuZXdQcmVmbGlnaHRzKXtcbiAgICAgICAgdGhpcy5wcmVmbGlnaHRlZFdhcyA9IG5ld1ByZWZsaWdodHNcbiAgICAgICAgaWYobmV3UHJlZmxpZ2h0cyA9PT0gXCJcIil7XG4gICAgICAgICAgdGhpcy5fX3ZpZXcuY2FuY2VsU3VibWl0KHRoaXMuZWwuZm9ybSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZih0aGlzLmFjdGl2ZVJlZnMoKSA9PT0gXCJcIil7IHRoaXMuZWwudmFsdWUgPSBudWxsIH1cbiAgICAgIHRoaXMuZWwuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoUEhYX0xJVkVfRklMRV9VUERBVEVEKSlcbiAgICB9XG4gIH0sXG5cbiAgTGl2ZUltZ1ByZXZpZXc6IHtcbiAgICBtb3VudGVkKCl7XG4gICAgICB0aGlzLnJlZiA9IHRoaXMuZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtZW50cnktcmVmXCIpXG4gICAgICB0aGlzLmlucHV0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRikpXG4gICAgICBMaXZlVXBsb2FkZXIuZ2V0RW50cnlEYXRhVVJMKHRoaXMuaW5wdXRFbCwgdGhpcy5yZWYsIHVybCA9PiB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsXG4gICAgICAgIHRoaXMuZWwuc3JjID0gdXJsXG4gICAgICB9KVxuICAgIH0sXG4gICAgZGVzdHJveWVkKCl7XG4gICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMudXJsKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBIb29rc1xuIiwgImltcG9ydCB7XG4gIG1heWJlXG59IGZyb20gXCIuL3V0aWxzXCJcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01Qb3N0TW9ycGhSZXN0b3JlciB7XG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lckJlZm9yZSwgY29udGFpbmVyQWZ0ZXIsIHVwZGF0ZVR5cGUpe1xuICAgIGxldCBpZHNCZWZvcmUgPSBuZXcgU2V0KClcbiAgICBsZXQgaWRzQWZ0ZXIgPSBuZXcgU2V0KFsuLi5jb250YWluZXJBZnRlci5jaGlsZHJlbl0ubWFwKGNoaWxkID0+IGNoaWxkLmlkKSlcblxuICAgIGxldCBlbGVtZW50c1RvTW9kaWZ5ID0gW11cblxuICAgIEFycmF5LmZyb20oY29udGFpbmVyQmVmb3JlLmNoaWxkcmVuKS5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIGlmKGNoaWxkLmlkKXsgLy8gYWxsIG9mIG91ciBjaGlsZHJlbiBzaG91bGQgYmUgZWxlbWVudHMgd2l0aCBpZHNcbiAgICAgICAgaWRzQmVmb3JlLmFkZChjaGlsZC5pZClcbiAgICAgICAgaWYoaWRzQWZ0ZXIuaGFzKGNoaWxkLmlkKSl7XG4gICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudElkID0gY2hpbGQucHJldmlvdXNFbGVtZW50U2libGluZyAmJiBjaGlsZC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlkXG4gICAgICAgICAgZWxlbWVudHNUb01vZGlmeS5wdXNoKHtlbGVtZW50SWQ6IGNoaWxkLmlkLCBwcmV2aW91c0VsZW1lbnRJZDogcHJldmlvdXNFbGVtZW50SWR9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuY29udGFpbmVySWQgPSBjb250YWluZXJBZnRlci5pZFxuICAgIHRoaXMudXBkYXRlVHlwZSA9IHVwZGF0ZVR5cGVcbiAgICB0aGlzLmVsZW1lbnRzVG9Nb2RpZnkgPSBlbGVtZW50c1RvTW9kaWZ5XG4gICAgdGhpcy5lbGVtZW50SWRzVG9BZGQgPSBbLi4uaWRzQWZ0ZXJdLmZpbHRlcihpZCA9PiAhaWRzQmVmb3JlLmhhcyhpZCkpXG4gIH1cblxuICAvLyBXZSBkbyB0aGUgZm9sbG93aW5nIHRvIG9wdGltaXplIGFwcGVuZC9wcmVwZW5kIG9wZXJhdGlvbnM6XG4gIC8vICAgMSkgVHJhY2sgaWRzIG9mIG1vZGlmaWVkIGVsZW1lbnRzICYgb2YgbmV3IGVsZW1lbnRzXG4gIC8vICAgMikgQWxsIHRoZSBtb2RpZmllZCBlbGVtZW50cyBhcmUgcHV0IGJhY2sgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIERPTSB0cmVlXG4gIC8vICAgICAgYnkgc3RvcmluZyB0aGUgaWQgb2YgdGhlaXIgcHJldmlvdXMgc2libGluZ1xuICAvLyAgIDMpIE5ldyBlbGVtZW50cyBhcmUgZ29pbmcgdG8gYmUgcHV0IGluIHRoZSByaWdodCBwbGFjZSBieSBtb3JwaGRvbSBkdXJpbmcgYXBwZW5kLlxuICAvLyAgICAgIEZvciBwcmVwZW5kLCB3ZSBtb3ZlIHRoZW0gdG8gdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBjb250YWluZXJcbiAgcGVyZm9ybSgpe1xuICAgIGxldCBjb250YWluZXIgPSBET00uYnlJZCh0aGlzLmNvbnRhaW5lcklkKVxuICAgIHRoaXMuZWxlbWVudHNUb01vZGlmeS5mb3JFYWNoKGVsZW1lbnRUb01vZGlmeSA9PiB7XG4gICAgICBpZihlbGVtZW50VG9Nb2RpZnkucHJldmlvdXNFbGVtZW50SWQpe1xuICAgICAgICBtYXliZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50VG9Nb2RpZnkucHJldmlvdXNFbGVtZW50SWQpLCBwcmV2aW91c0VsZW0gPT4ge1xuICAgICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLCBlbGVtID0+IHtcbiAgICAgICAgICAgIGxldCBpc0luUmlnaHRQbGFjZSA9IGVsZW0ucHJldmlvdXNFbGVtZW50U2libGluZyAmJiBlbGVtLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaWQgPT0gcHJldmlvdXNFbGVtLmlkXG4gICAgICAgICAgICBpZighaXNJblJpZ2h0UGxhY2Upe1xuICAgICAgICAgICAgICBwcmV2aW91c0VsZW0uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJlbmRcIiwgZWxlbSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyXG4gICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLCBlbGVtID0+IHtcbiAgICAgICAgICBsZXQgaXNJblJpZ2h0UGxhY2UgPSBlbGVtLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgPT0gbnVsbFxuICAgICAgICAgIGlmKCFpc0luUmlnaHRQbGFjZSl7XG4gICAgICAgICAgICBjb250YWluZXIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBlbGVtKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYodGhpcy51cGRhdGVUeXBlID09IFwicHJlcGVuZFwiKXtcbiAgICAgIHRoaXMuZWxlbWVudElkc1RvQWRkLnJldmVyc2UoKS5mb3JFYWNoKGVsZW1JZCA9PiB7XG4gICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1JZCksIGVsZW0gPT4gY29udGFpbmVyLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWxlbSkpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuIiwgInZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFID0gMTE7XG5cbmZ1bmN0aW9uIG1vcnBoQXR0cnMoZnJvbU5vZGUsIHRvTm9kZSkge1xuICAgIHZhciB0b05vZGVBdHRycyA9IHRvTm9kZS5hdHRyaWJ1dGVzO1xuICAgIHZhciBhdHRyO1xuICAgIHZhciBhdHRyTmFtZTtcbiAgICB2YXIgYXR0ck5hbWVzcGFjZVVSSTtcbiAgICB2YXIgYXR0clZhbHVlO1xuICAgIHZhciBmcm9tVmFsdWU7XG5cbiAgICAvLyBkb2N1bWVudC1mcmFnbWVudHMgZG9udCBoYXZlIGF0dHJpYnV0ZXMgc28gbGV0cyBub3QgZG8gYW55dGhpbmdcbiAgICBpZiAodG9Ob2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8IGZyb21Ob2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGF0dHJpYnV0ZXMgb24gb3JpZ2luYWwgRE9NIGVsZW1lbnRcbiAgICBmb3IgKHZhciBpID0gdG9Ob2RlQXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgYXR0ciA9IHRvTm9kZUF0dHJzW2ldO1xuICAgICAgICBhdHRyTmFtZSA9IGF0dHIubmFtZTtcbiAgICAgICAgYXR0ck5hbWVzcGFjZVVSSSA9IGF0dHIubmFtZXNwYWNlVVJJO1xuICAgICAgICBhdHRyVmFsdWUgPSBhdHRyLnZhbHVlO1xuXG4gICAgICAgIGlmIChhdHRyTmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHIubG9jYWxOYW1lIHx8IGF0dHJOYW1lO1xuICAgICAgICAgICAgZnJvbVZhbHVlID0gZnJvbU5vZGUuZ2V0QXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoZnJvbVZhbHVlICE9PSBhdHRyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXR0ci5wcmVmaXggPT09ICd4bWxucycpe1xuICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHIubmFtZTsgLy8gSXQncyBub3QgYWxsb3dlZCB0byBzZXQgYW4gYXR0cmlidXRlIHdpdGggdGhlIFhNTE5TIG5hbWVzcGFjZSB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIGB4bWxuc2AgcHJlZml4XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnNldEF0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnJvbVZhbHVlID0gZnJvbU5vZGUuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcblxuICAgICAgICAgICAgaWYgKGZyb21WYWx1ZSAhPT0gYXR0clZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFueSBleHRyYSBhdHRyaWJ1dGVzIGZvdW5kIG9uIHRoZSBvcmlnaW5hbCBET00gZWxlbWVudCB0aGF0XG4gICAgLy8gd2VyZW4ndCBmb3VuZCBvbiB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gICAgdmFyIGZyb21Ob2RlQXR0cnMgPSBmcm9tTm9kZS5hdHRyaWJ1dGVzO1xuXG4gICAgZm9yICh2YXIgZCA9IGZyb21Ob2RlQXR0cnMubGVuZ3RoIC0gMTsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgYXR0ciA9IGZyb21Ob2RlQXR0cnNbZF07XG4gICAgICAgIGF0dHJOYW1lID0gYXR0ci5uYW1lO1xuICAgICAgICBhdHRyTmFtZXNwYWNlVVJJID0gYXR0ci5uYW1lc3BhY2VVUkk7XG5cbiAgICAgICAgaWYgKGF0dHJOYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAgIGF0dHJOYW1lID0gYXR0ci5sb2NhbE5hbWUgfHwgYXR0ck5hbWU7XG5cbiAgICAgICAgICAgIGlmICghdG9Ob2RlLmhhc0F0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnJlbW92ZUF0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdG9Ob2RlLmhhc0F0dHJpYnV0ZShhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG52YXIgcmFuZ2U7IC8vIENyZWF0ZSBhIHJhbmdlIG9iamVjdCBmb3IgZWZmaWNlbnRseSByZW5kZXJpbmcgc3RyaW5ncyB0byBlbGVtZW50cy5cbnZhciBOU19YSFRNTCA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcblxudmFyIGRvYyA9IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBkb2N1bWVudDtcbnZhciBIQVNfVEVNUExBVEVfU1VQUE9SVCA9ICEhZG9jICYmICdjb250ZW50JyBpbiBkb2MuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbnZhciBIQVNfUkFOR0VfU1VQUE9SVCA9ICEhZG9jICYmIGRvYy5jcmVhdGVSYW5nZSAmJiAnY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50JyBpbiBkb2MuY3JlYXRlUmFuZ2UoKTtcblxuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRGcm9tVGVtcGxhdGUoc3RyKSB7XG4gICAgdmFyIHRlbXBsYXRlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gc3RyO1xuICAgIHJldHVybiB0ZW1wbGF0ZS5jb250ZW50LmNoaWxkTm9kZXNbMF07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50RnJvbVJhbmdlKHN0cikge1xuICAgIGlmICghcmFuZ2UpIHtcbiAgICAgICAgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZShkb2MuYm9keSk7XG4gICAgfVxuXG4gICAgdmFyIGZyYWdtZW50ID0gcmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHN0cik7XG4gICAgcmV0dXJuIGZyYWdtZW50LmNoaWxkTm9kZXNbMF07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50RnJvbVdyYXAoc3RyKSB7XG4gICAgdmFyIGZyYWdtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2JvZHknKTtcbiAgICBmcmFnbWVudC5pbm5lckhUTUwgPSBzdHI7XG4gICAgcmV0dXJuIGZyYWdtZW50LmNoaWxkTm9kZXNbMF07XG59XG5cbi8qKlxuICogVGhpcyBpcyBhYm91dCB0aGUgc2FtZVxuICogdmFyIGh0bWwgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHN0ciwgJ3RleHQvaHRtbCcpO1xuICogcmV0dXJuIGh0bWwuYm9keS5maXJzdENoaWxkO1xuICpcbiAqIEBtZXRob2QgdG9FbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKi9cbmZ1bmN0aW9uIHRvRWxlbWVudChzdHIpIHtcbiAgICBzdHIgPSBzdHIudHJpbSgpO1xuICAgIGlmIChIQVNfVEVNUExBVEVfU1VQUE9SVCkge1xuICAgICAgLy8gYXZvaWQgcmVzdHJpY3Rpb25zIG9uIGNvbnRlbnQgZm9yIHRoaW5ncyBsaWtlIGA8dHI+PHRoPkhpPC90aD48L3RyPmAgd2hpY2hcbiAgICAgIC8vIGNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCBkb2Vzbid0IHN1cHBvcnRcbiAgICAgIC8vIDx0ZW1wbGF0ZT4gc3VwcG9ydCBub3QgYXZhaWxhYmxlIGluIElFXG4gICAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tVGVtcGxhdGUoc3RyKTtcbiAgICB9IGVsc2UgaWYgKEhBU19SQU5HRV9TVVBQT1JUKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tUmFuZ2Uoc3RyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tV3JhcChzdHIpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0d28gbm9kZSdzIG5hbWVzIGFyZSB0aGUgc2FtZS5cbiAqXG4gKiBOT1RFOiBXZSBkb24ndCBib3RoZXIgY2hlY2tpbmcgYG5hbWVzcGFjZVVSSWAgYmVjYXVzZSB5b3Ugd2lsbCBuZXZlciBmaW5kIHR3byBIVE1MIGVsZW1lbnRzIHdpdGggdGhlIHNhbWVcbiAqICAgICAgIG5vZGVOYW1lIGFuZCBkaWZmZXJlbnQgbmFtZXNwYWNlIFVSSXMuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBhXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGIgVGhlIHRhcmdldCBlbGVtZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBjb21wYXJlTm9kZU5hbWVzKGZyb21FbCwgdG9FbCkge1xuICAgIHZhciBmcm9tTm9kZU5hbWUgPSBmcm9tRWwubm9kZU5hbWU7XG4gICAgdmFyIHRvTm9kZU5hbWUgPSB0b0VsLm5vZGVOYW1lO1xuICAgIHZhciBmcm9tQ29kZVN0YXJ0LCB0b0NvZGVTdGFydDtcblxuICAgIGlmIChmcm9tTm9kZU5hbWUgPT09IHRvTm9kZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnJvbUNvZGVTdGFydCA9IGZyb21Ob2RlTmFtZS5jaGFyQ29kZUF0KDApO1xuICAgIHRvQ29kZVN0YXJ0ID0gdG9Ob2RlTmFtZS5jaGFyQ29kZUF0KDApO1xuXG4gICAgLy8gSWYgdGhlIHRhcmdldCBlbGVtZW50IGlzIGEgdmlydHVhbCBET00gbm9kZSBvciBTVkcgbm9kZSB0aGVuIHdlIG1heVxuICAgIC8vIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB0YWcgbmFtZSBiZWZvcmUgY29tcGFyaW5nLiBOb3JtYWwgSFRNTCBlbGVtZW50cyB0aGF0IGFyZVxuICAgIC8vIGluIHRoZSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIlxuICAgIC8vIGFyZSBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZVxuICAgIGlmIChmcm9tQ29kZVN0YXJ0IDw9IDkwICYmIHRvQ29kZVN0YXJ0ID49IDk3KSB7IC8vIGZyb20gaXMgdXBwZXIgYW5kIHRvIGlzIGxvd2VyXG4gICAgICAgIHJldHVybiBmcm9tTm9kZU5hbWUgPT09IHRvTm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICB9IGVsc2UgaWYgKHRvQ29kZVN0YXJ0IDw9IDkwICYmIGZyb21Db2RlU3RhcnQgPj0gOTcpIHsgLy8gdG8gaXMgdXBwZXIgYW5kIGZyb20gaXMgbG93ZXJcbiAgICAgICAgcmV0dXJuIHRvTm9kZU5hbWUgPT09IGZyb21Ob2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGVsZW1lbnQsIG9wdGlvbmFsbHkgd2l0aCBhIGtub3duIG5hbWVzcGFjZSBVUkkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGVsZW1lbnQgbmFtZSwgZS5nLiAnZGl2JyBvciAnc3ZnJ1xuICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lc3BhY2VVUkldIHRoZSBlbGVtZW50J3MgbmFtZXNwYWNlIFVSSSwgaS5lLiB0aGUgdmFsdWUgb2ZcbiAqIGl0cyBgeG1sbnNgIGF0dHJpYnV0ZSBvciBpdHMgaW5mZXJyZWQgbmFtZXNwYWNlLlxuICpcbiAqIEByZXR1cm4ge0VsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnROUyhuYW1lLCBuYW1lc3BhY2VVUkkpIHtcbiAgICByZXR1cm4gIW5hbWVzcGFjZVVSSSB8fCBuYW1lc3BhY2VVUkkgPT09IE5TX1hIVE1MID9cbiAgICAgICAgZG9jLmNyZWF0ZUVsZW1lbnQobmFtZSkgOlxuICAgICAgICBkb2MuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgbmFtZSk7XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSBjaGlsZHJlbiBvZiBvbmUgRE9NIGVsZW1lbnQgdG8gYW5vdGhlciBET00gZWxlbWVudFxuICovXG5mdW5jdGlvbiBtb3ZlQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKSB7XG4gICAgdmFyIGN1ckNoaWxkID0gZnJvbUVsLmZpcnN0Q2hpbGQ7XG4gICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgIHZhciBuZXh0Q2hpbGQgPSBjdXJDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgdG9FbC5hcHBlbmRDaGlsZChjdXJDaGlsZCk7XG4gICAgICAgIGN1ckNoaWxkID0gbmV4dENoaWxkO1xuICAgIH1cbiAgICByZXR1cm4gdG9FbDtcbn1cblxuZnVuY3Rpb24gc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsIG5hbWUpIHtcbiAgICBpZiAoZnJvbUVsW25hbWVdICE9PSB0b0VsW25hbWVdKSB7XG4gICAgICAgIGZyb21FbFtuYW1lXSA9IHRvRWxbbmFtZV07XG4gICAgICAgIGlmIChmcm9tRWxbbmFtZV0pIHtcbiAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUobmFtZSwgJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnJvbUVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxudmFyIHNwZWNpYWxFbEhhbmRsZXJzID0ge1xuICAgIE9QVElPTjogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIHZhciBwYXJlbnROb2RlID0gZnJvbUVsLnBhcmVudE5vZGU7XG4gICAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50TmFtZSA9IHBhcmVudE5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnROYW1lID09PSAnT1BUR1JPVVAnKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICBwYXJlbnROYW1lID0gcGFyZW50Tm9kZSAmJiBwYXJlbnROb2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFyZW50TmFtZSA9PT0gJ1NFTEVDVCcgJiYgIXBhcmVudE5vZGUuaGFzQXR0cmlidXRlKCdtdWx0aXBsZScpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZyb21FbC5oYXNBdHRyaWJ1dGUoJ3NlbGVjdGVkJykgJiYgIXRvRWwuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgTVMgRWRnZSBidWcgd2hlcmUgdGhlICdzZWxlY3RlZCcgYXR0cmlidXRlIGNhbiBvbmx5IGJlXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZWQgaWYgc2V0IHRvIGEgbm9uLWVtcHR5IHZhbHVlOlxuICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL2VuLXVzL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy8xMjA4NzY3OS9cbiAgICAgICAgICAgICAgICAgICAgZnJvbUVsLnNldEF0dHJpYnV0ZSgnc2VsZWN0ZWQnLCAnc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbUVsLnJlbW92ZUF0dHJpYnV0ZSgnc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byByZXNldCBzZWxlY3QgZWxlbWVudCdzIHNlbGVjdGVkSW5kZXggdG8gLTEsIG90aGVyd2lzZSBzZXR0aW5nXG4gICAgICAgICAgICAgICAgLy8gZnJvbUVsLnNlbGVjdGVkIHVzaW5nIHRoZSBzeW5jQm9vbGVhbkF0dHJQcm9wIGJlbG93IGhhcyBubyBlZmZlY3QuXG4gICAgICAgICAgICAgICAgLy8gVGhlIGNvcnJlY3Qgc2VsZWN0ZWRJbmRleCB3aWxsIGJlIHNldCBpbiB0aGUgU0VMRUNUIHNwZWNpYWwgaGFuZGxlciBiZWxvdy5cbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLnNlbGVjdGVkSW5kZXggPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgJ3NlbGVjdGVkJyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBUaGUgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSBpcyBzcGVjaWFsIGZvciB0aGUgPGlucHV0PiBlbGVtZW50IHNpbmNlIGl0IHNldHNcbiAgICAgKiB0aGUgaW5pdGlhbCB2YWx1ZS4gQ2hhbmdpbmcgdGhlIFwidmFsdWVcIiBhdHRyaWJ1dGUgd2l0aG91dCBjaGFuZ2luZyB0aGVcbiAgICAgKiBcInZhbHVlXCIgcHJvcGVydHkgd2lsbCBoYXZlIG5vIGVmZmVjdCBzaW5jZSBpdCBpcyBvbmx5IHVzZWQgdG8gdGhlIHNldCB0aGVcbiAgICAgKiBpbml0aWFsIHZhbHVlLiAgU2ltaWxhciBmb3IgdGhlIFwiY2hlY2tlZFwiIGF0dHJpYnV0ZSwgYW5kIFwiZGlzYWJsZWRcIi5cbiAgICAgKi9cbiAgICBJTlBVVDogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIHN5bmNCb29sZWFuQXR0clByb3AoZnJvbUVsLCB0b0VsLCAnY2hlY2tlZCcpO1xuICAgICAgICBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgJ2Rpc2FibGVkJyk7XG5cbiAgICAgICAgaWYgKGZyb21FbC52YWx1ZSAhPT0gdG9FbC52YWx1ZSkge1xuICAgICAgICAgICAgZnJvbUVsLnZhbHVlID0gdG9FbC52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdG9FbC5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgVEVYVEFSRUE6IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSB0b0VsLnZhbHVlO1xuICAgICAgICBpZiAoZnJvbUVsLnZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgZnJvbUVsLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmlyc3RDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgICAgICBpZiAoZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgLy8gTmVlZGVkIGZvciBJRS4gQXBwYXJlbnRseSBJRSBzZXRzIHRoZSBwbGFjZWhvbGRlciBhcyB0aGVcbiAgICAgICAgICAgIC8vIG5vZGUgdmFsdWUgYW5kIHZpc2UgdmVyc2EuIFRoaXMgaWdub3JlcyBhbiBlbXB0eSB1cGRhdGUuXG4gICAgICAgICAgICB2YXIgb2xkVmFsdWUgPSBmaXJzdENoaWxkLm5vZGVWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlIHx8ICghbmV3VmFsdWUgJiYgb2xkVmFsdWUgPT0gZnJvbUVsLnBsYWNlaG9sZGVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgU0VMRUNUOiBmdW5jdGlvbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgICAgaWYgKCF0b0VsLmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgICAgICAgdmFyIHNlbGVjdGVkSW5kZXggPSAtMTtcbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gbG9vcCB0aHJvdWdoIGNoaWxkcmVuIG9mIGZyb21FbCwgbm90IHRvRWwgc2luY2Ugbm9kZXMgY2FuIGJlIG1vdmVkXG4gICAgICAgICAgICAvLyBmcm9tIHRvRWwgdG8gZnJvbUVsIGRpcmVjdGx5IHdoZW4gbW9ycGhpbmcuXG4gICAgICAgICAgICAvLyBBdCB0aGUgdGltZSB0aGlzIHNwZWNpYWwgaGFuZGxlciBpcyBpbnZva2VkLCBhbGwgY2hpbGRyZW4gaGF2ZSBhbHJlYWR5IGJlZW4gbW9ycGhlZFxuICAgICAgICAgICAgLy8gYW5kIGFwcGVuZGVkIHRvIC8gcmVtb3ZlZCBmcm9tIGZyb21FbCwgc28gdXNpbmcgZnJvbUVsIGhlcmUgaXMgc2FmZSBhbmQgY29ycmVjdC5cbiAgICAgICAgICAgIHZhciBjdXJDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgICAgICAgICAgdmFyIG9wdGdyb3VwO1xuICAgICAgICAgICAgdmFyIG5vZGVOYW1lO1xuICAgICAgICAgICAgd2hpbGUoY3VyQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICBub2RlTmFtZSA9IGN1ckNoaWxkLm5vZGVOYW1lICYmIGN1ckNoaWxkLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnT1BUR1JPVVAnKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGdyb3VwID0gY3VyQ2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGN1ckNoaWxkID0gb3B0Z3JvdXAuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdPUFRJT04nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hpbGQuaGFzQXR0cmlidXRlKCdzZWxlY3RlZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBjdXJDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJDaGlsZCAmJiBvcHRncm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBvcHRncm91cC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGdyb3VwID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnJvbUVsLnNlbGVjdGVkSW5kZXggPSBzZWxlY3RlZEluZGV4O1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIEVMRU1FTlRfTk9ERSA9IDE7XG52YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxID0gMTE7XG52YXIgVEVYVF9OT0RFID0gMztcbnZhciBDT01NRU5UX05PREUgPSA4O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gZGVmYXVsdEdldE5vZGVLZXkobm9kZSkge1xuICBpZiAobm9kZSkge1xuICAgICAgcmV0dXJuIChub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSkgfHwgbm9kZS5pZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3JwaGRvbUZhY3RvcnkobW9ycGhBdHRycykge1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1vcnBoZG9tKGZyb21Ob2RlLCB0b05vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRvTm9kZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChmcm9tTm9kZS5ub2RlTmFtZSA9PT0gJyNkb2N1bWVudCcgfHwgZnJvbU5vZGUubm9kZU5hbWUgPT09ICdIVE1MJyB8fCBmcm9tTm9kZS5ub2RlTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvTm9kZUh0bWwgPSB0b05vZGU7XG4gICAgICAgICAgICAgICAgdG9Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2h0bWwnKTtcbiAgICAgICAgICAgICAgICB0b05vZGUuaW5uZXJIVE1MID0gdG9Ob2RlSHRtbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9Ob2RlID0gdG9FbGVtZW50KHRvTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZ2V0Tm9kZUtleSA9IG9wdGlvbnMuZ2V0Tm9kZUtleSB8fCBkZWZhdWx0R2V0Tm9kZUtleTtcbiAgICAgICAgdmFyIG9uQmVmb3JlTm9kZUFkZGVkID0gb3B0aW9ucy5vbkJlZm9yZU5vZGVBZGRlZCB8fCBub29wO1xuICAgICAgICB2YXIgb25Ob2RlQWRkZWQgPSBvcHRpb25zLm9uTm9kZUFkZGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBvbkJlZm9yZUVsVXBkYXRlZCA9IG9wdGlvbnMub25CZWZvcmVFbFVwZGF0ZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIG9uRWxVcGRhdGVkID0gb3B0aW9ucy5vbkVsVXBkYXRlZCB8fCBub29wO1xuICAgICAgICB2YXIgb25CZWZvcmVOb2RlRGlzY2FyZGVkID0gb3B0aW9ucy5vbkJlZm9yZU5vZGVEaXNjYXJkZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIG9uTm9kZURpc2NhcmRlZCA9IG9wdGlvbnMub25Ob2RlRGlzY2FyZGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBvbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkID0gb3B0aW9ucy5vbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBjaGlsZHJlbk9ubHkgPSBvcHRpb25zLmNoaWxkcmVuT25seSA9PT0gdHJ1ZTtcblxuICAgICAgICAvLyBUaGlzIG9iamVjdCBpcyB1c2VkIGFzIGEgbG9va3VwIHRvIHF1aWNrbHkgZmluZCBhbGwga2V5ZWQgZWxlbWVudHMgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgICAgICB2YXIgZnJvbU5vZGVzTG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdmFyIGtleWVkUmVtb3ZhbExpc3QgPSBbXTtcblxuICAgICAgICBmdW5jdGlvbiBhZGRLZXllZFJlbW92YWwoa2V5KSB7XG4gICAgICAgICAgICBrZXllZFJlbW92YWxMaXN0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHdhbGtEaXNjYXJkZWRDaGlsZE5vZGVzKG5vZGUsIHNraXBLZXllZE5vZGVzKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1ckNoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBLZXllZE5vZGVzICYmIChrZXkgPSBnZXROb2RlS2V5KGN1ckNoaWxkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBza2lwcGluZyBrZXllZCBub2RlcyB0aGVuIHdlIGFkZCB0aGUga2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhIGxpc3Qgc28gdGhhdCBpdCBjYW4gYmUgaGFuZGxlZCBhdCB0aGUgdmVyeSBlbmQuXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRLZXllZFJlbW92YWwoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVwb3J0IHRoZSBub2RlIGFzIGRpc2NhcmRlZCBpZiBpdCBpcyBub3Qga2V5ZWQuIFdlIGRvIHRoaXMgYmVjYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCB3ZSBsb29wIHRocm91Z2ggYWxsIGtleWVkIGVsZW1lbnRzIHRoYXQgd2VyZSB1bm1hdGNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGRpc2NhcmQgdGhlbSBpbiBvbmUgZmluYWwgcGFzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hpbGQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtEaXNjYXJkZWRDaGlsZE5vZGVzKGN1ckNoaWxkLCBza2lwS2V5ZWROb2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZW1vdmVzIGEgRE9NIG5vZGUgb3V0IG9mIHRoZSBvcmlnaW5hbCBET01cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtICB7Tm9kZX0gbm9kZSBUaGUgbm9kZSB0byByZW1vdmVcbiAgICAgICAgICogQHBhcmFtICB7Tm9kZX0gcGFyZW50Tm9kZSBUaGUgbm9kZXMgcGFyZW50XG4gICAgICAgICAqIEBwYXJhbSAge0Jvb2xlYW59IHNraXBLZXllZE5vZGVzIElmIHRydWUgdGhlbiBlbGVtZW50cyB3aXRoIGtleXMgd2lsbCBiZSBza2lwcGVkIGFuZCBub3QgZGlzY2FyZGVkLlxuICAgICAgICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiByZW1vdmVOb2RlKG5vZGUsIHBhcmVudE5vZGUsIHNraXBLZXllZE5vZGVzKSB7XG4gICAgICAgICAgICBpZiAob25CZWZvcmVOb2RlRGlzY2FyZGVkKG5vZGUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvbk5vZGVEaXNjYXJkZWQobm9kZSk7XG4gICAgICAgICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAvLyBUcmVlV2Fsa2VyIGltcGxlbWVudGF0aW9uIGlzIG5vIGZhc3RlciwgYnV0IGtlZXBpbmcgdGhpcyBhcm91bmQgaW4gY2FzZSB0aGlzIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZVxuICAgICAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUocm9vdCkge1xuICAgICAgICAvLyAgICAgdmFyIHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKFxuICAgICAgICAvLyAgICAgICAgIHJvb3QsXG4gICAgICAgIC8vICAgICAgICAgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgdmFyIGVsO1xuICAgICAgICAvLyAgICAgd2hpbGUoKGVsID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpKSkge1xuICAgICAgICAvLyAgICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGVsKTtcbiAgICAgICAgLy8gICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgIC8vICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gZWw7XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gLy8gTm9kZUl0ZXJhdG9yIGltcGxlbWVudGF0aW9uIGlzIG5vIGZhc3RlciwgYnV0IGtlZXBpbmcgdGhpcyBhcm91bmQgaW4gY2FzZSB0aGlzIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZVxuICAgICAgICAvL1xuICAgICAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUobm9kZSkge1xuICAgICAgICAvLyAgICAgdmFyIG5vZGVJdGVyYXRvciA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcihub2RlLCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG4gICAgICAgIC8vICAgICB2YXIgZWw7XG4gICAgICAgIC8vICAgICB3aGlsZSgoZWwgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkpIHtcbiAgICAgICAgLy8gICAgICAgICB2YXIga2V5ID0gZ2V0Tm9kZUtleShlbCk7XG4gICAgICAgIC8vICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAvLyAgICAgICAgICAgICBmcm9tTm9kZXNMb29rdXBba2V5XSA9IGVsO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGZ1bmN0aW9uIGluZGV4VHJlZShub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUkMSkge1xuICAgICAgICAgICAgICAgIHZhciBjdXJDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoY3VyQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tTm9kZXNMb29rdXBba2V5XSA9IGN1ckNoaWxkO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2FsayByZWN1cnNpdmVseVxuICAgICAgICAgICAgICAgICAgICBpbmRleFRyZWUoY3VyQ2hpbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGN1ckNoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXhUcmVlKGZyb21Ob2RlKTtcblxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVOb2RlQWRkZWQoZWwpIHtcbiAgICAgICAgICAgIG9uTm9kZUFkZGVkKGVsKTtcblxuICAgICAgICAgICAgdmFyIGN1ckNoaWxkID0gZWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXh0U2libGluZyA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpO1xuICAgICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVubWF0Y2hlZEZyb21FbCA9IGZyb21Ob2Rlc0xvb2t1cFtrZXldO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBmaW5kIGEgZHVwbGljYXRlICNpZCBub2RlIGluIGNhY2hlLCByZXBsYWNlIGBlbGAgd2l0aCBjYWNoZSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbW9ycGggaXQgdG8gdGhlIGNoaWxkIG5vZGUuXG4gICAgICAgICAgICAgICAgICAgIGlmICh1bm1hdGNoZWRGcm9tRWwgJiYgY29tcGFyZU5vZGVOYW1lcyhjdXJDaGlsZCwgdW5tYXRjaGVkRnJvbUVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodW5tYXRjaGVkRnJvbUVsLCBjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3JwaEVsKHVubWF0Y2hlZEZyb21FbCwgY3VyQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5vZGVBZGRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gcmVjdXJzaXZlbHkgY2FsbCBmb3IgY3VyQ2hpbGQgYW5kIGl0J3MgY2hpbGRyZW4gdG8gc2VlIGlmIHdlIGZpbmQgc29tZXRoaW5nIGluXG4gICAgICAgICAgICAgICAgICAvLyBmcm9tTm9kZXNMb29rdXBcbiAgICAgICAgICAgICAgICAgIGhhbmRsZU5vZGVBZGRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBuZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNsZWFudXBGcm9tRWwoZnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkLCBjdXJGcm9tTm9kZUtleSkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG9mIHRoZSBcInRvIG5vZGVzXCIuIElmIGN1ckZyb21Ob2RlQ2hpbGQgaXNcbiAgICAgICAgICAgIC8vIG5vbi1udWxsIHRoZW4gd2Ugc3RpbGwgaGF2ZSBzb21lIGZyb20gbm9kZXMgbGVmdCBvdmVyIHRoYXQgbmVlZFxuICAgICAgICAgICAgLy8gdG8gYmUgcmVtb3ZlZFxuICAgICAgICAgICAgd2hpbGUgKGN1ckZyb21Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICBpZiAoKGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIG5vZGUgaXMga2V5ZWQgaXQgbWlnaHQgYmUgbWF0Y2hlZCB1cCBsYXRlciBzbyB3ZSBkZWZlclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGN1ckZyb21Ob2RlS2V5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBza2lwIG5lc3RlZCBrZXllZCBub2RlcyBmcm9tIGJlaW5nIHJlbW92ZWQgc2luY2UgdGhlcmUgaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjdXJGcm9tTm9kZUNoaWxkLCBmcm9tRWwsIHRydWUgLyogc2tpcCBrZXllZCBub2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBtb3JwaEVsKGZyb21FbCwgdG9FbCwgY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgICAgICB2YXIgdG9FbEtleSA9IGdldE5vZGVLZXkodG9FbCk7XG5cbiAgICAgICAgICAgIGlmICh0b0VsS2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgYW4gZWxlbWVudCB3aXRoIGFuIElEIGlzIGJlaW5nIG1vcnBoZWQgdGhlbiBpdCB3aWxsIGJlIGluIHRoZSBmaW5hbFxuICAgICAgICAgICAgICAgIC8vIERPTSBzbyBjbGVhciBpdCBvdXQgb2YgdGhlIHNhdmVkIGVsZW1lbnRzIGNvbGxlY3Rpb25cbiAgICAgICAgICAgICAgICBkZWxldGUgZnJvbU5vZGVzTG9va3VwW3RvRWxLZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWNoaWxkcmVuT25seSkge1xuICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsXG4gICAgICAgICAgICAgICAgaWYgKG9uQmVmb3JlRWxVcGRhdGVkKGZyb21FbCwgdG9FbCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgYXR0cmlidXRlcyBvbiBvcmlnaW5hbCBET00gZWxlbWVudCBmaXJzdFxuICAgICAgICAgICAgICAgIG1vcnBoQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgICAgICAvLyBvcHRpb25hbFxuICAgICAgICAgICAgICAgIG9uRWxVcGRhdGVkKGZyb21FbCk7XG5cbiAgICAgICAgICAgICAgICBpZiAob25CZWZvcmVFbENoaWxkcmVuVXBkYXRlZChmcm9tRWwsIHRvRWwpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZnJvbUVsLm5vZGVOYW1lICE9PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgICAgICAgIG1vcnBoQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNwZWNpYWxFbEhhbmRsZXJzLlRFWFRBUkVBKGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBtb3JwaENoaWxkcmVuKGZyb21FbCwgdG9FbCkge1xuICAgICAgICAgICAgdmFyIGN1clRvTm9kZUNoaWxkID0gdG9FbC5maXJzdENoaWxkO1xuICAgICAgICAgICAgdmFyIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHZhciBjdXJUb05vZGVLZXk7XG4gICAgICAgICAgICB2YXIgY3VyRnJvbU5vZGVLZXk7XG5cbiAgICAgICAgICAgIHZhciBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB2YXIgdG9OZXh0U2libGluZztcbiAgICAgICAgICAgIHZhciBtYXRjaGluZ0Zyb21FbDtcblxuICAgICAgICAgICAgLy8gd2FsayB0aGUgY2hpbGRyZW5cbiAgICAgICAgICAgIG91dGVyOiB3aGlsZSAoY3VyVG9Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICB0b05leHRTaWJsaW5nID0gY3VyVG9Ob2RlQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgY3VyVG9Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJUb05vZGVDaGlsZCk7XG5cbiAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBmcm9tTm9kZSBjaGlsZHJlbiBhbGwgdGhlIHdheSB0aHJvdWdoXG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1ckZyb21Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVG9Ob2RlQ2hpbGQuaXNTYW1lTm9kZSAmJiBjdXJUb05vZGVDaGlsZC5pc1NhbWVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUtleSA9IGdldE5vZGVLZXkoY3VyRnJvbU5vZGVDaGlsZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGN1ckZyb21Ob2RlVHlwZSA9IGN1ckZyb21Ob2RlQ2hpbGQubm9kZVR5cGU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBtZWFucyBpZiB0aGUgY3VyRnJvbU5vZGVDaGlsZCBkb2VzbnQgaGF2ZSBhIG1hdGNoIHdpdGggdGhlIGN1clRvTm9kZUNoaWxkXG4gICAgICAgICAgICAgICAgICAgIHZhciBpc0NvbXBhdGlibGUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlVHlwZSA9PT0gY3VyVG9Ob2RlQ2hpbGQubm9kZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdGggbm9kZXMgYmVpbmcgY29tcGFyZWQgYXJlIEVsZW1lbnQgbm9kZXNcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUb05vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBub2RlIGhhcyBhIGtleSBzbyB3ZSB3YW50IHRvIG1hdGNoIGl0IHVwIHdpdGggdGhlIGNvcnJlY3QgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSAhPT0gY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlIGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBrZXkgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCdzIGNoZWNrIG91ciBsb29rdXAgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1hdGNoaW5nRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2N1clRvTm9kZUtleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21OZXh0U2libGluZyA9PT0gbWF0Y2hpbmdGcm9tRWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzaW5nbGUgZWxlbWVudCByZW1vdmFscy4gVG8gYXZvaWQgcmVtb3ZpbmcgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERPTSBub2RlIG91dCBvZiB0aGUgdHJlZSAoc2luY2UgdGhhdCBjYW4gYnJlYWsgQ1NTIHRyYW5zaXRpb25zLCBldGMuKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBpbnN0ZWFkIGRpc2NhcmQgdGhlIGN1cnJlbnQgbm9kZSBhbmQgd2FpdCB1bnRpbCB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24gdG8gcHJvcGVybHkgbWF0Y2ggdXAgdGhlIGtleWVkIHRhcmdldCBlbGVtZW50IHdpdGggaXRzIG1hdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIHRyZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgYSBtYXRjaGluZyBrZXllZCBlbGVtZW50IHNvbWV3aGVyZSBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIG1vdmUgdGhlIG9yaWdpbmFsIERPTSBub2RlIGludG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIG1vcnBoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0LlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IFdlIHVzZSBpbnNlcnRCZWZvcmUgaW5zdGVhZCBvZiByZXBsYWNlQ2hpbGQgYmVjYXVzZSB3ZSB3YW50IHRvIGdvIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGByZW1vdmVOb2RlKClgIGZ1bmN0aW9uIGZvciB0aGUgbm9kZSB0aGF0IGlzIGJlaW5nIGRpc2NhcmRlZCBzbyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBsaWZlY3ljbGUgaG9va3MgYXJlIGNvcnJlY3RseSBpbnZva2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21FbC5pbnNlcnRCZWZvcmUobWF0Y2hpbmdGcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb21OZXh0U2libGluZyA9IGN1ckZyb21Ob2RlQ2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBza2lwIG5lc3RlZCBrZXllZCBub2RlcyBmcm9tIGJlaW5nIHJlbW92ZWQgc2luY2UgdGhlcmUgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHN0aWxsIGEgY2hhbmNlIHRoZXkgd2lsbCBiZSBtYXRjaGVkIHVwIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBtYXRjaGluZ0Zyb21FbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlcyBhcmUgbm90IGNvbXBhdGlibGUgc2luY2UgdGhlIFwidG9cIiBub2RlIGhhcyBhIGtleSBhbmQgdGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBubyBtYXRjaGluZyBrZXllZCBub2RlIGluIHRoZSBzb3VyY2UgdHJlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJGcm9tTm9kZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgb3JpZ2luYWwgaGFzIGEga2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGlzQ29tcGF0aWJsZSAhPT0gZmFsc2UgJiYgY29tcGFyZU5vZGVOYW1lcyhjdXJGcm9tTm9kZUNoaWxkLCBjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGF0aWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBjb21wYXRpYmxlIERPTSBlbGVtZW50cyBzbyB0cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgXCJmcm9tXCIgbm9kZSB0byBtYXRjaCB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQgRE9NIG5vZGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1PUlBIXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcnBoRWwoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJGcm9tTm9kZVR5cGUgPT09IFRFWFRfTk9ERSB8fCBjdXJGcm9tTm9kZVR5cGUgPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBiZWluZyBjb21wYXJlZCBhcmUgVGV4dCBvciBDb21tZW50IG5vZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbHkgdXBkYXRlIG5vZGVWYWx1ZSBvbiB0aGUgb3JpZ2luYWwgbm9kZSB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgdGV4dCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZUNoaWxkLm5vZGVWYWx1ZSAhPT0gY3VyVG9Ob2RlQ2hpbGQubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQubm9kZVZhbHVlID0gY3VyVG9Ob2RlQ2hpbGQubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGF0aWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWR2YW5jZSBib3RoIHRoZSBcInRvXCIgY2hpbGQgYW5kIHRoZSBcImZyb21cIiBjaGlsZCBzaW5jZSB3ZSBmb3VuZCBhIG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGVsc2UgdG8gZG8gYXMgd2UgYWxyZWFkeSByZWN1cnNpdmVseSBjYWxsZWQgbW9ycGhDaGlsZHJlbiBhYm92ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTm8gY29tcGF0aWJsZSBtYXRjaCBzbyByZW1vdmUgdGhlIG9sZCBub2RlIGZyb20gdGhlIERPTSBhbmQgY29udGludWUgdHJ5aW5nIHRvIGZpbmQgYVxuICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCBpbiB0aGUgb3JpZ2luYWwgRE9NLiBIb3dldmVyLCB3ZSBvbmx5IGRvIHRoaXMgaWYgdGhlIGZyb20gbm9kZSBpcyBub3Qga2V5ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgaXQgaXMgcG9zc2libGUgdGhhdCBhIGtleWVkIG5vZGUgbWlnaHQgbWF0Y2ggdXAgd2l0aCBhIG5vZGUgc29tZXdoZXJlIGVsc2UgaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHRhcmdldCB0cmVlIGFuZCB3ZSBkb24ndCB3YW50IHRvIGRpc2NhcmQgaXQganVzdCB5ZXQgc2luY2UgaXQgc3RpbGwgbWlnaHQgZmluZCBhXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvbWUgaW4gdGhlIGZpbmFsIERPTSB0cmVlLiBBZnRlciBldmVyeXRoaW5nIGlzIGRvbmUgd2Ugd2lsbCByZW1vdmUgYW55IGtleWVkIG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgZGlkbid0IGZpbmQgYSBob21lXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIG5vZGUgaXMga2V5ZWQgaXQgbWlnaHQgYmUgbWF0Y2hlZCB1cCBsYXRlciBzbyB3ZSBkZWZlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCByZW1vdmFsIHRvIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRLZXllZFJlbW92YWwoY3VyRnJvbU5vZGVLZXkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzdGlsbCBhIGNoYW5jZSB0aGV5IHdpbGwgYmUgbWF0Y2hlZCB1cCBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjdXJGcm9tTm9kZUNoaWxkLCBmcm9tRWwsIHRydWUgLyogc2tpcCBrZXllZCBub2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH0gLy8gRU5EOiB3aGlsZShjdXJGcm9tTm9kZUNoaWxkKSB7fVxuXG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyIHRoZW4gd2UgZGlkIG5vdCBmaW5kIGEgY2FuZGlkYXRlIG1hdGNoIGZvclxuICAgICAgICAgICAgICAgIC8vIG91ciBcInRvIG5vZGVcIiBhbmQgd2UgZXhoYXVzdGVkIGFsbCBvZiB0aGUgY2hpbGRyZW4gXCJmcm9tXCJcbiAgICAgICAgICAgICAgICAvLyBub2Rlcy4gVGhlcmVmb3JlLCB3ZSB3aWxsIGp1c3QgYXBwZW5kIHRoZSBjdXJyZW50IFwidG9cIiBub2RlXG4gICAgICAgICAgICAgICAgLy8gdG8gdGhlIGVuZFxuICAgICAgICAgICAgICAgIGlmIChjdXJUb05vZGVLZXkgJiYgKG1hdGNoaW5nRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2N1clRvTm9kZUtleV0pICYmIGNvbXBhcmVOb2RlTmFtZXMobWF0Y2hpbmdGcm9tRWwsIGN1clRvTm9kZUNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tRWwuYXBwZW5kQ2hpbGQobWF0Y2hpbmdGcm9tRWwpO1xuICAgICAgICAgICAgICAgICAgICAvLyBNT1JQSFxuICAgICAgICAgICAgICAgICAgICBtb3JwaEVsKG1hdGNoaW5nRnJvbUVsLCBjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0ID0gb25CZWZvcmVOb2RlQWRkZWQoY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob25CZWZvcmVOb2RlQWRkZWRSZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob25CZWZvcmVOb2RlQWRkZWRSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVG9Ob2RlQ2hpbGQuYWN0dWFsaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSBjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUoZnJvbUVsLm93bmVyRG9jdW1lbnQgfHwgZG9jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21FbC5hcHBlbmRDaGlsZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb2RlQWRkZWQoY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsZWFudXBGcm9tRWwoZnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkLCBjdXJGcm9tTm9kZUtleSk7XG5cbiAgICAgICAgICAgIHZhciBzcGVjaWFsRWxIYW5kbGVyID0gc3BlY2lhbEVsSGFuZGxlcnNbZnJvbUVsLm5vZGVOYW1lXTtcbiAgICAgICAgICAgIGlmIChzcGVjaWFsRWxIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgc3BlY2lhbEVsSGFuZGxlcihmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IC8vIEVORDogbW9ycGhDaGlsZHJlbiguLi4pXG5cbiAgICAgICAgdmFyIG1vcnBoZWROb2RlID0gZnJvbU5vZGU7XG4gICAgICAgIHZhciBtb3JwaGVkTm9kZVR5cGUgPSBtb3JwaGVkTm9kZS5ub2RlVHlwZTtcbiAgICAgICAgdmFyIHRvTm9kZVR5cGUgPSB0b05vZGUubm9kZVR5cGU7XG5cbiAgICAgICAgaWYgKCFjaGlsZHJlbk9ubHkpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBhcmUgZ2l2ZW4gdHdvIERPTSBub2RlcyB0aGF0IGFyZSBub3RcbiAgICAgICAgICAgIC8vIGNvbXBhdGlibGUgKGUuZy4gPGRpdj4gLS0+IDxzcGFuPiBvciA8ZGl2PiAtLT4gVEVYVClcbiAgICAgICAgICAgIGlmIChtb3JwaGVkTm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgIGlmICh0b05vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wYXJlTm9kZU5hbWVzKGZyb21Ob2RlLCB0b05vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbk5vZGVEaXNjYXJkZWQoZnJvbU5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUgPSBtb3ZlQ2hpbGRyZW4oZnJvbU5vZGUsIGNyZWF0ZUVsZW1lbnROUyh0b05vZGUubm9kZU5hbWUsIHRvTm9kZS5uYW1lc3BhY2VVUkkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdvaW5nIGZyb20gYW4gZWxlbWVudCBub2RlIHRvIGEgdGV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgIG1vcnBoZWROb2RlID0gdG9Ob2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW9ycGhlZE5vZGVUeXBlID09PSBURVhUX05PREUgfHwgbW9ycGhlZE5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHsgLy8gVGV4dCBvciBjb21tZW50IG5vZGVcbiAgICAgICAgICAgICAgICBpZiAodG9Ob2RlVHlwZSA9PT0gbW9ycGhlZE5vZGVUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3JwaGVkTm9kZS5ub2RlVmFsdWUgIT09IHRvTm9kZS5ub2RlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vcnBoZWROb2RlLm5vZGVWYWx1ZSA9IHRvTm9kZS5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9ycGhlZE5vZGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dCBub2RlIHRvIHNvbWV0aGluZyBlbHNlXG4gICAgICAgICAgICAgICAgICAgIG1vcnBoZWROb2RlID0gdG9Ob2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb3JwaGVkTm9kZSA9PT0gdG9Ob2RlKSB7XG4gICAgICAgICAgICAvLyBUaGUgXCJ0byBub2RlXCIgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIFwiZnJvbSBub2RlXCIgc28gd2UgaGFkIHRvXG4gICAgICAgICAgICAvLyB0b3NzIG91dCB0aGUgXCJmcm9tIG5vZGVcIiBhbmQgdXNlIHRoZSBcInRvIG5vZGVcIlxuICAgICAgICAgICAgb25Ob2RlRGlzY2FyZGVkKGZyb21Ob2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0b05vZGUuaXNTYW1lTm9kZSAmJiB0b05vZGUuaXNTYW1lTm9kZShtb3JwaGVkTm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1vcnBoRWwobW9ycGhlZE5vZGUsIHRvTm9kZSwgY2hpbGRyZW5Pbmx5KTtcblxuICAgICAgICAgICAgLy8gV2Ugbm93IG5lZWQgdG8gbG9vcCBvdmVyIGFueSBrZXllZCBub2RlcyB0aGF0IG1pZ2h0IG5lZWQgdG8gYmVcbiAgICAgICAgICAgIC8vIHJlbW92ZWQuIFdlIG9ubHkgZG8gdGhlIHJlbW92YWwgaWYgd2Uga25vdyB0aGF0IHRoZSBrZXllZCBub2RlXG4gICAgICAgICAgICAvLyBuZXZlciBmb3VuZCBhIG1hdGNoLiBXaGVuIGEga2V5ZWQgbm9kZSBpcyBtYXRjaGVkIHVwIHdlIHJlbW92ZVxuICAgICAgICAgICAgLy8gaXQgb3V0IG9mIGZyb21Ob2Rlc0xvb2t1cCBhbmQgd2UgdXNlIGZyb21Ob2Rlc0xvb2t1cCB0byBkZXRlcm1pbmVcbiAgICAgICAgICAgIC8vIGlmIGEga2V5ZWQgbm9kZSBoYXMgYmVlbiBtYXRjaGVkIHVwIG9yIG5vdFxuICAgICAgICAgICAgaWYgKGtleWVkUmVtb3ZhbExpc3QpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTAsIGxlbj1rZXllZFJlbW92YWxMaXN0Lmxlbmd0aDsgaTxsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZWxUb1JlbW92ZSA9IGZyb21Ob2Rlc0xvb2t1cFtrZXllZFJlbW92YWxMaXN0W2ldXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsVG9SZW1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUoZWxUb1JlbW92ZSwgZWxUb1JlbW92ZS5wYXJlbnROb2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNoaWxkcmVuT25seSAmJiBtb3JwaGVkTm9kZSAhPT0gZnJvbU5vZGUgJiYgZnJvbU5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKG1vcnBoZWROb2RlLmFjdHVhbGl6ZSkge1xuICAgICAgICAgICAgICAgIG1vcnBoZWROb2RlID0gbW9ycGhlZE5vZGUuYWN0dWFsaXplKGZyb21Ob2RlLm93bmVyRG9jdW1lbnQgfHwgZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIHdlIGhhZCB0byBzd2FwIG91dCB0aGUgZnJvbSBub2RlIHdpdGggYSBuZXcgbm9kZSBiZWNhdXNlIHRoZSBvbGRcbiAgICAgICAgICAgIC8vIG5vZGUgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHRhcmdldCBub2RlIHRoZW4gd2UgbmVlZCB0b1xuICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgb2xkIERPTSBub2RlIGluIHRoZSBvcmlnaW5hbCBET00gdHJlZS4gVGhpcyBpcyBvbmx5XG4gICAgICAgICAgICAvLyBwb3NzaWJsZSBpZiB0aGUgb3JpZ2luYWwgRE9NIG5vZGUgd2FzIHBhcnQgb2YgYSBET00gdHJlZSB3aGljaFxuICAgICAgICAgICAgLy8gd2Uga25vdyBpcyB0aGUgY2FzZSBpZiBpdCBoYXMgYSBwYXJlbnQgbm9kZS5cbiAgICAgICAgICAgIGZyb21Ob2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG1vcnBoZWROb2RlLCBmcm9tTm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbW9ycGhlZE5vZGU7XG4gICAgfTtcbn1cblxudmFyIG1vcnBoZG9tID0gbW9ycGhkb21GYWN0b3J5KG1vcnBoQXR0cnMpO1xuXG5leHBvcnQgZGVmYXVsdCBtb3JwaGRvbTtcbiIsICJpbXBvcnQge1xuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfRElTQUJMRV9XSVRILFxuICBQSFhfRkVFREJBQ0tfRk9SLFxuICBQSFhfUFJVTkUsXG4gIFBIWF9ST09UX0lELFxuICBQSFhfU0VTU0lPTixcbiAgUEhYX1NLSVAsXG4gIFBIWF9TVEFUSUMsXG4gIFBIWF9UUklHR0VSX0FDVElPTixcbiAgUEhYX1VQREFURVxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQge1xuICBkZXRlY3REdXBsaWNhdGVJZHMsXG4gIGlzQ2lkXG59IGZyb20gXCIuL3V0aWxzXCJcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIlxuaW1wb3J0IERPTVBvc3RNb3JwaFJlc3RvcmVyIGZyb20gXCIuL2RvbV9wb3N0X21vcnBoX3Jlc3RvcmVyXCJcbmltcG9ydCBtb3JwaGRvbSBmcm9tIFwibW9ycGhkb21cIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01QYXRjaCB7XG4gIHN0YXRpYyBwYXRjaEVsKGZyb21FbCwgdG9FbCwgYWN0aXZlRWxlbWVudCl7XG4gICAgbW9ycGhkb20oZnJvbUVsLCB0b0VsLCB7XG4gICAgICBjaGlsZHJlbk9ubHk6IGZhbHNlLFxuICAgICAgb25CZWZvcmVFbFVwZGF0ZWQ6IChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgICAgaWYoYWN0aXZlRWxlbWVudCAmJiBhY3RpdmVFbGVtZW50LmlzU2FtZU5vZGUoZnJvbUVsKSAmJiBET00uaXNGb3JtSW5wdXQoZnJvbUVsKSl7XG4gICAgICAgICAgRE9NLm1lcmdlRm9jdXNlZElucHV0KGZyb21FbCwgdG9FbClcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2aWV3LCBjb250YWluZXIsIGlkLCBodG1sLCB0YXJnZXRDSUQpe1xuICAgIHRoaXMudmlldyA9IHZpZXdcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSB2aWV3LmxpdmVTb2NrZXRcbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lclxuICAgIHRoaXMuaWQgPSBpZFxuICAgIHRoaXMucm9vdElEID0gdmlldy5yb290LmlkXG4gICAgdGhpcy5odG1sID0gaHRtbFxuICAgIHRoaXMudGFyZ2V0Q0lEID0gdGFyZ2V0Q0lEXG4gICAgdGhpcy5jaWRQYXRjaCA9IGlzQ2lkKHRoaXMudGFyZ2V0Q0lEKVxuICAgIHRoaXMuY2FsbGJhY2tzID0ge1xuICAgICAgYmVmb3JlYWRkZWQ6IFtdLCBiZWZvcmV1cGRhdGVkOiBbXSwgYmVmb3JlcGh4Q2hpbGRBZGRlZDogW10sXG4gICAgICBhZnRlcmFkZGVkOiBbXSwgYWZ0ZXJ1cGRhdGVkOiBbXSwgYWZ0ZXJkaXNjYXJkZWQ6IFtdLCBhZnRlcnBoeENoaWxkQWRkZWQ6IFtdLFxuICAgICAgYWZ0ZXJ0cmFuc2l0aW9uc0Rpc2NhcmRlZDogW11cbiAgICB9XG4gIH1cblxuICBiZWZvcmUoa2luZCwgY2FsbGJhY2speyB0aGlzLmNhbGxiYWNrc1tgYmVmb3JlJHtraW5kfWBdLnB1c2goY2FsbGJhY2spIH1cbiAgYWZ0ZXIoa2luZCwgY2FsbGJhY2speyB0aGlzLmNhbGxiYWNrc1tgYWZ0ZXIke2tpbmR9YF0ucHVzaChjYWxsYmFjaykgfVxuXG4gIHRyYWNrQmVmb3JlKGtpbmQsIC4uLmFyZ3Mpe1xuICAgIHRoaXMuY2FsbGJhY2tzW2BiZWZvcmUke2tpbmR9YF0uZm9yRWFjaChjYWxsYmFjayA9PiBjYWxsYmFjayguLi5hcmdzKSlcbiAgfVxuXG4gIHRyYWNrQWZ0ZXIoa2luZCwgLi4uYXJncyl7XG4gICAgdGhpcy5jYWxsYmFja3NbYGFmdGVyJHtraW5kfWBdLmZvckVhY2goY2FsbGJhY2sgPT4gY2FsbGJhY2soLi4uYXJncykpXG4gIH1cblxuICBtYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpe1xuICAgIERPTS5hbGwodGhpcy5jb250YWluZXIsIFwiW3BoeC11cGRhdGU9YXBwZW5kXSA+ICosIFtwaHgtdXBkYXRlPXByZXBlbmRdID4gKlwiLCBlbCA9PiB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1BSVU5FLCBcIlwiKVxuICAgIH0pXG4gIH1cblxuICBwZXJmb3JtKCl7XG4gICAgbGV0IHt2aWV3LCBsaXZlU29ja2V0LCBjb250YWluZXIsIGh0bWx9ID0gdGhpc1xuICAgIGxldCB0YXJnZXRDb250YWluZXIgPSB0aGlzLmlzQ0lEUGF0Y2goKSA/IHRoaXMudGFyZ2V0Q0lEQ29udGFpbmVyKGh0bWwpIDogY29udGFpbmVyXG4gICAgaWYodGhpcy5pc0NJRFBhdGNoKCkgJiYgIXRhcmdldENvbnRhaW5lcil7IHJldHVybiB9XG5cbiAgICBsZXQgZm9jdXNlZCA9IGxpdmVTb2NrZXQuZ2V0QWN0aXZlRWxlbWVudCgpXG4gICAgbGV0IHtzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kfSA9IGZvY3VzZWQgJiYgRE9NLmhhc1NlbGVjdGlvblJhbmdlKGZvY3VzZWQpID8gZm9jdXNlZCA6IHt9XG4gICAgbGV0IHBoeFVwZGF0ZSA9IGxpdmVTb2NrZXQuYmluZGluZyhQSFhfVVBEQVRFKVxuICAgIGxldCBwaHhGZWVkYmFja0ZvciA9IGxpdmVTb2NrZXQuYmluZGluZyhQSFhfRkVFREJBQ0tfRk9SKVxuICAgIGxldCBkaXNhYmxlV2l0aCA9IGxpdmVTb2NrZXQuYmluZGluZyhQSFhfRElTQUJMRV9XSVRIKVxuICAgIGxldCBwaHhUcmlnZ2VyRXh0ZXJuYWwgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1RSSUdHRVJfQUNUSU9OKVxuICAgIGxldCBwaHhSZW1vdmUgPSBsaXZlU29ja2V0LmJpbmRpbmcoXCJyZW1vdmVcIilcbiAgICBsZXQgYWRkZWQgPSBbXVxuICAgIGxldCB1cGRhdGVzID0gW11cbiAgICBsZXQgYXBwZW5kUHJlcGVuZFVwZGF0ZXMgPSBbXVxuICAgIGxldCBwZW5kaW5nUmVtb3ZlcyA9IFtdXG4gICAgbGV0IGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IG51bGxcblxuICAgIGxldCBkaWZmSFRNTCA9IGxpdmVTb2NrZXQudGltZShcInByZW1vcnBoIGNvbnRhaW5lciBwcmVwXCIsICgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkRGlmZkhUTUwoY29udGFpbmVyLCBodG1sLCBwaHhVcGRhdGUsIHRhcmdldENvbnRhaW5lcilcbiAgICB9KVxuXG4gICAgdGhpcy50cmFja0JlZm9yZShcImFkZGVkXCIsIGNvbnRhaW5lcilcbiAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBjb250YWluZXIsIGNvbnRhaW5lcilcblxuICAgIGxpdmVTb2NrZXQudGltZShcIm1vcnBoZG9tXCIsICgpID0+IHtcbiAgICAgIG1vcnBoZG9tKHRhcmdldENvbnRhaW5lciwgZGlmZkhUTUwsIHtcbiAgICAgICAgY2hpbGRyZW5Pbmx5OiB0YXJnZXRDb250YWluZXIuZ2V0QXR0cmlidXRlKFBIWF9DT01QT05FTlQpID09PSBudWxsLFxuICAgICAgICBnZXROb2RlS2V5OiAobm9kZSkgPT4ge1xuICAgICAgICAgIHJldHVybiBET00uaXNQaHhEZXN0cm95ZWQobm9kZSkgPyBudWxsIDogbm9kZS5pZFxuICAgICAgICB9LFxuICAgICAgICBvbkJlZm9yZU5vZGVBZGRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgdGhpcy50cmFja0JlZm9yZShcImFkZGVkXCIsIGVsKVxuICAgICAgICAgIHJldHVybiBlbFxuICAgICAgICB9LFxuICAgICAgICBvbk5vZGVBZGRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgLy8gaGFjayB0byBmaXggU2FmYXJpIGhhbmRsaW5nIG9mIGltZyBzcmNzZXQgYW5kIHZpZGVvIHRhZ3NcbiAgICAgICAgICBpZihlbCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgJiYgZWwuc3Jjc2V0KXtcbiAgICAgICAgICAgIGVsLnNyY3NldCA9IGVsLnNyY3NldFxuICAgICAgICAgIH0gZWxzZSBpZihlbCBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQgJiYgZWwuYXV0b3BsYXkpe1xuICAgICAgICAgICAgZWwucGxheSgpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKERPTS5pc05vd1RyaWdnZXJGb3JtRXh0ZXJuYWwoZWwsIHBoeFRyaWdnZXJFeHRlcm5hbCkpe1xuICAgICAgICAgICAgZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkID0gZWxcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9pbnB1dCBoYW5kbGluZ1xuICAgICAgICAgIERPTS5kaXNjYXJkRXJyb3IodGFyZ2V0Q29udGFpbmVyLCBlbCwgcGh4RmVlZGJhY2tGb3IpXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZigoRE9NLmlzUGh4Q2hpbGQoZWwpICYmIHZpZXcub3duc0VsZW1lbnQoZWwpKSB8fCBET00uaXNQaHhTdGlja3koZWwpICYmIHZpZXcub3duc0VsZW1lbnQoZWwucGFyZW50Tm9kZSkpe1xuICAgICAgICAgICAgdGhpcy50cmFja0FmdGVyKFwicGh4Q2hpbGRBZGRlZFwiLCBlbClcbiAgICAgICAgICB9XG4gICAgICAgICAgYWRkZWQucHVzaChlbClcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob2RlRGlzY2FyZGVkOiAoZWwpID0+IHtcbiAgICAgICAgICAvLyBuZXN0ZWQgdmlldyBoYW5kbGluZ1xuICAgICAgICAgIGlmKERPTS5pc1BoeENoaWxkKGVsKSB8fCBET00uaXNQaHhTdGlja3koZWwpKXsgbGl2ZVNvY2tldC5kZXN0cm95Vmlld0J5RWwoZWwpIH1cbiAgICAgICAgICB0aGlzLnRyYWNrQWZ0ZXIoXCJkaXNjYXJkZWRcIiwgZWwpXG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlTm9kZURpc2NhcmRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYoZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfUFJVTkUpICE9PSBudWxsKXsgcmV0dXJuIHRydWUgfVxuICAgICAgICAgIGlmKGVsLnBhcmVudE5vZGUgIT09IG51bGwgJiYgRE9NLmlzUGh4VXBkYXRlKGVsLnBhcmVudE5vZGUsIHBoeFVwZGF0ZSwgW1wiYXBwZW5kXCIsIFwicHJlcGVuZFwiXSkgJiYgZWwuaWQpeyByZXR1cm4gZmFsc2UgfVxuICAgICAgICAgIGlmKGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUocGh4UmVtb3ZlKSl7XG4gICAgICAgICAgICBwZW5kaW5nUmVtb3Zlcy5wdXNoKGVsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHRoaXMuc2tpcENJRFNpYmxpbmcoZWwpKXsgcmV0dXJuIGZhbHNlIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBvbkVsVXBkYXRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYoRE9NLmlzTm93VHJpZ2dlckZvcm1FeHRlcm5hbChlbCwgcGh4VHJpZ2dlckV4dGVybmFsKSl7XG4gICAgICAgICAgICBleHRlcm5hbEZvcm1UcmlnZ2VyZWQgPSBlbFxuICAgICAgICAgIH1cbiAgICAgICAgICB1cGRhdGVzLnB1c2goZWwpXG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlRWxVcGRhdGVkOiAoZnJvbUVsLCB0b0VsKSA9PiB7XG4gICAgICAgICAgRE9NLmNsZWFuQ2hpbGROb2Rlcyh0b0VsLCBwaHhVcGRhdGUpXG4gICAgICAgICAgaWYodGhpcy5za2lwQ0lEU2libGluZyh0b0VsKSl7IHJldHVybiBmYWxzZSB9XG4gICAgICAgICAgaWYoRE9NLmlzUGh4U3RpY2t5KGZyb21FbCkpeyByZXR1cm4gZmFsc2UgfVxuICAgICAgICAgIGlmKERPTS5pc0lnbm9yZWQoZnJvbUVsLCBwaHhVcGRhdGUpKXtcbiAgICAgICAgICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGZyb21FbCwgdG9FbClcbiAgICAgICAgICAgIERPTS5tZXJnZUF0dHJzKGZyb21FbCwgdG9FbCwge2lzSWdub3JlZDogdHJ1ZX0pXG4gICAgICAgICAgICB1cGRhdGVzLnB1c2goZnJvbUVsKVxuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyhmcm9tRWwpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoZnJvbUVsLnR5cGUgPT09IFwibnVtYmVyXCIgJiYgKGZyb21FbC52YWxpZGl0eSAmJiBmcm9tRWwudmFsaWRpdHkuYmFkSW5wdXQpKXsgcmV0dXJuIGZhbHNlIH1cbiAgICAgICAgICBpZighRE9NLnN5bmNQZW5kaW5nUmVmKGZyb21FbCwgdG9FbCwgZGlzYWJsZVdpdGgpKXtcbiAgICAgICAgICAgIGlmKERPTS5pc1VwbG9hZElucHV0KGZyb21FbCkpe1xuICAgICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpXG4gICAgICAgICAgICAgIHVwZGF0ZXMucHVzaChmcm9tRWwpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKGZyb21FbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIG5lc3RlZCB2aWV3IGhhbmRsaW5nXG4gICAgICAgICAgaWYoRE9NLmlzUGh4Q2hpbGQodG9FbCkpe1xuICAgICAgICAgICAgbGV0IHByZXZTZXNzaW9uID0gZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTilcbiAgICAgICAgICAgIERPTS5tZXJnZUF0dHJzKGZyb21FbCwgdG9FbCwge2V4Y2x1ZGU6IFtQSFhfU1RBVElDXX0pXG4gICAgICAgICAgICBpZihwcmV2U2Vzc2lvbiAhPT0gXCJcIil7IGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIHByZXZTZXNzaW9uKSB9XG4gICAgICAgICAgICBmcm9tRWwuc2V0QXR0cmlidXRlKFBIWF9ST09UX0lELCB0aGlzLnJvb3RJRClcbiAgICAgICAgICAgIERPTS5hcHBseVN0aWNreU9wZXJhdGlvbnMoZnJvbUVsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaW5wdXQgaGFuZGxpbmdcbiAgICAgICAgICBET00uY29weVByaXZhdGVzKHRvRWwsIGZyb21FbClcbiAgICAgICAgICBET00uZGlzY2FyZEVycm9yKHRhcmdldENvbnRhaW5lciwgdG9FbCwgcGh4RmVlZGJhY2tGb3IpXG5cbiAgICAgICAgICBsZXQgaXNGb2N1c2VkRm9ybUVsID0gZm9jdXNlZCAmJiBmcm9tRWwuaXNTYW1lTm9kZShmb2N1c2VkKSAmJiBET00uaXNGb3JtSW5wdXQoZnJvbUVsKVxuICAgICAgICAgIGlmKGlzRm9jdXNlZEZvcm1FbCl7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpXG4gICAgICAgICAgICBET00ubWVyZ2VGb2N1c2VkSW5wdXQoZnJvbUVsLCB0b0VsKVxuICAgICAgICAgICAgRE9NLnN5bmNBdHRyc1RvUHJvcHMoZnJvbUVsKVxuICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGZyb21FbClcbiAgICAgICAgICAgIERPTS5hcHBseVN0aWNreU9wZXJhdGlvbnMoZnJvbUVsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmKERPTS5pc1BoeFVwZGF0ZSh0b0VsLCBwaHhVcGRhdGUsIFtcImFwcGVuZFwiLCBcInByZXBlbmRcIl0pKXtcbiAgICAgICAgICAgICAgYXBwZW5kUHJlcGVuZFVwZGF0ZXMucHVzaChuZXcgRE9NUG9zdE1vcnBoUmVzdG9yZXIoZnJvbUVsLCB0b0VsLCB0b0VsLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIERPTS5zeW5jQXR0cnNUb1Byb3BzKHRvRWwpXG4gICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKHRvRWwpXG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaWYobGl2ZVNvY2tldC5pc0RlYnVnRW5hYmxlZCgpKXsgZGV0ZWN0RHVwbGljYXRlSWRzKCkgfVxuXG4gICAgaWYoYXBwZW5kUHJlcGVuZFVwZGF0ZXMubGVuZ3RoID4gMCl7XG4gICAgICBsaXZlU29ja2V0LnRpbWUoXCJwb3N0LW1vcnBoIGFwcGVuZC9wcmVwZW5kIHJlc3RvcmF0aW9uXCIsICgpID0+IHtcbiAgICAgICAgYXBwZW5kUHJlcGVuZFVwZGF0ZXMuZm9yRWFjaCh1cGRhdGUgPT4gdXBkYXRlLnBlcmZvcm0oKSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgbGl2ZVNvY2tldC5zaWxlbmNlRXZlbnRzKCgpID0+IERPTS5yZXN0b3JlRm9jdXMoZm9jdXNlZCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCkpXG4gICAgRE9NLmRpc3BhdGNoRXZlbnQoZG9jdW1lbnQsIFwicGh4OnVwZGF0ZVwiKVxuICAgIGFkZGVkLmZvckVhY2goZWwgPT4gdGhpcy50cmFja0FmdGVyKFwiYWRkZWRcIiwgZWwpKVxuICAgIHVwZGF0ZXMuZm9yRWFjaChlbCA9PiB0aGlzLnRyYWNrQWZ0ZXIoXCJ1cGRhdGVkXCIsIGVsKSlcblxuICAgIGlmKHBlbmRpbmdSZW1vdmVzLmxlbmd0aCA+IDApe1xuICAgICAgbGl2ZVNvY2tldC50cmFuc2l0aW9uUmVtb3ZlcyhwZW5kaW5nUmVtb3ZlcylcbiAgICAgIGxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZW1vdmVzLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgIGxldCBjaGlsZCA9IERPTS5maXJzdFBoeENoaWxkKGVsKVxuICAgICAgICAgIGlmKGNoaWxkKXsgbGl2ZVNvY2tldC5kZXN0cm95Vmlld0J5RWwoY2hpbGQpIH1cbiAgICAgICAgICBlbC5yZW1vdmUoKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnRyYWNrQWZ0ZXIoXCJ0cmFuc2l0aW9uc0Rpc2NhcmRlZFwiLCBwZW5kaW5nUmVtb3ZlcylcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYoZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkKXtcbiAgICAgIGxpdmVTb2NrZXQuZGlzY29ubmVjdCgpXG4gICAgICBleHRlcm5hbEZvcm1UcmlnZ2VyZWQuc3VibWl0KClcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlzQ0lEUGF0Y2goKXsgcmV0dXJuIHRoaXMuY2lkUGF0Y2ggfVxuXG4gIHNraXBDSURTaWJsaW5nKGVsKXtcbiAgICByZXR1cm4gZWwubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfU0tJUCkgIT09IG51bGxcbiAgfVxuXG4gIHRhcmdldENJRENvbnRhaW5lcihodG1sKXtcbiAgICBpZighdGhpcy5pc0NJRFBhdGNoKCkpeyByZXR1cm4gfVxuICAgIGxldCBbZmlyc3QsIC4uLnJlc3RdID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmNvbnRhaW5lciwgdGhpcy50YXJnZXRDSUQpXG4gICAgaWYocmVzdC5sZW5ndGggPT09IDAgJiYgRE9NLmNoaWxkTm9kZUxlbmd0aChodG1sKSA9PT0gMSl7XG4gICAgICByZXR1cm4gZmlyc3RcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpcnN0ICYmIGZpcnN0LnBhcmVudE5vZGVcbiAgICB9XG4gIH1cblxuICAvLyBidWlsZHMgSFRNTCBmb3IgbW9ycGhkb20gcGF0Y2hcbiAgLy8gLSBmb3IgZnVsbCBwYXRjaGVzIG9mIExpdmVWaWV3IG9yIGEgY29tcG9uZW50IHdpdGggYSBzaW5nbGVcbiAgLy8gICByb290IG5vZGUsIHNpbXBseSByZXR1cm5zIHRoZSBIVE1MXG4gIC8vIC0gZm9yIHBhdGNoZXMgb2YgYSBjb21wb25lbnQgd2l0aCBtdWx0aXBsZSByb290IG5vZGVzLCB0aGVcbiAgLy8gICBwYXJlbnQgbm9kZSBiZWNvbWVzIHRoZSB0YXJnZXQgY29udGFpbmVyIGFuZCBub24tY29tcG9uZW50XG4gIC8vICAgc2libGluZ3MgYXJlIG1hcmtlZCBhcyBza2lwLlxuICBidWlsZERpZmZIVE1MKGNvbnRhaW5lciwgaHRtbCwgcGh4VXBkYXRlLCB0YXJnZXRDb250YWluZXIpe1xuICAgIGxldCBpc0NJRFBhdGNoID0gdGhpcy5pc0NJRFBhdGNoKClcbiAgICBsZXQgaXNDSURXaXRoU2luZ2xlUm9vdCA9IGlzQ0lEUGF0Y2ggJiYgdGFyZ2V0Q29udGFpbmVyLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSA9PT0gdGhpcy50YXJnZXRDSUQudG9TdHJpbmcoKVxuICAgIGlmKCFpc0NJRFBhdGNoIHx8IGlzQ0lEV2l0aFNpbmdsZVJvb3Qpe1xuICAgICAgcmV0dXJuIGh0bWxcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29tcG9uZW50IHBhdGNoIHdpdGggbXVsdGlwbGUgQ0lEIHJvb3RzXG4gICAgICBsZXQgZGlmZkNvbnRhaW5lciA9IG51bGxcbiAgICAgIGxldCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKVxuICAgICAgZGlmZkNvbnRhaW5lciA9IERPTS5jbG9uZU5vZGUodGFyZ2V0Q29udGFpbmVyKVxuICAgICAgbGV0IFtmaXJzdENvbXBvbmVudCwgLi4ucmVzdF0gPSBET00uZmluZENvbXBvbmVudE5vZGVMaXN0KGRpZmZDb250YWluZXIsIHRoaXMudGFyZ2V0Q0lEKVxuICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbFxuICAgICAgcmVzdC5mb3JFYWNoKGVsID0+IGVsLnJlbW92ZSgpKVxuICAgICAgQXJyYXkuZnJvbShkaWZmQ29udGFpbmVyLmNoaWxkTm9kZXMpLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICAvLyB3ZSBjYW4gb25seSBza2lwIHRyYWNrYWJsZSBub2RlcyB3aXRoIGFuIElEXG4gICAgICAgIGlmKGNoaWxkLmlkICYmIGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBjaGlsZC5nZXRBdHRyaWJ1dGUoUEhYX0NPTVBPTkVOVCkgIT09IHRoaXMudGFyZ2V0Q0lELnRvU3RyaW5nKCkpe1xuICAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZShQSFhfU0tJUCwgXCJcIilcbiAgICAgICAgICBjaGlsZC5pbm5lckhUTUwgPSBcIlwiXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBBcnJheS5mcm9tKHRlbXBsYXRlLmNvbnRlbnQuY2hpbGROb2RlcykuZm9yRWFjaChlbCA9PiBkaWZmQ29udGFpbmVyLmluc2VydEJlZm9yZShlbCwgZmlyc3RDb21wb25lbnQpKVxuICAgICAgZmlyc3RDb21wb25lbnQucmVtb3ZlKClcbiAgICAgIHJldHVybiBkaWZmQ29udGFpbmVyLm91dGVySFRNTFxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIENPTVBPTkVOVFMsXG4gIERZTkFNSUNTLFxuICBURU1QTEFURVMsXG4gIEVWRU5UUyxcbiAgUEhYX0NPTVBPTkVOVCxcbiAgUEhYX1NLSVAsXG4gIFJFUExZLFxuICBTVEFUSUMsXG4gIFRJVExFXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBsb2dFcnJvcixcbiAgaXNDaWQsXG59IGZyb20gXCIuL3V0aWxzXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVuZGVyZWQge1xuICBzdGF0aWMgZXh0cmFjdChkaWZmKXtcbiAgICBsZXQge1tSRVBMWV06IHJlcGx5LCBbRVZFTlRTXTogZXZlbnRzLCBbVElUTEVdOiB0aXRsZX0gPSBkaWZmXG4gICAgZGVsZXRlIGRpZmZbUkVQTFldXG4gICAgZGVsZXRlIGRpZmZbRVZFTlRTXVxuICAgIGRlbGV0ZSBkaWZmW1RJVExFXVxuICAgIHJldHVybiB7ZGlmZiwgdGl0bGUsIHJlcGx5OiByZXBseSB8fCBudWxsLCBldmVudHM6IGV2ZW50cyB8fCBbXX1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHZpZXdJZCwgcmVuZGVyZWQpe1xuICAgIHRoaXMudmlld0lkID0gdmlld0lkXG4gICAgdGhpcy5yZW5kZXJlZCA9IHt9XG4gICAgdGhpcy5tZXJnZURpZmYocmVuZGVyZWQpXG4gIH1cblxuICBwYXJlbnRWaWV3SWQoKXsgcmV0dXJuIHRoaXMudmlld0lkIH1cblxuICB0b1N0cmluZyhvbmx5Q2lkcyl7XG4gICAgcmV0dXJuIHRoaXMucmVjdXJzaXZlVG9TdHJpbmcodGhpcy5yZW5kZXJlZCwgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXSwgb25seUNpZHMpXG4gIH1cblxuICByZWN1cnNpdmVUb1N0cmluZyhyZW5kZXJlZCwgY29tcG9uZW50cyA9IHJlbmRlcmVkW0NPTVBPTkVOVFNdLCBvbmx5Q2lkcyl7XG4gICAgb25seUNpZHMgPSBvbmx5Q2lkcyA/IG5ldyBTZXQob25seUNpZHMpIDogbnVsbFxuICAgIGxldCBvdXRwdXQgPSB7YnVmZmVyOiBcIlwiLCBjb21wb25lbnRzOiBjb21wb25lbnRzLCBvbmx5Q2lkczogb25seUNpZHN9XG4gICAgdGhpcy50b091dHB1dEJ1ZmZlcihyZW5kZXJlZCwgbnVsbCwgb3V0cHV0KVxuICAgIHJldHVybiBvdXRwdXQuYnVmZmVyXG4gIH1cblxuICBjb21wb25lbnRDSURzKGRpZmYpeyByZXR1cm4gT2JqZWN0LmtleXMoZGlmZltDT01QT05FTlRTXSB8fCB7fSkubWFwKGkgPT4gcGFyc2VJbnQoaSkpIH1cblxuICBpc0NvbXBvbmVudE9ubHlEaWZmKGRpZmYpe1xuICAgIGlmKCFkaWZmW0NPTVBPTkVOVFNdKXsgcmV0dXJuIGZhbHNlIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZGlmZikubGVuZ3RoID09PSAxXG4gIH1cblxuICBnZXRDb21wb25lbnQoZGlmZiwgY2lkKXsgcmV0dXJuIGRpZmZbQ09NUE9ORU5UU11bY2lkXSB9XG5cbiAgbWVyZ2VEaWZmKGRpZmYpe1xuICAgIGxldCBuZXdjID0gZGlmZltDT01QT05FTlRTXVxuICAgIGxldCBjYWNoZSA9IHt9XG4gICAgZGVsZXRlIGRpZmZbQ09NUE9ORU5UU11cbiAgICB0aGlzLnJlbmRlcmVkID0gdGhpcy5tdXRhYmxlTWVyZ2UodGhpcy5yZW5kZXJlZCwgZGlmZilcbiAgICB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdID0gdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXSB8fCB7fVxuXG4gICAgaWYobmV3Yyl7XG4gICAgICBsZXQgb2xkYyA9IHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU11cblxuICAgICAgZm9yKGxldCBjaWQgaW4gbmV3Yyl7XG4gICAgICAgIG5ld2NbY2lkXSA9IHRoaXMuY2FjaGVkRmluZENvbXBvbmVudChjaWQsIG5ld2NbY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpXG4gICAgICB9XG5cbiAgICAgIGZvcihsZXQgY2lkIGluIG5ld2MpeyBvbGRjW2NpZF0gPSBuZXdjW2NpZF0gfVxuICAgICAgZGlmZltDT01QT05FTlRTXSA9IG5ld2NcbiAgICB9XG4gIH1cblxuICBjYWNoZWRGaW5kQ29tcG9uZW50KGNpZCwgY2RpZmYsIG9sZGMsIG5ld2MsIGNhY2hlKXtcbiAgICBpZihjYWNoZVtjaWRdKXtcbiAgICAgIHJldHVybiBjYWNoZVtjaWRdXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZGlmZiwgc3RhdCwgc2NpZCA9IGNkaWZmW1NUQVRJQ11cblxuICAgICAgaWYoaXNDaWQoc2NpZCkpe1xuICAgICAgICBsZXQgdGRpZmZcblxuICAgICAgICBpZihzY2lkID4gMCl7XG4gICAgICAgICAgdGRpZmYgPSB0aGlzLmNhY2hlZEZpbmRDb21wb25lbnQoc2NpZCwgbmV3Y1tzY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGRpZmYgPSBvbGRjWy1zY2lkXVxuICAgICAgICB9XG5cbiAgICAgICAgc3RhdCA9IHRkaWZmW1NUQVRJQ11cbiAgICAgICAgbmRpZmYgPSB0aGlzLmNsb25lTWVyZ2UodGRpZmYsIGNkaWZmKVxuICAgICAgICBuZGlmZltTVEFUSUNdID0gc3RhdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmRpZmYgPSBjZGlmZltTVEFUSUNdICE9PSB1bmRlZmluZWQgPyBjZGlmZiA6IHRoaXMuY2xvbmVNZXJnZShvbGRjW2NpZF0gfHwge30sIGNkaWZmKVxuICAgICAgfVxuXG4gICAgICBjYWNoZVtjaWRdID0gbmRpZmZcbiAgICAgIHJldHVybiBuZGlmZlxuICAgIH1cbiAgfVxuXG4gIG11dGFibGVNZXJnZSh0YXJnZXQsIHNvdXJjZSl7XG4gICAgaWYoc291cmNlW1NUQVRJQ10gIT09IHVuZGVmaW5lZCl7XG4gICAgICByZXR1cm4gc291cmNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG9NdXRhYmxlTWVyZ2UodGFyZ2V0LCBzb3VyY2UpXG4gICAgICByZXR1cm4gdGFyZ2V0XG4gICAgfVxuICB9XG5cbiAgZG9NdXRhYmxlTWVyZ2UodGFyZ2V0LCBzb3VyY2Upe1xuICAgIGZvcihsZXQga2V5IGluIHNvdXJjZSl7XG4gICAgICBsZXQgdmFsID0gc291cmNlW2tleV1cbiAgICAgIGxldCB0YXJnZXRWYWwgPSB0YXJnZXRba2V5XVxuICAgICAgaWYoaXNPYmplY3QodmFsKSAmJiB2YWxbU1RBVElDXSA9PT0gdW5kZWZpbmVkICYmIGlzT2JqZWN0KHRhcmdldFZhbCkpe1xuICAgICAgICB0aGlzLmRvTXV0YWJsZU1lcmdlKHRhcmdldFZhbCwgdmFsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjbG9uZU1lcmdlKHRhcmdldCwgc291cmNlKXtcbiAgICBsZXQgbWVyZ2VkID0gey4uLnRhcmdldCwgLi4uc291cmNlfVxuICAgIGZvcihsZXQga2V5IGluIG1lcmdlZCl7XG4gICAgICBsZXQgdmFsID0gc291cmNlW2tleV1cbiAgICAgIGxldCB0YXJnZXRWYWwgPSB0YXJnZXRba2V5XVxuICAgICAgaWYoaXNPYmplY3QodmFsKSAmJiB2YWxbU1RBVElDXSA9PT0gdW5kZWZpbmVkICYmIGlzT2JqZWN0KHRhcmdldFZhbCkpe1xuICAgICAgICBtZXJnZWRba2V5XSA9IHRoaXMuY2xvbmVNZXJnZSh0YXJnZXRWYWwsIHZhbClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZFxuICB9XG5cbiAgY29tcG9uZW50VG9TdHJpbmcoY2lkKXsgcmV0dXJuIHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcodGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXSwgY2lkKSB9XG5cbiAgcHJ1bmVDSURzKGNpZHMpe1xuICAgIGNpZHMuZm9yRWFjaChjaWQgPT4gZGVsZXRlIHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU11bY2lkXSlcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBnZXQoKXsgcmV0dXJuIHRoaXMucmVuZGVyZWQgfVxuXG4gIGlzTmV3RmluZ2VycHJpbnQoZGlmZiA9IHt9KXsgcmV0dXJuICEhZGlmZltTVEFUSUNdIH1cblxuICB0ZW1wbGF0ZVN0YXRpYyhwYXJ0LCB0ZW1wbGF0ZXMpe1xuICAgIGlmKHR5cGVvZiAocGFydCkgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiB0ZW1wbGF0ZXNbcGFydF1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhcnRcbiAgICB9XG4gIH1cblxuICB0b091dHB1dEJ1ZmZlcihyZW5kZXJlZCwgdGVtcGxhdGVzLCBvdXRwdXQpe1xuICAgIGlmKHJlbmRlcmVkW0RZTkFNSUNTXSl7IHJldHVybiB0aGlzLmNvbXByZWhlbnNpb25Ub0J1ZmZlcihyZW5kZXJlZCwgdGVtcGxhdGVzLCBvdXRwdXQpIH1cbiAgICBsZXQge1tTVEFUSUNdOiBzdGF0aWNzfSA9IHJlbmRlcmVkXG4gICAgc3RhdGljcyA9IHRoaXMudGVtcGxhdGVTdGF0aWMoc3RhdGljcywgdGVtcGxhdGVzKVxuXG4gICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzWzBdXG4gICAgZm9yKGxldCBpID0gMTsgaSA8IHN0YXRpY3MubGVuZ3RoOyBpKyspe1xuICAgICAgdGhpcy5keW5hbWljVG9CdWZmZXIocmVuZGVyZWRbaSAtIDFdLCB0ZW1wbGF0ZXMsIG91dHB1dClcbiAgICAgIG91dHB1dC5idWZmZXIgKz0gc3RhdGljc1tpXVxuICAgIH1cbiAgfVxuXG4gIGNvbXByZWhlbnNpb25Ub0J1ZmZlcihyZW5kZXJlZCwgdGVtcGxhdGVzLCBvdXRwdXQpe1xuICAgIGxldCB7W0RZTkFNSUNTXTogZHluYW1pY3MsIFtTVEFUSUNdOiBzdGF0aWNzfSA9IHJlbmRlcmVkXG4gICAgc3RhdGljcyA9IHRoaXMudGVtcGxhdGVTdGF0aWMoc3RhdGljcywgdGVtcGxhdGVzKVxuICAgIGxldCBjb21wVGVtcGxhdGVzID0gdGVtcGxhdGVzIHx8IHJlbmRlcmVkW1RFTVBMQVRFU11cblxuICAgIGZvcihsZXQgZCA9IDA7IGQgPCBkeW5hbWljcy5sZW5ndGg7IGQrKyl7XG4gICAgICBsZXQgZHluYW1pYyA9IGR5bmFtaWNzW2RdXG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbMF1cbiAgICAgIGZvcihsZXQgaSA9IDE7IGkgPCBzdGF0aWNzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdGhpcy5keW5hbWljVG9CdWZmZXIoZHluYW1pY1tpIC0gMV0sIGNvbXBUZW1wbGF0ZXMsIG91dHB1dClcbiAgICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzW2ldXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZHluYW1pY1RvQnVmZmVyKHJlbmRlcmVkLCB0ZW1wbGF0ZXMsIG91dHB1dCl7XG4gICAgaWYodHlwZW9mIChyZW5kZXJlZCkgPT09IFwibnVtYmVyXCIpe1xuICAgICAgb3V0cHV0LmJ1ZmZlciArPSB0aGlzLnJlY3Vyc2l2ZUNJRFRvU3RyaW5nKG91dHB1dC5jb21wb25lbnRzLCByZW5kZXJlZCwgb3V0cHV0Lm9ubHlDaWRzKVxuICAgIH0gZWxzZSBpZihpc09iamVjdChyZW5kZXJlZCkpe1xuICAgICAgdGhpcy50b091dHB1dEJ1ZmZlcihyZW5kZXJlZCwgdGVtcGxhdGVzLCBvdXRwdXQpXG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5idWZmZXIgKz0gcmVuZGVyZWRcbiAgICB9XG4gIH1cblxuICByZWN1cnNpdmVDSURUb1N0cmluZyhjb21wb25lbnRzLCBjaWQsIG9ubHlDaWRzKXtcbiAgICBsZXQgY29tcG9uZW50ID0gY29tcG9uZW50c1tjaWRdIHx8IGxvZ0Vycm9yKGBubyBjb21wb25lbnQgZm9yIENJRCAke2NpZH1gLCBjb21wb25lbnRzKVxuICAgIGxldCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKVxuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHRoaXMucmVjdXJzaXZlVG9TdHJpbmcoY29tcG9uZW50LCBjb21wb25lbnRzLCBvbmx5Q2lkcylcbiAgICBsZXQgY29udGFpbmVyID0gdGVtcGxhdGUuY29udGVudFxuICAgIGxldCBza2lwID0gb25seUNpZHMgJiYgIW9ubHlDaWRzLmhhcyhjaWQpXG5cbiAgICBsZXQgW2hhc0NoaWxkTm9kZXMsIGhhc0NoaWxkQ29tcG9uZW50c10gPVxuICAgICAgQXJyYXkuZnJvbShjb250YWluZXIuY2hpbGROb2RlcykucmVkdWNlKChbaGFzTm9kZXMsIGhhc0NvbXBvbmVudHNdLCBjaGlsZCwgaSkgPT4ge1xuICAgICAgICBpZihjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpe1xuICAgICAgICAgIGlmKGNoaWxkLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSl7XG4gICAgICAgICAgICByZXR1cm4gW2hhc05vZGVzLCB0cnVlXVxuICAgICAgICAgIH1cbiAgICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoUEhYX0NPTVBPTkVOVCwgY2lkKVxuICAgICAgICAgIGlmKCFjaGlsZC5pZCl7IGNoaWxkLmlkID0gYCR7dGhpcy5wYXJlbnRWaWV3SWQoKX0tJHtjaWR9LSR7aX1gIH1cbiAgICAgICAgICBpZihza2lwKXtcbiAgICAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZShQSFhfU0tJUCwgXCJcIilcbiAgICAgICAgICAgIGNoaWxkLmlubmVySFRNTCA9IFwiXCJcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFt0cnVlLCBoYXNDb21wb25lbnRzXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmKGNoaWxkLm5vZGVWYWx1ZS50cmltKCkgIT09IFwiXCIpe1xuICAgICAgICAgICAgbG9nRXJyb3IoXCJvbmx5IEhUTUwgZWxlbWVudCB0YWdzIGFyZSBhbGxvd2VkIGF0IHRoZSByb290IG9mIGNvbXBvbmVudHMuXFxuXFxuXCIgK1xuICAgICAgICAgICAgICBgZ290OiBcIiR7Y2hpbGQubm9kZVZhbHVlLnRyaW0oKX1cIlxcblxcbmAgK1xuICAgICAgICAgICAgICBcIndpdGhpbjpcXG5cIiwgdGVtcGxhdGUuaW5uZXJIVE1MLnRyaW0oKSlcbiAgICAgICAgICAgIGNoaWxkLnJlcGxhY2VXaXRoKHRoaXMuY3JlYXRlU3BhbihjaGlsZC5ub2RlVmFsdWUsIGNpZCkpXG4gICAgICAgICAgICByZXR1cm4gW3RydWUsIGhhc0NvbXBvbmVudHNdXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoaWxkLnJlbW92ZSgpXG4gICAgICAgICAgICByZXR1cm4gW2hhc05vZGVzLCBoYXNDb21wb25lbnRzXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgW2ZhbHNlLCBmYWxzZV0pXG5cbiAgICBpZighaGFzQ2hpbGROb2RlcyAmJiAhaGFzQ2hpbGRDb21wb25lbnRzKXtcbiAgICAgIGxvZ0Vycm9yKFwiZXhwZWN0ZWQgYXQgbGVhc3Qgb25lIEhUTUwgZWxlbWVudCB0YWcgaW5zaWRlIGEgY29tcG9uZW50LCBidXQgdGhlIGNvbXBvbmVudCBpcyBlbXB0eTpcXG5cIixcbiAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MLnRyaW0oKSlcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNwYW4oXCJcIiwgY2lkKS5vdXRlckhUTUxcbiAgICB9IGVsc2UgaWYoIWhhc0NoaWxkTm9kZXMgJiYgaGFzQ2hpbGRDb21wb25lbnRzKXtcbiAgICAgIGxvZ0Vycm9yKFwiZXhwZWN0ZWQgYXQgbGVhc3Qgb25lIEhUTUwgZWxlbWVudCB0YWcgZGlyZWN0bHkgaW5zaWRlIGEgY29tcG9uZW50LCBidXQgb25seSBzdWJjb21wb25lbnRzIHdlcmUgZm91bmQuIEEgY29tcG9uZW50IG11c3QgcmVuZGVyIGF0IGxlYXN0IG9uZSBIVE1MIHRhZyBkaXJlY3RseSBpbnNpZGUgaXRzZWxmLlwiLFxuICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwudHJpbSgpKVxuICAgICAgcmV0dXJuIHRlbXBsYXRlLmlubmVySFRNTFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGVtcGxhdGUuaW5uZXJIVE1MXG4gICAgfVxuICB9XG5cbiAgY3JlYXRlU3Bhbih0ZXh0LCBjaWQpe1xuICAgIGxldCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIilcbiAgICBzcGFuLmlubmVyVGV4dCA9IHRleHRcbiAgICBzcGFuLnNldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5ULCBjaWQpXG4gICAgcmV0dXJuIHNwYW5cbiAgfVxufVxuIiwgImxldCB2aWV3SG9va0lEID0gMVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlld0hvb2sge1xuICBzdGF0aWMgbWFrZUlEKCl7IHJldHVybiB2aWV3SG9va0lEKysgfVxuICBzdGF0aWMgZWxlbWVudElEKGVsKXsgcmV0dXJuIGVsLnBoeEhvb2tJZCB9XG5cbiAgY29uc3RydWN0b3IodmlldywgZWwsIGNhbGxiYWNrcyl7XG4gICAgdGhpcy5fX3ZpZXcgPSB2aWV3XG4gICAgdGhpcy5saXZlU29ja2V0ID0gdmlldy5saXZlU29ja2V0XG4gICAgdGhpcy5fX2NhbGxiYWNrcyA9IGNhbGxiYWNrc1xuICAgIHRoaXMuX19saXN0ZW5lcnMgPSBuZXcgU2V0KClcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSBmYWxzZVxuICAgIHRoaXMuZWwgPSBlbFxuICAgIHRoaXMuZWwucGh4SG9va0lkID0gdGhpcy5jb25zdHJ1Y3Rvci5tYWtlSUQoKVxuICAgIGZvcihsZXQga2V5IGluIHRoaXMuX19jYWxsYmFja3MpeyB0aGlzW2tleV0gPSB0aGlzLl9fY2FsbGJhY2tzW2tleV0gfVxuICB9XG5cbiAgX19tb3VudGVkKCl7IHRoaXMubW91bnRlZCAmJiB0aGlzLm1vdW50ZWQoKSB9XG4gIF9fdXBkYXRlZCgpeyB0aGlzLnVwZGF0ZWQgJiYgdGhpcy51cGRhdGVkKCkgfVxuICBfX2JlZm9yZVVwZGF0ZSgpeyB0aGlzLmJlZm9yZVVwZGF0ZSAmJiB0aGlzLmJlZm9yZVVwZGF0ZSgpIH1cbiAgX19kZXN0cm95ZWQoKXsgdGhpcy5kZXN0cm95ZWQgJiYgdGhpcy5kZXN0cm95ZWQoKSB9XG4gIF9fcmVjb25uZWN0ZWQoKXtcbiAgICBpZih0aGlzLl9faXNEaXNjb25uZWN0ZWQpe1xuICAgICAgdGhpcy5fX2lzRGlzY29ubmVjdGVkID0gZmFsc2VcbiAgICAgIHRoaXMucmVjb25uZWN0ZWQgJiYgdGhpcy5yZWNvbm5lY3RlZCgpXG4gICAgfVxuICB9XG4gIF9fZGlzY29ubmVjdGVkKCl7XG4gICAgdGhpcy5fX2lzRGlzY29ubmVjdGVkID0gdHJ1ZVxuICAgIHRoaXMuZGlzY29ubmVjdGVkICYmIHRoaXMuZGlzY29ubmVjdGVkKClcbiAgfVxuXG4gIHB1c2hFdmVudChldmVudCwgcGF5bG9hZCA9IHt9LCBvblJlcGx5ID0gZnVuY3Rpb24gKCl7IH0pe1xuICAgIHJldHVybiB0aGlzLl9fdmlldy5wdXNoSG9va0V2ZW50KG51bGwsIGV2ZW50LCBwYXlsb2FkLCBvblJlcGx5KVxuICB9XG5cbiAgcHVzaEV2ZW50VG8ocGh4VGFyZ2V0LCBldmVudCwgcGF5bG9hZCA9IHt9LCBvblJlcGx5ID0gZnVuY3Rpb24gKCl7IH0pe1xuICAgIHJldHVybiB0aGlzLl9fdmlldy53aXRoaW5UYXJnZXRzKHBoeFRhcmdldCwgKHZpZXcsIHRhcmdldEN0eCkgPT4ge1xuICAgICAgcmV0dXJuIHZpZXcucHVzaEhvb2tFdmVudCh0YXJnZXRDdHgsIGV2ZW50LCBwYXlsb2FkLCBvblJlcGx5KVxuICAgIH0pXG4gIH1cblxuICBoYW5kbGVFdmVudChldmVudCwgY2FsbGJhY2spe1xuICAgIGxldCBjYWxsYmFja1JlZiA9IChjdXN0b21FdmVudCwgYnlwYXNzKSA9PiBieXBhc3MgPyBldmVudCA6IGNhbGxiYWNrKGN1c3RvbUV2ZW50LmRldGFpbClcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihgcGh4OiR7ZXZlbnR9YCwgY2FsbGJhY2tSZWYpXG4gICAgdGhpcy5fX2xpc3RlbmVycy5hZGQoY2FsbGJhY2tSZWYpXG4gICAgcmV0dXJuIGNhbGxiYWNrUmVmXG4gIH1cblxuICByZW1vdmVIYW5kbGVFdmVudChjYWxsYmFja1JlZil7XG4gICAgbGV0IGV2ZW50ID0gY2FsbGJhY2tSZWYobnVsbCwgdHJ1ZSlcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcGh4OiR7ZXZlbnR9YCwgY2FsbGJhY2tSZWYpXG4gICAgdGhpcy5fX2xpc3RlbmVycy5kZWxldGUoY2FsbGJhY2tSZWYpXG4gIH1cblxuICB1cGxvYWQobmFtZSwgZmlsZXMpe1xuICAgIHJldHVybiB0aGlzLl9fdmlldy5kaXNwYXRjaFVwbG9hZHMobmFtZSwgZmlsZXMpXG4gIH1cblxuICB1cGxvYWRUbyhwaHhUYXJnZXQsIG5hbWUsIGZpbGVzKXtcbiAgICByZXR1cm4gdGhpcy5fX3ZpZXcud2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsIHZpZXcgPT4gdmlldy5kaXNwYXRjaFVwbG9hZHMobmFtZSwgZmlsZXMpKVxuICB9XG5cbiAgX19jbGVhbnVwX18oKXtcbiAgICB0aGlzLl9fbGlzdGVuZXJzLmZvckVhY2goY2FsbGJhY2tSZWYgPT4gdGhpcy5yZW1vdmVIYW5kbGVFdmVudChjYWxsYmFja1JlZikpXG4gIH1cbn1cbiIsICJpbXBvcnQgRE9NIGZyb20gXCIuL2RvbVwiXG5cbmxldCBKUyA9IHtcbiAgZXhlYyhldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZGVmYXVsdHMpe1xuICAgIGxldCBbZGVmYXVsdEtpbmQsIGRlZmF1bHRBcmdzXSA9IGRlZmF1bHRzIHx8IFtudWxsLCB7fV1cbiAgICBsZXQgY29tbWFuZHMgPSBwaHhFdmVudC5jaGFyQXQoMCkgPT09IFwiW1wiID9cbiAgICAgIEpTT04ucGFyc2UocGh4RXZlbnQpIDogW1tkZWZhdWx0S2luZCwgZGVmYXVsdEFyZ3NdXVxuXG4gICAgY29tbWFuZHMuZm9yRWFjaCgoW2tpbmQsIGFyZ3NdKSA9PiB7XG4gICAgICBpZihraW5kID09PSBkZWZhdWx0S2luZCAmJiBkZWZhdWx0QXJncy5kYXRhKXtcbiAgICAgICAgYXJncy5kYXRhID0gT2JqZWN0LmFzc2lnbihhcmdzLmRhdGEgfHwge30sIGRlZmF1bHRBcmdzLmRhdGEpXG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlclRvRWxzKHNvdXJjZUVsLCBhcmdzKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgdGhpc1tgZXhlY18ke2tpbmR9YF0oZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCBhcmdzKVxuICAgICAgfSlcbiAgICB9KVxuICB9LFxuXG4gIGlzVmlzaWJsZShlbCl7XG4gICAgcmV0dXJuICEhKGVsLm9mZnNldFdpZHRoIHx8IGVsLm9mZnNldEhlaWdodCB8fCBlbC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCA+IDApXG4gIH0sXG5cbiAgLy8gcHJpdmF0ZVxuXG4gIC8vIGNvbW1hbmRzXG5cbiAgZXhlY19kaXNwYXRjaChldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHt0bywgZXZlbnQsIGRldGFpbCwgYnViYmxlc30pe1xuICAgIGRldGFpbCA9IGRldGFpbCB8fCB7fVxuICAgIGRldGFpbC5kaXNwYXRjaGVyID0gc291cmNlRWxcbiAgICBET00uZGlzcGF0Y2hFdmVudChlbCwgZXZlbnQsIHtkZXRhaWwsIGJ1YmJsZXN9KVxuICB9LFxuXG4gIGV4ZWNfcHVzaChldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIGFyZ3Mpe1xuICAgIGlmKCF2aWV3LmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gfVxuXG4gICAgbGV0IHtldmVudCwgZGF0YSwgdGFyZ2V0LCBwYWdlX2xvYWRpbmcsIGxvYWRpbmcsIHZhbHVlLCBkaXNwYXRjaGVyfSA9IGFyZ3NcbiAgICBsZXQgcHVzaE9wdHMgPSB7bG9hZGluZywgdmFsdWUsIHRhcmdldCwgcGFnZV9sb2FkaW5nOiAhIXBhZ2VfbG9hZGluZ31cbiAgICBsZXQgdGFyZ2V0U3JjID0gZXZlbnRUeXBlID09PSBcImNoYW5nZVwiICYmIGRpc3BhdGNoZXIgPyBkaXNwYXRjaGVyIDogc291cmNlRWxcbiAgICBsZXQgcGh4VGFyZ2V0ID0gdGFyZ2V0IHx8IHRhcmdldFNyYy5nZXRBdHRyaWJ1dGUodmlldy5iaW5kaW5nKFwidGFyZ2V0XCIpKSB8fCB0YXJnZXRTcmNcbiAgICB2aWV3LndpdGhpblRhcmdldHMocGh4VGFyZ2V0LCAodGFyZ2V0VmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICBpZihldmVudFR5cGUgPT09IFwiY2hhbmdlXCIpe1xuICAgICAgICBsZXQge25ld0NpZCwgX3RhcmdldCwgY2FsbGJhY2t9ID0gYXJnc1xuICAgICAgICBfdGFyZ2V0ID0gX3RhcmdldCB8fCAoc291cmNlRWwgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ID8gc291cmNlRWwubmFtZSA6IHVuZGVmaW5lZClcbiAgICAgICAgaWYoX3RhcmdldCl7IHB1c2hPcHRzLl90YXJnZXQgPSBfdGFyZ2V0IH1cbiAgICAgICAgdGFyZ2V0Vmlldy5wdXNoSW5wdXQoc291cmNlRWwsIHRhcmdldEN0eCwgbmV3Q2lkLCBldmVudCB8fCBwaHhFdmVudCwgcHVzaE9wdHMsIGNhbGxiYWNrKVxuICAgICAgfSBlbHNlIGlmKGV2ZW50VHlwZSA9PT0gXCJzdWJtaXRcIil7XG4gICAgICAgIHRhcmdldFZpZXcuc3VibWl0Rm9ybShzb3VyY2VFbCwgdGFyZ2V0Q3R4LCBldmVudCB8fCBwaHhFdmVudCwgcHVzaE9wdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRWaWV3LnB1c2hFdmVudChldmVudFR5cGUsIHNvdXJjZUVsLCB0YXJnZXRDdHgsIGV2ZW50IHx8IHBoeEV2ZW50LCBkYXRhLCBwdXNoT3B0cylcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuXG4gIGV4ZWNfYWRkX2NsYXNzKGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwge25hbWVzLCB0cmFuc2l0aW9uLCB0aW1lfSl7XG4gICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIG5hbWVzLCBbXSwgdHJhbnNpdGlvbiwgdGltZSwgdmlldylcbiAgfSxcblxuICBleGVjX3JlbW92ZV9jbGFzcyhldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHtuYW1lcywgdHJhbnNpdGlvbiwgdGltZX0pe1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcpXG4gIH0sXG5cbiAgZXhlY190cmFuc2l0aW9uKGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwge3RpbWUsIHRyYW5zaXRpb259KXtcbiAgICBsZXQgW3RyYW5zaXRpb25fc3RhcnQsIHJ1bm5pbmcsIHRyYW5zaXRpb25fZW5kXSA9IHRyYW5zaXRpb25cbiAgICBsZXQgb25TdGFydCA9ICgpID0+IHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCB0cmFuc2l0aW9uX3N0YXJ0LmNvbmNhdChydW5uaW5nKSwgW10pXG4gICAgbGV0IG9uRG9uZSA9ICgpID0+IHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCB0cmFuc2l0aW9uX2VuZCwgdHJhbnNpdGlvbl9zdGFydC5jb25jYXQocnVubmluZykpXG4gICAgdmlldy50cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSlcbiAgfSxcblxuICBleGVjX3RvZ2dsZShldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHtkaXNwbGF5LCBpbnMsIG91dHMsIHRpbWV9KXtcbiAgICB0aGlzLnRvZ2dsZShldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCBpbnMsIG91dHMsIHRpbWUpXG4gIH0sXG5cbiAgZXhlY19zaG93KGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwge2Rpc3BsYXksIHRyYW5zaXRpb24sIHRpbWV9KXtcbiAgICB0aGlzLnNob3coZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSlcbiAgfSxcblxuICBleGVjX2hpZGUoZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7ZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZX0pe1xuICAgIHRoaXMuaGlkZShldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lKVxuICB9LFxuXG4gIGV4ZWNfc2V0X2F0dHIoZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7YXR0cjogW2F0dHIsIHZhbF19KXtcbiAgICB0aGlzLnNldE9yUmVtb3ZlQXR0cnMoZWwsIFtbYXR0ciwgdmFsXV0sIFtdKVxuICB9LFxuXG4gIGV4ZWNfcmVtb3ZlX2F0dHIoZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7YXR0cn0pe1xuICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW10sIFthdHRyXSlcbiAgfSxcblxuICAvLyB1dGlscyBmb3IgY29tbWFuZHNcblxuICBzaG93KGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUpe1xuICAgIGlmKCF0aGlzLmlzVmlzaWJsZShlbCkpe1xuICAgICAgdGhpcy50b2dnbGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgbnVsbCwgdGltZSlcbiAgICB9XG4gIH0sXG5cbiAgaGlkZShldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lKXtcbiAgICBpZih0aGlzLmlzVmlzaWJsZShlbCkpe1xuICAgICAgdGhpcy50b2dnbGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgbnVsbCwgdHJhbnNpdGlvbiwgdGltZSlcbiAgICB9XG4gIH0sXG5cbiAgdG9nZ2xlKGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIGlucywgb3V0cywgdGltZSl7XG4gICAgbGV0IFtpbkNsYXNzZXMsIGluU3RhcnRDbGFzc2VzLCBpbkVuZENsYXNzZXNdID0gaW5zIHx8IFtbXSwgW10sIFtdXVxuICAgIGxldCBbb3V0Q2xhc3Nlcywgb3V0U3RhcnRDbGFzc2VzLCBvdXRFbmRDbGFzc2VzXSA9IG91dHMgfHwgW1tdLCBbXSwgW11dXG4gICAgaWYoaW5DbGFzc2VzLmxlbmd0aCA+IDAgfHwgb3V0Q2xhc3Nlcy5sZW5ndGggPiAwKXtcbiAgICAgIGlmKHRoaXMuaXNWaXNpYmxlKGVsKSl7XG4gICAgICAgIGxldCBvblN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBvdXRTdGFydENsYXNzZXMsIGluQ2xhc3Nlcy5jb25jYXQoaW5TdGFydENsYXNzZXMpLmNvbmNhdChpbkVuZENsYXNzZXMpKVxuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIG91dENsYXNzZXMsIFtdKVxuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgb3V0RW5kQ2xhc3Nlcywgb3V0U3RhcnRDbGFzc2VzKSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtc3RhcnRcIikpXG4gICAgICAgIHZpZXcudHJhbnNpdGlvbih0aW1lLCBvblN0YXJ0LCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIFtdLCBvdXRDbGFzc2VzLmNvbmNhdChvdXRFbmRDbGFzc2VzKSlcbiAgICAgICAgICBET00ucHV0U3RpY2t5KGVsLCBcInRvZ2dsZVwiLCBjdXJyZW50RWwgPT4gY3VycmVudEVsLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIilcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpoaWRlLWVuZFwiKSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmKGV2ZW50VHlwZSA9PT0gXCJyZW1vdmVcIil7IHJldHVybiB9XG4gICAgICAgIGxldCBvblN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBpblN0YXJ0Q2xhc3Nlcywgb3V0Q2xhc3Nlcy5jb25jYXQob3V0U3RhcnRDbGFzc2VzKS5jb25jYXQob3V0RW5kQ2xhc3NlcykpXG4gICAgICAgICAgRE9NLnB1dFN0aWNreShlbCwgXCJ0b2dnbGVcIiwgY3VycmVudEVsID0+IGN1cnJlbnRFbC5zdHlsZS5kaXNwbGF5ID0gKGRpc3BsYXkgfHwgXCJibG9ja1wiKSlcbiAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBpbkNsYXNzZXMsIFtdKVxuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgaW5FbmRDbGFzc2VzLCBpblN0YXJ0Q2xhc3NlcykpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LXN0YXJ0XCIpKVxuICAgICAgICB2aWV3LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgaW5DbGFzc2VzLmNvbmNhdChpbkVuZENsYXNzZXMpKVxuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OnNob3ctZW5kXCIpKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZih0aGlzLmlzVmlzaWJsZShlbCkpe1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpoaWRlLXN0YXJ0XCIpKVxuICAgICAgICAgIERPTS5wdXRTdGlja3koZWwsIFwidG9nZ2xlXCIsIGN1cnJlbnRFbCA9PiBjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKVxuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtZW5kXCIpKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6c2hvdy1zdGFydFwiKSlcbiAgICAgICAgICBET00ucHV0U3RpY2t5KGVsLCBcInRvZ2dsZVwiLCBjdXJyZW50RWwgPT4gY3VycmVudEVsLnN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5IHx8IFwiYmxvY2tcIilcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LWVuZFwiKSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBhZGRzLCByZW1vdmVzLCB0cmFuc2l0aW9uLCB0aW1lLCB2aWV3KXtcbiAgICBsZXQgW3RyYW5zaXRpb25fcnVuLCB0cmFuc2l0aW9uX3N0YXJ0LCB0cmFuc2l0aW9uX2VuZF0gPSB0cmFuc2l0aW9uIHx8IFtbXSwgW10sIFtdXVxuICAgIGlmKHRyYW5zaXRpb25fcnVuLmxlbmd0aCA+IDApe1xuICAgICAgbGV0IG9uU3RhcnQgPSAoKSA9PiB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgdHJhbnNpdGlvbl9zdGFydC5jb25jYXQodHJhbnNpdGlvbl9ydW4pLCBbXSlcbiAgICAgIGxldCBvbkRvbmUgPSAoKSA9PiB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgYWRkcy5jb25jYXQodHJhbnNpdGlvbl9lbmQpLCByZW1vdmVzLmNvbmNhdCh0cmFuc2l0aW9uX3J1bikuY29uY2F0KHRyYW5zaXRpb25fc3RhcnQpKVxuICAgICAgcmV0dXJuIHZpZXcudHJhbnNpdGlvbih0aW1lLCBvblN0YXJ0LCBvbkRvbmUpXG4gICAgfVxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgbGV0IFtwcmV2QWRkcywgcHJldlJlbW92ZXNdID0gRE9NLmdldFN0aWNreShlbCwgXCJjbGFzc2VzXCIsIFtbXSwgW11dKVxuICAgICAgbGV0IGtlZXBBZGRzID0gYWRkcy5maWx0ZXIobmFtZSA9PiBwcmV2QWRkcy5pbmRleE9mKG5hbWUpIDwgMCAmJiAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKG5hbWUpKVxuICAgICAgbGV0IGtlZXBSZW1vdmVzID0gcmVtb3Zlcy5maWx0ZXIobmFtZSA9PiBwcmV2UmVtb3Zlcy5pbmRleE9mKG5hbWUpIDwgMCAmJiBlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSkpXG4gICAgICBsZXQgbmV3QWRkcyA9IHByZXZBZGRzLmZpbHRlcihuYW1lID0+IHJlbW92ZXMuaW5kZXhPZihuYW1lKSA8IDApLmNvbmNhdChrZWVwQWRkcylcbiAgICAgIGxldCBuZXdSZW1vdmVzID0gcHJldlJlbW92ZXMuZmlsdGVyKG5hbWUgPT4gYWRkcy5pbmRleE9mKG5hbWUpIDwgMCkuY29uY2F0KGtlZXBSZW1vdmVzKVxuXG4gICAgICBET00ucHV0U3RpY2t5KGVsLCBcImNsYXNzZXNcIiwgY3VycmVudEVsID0+IHtcbiAgICAgICAgY3VycmVudEVsLmNsYXNzTGlzdC5yZW1vdmUoLi4ubmV3UmVtb3ZlcylcbiAgICAgICAgY3VycmVudEVsLmNsYXNzTGlzdC5hZGQoLi4ubmV3QWRkcylcbiAgICAgICAgcmV0dXJuIFtuZXdBZGRzLCBuZXdSZW1vdmVzXVxuICAgICAgfSlcbiAgICB9KVxuICB9LFxuXG4gIHNldE9yUmVtb3ZlQXR0cnMoZWwsIHNldHMsIHJlbW92ZXMpe1xuICAgIGxldCBbcHJldlNldHMsIHByZXZSZW1vdmVzXSA9IERPTS5nZXRTdGlja3koZWwsIFwiYXR0cnNcIiwgW1tdLCBbXV0pXG5cbiAgICBsZXQgYWx0ZXJlZEF0dHJzID0gc2V0cy5tYXAoKFthdHRyLCBfdmFsXSkgPT4gYXR0cikuY29uY2F0KHJlbW92ZXMpO1xuICAgIGxldCBuZXdTZXRzID0gcHJldlNldHMuZmlsdGVyKChbYXR0ciwgX3ZhbF0pID0+ICFhbHRlcmVkQXR0cnMuaW5jbHVkZXMoYXR0cikpLmNvbmNhdChzZXRzKTtcbiAgICBsZXQgbmV3UmVtb3ZlcyA9IHByZXZSZW1vdmVzLmZpbHRlcigoYXR0cikgPT4gIWFsdGVyZWRBdHRycy5pbmNsdWRlcyhhdHRyKSkuY29uY2F0KHJlbW92ZXMpO1xuXG4gICAgRE9NLnB1dFN0aWNreShlbCwgXCJhdHRyc1wiLCBjdXJyZW50RWwgPT4ge1xuICAgICAgbmV3UmVtb3Zlcy5mb3JFYWNoKGF0dHIgPT4gY3VycmVudEVsLnJlbW92ZUF0dHJpYnV0ZShhdHRyKSlcbiAgICAgIG5ld1NldHMuZm9yRWFjaCgoW2F0dHIsIHZhbF0pID0+IGN1cnJlbnRFbC5zZXRBdHRyaWJ1dGUoYXR0ciwgdmFsKSlcbiAgICAgIHJldHVybiBbbmV3U2V0cywgbmV3UmVtb3Zlc11cbiAgICB9KVxuICB9LFxuXG4gIGhhc0FsbENsYXNzZXMoZWwsIGNsYXNzZXMpeyByZXR1cm4gY2xhc3Nlcy5ldmVyeShuYW1lID0+IGVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSkgfSxcblxuICBpc1RvZ2dsZWRPdXQoZWwsIG91dENsYXNzZXMpe1xuICAgIHJldHVybiAhdGhpcy5pc1Zpc2libGUoZWwpIHx8IHRoaXMuaGFzQWxsQ2xhc3NlcyhlbCwgb3V0Q2xhc3NlcylcbiAgfSxcblxuICBmaWx0ZXJUb0Vscyhzb3VyY2VFbCwge3RvfSl7XG4gICAgcmV0dXJuIHRvID8gRE9NLmFsbChkb2N1bWVudCwgdG8pIDogW3NvdXJjZUVsXVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEpTXG4iLCAiaW1wb3J0IHtcbiAgQkVGT1JFX1VOTE9BRF9MT0FERVJfVElNRU9VVCxcbiAgQ0hFQ0tBQkxFX0lOUFVUUyxcbiAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgUEhYX0FVVE9fUkVDT1ZFUixcbiAgUEhYX0NPTVBPTkVOVCxcbiAgUEhYX0NPTk5FQ1RFRF9DTEFTUyxcbiAgUEhYX0RJU0FCTEVfV0lUSCxcbiAgUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFLFxuICBQSFhfRElTQUJMRUQsXG4gIFBIWF9ESVNDT05ORUNURURfQ0xBU1MsXG4gIFBIWF9FVkVOVF9DTEFTU0VTLFxuICBQSFhfRVJST1JfQ0xBU1MsXG4gIFBIWF9GRUVEQkFDS19GT1IsXG4gIFBIWF9IQVNfU1VCTUlUVEVELFxuICBQSFhfSE9PSyxcbiAgUEhYX1BBR0VfTE9BRElORyxcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1BST0dSRVNTLFxuICBQSFhfUkVBRE9OTFksXG4gIFBIWF9SRUYsXG4gIFBIWF9SRUZfU1JDLFxuICBQSFhfUk9PVF9JRCxcbiAgUEhYX1NFU1NJT04sXG4gIFBIWF9TVEFUSUMsXG4gIFBIWF9UUkFDS19TVEFUSUMsXG4gIFBIWF9UUkFDS19VUExPQURTLFxuICBQSFhfVVBEQVRFLFxuICBQSFhfVVBMT0FEX1JFRixcbiAgUEhYX1ZJRVdfU0VMRUNUT1IsXG4gIFBVU0hfVElNRU9VVCxcbiAgUEhYX01BSU4sXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgaXNFbXB0eSxcbiAgaXNFcXVhbE9iaixcbiAgbG9nRXJyb3IsXG4gIG1heWJlLFxuICBpc0NpZCxcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgQnJvd3NlciBmcm9tIFwiLi9icm93c2VyXCJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCJcbmltcG9ydCBET01QYXRjaCBmcm9tIFwiLi9kb21fcGF0Y2hcIlxuaW1wb3J0IExpdmVVcGxvYWRlciBmcm9tIFwiLi9saXZlX3VwbG9hZGVyXCJcbmltcG9ydCBSZW5kZXJlZCBmcm9tIFwiLi9yZW5kZXJlZFwiXG5pbXBvcnQgVmlld0hvb2sgZnJvbSBcIi4vdmlld19ob29rXCJcbmltcG9ydCBKUyBmcm9tIFwiLi9qc1wiXG5cbmxldCBzZXJpYWxpemVGb3JtID0gKGZvcm0sIG1ldGEsIG9ubHlOYW1lcyA9IFtdKSA9PiB7XG4gIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKVxuICBsZXQgdG9SZW1vdmUgPSBbXVxuXG4gIGZvcm1EYXRhLmZvckVhY2goKHZhbCwga2V5LCBfaW5kZXgpID0+IHtcbiAgICBpZih2YWwgaW5zdGFuY2VvZiBGaWxlKXsgdG9SZW1vdmUucHVzaChrZXkpIH1cbiAgfSlcblxuICAvLyBDbGVhbnVwIGFmdGVyIGJ1aWxkaW5nIGZpbGVEYXRhXG4gIHRvUmVtb3ZlLmZvckVhY2goa2V5ID0+IGZvcm1EYXRhLmRlbGV0ZShrZXkpKVxuXG4gIGxldCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgZm9yKGxldCBba2V5LCB2YWxdIG9mIGZvcm1EYXRhLmVudHJpZXMoKSl7XG4gICAgaWYob25seU5hbWVzLmxlbmd0aCA9PT0gMCB8fCBvbmx5TmFtZXMuaW5kZXhPZihrZXkpID49IDApe1xuICAgICAgcGFyYW1zLmFwcGVuZChrZXksIHZhbClcbiAgICB9XG4gIH1cbiAgZm9yKGxldCBtZXRhS2V5IGluIG1ldGEpeyBwYXJhbXMuYXBwZW5kKG1ldGFLZXksIG1ldGFbbWV0YUtleV0pIH1cblxuICByZXR1cm4gcGFyYW1zLnRvU3RyaW5nKClcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlldyB7XG4gIGNvbnN0cnVjdG9yKGVsLCBsaXZlU29ja2V0LCBwYXJlbnRWaWV3LCBmbGFzaCl7XG4gICAgdGhpcy5saXZlU29ja2V0ID0gbGl2ZVNvY2tldFxuICAgIHRoaXMuZmxhc2ggPSBmbGFzaFxuICAgIHRoaXMucGFyZW50ID0gcGFyZW50Vmlld1xuICAgIHRoaXMucm9vdCA9IHBhcmVudFZpZXcgPyBwYXJlbnRWaWV3LnJvb3QgOiB0aGlzXG4gICAgdGhpcy5lbCA9IGVsXG4gICAgdGhpcy5pZCA9IHRoaXMuZWwuaWRcbiAgICB0aGlzLnJlZiA9IDBcbiAgICB0aGlzLmNoaWxkSm9pbnMgPSAwXG4gICAgdGhpcy5sb2FkZXJUaW1lciA9IG51bGxcbiAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgdGhpcy5wcnVuaW5nQ0lEcyA9IFtdXG4gICAgdGhpcy5yZWRpcmVjdCA9IGZhbHNlXG4gICAgdGhpcy5ocmVmID0gbnVsbFxuICAgIHRoaXMuam9pbkNvdW50ID0gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5qb2luQ291bnQgLSAxIDogMFxuICAgIHRoaXMuam9pblBlbmRpbmcgPSB0cnVlXG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZVxuICAgIHRoaXMuam9pbkNhbGxiYWNrID0gZnVuY3Rpb24ob25Eb25lKXsgb25Eb25lICYmIG9uRG9uZSgpIH1cbiAgICB0aGlzLnN0b3BDYWxsYmFjayA9IGZ1bmN0aW9uKCl7IH1cbiAgICB0aGlzLnBlbmRpbmdKb2luT3BzID0gdGhpcy5wYXJlbnQgPyBudWxsIDogW11cbiAgICB0aGlzLnZpZXdIb29rcyA9IHt9XG4gICAgdGhpcy51cGxvYWRlcnMgPSB7fVxuICAgIHRoaXMuZm9ybVN1Ym1pdHMgPSBbXVxuICAgIHRoaXMuY2hpbGRyZW4gPSB0aGlzLnBhcmVudCA/IG51bGwgOiB7fVxuICAgIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXSA9IHt9XG4gICAgdGhpcy5jaGFubmVsID0gdGhpcy5saXZlU29ja2V0LmNoYW5uZWwoYGx2OiR7dGhpcy5pZH1gLCAoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWRpcmVjdDogdGhpcy5yZWRpcmVjdCA/IHRoaXMuaHJlZiA6IHVuZGVmaW5lZCxcbiAgICAgICAgdXJsOiB0aGlzLnJlZGlyZWN0ID8gdW5kZWZpbmVkIDogdGhpcy5ocmVmIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgcGFyYW1zOiB0aGlzLmNvbm5lY3RQYXJhbXMoKSxcbiAgICAgICAgc2Vzc2lvbjogdGhpcy5nZXRTZXNzaW9uKCksXG4gICAgICAgIHN0YXRpYzogdGhpcy5nZXRTdGF0aWMoKSxcbiAgICAgICAgZmxhc2g6IHRoaXMuZmxhc2hcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMuc2hvd0xvYWRlcih0aGlzLmxpdmVTb2NrZXQubG9hZGVyVGltZW91dClcbiAgICB0aGlzLmJpbmRDaGFubmVsKClcbiAgfVxuXG4gIHNldEhyZWYoaHJlZil7IHRoaXMuaHJlZiA9IGhyZWYgfVxuXG4gIHNldFJlZGlyZWN0KGhyZWYpe1xuICAgIHRoaXMucmVkaXJlY3QgPSB0cnVlXG4gICAgdGhpcy5ocmVmID0gaHJlZlxuICB9XG5cbiAgaXNNYWluKCl7IHJldHVybiB0aGlzLmVsLmhhc0F0dHJpYnV0ZShQSFhfTUFJTikgfVxuXG4gIGNvbm5lY3RQYXJhbXMoKXtcbiAgICBsZXQgcGFyYW1zID0gdGhpcy5saXZlU29ja2V0LnBhcmFtcyh0aGlzLmVsKVxuICAgIGxldCBtYW5pZmVzdCA9XG4gICAgICBET00uYWxsKGRvY3VtZW50LCBgWyR7dGhpcy5iaW5kaW5nKFBIWF9UUkFDS19TVEFUSUMpfV1gKVxuICAgICAgICAubWFwKG5vZGUgPT4gbm9kZS5zcmMgfHwgbm9kZS5ocmVmKS5maWx0ZXIodXJsID0+IHR5cGVvZiAodXJsKSA9PT0gXCJzdHJpbmdcIilcblxuICAgIGlmKG1hbmlmZXN0Lmxlbmd0aCA+IDApeyBwYXJhbXNbXCJfdHJhY2tfc3RhdGljXCJdID0gbWFuaWZlc3QgfVxuICAgIHBhcmFtc1tcIl9tb3VudHNcIl0gPSB0aGlzLmpvaW5Db3VudFxuXG4gICAgcmV0dXJuIHBhcmFtc1xuICB9XG5cbiAgaXNDb25uZWN0ZWQoKXsgcmV0dXJuIHRoaXMuY2hhbm5lbC5jYW5QdXNoKCkgfVxuXG4gIGdldFNlc3Npb24oKXsgcmV0dXJuIHRoaXMuZWwuZ2V0QXR0cmlidXRlKFBIWF9TRVNTSU9OKSB9XG5cbiAgZ2V0U3RhdGljKCl7XG4gICAgbGV0IHZhbCA9IHRoaXMuZWwuZ2V0QXR0cmlidXRlKFBIWF9TVEFUSUMpXG4gICAgcmV0dXJuIHZhbCA9PT0gXCJcIiA/IG51bGwgOiB2YWxcbiAgfVxuXG4gIGRlc3Ryb3koY2FsbGJhY2sgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgdGhpcy5kZXN0cm95QWxsQ2hpbGRyZW4oKVxuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZVxuICAgIGRlbGV0ZSB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5pZF1cbiAgICBpZih0aGlzLnBhcmVudCl7IGRlbGV0ZSB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5wYXJlbnQuaWRdW3RoaXMuaWRdIH1cbiAgICBjbGVhclRpbWVvdXQodGhpcy5sb2FkZXJUaW1lcilcbiAgICBsZXQgb25GaW5pc2hlZCA9ICgpID0+IHtcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIGZvcihsZXQgaWQgaW4gdGhpcy52aWV3SG9va3Mpe1xuICAgICAgICB0aGlzLmRlc3Ryb3lIb29rKHRoaXMudmlld0hvb2tzW2lkXSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBET00ubWFya1BoeENoaWxkRGVzdHJveWVkKHRoaXMuZWwpXG5cbiAgICB0aGlzLmxvZyhcImRlc3Ryb3llZFwiLCAoKSA9PiBbXCJ0aGUgY2hpbGQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwYXJlbnRcIl0pXG4gICAgdGhpcy5jaGFubmVsLmxlYXZlKClcbiAgICAgIC5yZWNlaXZlKFwib2tcIiwgb25GaW5pc2hlZClcbiAgICAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgb25GaW5pc2hlZClcbiAgICAgIC5yZWNlaXZlKFwidGltZW91dFwiLCBvbkZpbmlzaGVkKVxuICB9XG5cbiAgc2V0Q29udGFpbmVyQ2xhc3NlcyguLi5jbGFzc2VzKXtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICBQSFhfQ09OTkVDVEVEX0NMQVNTLFxuICAgICAgUEhYX0RJU0NPTk5FQ1RFRF9DTEFTUyxcbiAgICAgIFBIWF9FUlJPUl9DTEFTU1xuICAgIClcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoLi4uY2xhc3NlcylcbiAgfVxuXG4gIHNob3dMb2FkZXIodGltZW91dCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGVyVGltZXIpXG4gICAgaWYodGltZW91dCl7XG4gICAgICB0aGlzLmxvYWRlclRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNob3dMb2FkZXIoKSwgdGltZW91dClcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yKGxldCBpZCBpbiB0aGlzLnZpZXdIb29rcyl7IHRoaXMudmlld0hvb2tzW2lkXS5fX2Rpc2Nvbm5lY3RlZCgpIH1cbiAgICAgIHRoaXMuc2V0Q29udGFpbmVyQ2xhc3NlcyhQSFhfRElTQ09OTkVDVEVEX0NMQVNTKVxuICAgIH1cbiAgfVxuXG4gIGhpZGVMb2FkZXIoKXtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5sb2FkZXJUaW1lcilcbiAgICB0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoUEhYX0NPTk5FQ1RFRF9DTEFTUylcbiAgfVxuXG4gIHRyaWdnZXJSZWNvbm5lY3RlZCgpe1xuICAgIGZvcihsZXQgaWQgaW4gdGhpcy52aWV3SG9va3MpeyB0aGlzLnZpZXdIb29rc1tpZF0uX19yZWNvbm5lY3RlZCgpIH1cbiAgfVxuXG4gIGxvZyhraW5kLCBtc2dDYWxsYmFjayl7XG4gICAgdGhpcy5saXZlU29ja2V0LmxvZyh0aGlzLCBraW5kLCBtc2dDYWxsYmFjaylcbiAgfVxuXG4gIHRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25Eb25lID0gZnVuY3Rpb24oKXt9KXtcbiAgICB0aGlzLmxpdmVTb2NrZXQudHJhbnNpdGlvbih0aW1lLCBvblN0YXJ0LCBvbkRvbmUpXG4gIH1cblxuICB3aXRoaW5UYXJnZXRzKHBoeFRhcmdldCwgY2FsbGJhY2spe1xuICAgIGlmKHBoeFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHBoeFRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpe1xuICAgICAgcmV0dXJuIHRoaXMubGl2ZVNvY2tldC5vd25lcihwaHhUYXJnZXQsIHZpZXcgPT4gY2FsbGJhY2sodmlldywgcGh4VGFyZ2V0KSlcbiAgICB9XG5cbiAgICBpZihpc0NpZChwaHhUYXJnZXQpKXtcbiAgICAgIGxldCB0YXJnZXRzID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmVsLCBwaHhUYXJnZXQpXG4gICAgICBpZih0YXJnZXRzLmxlbmd0aCA9PT0gMCl7XG4gICAgICAgIGxvZ0Vycm9yKGBubyBjb21wb25lbnQgZm91bmQgbWF0Y2hpbmcgcGh4LXRhcmdldCBvZiAke3BoeFRhcmdldH1gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sodGhpcywgcGFyc2VJbnQocGh4VGFyZ2V0KSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRhcmdldHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocGh4VGFyZ2V0KSlcbiAgICAgIGlmKHRhcmdldHMubGVuZ3RoID09PSAwKXsgbG9nRXJyb3IoYG5vdGhpbmcgZm91bmQgbWF0Y2hpbmcgdGhlIHBoeC10YXJnZXQgc2VsZWN0b3IgXCIke3BoeFRhcmdldH1cImApIH1cbiAgICAgIHRhcmdldHMuZm9yRWFjaCh0YXJnZXQgPT4gdGhpcy5saXZlU29ja2V0Lm93bmVyKHRhcmdldCwgdmlldyA9PiBjYWxsYmFjayh2aWV3LCB0YXJnZXQpKSlcbiAgICB9XG4gIH1cblxuICBhcHBseURpZmYodHlwZSwgcmF3RGlmZiwgY2FsbGJhY2spe1xuICAgIHRoaXMubG9nKHR5cGUsICgpID0+IFtcIlwiLCBjbG9uZShyYXdEaWZmKV0pXG4gICAgbGV0IHtkaWZmLCByZXBseSwgZXZlbnRzLCB0aXRsZX0gPSBSZW5kZXJlZC5leHRyYWN0KHJhd0RpZmYpXG4gICAgaWYodGl0bGUpeyBET00ucHV0VGl0bGUodGl0bGUpIH1cblxuICAgIGNhbGxiYWNrKHtkaWZmLCByZXBseSwgZXZlbnRzfSlcbiAgICByZXR1cm4gcmVwbHlcbiAgfVxuXG4gIG9uSm9pbihyZXNwKXtcbiAgICBsZXQge3JlbmRlcmVkLCBjb250YWluZXJ9ID0gcmVzcFxuICAgIGlmKGNvbnRhaW5lcil7XG4gICAgICBsZXQgW3RhZywgYXR0cnNdID0gY29udGFpbmVyXG4gICAgICB0aGlzLmVsID0gRE9NLnJlcGxhY2VSb290Q29udGFpbmVyKHRoaXMuZWwsIHRhZywgYXR0cnMpXG4gICAgfVxuICAgIHRoaXMuY2hpbGRKb2lucyA9IDBcbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gdHJ1ZVxuICAgIHRoaXMuZmxhc2ggPSBudWxsXG5cbiAgICBCcm93c2VyLmRyb3BMb2NhbCh0aGlzLmxpdmVTb2NrZXQubG9jYWxTdG9yYWdlLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsIENPTlNFQ1VUSVZFX1JFTE9BRFMpXG4gICAgdGhpcy5hcHBseURpZmYoXCJtb3VudFwiLCByZW5kZXJlZCwgKHtkaWZmLCBldmVudHN9KSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVkID0gbmV3IFJlbmRlcmVkKHRoaXMuaWQsIGRpZmYpXG4gICAgICBsZXQgaHRtbCA9IHRoaXMucmVuZGVyQ29udGFpbmVyKG51bGwsIFwiam9pblwiKVxuICAgICAgdGhpcy5kcm9wUGVuZGluZ1JlZnMoKVxuICAgICAgbGV0IGZvcm1zID0gdGhpcy5mb3Jtc0ZvclJlY292ZXJ5KGh0bWwpXG4gICAgICB0aGlzLmpvaW5Db3VudCsrXG5cbiAgICAgIGlmKGZvcm1zLmxlbmd0aCA+IDApe1xuICAgICAgICBmb3Jtcy5mb3JFYWNoKChbZm9ybSwgbmV3Rm9ybSwgbmV3Q2lkXSwgaSkgPT4ge1xuICAgICAgICAgIHRoaXMucHVzaEZvcm1SZWNvdmVyeShmb3JtLCBuZXdDaWQsIHJlc3AgPT4ge1xuICAgICAgICAgICAgaWYoaSA9PT0gZm9ybXMubGVuZ3RoIC0gMSl7XG4gICAgICAgICAgICAgIHRoaXMub25Kb2luQ29tcGxldGUocmVzcCwgaHRtbCwgZXZlbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uSm9pbkNvbXBsZXRlKHJlc3AsIGh0bWwsIGV2ZW50cylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZHJvcFBlbmRpbmdSZWZzKCl7XG4gICAgRE9NLmFsbChkb2N1bWVudCwgYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5pZH1cIl1bJHtQSFhfUkVGfV1gLCBlbCA9PiB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRilcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVGX1NSQylcbiAgICB9KVxuICB9XG5cbiAgb25Kb2luQ29tcGxldGUoe2xpdmVfcGF0Y2h9LCBodG1sLCBldmVudHMpe1xuICAgIC8vIEluIG9yZGVyIHRvIHByb3ZpZGUgYSBiZXR0ZXIgZXhwZXJpZW5jZSwgd2Ugd2FudCB0byBqb2luXG4gICAgLy8gYWxsIExpdmVWaWV3cyBmaXJzdCBhbmQgb25seSB0aGVuIGFwcGx5IHRoZWlyIHBhdGNoZXMuXG4gICAgaWYodGhpcy5qb2luQ291bnQgPiAxIHx8ICh0aGlzLnBhcmVudCAmJiAhdGhpcy5wYXJlbnQuaXNKb2luUGVuZGluZygpKSl7XG4gICAgICByZXR1cm4gdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBldmVudHMpXG4gICAgfVxuXG4gICAgLy8gT25lIGRvd25zaWRlIG9mIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCB3ZSBuZWVkIHRvIGZpbmQgcGh4Q2hpbGRyZW5cbiAgICAvLyBpbiB0aGUgaHRtbCBmcmFnbWVudCwgaW5zdGVhZCBvZiBkaXJlY3RseSBvbiB0aGUgRE9NLiBUaGUgZnJhZ21lbnRcbiAgICAvLyBhbHNvIGRvZXMgbm90IGluY2x1ZGUgUEhYX1NUQVRJQywgc28gd2UgbmVlZCB0byBjb3B5IGl0IG92ZXIgZnJvbVxuICAgIC8vIHRoZSBET00uXG4gICAgbGV0IG5ld0NoaWxkcmVuID0gRE9NLmZpbmRQaHhDaGlsZHJlbkluRnJhZ21lbnQoaHRtbCwgdGhpcy5pZCkuZmlsdGVyKHRvRWwgPT4ge1xuICAgICAgbGV0IGZyb21FbCA9IHRvRWwuaWQgJiYgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGBbaWQ9XCIke3RvRWwuaWR9XCJdYClcbiAgICAgIGxldCBwaHhTdGF0aWMgPSBmcm9tRWwgJiYgZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfU1RBVElDKVxuICAgICAgaWYocGh4U3RhdGljKXsgdG9FbC5zZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQywgcGh4U3RhdGljKSB9XG4gICAgICByZXR1cm4gdGhpcy5qb2luQ2hpbGQodG9FbClcbiAgICB9KVxuXG4gICAgaWYobmV3Q2hpbGRyZW4ubGVuZ3RoID09PSAwKXtcbiAgICAgIGlmKHRoaXMucGFyZW50KXtcbiAgICAgICAgdGhpcy5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW3RoaXMsICgpID0+IHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgZXZlbnRzKV0pXG4gICAgICAgIHRoaXMucGFyZW50LmFja0pvaW4odGhpcylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25BbGxDaGlsZEpvaW5zQ29tcGxldGUoKVxuICAgICAgICB0aGlzLmFwcGx5Sm9pblBhdGNoKGxpdmVfcGF0Y2gsIGh0bWwsIGV2ZW50cylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW3RoaXMsICgpID0+IHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgZXZlbnRzKV0pXG4gICAgfVxuICB9XG5cbiAgYXR0YWNoVHJ1ZURvY0VsKCl7XG4gICAgdGhpcy5lbCA9IERPTS5ieUlkKHRoaXMuaWQpXG4gICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdC5pZClcbiAgfVxuXG4gIGFwcGx5Sm9pblBhdGNoKGxpdmVfcGF0Y2gsIGh0bWwsIGV2ZW50cyl7XG4gICAgdGhpcy5hdHRhY2hUcnVlRG9jRWwoKVxuICAgIGxldCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCB0aGlzLmVsLCB0aGlzLmlkLCBodG1sLCBudWxsKVxuICAgIHBhdGNoLm1hcmtQcnVuYWJsZUNvbnRlbnRGb3JSZW1vdmFsKClcbiAgICB0aGlzLnBlcmZvcm1QYXRjaChwYXRjaCwgZmFsc2UpXG4gICAgdGhpcy5qb2luTmV3Q2hpbGRyZW4oKVxuICAgIERPTS5hbGwodGhpcy5lbCwgYFske3RoaXMuYmluZGluZyhQSFhfSE9PSyl9XSwgW2RhdGEtcGh4LSR7UEhYX0hPT0t9XWAsIGhvb2tFbCA9PiB7XG4gICAgICBsZXQgaG9vayA9IHRoaXMuYWRkSG9vayhob29rRWwpXG4gICAgICBpZihob29rKXsgaG9vay5fX21vdW50ZWQoKSB9XG4gICAgfSlcblxuICAgIHRoaXMuam9pblBlbmRpbmcgPSBmYWxzZVxuICAgIHRoaXMubGl2ZVNvY2tldC5kaXNwYXRjaEV2ZW50cyhldmVudHMpXG4gICAgdGhpcy5hcHBseVBlbmRpbmdVcGRhdGVzKClcblxuICAgIGlmKGxpdmVfcGF0Y2gpe1xuICAgICAgbGV0IHtraW5kLCB0b30gPSBsaXZlX3BhdGNoXG4gICAgICB0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVBhdGNoKHRvLCBraW5kKVxuICAgIH1cbiAgICB0aGlzLmhpZGVMb2FkZXIoKVxuICAgIGlmKHRoaXMuam9pbkNvdW50ID4gMSl7IHRoaXMudHJpZ2dlclJlY29ubmVjdGVkKCkgfVxuICAgIHRoaXMuc3RvcENhbGxiYWNrKClcbiAgfVxuXG4gIHRyaWdnZXJCZWZvcmVVcGRhdGVIb29rKGZyb21FbCwgdG9FbCl7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyaWdnZXJET00oXCJvbkJlZm9yZUVsVXBkYXRlZFwiLCBbZnJvbUVsLCB0b0VsXSlcbiAgICBsZXQgaG9vayA9IHRoaXMuZ2V0SG9vayhmcm9tRWwpXG4gICAgbGV0IGlzSWdub3JlZCA9IGhvb2sgJiYgRE9NLmlzSWdub3JlZChmcm9tRWwsIHRoaXMuYmluZGluZyhQSFhfVVBEQVRFKSlcbiAgICBpZihob29rICYmICFmcm9tRWwuaXNFcXVhbE5vZGUodG9FbCkgJiYgIShpc0lnbm9yZWQgJiYgaXNFcXVhbE9iaihmcm9tRWwuZGF0YXNldCwgdG9FbC5kYXRhc2V0KSkpe1xuICAgICAgaG9vay5fX2JlZm9yZVVwZGF0ZSgpXG4gICAgICByZXR1cm4gaG9va1xuICAgIH1cbiAgfVxuXG4gIHBlcmZvcm1QYXRjaChwYXRjaCwgcHJ1bmVDaWRzKXtcbiAgICBsZXQgcmVtb3ZlZEVscyA9IFtdXG4gICAgbGV0IHBoeENoaWxkcmVuQWRkZWQgPSBmYWxzZVxuICAgIGxldCB1cGRhdGVkSG9va0lkcyA9IG5ldyBTZXQoKVxuXG4gICAgcGF0Y2guYWZ0ZXIoXCJhZGRlZFwiLCBlbCA9PiB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudHJpZ2dlckRPTShcIm9uTm9kZUFkZGVkXCIsIFtlbF0pXG5cbiAgICAgIGxldCBuZXdIb29rID0gdGhpcy5hZGRIb29rKGVsKVxuICAgICAgaWYobmV3SG9vayl7IG5ld0hvb2suX19tb3VudGVkKCkgfVxuICAgIH0pXG5cbiAgICBwYXRjaC5hZnRlcihcInBoeENoaWxkQWRkZWRcIiwgZWwgPT4ge1xuICAgICAgaWYoRE9NLmlzUGh4U3RpY2t5KGVsKSl7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5qb2luUm9vdFZpZXdzKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBoeENoaWxkcmVuQWRkZWQgPSB0cnVlXG4gICAgICB9XG4gICAgfSlcblxuICAgIHBhdGNoLmJlZm9yZShcInVwZGF0ZWRcIiwgKGZyb21FbCwgdG9FbCkgPT4ge1xuICAgICAgbGV0IGhvb2sgPSB0aGlzLnRyaWdnZXJCZWZvcmVVcGRhdGVIb29rKGZyb21FbCwgdG9FbClcbiAgICAgIGlmKGhvb2speyB1cGRhdGVkSG9va0lkcy5hZGQoZnJvbUVsLmlkKSB9XG4gICAgfSlcblxuICAgIHBhdGNoLmFmdGVyKFwidXBkYXRlZFwiLCBlbCA9PiB7XG4gICAgICBpZih1cGRhdGVkSG9va0lkcy5oYXMoZWwuaWQpKXsgdGhpcy5nZXRIb29rKGVsKS5fX3VwZGF0ZWQoKSB9XG4gICAgfSlcblxuICAgIHBhdGNoLmFmdGVyKFwiZGlzY2FyZGVkXCIsIChlbCkgPT4ge1xuICAgICAgaWYoZWwubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKXsgcmVtb3ZlZEVscy5wdXNoKGVsKSB9XG4gICAgfSlcblxuICAgIHBhdGNoLmFmdGVyKFwidHJhbnNpdGlvbnNEaXNjYXJkZWRcIiwgZWxzID0+IHRoaXMuYWZ0ZXJFbGVtZW50c1JlbW92ZWQoZWxzLCBwcnVuZUNpZHMpKVxuICAgIHBhdGNoLnBlcmZvcm0oKVxuICAgIHRoaXMuYWZ0ZXJFbGVtZW50c1JlbW92ZWQocmVtb3ZlZEVscywgcHJ1bmVDaWRzKVxuXG4gICAgcmV0dXJuIHBoeENoaWxkcmVuQWRkZWRcbiAgfVxuXG4gIGFmdGVyRWxlbWVudHNSZW1vdmVkKGVsZW1lbnRzLCBwcnVuZUNpZHMpe1xuICAgIGxldCBkZXN0cm95ZWRDSURzID0gW11cbiAgICBlbGVtZW50cy5mb3JFYWNoKHBhcmVudCA9PiB7XG4gICAgICBsZXQgY29tcG9uZW50cyA9IERPTS5hbGwocGFyZW50LCBgWyR7UEhYX0NPTVBPTkVOVH1dYClcbiAgICAgIGxldCBob29rcyA9IERPTS5hbGwocGFyZW50LCBgWyR7dGhpcy5iaW5kaW5nKFBIWF9IT09LKX1dYClcbiAgICAgIGNvbXBvbmVudHMuY29uY2F0KHBhcmVudCkuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgIGxldCBjaWQgPSB0aGlzLmNvbXBvbmVudElEKGVsKVxuICAgICAgICBpZihpc0NpZChjaWQpICYmIGRlc3Ryb3llZENJRHMuaW5kZXhPZihjaWQpID09PSAtMSl7IGRlc3Ryb3llZENJRHMucHVzaChjaWQpIH1cbiAgICAgIH0pXG4gICAgICBob29rcy5jb25jYXQocGFyZW50KS5mb3JFYWNoKGhvb2tFbCA9PiB7XG4gICAgICAgIGxldCBob29rID0gdGhpcy5nZXRIb29rKGhvb2tFbClcbiAgICAgICAgaG9vayAmJiB0aGlzLmRlc3Ryb3lIb29rKGhvb2spXG4gICAgICB9KVxuICAgIH0pXG4gICAgLy8gV2Ugc2hvdWxkIG5vdCBwcnVuZUNpZHMgb24gam9pbnMuIE90aGVyd2lzZSwgaW4gY2FzZSBvZlxuICAgIC8vIHJlam9pbnMsIHdlIG1heSBub3RpZnkgY2lkcyB0aGF0IG5vIGxvbmdlciBiZWxvbmcgdG8gdGhlXG4gICAgLy8gY3VycmVudCBMaXZlVmlldyB0byBiZSByZW1vdmVkLlxuICAgIGlmKHBydW5lQ2lkcyl7XG4gICAgICB0aGlzLm1heWJlUHVzaENvbXBvbmVudHNEZXN0cm95ZWQoZGVzdHJveWVkQ0lEcylcbiAgICB9XG4gIH1cblxuICBqb2luTmV3Q2hpbGRyZW4oKXtcbiAgICBET00uZmluZFBoeENoaWxkcmVuKHRoaXMuZWwsIHRoaXMuaWQpLmZvckVhY2goZWwgPT4gdGhpcy5qb2luQ2hpbGQoZWwpKVxuICB9XG5cbiAgZ2V0Q2hpbGRCeUlkKGlkKXsgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXVtpZF0gfVxuXG4gIGdldERlc2NlbmRlbnRCeUVsKGVsKXtcbiAgICBpZihlbC5pZCA9PT0gdGhpcy5pZCl7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbltlbC5nZXRBdHRyaWJ1dGUoUEhYX1BBUkVOVF9JRCldW2VsLmlkXVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lEZXNjZW5kZW50KGlkKXtcbiAgICBmb3IobGV0IHBhcmVudElkIGluIHRoaXMucm9vdC5jaGlsZHJlbil7XG4gICAgICBmb3IobGV0IGNoaWxkSWQgaW4gdGhpcy5yb290LmNoaWxkcmVuW3BhcmVudElkXSl7XG4gICAgICAgIGlmKGNoaWxkSWQgPT09IGlkKXsgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF1bY2hpbGRJZF0uZGVzdHJveSgpIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBqb2luQ2hpbGQoZWwpe1xuICAgIGxldCBjaGlsZCA9IHRoaXMuZ2V0Q2hpbGRCeUlkKGVsLmlkKVxuICAgIGlmKCFjaGlsZCl7XG4gICAgICBsZXQgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLmxpdmVTb2NrZXQsIHRoaXMpXG4gICAgICB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5pZF1bdmlldy5pZF0gPSB2aWV3XG4gICAgICB2aWV3LmpvaW4oKVxuICAgICAgdGhpcy5jaGlsZEpvaW5zKytcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgaXNKb2luUGVuZGluZygpeyByZXR1cm4gdGhpcy5qb2luUGVuZGluZyB9XG5cbiAgYWNrSm9pbihfY2hpbGQpe1xuICAgIHRoaXMuY2hpbGRKb2lucy0tXG5cbiAgICBpZih0aGlzLmNoaWxkSm9pbnMgPT09IDApe1xuICAgICAgaWYodGhpcy5wYXJlbnQpe1xuICAgICAgICB0aGlzLnBhcmVudC5hY2tKb2luKHRoaXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkFsbENoaWxkSm9pbnNDb21wbGV0ZSgpe1xuICAgIHRoaXMuam9pbkNhbGxiYWNrKCgpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ0pvaW5PcHMuZm9yRWFjaCgoW3ZpZXcsIG9wXSkgPT4ge1xuICAgICAgICBpZighdmlldy5pc0Rlc3Ryb3llZCgpKXsgb3AoKSB9XG4gICAgICB9KVxuICAgICAgdGhpcy5wZW5kaW5nSm9pbk9wcyA9IFtdXG4gICAgfSlcbiAgfVxuXG4gIHVwZGF0ZShkaWZmLCBldmVudHMpe1xuICAgIGlmKHRoaXMuaXNKb2luUGVuZGluZygpIHx8ICh0aGlzLmxpdmVTb2NrZXQuaGFzUGVuZGluZ0xpbmsoKSAmJiAhRE9NLmlzUGh4U3RpY2t5KHRoaXMuZWwpKSl7XG4gICAgICByZXR1cm4gdGhpcy5wZW5kaW5nRGlmZnMucHVzaCh7ZGlmZiwgZXZlbnRzfSlcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcmVkLm1lcmdlRGlmZihkaWZmKVxuICAgIGxldCBwaHhDaGlsZHJlbkFkZGVkID0gZmFsc2VcblxuICAgIC8vIFdoZW4gdGhlIGRpZmYgb25seSBjb250YWlucyBjb21wb25lbnQgZGlmZnMsIHRoZW4gd2FsayBjb21wb25lbnRzXG4gICAgLy8gYW5kIHBhdGNoIG9ubHkgdGhlIHBhcmVudCBjb21wb25lbnQgY29udGFpbmVycyBmb3VuZCBpbiB0aGUgZGlmZi5cbiAgICAvLyBPdGhlcndpc2UsIHBhdGNoIGVudGlyZSBMViBjb250YWluZXIuXG4gICAgaWYodGhpcy5yZW5kZXJlZC5pc0NvbXBvbmVudE9ubHlEaWZmKGRpZmYpKXtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC50aW1lKFwiY29tcG9uZW50IHBhdGNoIGNvbXBsZXRlXCIsICgpID0+IHtcbiAgICAgICAgbGV0IHBhcmVudENpZHMgPSBET00uZmluZFBhcmVudENJRHModGhpcy5lbCwgdGhpcy5yZW5kZXJlZC5jb21wb25lbnRDSURzKGRpZmYpKVxuICAgICAgICBwYXJlbnRDaWRzLmZvckVhY2gocGFyZW50Q0lEID0+IHtcbiAgICAgICAgICBpZih0aGlzLmNvbXBvbmVudFBhdGNoKHRoaXMucmVuZGVyZWQuZ2V0Q29tcG9uZW50KGRpZmYsIHBhcmVudENJRCksIHBhcmVudENJRCkpeyBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZSB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZighaXNFbXB0eShkaWZmKSl7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudGltZShcImZ1bGwgcGF0Y2ggY29tcGxldGVcIiwgKCkgPT4ge1xuICAgICAgICBsZXQgaHRtbCA9IHRoaXMucmVuZGVyQ29udGFpbmVyKGRpZmYsIFwidXBkYXRlXCIpXG4gICAgICAgIGxldCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCB0aGlzLmVsLCB0aGlzLmlkLCBodG1sLCBudWxsKVxuICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIHRydWUpXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMubGl2ZVNvY2tldC5kaXNwYXRjaEV2ZW50cyhldmVudHMpXG4gICAgaWYocGh4Q2hpbGRyZW5BZGRlZCl7IHRoaXMuam9pbk5ld0NoaWxkcmVuKCkgfVxuICB9XG5cbiAgcmVuZGVyQ29udGFpbmVyKGRpZmYsIGtpbmQpe1xuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQudGltZShgdG9TdHJpbmcgZGlmZiAoJHtraW5kfSlgLCAoKSA9PiB7XG4gICAgICBsZXQgdGFnID0gdGhpcy5lbC50YWdOYW1lXG4gICAgICAvLyBEb24ndCBza2lwIGFueSBjb21wb25lbnQgaW4gdGhlIGRpZmYgbm9yIGFueSBtYXJrZWQgYXMgcHJ1bmVkXG4gICAgICAvLyAoYXMgdGhleSBtYXkgaGF2ZSBiZWVuIGFkZGVkIGJhY2spXG4gICAgICBsZXQgY2lkcyA9IGRpZmYgPyB0aGlzLnJlbmRlcmVkLmNvbXBvbmVudENJRHMoZGlmZikuY29uY2F0KHRoaXMucHJ1bmluZ0NJRHMpIDogbnVsbFxuICAgICAgbGV0IGh0bWwgPSB0aGlzLnJlbmRlcmVkLnRvU3RyaW5nKGNpZHMpXG4gICAgICByZXR1cm4gYDwke3RhZ30+JHtodG1sfTwvJHt0YWd9PmBcbiAgICB9KVxuICB9XG5cbiAgY29tcG9uZW50UGF0Y2goZGlmZiwgY2lkKXtcbiAgICBpZihpc0VtcHR5KGRpZmYpKSByZXR1cm4gZmFsc2VcbiAgICBsZXQgaHRtbCA9IHRoaXMucmVuZGVyZWQuY29tcG9uZW50VG9TdHJpbmcoY2lkKVxuICAgIGxldCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCB0aGlzLmVsLCB0aGlzLmlkLCBodG1sLCBjaWQpXG4gICAgbGV0IGNoaWxkcmVuQWRkZWQgPSB0aGlzLnBlcmZvcm1QYXRjaChwYXRjaCwgdHJ1ZSlcbiAgICByZXR1cm4gY2hpbGRyZW5BZGRlZFxuICB9XG5cbiAgZ2V0SG9vayhlbCl7IHJldHVybiB0aGlzLnZpZXdIb29rc1tWaWV3SG9vay5lbGVtZW50SUQoZWwpXSB9XG5cbiAgYWRkSG9vayhlbCl7XG4gICAgaWYoVmlld0hvb2suZWxlbWVudElEKGVsKSB8fCAhZWwuZ2V0QXR0cmlidXRlKXsgcmV0dXJuIH1cbiAgICBsZXQgaG9va05hbWUgPSBlbC5nZXRBdHRyaWJ1dGUoYGRhdGEtcGh4LSR7UEhYX0hPT0t9YCkgfHwgZWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfSE9PSykpXG4gICAgaWYoaG9va05hbWUgJiYgIXRoaXMub3duc0VsZW1lbnQoZWwpKXsgcmV0dXJuIH1cbiAgICBsZXQgY2FsbGJhY2tzID0gdGhpcy5saXZlU29ja2V0LmdldEhvb2tDYWxsYmFja3MoaG9va05hbWUpXG5cbiAgICBpZihjYWxsYmFja3Mpe1xuICAgICAgaWYoIWVsLmlkKXsgbG9nRXJyb3IoYG5vIERPTSBJRCBmb3IgaG9vayBcIiR7aG9va05hbWV9XCIuIEhvb2tzIHJlcXVpcmUgYSB1bmlxdWUgSUQgb24gZWFjaCBlbGVtZW50LmAsIGVsKSB9XG4gICAgICBsZXQgaG9vayA9IG5ldyBWaWV3SG9vayh0aGlzLCBlbCwgY2FsbGJhY2tzKVxuICAgICAgdGhpcy52aWV3SG9va3NbVmlld0hvb2suZWxlbWVudElEKGhvb2suZWwpXSA9IGhvb2tcbiAgICAgIHJldHVybiBob29rXG4gICAgfSBlbHNlIGlmKGhvb2tOYW1lICE9PSBudWxsKXtcbiAgICAgIGxvZ0Vycm9yKGB1bmtub3duIGhvb2sgZm91bmQgZm9yIFwiJHtob29rTmFtZX1cImAsIGVsKVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lIb29rKGhvb2spe1xuICAgIGhvb2suX19kZXN0cm95ZWQoKVxuICAgIGhvb2suX19jbGVhbnVwX18oKVxuICAgIGRlbGV0ZSB0aGlzLnZpZXdIb29rc1tWaWV3SG9vay5lbGVtZW50SUQoaG9vay5lbCldXG4gIH1cblxuICBhcHBseVBlbmRpbmdVcGRhdGVzKCl7XG4gICAgdGhpcy5wZW5kaW5nRGlmZnMuZm9yRWFjaCgoe2RpZmYsIGV2ZW50c30pID0+IHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cykpXG4gICAgdGhpcy5wZW5kaW5nRGlmZnMgPSBbXVxuICB9XG5cbiAgb25DaGFubmVsKGV2ZW50LCBjYil7XG4gICAgdGhpcy5saXZlU29ja2V0Lm9uQ2hhbm5lbCh0aGlzLmNoYW5uZWwsIGV2ZW50LCByZXNwID0+IHtcbiAgICAgIGlmKHRoaXMuaXNKb2luUGVuZGluZygpKXtcbiAgICAgICAgdGhpcy5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW3RoaXMsICgpID0+IGNiKHJlc3ApXSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IGNiKHJlc3ApKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBiaW5kQ2hhbm5lbCgpe1xuICAgIC8vIFRoZSBkaWZmIGV2ZW50IHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSByZWd1bGFyIHVwZGF0ZSBvcGVyYXRpb25zLlxuICAgIC8vIEFsbCBvdGhlciBvcGVyYXRpb25zIGFyZSBxdWV1ZWQgdG8gYmUgYXBwbGllZCBvbmx5IGFmdGVyIGpvaW4uXG4gICAgdGhpcy5saXZlU29ja2V0Lm9uQ2hhbm5lbCh0aGlzLmNoYW5uZWwsIFwiZGlmZlwiLCAocmF3RGlmZikgPT4ge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICB0aGlzLmFwcGx5RGlmZihcInVwZGF0ZVwiLCByYXdEaWZmLCAoe2RpZmYsIGV2ZW50c30pID0+IHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cykpXG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy5vbkNoYW5uZWwoXCJyZWRpcmVjdFwiLCAoe3RvLCBmbGFzaH0pID0+IHRoaXMub25SZWRpcmVjdCh7dG8sIGZsYXNofSkpXG4gICAgdGhpcy5vbkNoYW5uZWwoXCJsaXZlX3BhdGNoXCIsIChyZWRpcikgPT4gdGhpcy5vbkxpdmVQYXRjaChyZWRpcikpXG4gICAgdGhpcy5vbkNoYW5uZWwoXCJsaXZlX3JlZGlyZWN0XCIsIChyZWRpcikgPT4gdGhpcy5vbkxpdmVSZWRpcmVjdChyZWRpcikpXG4gICAgdGhpcy5jaGFubmVsLm9uRXJyb3IocmVhc29uID0+IHRoaXMub25FcnJvcihyZWFzb24pKVxuICAgIHRoaXMuY2hhbm5lbC5vbkNsb3NlKHJlYXNvbiA9PiB0aGlzLm9uQ2xvc2UocmVhc29uKSlcbiAgfVxuXG4gIGRlc3Ryb3lBbGxDaGlsZHJlbigpe1xuICAgIGZvcihsZXQgaWQgaW4gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdKXtcbiAgICAgIHRoaXMuZ2V0Q2hpbGRCeUlkKGlkKS5kZXN0cm95KClcbiAgICB9XG4gIH1cblxuICBvbkxpdmVSZWRpcmVjdChyZWRpcil7XG4gICAgbGV0IHt0bywga2luZCwgZmxhc2h9ID0gcmVkaXJcbiAgICBsZXQgdXJsID0gdGhpcy5leHBhbmRVUkwodG8pXG4gICAgdGhpcy5saXZlU29ja2V0Lmhpc3RvcnlSZWRpcmVjdCh1cmwsIGtpbmQsIGZsYXNoKVxuICB9XG5cbiAgb25MaXZlUGF0Y2gocmVkaXIpe1xuICAgIGxldCB7dG8sIGtpbmR9ID0gcmVkaXJcbiAgICB0aGlzLmhyZWYgPSB0aGlzLmV4cGFuZFVSTCh0bylcbiAgICB0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVBhdGNoKHRvLCBraW5kKVxuICB9XG5cbiAgZXhwYW5kVVJMKHRvKXtcbiAgICByZXR1cm4gdG8uc3RhcnRzV2l0aChcIi9cIikgPyBgJHt3aW5kb3cubG9jYXRpb24ucHJvdG9jb2x9Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fSR7dG99YCA6IHRvXG4gIH1cblxuICBvblJlZGlyZWN0KHt0bywgZmxhc2h9KXsgdGhpcy5saXZlU29ja2V0LnJlZGlyZWN0KHRvLCBmbGFzaCkgfVxuXG4gIGlzRGVzdHJveWVkKCl7IHJldHVybiB0aGlzLmRlc3Ryb3llZCB9XG5cbiAgam9pbihjYWxsYmFjayl7XG4gICAgaWYodGhpcy5pc01haW4oKSl7XG4gICAgICB0aGlzLnN0b3BDYWxsYmFjayA9IHRoaXMubGl2ZVNvY2tldC53aXRoUGFnZUxvYWRpbmcoe3RvOiB0aGlzLmhyZWYsIGtpbmQ6IFwiaW5pdGlhbFwifSlcbiAgICB9XG4gICAgdGhpcy5qb2luQ2FsbGJhY2sgPSAob25Eb25lKSA9PiB7XG4gICAgICBvbkRvbmUgPSBvbkRvbmUgfHwgZnVuY3Rpb24oKXt9XG4gICAgICBjYWxsYmFjayA/IGNhbGxiYWNrKHRoaXMuam9pbkNvdW50LCBvbkRvbmUpIDogb25Eb25lKClcbiAgICB9XG4gICAgdGhpcy5saXZlU29ja2V0LndyYXBQdXNoKHRoaXMsIHt0aW1lb3V0OiBmYWxzZX0sICgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNoYW5uZWwuam9pbigpXG4gICAgICAgIC5yZWNlaXZlKFwib2tcIiwgZGF0YSA9PiB7XG4gICAgICAgICAgaWYoIXRoaXMuaXNEZXN0cm95ZWQoKSl7XG4gICAgICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB0aGlzLm9uSm9pbihkYXRhKSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgcmVzcCA9PiAhdGhpcy5pc0Rlc3Ryb3llZCgpICYmIHRoaXMub25Kb2luRXJyb3IocmVzcCkpXG4gICAgICAgIC5yZWNlaXZlKFwidGltZW91dFwiLCAoKSA9PiAhdGhpcy5pc0Rlc3Ryb3llZCgpICYmIHRoaXMub25Kb2luRXJyb3Ioe3JlYXNvbjogXCJ0aW1lb3V0XCJ9KSlcbiAgICB9KVxuICB9XG5cbiAgb25Kb2luRXJyb3IocmVzcCl7XG4gICAgaWYocmVzcC5yZWFzb24gPT09IFwidW5hdXRob3JpemVkXCIgfHwgcmVzcC5yZWFzb24gPT09IFwic3RhbGVcIil7XG4gICAgICB0aGlzLmxvZyhcImVycm9yXCIsICgpID0+IFtcInVuYXV0aG9yaXplZCBsaXZlX3JlZGlyZWN0LiBGYWxsaW5nIGJhY2sgdG8gcGFnZSByZXF1ZXN0XCIsIHJlc3BdKVxuICAgICAgcmV0dXJuIHRoaXMub25SZWRpcmVjdCh7dG86IHRoaXMuaHJlZn0pXG4gICAgfVxuICAgIGlmKHJlc3AucmVkaXJlY3QgfHwgcmVzcC5saXZlX3JlZGlyZWN0KXtcbiAgICAgIHRoaXMuam9pblBlbmRpbmcgPSBmYWxzZVxuICAgICAgdGhpcy5jaGFubmVsLmxlYXZlKClcbiAgICB9XG4gICAgaWYocmVzcC5yZWRpcmVjdCl7IHJldHVybiB0aGlzLm9uUmVkaXJlY3QocmVzcC5yZWRpcmVjdCkgfVxuICAgIGlmKHJlc3AubGl2ZV9yZWRpcmVjdCl7IHJldHVybiB0aGlzLm9uTGl2ZVJlZGlyZWN0KHJlc3AubGl2ZV9yZWRpcmVjdCkgfVxuICAgIHRoaXMubG9nKFwiZXJyb3JcIiwgKCkgPT4gW1widW5hYmxlIHRvIGpvaW5cIiwgcmVzcF0pXG4gICAgaWYodGhpcy5saXZlU29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLmxpdmVTb2NrZXQucmVsb2FkV2l0aEppdHRlcih0aGlzKSB9XG4gIH1cblxuICBvbkNsb3NlKHJlYXNvbil7XG4gICAgaWYodGhpcy5pc0Rlc3Ryb3llZCgpKXsgcmV0dXJuIH1cbiAgICBpZih0aGlzLmxpdmVTb2NrZXQuaGFzUGVuZGluZ0xpbmsoKSAmJiByZWFzb24gIT09IFwibGVhdmVcIil7XG4gICAgICByZXR1cm4gdGhpcy5saXZlU29ja2V0LnJlbG9hZFdpdGhKaXR0ZXIodGhpcylcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95QWxsQ2hpbGRyZW4oKVxuICAgIHRoaXMubGl2ZVNvY2tldC5kcm9wQWN0aXZlRWxlbWVudCh0aGlzKVxuICAgIC8vIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgY2FuIGJlIG51bGwgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTFcbiAgICBpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50KXsgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCkgfVxuICAgIGlmKHRoaXMubGl2ZVNvY2tldC5pc1VubG9hZGVkKCkpe1xuICAgICAgdGhpcy5zaG93TG9hZGVyKEJFRk9SRV9VTkxPQURfTE9BREVSX1RJTUVPVVQpXG4gICAgfVxuICB9XG5cbiAgb25FcnJvcihyZWFzb24pe1xuICAgIHRoaXMub25DbG9zZShyZWFzb24pXG4gICAgaWYodGhpcy5saXZlU29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLmxvZyhcImVycm9yXCIsICgpID0+IFtcInZpZXcgY3Jhc2hlZFwiLCByZWFzb25dKSB9XG4gICAgaWYoIXRoaXMubGl2ZVNvY2tldC5pc1VubG9hZGVkKCkpeyB0aGlzLmRpc3BsYXlFcnJvcigpIH1cbiAgfVxuXG4gIGRpc3BsYXlFcnJvcigpe1xuICAgIGlmKHRoaXMuaXNNYWluKCkpeyBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCB7ZGV0YWlsOiB7dG86IHRoaXMuaHJlZiwga2luZDogXCJlcnJvclwifX0pIH1cbiAgICB0aGlzLnNob3dMb2FkZXIoKVxuICAgIHRoaXMuc2V0Q29udGFpbmVyQ2xhc3NlcyhQSFhfRElTQ09OTkVDVEVEX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MpXG4gIH1cblxuICBwdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgZXZlbnQsIHBheWxvYWQsIG9uUmVwbHkgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgaWYoIXRoaXMuaXNDb25uZWN0ZWQoKSl7IHJldHVybiB9XG5cbiAgICBsZXQgW3JlZiwgW2VsXSwgb3B0c10gPSByZWZHZW5lcmF0b3IgPyByZWZHZW5lcmF0b3IoKSA6IFtudWxsLCBbXSwge31dXG4gICAgbGV0IG9uTG9hZGluZ0RvbmUgPSBmdW5jdGlvbigpeyB9XG4gICAgaWYob3B0cy5wYWdlX2xvYWRpbmcgfHwgKGVsICYmIChlbC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9QQUdFX0xPQURJTkcpKSAhPT0gbnVsbCkpKXtcbiAgICAgIG9uTG9hZGluZ0RvbmUgPSB0aGlzLmxpdmVTb2NrZXQud2l0aFBhZ2VMb2FkaW5nKHtraW5kOiBcImVsZW1lbnRcIiwgdGFyZ2V0OiBlbH0pXG4gICAgfVxuXG4gICAgaWYodHlwZW9mIChwYXlsb2FkLmNpZCkgIT09IFwibnVtYmVyXCIpeyBkZWxldGUgcGF5bG9hZC5jaWQgfVxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmxpdmVTb2NrZXQud3JhcFB1c2godGhpcywge3RpbWVvdXQ6IHRydWV9LCAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5uZWwucHVzaChldmVudCwgcGF5bG9hZCwgUFVTSF9USU1FT1VUKS5yZWNlaXZlKFwib2tcIiwgcmVzcCA9PiB7XG4gICAgICAgICAgaWYocmVmICE9PSBudWxsKXsgdGhpcy51bmRvUmVmcyhyZWYpIH1cbiAgICAgICAgICBsZXQgZmluaXNoID0gKGhvb2tSZXBseSkgPT4ge1xuICAgICAgICAgICAgaWYocmVzcC5yZWRpcmVjdCl7IHRoaXMub25SZWRpcmVjdChyZXNwLnJlZGlyZWN0KSB9XG4gICAgICAgICAgICBpZihyZXNwLmxpdmVfcGF0Y2gpeyB0aGlzLm9uTGl2ZVBhdGNoKHJlc3AubGl2ZV9wYXRjaCkgfVxuICAgICAgICAgICAgaWYocmVzcC5saXZlX3JlZGlyZWN0KXsgdGhpcy5vbkxpdmVSZWRpcmVjdChyZXNwLmxpdmVfcmVkaXJlY3QpIH1cbiAgICAgICAgICAgIG9uTG9hZGluZ0RvbmUoKVxuICAgICAgICAgICAgb25SZXBseShyZXNwLCBob29rUmVwbHkpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlc3AuZGlmZil7XG4gICAgICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBob29rUmVwbHkgPSB0aGlzLmFwcGx5RGlmZihcInVwZGF0ZVwiLCByZXNwLmRpZmYsICh7ZGlmZiwgZXZlbnRzfSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cylcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgZmluaXNoKGhvb2tSZXBseSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbmlzaChudWxsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgdW5kb1JlZnMocmVmKXtcbiAgICBET00uYWxsKGRvY3VtZW50LCBgWyR7UEhYX1JFRl9TUkN9PVwiJHt0aGlzLmlkfVwiXVske1BIWF9SRUZ9PVwiJHtyZWZ9XCJdYCwgZWwgPT4ge1xuICAgICAgbGV0IGRpc2FibGVkVmFsID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRClcbiAgICAgIC8vIHJlbW92ZSByZWZzXG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRilcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVGX1NSQylcbiAgICAgIC8vIHJlc3RvcmUgaW5wdXRzXG4gICAgICBpZihlbC5nZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZKSAhPT0gbnVsbCl7XG4gICAgICAgIGVsLnJlYWRPbmx5ID0gZmFsc2VcbiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUFET05MWSlcbiAgICAgIH1cbiAgICAgIGlmKGRpc2FibGVkVmFsICE9PSBudWxsKXtcbiAgICAgICAgZWwuZGlzYWJsZWQgPSBkaXNhYmxlZFZhbCA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9ESVNBQkxFRClcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSBjbGFzc2VzXG4gICAgICBQSFhfRVZFTlRfQ0xBU1NFUy5mb3JFYWNoKGNsYXNzTmFtZSA9PiBET00ucmVtb3ZlQ2xhc3MoZWwsIGNsYXNzTmFtZSkpXG4gICAgICAvLyByZXN0b3JlIGRpc2FibGVzXG4gICAgICBsZXQgZGlzYWJsZVJlc3RvcmUgPSBlbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFKVxuICAgICAgaWYoZGlzYWJsZVJlc3RvcmUgIT09IG51bGwpe1xuICAgICAgICBlbC5pbm5lclRleHQgPSBkaXNhYmxlUmVzdG9yZVxuICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFKVxuICAgICAgfVxuICAgICAgbGV0IHRvRWwgPSBET00ucHJpdmF0ZShlbCwgUEhYX1JFRilcbiAgICAgIGlmKHRvRWwpe1xuICAgICAgICBsZXQgaG9vayA9IHRoaXMudHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2soZWwsIHRvRWwpXG4gICAgICAgIERPTVBhdGNoLnBhdGNoRWwoZWwsIHRvRWwsIHRoaXMubGl2ZVNvY2tldC5nZXRBY3RpdmVFbGVtZW50KCkpXG4gICAgICAgIGlmKGhvb2speyBob29rLl9fdXBkYXRlZCgpIH1cbiAgICAgICAgRE9NLmRlbGV0ZVByaXZhdGUoZWwsIFBIWF9SRUYpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHB1dFJlZihlbGVtZW50cywgZXZlbnQsIG9wdHMgPSB7fSl7XG4gICAgbGV0IG5ld1JlZiA9IHRoaXMucmVmKytcbiAgICBsZXQgZGlzYWJsZVdpdGggPSB0aGlzLmJpbmRpbmcoUEhYX0RJU0FCTEVfV0lUSClcbiAgICBpZihvcHRzLmxvYWRpbmcpeyBlbGVtZW50cyA9IGVsZW1lbnRzLmNvbmNhdChET00uYWxsKGRvY3VtZW50LCBvcHRzLmxvYWRpbmcpKX1cblxuICAgIGVsZW1lbnRzLmZvckVhY2goZWwgPT4ge1xuICAgICAgZWwuY2xhc3NMaXN0LmFkZChgcGh4LSR7ZXZlbnR9LWxvYWRpbmdgKVxuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9SRUYsIG5ld1JlZilcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfUkVGX1NSQywgdGhpcy5lbC5pZClcbiAgICAgIGxldCBkaXNhYmxlVGV4dCA9IGVsLmdldEF0dHJpYnV0ZShkaXNhYmxlV2l0aClcbiAgICAgIGlmKGRpc2FibGVUZXh0ICE9PSBudWxsKXtcbiAgICAgICAgaWYoIWVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUpKXtcbiAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFLCBlbC5pbm5lclRleHQpXG4gICAgICAgIH1cbiAgICAgICAgaWYoZGlzYWJsZVRleHQgIT09IFwiXCIpeyBlbC5pbm5lclRleHQgPSBkaXNhYmxlVGV4dCB9XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShcImRpc2FibGVkXCIsIFwiXCIpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gW25ld1JlZiwgZWxlbWVudHMsIG9wdHNdXG4gIH1cblxuICBjb21wb25lbnRJRChlbCl7XG4gICAgbGV0IGNpZCA9IGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX0NPTVBPTkVOVClcbiAgICByZXR1cm4gY2lkID8gcGFyc2VJbnQoY2lkKSA6IG51bGxcbiAgfVxuXG4gIHRhcmdldENvbXBvbmVudElEKHRhcmdldCwgdGFyZ2V0Q3R4LCBvcHRzID0ge30pe1xuICAgIGlmKGlzQ2lkKHRhcmdldEN0eCkpeyByZXR1cm4gdGFyZ2V0Q3R4IH1cblxuICAgIGxldCBjaWRPclNlbGVjdG9yID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJ0YXJnZXRcIikpXG4gICAgaWYoaXNDaWQoY2lkT3JTZWxlY3Rvcikpe1xuICAgICAgcmV0dXJuIHBhcnNlSW50KGNpZE9yU2VsZWN0b3IpXG4gICAgfSBlbHNlIGlmKHRhcmdldEN0eCAmJiAoY2lkT3JTZWxlY3RvciAhPT0gbnVsbCB8fCBvcHRzLnRhcmdldCkpe1xuICAgICAgcmV0dXJuIHRoaXMuY2xvc2VzdENvbXBvbmVudElEKHRhcmdldEN0eClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBjbG9zZXN0Q29tcG9uZW50SUQodGFyZ2V0Q3R4KXtcbiAgICBpZihpc0NpZCh0YXJnZXRDdHgpKXtcbiAgICAgIHJldHVybiB0YXJnZXRDdHhcbiAgICB9IGVsc2UgaWYodGFyZ2V0Q3R4KXtcbiAgICAgIHJldHVybiBtYXliZSh0YXJnZXRDdHguY2xvc2VzdChgWyR7UEhYX0NPTVBPTkVOVH1dYCksIGVsID0+IHRoaXMub3duc0VsZW1lbnQoZWwpICYmIHRoaXMuY29tcG9uZW50SUQoZWwpKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHB1c2hIb29rRXZlbnQodGFyZ2V0Q3R4LCBldmVudCwgcGF5bG9hZCwgb25SZXBseSl7XG4gICAgaWYoIXRoaXMuaXNDb25uZWN0ZWQoKSl7XG4gICAgICB0aGlzLmxvZyhcImhvb2tcIiwgKCkgPT4gW1widW5hYmxlIHRvIHB1c2ggaG9vayBldmVudC4gTGl2ZVZpZXcgbm90IGNvbm5lY3RlZFwiLCBldmVudCwgcGF5bG9hZF0pXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgbGV0IFtyZWYsIGVscywgb3B0c10gPSB0aGlzLnB1dFJlZihbXSwgXCJob29rXCIpXG4gICAgdGhpcy5wdXNoV2l0aFJlcGx5KCgpID0+IFtyZWYsIGVscywgb3B0c10sIFwiZXZlbnRcIiwge1xuICAgICAgdHlwZTogXCJob29rXCIsXG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICB2YWx1ZTogcGF5bG9hZCxcbiAgICAgIGNpZDogdGhpcy5jbG9zZXN0Q29tcG9uZW50SUQodGFyZ2V0Q3R4KVxuICAgIH0sIChyZXNwLCByZXBseSkgPT4gb25SZXBseShyZXBseSwgcmVmKSlcblxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIGV4dHJhY3RNZXRhKGVsLCBtZXRhLCB2YWx1ZSl7XG4gICAgbGV0IHByZWZpeCA9IHRoaXMuYmluZGluZyhcInZhbHVlLVwiKVxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBlbC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKXtcbiAgICAgIGlmKCFtZXRhKXsgbWV0YSA9IHt9IH1cbiAgICAgIGxldCBuYW1lID0gZWwuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBpZihuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSl7IG1ldGFbbmFtZS5yZXBsYWNlKHByZWZpeCwgXCJcIildID0gZWwuZ2V0QXR0cmlidXRlKG5hbWUpIH1cbiAgICB9XG4gICAgaWYoZWwudmFsdWUgIT09IHVuZGVmaW5lZCl7XG4gICAgICBpZighbWV0YSl7IG1ldGEgPSB7fSB9XG4gICAgICBtZXRhLnZhbHVlID0gZWwudmFsdWVcblxuICAgICAgaWYoZWwudGFnTmFtZSA9PT0gXCJJTlBVVFwiICYmIENIRUNLQUJMRV9JTlBVVFMuaW5kZXhPZihlbC50eXBlKSA+PSAwICYmICFlbC5jaGVja2VkKXtcbiAgICAgICAgZGVsZXRlIG1ldGEudmFsdWVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYodmFsdWUpe1xuICAgICAgaWYoIW1ldGEpeyBtZXRhID0ge30gfVxuICAgICAgZm9yKGxldCBrZXkgaW4gdmFsdWUpeyBtZXRhW2tleV0gPSB2YWx1ZVtrZXldIH1cbiAgICB9XG4gICAgcmV0dXJuIG1ldGFcbiAgfVxuXG4gIHB1c2hFdmVudCh0eXBlLCBlbCwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgbWV0YSwgb3B0cyA9IHt9KXtcbiAgICB0aGlzLnB1c2hXaXRoUmVwbHkoKCkgPT4gdGhpcy5wdXRSZWYoW2VsXSwgdHlwZSwgb3B0cyksIFwiZXZlbnRcIiwge1xuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgIHZhbHVlOiB0aGlzLmV4dHJhY3RNZXRhKGVsLCBtZXRhLCBvcHRzLnZhbHVlKSxcbiAgICAgIGNpZDogdGhpcy50YXJnZXRDb21wb25lbnRJRChlbCwgdGFyZ2V0Q3R4LCBvcHRzKVxuICAgIH0pXG4gIH1cblxuICBwdXNoRmlsZVByb2dyZXNzKGZpbGVFbCwgZW50cnlSZWYsIHByb2dyZXNzLCBvblJlcGx5ID0gZnVuY3Rpb24gKCl7IH0pe1xuICAgIHRoaXMubGl2ZVNvY2tldC53aXRoaW5Pd25lcnMoZmlsZUVsLmZvcm0sICh2aWV3LCB0YXJnZXRDdHgpID0+IHtcbiAgICAgIHZpZXcucHVzaFdpdGhSZXBseShudWxsLCBcInByb2dyZXNzXCIsIHtcbiAgICAgICAgZXZlbnQ6IGZpbGVFbC5nZXRBdHRyaWJ1dGUodmlldy5iaW5kaW5nKFBIWF9QUk9HUkVTUykpLFxuICAgICAgICByZWY6IGZpbGVFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpLFxuICAgICAgICBlbnRyeV9yZWY6IGVudHJ5UmVmLFxuICAgICAgICBwcm9ncmVzczogcHJvZ3Jlc3MsXG4gICAgICAgIGNpZDogdmlldy50YXJnZXRDb21wb25lbnRJRChmaWxlRWwuZm9ybSwgdGFyZ2V0Q3R4KVxuICAgICAgfSwgb25SZXBseSlcbiAgICB9KVxuICB9XG5cbiAgcHVzaElucHV0KGlucHV0RWwsIHRhcmdldEN0eCwgZm9yY2VDaWQsIHBoeEV2ZW50LCBvcHRzLCBjYWxsYmFjayl7XG4gICAgbGV0IHVwbG9hZHNcbiAgICBsZXQgY2lkID0gaXNDaWQoZm9yY2VDaWQpID8gZm9yY2VDaWQgOiB0aGlzLnRhcmdldENvbXBvbmVudElEKGlucHV0RWwuZm9ybSwgdGFyZ2V0Q3R4KVxuICAgIGxldCByZWZHZW5lcmF0b3IgPSAoKSA9PiB0aGlzLnB1dFJlZihbaW5wdXRFbCwgaW5wdXRFbC5mb3JtXSwgXCJjaGFuZ2VcIiwgb3B0cylcbiAgICBsZXQgZm9ybURhdGFcbiAgICBpZihpbnB1dEVsLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIikpKXtcbiAgICAgIGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShpbnB1dEVsLmZvcm0sIHtfdGFyZ2V0OiBvcHRzLl90YXJnZXR9LCBbaW5wdXRFbC5uYW1lXSlcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGlucHV0RWwuZm9ybSwge190YXJnZXQ6IG9wdHMuX3RhcmdldH0pXG4gICAgfVxuICAgIGlmKERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmIGlucHV0RWwuZmlsZXMgJiYgaW5wdXRFbC5maWxlcy5sZW5ndGggPiAwKXtcbiAgICAgIExpdmVVcGxvYWRlci50cmFja0ZpbGVzKGlucHV0RWwsIEFycmF5LmZyb20oaW5wdXRFbC5maWxlcykpXG4gICAgfVxuICAgIHVwbG9hZHMgPSBMaXZlVXBsb2FkZXIuc2VyaWFsaXplVXBsb2FkcyhpbnB1dEVsKVxuICAgIGxldCBldmVudCA9IHtcbiAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgZXZlbnQ6IHBoeEV2ZW50LFxuICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgdXBsb2FkczogdXBsb2FkcyxcbiAgICAgIGNpZDogY2lkXG4gICAgfVxuICAgIHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW5lcmF0b3IsIFwiZXZlbnRcIiwgZXZlbnQsIHJlc3AgPT4ge1xuICAgICAgRE9NLnNob3dFcnJvcihpbnB1dEVsLCB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhQSFhfRkVFREJBQ0tfRk9SKSlcbiAgICAgIGlmKERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmIGlucHV0RWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtYXV0by11cGxvYWRcIikgIT09IG51bGwpe1xuICAgICAgICBpZihMaXZlVXBsb2FkZXIuZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dEVsKS5sZW5ndGggPiAwKXtcbiAgICAgICAgICBsZXQgW3JlZiwgX2Vsc10gPSByZWZHZW5lcmF0b3IoKVxuICAgICAgICAgIHRoaXMudXBsb2FkRmlsZXMoaW5wdXRFbC5mb3JtLCB0YXJnZXRDdHgsIHJlZiwgY2lkLCAoX3VwbG9hZHMpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHJlc3ApXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJBd2FpdGluZ1N1Ym1pdChpbnB1dEVsLmZvcm0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socmVzcClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgdHJpZ2dlckF3YWl0aW5nU3VibWl0KGZvcm1FbCl7XG4gICAgbGV0IGF3YWl0aW5nU3VibWl0ID0gdGhpcy5nZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKVxuICAgIGlmKGF3YWl0aW5nU3VibWl0KXtcbiAgICAgIGxldCBbX2VsLCBfcmVmLCBfb3B0cywgY2FsbGJhY2tdID0gYXdhaXRpbmdTdWJtaXRcbiAgICAgIHRoaXMuY2FuY2VsU3VibWl0KGZvcm1FbClcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9XG4gIH1cblxuICBnZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKXtcbiAgICByZXR1cm4gdGhpcy5mb3JtU3VibWl0cy5maW5kKChbZWwsIF9yZWYsIF9vcHRzLCBfY2FsbGJhY2tdKSA9PiBlbC5pc1NhbWVOb2RlKGZvcm1FbCkpXG4gIH1cblxuICBzY2hlZHVsZVN1Ym1pdChmb3JtRWwsIHJlZiwgb3B0cywgY2FsbGJhY2spe1xuICAgIGlmKHRoaXMuZ2V0U2NoZWR1bGVkU3VibWl0KGZvcm1FbCkpeyByZXR1cm4gdHJ1ZSB9XG4gICAgdGhpcy5mb3JtU3VibWl0cy5wdXNoKFtmb3JtRWwsIHJlZiwgb3B0cywgY2FsbGJhY2tdKVxuICB9XG5cbiAgY2FuY2VsU3VibWl0KGZvcm1FbCl7XG4gICAgdGhpcy5mb3JtU3VibWl0cyA9IHRoaXMuZm9ybVN1Ym1pdHMuZmlsdGVyKChbZWwsIHJlZiwgX2NhbGxiYWNrXSkgPT4ge1xuICAgICAgaWYoZWwuaXNTYW1lTm9kZShmb3JtRWwpKXtcbiAgICAgICAgdGhpcy51bmRvUmVmcyhyZWYpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHVzaEZvcm1TdWJtaXQoZm9ybUVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBvcHRzLCBvblJlcGx5KXtcbiAgICBsZXQgZmlsdGVySWdub3JlZCA9IGVsID0+IHtcbiAgICAgIGxldCB1c2VySWdub3JlZCA9IGNsb3Nlc3RQaHhCaW5kaW5nKGVsLCBgJHt0aGlzLmJpbmRpbmcoUEhYX1VQREFURSl9PWlnbm9yZWAsIGVsLmZvcm0pXG4gICAgICByZXR1cm4gISh1c2VySWdub3JlZCB8fCBjbG9zZXN0UGh4QmluZGluZyhlbCwgXCJkYXRhLXBoeC11cGRhdGU9aWdub3JlXCIsIGVsLmZvcm0pKVxuICAgIH1cbiAgICBsZXQgZmlsdGVyRGlzYWJsZXMgPSBlbCA9PiB7XG4gICAgICByZXR1cm4gZWwuaGFzQXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfRElTQUJMRV9XSVRIKSlcbiAgICB9XG4gICAgbGV0IGZpbHRlckJ1dHRvbiA9IGVsID0+IGVsLnRhZ05hbWUgPT0gXCJCVVRUT05cIlxuXG4gICAgbGV0IGZpbHRlcklucHV0ID0gZWwgPT4gW1wiSU5QVVRcIiwgXCJURVhUQVJFQVwiLCBcIlNFTEVDVFwiXS5pbmNsdWRlcyhlbC50YWdOYW1lKVxuXG4gICAgbGV0IHJlZkdlbmVyYXRvciA9ICgpID0+IHtcbiAgICAgIGxldCBmb3JtRWxlbWVudHMgPSBBcnJheS5mcm9tKGZvcm1FbC5lbGVtZW50cylcbiAgICAgIGxldCBkaXNhYmxlcyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVyRGlzYWJsZXMpXG4gICAgICBsZXQgYnV0dG9ucyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVyQnV0dG9uKS5maWx0ZXIoZmlsdGVySWdub3JlZClcbiAgICAgIGxldCBpbnB1dHMgPSBmb3JtRWxlbWVudHMuZmlsdGVyKGZpbHRlcklucHV0KS5maWx0ZXIoZmlsdGVySWdub3JlZClcblxuICAgICAgYnV0dG9ucy5mb3JFYWNoKGJ1dHRvbiA9PiB7XG4gICAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVELCBidXR0b24uZGlzYWJsZWQpXG4gICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWVcbiAgICAgIH0pXG4gICAgICBpbnB1dHMuZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShQSFhfUkVBRE9OTFksIGlucHV0LnJlYWRPbmx5KVxuICAgICAgICBpbnB1dC5yZWFkT25seSA9IHRydWVcbiAgICAgICAgaWYoaW5wdXQuZmlsZXMpe1xuICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShQSFhfRElTQUJMRUQsIGlucHV0LmRpc2FibGVkKVxuICAgICAgICAgIGlucHV0LmRpc2FibGVkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgZm9ybUVsLnNldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX1BBR0VfTE9BRElORyksIFwiXCIpXG4gICAgICByZXR1cm4gdGhpcy5wdXRSZWYoW2Zvcm1FbF0uY29uY2F0KGRpc2FibGVzKS5jb25jYXQoYnV0dG9ucykuY29uY2F0KGlucHV0cyksIFwic3VibWl0XCIsIG9wdHMpXG4gICAgfVxuXG4gICAgbGV0IGNpZCA9IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQoZm9ybUVsLCB0YXJnZXRDdHgpXG4gICAgaWYoTGl2ZVVwbG9hZGVyLmhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCkpe1xuICAgICAgbGV0IFtyZWYsIF9lbHNdID0gcmVmR2VuZXJhdG9yKClcbiAgICAgIGxldCBwdXNoID0gKCkgPT4gdGhpcy5wdXNoRm9ybVN1Ym1pdChmb3JtRWwsIHRhcmdldEN0eCwgcGh4RXZlbnQsIG9wdHMsIG9uUmVwbHkpXG4gICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVN1Ym1pdChmb3JtRWwsIHJlZiwgb3B0cywgcHVzaClcbiAgICB9IGVsc2UgaWYoTGl2ZVVwbG9hZGVyLmlucHV0c0F3YWl0aW5nUHJlZmxpZ2h0KGZvcm1FbCkubGVuZ3RoID4gMCl7XG4gICAgICBsZXQgW3JlZiwgZWxzXSA9IHJlZkdlbmVyYXRvcigpXG4gICAgICBsZXQgcHJveHlSZWZHZW4gPSAoKSA9PiBbcmVmLCBlbHMsIG9wdHNdXG4gICAgICB0aGlzLnVwbG9hZEZpbGVzKGZvcm1FbCwgdGFyZ2V0Q3R4LCByZWYsIGNpZCwgKF91cGxvYWRzKSA9PiB7XG4gICAgICAgIGxldCBmb3JtRGF0YSA9IHNlcmlhbGl6ZUZvcm0oZm9ybUVsLCB7fSlcbiAgICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KHByb3h5UmVmR2VuLCBcImV2ZW50XCIsIHtcbiAgICAgICAgICB0eXBlOiBcImZvcm1cIixcbiAgICAgICAgICBldmVudDogcGh4RXZlbnQsXG4gICAgICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgICAgIGNpZDogY2lkXG4gICAgICAgIH0sIG9uUmVwbHkpXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGZvcm1FbCwge30pXG4gICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocmVmR2VuZXJhdG9yLCBcImV2ZW50XCIsIHtcbiAgICAgICAgdHlwZTogXCJmb3JtXCIsXG4gICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgICBjaWQ6IGNpZFxuICAgICAgfSwgb25SZXBseSlcbiAgICB9XG4gIH1cblxuICB1cGxvYWRGaWxlcyhmb3JtRWwsIHRhcmdldEN0eCwgcmVmLCBjaWQsIG9uQ29tcGxldGUpe1xuICAgIGxldCBqb2luQ291bnRBdFVwbG9hZCA9IHRoaXMuam9pbkNvdW50XG4gICAgbGV0IGlucHV0RWxzID0gTGl2ZVVwbG9hZGVyLmFjdGl2ZUZpbGVJbnB1dHMoZm9ybUVsKVxuICAgIGxldCBudW1GaWxlSW5wdXRzSW5Qcm9ncmVzcyA9IGlucHV0RWxzLmxlbmd0aFxuXG4gICAgLy8gZ2V0IGVhY2ggZmlsZSBpbnB1dFxuICAgIGlucHV0RWxzLmZvckVhY2goaW5wdXRFbCA9PiB7XG4gICAgICBsZXQgdXBsb2FkZXIgPSBuZXcgTGl2ZVVwbG9hZGVyKGlucHV0RWwsIHRoaXMsICgpID0+IHtcbiAgICAgICAgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MtLVxuICAgICAgICBpZihudW1GaWxlSW5wdXRzSW5Qcm9ncmVzcyA9PT0gMCl7IG9uQ29tcGxldGUoKSB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy51cGxvYWRlcnNbaW5wdXRFbF0gPSB1cGxvYWRlclxuICAgICAgbGV0IGVudHJpZXMgPSB1cGxvYWRlci5lbnRyaWVzKCkubWFwKGVudHJ5ID0+IGVudHJ5LnRvUHJlZmxpZ2h0UGF5bG9hZCgpKVxuXG4gICAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgICAgcmVmOiBpbnB1dEVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICAgIGVudHJpZXM6IGVudHJpZXMsXG4gICAgICAgIGNpZDogdGhpcy50YXJnZXRDb21wb25lbnRJRChpbnB1dEVsLmZvcm0sIHRhcmdldEN0eClcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2coXCJ1cGxvYWRcIiwgKCkgPT4gW1wic2VuZGluZyBwcmVmbGlnaHQgcmVxdWVzdFwiLCBwYXlsb2FkXSlcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiYWxsb3dfdXBsb2FkXCIsIHBheWxvYWQsIHJlc3AgPT4ge1xuICAgICAgICB0aGlzLmxvZyhcInVwbG9hZFwiLCAoKSA9PiBbXCJnb3QgcHJlZmxpZ2h0IHJlc3BvbnNlXCIsIHJlc3BdKVxuICAgICAgICBpZihyZXNwLmVycm9yKXtcbiAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZilcbiAgICAgICAgICBsZXQgW2VudHJ5X3JlZiwgcmVhc29uXSA9IHJlc3AuZXJyb3JcbiAgICAgICAgICB0aGlzLmxvZyhcInVwbG9hZFwiLCAoKSA9PiBbYGVycm9yIGZvciBlbnRyeSAke2VudHJ5X3JlZn1gLCByZWFzb25dKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBvbkVycm9yID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNoYW5uZWwub25FcnJvcigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmKHRoaXMuam9pbkNvdW50ID09PSBqb2luQ291bnRBdFVwbG9hZCl7IGNhbGxiYWNrKCkgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgdXBsb2FkZXIuaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgdGhpcy5saXZlU29ja2V0KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBkaXNwYXRjaFVwbG9hZHMobmFtZSwgZmlsZXNPckJsb2JzKXtcbiAgICBsZXQgaW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHModGhpcy5lbCkuZmlsdGVyKGVsID0+IGVsLm5hbWUgPT09IG5hbWUpXG4gICAgaWYoaW5wdXRzLmxlbmd0aCA9PT0gMCl7IGxvZ0Vycm9yKGBubyBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCkgfVxuICAgIGVsc2UgaWYoaW5wdXRzLmxlbmd0aCA+IDEpeyBsb2dFcnJvcihgZHVwbGljYXRlIGxpdmUgZmlsZSBpbnB1dHMgZm91bmQgbWF0Y2hpbmcgdGhlIG5hbWUgXCIke25hbWV9XCJgKSB9XG4gICAgZWxzZSB7IERPTS5kaXNwYXRjaEV2ZW50KGlucHV0c1swXSwgUEhYX1RSQUNLX1VQTE9BRFMsIHtkZXRhaWw6IHtmaWxlczogZmlsZXNPckJsb2JzfX0pIH1cbiAgfVxuXG4gIHB1c2hGb3JtUmVjb3ZlcnkoZm9ybSwgbmV3Q2lkLCBjYWxsYmFjayl7XG4gICAgdGhpcy5saXZlU29ja2V0LndpdGhpbk93bmVycyhmb3JtLCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICBsZXQgaW5wdXQgPSBmb3JtLmVsZW1lbnRzWzBdXG4gICAgICBsZXQgcGh4RXZlbnQgPSBmb3JtLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0FVVE9fUkVDT1ZFUikpIHx8IGZvcm0uZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcImNoYW5nZVwiKSlcblxuICAgICAgSlMuZXhlYyhcImNoYW5nZVwiLCBwaHhFdmVudCwgdmlldywgaW5wdXQsIFtcInB1c2hcIiwge190YXJnZXQ6IGlucHV0Lm5hbWUsIG5ld0NpZDogbmV3Q2lkLCBjYWxsYmFjazogY2FsbGJhY2t9XSlcbiAgICB9KVxuICB9XG5cbiAgcHVzaExpbmtQYXRjaChocmVmLCB0YXJnZXRFbCwgY2FsbGJhY2spe1xuICAgIGxldCBsaW5rUmVmID0gdGhpcy5saXZlU29ja2V0LnNldFBlbmRpbmdMaW5rKGhyZWYpXG4gICAgbGV0IHJlZkdlbiA9IHRhcmdldEVsID8gKCkgPT4gdGhpcy5wdXRSZWYoW3RhcmdldEVsXSwgXCJjbGlja1wiKSA6IG51bGxcbiAgICBsZXQgZmFsbGJhY2sgPSAoKSA9PiB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3Qod2luZG93LmxvY2F0aW9uLmhyZWYpXG5cbiAgICBsZXQgcHVzaCA9IHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW4sIFwibGl2ZV9wYXRjaFwiLCB7dXJsOiBocmVmfSwgcmVzcCA9PiB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGlmKHJlc3AubGlua19yZWRpcmVjdCl7XG4gICAgICAgICAgdGhpcy5saXZlU29ja2V0LnJlcGxhY2VNYWluKGhyZWYsIG51bGwsIGNhbGxiYWNrLCBsaW5rUmVmKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmKHRoaXMubGl2ZVNvY2tldC5jb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSl7XG4gICAgICAgICAgICB0aGlzLmhyZWYgPSBocmVmXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYXBwbHlQZW5kaW5nVXBkYXRlcygpXG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sobGlua1JlZilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaWYocHVzaCl7XG4gICAgICBwdXNoLnJlY2VpdmUoXCJ0aW1lb3V0XCIsIGZhbGxiYWNrKVxuICAgIH0gZWxzZSB7XG4gICAgICBmYWxsYmFjaygpXG4gICAgfVxuICB9XG5cbiAgZm9ybXNGb3JSZWNvdmVyeShodG1sKXtcbiAgICBpZih0aGlzLmpvaW5Db3VudCA9PT0gMCl7IHJldHVybiBbXSB9XG5cbiAgICBsZXQgcGh4Q2hhbmdlID0gdGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpXG4gICAgbGV0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpXG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbFxuXG4gICAgcmV0dXJuIChcbiAgICAgIERPTS5hbGwodGhpcy5lbCwgYGZvcm1bJHtwaHhDaGFuZ2V9XWApXG4gICAgICAgIC5maWx0ZXIoZm9ybSA9PiBmb3JtLmlkICYmIHRoaXMub3duc0VsZW1lbnQoZm9ybSkpXG4gICAgICAgIC5maWx0ZXIoZm9ybSA9PiBmb3JtLmVsZW1lbnRzLmxlbmd0aCA+IDApXG4gICAgICAgIC5maWx0ZXIoZm9ybSA9PiBmb3JtLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0FVVE9fUkVDT1ZFUikpICE9PSBcImlnbm9yZVwiKVxuICAgICAgICAubWFwKGZvcm0gPT4ge1xuICAgICAgICAgIGxldCBuZXdGb3JtID0gdGVtcGxhdGUuY29udGVudC5xdWVyeVNlbGVjdG9yKGBmb3JtW2lkPVwiJHtmb3JtLmlkfVwiXVske3BoeENoYW5nZX09XCIke2Zvcm0uZ2V0QXR0cmlidXRlKHBoeENoYW5nZSl9XCJdYClcbiAgICAgICAgICBpZihuZXdGb3JtKXtcbiAgICAgICAgICAgIHJldHVybiBbZm9ybSwgbmV3Rm9ybSwgdGhpcy50YXJnZXRDb21wb25lbnRJRChuZXdGb3JtKV1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtmb3JtLCBudWxsLCBudWxsXVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigoW2Zvcm0sIG5ld0Zvcm0sIG5ld0NpZF0pID0+IG5ld0Zvcm0pXG4gICAgKVxuICB9XG5cbiAgbWF5YmVQdXNoQ29tcG9uZW50c0Rlc3Ryb3llZChkZXN0cm95ZWRDSURzKXtcbiAgICBsZXQgd2lsbERlc3Ryb3lDSURzID0gZGVzdHJveWVkQ0lEcy5maWx0ZXIoY2lkID0+IHtcbiAgICAgIHJldHVybiBET00uZmluZENvbXBvbmVudE5vZGVMaXN0KHRoaXMuZWwsIGNpZCkubGVuZ3RoID09PSAwXG4gICAgfSlcbiAgICBpZih3aWxsRGVzdHJveUNJRHMubGVuZ3RoID4gMCl7XG4gICAgICB0aGlzLnBydW5pbmdDSURzLnB1c2goLi4ud2lsbERlc3Ryb3lDSURzKVxuXG4gICAgICB0aGlzLnB1c2hXaXRoUmVwbHkobnVsbCwgXCJjaWRzX3dpbGxfZGVzdHJveVwiLCB7Y2lkczogd2lsbERlc3Ryb3lDSURzfSwgKCkgPT4ge1xuICAgICAgICAvLyBUaGUgY2lkcyBhcmUgZWl0aGVyIGJhY2sgb24gdGhlIHBhZ2Ugb3IgdGhleSB3aWxsIGJlIGZ1bGx5IHJlbW92ZWQsXG4gICAgICAgIC8vIHNvIHdlIGNhbiByZW1vdmUgdGhlbSBmcm9tIHRoZSBwcnVuaW5nQ0lEcy5cbiAgICAgICAgdGhpcy5wcnVuaW5nQ0lEcyA9IHRoaXMucHJ1bmluZ0NJRHMuZmlsdGVyKGNpZCA9PiB3aWxsRGVzdHJveUNJRHMuaW5kZXhPZihjaWQpICE9PSAtMSlcblxuICAgICAgICAvLyBTZWUgaWYgYW55IG9mIHRoZSBjaWRzIHdlIHdhbnRlZCB0byBkZXN0cm95IHdlcmUgYWRkZWQgYmFjayxcbiAgICAgICAgLy8gaWYgdGhleSB3ZXJlIGFkZGVkIGJhY2ssIHdlIGRvbid0IGFjdHVhbGx5IGRlc3Ryb3kgdGhlbS5cbiAgICAgICAgbGV0IGNvbXBsZXRlbHlEZXN0cm95Q0lEcyA9IHdpbGxEZXN0cm95Q0lEcy5maWx0ZXIoY2lkID0+IHtcbiAgICAgICAgICByZXR1cm4gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmVsLCBjaWQpLmxlbmd0aCA9PT0gMFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmKGNvbXBsZXRlbHlEZXN0cm95Q0lEcy5sZW5ndGggPiAwKXtcbiAgICAgICAgICB0aGlzLnB1c2hXaXRoUmVwbHkobnVsbCwgXCJjaWRzX2Rlc3Ryb3llZFwiLCB7Y2lkczogY29tcGxldGVseURlc3Ryb3lDSURzfSwgKHJlc3ApID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWQucHJ1bmVDSURzKHJlc3AuY2lkcylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIG93bnNFbGVtZW50KGVsKXtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlKFBIWF9QQVJFTlRfSUQpID09PSB0aGlzLmlkIHx8XG4gICAgICBtYXliZShlbC5jbG9zZXN0KFBIWF9WSUVXX1NFTEVDVE9SKSwgbm9kZSA9PiBub2RlLmlkKSA9PT0gdGhpcy5pZFxuICB9XG5cbiAgc3VibWl0Rm9ybShmb3JtLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBvcHRzID0ge30pe1xuICAgIERPTS5wdXRQcml2YXRlKGZvcm0sIFBIWF9IQVNfU1VCTUlUVEVELCB0cnVlKVxuICAgIGxldCBwaHhGZWVkYmFjayA9IHRoaXMubGl2ZVNvY2tldC5iaW5kaW5nKFBIWF9GRUVEQkFDS19GT1IpXG4gICAgbGV0IGlucHV0cyA9IEFycmF5LmZyb20oZm9ybS5lbGVtZW50cylcbiAgICB0aGlzLmxpdmVTb2NrZXQuYmx1ckFjdGl2ZUVsZW1lbnQodGhpcylcbiAgICB0aGlzLnB1c2hGb3JtU3VibWl0KGZvcm0sIHRhcmdldEN0eCwgcGh4RXZlbnQsIG9wdHMsICgpID0+IHtcbiAgICAgIGlucHV0cy5mb3JFYWNoKGlucHV0ID0+IERPTS5zaG93RXJyb3IoaW5wdXQsIHBoeEZlZWRiYWNrKSlcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXN0b3JlUHJldmlvdXNseUFjdGl2ZUZvY3VzKClcbiAgICB9KVxuICB9XG5cbiAgYmluZGluZyhraW5kKXsgcmV0dXJuIHRoaXMubGl2ZVNvY2tldC5iaW5kaW5nKGtpbmQpIH1cbn1cbiIsICIvKiogSW5pdGlhbGl6ZXMgdGhlIExpdmVTb2NrZXRcbiAqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuZFBvaW50IC0gVGhlIHN0cmluZyBXZWJTb2NrZXQgZW5kcG9pbnQsIGllLCBgXCJ3c3M6Ly9leGFtcGxlLmNvbS9saXZlXCJgLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIi9saXZlXCJgIChpbmhlcml0ZWQgaG9zdCAmIHByb3RvY29sKVxuICogQHBhcmFtIHtQaG9lbml4LlNvY2tldH0gc29ja2V0IC0gdGhlIHJlcXVpcmVkIFBob2VuaXggU29ja2V0IGNsYXNzIGltcG9ydGVkIGZyb20gXCJwaG9lbml4XCIuIEZvciBleGFtcGxlOlxuICpcbiAqICAgICBpbXBvcnQge1NvY2tldH0gZnJvbSBcInBob2VuaXhcIlxuICogICAgIGltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAqICAgICBsZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7Li4ufSlcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbi4gT3V0c2lkZSBvZiBrZXlzIGxpc3RlZCBiZWxvdywgYWxsXG4gKiBjb25maWd1cmF0aW9uIGlzIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgUGhvZW5peCBTb2NrZXQgY29uc3RydWN0b3IuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMuZGVmYXVsdHNdIC0gVGhlIG9wdGlvbmFsIGRlZmF1bHRzIHRvIHVzZSBmb3IgdmFyaW91cyBiaW5kaW5ncyxcbiAqIHN1Y2ggYXMgYHBoeC1kZWJvdW5jZWAuIFN1cHBvcnRzIHRoZSBmb2xsb3dpbmcga2V5czpcbiAqXG4gKiAgIC0gZGVib3VuY2UgLSB0aGUgbWlsbGlzZWNvbmQgcGh4LWRlYm91bmNlIHRpbWUuIERlZmF1bHRzIDMwMFxuICogICAtIHRocm90dGxlIC0gdGhlIG1pbGxpc2Vjb25kIHBoeC10aHJvdHRsZSB0aW1lLiBEZWZhdWx0cyAzMDBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5wYXJhbXNdIC0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIGZvciBwYXNzaW5nIGNvbm5lY3QgcGFyYW1zLlxuICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIHRoZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIExpdmVWaWV3LiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgKGVsKSA9PiB7dmlldzogZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1teS12aWV3LW5hbWVcIiwgdG9rZW46IHdpbmRvdy5teVRva2VufVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5iaW5kaW5nUHJlZml4XSAtIFRoZSBvcHRpb25hbCBwcmVmaXggdG8gdXNlIGZvciBhbGwgcGh4IERPTSBhbm5vdGF0aW9ucy5cbiAqIERlZmF1bHRzIHRvIFwicGh4LVwiLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLmhvb2tzXSAtIFRoZSBvcHRpb25hbCBvYmplY3QgZm9yIHJlZmVyZW5jaW5nIExpdmVWaWV3IGhvb2sgY2FsbGJhY2tzLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLnVwbG9hZGVyc10gLSBUaGUgb3B0aW9uYWwgb2JqZWN0IGZvciByZWZlcmVuY2luZyBMaXZlVmlldyB1cGxvYWRlciBjYWxsYmFja3MuXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtvcHRzLmxvYWRlclRpbWVvdXRdIC0gVGhlIG9wdGlvbmFsIGRlbGF5IGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBhcHBseVxuICogbG9hZGluZyBzdGF0ZXMuXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtvcHRzLm1heFJlbG9hZHNdIC0gVGhlIG1heGltdW0gcmVsb2FkcyBiZWZvcmUgZW50ZXJpbmcgZmFpbHNhZmUgbW9kZS5cbiAqIEBwYXJhbSB7aW50ZWdlcn0gW29wdHMucmVsb2FkSml0dGVyTWluXSAtIFRoZSBtaW5pbXVtIHRpbWUgYmV0d2VlbiBub3JtYWwgcmVsb2FkIGF0dGVtcHRzLlxuICogQHBhcmFtIHtpbnRlZ2VyfSBbb3B0cy5yZWxvYWRKaXR0ZXJNYXhdIC0gVGhlIG1heGltdW0gdGltZSBiZXR3ZWVuIG5vcm1hbCByZWxvYWQgYXR0ZW1wdHMuXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtvcHRzLmZhaWxzYWZlSml0dGVyXSAtIFRoZSB0aW1lIGJldHdlZW4gcmVsb2FkIGF0dGVtcHRzIGluIGZhaWxzYWZlIG1vZGUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy52aWV3TG9nZ2VyXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0byBsb2cgZGVidWcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlOlxuICpcbiAqICAgICAodmlldywga2luZCwgbXNnLCBvYmopID0+IGNvbnNvbGUubG9nKGAke3ZpZXcuaWR9ICR7a2luZH06ICR7bXNnfSAtIGAsIG9iailcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMubWV0YWRhdGFdIC0gVGhlIG9wdGlvbmFsIG9iamVjdCBtYXBwaW5nIGV2ZW50IG5hbWVzIHRvIGZ1bmN0aW9ucyBmb3JcbiAqIHBvcHVsYXRpbmcgZXZlbnQgbWV0YWRhdGEuIEZvciBleGFtcGxlOlxuICpcbiAqICAgICBtZXRhZGF0YToge1xuICogICAgICAgY2xpY2s6IChlLCBlbCkgPT4ge1xuICogICAgICAgICByZXR1cm4ge1xuICogICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAqICAgICAgICAgICBtZXRhS2V5OiBlLm1ldGFLZXksXG4gKiAgICAgICAgICAgZGV0YWlsOiBlLmRldGFpbCB8fCAxLFxuICogICAgICAgICB9XG4gKiAgICAgICB9LFxuICogICAgICAga2V5ZG93bjogKGUsIGVsKSA9PiB7XG4gKiAgICAgICAgIHJldHVybiB7XG4gKiAgICAgICAgICAga2V5OiBlLmtleSxcbiAqICAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gKiAgICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICogICAgICAgICAgIHNoaWZ0S2V5OiBlLnNoaWZ0S2V5XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH1cbiAqICAgICB9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMuc2Vzc2lvblN0b3JhZ2VdIC0gQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICogVXNlZnVsIHdoZW4gTGl2ZVZpZXcgd29uJ3QgaGF2ZSBhY2Nlc3MgdG8gYHNlc3Npb25TdG9yYWdlYC4gIEZvciBleGFtcGxlLCBUaGlzIGNvdWxkXG4gKiBoYXBwZW4gaWYgYSBzaXRlIGxvYWRzIGEgY3Jvc3MtZG9tYWluIExpdmVWaWV3IGluIGFuIGlmcmFtZS4gIEV4YW1wbGUgdXNhZ2U6XG4gKlxuICogICAgIGNsYXNzIEluTWVtb3J5U3RvcmFnZSB7XG4gKiAgICAgICBjb25zdHJ1Y3RvcigpIHsgdGhpcy5zdG9yYWdlID0ge30gfVxuICogICAgICAgZ2V0SXRlbShrZXlOYW1lKSB7IHJldHVybiB0aGlzLnN0b3JhZ2Vba2V5TmFtZV0gfVxuICogICAgICAgcmVtb3ZlSXRlbShrZXlOYW1lKSB7IGRlbGV0ZSB0aGlzLnN0b3JhZ2Vba2V5TmFtZV0gfVxuICogICAgICAgc2V0SXRlbShrZXlOYW1lLCBrZXlWYWx1ZSkgeyB0aGlzLnN0b3JhZ2Vba2V5TmFtZV0gPSBrZXlWYWx1ZSB9XG4gKiAgICAgfVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cy5sb2NhbFN0b3JhZ2VdIC0gQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICogVXNlZnVsIGZvciB3aGVuIExpdmVWaWV3IHdvbid0IGhhdmUgYWNjZXNzIHRvIGBsb2NhbFN0b3JhZ2VgLlxuICogU2VlIGBvcHRzLnNlc3Npb25TdG9yYWdlYCBmb3IgZXhhbXBsZXMuXG4qL1xuXG5pbXBvcnQge1xuICBCSU5ESU5HX1BSRUZJWCxcbiAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgREVGQVVMVFMsXG4gIEZBSUxTQUZFX0pJVFRFUixcbiAgTE9BREVSX1RJTUVPVVQsXG4gIE1BWF9SRUxPQURTLFxuICBQSFhfREVCT1VOQ0UsXG4gIFBIWF9EUk9QX1RBUkdFVCxcbiAgUEhYX0hBU19GT0NVU0VELFxuICBQSFhfS0VZLFxuICBQSFhfTElOS19TVEFURSxcbiAgUEhYX0xJVkVfTElOSyxcbiAgUEhYX0xWX0RFQlVHLFxuICBQSFhfTFZfTEFURU5DWV9TSU0sXG4gIFBIWF9MVl9QUk9GSUxFLFxuICBQSFhfTUFJTixcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1ZJRVdfU0VMRUNUT1IsXG4gIFBIWF9ST09UX0lELFxuICBQSFhfVEhST1RUTEUsXG4gIFBIWF9UUkFDS19VUExPQURTLFxuICBQSFhfU0VTU0lPTixcbiAgUkVMT0FEX0pJVFRFUl9NSU4sXG4gIFJFTE9BRF9KSVRURVJfTUFYLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQge1xuICBjbG9uZSxcbiAgY2xvc2VzdFBoeEJpbmRpbmcsXG4gIGNsb3N1cmUsXG4gIGRlYnVnLFxuICBpc09iamVjdCxcbiAgbWF5YmVcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgQnJvd3NlciBmcm9tIFwiLi9icm93c2VyXCJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCJcbmltcG9ydCBIb29rcyBmcm9tIFwiLi9ob29rc1wiXG5pbXBvcnQgTGl2ZVVwbG9hZGVyIGZyb20gXCIuL2xpdmVfdXBsb2FkZXJcIlxuaW1wb3J0IFZpZXcgZnJvbSBcIi4vdmlld1wiXG5pbXBvcnQgSlMgZnJvbSBcIi4vanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXZlU29ja2V0IHtcbiAgY29uc3RydWN0b3IodXJsLCBwaHhTb2NrZXQsIG9wdHMgPSB7fSl7XG4gICAgdGhpcy51bmxvYWRlZCA9IGZhbHNlXG4gICAgaWYoIXBoeFNvY2tldCB8fCBwaHhTb2NrZXQuY29uc3RydWN0b3IubmFtZSA9PT0gXCJPYmplY3RcIil7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuICAgICAgYSBwaG9lbml4IFNvY2tldCBtdXN0IGJlIHByb3ZpZGVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIExpdmVTb2NrZXQgY29uc3RydWN0b3IuIEZvciBleGFtcGxlOlxuXG4gICAgICAgICAgaW1wb3J0IHtTb2NrZXR9IGZyb20gXCJwaG9lbml4XCJcbiAgICAgICAgICBpbXBvcnQge0xpdmVTb2NrZXR9IGZyb20gXCJwaG9lbml4X2xpdmVfdmlld1wiXG4gICAgICAgICAgbGV0IGxpdmVTb2NrZXQgPSBuZXcgTGl2ZVNvY2tldChcIi9saXZlXCIsIFNvY2tldCwgey4uLn0pXG4gICAgICBgKVxuICAgIH1cbiAgICB0aGlzLnNvY2tldCA9IG5ldyBwaHhTb2NrZXQodXJsLCBvcHRzKVxuICAgIHRoaXMuYmluZGluZ1ByZWZpeCA9IG9wdHMuYmluZGluZ1ByZWZpeCB8fCBCSU5ESU5HX1BSRUZJWFxuICAgIHRoaXMub3B0cyA9IG9wdHNcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUob3B0cy5wYXJhbXMgfHwge30pXG4gICAgdGhpcy52aWV3TG9nZ2VyID0gb3B0cy52aWV3TG9nZ2VyXG4gICAgdGhpcy5tZXRhZGF0YUNhbGxiYWNrcyA9IG9wdHMubWV0YWRhdGEgfHwge31cbiAgICB0aGlzLmRlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihjbG9uZShERUZBVUxUUyksIG9wdHMuZGVmYXVsdHMgfHwge30pXG4gICAgdGhpcy5hY3RpdmVFbGVtZW50ID0gbnVsbFxuICAgIHRoaXMucHJldkFjdGl2ZSA9IG51bGxcbiAgICB0aGlzLnNpbGVuY2VkID0gZmFsc2VcbiAgICB0aGlzLm1haW4gPSBudWxsXG4gICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IG51bGxcbiAgICB0aGlzLmNsaWNrU3RhcnRlZEF0VGFyZ2V0ID0gbnVsbFxuICAgIHRoaXMubGlua1JlZiA9IDFcbiAgICB0aGlzLnJvb3RzID0ge31cbiAgICB0aGlzLmhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgIHRoaXMucGVuZGluZ0xpbmsgPSBudWxsXG4gICAgdGhpcy5jdXJyZW50TG9jYXRpb24gPSBjbG9uZSh3aW5kb3cubG9jYXRpb24pXG4gICAgdGhpcy5ob29rcyA9IG9wdHMuaG9va3MgfHwge31cbiAgICB0aGlzLnVwbG9hZGVycyA9IG9wdHMudXBsb2FkZXJzIHx8IHt9XG4gICAgdGhpcy5sb2FkZXJUaW1lb3V0ID0gb3B0cy5sb2FkZXJUaW1lb3V0IHx8IExPQURFUl9USU1FT1VUXG4gICAgdGhpcy5yZWxvYWRXaXRoSml0dGVyVGltZXIgPSBudWxsXG4gICAgdGhpcy5tYXhSZWxvYWRzID0gb3B0cy5tYXhSZWxvYWRzIHx8IE1BWF9SRUxPQURTXG4gICAgdGhpcy5yZWxvYWRKaXR0ZXJNaW4gPSBvcHRzLnJlbG9hZEppdHRlck1pbiB8fCBSRUxPQURfSklUVEVSX01JTlxuICAgIHRoaXMucmVsb2FkSml0dGVyTWF4ID0gb3B0cy5yZWxvYWRKaXR0ZXJNYXggfHwgUkVMT0FEX0pJVFRFUl9NQVhcbiAgICB0aGlzLmZhaWxzYWZlSml0dGVyID0gb3B0cy5mYWlsc2FmZUppdHRlciB8fCBGQUlMU0FGRV9KSVRURVJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZSA9IG9wdHMubG9jYWxTdG9yYWdlIHx8IHdpbmRvdy5sb2NhbFN0b3JhZ2VcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlID0gb3B0cy5zZXNzaW9uU3RvcmFnZSB8fCB3aW5kb3cuc2Vzc2lvblN0b3JhZ2VcbiAgICB0aGlzLmJvdW5kVG9wTGV2ZWxFdmVudHMgPSBmYWxzZVxuICAgIHRoaXMuZG9tQ2FsbGJhY2tzID0gT2JqZWN0LmFzc2lnbih7b25Ob2RlQWRkZWQ6IGNsb3N1cmUoKSwgb25CZWZvcmVFbFVwZGF0ZWQ6IGNsb3N1cmUoKX0sIG9wdHMuZG9tIHx8IHt9KVxuICAgIHRoaXMudHJhbnNpdGlvbnMgPSBuZXcgVHJhbnNpdGlvblNldCgpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBfZSA9PiB7XG4gICAgICB0aGlzLnVubG9hZGVkID0gdHJ1ZVxuICAgIH0pXG4gICAgdGhpcy5zb2NrZXQub25PcGVuKCgpID0+IHtcbiAgICAgIGlmKHRoaXMuaXNVbmxvYWRlZCgpKXtcbiAgICAgICAgLy8gcmVsb2FkIHBhZ2UgaWYgYmVpbmcgcmVzdG9yZWQgZnJvbSBiYWNrL2ZvcndhcmQgY2FjaGUgYW5kIGJyb3dzZXIgZG9lcyBub3QgZW1pdCBcInBhZ2VzaG93XCJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vIHB1YmxpY1xuXG4gIGlzUHJvZmlsZUVuYWJsZWQoKXsgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfUFJPRklMRSkgPT09IFwidHJ1ZVwiIH1cblxuICBpc0RlYnVnRW5hYmxlZCgpeyByZXR1cm4gdGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFBIWF9MVl9ERUJVRykgPT09IFwidHJ1ZVwiIH1cblxuICBpc0RlYnVnRGlzYWJsZWQoKXsgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfREVCVUcpID09PSBcImZhbHNlXCIgfVxuXG4gIGVuYWJsZURlYnVnKCl7IHRoaXMuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShQSFhfTFZfREVCVUcsIFwidHJ1ZVwiKSB9XG5cbiAgZW5hYmxlUHJvZmlsaW5nKCl7IHRoaXMuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShQSFhfTFZfUFJPRklMRSwgXCJ0cnVlXCIpIH1cblxuICBkaXNhYmxlRGVidWcoKXsgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9ERUJVRywgXCJmYWxzZVwiKSB9XG5cbiAgZGlzYWJsZVByb2ZpbGluZygpeyB0aGlzLnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oUEhYX0xWX1BST0ZJTEUpIH1cblxuICBlbmFibGVMYXRlbmN5U2ltKHVwcGVyQm91bmRNcyl7XG4gICAgdGhpcy5lbmFibGVEZWJ1ZygpXG4gICAgY29uc29sZS5sb2coXCJsYXRlbmN5IHNpbXVsYXRvciBlbmFibGVkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBicm93c2VyIHNlc3Npb24uIENhbGwgZGlzYWJsZUxhdGVuY3lTaW0oKSB0byBkaXNhYmxlXCIpXG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9MQVRFTkNZX1NJTSwgdXBwZXJCb3VuZE1zKVxuICB9XG5cbiAgZGlzYWJsZUxhdGVuY3lTaW0oKXsgdGhpcy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFBIWF9MVl9MQVRFTkNZX1NJTSkgfVxuXG4gIGdldExhdGVuY3lTaW0oKXtcbiAgICBsZXQgc3RyID0gdGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFBIWF9MVl9MQVRFTkNZX1NJTSlcbiAgICByZXR1cm4gc3RyID8gcGFyc2VJbnQoc3RyKSA6IG51bGxcbiAgfVxuXG4gIGdldFNvY2tldCgpeyByZXR1cm4gdGhpcy5zb2NrZXQgfVxuXG4gIGNvbm5lY3QoKXtcbiAgICAvLyBlbmFibGUgZGVidWcgYnkgZGVmYXVsdCBpZiBvbiBsb2NhbGhvc3QgYW5kIG5vdCBleHBsaWNpdGx5IGRpc2FibGVkXG4gICAgaWYod2luZG93LmxvY2F0aW9uLmhvc3RuYW1lID09PSBcImxvY2FsaG9zdFwiICYmICF0aGlzLmlzRGVidWdEaXNhYmxlZCgpKXsgdGhpcy5lbmFibGVEZWJ1ZygpIH1cbiAgICBsZXQgZG9Db25uZWN0ID0gKCkgPT4ge1xuICAgICAgaWYodGhpcy5qb2luUm9vdFZpZXdzKCkpe1xuICAgICAgICB0aGlzLmJpbmRUb3BMZXZlbEV2ZW50cygpXG4gICAgICAgIHRoaXMuc29ja2V0LmNvbm5lY3QoKVxuICAgICAgfSBlbHNlIGlmKHRoaXMubWFpbil7XG4gICAgICAgIHRoaXMuc29ja2V0LmNvbm5lY3QoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZihbXCJjb21wbGV0ZVwiLCBcImxvYWRlZFwiLCBcImludGVyYWN0aXZlXCJdLmluZGV4T2YoZG9jdW1lbnQucmVhZHlTdGF0ZSkgPj0gMCl7XG4gICAgICBkb0Nvbm5lY3QoKVxuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCAoKSA9PiBkb0Nvbm5lY3QoKSlcbiAgICB9XG4gIH1cblxuICBkaXNjb25uZWN0KGNhbGxiYWNrKXtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRXaXRoSml0dGVyVGltZXIpXG4gICAgdGhpcy5zb2NrZXQuZGlzY29ubmVjdChjYWxsYmFjaylcbiAgfVxuXG4gIHJlcGxhY2VUcmFuc3BvcnQodHJhbnNwb3J0KXtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRXaXRoSml0dGVyVGltZXIpXG4gICAgdGhpcy5zb2NrZXQucmVwbGFjZVRyYW5zcG9ydCh0cmFuc3BvcnQpXG4gICAgdGhpcy5jb25uZWN0KClcbiAgfVxuXG4gIGV4ZWNKUyhlbCwgZW5jb2RlZEpTLCBldmVudFR5cGUgPSBudWxsKXtcbiAgICB0aGlzLm93bmVyKGVsLCB2aWV3ID0+IEpTLmV4ZWMoZXZlbnRUeXBlLCBlbmNvZGVkSlMsIHZpZXcsIGVsKSlcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICB0cmlnZ2VyRE9NKGtpbmQsIGFyZ3MpeyB0aGlzLmRvbUNhbGxiYWNrc1traW5kXSguLi5hcmdzKSB9XG5cbiAgdGltZShuYW1lLCBmdW5jKXtcbiAgICBpZighdGhpcy5pc1Byb2ZpbGVFbmFibGVkKCkgfHwgIWNvbnNvbGUudGltZSl7IHJldHVybiBmdW5jKCkgfVxuICAgIGNvbnNvbGUudGltZShuYW1lKVxuICAgIGxldCByZXN1bHQgPSBmdW5jKClcbiAgICBjb25zb2xlLnRpbWVFbmQobmFtZSlcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBsb2codmlldywga2luZCwgbXNnQ2FsbGJhY2spe1xuICAgIGlmKHRoaXMudmlld0xvZ2dlcil7XG4gICAgICBsZXQgW21zZywgb2JqXSA9IG1zZ0NhbGxiYWNrKClcbiAgICAgIHRoaXMudmlld0xvZ2dlcih2aWV3LCBraW5kLCBtc2csIG9iailcbiAgICB9IGVsc2UgaWYodGhpcy5pc0RlYnVnRW5hYmxlZCgpKXtcbiAgICAgIGxldCBbbXNnLCBvYmpdID0gbXNnQ2FsbGJhY2soKVxuICAgICAgZGVidWcodmlldywga2luZCwgbXNnLCBvYmopXG4gICAgfVxuICB9XG5cbiAgcmVxdWVzdERPTVVwZGF0ZShjYWxsYmFjayl7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZnRlcihjYWxsYmFjaylcbiAgfVxuXG4gIHRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25Eb25lID0gZnVuY3Rpb24oKXt9KXtcbiAgICB0aGlzLnRyYW5zaXRpb25zLmFkZFRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25Eb25lKVxuICB9XG5cbiAgb25DaGFubmVsKGNoYW5uZWwsIGV2ZW50LCBjYil7XG4gICAgY2hhbm5lbC5vbihldmVudCwgZGF0YSA9PiB7XG4gICAgICBsZXQgbGF0ZW5jeSA9IHRoaXMuZ2V0TGF0ZW5jeVNpbSgpXG4gICAgICBpZighbGF0ZW5jeSl7XG4gICAgICAgIGNiKGRhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhgc2ltdWxhdGluZyAke2xhdGVuY3l9bXMgb2YgbGF0ZW5jeSBmcm9tIHNlcnZlciB0byBjbGllbnRgKVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGNiKGRhdGEpLCBsYXRlbmN5KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICB3cmFwUHVzaCh2aWV3LCBvcHRzLCBwdXNoKXtcbiAgICBsZXQgbGF0ZW5jeSA9IHRoaXMuZ2V0TGF0ZW5jeVNpbSgpXG4gICAgbGV0IG9sZEpvaW5Db3VudCA9IHZpZXcuam9pbkNvdW50XG4gICAgaWYoIWxhdGVuY3kpe1xuICAgICAgaWYodGhpcy5pc0Nvbm5lY3RlZCgpICYmIG9wdHMudGltZW91dCl7XG4gICAgICAgIHJldHVybiBwdXNoKCkucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4ge1xuICAgICAgICAgIGlmKHZpZXcuam9pbkNvdW50ID09PSBvbGRKb2luQ291bnQgJiYgIXZpZXcuaXNEZXN0cm95ZWQoKSl7XG4gICAgICAgICAgICB0aGlzLnJlbG9hZFdpdGhKaXR0ZXIodmlldywgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvZyh2aWV3LCBcInRpbWVvdXRcIiwgKCkgPT4gW1wicmVjZWl2ZWQgdGltZW91dCB3aGlsZSBjb21tdW5pY2F0aW5nIHdpdGggc2VydmVyLiBGYWxsaW5nIGJhY2sgdG8gaGFyZCByZWZyZXNoIGZvciByZWNvdmVyeVwiXSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHB1c2goKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBzaW11bGF0aW5nICR7bGF0ZW5jeX1tcyBvZiBsYXRlbmN5IGZyb20gY2xpZW50IHRvIHNlcnZlcmApXG4gICAgbGV0IGZha2VQdXNoID0ge1xuICAgICAgcmVjZWl2ZXM6IFtdLFxuICAgICAgcmVjZWl2ZShraW5kLCBjYil7IHRoaXMucmVjZWl2ZXMucHVzaChba2luZCwgY2JdKSB9XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYodmlldy5pc0Rlc3Ryb3llZCgpKXsgcmV0dXJuIH1cbiAgICAgIGZha2VQdXNoLnJlY2VpdmVzLnJlZHVjZSgoYWNjLCBba2luZCwgY2JdKSA9PiBhY2MucmVjZWl2ZShraW5kLCBjYiksIHB1c2goKSlcbiAgICB9LCBsYXRlbmN5KVxuICAgIHJldHVybiBmYWtlUHVzaFxuICB9XG5cbiAgcmVsb2FkV2l0aEppdHRlcih2aWV3LCBsb2cpe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFdpdGhKaXR0ZXJUaW1lcilcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKVxuICAgIGxldCBtaW5NcyA9IHRoaXMucmVsb2FkSml0dGVyTWluXG4gICAgbGV0IG1heE1zID0gdGhpcy5yZWxvYWRKaXR0ZXJNYXhcbiAgICBsZXQgYWZ0ZXJNcyA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXhNcyAtIG1pbk1zICsgMSkpICsgbWluTXNcbiAgICBsZXQgdHJpZXMgPSBCcm93c2VyLnVwZGF0ZUxvY2FsKHRoaXMubG9jYWxTdG9yYWdlLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsIENPTlNFQ1VUSVZFX1JFTE9BRFMsIDAsIGNvdW50ID0+IGNvdW50ICsgMSlcbiAgICBpZih0cmllcyA+IHRoaXMubWF4UmVsb2Fkcyl7XG4gICAgICBhZnRlck1zID0gdGhpcy5mYWlsc2FmZUppdHRlclxuICAgIH1cbiAgICB0aGlzLnJlbG9hZFdpdGhKaXR0ZXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gaWYgdmlldyBoYXMgcmVjb3ZlcmVkLCBzdWNoIGFzIHRyYW5zcG9ydCByZXBsYWNlZCwgdGhlbiBjYW5jZWxcbiAgICAgIGlmKHZpZXcuaXNEZXN0cm95ZWQoKSB8fCB2aWV3LmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gfVxuICAgICAgdmlldy5kZXN0cm95KClcbiAgICAgIGxvZyA/IGxvZygpIDogdGhpcy5sb2codmlldywgXCJqb2luXCIsICgpID0+IFtgZW5jb3VudGVyZWQgJHt0cmllc30gY29uc2VjdXRpdmUgcmVsb2Fkc2BdKVxuICAgICAgaWYodHJpZXMgPiB0aGlzLm1heFJlbG9hZHMpe1xuICAgICAgICB0aGlzLmxvZyh2aWV3LCBcImpvaW5cIiwgKCkgPT4gW2BleGNlZWRlZCAke3RoaXMubWF4UmVsb2Fkc30gY29uc2VjdXRpdmUgcmVsb2Fkcy4gRW50ZXJpbmcgZmFpbHNhZmUgbW9kZWBdKVxuICAgICAgfVxuICAgICAgaWYodGhpcy5oYXNQZW5kaW5nTGluaygpKXtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gdGhpcy5wZW5kaW5nTGlua1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICB9XG4gICAgfSwgYWZ0ZXJNcylcbiAgfVxuXG4gIGdldEhvb2tDYWxsYmFja3MobmFtZSl7XG4gICAgcmV0dXJuIG5hbWUgJiYgbmFtZS5zdGFydHNXaXRoKFwiUGhvZW5peC5cIikgPyBIb29rc1tuYW1lLnNwbGl0KFwiLlwiKVsxXV0gOiB0aGlzLmhvb2tzW25hbWVdXG4gIH1cblxuICBpc1VubG9hZGVkKCl7IHJldHVybiB0aGlzLnVubG9hZGVkIH1cblxuICBpc0Nvbm5lY3RlZCgpeyByZXR1cm4gdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSB9XG5cbiAgZ2V0QmluZGluZ1ByZWZpeCgpeyByZXR1cm4gdGhpcy5iaW5kaW5nUHJlZml4IH1cblxuICBiaW5kaW5nKGtpbmQpeyByZXR1cm4gYCR7dGhpcy5nZXRCaW5kaW5nUHJlZml4KCl9JHtraW5kfWAgfVxuXG4gIGNoYW5uZWwodG9waWMsIHBhcmFtcyl7IHJldHVybiB0aGlzLnNvY2tldC5jaGFubmVsKHRvcGljLCBwYXJhbXMpIH1cblxuICBqb2luUm9vdFZpZXdzKCl7XG4gICAgbGV0IHJvb3RzRm91bmQgPSBmYWxzZVxuICAgIERPTS5hbGwoZG9jdW1lbnQsIGAke1BIWF9WSUVXX1NFTEVDVE9SfTpub3QoWyR7UEhYX1BBUkVOVF9JRH1dKWAsIHJvb3RFbCA9PiB7XG4gICAgICBpZighdGhpcy5nZXRSb290QnlJZChyb290RWwuaWQpKXtcbiAgICAgICAgbGV0IHZpZXcgPSB0aGlzLm5ld1Jvb3RWaWV3KHJvb3RFbClcbiAgICAgICAgdmlldy5zZXRIcmVmKHRoaXMuZ2V0SHJlZigpKVxuICAgICAgICB2aWV3LmpvaW4oKVxuICAgICAgICBpZihyb290RWwuaGFzQXR0cmlidXRlKFBIWF9NQUlOKSl7IHRoaXMubWFpbiA9IHZpZXcgfVxuICAgICAgfVxuICAgICAgcm9vdHNGb3VuZCA9IHRydWVcbiAgICB9KVxuICAgIHJldHVybiByb290c0ZvdW5kXG4gIH1cblxuICByZWRpcmVjdCh0bywgZmxhc2gpe1xuICAgIHRoaXMuZGlzY29ubmVjdCgpXG4gICAgQnJvd3Nlci5yZWRpcmVjdCh0bywgZmxhc2gpXG4gIH1cblxuICByZXBsYWNlTWFpbihocmVmLCBmbGFzaCwgY2FsbGJhY2sgPSBudWxsLCBsaW5rUmVmID0gdGhpcy5zZXRQZW5kaW5nTGluayhocmVmKSl7XG4gICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IHRoaXMub3V0Z29pbmdNYWluRWwgfHwgdGhpcy5tYWluLmVsXG4gICAgbGV0IG5ld01haW5FbCA9IERPTS5jbG9uZU5vZGUodGhpcy5vdXRnb2luZ01haW5FbCwgXCJcIilcbiAgICB0aGlzLm1haW4uc2hvd0xvYWRlcih0aGlzLmxvYWRlclRpbWVvdXQpXG4gICAgdGhpcy5tYWluLmRlc3Ryb3koKVxuXG4gICAgdGhpcy5tYWluID0gdGhpcy5uZXdSb290VmlldyhuZXdNYWluRWwsIGZsYXNoKVxuICAgIHRoaXMubWFpbi5zZXRSZWRpcmVjdChocmVmKVxuICAgIHRoaXMudHJhbnNpdGlvblJlbW92ZXMoKVxuICAgIHRoaXMubWFpbi5qb2luKChqb2luQ291bnQsIG9uRG9uZSkgPT4ge1xuICAgICAgaWYoam9pbkNvdW50ID09PSAxICYmIHRoaXMuY29tbWl0UGVuZGluZ0xpbmsobGlua1JlZikpe1xuICAgICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICAgIERPTS5maW5kUGh4U3RpY2t5KGRvY3VtZW50KS5mb3JFYWNoKGVsID0+IG5ld01haW5FbC5hcHBlbmRDaGlsZChlbCkpXG4gICAgICAgICAgdGhpcy5vdXRnb2luZ01haW5FbC5yZXBsYWNlV2l0aChuZXdNYWluRWwpXG4gICAgICAgICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IG51bGxcbiAgICAgICAgICBjYWxsYmFjayAmJiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2spXG4gICAgICAgICAgb25Eb25lKClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgdHJhbnNpdGlvblJlbW92ZXMoZWxlbWVudHMpe1xuICAgIGxldCByZW1vdmVBdHRyID0gdGhpcy5iaW5kaW5nKFwicmVtb3ZlXCIpXG4gICAgZWxlbWVudHMgPSBlbGVtZW50cyB8fCBET00uYWxsKGRvY3VtZW50LCBgWyR7cmVtb3ZlQXR0cn1dYClcbiAgICBlbGVtZW50cy5mb3JFYWNoKGVsID0+IHtcbiAgICAgIGlmKGRvY3VtZW50LmJvZHkuY29udGFpbnMoZWwpKXsgLy8gc2tpcCBjaGlsZHJlbiBhbHJlYWR5IHJlbW92ZWRcbiAgICAgICAgdGhpcy5leGVjSlMoZWwsIGVsLmdldEF0dHJpYnV0ZShyZW1vdmVBdHRyKSwgXCJyZW1vdmVcIilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgaXNQaHhWaWV3KGVsKXsgcmV0dXJuIGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04pICE9PSBudWxsIH1cblxuICBuZXdSb290VmlldyhlbCwgZmxhc2gpe1xuICAgIGxldCB2aWV3ID0gbmV3IFZpZXcoZWwsIHRoaXMsIG51bGwsIGZsYXNoKVxuICAgIHRoaXMucm9vdHNbdmlldy5pZF0gPSB2aWV3XG4gICAgcmV0dXJuIHZpZXdcbiAgfVxuXG4gIG93bmVyKGNoaWxkRWwsIGNhbGxiYWNrKXtcbiAgICBsZXQgdmlldyA9IG1heWJlKGNoaWxkRWwuY2xvc2VzdChQSFhfVklFV19TRUxFQ1RPUiksIGVsID0+IHRoaXMuZ2V0Vmlld0J5RWwoZWwpKSB8fCB0aGlzLm1haW5cbiAgICBpZih2aWV3KXsgY2FsbGJhY2sodmlldykgfVxuICB9XG5cbiAgd2l0aGluT3duZXJzKGNoaWxkRWwsIGNhbGxiYWNrKXtcbiAgICB0aGlzLm93bmVyKGNoaWxkRWwsIHZpZXcgPT4gY2FsbGJhY2sodmlldywgY2hpbGRFbCkpXG4gIH1cblxuICBnZXRWaWV3QnlFbChlbCl7XG4gICAgbGV0IHJvb3RJZCA9IGVsLmdldEF0dHJpYnV0ZShQSFhfUk9PVF9JRClcbiAgICByZXR1cm4gbWF5YmUodGhpcy5nZXRSb290QnlJZChyb290SWQpLCByb290ID0+IHJvb3QuZ2V0RGVzY2VuZGVudEJ5RWwoZWwpKVxuICB9XG5cbiAgZ2V0Um9vdEJ5SWQoaWQpeyByZXR1cm4gdGhpcy5yb290c1tpZF0gfVxuXG4gIGRlc3Ryb3lBbGxWaWV3cygpe1xuICAgIGZvcihsZXQgaWQgaW4gdGhpcy5yb290cyl7XG4gICAgICB0aGlzLnJvb3RzW2lkXS5kZXN0cm95KClcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW2lkXVxuICAgIH1cbiAgICB0aGlzLm1haW4gPSBudWxsXG4gIH1cblxuICBkZXN0cm95Vmlld0J5RWwoZWwpe1xuICAgIGxldCByb290ID0gdGhpcy5nZXRSb290QnlJZChlbC5nZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQpKVxuICAgIGlmKHJvb3QgJiYgcm9vdC5pZCA9PT0gZWwuaWQpe1xuICAgICAgcm9vdC5kZXN0cm95KClcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW3Jvb3QuaWRdXG4gICAgfSBlbHNlIGlmKHJvb3Qpe1xuICAgICAgcm9vdC5kZXN0cm95RGVzY2VuZGVudChlbC5pZClcbiAgICB9XG4gIH1cblxuICBzZXRBY3RpdmVFbGVtZW50KHRhcmdldCl7XG4gICAgaWYodGhpcy5hY3RpdmVFbGVtZW50ID09PSB0YXJnZXQpeyByZXR1cm4gfVxuICAgIHRoaXMuYWN0aXZlRWxlbWVudCA9IHRhcmdldFxuICAgIGxldCBjYW5jZWwgPSAoKSA9PiB7XG4gICAgICBpZih0YXJnZXQgPT09IHRoaXMuYWN0aXZlRWxlbWVudCl7IHRoaXMuYWN0aXZlRWxlbWVudCA9IG51bGwgfVxuICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMpXG4gICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIHRoaXMpXG4gICAgfVxuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBjYW5jZWwpXG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCBjYW5jZWwpXG4gIH1cblxuICBnZXRBY3RpdmVFbGVtZW50KCl7XG4gICAgaWYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keSl7XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmVFbGVtZW50IHx8IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBjYW4gYmUgbnVsbCBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMVxuICAgICAgcmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keVxuICAgIH1cbiAgfVxuXG4gIGRyb3BBY3RpdmVFbGVtZW50KHZpZXcpe1xuICAgIGlmKHRoaXMucHJldkFjdGl2ZSAmJiB2aWV3Lm93bnNFbGVtZW50KHRoaXMucHJldkFjdGl2ZSkpe1xuICAgICAgdGhpcy5wcmV2QWN0aXZlID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHJlc3RvcmVQcmV2aW91c2x5QWN0aXZlRm9jdXMoKXtcbiAgICBpZih0aGlzLnByZXZBY3RpdmUgJiYgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5KXtcbiAgICAgIHRoaXMucHJldkFjdGl2ZS5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgYmx1ckFjdGl2ZUVsZW1lbnQoKXtcbiAgICB0aGlzLnByZXZBY3RpdmUgPSB0aGlzLmdldEFjdGl2ZUVsZW1lbnQoKVxuICAgIGlmKHRoaXMucHJldkFjdGl2ZSAhPT0gZG9jdW1lbnQuYm9keSl7IHRoaXMucHJldkFjdGl2ZS5ibHVyKCkgfVxuICB9XG5cbiAgYmluZFRvcExldmVsRXZlbnRzKCl7XG4gICAgaWYodGhpcy5ib3VuZFRvcExldmVsRXZlbnRzKXsgcmV0dXJuIH1cblxuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IHRydWVcbiAgICAvLyBlbnRlciBmYWlsc2FmZSByZWxvYWQgaWYgc2VydmVyIGhhcyBnb25lIGF3YXkgaW50ZW50aW9uYWxseSwgc3VjaCBhcyBcImRpc2Nvbm5lY3RcIiBicm9hZGNhc3RcbiAgICB0aGlzLnNvY2tldC5vbkNsb3NlKGV2ZW50ID0+IHtcbiAgICAgIGlmKGV2ZW50ICYmIGV2ZW50LmNvZGUgPT09IDEwMDAgJiYgdGhpcy5tYWluKXtcbiAgICAgICAgdGhpcy5yZWxvYWRXaXRoSml0dGVyKHRoaXMubWFpbilcbiAgICAgIH1cbiAgICB9KVxuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpeyB9KSAvLyBlbnN1cmUgYWxsIGNsaWNrIGV2ZW50cyBidWJibGUgZm9yIG1vYmlsZSBTYWZhcmlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VzaG93XCIsIGUgPT4ge1xuICAgICAgaWYoZS5wZXJzaXN0ZWQpeyAvLyByZWxvYWQgcGFnZSBpZiBiZWluZyByZXN0b3JlZCBmcm9tIGJhY2svZm9yd2FyZCBjYWNoZVxuICAgICAgICB0aGlzLmdldFNvY2tldCgpLmRpc2Nvbm5lY3QoKVxuICAgICAgICB0aGlzLndpdGhQYWdlTG9hZGluZyh7dG86IHdpbmRvdy5sb2NhdGlvbi5ocmVmLCBraW5kOiBcInJlZGlyZWN0XCJ9KVxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbiAgICAgIH1cbiAgICB9LCB0cnVlKVxuICAgIHRoaXMuYmluZE5hdigpXG4gICAgdGhpcy5iaW5kQ2xpY2tzKClcbiAgICB0aGlzLmJpbmRGb3JtcygpXG4gICAgdGhpcy5iaW5kKHtrZXl1cDogXCJrZXl1cFwiLCBrZXlkb3duOiBcImtleWRvd25cIn0sIChlLCB0eXBlLCB2aWV3LCB0YXJnZXRFbCwgcGh4RXZlbnQsIGV2ZW50VGFyZ2V0KSA9PiB7XG4gICAgICBsZXQgbWF0Y2hLZXkgPSB0YXJnZXRFbC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9LRVkpKVxuICAgICAgbGV0IHByZXNzZWRLZXkgPSBlLmtleSAmJiBlLmtleS50b0xvd2VyQ2FzZSgpIC8vIGNocm9tZSBjbGlja2VkIGF1dG9jb21wbGV0ZXMgc2VuZCBhIGtleWRvd24gd2l0aG91dCBrZXlcbiAgICAgIGlmKG1hdGNoS2V5ICYmIG1hdGNoS2V5LnRvTG93ZXJDYXNlKCkgIT09IHByZXNzZWRLZXkpeyByZXR1cm4gfVxuXG4gICAgICBsZXQgZGF0YSA9IHtrZXk6IGUua2V5LCAuLi50aGlzLmV2ZW50TWV0YSh0eXBlLCBlLCB0YXJnZXRFbCl9XG4gICAgICBKUy5leGVjKHR5cGUsIHBoeEV2ZW50LCB2aWV3LCB0YXJnZXRFbCwgW1wicHVzaFwiLCB7ZGF0YX1dKVxuICAgIH0pXG4gICAgdGhpcy5iaW5kKHtibHVyOiBcImZvY3Vzb3V0XCIsIGZvY3VzOiBcImZvY3VzaW5cIn0sIChlLCB0eXBlLCB2aWV3LCB0YXJnZXRFbCwgcGh4RXZlbnQsIGV2ZW50VGFyZ2V0KSA9PiB7XG4gICAgICBpZighZXZlbnRUYXJnZXQpe1xuICAgICAgICBsZXQgZGF0YSA9IHtrZXk6IGUua2V5LCAuLi50aGlzLmV2ZW50TWV0YSh0eXBlLCBlLCB0YXJnZXRFbCl9XG4gICAgICAgIEpTLmV4ZWModHlwZSwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldEVsLCBbXCJwdXNoXCIsIHtkYXRhfV0pXG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLmJpbmQoe2JsdXI6IFwiYmx1clwiLCBmb2N1czogXCJmb2N1c1wifSwgKGUsIHR5cGUsIHZpZXcsIHRhcmdldEVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBwaHhUYXJnZXQpID0+IHtcbiAgICAgIC8vIGJsdXIgYW5kIGZvY3VzIGFyZSB0cmlnZ2VyZWQgb24gZG9jdW1lbnQgYW5kIHdpbmRvdy4gRGlzY2FyZCBvbmUgdG8gYXZvaWQgZHVwc1xuICAgICAgaWYocGh4VGFyZ2V0ID09PSBcIndpbmRvd1wiKXtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmV2ZW50TWV0YSh0eXBlLCBlLCB0YXJnZXRFbClcbiAgICAgICAgSlMuZXhlYyh0eXBlLCBwaHhFdmVudCwgdmlldywgdGFyZ2V0RWwsIFtcInB1c2hcIiwge2RhdGF9XSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZHJhZ292ZXJcIiwgZSA9PiBlLnByZXZlbnREZWZhdWx0KCkpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJkcm9wXCIsIGUgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBsZXQgZHJvcFRhcmdldElkID0gbWF5YmUoY2xvc2VzdFBoeEJpbmRpbmcoZS50YXJnZXQsIHRoaXMuYmluZGluZyhQSFhfRFJPUF9UQVJHRVQpKSwgdHJ1ZVRhcmdldCA9PiB7XG4gICAgICAgIHJldHVybiB0cnVlVGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0RST1BfVEFSR0VUKSlcbiAgICAgIH0pXG4gICAgICBsZXQgZHJvcFRhcmdldCA9IGRyb3BUYXJnZXRJZCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkcm9wVGFyZ2V0SWQpXG4gICAgICBsZXQgZmlsZXMgPSBBcnJheS5mcm9tKGUuZGF0YVRyYW5zZmVyLmZpbGVzIHx8IFtdKVxuICAgICAgaWYoIWRyb3BUYXJnZXQgfHwgZHJvcFRhcmdldC5kaXNhYmxlZCB8fCBmaWxlcy5sZW5ndGggPT09IDAgfHwgIShkcm9wVGFyZ2V0LmZpbGVzIGluc3RhbmNlb2YgRmlsZUxpc3QpKXsgcmV0dXJuIH1cblxuICAgICAgTGl2ZVVwbG9hZGVyLnRyYWNrRmlsZXMoZHJvcFRhcmdldCwgZmlsZXMpXG4gICAgICBkcm9wVGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIiwge2J1YmJsZXM6IHRydWV9KSlcbiAgICB9KVxuICAgIHRoaXMub24oUEhYX1RSQUNLX1VQTE9BRFMsIGUgPT4ge1xuICAgICAgbGV0IHVwbG9hZFRhcmdldCA9IGUudGFyZ2V0XG4gICAgICBpZighRE9NLmlzVXBsb2FkSW5wdXQodXBsb2FkVGFyZ2V0KSl7IHJldHVybiB9XG4gICAgICBsZXQgZmlsZXMgPSBBcnJheS5mcm9tKGUuZGV0YWlsLmZpbGVzIHx8IFtdKS5maWx0ZXIoZiA9PiBmIGluc3RhbmNlb2YgRmlsZSB8fCBmIGluc3RhbmNlb2YgQmxvYilcbiAgICAgIExpdmVVcGxvYWRlci50cmFja0ZpbGVzKHVwbG9hZFRhcmdldCwgZmlsZXMpXG4gICAgICB1cGxvYWRUYXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7YnViYmxlczogdHJ1ZX0pKVxuICAgIH0pXG4gIH1cblxuICBldmVudE1ldGEoZXZlbnROYW1lLCBlLCB0YXJnZXRFbCl7XG4gICAgbGV0IGNhbGxiYWNrID0gdGhpcy5tZXRhZGF0YUNhbGxiYWNrc1tldmVudE5hbWVdXG4gICAgcmV0dXJuIGNhbGxiYWNrID8gY2FsbGJhY2soZSwgdGFyZ2V0RWwpIDoge31cbiAgfVxuXG4gIHNldFBlbmRpbmdMaW5rKGhyZWYpe1xuICAgIHRoaXMubGlua1JlZisrXG4gICAgdGhpcy5wZW5kaW5nTGluayA9IGhyZWZcbiAgICByZXR1cm4gdGhpcy5saW5rUmVmXG4gIH1cblxuICBjb21taXRQZW5kaW5nTGluayhsaW5rUmVmKXtcbiAgICBpZih0aGlzLmxpbmtSZWYgIT09IGxpbmtSZWYpe1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaHJlZiA9IHRoaXMucGVuZGluZ0xpbmtcbiAgICAgIHRoaXMucGVuZGluZ0xpbmsgPSBudWxsXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIGdldEhyZWYoKXsgcmV0dXJuIHRoaXMuaHJlZiB9XG5cbiAgaGFzUGVuZGluZ0xpbmsoKXsgcmV0dXJuICEhdGhpcy5wZW5kaW5nTGluayB9XG5cbiAgYmluZChldmVudHMsIGNhbGxiYWNrKXtcbiAgICBmb3IobGV0IGV2ZW50IGluIGV2ZW50cyl7XG4gICAgICBsZXQgYnJvd3NlckV2ZW50TmFtZSA9IGV2ZW50c1tldmVudF1cblxuICAgICAgdGhpcy5vbihicm93c2VyRXZlbnROYW1lLCBlID0+IHtcbiAgICAgICAgbGV0IGJpbmRpbmcgPSB0aGlzLmJpbmRpbmcoZXZlbnQpXG4gICAgICAgIGxldCB3aW5kb3dCaW5kaW5nID0gdGhpcy5iaW5kaW5nKGB3aW5kb3ctJHtldmVudH1gKVxuICAgICAgICBsZXQgdGFyZ2V0UGh4RXZlbnQgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUgJiYgZS50YXJnZXQuZ2V0QXR0cmlidXRlKGJpbmRpbmcpXG4gICAgICAgIGlmKHRhcmdldFBoeEV2ZW50KXtcbiAgICAgICAgICB0aGlzLmRlYm91bmNlKGUudGFyZ2V0LCBlLCBicm93c2VyRXZlbnROYW1lLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlLnRhcmdldCwgdmlldyA9PiB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGUsIGV2ZW50LCB2aWV3LCBlLnRhcmdldCwgdGFyZ2V0UGh4RXZlbnQsIG51bGwpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgRE9NLmFsbChkb2N1bWVudCwgYFske3dpbmRvd0JpbmRpbmd9XWAsIGVsID0+IHtcbiAgICAgICAgICAgIGxldCBwaHhFdmVudCA9IGVsLmdldEF0dHJpYnV0ZSh3aW5kb3dCaW5kaW5nKVxuICAgICAgICAgICAgdGhpcy5kZWJvdW5jZShlbCwgZSwgYnJvd3NlckV2ZW50TmFtZSwgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlbCwgdmlldyA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZSwgZXZlbnQsIHZpZXcsIGVsLCBwaHhFdmVudCwgXCJ3aW5kb3dcIilcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBiaW5kQ2xpY2tzKCl7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgZSA9PiB0aGlzLmNsaWNrU3RhcnRlZEF0VGFyZ2V0ID0gZS50YXJnZXQpXG4gICAgdGhpcy5iaW5kQ2xpY2soXCJjbGlja1wiLCBcImNsaWNrXCIsIGZhbHNlKVxuICAgIHRoaXMuYmluZENsaWNrKFwibW91c2Vkb3duXCIsIFwiY2FwdHVyZS1jbGlja1wiLCB0cnVlKVxuICB9XG5cbiAgYmluZENsaWNrKGV2ZW50TmFtZSwgYmluZGluZ05hbWUsIGNhcHR1cmUpe1xuICAgIGxldCBjbGljayA9IHRoaXMuYmluZGluZyhiaW5kaW5nTmFtZSlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGUgPT4ge1xuICAgICAgbGV0IHRhcmdldCA9IG51bGxcbiAgICAgIGlmKGNhcHR1cmUpe1xuICAgICAgICB0YXJnZXQgPSBlLnRhcmdldC5tYXRjaGVzKGBbJHtjbGlja31dYCkgPyBlLnRhcmdldCA6IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoYFske2NsaWNrfV1gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGNsaWNrU3RhcnRlZEF0VGFyZ2V0ID0gdGhpcy5jbGlja1N0YXJ0ZWRBdFRhcmdldCB8fCBlLnRhcmdldFxuICAgICAgICB0YXJnZXQgPSBjbG9zZXN0UGh4QmluZGluZyhjbGlja1N0YXJ0ZWRBdFRhcmdldCwgY2xpY2spXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tTdGFydGVkQXRUYXJnZXQpXG4gICAgICAgIHRoaXMuY2xpY2tTdGFydGVkQXRUYXJnZXQgPSBudWxsXG4gICAgICB9XG4gICAgICBsZXQgcGh4RXZlbnQgPSB0YXJnZXQgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZShjbGljaylcbiAgICAgIGlmKCFwaHhFdmVudCl7IHJldHVybiB9XG4gICAgICBpZih0YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIpeyBlLnByZXZlbnREZWZhdWx0KCkgfVxuXG4gICAgICB0aGlzLmRlYm91bmNlKHRhcmdldCwgZSwgXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMud2l0aGluT3duZXJzKHRhcmdldCwgdmlldyA9PiB7XG4gICAgICAgICAgSlMuZXhlYyhcImNsaWNrXCIsIHBoeEV2ZW50LCB2aWV3LCB0YXJnZXQsIFtcInB1c2hcIiwge2RhdGE6IHRoaXMuZXZlbnRNZXRhKFwiY2xpY2tcIiwgZSwgdGFyZ2V0KX1dKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LCBjYXB0dXJlKVxuICB9XG5cbiAgZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tTdGFydGVkQXQpe1xuICAgIGxldCBwaHhDbGlja0F3YXkgPSB0aGlzLmJpbmRpbmcoXCJjbGljay1hd2F5XCIpXG4gICAgRE9NLmFsbChkb2N1bWVudCwgYFske3BoeENsaWNrQXdheX1dYCwgZWwgPT4ge1xuICAgICAgaWYoIShlbC5pc1NhbWVOb2RlKGNsaWNrU3RhcnRlZEF0KSB8fCBlbC5jb250YWlucyhjbGlja1N0YXJ0ZWRBdCkpKXtcbiAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZS50YXJnZXQsIHZpZXcgPT4ge1xuICAgICAgICAgIGxldCBwaHhFdmVudCA9IGVsLmdldEF0dHJpYnV0ZShwaHhDbGlja0F3YXkpXG4gICAgICAgICAgaWYoSlMuaXNWaXNpYmxlKGVsKSl7XG4gICAgICAgICAgICBKUy5leGVjKFwiY2xpY2tcIiwgcGh4RXZlbnQsIHZpZXcsIGVsLCBbXCJwdXNoXCIsIHtkYXRhOiB0aGlzLmV2ZW50TWV0YShcImNsaWNrXCIsIGUsIGUudGFyZ2V0KX1dKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgYmluZE5hdigpe1xuICAgIGlmKCFCcm93c2VyLmNhblB1c2hTdGF0ZSgpKXsgcmV0dXJuIH1cbiAgICBpZihoaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uKXsgaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbiA9IFwibWFudWFsXCIgfVxuICAgIGxldCBzY3JvbGxUaW1lciA9IG51bGxcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBfZSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoc2Nyb2xsVGltZXIpXG4gICAgICBzY3JvbGxUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBCcm93c2VyLnVwZGF0ZUN1cnJlbnRTdGF0ZShzdGF0ZSA9PiBPYmplY3QuYXNzaWduKHN0YXRlLCB7c2Nyb2xsOiB3aW5kb3cuc2Nyb2xsWX0pKVxuICAgICAgfSwgMTAwKVxuICAgIH0pXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBldmVudCA9PiB7XG4gICAgICBpZighdGhpcy5yZWdpc3Rlck5ld0xvY2F0aW9uKHdpbmRvdy5sb2NhdGlvbikpeyByZXR1cm4gfVxuICAgICAgbGV0IHt0eXBlLCBpZCwgcm9vdCwgc2Nyb2xsfSA9IGV2ZW50LnN0YXRlIHx8IHt9XG4gICAgICBsZXQgaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmXG5cbiAgICAgIHRoaXMucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGlmKHRoaXMubWFpbi5pc0Nvbm5lY3RlZCgpICYmICh0eXBlID09PSBcInBhdGNoXCIgJiYgaWQgPT09IHRoaXMubWFpbi5pZCkpe1xuICAgICAgICAgIHRoaXMubWFpbi5wdXNoTGlua1BhdGNoKGhyZWYsIG51bGwpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZXBsYWNlTWFpbihocmVmLCBudWxsLCAoKSA9PiB7XG4gICAgICAgICAgICBpZihyb290KXsgdGhpcy5yZXBsYWNlUm9vdEhpc3RvcnkoKSB9XG4gICAgICAgICAgICBpZih0eXBlb2Yoc2Nyb2xsKSA9PT0gXCJudW1iZXJcIil7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBzY3JvbGwpXG4gICAgICAgICAgICAgIH0sIDApIC8vIHRoZSBib2R5IG5lZWRzIHRvIHJlbmRlciBiZWZvcmUgd2Ugc2Nyb2xsLlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSwgZmFsc2UpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBlID0+IHtcbiAgICAgIGxldCB0YXJnZXQgPSBjbG9zZXN0UGh4QmluZGluZyhlLnRhcmdldCwgUEhYX0xJVkVfTElOSylcbiAgICAgIGxldCB0eXBlID0gdGFyZ2V0ICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJVkVfTElOSylcbiAgICAgIGxldCB3YW50c05ld1RhYiA9IGUubWV0YUtleSB8fCBlLmN0cmxLZXkgfHwgZS5idXR0b24gPT09IDFcbiAgICAgIGlmKCF0eXBlIHx8ICF0aGlzLmlzQ29ubmVjdGVkKCkgfHwgIXRoaXMubWFpbiB8fCB3YW50c05ld1RhYil7IHJldHVybiB9XG5cbiAgICAgIGxldCBocmVmID0gdGFyZ2V0LmhyZWZcbiAgICAgIGxldCBsaW5rU3RhdGUgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKFBIWF9MSU5LX1NUQVRFKVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpIC8vIGRvIG5vdCBidWJibGUgY2xpY2sgdG8gcmVndWxhciBwaHgtY2xpY2sgYmluZGluZ3NcbiAgICAgIGlmKHRoaXMucGVuZGluZ0xpbmsgPT09IGhyZWYpeyByZXR1cm4gfVxuXG4gICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICBpZih0eXBlID09PSBcInBhdGNoXCIpe1xuICAgICAgICAgIHRoaXMucHVzaEhpc3RvcnlQYXRjaChocmVmLCBsaW5rU3RhdGUsIHRhcmdldClcbiAgICAgICAgfSBlbHNlIGlmKHR5cGUgPT09IFwicmVkaXJlY3RcIil7XG4gICAgICAgICAgdGhpcy5oaXN0b3J5UmVkaXJlY3QoaHJlZiwgbGlua1N0YXRlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgJHtQSFhfTElWRV9MSU5LfSB0byBiZSBcInBhdGNoXCIgb3IgXCJyZWRpcmVjdFwiLCBnb3Q6ICR7dHlwZX1gKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sIGZhbHNlKVxuICB9XG5cbiAgZGlzcGF0Y2hFdmVudChldmVudCwgcGF5bG9hZCA9IHt9KXtcbiAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIGBwaHg6JHtldmVudH1gLCB7ZGV0YWlsOiBwYXlsb2FkfSlcbiAgfVxuXG4gIGRpc3BhdGNoRXZlbnRzKGV2ZW50cyl7XG4gICAgZXZlbnRzLmZvckVhY2goKFtldmVudCwgcGF5bG9hZF0pID0+IHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCwgcGF5bG9hZCkpXG4gIH1cblxuICB3aXRoUGFnZUxvYWRpbmcoaW5mbywgY2FsbGJhY2spe1xuICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6cGFnZS1sb2FkaW5nLXN0YXJ0XCIsIHtkZXRhaWw6IGluZm99KVxuICAgIGxldCBkb25lID0gKCkgPT4gRE9NLmRpc3BhdGNoRXZlbnQod2luZG93LCBcInBoeDpwYWdlLWxvYWRpbmctc3RvcFwiLCB7ZGV0YWlsOiBpbmZvfSlcbiAgICByZXR1cm4gY2FsbGJhY2sgPyBjYWxsYmFjayhkb25lKSA6IGRvbmVcbiAgfVxuXG4gIHB1c2hIaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCB0YXJnZXRFbCl7XG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoe3RvOiBocmVmLCBraW5kOiBcInBhdGNoXCJ9LCBkb25lID0+IHtcbiAgICAgIHRoaXMubWFpbi5wdXNoTGlua1BhdGNoKGhyZWYsIHRhcmdldEVsLCBsaW5rUmVmID0+IHtcbiAgICAgICAgdGhpcy5oaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmKVxuICAgICAgICBkb25lKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIGhpc3RvcnlQYXRjaChocmVmLCBsaW5rU3RhdGUsIGxpbmtSZWYgPSB0aGlzLnNldFBlbmRpbmdMaW5rKGhyZWYpKXtcbiAgICBpZighdGhpcy5jb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSl7IHJldHVybiB9XG5cbiAgICBCcm93c2VyLnB1c2hTdGF0ZShsaW5rU3RhdGUsIHt0eXBlOiBcInBhdGNoXCIsIGlkOiB0aGlzLm1haW4uaWR9LCBocmVmKVxuICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pXG4gIH1cblxuICBoaXN0b3J5UmVkaXJlY3QoaHJlZiwgbGlua1N0YXRlLCBmbGFzaCl7XG4gICAgbGV0IHNjcm9sbCA9IHdpbmRvdy5zY3JvbGxZXG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoe3RvOiBocmVmLCBraW5kOiBcInJlZGlyZWN0XCJ9LCBkb25lID0+IHtcbiAgICAgIHRoaXMucmVwbGFjZU1haW4oaHJlZiwgZmxhc2gsICgpID0+IHtcbiAgICAgICAgQnJvd3Nlci5wdXNoU3RhdGUobGlua1N0YXRlLCB7dHlwZTogXCJyZWRpcmVjdFwiLCBpZDogdGhpcy5tYWluLmlkLCBzY3JvbGw6IHNjcm9sbH0sIGhyZWYpXG4gICAgICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pXG4gICAgICAgIGRvbmUoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcmVwbGFjZVJvb3RIaXN0b3J5KCl7XG4gICAgQnJvd3Nlci5wdXNoU3RhdGUoXCJyZXBsYWNlXCIsIHtyb290OiB0cnVlLCB0eXBlOiBcInBhdGNoXCIsIGlkOiB0aGlzLm1haW4uaWR9KVxuICB9XG5cbiAgcmVnaXN0ZXJOZXdMb2NhdGlvbihuZXdMb2NhdGlvbil7XG4gICAgbGV0IHtwYXRobmFtZSwgc2VhcmNofSA9IHRoaXMuY3VycmVudExvY2F0aW9uXG4gICAgaWYocGF0aG5hbWUgKyBzZWFyY2ggPT09IG5ld0xvY2F0aW9uLnBhdGhuYW1lICsgbmV3TG9jYXRpb24uc2VhcmNoKXtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRMb2NhdGlvbiA9IGNsb25lKG5ld0xvY2F0aW9uKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICBiaW5kRm9ybXMoKXtcbiAgICBsZXQgaXRlcmF0aW9ucyA9IDBcbiAgICB0aGlzLm9uKFwic3VibWl0XCIsIGUgPT4ge1xuICAgICAgbGV0IHBoeEV2ZW50ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInN1Ym1pdFwiKSlcbiAgICAgIGlmKCFwaHhFdmVudCl7IHJldHVybiB9XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGUudGFyZ2V0LmRpc2FibGVkID0gdHJ1ZVxuICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZS50YXJnZXQsIHZpZXcgPT4ge1xuICAgICAgICBKUy5leGVjKFwic3VibWl0XCIsIHBoeEV2ZW50LCB2aWV3LCBlLnRhcmdldCwgW1wicHVzaFwiLCB7fV0pXG4gICAgICB9KVxuICAgIH0sIGZhbHNlKVxuXG4gICAgZm9yKGxldCB0eXBlIG9mIFtcImNoYW5nZVwiLCBcImlucHV0XCJdKXtcbiAgICAgIHRoaXMub24odHlwZSwgZSA9PiB7XG4gICAgICAgIGxldCBwaHhDaGFuZ2UgPSB0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIilcbiAgICAgICAgbGV0IGlucHV0ID0gZS50YXJnZXRcbiAgICAgICAgbGV0IGlucHV0RXZlbnQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUocGh4Q2hhbmdlKVxuICAgICAgICBsZXQgZm9ybUV2ZW50ID0gaW5wdXQuZm9ybSAmJiBpbnB1dC5mb3JtLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpXG4gICAgICAgIGxldCBwaHhFdmVudCA9IGlucHV0RXZlbnQgfHwgZm9ybUV2ZW50XG4gICAgICAgIGlmKCFwaHhFdmVudCl7IHJldHVybiB9XG4gICAgICAgIGlmKGlucHV0LnR5cGUgPT09IFwibnVtYmVyXCIgJiYgaW5wdXQudmFsaWRpdHkgJiYgaW5wdXQudmFsaWRpdHkuYmFkSW5wdXQpeyByZXR1cm4gfVxuXG4gICAgICAgIGxldCBkaXNwYXRjaGVyID0gaW5wdXRFdmVudCA/IGlucHV0IDogaW5wdXQuZm9ybVxuICAgICAgICBsZXQgY3VycmVudEl0ZXJhdGlvbnMgPSBpdGVyYXRpb25zXG4gICAgICAgIGl0ZXJhdGlvbnMrK1xuICAgICAgICBsZXQge2F0OiBhdCwgdHlwZTogbGFzdFR5cGV9ID0gRE9NLnByaXZhdGUoaW5wdXQsIFwicHJldi1pdGVyYXRpb25cIikgfHwge31cbiAgICAgICAgLy8gZGV0ZWN0IGR1cCBiZWNhdXNlIHNvbWUgYnJvd3NlcnMgZGlzcGF0Y2ggYm90aCBcImlucHV0XCIgYW5kIFwiY2hhbmdlXCJcbiAgICAgICAgaWYoYXQgPT09IGN1cnJlbnRJdGVyYXRpb25zIC0gMSAmJiB0eXBlICE9PSBsYXN0VHlwZSl7IHJldHVybiB9XG5cbiAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIFwicHJldi1pdGVyYXRpb25cIiwge2F0OiBjdXJyZW50SXRlcmF0aW9ucywgdHlwZTogdHlwZX0pXG5cbiAgICAgICAgdGhpcy5kZWJvdW5jZShpbnB1dCwgZSwgdHlwZSwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMud2l0aGluT3duZXJzKGRpc3BhdGNoZXIsIHZpZXcgPT4ge1xuICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIFBIWF9IQVNfRk9DVVNFRCwgdHJ1ZSlcbiAgICAgICAgICAgIGlmKCFET00uaXNUZXh0dWFsSW5wdXQoaW5wdXQpKXtcbiAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVFbGVtZW50KGlucHV0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgSlMuZXhlYyhcImNoYW5nZVwiLCBwaHhFdmVudCwgdmlldywgaW5wdXQsIFtcInB1c2hcIiwge190YXJnZXQ6IGUudGFyZ2V0Lm5hbWUsIGRpc3BhdGNoZXI6IGRpc3BhdGNoZXJ9XSlcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSwgZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgZGVib3VuY2UoZWwsIGV2ZW50LCBldmVudFR5cGUsIGNhbGxiYWNrKXtcbiAgICBpZihldmVudFR5cGUgPT09IFwiYmx1clwiIHx8IGV2ZW50VHlwZSA9PT0gXCJmb2N1c291dFwiKXsgcmV0dXJuIGNhbGxiYWNrKCkgfVxuXG4gICAgbGV0IHBoeERlYm91bmNlID0gdGhpcy5iaW5kaW5nKFBIWF9ERUJPVU5DRSlcbiAgICBsZXQgcGh4VGhyb3R0bGUgPSB0aGlzLmJpbmRpbmcoUEhYX1RIUk9UVExFKVxuICAgIGxldCBkZWZhdWx0RGVib3VuY2UgPSB0aGlzLmRlZmF1bHRzLmRlYm91bmNlLnRvU3RyaW5nKClcbiAgICBsZXQgZGVmYXVsdFRocm90dGxlID0gdGhpcy5kZWZhdWx0cy50aHJvdHRsZS50b1N0cmluZygpXG5cbiAgICB0aGlzLndpdGhpbk93bmVycyhlbCwgdmlldyA9PiB7XG4gICAgICBsZXQgYXN5bmNGaWx0ZXIgPSAoKSA9PiAhdmlldy5pc0Rlc3Ryb3llZCgpICYmIGRvY3VtZW50LmJvZHkuY29udGFpbnMoZWwpXG4gICAgICBET00uZGVib3VuY2UoZWwsIGV2ZW50LCBwaHhEZWJvdW5jZSwgZGVmYXVsdERlYm91bmNlLCBwaHhUaHJvdHRsZSwgZGVmYXVsdFRocm90dGxlLCBhc3luY0ZpbHRlciwgKCkgPT4ge1xuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBzaWxlbmNlRXZlbnRzKGNhbGxiYWNrKXtcbiAgICB0aGlzLnNpbGVuY2VkID0gdHJ1ZVxuICAgIGNhbGxiYWNrKClcbiAgICB0aGlzLnNpbGVuY2VkID0gZmFsc2VcbiAgfVxuXG4gIG9uKGV2ZW50LCBjYWxsYmFjayl7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGUgPT4ge1xuICAgICAgaWYoIXRoaXMuc2lsZW5jZWQpeyBjYWxsYmFjayhlKSB9XG4gICAgfSlcbiAgfVxufVxuXG5jbGFzcyBUcmFuc2l0aW9uU2V0IHtcbiAgY29uc3RydWN0b3IoKXtcbiAgICB0aGlzLnRyYW5zaXRpb25zID0gbmV3IFNldCgpXG4gICAgdGhpcy5wZW5kaW5nT3BzID0gW11cbiAgICB0aGlzLnJlc2V0KClcbiAgfVxuXG4gIHJlc2V0KCl7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5mb3JFYWNoKHRpbWVyID0+IHtcbiAgICAgIGNhbmNlbFRpbWVvdXQodGltZXIpXG4gICAgICB0aGlzLnRyYW5zaXRpb25zLmRlbGV0ZSh0aW1lcilcbiAgICB9KVxuICAgIHRoaXMuZmx1c2hQZW5kaW5nT3BzKClcbiAgfVxuXG4gIGFmdGVyKGNhbGxiYWNrKXtcbiAgICBpZih0aGlzLnNpemUoKSA9PT0gMCl7XG4gICAgICBjYWxsYmFjaygpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHVzaFBlbmRpbmdPcChjYWxsYmFjaylcbiAgICB9XG4gIH1cblxuICBhZGRUcmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSl7XG4gICAgb25TdGFydCgpXG4gICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRyYW5zaXRpb25zLmRlbGV0ZSh0aW1lcilcbiAgICAgIG9uRG9uZSgpXG4gICAgICBpZih0aGlzLnNpemUoKSA9PT0gMCl7IHRoaXMuZmx1c2hQZW5kaW5nT3BzKCkgfVxuICAgIH0sIHRpbWUpXG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZGQodGltZXIpXG4gIH1cblxuICBwdXNoUGVuZGluZ09wKG9wKXsgdGhpcy5wZW5kaW5nT3BzLnB1c2gob3ApIH1cblxuICBzaXplKCl7IHJldHVybiB0aGlzLnRyYW5zaXRpb25zLnNpemUgfVxuXG4gIGZsdXNoUGVuZGluZ09wcygpe1xuICAgIHRoaXMucGVuZGluZ09wcy5mb3JFYWNoKG9wID0+IG9wKCkpXG4gICAgdGhpcy5wZW5kaW5nT3BzID0gW11cbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFVQSxPQUFFLFNBQVVBLFNBQVEsU0FBVTtBQUU3QjtBQUVBLFlBQUssT0FBTyxXQUFXLFlBQVksT0FBTyxPQUFPLFlBQVksVUFBVztBQVN2RSxpQkFBTyxVQUFVQSxRQUFPLFdBQ3ZCLFFBQVNBLFNBQVEsSUFBSyxJQUN0QixTQUFVLEdBQUk7QUFDYixnQkFBSyxDQUFDLEVBQUUsVUFBVztBQUNsQixvQkFBTSxJQUFJLE1BQU8sMENBQTJDO0FBQUEsWUFDN0Q7QUFDQSxtQkFBTyxRQUFTLENBQUU7QUFBQSxVQUNuQjtBQUFBLFFBQ0YsT0FBTztBQUNOLGtCQUFTQSxPQUFPO0FBQUEsUUFDakI7QUFBQSxNQUdELEdBQUssT0FBTyxXQUFXLGNBQWMsU0FBUyxTQUFNLFNB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WUFBYTtBQUFBLFlBQW9CO0FBQUEsWUFBbUI7QUFBQSxZQUFZO0FBQUEsWUFBYztBQUFBLFlBQVE7QUFBQSxZQUFZO0FBQUEsWUFBVztBQUFBLFlBQWM7QUFBQSxZQUFhO0FBQUEsWUFBWTtBQUFBLFlBQVE7QUFBQSxZQUFRO0FBQUEsWUFBTztBQUFBLFlBQVk7QUFBQSxZQUFXO0FBQUEsWUFBVTtBQUFBLFlBQVc7QUFBQSxZQUFjO0FBQUEsWUFBYztBQUFBLFlBQVU7QUFBQSxZQUFTO0FBQUEsWUFBVztBQUFBLFlBQXFCO0FBQUEsWUFBYztBQUFBLFlBQWU7QUFBQSxZQUFRO0FBQUEsWUFBVTtBQUFBLFlBQWlCO0FBQUEsWUFBcUI7QUFBQSxZQUFpQztBQUFBLFlBQWtDO0FBQUEsWUFBYTtBQUFBLFlBQVc7QUFBQSxZQUFZO0FBQUEsWUFBVTtBQUFBLFlBQWM7QUFBQSxZQUFjO0FBQUEsWUFBVztBQUFBLFlBQVU7QUFBQSxZQUFRO0FBQUEsWUFBZ0I7QUFBQSxZQUFnQjtBQUFBLFlBQVM7QUFBQSxZQUFRO0FBQUEsWUFBVTtBQUFBLFlBQWE7QUFBQSxZQUFXO0FBQUEsWUFBUztBQUFBLFlBQVk7QUFBQSxZQUFlO0FBQUEsWUFBWTtBQUFBLFlBQVM7QUFBQSxZQUFhO0FBQUEsWUFBYztBQUFBLFlBQWM7QUFBQSxZQUFzQjtBQUFBLFlBQVU7QUFBQSxZQUFVO0FBQUEsWUFBWTtBQUFBLFlBQWdCO0FBQUEsWUFBVztBQUFBLFlBQWM7QUFBQSxZQUFRO0FBQUEsWUFBVztBQUFBLFlBQVM7QUFBQSxZQUFVO0FBQUEsWUFBVTtBQUFBLFlBQVE7QUFBQSxZQUFjO0FBQUEsWUFBWTtBQUFBLFlBQWE7QUFBQSxZQUFPO0FBQUEsWUFBYztBQUFBLFlBQVc7QUFBQSxZQUFjO0FBQUEsWUFBVTtBQUFBLFlBQWU7QUFBQSxZQUFhO0FBQUEsWUFBUTtBQUFBLFlBQWE7QUFBQSxZQUFVO0FBQUEsWUFBYTtBQUFBLFlBQWtCO0FBQUEsWUFBVztBQUFBLFlBQWdCO0FBQUEsWUFBVztBQUFBLFlBQWlCO0FBQUEsWUFBZ0I7QUFBQSxZQUFhO0FBQUEsWUFBb0I7QUFBQSxZQUFXO0FBQUEsWUFBVTtBQUFBLFlBQVk7QUFBQSxZQUFRO0FBQUEsWUFBYztBQUFBLFlBQXFCO0FBQUEsWUFBYTtBQUFBLFlBQVc7QUFBQSxZQUFXO0FBQUEsWUFBYTtBQUFBLFlBQVk7QUFBQSxZQUFZO0FBQUEsWUFBYztBQUFBLFlBQVE7QUFBQSxZQUFlO0FBQUEsWUFBa0I7QUFBQSxZQUFTO0FBQUEsWUFBVztBQUFBLFlBQWE7QUFBQSxZQUFpQjtBQUFBLFlBQWU7QUFBQSxZQUFxQjtBQUFBLFlBQU87QUFBQSxZQUFXO0FBQUEsWUFBUTtBQUFBLFlBQVU7QUFBQSxZQUFRO0FBQUEsWUFBdUI7QUFBQSxZQUFjO0FBQUEsWUFBYztBQUFBLFlBQW9CO0FBQUEsWUFBVztBQUFBLFlBQWU7QUFBQSxZQUFVO0FBQUEsWUFBYztBQUFBLFlBQVk7QUFBQSxZQUFtQjtBQUFBLFlBQVE7QUFBQSxZQUFRO0FBQUEsWUFBUztBQUFBLFlBQVM7QUFBQSxZQUFTO0FBQUEsWUFBYTtBQUFBLFlBQVU7QUFBQSxZQUFnQjtBQUFBLFlBQWdCO0FBQUEsWUFBWTtBQUFBLFlBQVk7QUFBQSxZQUFPO0FBQUEsWUFBYztBQUFBLFlBQWE7QUFBQSxZQUFZO0FBQUEsWUFBUztBQUFBLFlBQXFCO0FBQUEsWUFBZ0I7QUFBQSxZQUFRO0FBQUEsWUFBZTtBQUFBLFlBQVM7QUFBQSxZQUFXO0FBQUEsWUFBVztBQUFBLFlBQVE7QUFBQSxZQUFlO0FBQUEsWUFBVTtBQUFBLFlBQVE7QUFBQSxZQUFpQjtBQUFBLFlBQWE7QUFBQSxVQUN6aUU7QUFBQSxVQUNBLGdCQUFnQjtBQUFBLFlBQ2Y7QUFBQSxZQUFXO0FBQUEsWUFBbUI7QUFBQSxZQUFPO0FBQUEsWUFBZTtBQUFBLFlBQWtCO0FBQUEsWUFBYztBQUFBLFlBQVc7QUFBQSxZQUFnQjtBQUFBLFlBQVc7QUFBQSxZQUFZO0FBQUEsWUFBZTtBQUFBLFlBQU87QUFBQSxZQUFLO0FBQUEsWUFBSztBQUFBLFlBQWU7QUFBQSxZQUFLO0FBQUEsWUFBTztBQUFBLFlBQUs7QUFBQSxZQUFNO0FBQUEsWUFBVTtBQUFBLFlBQWU7QUFBQSxZQUF5QjtBQUFBLFlBQVE7QUFBQSxZQUFLO0FBQUEsWUFBUTtBQUFBLFlBQUs7QUFBQSxZQUFZO0FBQUEsWUFBVTtBQUFBLFlBQWU7QUFBQSxZQUFNO0FBQUEsWUFBUztBQUFBLFlBQWM7QUFBQSxZQUFVO0FBQUEsWUFBUztBQUFBLFlBQVU7QUFBQSxZQUFTO0FBQUEsWUFBUztBQUFBLFlBQVM7QUFBQSxZQUFXO0FBQUEsWUFBVTtBQUFBLFlBQVc7QUFBQSxZQUFZO0FBQUEsWUFBTTtBQUFBLFlBQWtCO0FBQUEsWUFBTTtBQUFBLFlBQU87QUFBQSxZQUFXO0FBQUEsWUFBYztBQUFBLFlBQU07QUFBQSxZQUFNO0FBQUEsWUFBTztBQUFBLFlBQVM7QUFBQSxZQUFZO0FBQUEsWUFBVTtBQUFBLFlBQU07QUFBQSxZQUFXO0FBQUEsWUFBVztBQUFBLFlBQU87QUFBQSxZQUFVO0FBQUEsWUFBTTtBQUFBLFlBQVU7QUFBQSxZQUFTO0FBQUEsWUFBUTtBQUFBLFlBQVk7QUFBQSxZQUFjO0FBQUEsWUFBVztBQUFBLFlBQVk7QUFBQSxZQUFRO0FBQUEsWUFBYTtBQUFBLFlBQWU7QUFBQSxZQUFTO0FBQUEsWUFBTztBQUFBLFlBQWtCO0FBQUEsWUFBYTtBQUFBLFlBQTBCO0FBQUEsWUFBYztBQUFBLFlBQVM7QUFBQSxZQUFjO0FBQUEsWUFBUztBQUFBLFlBQVc7QUFBQSxZQUFPO0FBQUEsWUFBVTtBQUFBLFlBQXlCO0FBQUEsWUFBTztBQUFBLFlBQVE7QUFBQSxZQUFNO0FBQUEsWUFBUTtBQUFBLFlBQVk7QUFBQSxZQUFTO0FBQUEsWUFBYTtBQUFBLFVBQzc3QjtBQUFBO0FBQUEsUUFFRDtBQUVBLGVBQU8sS0FBSyxRQUFRLEVBQUUsUUFBUSxTQUFVLEdBQUc7QUFDMUMsaUJBQU8sQ0FBQyxFQUFFLFVBQVUsaUJBQWlCLFNBQVMsQ0FBQyxDQUFDO0FBQUEsUUFDakQsQ0FBQztBQUVELFlBQUksY0FBYztBQUFBO0FBQUEsVUFFakI7QUFBQSxVQUFPO0FBQUEsVUFBUztBQUFBLFVBQVE7QUFBQSxVQUFPO0FBQUEsVUFBUTtBQUFBLFVBQVM7QUFBQSxVQUFTO0FBQUEsVUFBUTtBQUFBLFVBQVM7QUFBQSxVQUFXO0FBQUEsVUFBTztBQUFBLFVBQU87QUFBQSxVQUFRO0FBQUEsVUFBUztBQUFBLFVBQVM7QUFBQSxVQUFXO0FBQUEsVUFBVTtBQUFBLFVBQVE7QUFBQSxVQUFRO0FBQUEsVUFBUztBQUFBLFVBQVM7QUFBQSxVQUFPO0FBQUEsVUFBVTtBQUFBLFVBQU07QUFBQSxVQUFXO0FBQUEsVUFBYTtBQUFBLFVBQU87QUFBQSxVQUFRO0FBQUEsVUFBYTtBQUFBLFVBQVM7QUFBQSxVQUFRO0FBQUEsVUFBUztBQUFBLFVBQVE7QUFBQSxVQUFTO0FBQUEsVUFBVztBQUFBLFVBQU07QUFBQSxVQUFTO0FBQUEsVUFBUTtBQUFBLFVBQVU7QUFBQSxVQUFjO0FBQUEsVUFBYztBQUFBLFVBQVk7QUFBQSxVQUFTO0FBQUEsVUFBVztBQUFBLFVBQVE7QUFBQSxVQUFNO0FBQUEsVUFBUTtBQUFBLFVBQVU7QUFBQSxVQUFTO0FBQUEsVUFBUTtBQUFBLFVBQVU7QUFBQSxVQUFPO0FBQUEsVUFBUTtBQUFBLFVBQVU7QUFBQSxVQUFPO0FBQUEsVUFBWTtBQUFBO0FBQUEsVUFFemY7QUFBQSxVQUFrQjtBQUFBLFVBQW1CO0FBQUEsVUFBVTtBQUFBLFVBQWE7QUFBQSxVQUFTO0FBQUEsVUFBYTtBQUFBLFVBQWE7QUFBQSxVQUFZO0FBQUEsVUFBZTtBQUFBLFVBQVc7QUFBQSxVQUFhO0FBQUEsVUFBaUI7QUFBQSxVQUFvQjtBQUFBLFVBQVU7QUFBQSxVQUFPO0FBQUEsVUFBVztBQUFBLFVBQWU7QUFBQSxVQUFjO0FBQUEsVUFBVTtBQUFBLFVBQWU7QUFBQSxVQUFRO0FBQUEsVUFBZ0I7QUFBQSxVQUFhO0FBQUEsVUFBVztBQUFBLFVBQWdCO0FBQUEsVUFBZ0I7QUFBQSxVQUFjO0FBQUEsVUFBbUI7QUFBQSxVQUFTO0FBQUEsVUFBYztBQUFBLFVBQVU7QUFBQSxVQUFnQjtBQUFBLFVBQWE7QUFBQSxVQUFnQjtBQUFBLFVBQVk7QUFBQSxVQUFVO0FBQUEsVUFBWTtBQUFBLFVBQWM7QUFBQSxVQUFRO0FBQUEsVUFBYTtBQUFBLFVBQWlCO0FBQUEsVUFBZ0I7QUFBQSxVQUFRO0FBQUEsVUFBVztBQUFBLFVBQVc7QUFBQSxVQUFhO0FBQUEsVUFBaUI7QUFBQSxVQUFrQjtBQUFBLFVBQW1CO0FBQUEsVUFBaUI7QUFBQSxVQUFXO0FBQUEsVUFBUTtBQUFBLFVBQWE7QUFBQSxVQUFlO0FBQUEsVUFBVztBQUFBLFVBQWU7QUFBQSxVQUFjO0FBQUEsVUFBUTtBQUFBLFVBQWM7QUFBQSxVQUFrQjtBQUFBLFVBQWM7QUFBQSxVQUFRO0FBQUEsVUFBZ0I7QUFBQSxVQUFlO0FBQUEsVUFBWTtBQUFBLFVBQWlCO0FBQUEsVUFBYTtBQUFBLFVBQVc7QUFBQSxVQUFTO0FBQUEsVUFBYztBQUFBLFVBQVM7QUFBQSxVQUFRO0FBQUEsVUFBYztBQUFBLFVBQVc7QUFBQSxVQUFjO0FBQUEsVUFBYztBQUFBLFVBQVM7QUFBQSxVQUFRO0FBQUEsVUFBYTtBQUFBLFVBQWtCO0FBQUE7QUFBQSxVQUV0aEM7QUFBQSxVQUFXO0FBQUEsVUFBZ0I7QUFBQSxVQUFlO0FBQUEsVUFBa0I7QUFBQSxVQUFhO0FBQUEsVUFBcUI7QUFBQSxVQUFtQjtBQUFBLFVBQVM7QUFBQSxVQUFrQjtBQUFBLFVBQWdCO0FBQUE7QUFBQSxVQUU1SjtBQUFBLFVBQW1CO0FBQUEsVUFBZTtBQUFBLFVBQWlCO0FBQUEsVUFBaUI7QUFBQSxVQUFtQjtBQUFBO0FBQUEsVUFFdkY7QUFBQSxVQUFRO0FBQUEsVUFBVztBQUFBLFVBQWE7QUFBQSxVQUFhO0FBQUEsVUFBVztBQUFBLFVBQWdCO0FBQUEsVUFBa0I7QUFBQSxVQUFjO0FBQUEsVUFBUTtBQUFBLFVBQVU7QUFBQSxVQUFlO0FBQUEsVUFBc0I7QUFBQSxVQUFVO0FBQUE7QUFBQSxVQUV6SztBQUFBLFVBQU87QUFBQSxVQUFPO0FBQUEsVUFBTztBQUFBLFVBQU87QUFB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QTtBQUFBO0FBQUEsWUFFQyxTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsVUFDYjtBQUFBLFFBQ0Q7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNWO0FBQUEsWUFDQyxTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsVUFDYjtBQUFBLFVBQ0E7QUFBQSxZQUNDLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxVQUNiO0FBQUEsVUFDQTtBQUFBLFlBQ0MsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFVBQ2I7QUFBQSxRQUNEO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDWCxTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsUUFDYjtBQUFBLFFBRUEsU0FBUztBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFFBQ1I7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNYLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLE9BQU87QUFBQSxRQUNSO0FBQUEsUUFFQSxXQUFXO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsUUFDYjtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFFBQ2I7QUFBQSxRQUVBLFNBQVM7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLE9BQU87QUFBQSxRQUNSO0FBQUEsUUFFQSxZQUFZO0FBQUEsUUFDWixlQUFlO0FBQUEsTUFDaEI7QUFFQSxZQUFNLFVBQVUsWUFBWTtBQUFBLFFBQzNCLFdBQVc7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxRQUNUO0FBQUEsUUFDQSxRQUFRO0FBQUEsVUFDUCxTQUFTO0FBQUEsVUFDVCxRQUFRO0FBQUEsUUFDVDtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFFBQ1Q7QUFBQSxRQUNBLFVBQVU7QUFBQSxRQUNWLG1CQUFtQjtBQUFBLFVBQ2xCLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLFFBQVE7QUFBQSxZQUNQLFlBQVk7QUFBQSxZQUNaLGVBQWU7QUFBQSxVQUNoQjtBQUFBLFFBQ0Q7QUFBQSxRQUNBLHVCQUF1QjtBQUFBLFVBQ3RCLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxZQUNQLFlBQVk7QUFBQSxZQUNaLGVBQWU7QUFBQSxVQUNoQjtBQUFBLFFBQ0Q7QUFBQSxRQUNBLFdBQVc7QUFBQSxRQUNYLFdBQVc7QUFBQSxRQUNYLFVBQVU7QUFBQSxVQUNUO0FBQUEsVUFDQTtBQUFBLFFBQ0Q7QUFBQSxRQUNBLFlBQVk7QUFBQSxRQUNaLGVBQWU7QUFBQSxNQUNoQjtBQUVBLE9BQUMsU0FBVUEsUUFBTztBQUVqQixRQUFBQSxPQUFNLFVBQVUsU0FBUztBQUFBLFVBQ3hCLFdBQVc7QUFBQSxZQUNWLFNBQVM7QUFBQSxZQUNULFFBQVE7QUFBQSxVQUNUO0FBQUEsVUFDQSxnQkFBZ0I7QUFBQSxZQUNmLFNBQVM7QUFBQSxZQUNULFFBQVE7QUFBQSxZQUNSLFFBQVE7QUFBQSxjQUNQLFVBQVU7QUFBQSxnQkFDVCxTQUFTO0FBQUEsZ0JBQ1QsUUFBUTtBQUFBO0FBQUEsY0FDVDtBQUFBLGNBQ0EsT0FBTztBQUFBLGdCQUNOLFNBQVM7QUFBQSxnQkFDVCxPQUFPO0FBQUEsZ0JBQ1AsUUFBUUEsT0FBTSxVQUFVO0FBQUEsY0FDekI7QUFBQSxZQUNEO0FBQUEsVUFDRDtBQUFBLFVBQ0EsVUFBVTtBQUFBLFlBQ1Q7QUFBQSxjQUNDLFNBQVM7QUFBQSxjQUNULFFBQVE7QUFBQSxjQUNSLFFBQVE7QUFBQSxnQkFDUCxpQkFBaUI7QUFBQSxrQkFDaEIsU0FBUztBQUFBLGtCQUNULFFBQVE7QUFBQSxvQkFDUCw2QkFBNkI7QUFBQSxzQkFDNUIsU0FBUztBQUFBLHNCQUNULE9BQU87QUFBQSxvQkFDUjtBQUFBLG9CQUNBLGNBQWM7QUFBQSxzQkFDYixTQUFTO0FBQUEsc0JBQ1QsUUFBUTtBQUFBO0FBQUEsb0JBQ1Q7QUFBQSxrQkFDRDtBQUFBLGdCQUNEO0FBQUEsZ0JBQ0EsWUFBWTtBQUFBLGNBQ2I7QUFBQSxZQUNEO0FBQUEsWUFDQTtBQUFBLGNBQ0MsU0FBUztBQUFBLGNBQ1QsUUFBUTtBQUFBLFlBQ1Q7QUFBQSxVQUNEO0FBQUEsVUFDQSxXQUFXO0FBQUEsWUFDVixTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsWUFDWixRQUFRO0FBQUEsVUFDVDtBQUFBLFVBQ0EsYUFBYTtBQUFBLFlBQ1osU0FBUztBQUFBLFlBQ1QsUUFBUTtBQUFBLFlBQ1IsT0FBTztBQUFBLFVBQ1I7QUFBQSxVQUNBLFVBQVU7QUFBQSxVQUNWLFlBQVk7QUFBQSxZQUNYO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxjQUNDLFNBQVM7QUFBQSxjQUNULFlBQVk7QUFBQSxZQUNiO0FBQUEsWUFDQTtBQUFBLGNBQ0MsU0FBUztBQUFBLGNBQ1QsWUFBWTtBQUFBLFlBQ2I7QUFBQSxVQUNEO0FBQUEsVUFDQSxZQUFZO0FBQUEsWUFDWCxTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsVUFDYjtBQUFBLFVBQ0EsYUFBYTtBQUFBLFVBQ2IsV0FBVztBQUFBLFVBQ1gsZUFBZTtBQUFBLFVBQ2YsWUFBWTtBQUFBLFlBQ1g7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFVBQ0Q7QUFBQSxRQUNEO0FBRUEsUUFBQUEsT0FBTSxVQUFVLE9BQU8sY0FBYyxFQUFFLE9BQU8sT0FBTyxTQUFTQSxPQUFNLFVBQVU7QUFDOUUsUUFBQUEsT0FBTSxVQUFVLE9BQU8sT0FBTyxDQUFDLEVBQUUsT0FBTyxjQUFjLE9BQU8sV0FBVyxTQUFTQSxPQUFNLFVBQVU7QUFFakcsWUFBSSxTQUFTO0FBQ2IsWUFBSSxnQkFBZ0I7QUFBQTtBQUFBLFVBRW5CLG1CQUFtQixTQUNuQjtBQUFBLFVBRUEsMkJBQTJCLFNBQzNCO0FBQUEsVUFFQSx1RUFBdUUsT0FDckUsUUFBUSxVQUFVLFdBQVk7QUFBRSxtQkFBTyxPQUFPO0FBQUEsVUFBUSxDQUFDO0FBQUEsVUFDekQ7QUFBQSxRQUNEO0FBR0EsUUFBQUEsT0FBTSxNQUFNLElBQUksbUJBQW1CLFNBQVUsS0FBSztBQUNqRCxjQUFJLHFCQUFxQjtBQUN6QixjQUFJLG1CQUFtQjtBQUN2QixjQUFJLG9CQUFvQjtBQUV4QixVQUFBQSxPQUFNLFVBQVUsbUJBQW1CLEVBQUUsa0JBQWtCLEtBQUssVUFBVSxlQUFlLFNBQVUsT0FBTztBQUVyRyxnQkFBSSxVQUFVLGtCQUFrQjtBQUMvQixrQ0FBb0I7QUFBQSxZQUNyQjtBQUVBLGdCQUFJLENBQUMsbUJBQW1CO0FBQ3ZCLGtCQUFJLFVBQVUsb0JBQW9CO0FBQ2pDLG9DQUFvQjtBQUFBLGNBQ3JCO0FBRUEscUJBQU87QUFBQSxZQUNSO0FBQ0EsbUJBQU87QUFBQSxVQUNSLENBQUM7QUFBQSxRQUNGLENBQUM7QUFHRCxRQUFBQSxPQUFNLE1BQU0sSUFBSSxrQkFBa0IsU0FBVSxLQUFLO0FBQ2hELFVBQUFBLE9BQU0sVUFBVSxtQkFBbUIsRUFBRSxxQkFBcUIsS0FBSyxRQUFRO0FBQUEsUUFDeEUsQ0FBQztBQUFBLE1BRUYsR0FBRSxLQUFLO0FBSVAsT0FBQyxTQUFVQSxRQUFPO0FBRWpCLFlBQUksV0FBVztBQUVmLFFBQUFBLE9BQU0sVUFBVSxNQUFNO0FBQUE7QUFBQSxVQUVyQixXQUFXO0FBQUEsVUFDWCxVQUFVO0FBQUEsWUFDVCxTQUFTO0FBQUEsWUFDVCxRQUFRO0FBQUEsVUFDVDtBQUFBLFVBRUEsY0FBYztBQUFBLFlBQ2I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxjQU9DLFNBQVM7QUFBQSxnQkFDUiwySEFBMkgsT0FDekgsUUFBUSxlQUFlLFdBQVk7QUFBRSx5QkFBTyxpQkFBaUI7QUFBQSxnQkFBUSxDQUFDLEVBQ3RFLFFBQVEsZUFBZSxXQUFZO0FBQ25DLHlCQUFPLDZGQUE2RjtBQUFBLGdCQUNyRyxDQUFDLEVBQ0EsUUFBUSxjQUFjLFdBQVk7QUFBRSx5QkFBTywrQkFBK0I7QUFBQSxnQkFBUSxDQUFDLEVBQ25GLFFBQVEsY0FBYyxXQUFZO0FBQUUseUJBQU8sU0FBUztBQUFBLGdCQUFRLENBQUM7QUFBQSxnQkFDL0Q7QUFBQSxjQUNEO0FBQUEsY0FDQSxZQUFZO0FBQUEsY0FDWixRQUFRO0FBQUEsY0FDUixRQUFRO0FBQUE7QUFBQSxZQUNUO0FBQUEsWUFDQTtBQUFBLGNBQ0MsU0FBUztBQUFBLGNBQ1QsWUFBWTtBQUFBLFlBQ2I7QUFBQSxVQUNEO0FBQUEsVUFDQSxZQUFZO0FBQUEsWUFDWCxTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsVUFDYjtBQUFBLFVBRUEsV0FBVztBQUFBLFVBQ1gsWUFBWTtBQUFBLFlBQ1gsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFVBQ2I7QUFBQSxVQUVBLFVBQVU7QUFBQSxVQUNWLFFBQVE7QUFBQSxZQUNQLFNBQVM7QUFBQSxZQUNULE9BQU87QUFBQSxVQUNSO0FBQUEsVUFFQSxXQUFXO0FBQUEsVUFDWCxZQUFZO0FBQUEsVUFDWixlQUFlO0FBQUEsUUFDaEI7QUFFQSxRQUFBQSxPQUFNLFVBQVUsSUFBSSxZQUFZLEVBQUUsQ0FBQyxFQUFFLFNBQVNBLE9BQU0sVUFBVTtBQUU5RCxRQUFBQSxPQUFNLFVBQVUsUUFBUUEsT0FBTSxVQUFVO0FBQUEsTUFFekMsR0FBRSxLQUFLO0FBRVAsWUFBTSxVQUFVLFdBQVcsTUFBTSxVQUFVLE9BQU8sU0FBUztBQUFBLFFBQzFELGNBQWM7QUFBQSxVQUNiLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxRQUNiO0FBQUEsUUFDQSxXQUFXO0FBQUEsUUFDWCxZQUFZO0FBQUEsTUFDYixDQUFDO0FBRUQsWUFBTSxVQUFVLGFBQWEsWUFBWSxXQUFXO0FBQUEsUUFDbkQsV0FBVztBQUFBLE1BQ1osQ0FBQztBQUVELFlBQU0sVUFBVSxhQUFhLFlBQVksVUFBVTtBQUFBLFFBQ2xELFdBQVc7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLE9BQU87QUFBQSxRQUNSO0FBQUEsTUFDRCxDQUFDO0FBRUQsWUFBTSxVQUFVLE1BQU0sTUFBTSxVQUFVO0FBRXRDLE9BQUMsU0FBVUEsUUFBTztBQUVqQixZQUFJLE9BQU87QUFBQTtBQUFBLFVBRVYsU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFVBQ1AsUUFBUTtBQUFBLFlBQ1AsZUFBZTtBQUFBLFVBQ2hCO0FBQUEsUUFDRDtBQUVBLFFBQUFBLE9BQU0sVUFBVSxlQUFlLElBQUk7QUFBQSxVQUNsQyxXQUFXO0FBQUEsWUFDVixTQUFTO0FBQUEsWUFDVCxRQUFRO0FBQUEsVUFDVDtBQUFBLFVBQ0EsVUFBVTtBQUFBLFlBQ1QsU0FBUztBQUFBLFlBQ1QsUUFBUTtBQUFBLFlBQ1IsUUFBUTtBQUFBLGNBQ1AsUUFBUTtBQUFBLFlBQ1Q7QUFBQSxVQUNEO0FBQUEsVUFDQSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBTVQsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFlBQ1osUUFBUTtBQUFBLFlBQ1IsT0FBTztBQUFBLFVBQ1I7QUFBQSxVQUNBLFlBQVk7QUFBQSxZQUNYLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLFFBQVE7QUFBQSxjQUNQLFFBQVE7QUFBQSxZQUNUO0FBQUEsVUFDRDtBQUFBLFVBQ0EsUUFBUTtBQUFBLFVBQ1IsVUFBVTtBQUFBLFVBQ1YsV0FBVztBQUFBLFVBQ1gsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFFBQ2hCO0FBRUEsUUFBQUEsT0FBTSxVQUFVLEtBQUssSUFBSUEsT0FBTSxVQUFVLGVBQWU7QUFBQSxNQUV6RCxHQUFFLEtBQUs7QUFFUCxPQUFDLFNBQVVBLFFBQU87QUFDakIsWUFBSSxnQkFBZ0I7QUFDcEIsWUFBSSxnQkFBZ0I7QUFFcEIsUUFBQUEsT0FBTSxVQUFVLE1BQU07QUFBQSxVQUNyQixXQUFXO0FBQUEsWUFDVjtBQUFBLFlBQ0E7QUFBQSxjQUNDLFNBQVM7QUFBQSxjQUNULFlBQVk7QUFBQSxjQUNaLFFBQVE7QUFBQSxZQUNUO0FBQUEsVUFDRDtBQUFBLFVBQ0EsZUFBZTtBQUFBLFlBQ2QsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFlBQ1osT0FBTztBQUFBLFlBQ1AsUUFBUTtBQUFBLGNBQ1AsZUFBZTtBQUFBLFlBQ2hCO0FBQUEsVUFDRDtBQUFBLFVBQ0EsYUFBYTtBQUFBLFlBQ1osU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFlBQ1osT0FBTztBQUFBLFVBQ1I7QUFBQSxVQUNBLFdBQVc7QUFBQSxZQUNWO0FBQUEsY0FDQyxTQUFTO0FBQUEsY0FDVCxZQUFZO0FBQUEsWUFDYjtBQUFBLFlBQ0E7QUFBQSxVQUNEO0FBQUEsVUFDQSxhQUFhO0FBQUEsWUFDWixTQUFTO0FBQUEsWUFDVCxPQUFPO0FBQUEsVUFDUjtBQUFBLFVBQ0EsWUFBWTtBQUFBLFVBQ1osWUFBWTtBQUFBLFlBQ1gsU0FBUztBQUFBLFlBQ1QsUUFBUTtBQUFBLGNBQ1AsVUFBVTtBQUFBLGdCQUNULFNBQVM7QUFBQSxnQkFDVCxRQUFRO0FBQUEsY0FDVDtBQUFBLGNBQ0EsVUFBVTtBQUFBLGNBQ1YsZUFBZTtBQUFBLFlBQ2hCO0FBQUEsVUFDRDtBQUFBLFVBQ0EsVUFBVTtBQUFBLFlBQ1QsU0FBUztBQUFBLFlBQ1QsUUFBUTtBQUFBLFVBQ1Q7QUFBQSxVQUNBLFlBQVk7QUFBQSxZQUNYO0FBQUEsWUFDQTtBQUFBLGNBQ0MsU0FBUztBQUFBLGNBQ1QsWUFBWTtBQUFBLFlBQ2I7QUFBQSxVQUNEO0FBQUEsVUFDQSxXQUFXO0FBQUEsVUFDWCxVQUFVO0FBQUEsVUFDVixZQUFZO0FBQUEsVUFDWixlQUFlO0FBQUEsUUFDaEI7QUFHQSxRQUFBQSxPQUFNLE1BQU0sSUFBSSxtQkFBbUIsU0FBVSxLQUFLO0FBQ2pELGNBQUksYUFBYTtBQUNqQixjQUFJLG1CQUFtQjtBQUN2QixjQUFJLGlCQUFpQjtBQUNyQixjQUFJLGtCQUFrQjtBQUV0QixVQUFBQSxPQUFNLFVBQVUsbUJBQW1CLEVBQUUsa0JBQWtCLEtBQUssT0FBTyxZQUFZLFNBQVUsT0FBTztBQUUvRixnQkFBSSxVQUFVLGdCQUFnQjtBQUM3QixnQ0FBa0I7QUFBQSxZQUNuQjtBQUVBLGdCQUFJLENBQUMsaUJBQWlCO0FBQ3JCLGtCQUFJLFVBQVUsa0JBQWtCO0FBQy9CLGtDQUFrQjtBQUFBLGNBQ25CO0FBRUEscUJBQU87QUFBQSxZQUNSO0FBQ0EsbUJBQU87QUFBQSxVQUNSLENBQUM7QUFBQSxRQUNGLENBQUM7QUFHRCxRQUFBQSxPQUFNLE1BQU0sSUFBSSxrQkFBa0IsU0FBVSxLQUFLO0FBQ2hELFVBQUFBLE9BQU0sVUFBVSxtQkFBbUIsRUFBRSxxQkFBcUIsS0FBSyxLQUFLO0FBQUEsUUFDckUsQ0FBQztBQUFBLE1BRUYsR0FBRSxLQUFLO0FBRVAsWUFBTSxVQUFVLFNBQVM7QUFBQSxRQUN4QixXQUFXO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxRQUFRO0FBQUEsUUFDVDtBQUFBLFFBQ0Esb0JBQW9CO0FBQUEsVUFDbkIsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFVBQ1IsT0FBTztBQUFBLFVBQ1AsUUFBUTtBQUFBLFlBQ1AsV0FBVztBQUFBLFVBQ1o7QUFBQSxRQUNEO0FBQUEsUUFDQSxVQUFVO0FBQUEsVUFDVCxTQUFTO0FBQUEsVUFDVCxRQUFRO0FBQUEsUUFDVDtBQUFBLFFBQ0EsT0FBTztBQUFBLFVBQ04sU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFVBQ1IsUUFBUTtBQUFBLFlBQ1AsZUFBZTtBQUFBLFVBQ2hCO0FBQUEsUUFDRDtBQUFBLFFBQ0EsWUFBWTtBQUFBLFVBQ1gsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFlBQ1AsY0FBYztBQUFBLGNBQ2IsU0FBUztBQUFBLGNBQ1QsWUFBWTtBQUFBLFlBQ2I7QUFBQSxZQUNBLFVBQVU7QUFBQSxjQUNULFNBQVM7QUFBQSxjQUNULFFBQVE7QUFBQSxnQkFDUCxlQUFlO0FBQUEsY0FDaEI7QUFBQSxZQUNEO0FBQUEsVUFDRDtBQUFBLFFBQ0Q7QUFBQSxRQUNBLFVBQVU7QUFBQSxRQUNWLGVBQWU7QUFBQSxRQUNmLFdBQVc7QUFBQSxRQUNYLFdBQVc7QUFBQSxVQUNWO0FBQUEsVUFDQTtBQUFBLFFBQ0Q7QUFBQSxRQUNBLE9BQU87QUFBQSxVQUNOLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxZQUNQLGVBQWU7QUFBQSxVQUNoQjtBQUFBLFFBQ0Q7QUFBQSxNQUNEO0FBQ0EsWUFBTSxVQUFVLE9BQU8sTUFBTSxVQUFVLFFBQVE7QUFFL0MsWUFBTSxVQUFVLFNBQVMsTUFBTSxVQUFVO0FBQUEsUUFBTztBQUFBLFFBQVU7QUFBQSxVQUN6RCxXQUFXO0FBQUEsVUFDWCxZQUFZO0FBQUEsWUFDWCxTQUFTO0FBQUEsWUFDVCxRQUFRO0FBQUEsVUFDVDtBQUFBLFFBQ0Q7QUFBQSxNQUNBO0FBRUEsWUFBTSxVQUFVLGFBQWEsVUFBVSxlQUFlO0FBQUEsUUFDckQsV0FBVztBQUFBLFVBQ1Y7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFFBQ0Q7QUFBQSxNQUNELENBQUM7QUFFRCxZQUFNLFVBQVUsS0FBSyxNQUFNLFVBQVU7QUFFckMsWUFBTSxVQUFVLFlBQVksSUFBSTtBQUFBLFFBQy9CLFdBQVc7QUFBQSxRQUNYLFVBQVU7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxRQUNUO0FBQUE7QUFBQSxRQUVBLFdBQVc7QUFBQSxRQUNYLGlCQUFpQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxRQUNSO0FBQUEsUUFDQSxZQUFZO0FBQUEsUUFDWixZQUFZO0FBQUEsUUFDWixRQUFRO0FBQUE7QUFBQSxVQUVQLFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxRQUNSO0FBQUEsUUFDQSxVQUFVO0FBQUEsUUFDVixXQUFXO0FBQUEsUUFDWCxZQUFZO0FBQUEsUUFDWixlQUFlO0FBQUEsTUFDaEI7QUFFQSxZQUFNLFVBQVUsTUFBTSxNQUFNLFVBQVUsT0FBTyxTQUFTO0FBQUEsUUFDckQsVUFBVTtBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFFBQ1Q7QUFBQSxRQUNBLFdBQVc7QUFBQSxRQUNYLFdBQVc7QUFBQSxRQUNYLFlBQVk7QUFBQSxRQUNaLFVBQVU7QUFBQSxRQUNWLFlBQVk7QUFBQSxRQUNaLGtCQUFrQjtBQUFBLFVBQ2pCLFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxRQUNSO0FBQUEsUUFDQSxZQUFZO0FBQUEsTUFDYixDQUFDO0FBRUQsWUFBTSxVQUFVLGFBQWEsT0FBTyxVQUFVO0FBQUEsUUFDN0MsU0FBUztBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osUUFBUTtBQUFBLFVBQ1IsT0FBTztBQUFBLFVBQ1AsUUFBUTtBQUFBLFlBQ1AsYUFBYTtBQUFBLGNBQ1osU0FBUztBQUFBLGNBQ1QsT0FBTztBQUFBLFlBQ1I7QUFBQSxZQUNBLFdBQVcsTUFBTSxVQUFVLElBQUk7QUFBQSxVQUNoQztBQUFBLFFBQ0Q7QUFBQSxNQUNELENBQUM7QUFFRCxhQUFPLE1BQU0sVUFBVSxJQUFJLFlBQVk7QUFFdkMsWUFBTSxVQUFVLFdBQVcsTUFBTSxVQUFVLE9BQU8sU0FBUztBQUFBLFFBQzFELFdBQVc7QUFBQSxVQUNWLE1BQU0sVUFBVSxNQUFNLFNBQVMsRUFBRSxDQUFDO0FBQUEsVUFDbEM7QUFBQSxZQUNDLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLFFBQVE7QUFBQSxVQUNUO0FBQUEsUUFDRDtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osUUFBUTtBQUFBLFFBQ1Q7QUFBQSxRQUVBLGNBQWM7QUFBQSxVQUNiLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLFFBQVE7QUFBQSxZQUNQLGVBQWU7QUFBQSxVQUNoQjtBQUFBLFFBQ0Q7QUFBQSxRQUNBLFdBQVc7QUFBQSxRQUVYLFVBQVU7QUFBQSxRQUNWLFlBQVk7QUFBQSxRQUNaLGVBQWU7QUFBQSxNQUNoQixDQUFDO0FBRUQsWUFBTSxVQUFVLGFBQWEsWUFBWSxVQUFVO0FBQUEsUUFDbEQsUUFBUTtBQUFBLFVBQ1AsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osUUFBUTtBQUFBLFFBQ1Q7QUFBQSxNQUNELENBQUM7QUFFRCxZQUFNLFVBQVUsYUFBYSxZQUFZLFlBQVk7QUFBQSxRQUNwRCx5QkFBeUI7QUFBQSxVQUN4QixTQUFTO0FBQUEsVUFDVCxPQUFPO0FBQUEsUUFDUjtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFFBQ1I7QUFBQSxNQUNELENBQUM7QUFFRCxPQUFDLFNBQVVBLFFBQU87QUFJakIsWUFBSSx1QkFBdUI7QUFFM0IsUUFBQUEsT0FBTSxVQUFVLE9BQU87QUFBQSxVQUN0QixXQUFXO0FBQUEsVUFDWCxVQUFVO0FBQUE7QUFBQTtBQUFBLFlBR1QsU0FBUztBQUFBLFlBQ1QsUUFBUTtBQUFBLFVBQ1Q7QUFBQSxVQUNBLGFBQWE7QUFBQSxZQUNaLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLE9BQU87QUFBQSxVQUNSO0FBQUEsVUFFQSxnQkFBZ0I7QUFBQSxZQUNmLFNBQVM7QUFBQSxjQUNSLE1BQ0EscUJBQXFCLFNBQ3JCLFdBQVcsU0FDWCxNQUNBLGNBQWM7QUFBQSxZQUNmO0FBQUEsWUFDQSxZQUFZO0FBQUEsWUFDWixPQUFPO0FBQUEsVUFDUjtBQUFBLFVBQ0EsY0FBYztBQUFBLFlBQ2IsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFlBQ1osUUFBUTtBQUFBLGNBQ1AsY0FBYztBQUFBLGdCQUNiLFNBQVM7QUFBQSxnQkFDVCxZQUFZO0FBQUEsZ0JBQ1osUUFBUTtBQUFBO0FBQUEsY0FDVDtBQUFBLGNBQ0EsWUFBWTtBQUFBLGNBQ1osWUFBWTtBQUFBLGNBQ1osZUFBZTtBQUFBLFlBQ2hCO0FBQUEsVUFDRDtBQUFBLFVBQ0EsV0FBVztBQUFBLFlBQ1Y7QUFBQSxjQUNDLFNBQVM7QUFBQSxjQUNULE9BQU87QUFBQSxZQUNSO0FBQUEsWUFDQTtBQUFBO0FBQUEsWUFFQTtBQUFBLFVBQ0Q7QUFBQSxVQUNBLFlBQVk7QUFBQSxVQUNaLFVBQVU7QUFBQSxVQUNWLFdBQVc7QUFBQSxVQUVYLFlBQVk7QUFBQSxVQUNaLGVBQWU7QUFBQSxRQUNoQjtBQUVBLFFBQUFBLE9BQU0sVUFBVSxLQUFLLFdBQVcsT0FBTyxXQUFXLFNBQVNBLE9BQU0sVUFBVTtBQUFBLE1BRTVFLEdBQUUsS0FBSztBQUtQLFlBQU0sVUFBVSxRQUFRO0FBQUEsUUFDdkIsV0FBVztBQUFBLFVBQ1Y7QUFBQSxZQUNDLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLFFBQVE7QUFBQSxVQUNUO0FBQUEsVUFDQTtBQUFBLFlBQ0MsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFlBQ1osUUFBUTtBQUFBLFVBQ1Q7QUFBQSxRQUNEO0FBQUEsUUFDQSxrQkFBa0I7QUFBQSxVQUNqQixTQUFTO0FBQUEsVUFDVCxRQUFRO0FBQUEsVUFDUixRQUFRO0FBQUEsWUFDUCxpQkFBaUI7QUFBQSxjQUNoQixTQUFTO0FBQUEsY0FDVCxRQUFRO0FBQUEsZ0JBQ1AsZUFBZTtBQUFBLGdCQUNmLGNBQWM7QUFBQSxrQkFDYixTQUFTO0FBQUEsa0JBQ1QsUUFBUTtBQUFBO0FBQUEsZ0JBQ1Q7QUFBQSxjQUNEO0FBQUEsWUFDRDtBQUFBLFlBQ0EsVUFBVTtBQUFBLFVBQ1g7QUFBQSxRQUNEO0FBQUEsUUFFQSxRQUFRO0FBQUEsVUFDUCxTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsVUFDWixRQUFRO0FBQUEsVUFDUixPQUFPO0FBQUEsVUFDUCxRQUFRLE1BQU0sVUFBVTtBQUFBLFFBQ3pCO0FBQUEsUUFDQSxRQUFRO0FBQUEsVUFDUCxTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsVUFDWixRQUFRO0FBQUEsVUFDUixPQUFPO0FBQUEsVUFDUCxRQUFRLE1BQU0sVUFBVTtBQUFBLFFBQ3pCO0FBQUEsUUFDQSxVQUFVO0FBQUEsVUFDVCxTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsVUFDWixRQUFRO0FBQUEsVUFDUixPQUFPO0FBQUEsVUFDUCxRQUFRLE1BQU0sVUFBVTtBQUFBLFFBQ3pCO0FBQUEsUUFHQSxXQUFXO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsVUFDWixRQUFRO0FBQUEsVUFDUixPQUFPO0FBQUEsUUFDUjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFFBQ1osV0FBVztBQUFBLFFBR1gsV0FBVztBQUFBLFFBQ1gsVUFBVTtBQUFBLFFBQ1YsWUFBWTtBQUFBLFFBRVosWUFBWTtBQUFBLFFBQ1osZUFBZTtBQUFBLE1BQ2hCO0FBRUEsWUFBTSxVQUFVLE1BQU0sZ0JBQWdCLEVBQUUsT0FBTyxjQUFjLE9BQU8sV0FBVyxTQUFTLE1BQU0sVUFBVTtBQUV4RyxZQUFNLFVBQVUsUUFBUTtBQUFBLFFBQ3ZCLFdBQVc7QUFBQSxVQUNWO0FBQUEsWUFDQyxTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsWUFDWixRQUFRO0FBQUEsVUFDVDtBQUFBLFVBQ0E7QUFBQSxZQUNDLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLFFBQVE7QUFBQSxVQUNUO0FBQUEsUUFDRDtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFFBQ1Q7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNWO0FBQUEsVUFDQTtBQUFBLFFBQ0Q7QUFBQSxRQUNBLGNBQWM7QUFBQSxRQUNkLFdBQVc7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxRQUNSO0FBQUEsUUFDQSxVQUFVO0FBQUEsUUFDVixXQUFXO0FBQUEsUUFDWCxZQUFZO0FBQUEsUUFDWixZQUFZO0FBQUEsUUFDWixlQUFlO0FBQUEsTUFDaEI7QUFFQSxPQUFDLFNBQVVBLFFBQU87QUFDakIsWUFBSSxPQUFPO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsUUFDYjtBQUVBLFlBQUksU0FBUztBQUFBLFVBQ1osU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFFBQ2I7QUFFQSxZQUFJLFNBQVM7QUFBQSxVQUNaLFdBQVc7QUFBQSxZQUNWLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxVQUNiO0FBQUEsVUFDQSxPQUFPO0FBQUEsWUFDTixTQUFTO0FBQUEsWUFDVCxRQUFRO0FBQUEsVUFDVDtBQUFBLFVBQ0EsVUFBVTtBQUFBLFlBQ1QsU0FBUztBQUFBLFlBQ1QsUUFBUTtBQUFBLFVBQ1Q7QUFBQSxVQUNBLGlCQUFpQjtBQUFBO0FBQUEsVUFDakIsUUFBUTtBQUFBO0FBQUEsVUFDUixhQUFhO0FBQUEsVUFDYixXQUFXO0FBQUEsWUFDVixTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsVUFDYjtBQUFBLFVBQ0EsV0FBVztBQUFBLFVBQ1gsU0FBUztBQUFBLFlBQ1I7QUFBQSxZQUNBO0FBQUEsY0FDQyxTQUFTO0FBQUEsY0FDVCxRQUFRO0FBQUEsZ0JBQ1AsUUFBUTtBQUFBLGdCQUNSLFVBQVU7QUFBQSxnQkFDVixZQUFZO0FBQUEsZ0JBQ1osZUFBZTtBQUFBLGNBQ2hCO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFBQSxVQUNBLFVBQVU7QUFBQSxVQUNWLFFBQVE7QUFBQSxVQUNSLFdBQVc7QUFBQSxVQUNYLFlBQVk7QUFBQTtBQUFBO0FBQUEsWUFHWDtBQUFBLFVBQ0Q7QUFBQSxVQUNBLFVBQVU7QUFBQSxVQUNWLGVBQWU7QUFBQSxRQUNoQjtBQUVBLGVBQU8sZUFBZSxJQUFJO0FBQUEsVUFDekIsU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFVBQ1AsUUFBUTtBQUFBLFlBQ1AsYUFBYTtBQUFBLGNBQ1osU0FBUztBQUFBLGNBQ1QsT0FBTztBQUFBLFlBQ1I7QUFBQSxZQUNBLE1BQU07QUFBQSxVQUNQO0FBQUEsUUFDRDtBQUNBLGVBQU8sTUFBTSxJQUFJO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFlBQ1AsWUFBWTtBQUFBLFlBQ1osTUFBTTtBQUFBLFVBQ1A7QUFBQSxRQUNEO0FBRUEsUUFBQUEsT0FBTSxVQUFVLFNBQVM7QUFBQSxVQUN4QixzQkFBc0I7QUFBQSxZQUNyQixTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsWUFDWixRQUFRO0FBQUEsY0FDUCxVQUFVO0FBQUEsY0FDVixNQUFNO0FBQUEsWUFDUDtBQUFBLFVBQ0Q7QUFBQSxVQUNBLHdCQUF3QjtBQUFBLFlBQ3ZCLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLFFBQVE7QUFBQSxjQUNQLFlBQVk7QUFBQSxjQUNaLE1BQU07QUFBQSxZQUNQO0FBQUEsVUFDRDtBQUFBLFVBRUEsYUFBYTtBQUFBLFlBQ1osU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFlBQ1osUUFBUTtBQUFBLGNBQ1AsV0FBVztBQUFBLGNBQ1gsTUFBTTtBQUFBLFlBQ1A7QUFBQSxVQUNEO0FBQUE7QUFBQTtBQUFBLFVBSUEsd0JBQXdCO0FBQUEsWUFDdkIsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFlBQ1osUUFBUTtBQUFBLGNBQ1AsWUFBWTtBQUFBLGdCQUNYLFNBQVM7QUFBQSxnQkFDVCxRQUFRO0FBQUEsa0JBQ1AsaUJBQWlCLE9BQU87QUFBQSxnQkFDekI7QUFBQSxjQUNEO0FBQUEsY0FDQSxNQUFNO0FBQUEsWUFDUDtBQUFBLFVBQ0Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQU1BLFlBQVk7QUFBQSxZQUNYLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLFFBQVE7QUFBQSxjQUNQLGlCQUFpQixPQUFPO0FBQUEsY0FDeEIsV0FBVyxPQUFPO0FBQUEsY0FDbEIsZUFBZTtBQUFBLFlBQ2hCO0FBQUEsVUFDRDtBQUFBLFVBRUEsUUFBUSxPQUFPO0FBQUEsVUFDZixVQUFVLE9BQU87QUFBQSxVQUNqQixXQUFXO0FBQUEsWUFDVixTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsWUFDWixRQUFRO0FBQUEsVUFDVDtBQUFBLFVBQ0EsaUJBQWlCLE9BQU87QUFBQSxVQUN4QixlQUFlO0FBQUEsUUFDaEI7QUFBQSxNQUNELEdBQUUsS0FBSztBQUVQLFlBQU0sVUFBVSxnQkFBZ0I7QUFBQSxRQUMvQixXQUFXO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxRQUFRO0FBQUEsUUFDVDtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osUUFBUTtBQUFBLFFBQ1Q7QUFBQSxRQUNBLFFBQVE7QUFBQSxVQUNQLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxRQUNUO0FBQUEsUUFDQSxVQUFVO0FBQUEsVUFDVCxTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsVUFDWixRQUFRO0FBQUEsUUFDVDtBQUFBLFFBRUEsV0FBVztBQUFBLFFBQ1gsV0FBVztBQUFBLFFBRVgsU0FBUztBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFFBQ1I7QUFBQSxRQUVBLFVBQVU7QUFBQSxRQUNWLGNBQWM7QUFBQSxRQUVkLFlBQVk7QUFBQSxRQUNaLGVBQWU7QUFBQSxNQUNoQjtBQUVBLFlBQU0sVUFBVSxTQUFTLE1BQU0sVUFBVTtBQUV6QyxZQUFNLFVBQVUsUUFBUTtBQUFBLFFBQ3ZCLFdBQVc7QUFBQTtBQUFBLFVBRVYsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osUUFBUTtBQUFBLFFBQ1Q7QUFBQSxRQUNBLGtCQUFrQjtBQUFBO0FBQUEsVUFFakI7QUFBQSxZQUNDLFNBQVM7QUFBQSxjQUNSLFlBQVksU0FDVixRQUVBLDhEQUE4RCxTQUM5RCxNQUVBLGlFQUFpRSxTQUNqRSxNQUNBLFdBQVc7QUFBQSxZQUNkO0FBQUEsWUFDQSxZQUFZO0FBQUEsWUFDWixRQUFRO0FBQUEsWUFDUixRQUFRO0FBQUEsY0FDUCxpQkFBaUI7QUFBQSxnQkFDaEIsU0FBUztBQUFBLGdCQUNULFlBQVk7QUFBQSxnQkFDWixRQUFRO0FBQUE7QUFBQSxjQUNUO0FBQUEsY0FDQSw2QkFBNkI7QUFBQSxnQkFDNUIsU0FBUztBQUFBLGdCQUNULE9BQU87QUFBQSxjQUNSO0FBQUEsY0FDQSxlQUFlO0FBQUEsY0FDZixVQUFVO0FBQUEsWUFDWDtBQUFBLFVBQ0Q7QUFBQSxVQUNBO0FBQUEsWUFDQyxTQUFTO0FBQUEsY0FDUixnQkFBZ0IsU0FDZCxRQUVBLGdFQUFnRSxTQUNoRSxNQUVBLDJEQUEyRCxTQUMzRDtBQUFBLFlBRUg7QUFBQSxZQUNBLFlBQVk7QUFBQSxZQUNaLFFBQVE7QUFBQSxZQUNSLFFBQVE7QUFBQSxjQUNQLGlCQUFpQjtBQUFBLGdCQUNoQixTQUFTO0FBQUEsZ0JBQ1QsWUFBWTtBQUFBLGdCQUNaLFFBQVE7QUFBQTtBQUFBLGNBQ1Q7QUFBQSxjQUNBLDZCQUE2QjtBQUFBLGdCQUM1QixTQUFTO0FBQUEsZ0JBQ1QsT0FBTztBQUFBLGNBQ1I7QUFBQSxjQUNBLFVBQVU7QUFBQSxZQUNYO0FBQUEsVUFDRDtBQUFBLFFBQ0Q7QUFBQSxRQUVBLGFBQWE7QUFBQTtBQUFBLFVBRVosU0FBUztBQUFBLFlBQ1IsSUFBSSxTQUNGLFNBRUQsa0JBQWtCLFNBQ2hCLGFBSUEsOEdBQThHLFNBQzlHLFFBRUQsTUFDQSxtQkFBbUIsU0FDbkI7QUFBQSxVQUNIO0FBQUEsVUFDQSxPQUFPO0FBQUEsVUFDUCxRQUFRO0FBQUEsWUFDUCxrQkFBa0I7QUFBQSxZQUNsQixXQUFXO0FBQUEsWUFDWCxVQUFVO0FBQUEsWUFDVixZQUFZO0FBQUEsWUFDWixlQUFlO0FBQUEsVUFDaEI7QUFBQSxRQUNEO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxPQUFPO0FBQUEsUUFDUjtBQUFBLFFBQ0EsbUJBQW1CO0FBQUEsVUFDbEIsU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFFBQ1I7QUFBQSxRQUVBLGFBQWE7QUFBQSxVQUNaLFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxRQUNSO0FBQUEsUUFFQSx1QkFBdUI7QUFBQSxVQUN0QixTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsVUFDWixPQUFPO0FBQUEsUUFDUjtBQUFBLFFBQ0EsU0FBUztBQUFBO0FBQUEsVUFFUixTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsVUFDWixPQUFPO0FBQUEsUUFDUjtBQUFBLFFBRUEsV0FBVztBQUFBLFFBQ1gsV0FBVztBQUFBLFFBQ1gsT0FBTztBQUFBLFVBQ04sU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFFBQ1I7QUFBQSxRQUVBLGtCQUFrQjtBQUFBLFFBQ2xCLFFBQVE7QUFBQSxVQUNQLFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxRQUNSO0FBQUEsUUFDQSxVQUFVO0FBQUE7QUFBQSxRQUdWLGNBQWM7QUFBQSxRQUNkLFlBQVk7QUFBQSxRQUNaLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUtaLFlBQVk7QUFBQSxRQUNaLGVBQWU7QUFBQSxNQUNoQjtBQUVBLFlBQU0sVUFBVSxNQUFNLGdCQUFnQixFQUFFLFFBQVEsU0FBVSxNQUFNO0FBQy9ELGFBQUssT0FBTyxlQUFlLEVBQUUsU0FBUyxNQUFNLFVBQVU7QUFBQSxNQUN2RCxDQUFDO0FBSUQsT0FBQyxTQUFVQSxRQUFPO0FBRWpCLFlBQUksVUFBVTtBQUFBLFVBQ2IsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFFBQ1Q7QUFFQSxZQUFJLGVBQWUsNENBQTRDO0FBRS9ELFFBQUFBLE9BQU0sVUFBVSxVQUFVO0FBQUEsVUFDekIsV0FBVztBQUFBLFVBRVgsV0FBVztBQUFBLFlBQ1YsU0FBUztBQUFBLFlBQ1QsUUFBUTtBQUFBLFlBQ1IsUUFBUTtBQUFBLGNBQ1AsZUFBZTtBQUFBLGNBQ2YsZ0JBQWdCO0FBQUEsZ0JBQ2YsU0FBUztBQUFBLGdCQUNULE9BQU87QUFBQSxjQUNSO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFBQSxVQUVBLE9BQU87QUFBQSxZQUNOLFNBQVM7QUFBQSxZQUNULFFBQVE7QUFBQSxZQUNSLE9BQU87QUFBQSxVQUNSO0FBQUEsVUFDQSxTQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBTVIsU0FBUztBQUFBLGNBQ1Isa0JBQWtCO0FBQUEsY0FFbEIsUUFBUSxlQUFlLHVCQUd0QixVQUFVO0FBQUEsY0FFVix3QkFBK0IsZUFBZSxPQUV4QyxzQ0FBc0MsVUFFN0M7QUFBQSxZQUNEO0FBQUEsWUFDQSxZQUFZO0FBQUEsWUFDWixRQUFRO0FBQUEsWUFDUixPQUFPO0FBQUEsWUFDUCxRQUFRO0FBQUEsY0FDUCxXQUFXO0FBQUEsY0FDWCxVQUFVO0FBQUEsZ0JBQ1QsU0FBUyxPQUFPLFNBQVMsU0FBUyxZQUFZO0FBQUEsZ0JBQzlDLFlBQVk7QUFBQSxnQkFDWixRQUFRO0FBQUEsY0FDVDtBQUFBLGNBQ0EsZUFBZTtBQUFBLGNBRWYsV0FBVztBQUFBLGdCQUNWLFNBQVM7QUFBQSxnQkFDVCxRQUFRO0FBQUEsY0FDVDtBQUFBLFlBQ0Q7QUFBQSxVQUNEO0FBQUEsVUFFQSxlQUFlO0FBQUEsUUFDaEI7QUFBQSxNQUVELEdBQUUsS0FBSztBQUVQLE9BQUMsU0FBVUEsUUFBTztBQUVqQixpQkFBUyxZQUFZLFFBQVEsUUFBUSxjQUFjO0FBQ2xELGlCQUFPO0FBQUEsWUFDTixTQUFTLE9BQU8sT0FBTyxTQUFTLGNBQWM7QUFBQSxZQUM5QyxPQUFPO0FBQUEsWUFDUCxRQUFRO0FBQUEsY0FDUCxhQUFhO0FBQUEsZ0JBQ1osU0FBUyxPQUFPLFFBQVEsU0FBUyxNQUFNO0FBQUEsZ0JBQ3ZDLE9BQU87QUFBQSxjQUNSO0FBQUEsY0FDQSxXQUFXO0FBQUEsZ0JBQ1YsU0FBUztBQUFBLGdCQUNUO0FBQUEsZ0JBQ0EsT0FBTztBQUFBLGNBQ1I7QUFBQSxZQUNEO0FBQUEsVUFDRDtBQUFBLFFBQ0Q7QUFFQSxpQkFBUyxTQUFTLFlBQVk7QUFDN0IsY0FBSSxVQUFVQSxPQUFNLFVBQVUsVUFBVTtBQUN4QyxjQUFJLFlBQVksY0FBYztBQUU5QixpQkFBTztBQUFBLFlBQ04sU0FBUztBQUFBLGNBQ1IsU0FBUztBQUFBLGNBQ1QsUUFBUTtBQUFBLGdCQUNQLGFBQWEsWUFBWSxLQUFLO0FBQUEsa0JBQzdCLGNBQWM7QUFBQSxvQkFDYixTQUFTO0FBQUEsb0JBQ1QsUUFBUTtBQUFBLHNCQUNQLGVBQWU7QUFBQSxvQkFDaEI7QUFBQSxrQkFDRDtBQUFBLGtCQUNBLFdBQVc7QUFBQSxrQkFDWCxhQUFhO0FBQUEsZ0JBQ2QsQ0FBQztBQUFBLGdCQUNELGNBQWMsWUFBWSxLQUFLLFNBQVMsU0FBUztBQUFBLGdCQUNqRCxpQkFBaUIsWUFBWSxPQUFPLFNBQVMsU0FBUztBQUFBLGdCQUN0RCxZQUFZLFlBQVksSUFBSSxTQUFTLFNBQVM7QUFBQSxjQUMvQztBQUFBLFlBQ0Q7QUFBQSxVQUNEO0FBQUEsUUFDRDtBQUVBLFFBQUFBLE9BQU0sVUFBVSxlQUFlLElBQUksT0FBTyxlQUFlLENBQUMsR0FBRyxZQUFZLEVBQUUsT0FBTyxTQUFTLENBQUM7QUFBQSxNQUU3RixHQUFFLEtBQUs7QUFFUCxZQUFNLFVBQVUsS0FBSyxNQUFNLFVBQVUsT0FBTyxJQUFJLE1BQU0sVUFBVSxlQUFlLEVBQUUsU0FBUyxRQUFRO0FBRWxHLFlBQU0sVUFBVSxRQUFRLE1BQU0sVUFBVSxPQUFPLFNBQVM7QUFBQSxRQUN2RCxXQUFXO0FBQUEsVUFDVjtBQUFBLFlBQ0MsU0FBUztBQUFBLFlBQ1QsUUFBUTtBQUFBLGNBQ1AsV0FBVztBQUFBLFlBQ1o7QUFBQSxVQUNEO0FBQUEsVUFDQTtBQUFBLFlBQ0MsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFlBQ1osUUFBUTtBQUFBLFVBQ1Q7QUFBQSxRQUNEO0FBQUEsUUFDQSxVQUFVO0FBQUEsVUFDVCxTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsVUFDWixRQUFRO0FBQUEsUUFDVDtBQUFBLFFBQ0EsV0FBVztBQUFBLFFBQ1gsZUFBZTtBQUFBLE1BQ2hCLENBQUM7QUFFRCxZQUFNLFVBQVUsT0FBTyxJQUFJLE1BQU0sVUFBVSxlQUFlLEVBQUUsU0FBUyxPQUFPO0FBRTVFLE9BQUMsU0FBVUEsUUFBTztBQUlqQixZQUFJLGdCQUFnQjtBQUVwQixZQUFJLE1BQU07QUFFVixZQUFJLGFBQWEsUUFBUSxJQUFJLFNBQVMsYUFBYyxjQUFjLFNBQVMsUUFDeEUsY0FBYyxTQUFTLGFBQWMsSUFBSSxTQUFTO0FBSXJELFlBQUksV0FBVyxrSkFBa0osT0FDL0osUUFBUSxZQUFZLFdBQVk7QUFBRSxpQkFBTywyRUFBMkU7QUFBQSxRQUFRLENBQUM7QUFDL0gsWUFBSSxTQUFTLDhDQUE4QztBQVEzRCxpQkFBUyxtQkFBbUIsT0FBTyxPQUFPO0FBQ3pDLG1CQUFTLFNBQVMsSUFBSSxRQUFRLE1BQU0sRUFBRSxJQUFJO0FBQzFDLGNBQUksVUFBVSx5RkFBeUYsT0FDckcsUUFBUSxhQUFhLFdBQVk7QUFBRSxtQkFBTztBQUFBLFVBQVksQ0FBQyxFQUFFLFFBQVEsY0FBYyxXQUFZO0FBQUUsbUJBQU87QUFBQSxVQUFPLENBQUM7QUFDOUcsaUJBQU8sT0FBTyxTQUFTLEtBQUs7QUFBQSxRQUM3QjtBQUVBLFFBQUFBLE9BQU0sVUFBVSxPQUFPO0FBQUEsVUFDdEIsVUFBVTtBQUFBLFlBQ1QsU0FBUyxPQUFPLDZGQUE2RixPQUMzRyxRQUFRLGFBQWEsV0FBWTtBQUFFLHFCQUFPO0FBQUEsWUFBWSxDQUFDLENBQUM7QUFBQSxZQUMxRCxZQUFZO0FBQUEsWUFDWixPQUFPO0FBQUEsVUFDUjtBQUFBLFVBQ0EsV0FBVztBQUFBLFVBQ1gsT0FBTztBQUFBLFlBQ04sU0FBUyxPQUFPLGtFQUFrRSxPQUNoRixRQUFRLGFBQWEsV0FBWTtBQUFFLHFCQUFPO0FBQUEsWUFBWSxDQUFDLEVBQ3ZELFFBQVEsWUFBWSxXQUFZO0FBQUUscUJBQU8sUUFBUSxXQUFXLE1BQU0sU0FBUztBQUFBLFlBQUssQ0FBQyxDQUFDO0FBQUEsWUFDcEYsWUFBWTtBQUFBLFlBQ1osUUFBUTtBQUFBLFlBQ1IsT0FBTztBQUFBLFVBQ1I7QUFBQSxVQUNBLGFBQWE7QUFBQSxZQUNaLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLE9BQU87QUFBQSxVQUNSO0FBQUEsVUFDQSxZQUFZO0FBQUEsWUFDWCxTQUFTLG1CQUFtQixzSkFBc0osTUFBTTtBQUFBLFlBQ3hMLFlBQVk7QUFBQSxZQUNaLE9BQU87QUFBQSxVQUNSO0FBQUEsVUFDQSxXQUFXO0FBQUEsWUFDVixTQUFTLG1CQUFtQixhQUFhLFFBQVEsR0FBRztBQUFBLFlBQ3BELFlBQVk7QUFBQSxZQUNaLE9BQU87QUFBQSxVQUNSO0FBQUEsVUFDQSxRQUFRO0FBQUEsWUFDUCxTQUFTLG1CQUFtQixTQUFTLFFBQVEsR0FBRztBQUFBLFlBQ2hELFlBQVk7QUFBQSxZQUNaLE9BQU87QUFBQSxVQUNSO0FBQUEsVUFDQSxVQUFVO0FBQUEsWUFDVCxTQUFTLG1CQUFtQixNQUFNO0FBQUEsWUFDbEMsWUFBWTtBQUFBLFlBQ1osUUFBUTtBQUFBLFVBQ1Q7QUFBQSxVQUNBLFVBQVU7QUFBQSxZQUNULFNBQVMsbUJBQW1CLGlGQUFpRixRQUFRLEdBQUc7QUFBQSxZQUN4SCxZQUFZO0FBQUEsVUFDYjtBQUFBLFVBQ0EsT0FBTztBQUFBLFVBQ1AsYUFBYTtBQUFBLFVBQ2IsZUFBZTtBQUFBLFFBQ2hCO0FBRUEsUUFBQUEsT0FBTSxVQUFVLE1BQU1BLE9BQU0sVUFBVTtBQUFBLE1BRXZDLEdBQUUsS0FBSztBQUlQLFlBQU0sVUFBVSxNQUFNO0FBQUEsUUFDckIsUUFBUTtBQUFBLFFBQ1IsUUFBUTtBQUFBLFFBQ1IsVUFBVTtBQUFBLFFBQ1YsV0FBVztBQUFBLFFBQ1gsV0FBVztBQUFBLFFBQ1gsUUFBUTtBQUFBLFFBQ1IsV0FBVztBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFFBQ1Q7QUFBQSxRQUNBLGVBQWU7QUFBQSxRQUNmLGFBQWE7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLFFBQVEsTUFBTSxVQUFVO0FBQUEsVUFDeEIsT0FBTztBQUFBLFFBQ1I7QUFBQSxNQUNEO0FBRUEsWUFBTSxVQUFVLE1BQU07QUFBQSxRQUNyQixXQUFXO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsUUFDYjtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFFBQ1Q7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNYO0FBQUEsWUFDQyxTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsVUFDYjtBQUFBLFVBQ0E7QUFBQSxZQUNDLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxVQUNiO0FBQUEsVUFDQTtBQUFBLFlBQ0MsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFVBQ2I7QUFBQSxRQUNEO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDWCxTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsUUFDYjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1Y7QUFBQSxZQUNDLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxVQUNiO0FBQUEsVUFDQTtBQUFBLFFBQ0Q7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLE9BQU87QUFBQSxRQUNSO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsUUFDYjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFFBQ1osZUFBZTtBQUFBLE1BQ2hCO0FBRUEsT0FBQyxTQUFVQSxRQUFPO0FBRWpCLFFBQUFBLE9BQU0sVUFBVSxNQUFNQSxPQUFNLFVBQVUsT0FBTyxTQUFTO0FBQUEsVUFDckQsV0FBVztBQUFBLFVBQ1gsV0FBVztBQUFBLFVBQ1gsZUFBZTtBQUFBLFFBQ2hCLENBQUM7QUFFRCxRQUFBQSxPQUFNLFVBQVUsYUFBYSxPQUFPLFVBQVU7QUFBQSxVQUM3QyxZQUFZO0FBQUEsVUFDWixZQUFZO0FBQUEsWUFDWCxTQUFTO0FBQUEsVUFDVjtBQUFBLFFBQ0QsQ0FBQztBQUVELFFBQUFBLE9BQU0sVUFBVSxhQUFhLE9BQU8sV0FBVztBQUFBLFVBQzlDLGFBQWE7QUFBQSxZQUNaLFNBQVM7QUFBQSxZQUNULE9BQU87QUFBQSxVQUNSO0FBQUEsUUFDRCxDQUFDO0FBRUQsUUFBQUEsT0FBTSxVQUFVLGFBQWEsT0FBTyxVQUFVO0FBQUEsVUFDN0Msd0JBQXdCO0FBQUEsWUFDdkIsU0FBUztBQUFBLFlBQ1QsUUFBUTtBQUFBLFlBQ1IsT0FBTztBQUFBLFVBQ1I7QUFBQSxVQUNBLHdCQUF3QjtBQUFBLFlBQ3ZCLFNBQVM7QUFBQSxZQUNULFFBQVE7QUFBQSxZQUNSLE9BQU87QUFBQSxZQUNQLFFBQVE7QUFBQSxjQUNQLFlBQVk7QUFBQSxnQkFDWCxTQUFTO0FBQUEsY0FDVjtBQUFBLFlBQ0Q7QUFBQSxVQUNEO0FBQUEsUUFDRCxDQUFDO0FBR0QsZUFBT0EsT0FBTSxVQUFVLElBQUk7QUFFM0IsUUFBQUEsT0FBTSxNQUFNLElBQUksbUJBQW1CLFNBQVUsS0FBSztBQUNqRCxjQUFJLGFBQWE7QUFDakIsVUFBQUEsT0FBTSxVQUFVLG1CQUFtQixFQUFFLGtCQUFrQixLQUFLLE9BQU8sVUFBVTtBQUFBLFFBQzlFLENBQUM7QUFFRCxRQUFBQSxPQUFNLE1BQU0sSUFBSSxrQkFBa0IsU0FBVSxLQUFLO0FBQ2hELFVBQUFBLE9BQU0sVUFBVSxtQkFBbUIsRUFBRSxxQkFBcUIsS0FBSyxLQUFLO0FBQUEsUUFDckUsQ0FBQztBQUFBLE1BRUYsR0FBRSxLQUFLO0FBRVAsT0FBQyxTQUFVQSxRQUFPO0FBR2pCLFlBQUksZ0JBQWdCLHlDQUF5QztBQUc3RCxZQUFJLG1CQUFtQix1QkFBdUI7QUFLOUMsaUJBQVMsYUFBYSxRQUFRLE9BQU87QUFDcEMsaUJBQU87QUFBQSxZQUNOLE9BQ0UsUUFBUSxVQUFVLFdBQVk7QUFBRSxxQkFBTyxRQUFRLGdCQUFnQjtBQUFBLFlBQUssQ0FBQyxFQUNyRSxRQUFRLFVBQVUsV0FBWTtBQUFFLHFCQUFPLFFBQVEsbUJBQW1CO0FBQUEsWUFBSyxDQUFDO0FBQUEsWUFDMUUsU0FBUztBQUFBLFVBQUU7QUFBQSxRQUNiO0FBRUEsWUFBSSxpQkFBaUI7QUFBQSxVQUNwQixPQUFPO0FBQUEsWUFDTixTQUFTO0FBQUEsWUFDVCxRQUFRO0FBQUEsY0FDUCxNQUFNQSxPQUFNLFVBQVU7QUFBQSxZQUN2QjtBQUFBLFVBQ0Q7QUFBQSxVQUNBLFlBQVk7QUFBQSxZQUNYLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLE9BQU87QUFBQSxVQUNSO0FBQUEsVUFDQSxRQUFRO0FBQUEsWUFDUCxTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsWUFDWixPQUFPO0FBQUEsVUFDUjtBQUFBO0FBQUEsVUFFQSxlQUFlO0FBQUEsUUFDaEI7QUFHQSxZQUFJLFVBQVVBLE9BQU0sVUFBVSxVQUFVQSxPQUFNLFVBQVUsT0FBTyxVQUFVO0FBQUEsVUFDeEUsVUFBVTtBQUFBLFlBQ1QsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFlBQ1osUUFBUTtBQUFBO0FBQUEsY0FHUCxhQUFhO0FBQUEsZ0JBQ1osU0FBUyxhQUFhLG9DQUFvQyxNQUFNO0FBQUEsZ0JBQ2hFLFFBQVE7QUFBQSxrQkFDUCxZQUFZO0FBQUEsb0JBQ1gsU0FBUyxhQUFhLDBDQUEwQyxNQUFNO0FBQUEsb0JBQ3RFLFlBQVk7QUFBQSxvQkFDWixRQUFRO0FBQUEsa0JBQ1Q7QUFBQSxrQkFDQSxPQUFPO0FBQUEsa0JBQ1AsZUFBZTtBQUFBLGdCQUNoQjtBQUFBLGNBQ0Q7QUFBQTtBQUFBO0FBQUEsY0FJQSxRQUFRO0FBQUEsZ0JBQ1AsU0FBUyxhQUFhLHNCQUFzQixRQUFRLEdBQUc7QUFBQSxnQkFDdkQsUUFBUTtBQUFBLGtCQUNQLFlBQVk7QUFBQSxvQkFDWCxTQUFTLGFBQWEsaUJBQWlCLE1BQU07QUFBQSxvQkFDN0MsWUFBWTtBQUFBLG9CQUNaLFFBQVE7QUFBQSxrQkFDVDtBQUFBLGtCQUNBLGVBQWU7QUFBQSxnQkFDaEI7QUFBQSxjQUNEO0FBQUE7QUFBQSxjQUdBLFNBQVM7QUFBQTtBQUFBO0FBQUEsZ0JBR1IsU0FBUyxhQUFhLHFJQUFxSSxRQUFRLEdBQUc7QUFBQSxnQkFDdEssUUFBUTtBQUFBLGtCQUNQLFlBQVk7QUFBQTtBQUFBO0FBQUEsb0JBR1gsU0FBUyxhQUFhLDhEQUE4RCxNQUFNO0FBQUEsb0JBQzFGLFlBQVk7QUFBQSxvQkFDWixRQUFRO0FBQUEsa0JBQ1Q7QUFBQSxrQkFDQSxlQUFlO0FBQUEsZ0JBQ2hCO0FBQUEsY0FDRDtBQUFBLGNBRUEsVUFBVTtBQUFBO0FBQUEsZ0JBRVQsU0FBUyxhQUFhLHFFQUFxRSxNQUFNO0FBQUEsZ0JBQ2pHLFlBQVk7QUFBQSxnQkFDWixRQUFRO0FBQUE7QUFBQTtBQUFBLGtCQUlQLFFBQVE7QUFBQTtBQUFBLG9CQUVQLFNBQVMsYUFBYSw0QkFBNEIsTUFBTTtBQUFBLG9CQUN4RCxZQUFZO0FBQUEsa0JBQ2I7QUFBQTtBQUFBLGtCQUdBLFVBQVU7QUFBQTtBQUFBLG9CQUVULFNBQVMsYUFBYSwwQkFBMEIsTUFBTTtBQUFBLG9CQUN0RCxZQUFZO0FBQUEsa0JBQ2I7QUFBQTtBQUFBLGtCQUdBLFFBQVE7QUFBQTtBQUFBLG9CQUVQLFNBQVMsYUFBYSwyQkFBMkIsTUFBTTtBQUFBLG9CQUN2RCxZQUFZO0FBQUEsb0JBQ1osT0FBTztBQUFBLGtCQUNSO0FBQUE7QUFBQSxrQkFHQSxRQUFRO0FBQUE7QUFBQSxvQkFFUCxTQUFTLGFBQWEscUJBQXFCLE1BQU07QUFBQSxvQkFDakQsWUFBWTtBQUFBLG9CQUNaLE9BQU87QUFBQSxrQkFDUjtBQUFBO0FBQUEsa0JBR0EsWUFBWTtBQUFBO0FBQUEsb0JBRVgsU0FBUyxhQUFhLHVCQUF1QixNQUFNO0FBQUEsb0JBQ25ELFlBQVk7QUFBQSxrQkFDYjtBQUFBO0FBQUEsa0JBR0EsV0FBVztBQUFBO0FBQUEsb0JBRVYsU0FBUyxhQUFhLHFCQUFxQixNQUFNO0FBQUEsb0JBQ2pELFlBQVk7QUFBQSxrQkFDYjtBQUFBO0FBQUEsa0JBR0EsUUFBUTtBQUFBO0FBQUEsb0JBRVAsU0FBUyxhQUFhLHFCQUFxQixNQUFNO0FBQUEsb0JBQ2pELFlBQVk7QUFBQSxrQkFDYjtBQUFBLGtCQUVBLFlBQVk7QUFBQSxvQkFDWCxTQUFTLGFBQWEsb0NBQW9DLE1BQU07QUFBQSxvQkFDaEUsWUFBWTtBQUFBLG9CQUNaLFFBQVE7QUFBQSxrQkFDVDtBQUFBLGtCQUNBLGVBQWU7QUFBQSxnQkFDaEI7QUFBQSxjQUNEO0FBQUE7QUFBQSxjQUdBLFlBQVk7QUFBQSxnQkFDWCxTQUFTO0FBQUEsZ0JBQ1QsUUFBUTtBQUFBLGtCQUNQLFVBQVU7QUFBQSxvQkFDVCxTQUFTO0FBQUEsb0JBQ1QsWUFBWTtBQUFBLGtCQUNiO0FBQUEsa0JBQ0EsT0FBTztBQUFBLG9CQUNOLFNBQVM7QUFBQSxvQkFDVCxZQUFZO0FBQUEsa0JBQ2I7QUFBQSxrQkFDQSxlQUFlO0FBQUEsZ0JBQ2hCO0FBQUEsY0FDRDtBQUFBO0FBQUE7QUFBQSxjQUlBLFFBQVE7QUFBQTtBQUFBLGdCQUVQLFNBQVMsYUFBYSx1Q0FBdUMsTUFBTTtBQUFBLGdCQUNuRSxRQUFRO0FBQUEsa0JBQ1AsUUFBUTtBQUFBO0FBQUEsb0JBRVAsU0FBUyxhQUFhLHVCQUF1QixNQUFNO0FBQUEsb0JBQ25ELFlBQVk7QUFBQSxrQkFDYjtBQUFBLGtCQUNBLFlBQVk7QUFBQSxvQkFDWCxTQUFTLGFBQWEsYUFBYSxNQUFNO0FBQUEsb0JBQ3pDLFlBQVk7QUFBQSxvQkFDWixRQUFRO0FBQUEsa0JBQ1Q7QUFBQSxrQkFDQSxPQUFPO0FBQUEsb0JBQ04sU0FBUztBQUFBLG9CQUNULFlBQVk7QUFBQSxrQkFDYjtBQUFBLGtCQUNBLGVBQWU7QUFBQSxnQkFDaEI7QUFBQSxjQUNEO0FBQUE7QUFBQTtBQUFBLGNBSUEsU0FBUztBQUFBLGdCQUNSLFNBQVMsYUFBYSx1RkFBdUYsTUFBTTtBQUFBLGdCQUNuSCxRQUFRO0FBQUEsa0JBQ1AsVUFBVTtBQUFBLG9CQUNULFNBQVMsYUFBYSxrRUFBa0UsTUFBTTtBQUFBLG9CQUM5RixZQUFZO0FBQUEsb0JBQ1osT0FBTztBQUFBLGtCQUNSO0FBQUEsa0JBQ0EsWUFBWTtBQUFBLG9CQUNYLFNBQVMsYUFBYSw2QkFBNkIsTUFBTTtBQUFBLG9CQUN6RCxZQUFZO0FBQUEsb0JBQ1osUUFBUTtBQUFBLGtCQUNUO0FBQUEsa0JBQ0EsT0FBTztBQUFBLG9CQUNOLFNBQVM7QUFBQSxvQkFDVCxZQUFZO0FBQUEsa0JBQ2I7QUFBQSxrQkFDQSxlQUFlO0FBQUEsZ0JBQ2hCO0FBQUEsY0FDRDtBQUFBO0FBQUEsY0FHQSxZQUFZO0FBQUEsZ0JBQ1gsU0FBUztBQUFBLGdCQUNULE9BQU87QUFBQSxnQkFDUCxRQUFRO0FBQUEsa0JBQ1AsZUFBZTtBQUFBLGdCQUNoQjtBQUFBLGNBQ0Q7QUFBQTtBQUFBLGNBR0EsV0FBVztBQUFBLGdCQUNWLFNBQVM7QUFBQSxnQkFDVCxRQUFRO0FBQUEsa0JBQ1AsV0FBVztBQUFBLG9CQUNWLFNBQVM7QUFBQSxvQkFDVCxZQUFZO0FBQUEsa0JBQ2I7QUFBQSxrQkFDQSxlQUFlO0FBQUEsZ0JBQ2hCO0FBQUEsY0FDRDtBQUFBO0FBQUEsY0FHQSxRQUFRO0FBQUEsZ0JBQ1AsU0FBUztBQUFBLGdCQUNULE9BQU87QUFBQSxnQkFDUCxRQUFRO0FBQUEsa0JBQ1AsZUFBZTtBQUFBLGdCQUNoQjtBQUFBLGNBQ0Q7QUFBQSxZQUNEO0FBQUEsVUFDRDtBQUFBLFFBQ0QsQ0FBQztBQUVELFlBQUksZUFBZSxRQUFRLFFBQVEsRUFBRTtBQUNyQyxZQUFJLGlCQUFpQjtBQUFBLFVBQ3BCLFVBQVUsYUFBYSxRQUFRO0FBQUEsVUFDL0IsUUFBUSxhQUFhLE1BQU07QUFBQSxVQUMzQixTQUFTLGFBQWEsT0FBTztBQUFBLFVBQzdCLFlBQVksYUFBYSxVQUFVO0FBQUEsVUFDbkMsV0FBVyxhQUFhLFNBQVM7QUFBQSxVQUNqQyxRQUFRLGFBQWEsTUFBTTtBQUFBLFFBQzVCO0FBR0EsZ0JBQVEsSUFBSSxVQUFVO0FBR3RCLFlBQUkscUJBQXFCLGFBQWEsUUFBUSxFQUFFO0FBQ2hELDJCQUFtQixNQUFNLEVBQUUsU0FBUztBQUNwQywyQkFBbUIsUUFBUSxFQUFFLFNBQVM7QUFDdEMsMkJBQW1CLFVBQVUsRUFBRSxTQUFTO0FBQ3hDLDJCQUFtQixTQUFTLEVBQUUsU0FBUztBQUN2QywyQkFBbUIsTUFBTSxFQUFFLFNBQVM7QUFHcEMsWUFBSSxvQkFBb0IsYUFBYSxPQUFPLEVBQUU7QUFDOUMsMEJBQWtCLFFBQVEsSUFBSSxlQUFlLFFBQVE7QUFDckQsMEJBQWtCLE1BQU0sSUFBSSxlQUFlLE1BQU07QUFDakQsMEJBQWtCLE9BQU8sSUFBSSxlQUFlLE9BQU87QUFDbkQsMEJBQWtCLFVBQVUsSUFBSSxlQUFlLFVBQVU7QUFDekQsMEJBQWtCLFNBQVMsSUFBSSxlQUFlLFNBQVM7QUFDdkQsMEJBQWtCLE1BQU0sSUFBSSxlQUFlLE1BQU07QUFBQSxNQUVsRCxHQUFFLEtBQUs7QUFFUCxPQUFDLFNBQVVBLFFBQU87QUFFakIsWUFBSSxNQUFNLCtDQUErQztBQUt6RCxpQkFBUyxVQUFVLFNBQVM7QUFDM0IsaUJBQU8sUUFBUSxRQUFRLE9BQU8sV0FBWTtBQUFFLG1CQUFPO0FBQUEsVUFBSyxDQUFDO0FBQUEsUUFDMUQ7QUFFQSxRQUFBQSxPQUFNLFVBQVUsT0FBTztBQUFBLFVBQ3RCLFdBQVc7QUFBQSxZQUNWLFNBQVM7QUFBQSxZQUNULFFBQVE7QUFBQSxVQUNUO0FBQUEsVUFDQSxTQUFTO0FBQUEsWUFDUixTQUFTLE9BQU8sVUFBVSxxREFBcUQsTUFBTSxHQUFHLEdBQUc7QUFBQSxZQUMzRixZQUFZO0FBQUEsWUFDWixRQUFRO0FBQUEsWUFDUixPQUFPO0FBQUEsVUFDUjtBQUFBLFVBQ0EsT0FBTztBQUFBLFlBQ04sU0FBUyxPQUFPLFVBQVUsNkNBQTZDLE1BQU0sR0FBRyxHQUFHO0FBQUEsWUFDbkYsWUFBWTtBQUFBLFlBQ1osUUFBUTtBQUFBLFlBQ1IsT0FBTztBQUFBLFVBQ1I7QUFBQSxVQUNBLFVBQVU7QUFBQSxZQUNULFNBQVM7QUFBQSxZQUNULFFBQVE7QUFBQSxVQUNUO0FBQUEsVUFDQSxRQUFRO0FBQUEsWUFDUDtBQUFBO0FBQUEsY0FFQyxTQUFTO0FBQUEsY0FDVCxPQUFPO0FBQUEsWUFDUjtBQUFBLFlBQ0E7QUFBQTtBQUFBLGNBRUMsU0FBUztBQUFBLGNBQ1QsT0FBTztBQUFBLFlBQ1I7QUFBQSxVQUNEO0FBQUEsVUFDQSxVQUFVO0FBQUEsVUFDVixXQUFXO0FBQUEsVUFDWCxlQUFlO0FBQUEsUUFDaEI7QUFBQSxNQUNELEdBQUUsS0FBSztBQUVQLE9BQUMsU0FBVUEsUUFBTztBQUVqQixRQUFBQSxPQUFNLFVBQVUsU0FBUztBQUFBLFVBQ3hCLFdBQVc7QUFBQSxZQUNWLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxVQUNiO0FBQUEsVUFDQSx1QkFBdUI7QUFBQTtBQUFBLFVBQ3ZCLGFBQWE7QUFBQSxZQUNaLFNBQVM7QUFBQSxZQUNULFFBQVE7QUFBQSxZQUNSLFFBQVE7QUFBQSxjQUNQLFNBQVM7QUFBQSxnQkFDUixTQUFTO0FBQUEsZ0JBQ1QsWUFBWTtBQUFBLGNBQ2I7QUFBQSxjQUNBLFlBQVk7QUFBQSxjQUNaLFNBQVM7QUFBQSxZQUNWO0FBQUEsVUFDRDtBQUFBLFVBQ0EsY0FBYztBQUFBLFlBQ2IsU0FBUztBQUFBLFlBQ1QsUUFBUTtBQUFBLFVBQ1Q7QUFBQSxVQUVBLFlBQVk7QUFBQSxVQUVaLFdBQVc7QUFBQSxVQUNYLFdBQVc7QUFBQSxVQUVYLFVBQVU7QUFBQSxVQUVWLHVCQUF1QjtBQUFBLFlBQ3RCLFNBQVM7QUFBQSxZQUNULE9BQU87QUFBQSxVQUNSO0FBQUEsVUFDQSxZQUFZO0FBQUEsVUFDWixlQUFlO0FBQUEsUUFDaEI7QUFFQSxZQUFJLHVCQUF1QixrRUFBa0U7QUFFN0YsUUFBQUEsT0FBTSxVQUFVLE9BQU8scUJBQXFCLElBQUk7QUFBQSxVQUMvQyxTQUFTO0FBQUEsWUFDUixZQUFZLFNBQ1osY0FDVyxtQ0FBbUMsU0FBUyxNQUFNLHVCQUF1QixlQUUzRSx3Q0FBd0MsU0FBUyxNQUFNLHVCQUF1QjtBQUFBLFVBRXhGO0FBQUEsVUFDQSxZQUFZO0FBQUEsVUFDWixRQUFRO0FBQUEsVUFDUixRQUFRO0FBQUEsWUFDUCxpQkFBaUI7QUFBQSxjQUNoQixTQUFTLE9BQU8sb0JBQW9CO0FBQUEsY0FDcEMsUUFBUTtBQUFBLGdCQUNQLGVBQWU7QUFBQSxnQkFDZixjQUFjO0FBQUEsa0JBQ2IsU0FBUztBQUFBLGtCQUNULFFBQVFBLE9BQU0sVUFBVTtBQUFBLGdCQUN6QjtBQUFBLGNBQ0Q7QUFBQSxZQUNEO0FBQUEsWUFDQSxVQUFVO0FBQUEsVUFDWDtBQUFBLFFBQ0Q7QUFFQSxRQUFBQSxPQUFNLFVBQVUsT0FBT0EsT0FBTSxVQUFVLFFBQVE7QUFDL0MsUUFBQUEsT0FBTSxVQUFVLFVBQVVBLE9BQU0sVUFBVSxRQUFRO0FBQUEsTUFFbkQsR0FBRSxLQUFLO0FBRVAsWUFBTSxVQUFVLE9BQU87QUFBQSxRQUN0QixXQUFXO0FBQUEsUUFFWCxZQUFZO0FBQUEsVUFDWCxTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsVUFDWixPQUFPO0FBQUEsUUFDUjtBQUFBLFFBQ0EsYUFBYTtBQUFBLFVBQ1osU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFFBQ1I7QUFBQSxRQUVBLFVBQVU7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxZQUNQLGVBQWU7QUFBQSxVQUNoQjtBQUFBLFFBQ0Q7QUFBQSxRQUNBLFdBQVc7QUFBQSxRQUNYLFdBQVc7QUFBQSxRQUNYLFVBQVU7QUFBQSxRQUNWLFlBQVk7QUFBQSxVQUNYO0FBQUEsWUFDQyxTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsVUFDYjtBQUFBLFVBQ0E7QUFBQSxRQUNEO0FBQUEsUUFDQSxlQUFlO0FBQUEsTUFDaEI7QUFFQSxZQUFNLE1BQU0sSUFBSSxtQkFBbUIsU0FBVSxLQUFLO0FBQ2pELFlBQUksSUFBSSxhQUFhLFFBQVE7QUFDNUI7QUFBQSxRQUNEO0FBRUEsWUFBSSxVQUFVO0FBQ2QsY0FBTSxVQUFVLG1CQUFtQixFQUFFLGtCQUFrQixLQUFLLFFBQVEsT0FBTztBQUFBLE1BQzVFLENBQUM7QUFFRCxZQUFNLE1BQU0sSUFBSSxrQkFBa0IsU0FBVSxLQUFLO0FBQ2hELGNBQU0sVUFBVSxtQkFBbUIsRUFBRSxxQkFBcUIsS0FBSyxNQUFNO0FBQUEsTUFDdEUsQ0FBQztBQUVELE9BQUMsU0FBVUEsUUFBTztBQUVqQixZQUFJLFdBQVc7QUFFZixRQUFBQSxPQUFNLFVBQVUsYUFBYTtBQUFBLFVBQzVCLFdBQVc7QUFBQSxZQUNWO0FBQUE7QUFBQSxjQUVDLFNBQVM7QUFBQSxjQUNULFlBQVk7QUFBQSxZQUNiO0FBQUEsWUFDQTtBQUFBO0FBQUE7QUFBQSxjQUdDLFNBQVM7QUFBQSxjQUNULFlBQVk7QUFBQSxjQUNaLFFBQVE7QUFBQSxZQUNUO0FBQUEsWUFDQTtBQUFBO0FBQUEsY0FFQyxTQUFTO0FBQUEsY0FDVCxZQUFZO0FBQUEsY0FDWixRQUFRO0FBQUEsWUFDVDtBQUFBLFVBQ0Q7QUFBQSxVQUNBLFlBQVk7QUFBQSxZQUNYO0FBQUE7QUFBQSxjQUVDLFNBQVM7QUFBQSxjQUNULFFBQVE7QUFBQSxnQkFDUCxVQUFVO0FBQUEsa0JBQ1QsU0FBUztBQUFBLGtCQUNULFFBQVE7QUFBQSxvQkFDUCxXQUFXO0FBQUEsa0JBQ1o7QUFBQSxnQkFDRDtBQUFBLGdCQUNBLFdBQVc7QUFBQSxrQkFDVixTQUFTO0FBQUEsZ0JBQ1Y7QUFBQSxjQUNEO0FBQUEsWUFDRDtBQUFBLFlBQ0E7QUFBQTtBQUFBLGNBRUMsU0FBUztBQUFBLGNBQ1QsUUFBUTtBQUFBLGdCQUNQLFVBQVU7QUFBQSxjQUNYO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFBQSxVQUNBLFVBQVU7QUFBQSxZQUNULFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLFFBQVE7QUFBQSxjQUNQLFlBQVk7QUFBQTtBQUFBLGNBQ1osV0FBVztBQUFBLGNBQ1gsVUFBVTtBQUFBLGNBQ1YsZUFBZTtBQUFBLFlBQ2hCO0FBQUEsVUFDRDtBQUFBLFVBQ0EsV0FBVztBQUFBLFVBQ1gsVUFBVTtBQUFBO0FBQUEsWUFFVCxTQUFTO0FBQUEsWUFDVCxRQUFRO0FBQUEsY0FDUCxZQUFZO0FBQUEsWUFDYjtBQUFBLFVBQ0Q7QUFBQSxVQUNBLE9BQU87QUFBQSxZQUNOLFNBQVM7QUFBQSxZQUNULFFBQVE7QUFBQSxjQUNQLGVBQWU7QUFBQSxZQUNoQjtBQUFBLFVBQ0Q7QUFBQSxVQUNBLGVBQWU7QUFBQSxVQUNmLFlBQVk7QUFBQSxRQUNiO0FBRUEsUUFBQUEsT0FBTSxVQUFVLFdBQVdBLE9BQU0sVUFBVTtBQUFBLE1BRTVDLEdBQUUsS0FBSztBQUVQLFlBQU0sVUFBVSxlQUFlO0FBQUEsUUFDOUIsV0FBVztBQUFBLFFBQ1gsVUFBVTtBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFFBQ1Q7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNYLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxRQUNSO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDWCxTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsVUFDWixRQUFRO0FBQUEsVUFDUixRQUFRO0FBQUEsWUFDUCxZQUFZO0FBQUEsWUFDWixZQUFZO0FBQUEsWUFDWixlQUFlO0FBQUEsVUFDaEI7QUFBQSxRQUNEO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDUixTQUFTO0FBQUEsVUFDVCxPQUFPO0FBQUEsUUFDUjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ2IsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFFBQ2I7QUFBQSxRQUVBLFdBQVc7QUFBQSxRQUNYLFlBQVk7QUFBQSxRQUVaLFdBQVc7QUFBQSxRQUNYLFVBQVU7QUFBQTtBQUFBLFFBRVYsWUFBWTtBQUFBLFFBQ1osZUFBZTtBQUFBLE1BQ2hCO0FBRUEsWUFBTSxVQUFVLEtBQUssTUFBTSxVQUFVLFVBQVUsTUFBTSxVQUFVO0FBRS9ELFlBQU0sVUFBVSxVQUFVO0FBQUEsUUFDekIsZ0JBQWdCO0FBQUEsVUFDZixTQUFTO0FBQUEsVUFDVCxPQUFPO0FBQUEsVUFDUCxRQUFRO0FBQUEsUUFDVDtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFVBQ1AsUUFBUTtBQUFBLFFBQ1Q7QUFBQSxRQUNBLFVBQVU7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxZQUNQLGVBQWU7QUFBQSxVQUNoQjtBQUFBLFVBQ0EsUUFBUTtBQUFBLFFBQ1Q7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxRQUNSO0FBQUEsUUFDQSxtQkFBbUI7QUFBQSxVQUNsQixTQUFTO0FBQUEsVUFDVCxPQUFPO0FBQUEsUUFDUjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFVBQ1gsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osT0FBTztBQUFBLFFBQ1I7QUFBQSxRQUNBLGFBQWE7QUFBQSxVQUNaLFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxRQUNSO0FBQUEsUUFDQSxZQUFZO0FBQUEsUUFDWixXQUFXO0FBQUEsUUFDWCxXQUFXO0FBQUEsUUFDWCxVQUFVO0FBQUEsUUFDVixZQUFZO0FBQUEsVUFDWDtBQUFBLFlBQ0MsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFVBQ2I7QUFBQSxVQUNBO0FBQUEsUUFDRDtBQUFBLFFBQ0EsZUFBZTtBQUFBLE1BQ2hCO0FBSUEsWUFBTSxVQUFVLE1BQU07QUFBQSxRQUNyQixVQUFVO0FBQUEsVUFDVCxTQUFTO0FBQUEsVUFDVCxRQUFRO0FBQUEsVUFDUixRQUFRO0FBQUEsWUFDUCxvQkFBb0I7QUFBQSxVQUNyQjtBQUFBLFFBQ0Q7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNYLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxZQUNQLHNCQUFzQjtBQUFBLFVBQ3ZCO0FBQUEsUUFDRDtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFlBQ1AsbUJBQW1CO0FBQUEsY0FDbEIsU0FBUztBQUFBLGNBQ1QsUUFBUTtBQUFBLFlBQ1Q7QUFBQSxZQUNBLGtCQUFrQjtBQUFBLFlBQ2xCLFFBQVE7QUFBQSxjQUNQLFNBQVM7QUFBQSxjQUNULFFBQVE7QUFBQSxnQkFDUCxPQUFPO0FBQUEsZ0JBQ1AsU0FBUztBQUFBLGtCQUNSLFNBQVM7QUFBQSxrQkFDVCxZQUFZO0FBQUEsZ0JBQ2I7QUFBQSxjQUNEO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFBQSxRQUNEO0FBQUEsUUFDQSxhQUFhO0FBQUEsVUFDWixTQUFTO0FBQUEsWUFDUixRQUFRLFNBRU4sK0JBQStCLFVBR2hDLFFBRUUsa0VBQWtFLFNBQ2xFLE1BRUEsd0JBQXdCLFNBQ3hCLE9BR0QsWUFBWTtBQUFBLFlBQ2Q7QUFBQSxVQUNEO0FBQUEsVUFDQSxRQUFRO0FBQUEsWUFDUCx1QkFBdUI7QUFBQSxZQUN2QixxQkFBcUI7QUFBQSxjQUNwQixTQUFTO0FBQUEsY0FDVCxRQUFRO0FBQUEsZ0JBQ1AsdUJBQXVCO0FBQUEsZ0JBQ3ZCLGFBQWE7QUFBQSxjQUNkO0FBQUEsWUFDRDtBQUFBLFlBQ0EsZ0JBQWdCO0FBQUEsY0FDZixTQUFTO0FBQUEsY0FDVCxRQUFRO0FBQUEsZ0JBQ1Asa0JBQWtCO0FBQUEsZ0JBQ2xCLFFBQVE7QUFBQSxjQUNUO0FBQUEsWUFDRDtBQUFBLFlBQ0EsUUFBUTtBQUFBLGNBQ1AsU0FBUztBQUFBLGNBQ1QsUUFBUTtBQUFBLGdCQUNQLGNBQWM7QUFBQSxrQkFDYixTQUFTO0FBQUEsa0JBQ1QsUUFBUTtBQUFBLG9CQUNQLHdCQUF3QjtBQUFBLG9CQUN4QixjQUFjO0FBQUEsb0JBQ2QsZ0JBQWdCO0FBQUEsa0JBQ2pCO0FBQUEsZ0JBQ0Q7QUFBQSxnQkFDQSxnQkFBZ0I7QUFBQSxjQUNqQjtBQUFBLFlBQ0Q7QUFBQSxVQUNEO0FBQUEsUUFDRDtBQUFBLFFBQ0EsUUFBUTtBQUFBLFVBQ1AsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFlBQ1Asa0JBQWtCO0FBQUEsVUFDbkI7QUFBQSxRQUNEO0FBQUEsTUFDRDtBQUVBLFlBQU0sVUFBVSxNQUFNLE1BQU0sVUFBVTtBQUV0QyxPQUFDLFNBQVVBLFFBQU87QUFDakIsWUFBSSxvQkFBb0I7QUFBQSxVQUN2QixTQUFTO0FBQUEsVUFDVCxRQUFRO0FBQUEsUUFDVDtBQUVBLFFBQUFBLE9BQU0sVUFBVSxJQUFJQSxPQUFNLFVBQVUsT0FBTyxTQUFTO0FBQUEsVUFDbkQsVUFBVTtBQUFBLFlBQ1QsU0FBUztBQUFBLFlBQ1QsT0FBTztBQUFBLFlBQ1AsUUFBUTtBQUFBLFlBQ1IsUUFBUTtBQUFBLGNBQ1AsaUJBQWlCO0FBQUEsZ0JBQ2hCLFNBQVM7QUFBQSxnQkFDVCxZQUFZO0FBQUEsZ0JBQ1osUUFBUTtBQUFBLGtCQUNQLDBCQUEwQjtBQUFBLG9CQUN6QixTQUFTO0FBQUEsb0JBQ1QsT0FBTztBQUFBLGtCQUNSO0FBQUEsa0JBQ0EsNkJBQTZCO0FBQUEsb0JBQzVCLFNBQVM7QUFBQSxvQkFDVCxPQUFPO0FBQUEsa0JBQ1I7QUFBQSxrQkFDQSw0QkFBNEI7QUFBQSxnQkFDN0I7QUFBQSxjQUNEO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFBQSxVQUNBLGNBQWM7QUFBQSxZQUNiLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxVQUNiO0FBQUEsVUFDQSxXQUFXO0FBQUEsVUFDWCxVQUFVO0FBQUEsVUFDVixZQUFZO0FBQUEsVUFDWixXQUFXO0FBQUEsUUFDWixDQUFDO0FBRUQsMEJBQWtCLFNBQVNBLE9BQU0sVUFBVTtBQUUzQyxRQUFBQSxPQUFNLFVBQVUsYUFBYSxLQUFLLFVBQVU7QUFBQSxVQUMzQyxRQUFRO0FBQUEsWUFDUCxTQUFTO0FBQUE7QUFBQSxZQUNULE9BQU87QUFBQSxVQUNSO0FBQUEsUUFDRCxDQUFDO0FBRUQsUUFBQUEsT0FBTSxVQUFVLGFBQWEsS0FBSyxZQUFZO0FBQUEsVUFDN0MsYUFBYTtBQUFBLFlBQ1osU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFlBQ1osT0FBTztBQUFBLFlBQ1AsUUFBUTtBQUFBLGNBQ1AsZUFBZTtBQUFBLGNBQ2YsV0FBVztBQUFBLFlBQ1o7QUFBQSxVQUNEO0FBQUEsVUFDQSxXQUFXO0FBQUEsWUFDVixTQUFTO0FBQUEsWUFDVCxRQUFRO0FBQUEsY0FDUCxlQUFlO0FBQUEsY0FDZixjQUFjO0FBQUEsWUFDZjtBQUFBLFVBQ0Q7QUFBQSxRQUNELENBQUM7QUFFRCxRQUFBQSxPQUFNLFVBQVUsYUFBYSxLQUFLLFlBQVk7QUFBQSxVQUM3QyxvQkFBb0I7QUFBQTtBQUFBLFlBRW5CLFNBQVM7QUFBQSxZQUNULFFBQVE7QUFBQSxjQUNQLFlBQVk7QUFBQSxjQUNaLFdBQVc7QUFBQSxnQkFDVixTQUFTO0FBQUEsZ0JBQ1QsUUFBUUEsT0FBTSxVQUFVLEVBQUUsUUFBUTtBQUFBLGNBQ25DO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFBQSxRQUNELENBQUM7QUFBQSxNQUNGLEdBQUUsS0FBSztBQUVQLFlBQU0sVUFBVSxPQUFPLE1BQU0sVUFBVSxPQUFPLFNBQVM7QUFBQTtBQUFBLFFBRXRELGNBQWM7QUFBQSxVQUNiO0FBQUE7QUFBQSxZQUVDLFNBQVM7QUFBQSxZQUNULFFBQVE7QUFBQSxjQUNQLGFBQWE7QUFBQSxZQUNkO0FBQUEsVUFDRDtBQUFBLFVBQ0E7QUFBQTtBQUFBLFlBRUMsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFlBQ1osUUFBUTtBQUFBLGNBQ1AsYUFBYTtBQUFBLFlBQ2Q7QUFBQSxVQUNEO0FBQUEsVUFDQTtBQUFBO0FBQUEsWUFFQyxTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsWUFDWixRQUFRO0FBQUEsY0FDUCxhQUFhO0FBQUEsWUFDZDtBQUFBLFVBQ0Q7QUFBQSxVQUNBO0FBQUE7QUFBQSxZQUVDLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLFFBQVE7QUFBQSxjQUNQLGFBQWE7QUFBQSxZQUNkO0FBQUEsVUFDRDtBQUFBLFFBQ0Q7QUFBQSxRQUNBLFdBQVc7QUFBQSxRQUNYLFlBQVk7QUFBQSxRQUNaLFVBQVU7QUFBQSxRQUNWLFlBQVk7QUFBQSxRQUNaLGVBQWU7QUFBQSxRQUNmLFlBQVk7QUFBQSxNQUNiLENBQUM7QUFFRCxZQUFNLFVBQVUsYUFBYSxRQUFRLFVBQVU7QUFBQSxRQUM5QyxjQUFjO0FBQUEsVUFDYixTQUFTO0FBQUEsVUFDVCxRQUFRO0FBQUEsVUFDUixPQUFPO0FBQUEsUUFDUjtBQUFBLFFBQ0EsbUJBQW1CO0FBQUEsVUFDbEIsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFVBQ1IsUUFBUTtBQUFBLFlBQ1AsaUJBQWlCO0FBQUEsY0FDaEIsU0FBUztBQUFBLGNBQ1QsUUFBUTtBQUFBLGdCQUNQLGFBQWE7QUFBQSxrQkFDWixTQUFTO0FBQUEsa0JBQ1QsT0FBTztBQUFBLGdCQUNSO0FBQUEsZ0JBQ0EsTUFBTSxNQUFNLFVBQVU7QUFBQSxjQUN2QjtBQUFBLFlBQ0Q7QUFBQSxZQUNBLFVBQVU7QUFBQSxVQUNYO0FBQUEsUUFDRDtBQUFBLE1BQ0QsQ0FBQztBQUVELFlBQU0sVUFBVSxhQUFhLFFBQVEsV0FBVztBQUFBLFFBQy9DLFNBQVM7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLFFBQVE7QUFBQSxZQUNQLGdCQUFnQjtBQUFBLGNBQ2YsU0FBUztBQUFBLGNBQ1QsWUFBWTtBQUFBLGNBQ1osT0FBTztBQUFBLGNBQ1AsUUFBUSxNQUFNLFVBQVU7QUFBQSxZQUN6QjtBQUFBLFlBQ0EsbUJBQW1CO0FBQUEsWUFDbkIsZUFBZTtBQUFBLFVBQ2hCO0FBQUEsUUFDRDtBQUFBLE1BQ0QsQ0FBQztBQUVELE9BQUMsU0FBVUEsUUFBTztBQUNqQixRQUFBQSxPQUFNLFVBQVUsV0FBV0EsT0FBTSxVQUFVLE9BQU8sVUFBVSxDQUFDLENBQUM7QUFFOUQsWUFBSSxXQUFXO0FBQUEsVUFDZCxZQUFZO0FBQUEsWUFDWCxTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsWUFDWixRQUFRLENBQUM7QUFBQTtBQUFBLFVBQ1Y7QUFBQSxVQUNBLFVBQVU7QUFBQSxZQUNULFNBQVM7QUFBQSxZQUNULFFBQVE7QUFBQSxVQUNUO0FBQUEsVUFDQSxVQUFVO0FBQUEsVUFDVixXQUFXO0FBQUEsVUFDWCxZQUFZO0FBQUEsVUFDWixlQUFlO0FBQUEsUUFDaEI7QUFFQSxpQkFBUyxTQUFTLFNBQVM7QUFBQSxVQUMxQixVQUFVLFNBQVMsUUFBUTtBQUFBLFVBQzNCLFlBQVk7QUFBQSxZQUNYLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxVQUNiO0FBQUEsVUFDQSxVQUFVLFNBQVMsUUFBUTtBQUFBLFVBQzNCLFdBQVcsU0FBUyxTQUFTO0FBQUEsVUFDN0IsZUFBZSxTQUFTLGFBQWE7QUFBQSxRQUN0QztBQUVBLFFBQUFBLE9BQU0sVUFBVSxhQUFhLFlBQVksV0FBVztBQUFBLFVBQ25ELFlBQVk7QUFBQSxZQUNYLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLFFBQVE7QUFBQSxZQUNSLFFBQVE7QUFBQSxjQUNQLGVBQWU7QUFBQSxZQUNoQjtBQUFBLFVBQ0Q7QUFBQSxVQUNBLG9CQUFvQjtBQUFBLFlBQ25CO0FBQUEsY0FDQyxTQUFTO0FBQUEsY0FDVCxZQUFZO0FBQUEsY0FDWixRQUFRO0FBQUEsY0FDUixPQUFPO0FBQUEsWUFDUjtBQUFBLFlBQ0E7QUFBQSxjQUNDLFNBQVM7QUFBQSxjQUNULFlBQVk7QUFBQSxjQUNaLFFBQVE7QUFBQSxjQUNSLE9BQU87QUFBQSxZQUNSO0FBQUEsVUFDRDtBQUFBLFVBQ0EsYUFBYTtBQUFBLFlBQ1osU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFlBQ1osUUFBUTtBQUFBLGNBQ1AsV0FBVztBQUFBLGdCQUNWLFNBQVM7QUFBQSxnQkFDVCxRQUFRO0FBQUEsa0JBQ1AsZUFBZTtBQUFBLGdCQUNoQjtBQUFBLGNBQ0Q7QUFBQSxjQUNBLE1BQU07QUFBQSxZQUNQO0FBQUEsVUFDRDtBQUFBLFVBQ0EsWUFBWSxTQUFTLFVBQVU7QUFBQSxRQUNoQyxDQUFDO0FBRUQsUUFBQUEsT0FBTSxVQUFVLFNBQVMsS0FBSyxFQUFFLE9BQU8sWUFBWSxFQUFFLE9BQU8sT0FBT0EsT0FBTSxVQUFVO0FBQUEsTUFFcEYsR0FBRSxLQUFLO0FBRVAsWUFBTSxVQUFVLFVBQVU7QUFBQSxRQUN6QixXQUFXO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxRQUFRO0FBQUEsUUFDVDtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFFBQ1Q7QUFBQSxRQUNBLG1CQUFtQjtBQUFBO0FBQUEsVUFFbEIsU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFFBQ1I7QUFBQTtBQUFBLFFBRUEsWUFBWTtBQUFBLFFBQ1osWUFBWTtBQUFBO0FBQUEsUUFFWixXQUFXO0FBQUE7QUFBQSxRQUVYLGFBQWE7QUFBQTtBQUFBLFFBRWIsVUFBVTtBQUFBLFFBQ1YsWUFBWTtBQUFBLFFBQ1osZUFBZTtBQUFBLE1BQ2hCO0FBRUEsWUFBTSxVQUFVLE9BQU87QUFBQSxRQUN0QixXQUFXO0FBQUE7QUFBQSxRQUVYLGdCQUFnQjtBQUFBLFVBQ2YsV0FBVztBQUFBLFVBQ1gsU0FBUztBQUFBLFFBQ1Y7QUFBQTtBQUFBLFFBRUEsbUJBQW1CO0FBQUEsVUFDbEIsU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFFBQ1I7QUFBQSxRQUNBLFVBQVU7QUFBQSxRQUNWLGFBQWE7QUFBQSxVQUNaLFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxRQUNSO0FBQUE7QUFBQSxRQUVBLFdBQVc7QUFBQSxRQUNYLFdBQVc7QUFBQSxRQUNYLFlBQVk7QUFBQTtBQUFBLFFBRVosVUFBVTtBQUFBLFFBQ1YsWUFBWTtBQUFBLFFBQ1osZUFBZTtBQUFBLE1BQ2hCO0FBRUEsWUFBTSxVQUFVLE1BQU07QUFBQSxRQUNyQixVQUFVO0FBQUEsUUFDVixXQUFXO0FBQUEsUUFDWCxZQUFZO0FBQUEsUUFDWixXQUFXO0FBQUEsUUFDWCxXQUFXO0FBQUEsUUFDWCxVQUFVO0FBQUEsUUFDVixZQUFZO0FBQUEsUUFDWixlQUFlO0FBQUEsTUFDaEI7QUFFQSxZQUFNLFVBQVUsY0FBYyxJQUFJO0FBQUEsUUFDakMsV0FBVztBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFlBQ1AsV0FBVztBQUFBLFVBQ1o7QUFBQSxRQUNEO0FBQUEsUUFDQSxhQUFhO0FBQUEsVUFDWixTQUFTO0FBQUEsVUFDVCxPQUFPO0FBQUEsVUFDUCxRQUFRO0FBQUEsUUFDVDtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFFBQ1Q7QUFBQSxRQUNBLFFBQVE7QUFBQSxVQUNQLFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxRQUNSO0FBQUEsUUFDQSxVQUFVO0FBQUEsUUFDVixXQUFXO0FBQUEsUUFDWCxXQUFXO0FBQUEsUUFDWCxZQUFZO0FBQUEsUUFDWixlQUFlO0FBQUEsTUFDaEI7QUFFQSxZQUFNLFVBQVUsS0FBSyxNQUFNLFVBQVUsY0FBYztBQUNuRCxZQUFNLFVBQVUsTUFBTSxNQUFNLFVBQVUsY0FBYztBQUVwRCxZQUFNLFVBQVUsYUFBYTtBQUFBLFFBQzVCLFdBQVc7QUFBQSxRQUNYLFVBQVU7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxRQUNUO0FBQUEsUUFDQSxZQUFZO0FBQUEsUUFDWixTQUFTO0FBQUEsVUFDUixTQUFTO0FBQUEsVUFDVCxPQUFPO0FBQUEsUUFDUjtBQUFBO0FBQUE7QUFBQSxRQUdBLFdBQVc7QUFBQSxRQUNYLFVBQVU7QUFBQSxRQUNWLFdBQVc7QUFBQSxRQUNYLGVBQWU7QUFBQTtBQUFBO0FBQUEsUUFHZixZQUFZO0FBQUEsTUFDYjtBQUVBLFlBQU0sVUFBVSxPQUFPO0FBQUEsUUFDdEIsV0FBVztBQUFBLFVBQ1Y7QUFBQSxVQUNBO0FBQUEsWUFDQyxTQUFTO0FBQUEsWUFDVCxRQUFRO0FBQUEsVUFDVDtBQUFBLFFBQ0Q7QUFBQSxRQUNBLFVBQVU7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxRQUNUO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDVjtBQUFBLFlBQ0MsU0FBUztBQUFBLFlBQ1QsUUFBUTtBQUFBLGNBQ1AsWUFBWTtBQUFBLFlBQ2I7QUFBQSxVQUNEO0FBQUEsVUFDQTtBQUFBLFlBQ0MsU0FBUztBQUFBLFlBQ1QsUUFBUTtBQUFBLGNBQ1AsZUFBZTtBQUFBLFlBQ2hCO0FBQUEsVUFDRDtBQUFBLFVBQ0E7QUFBQSxRQUNEO0FBQUEsUUFDQSxZQUFZO0FBQUEsUUFDWixVQUFVO0FBQUEsUUFDVixlQUFlO0FBQUEsTUFDaEI7QUFFQSxPQUFDLFNBQVVBLFFBQU87QUFFakIsWUFBSSxLQUFLLHdDQUF3QztBQUNqRCxZQUFJLE9BQ0gsUUFDQSx5Q0FBeUMsU0FDekMsTUFDQSxnREFBZ0QsU0FDaEQsTUFDQSxrQ0FBa0MsU0FBUyxLQUFLLGdDQUFnQyxTQUNoRixNQUFNLGFBQWE7QUFFcEIsWUFBSSxhQUFhLENBQUM7QUFFbEIsUUFBQUEsT0FBTSxVQUFVLFNBQVMsSUFBSTtBQUFBLFVBQzVCLFdBQVc7QUFBQSxZQUNWLFNBQVM7QUFBQSxZQUNULFFBQVE7QUFBQSxVQUNUO0FBQUEsVUFDQSxVQUFVO0FBQUEsWUFDVCxTQUFTO0FBQUEsWUFDVCxRQUFRO0FBQUEsVUFDVDtBQUFBLFVBRUEsYUFBYTtBQUFBLFlBQ1osU0FBUyxPQUFPLG1CQUFtQixTQUFTLEVBQUU7QUFBQSxZQUM5QyxZQUFZO0FBQUEsVUFDYjtBQUFBLFVBQ0EsY0FBYztBQUFBLFlBQ2I7QUFBQSxjQUNDLFNBQVM7QUFBQSxjQUNULFlBQVk7QUFBQSxjQUNaLFFBQVE7QUFBQSxZQUNUO0FBQUEsWUFDQTtBQUFBLGNBQ0MsU0FBUyxPQUFPLDREQUE0RCxTQUFTLElBQUk7QUFBQSxjQUN6RixZQUFZO0FBQUEsY0FDWixRQUFRO0FBQUEsWUFDVDtBQUFBLFlBQ0E7QUFBQTtBQUFBLGNBRUMsU0FBUyxPQUFPLE1BQU0sZ0JBQWdCLFNBQVMsS0FBSyxVQUFVLFNBQVMsTUFBTSxJQUFJO0FBQUEsY0FDakYsWUFBWTtBQUFBLGNBQ1osUUFBUTtBQUFBLFlBQ1Q7QUFBQSxZQUNBO0FBQUE7QUFBQSxjQUVDLFNBQVMsT0FBTyxtQkFBbUIsU0FBUyxJQUFJO0FBQUEsY0FDaEQsWUFBWTtBQUFBLGNBQ1osUUFBUTtBQUFBLFlBQ1Q7QUFBQSxZQUVBO0FBQUEsY0FDQyxTQUFTLE9BQU8sc0ZBQXNGLFNBQVMsRUFBRTtBQUFBLGNBQ2pILFlBQVk7QUFBQSxZQUNiO0FBQUEsWUFDQTtBQUFBO0FBQUEsY0FFQyxTQUFTLE9BQU8sU0FBUyxTQUFTLEVBQUU7QUFBQSxjQUNwQyxZQUFZO0FBQUEsWUFDYjtBQUFBO0FBQUEsWUFHQSxPQUFPLEtBQUssbUNBQW1DLE1BQU07QUFBQSxZQUNyRDtBQUFBLGNBQ0MsU0FBUyxPQUFPLGlDQUFpQyxTQUFTLEVBQUU7QUFBQSxjQUM1RCxZQUFZO0FBQUEsWUFDYjtBQUFBLFlBRUE7QUFBQTtBQUFBLGNBRUMsU0FBUyxPQUFPLE9BQU8sUUFBUSxtQkFBbUIsU0FBUyxLQUFLLGFBQWEsU0FBUyxHQUFHO0FBQUEsY0FDekYsUUFBUTtBQUFBLFlBQ1Q7QUFBQSxVQUNEO0FBQUEsVUFFQSxXQUFXO0FBQUEsVUFDWCxXQUFXO0FBQUEsWUFDVjtBQUFBO0FBQUEsWUFFQTtBQUFBLFVBQ0Q7QUFBQSxVQUNBLFdBQVc7QUFBQSxVQUVYLFVBQVU7QUFBQSxZQUNULFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxVQUNiO0FBQUEsVUFDQSxZQUFZO0FBQUEsVUFDWixlQUFlO0FBQUEsUUFDaEI7QUFFQSxpQkFBUyxPQUFPQSxPQUFNLFVBQVUsU0FBUyxHQUFHO0FBQzNDLGNBQUksUUFBUSxjQUFjO0FBQ3pCLHVCQUFXLEdBQUcsSUFBSUEsT0FBTSxVQUFVLFNBQVMsRUFBRSxHQUFHO0FBQUEsVUFDakQ7QUFBQSxRQUNEO0FBRUEsUUFBQUEsT0FBTSxVQUFVLFFBQVEsSUFBSUEsT0FBTSxVQUFVLFNBQVM7QUFBQSxNQUV0RCxHQUFFLEtBQUs7QUFFUCxZQUFNLFVBQVUsT0FBTztBQUFBLFFBQ3RCLFdBQVc7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxRQUNUO0FBQUEsUUFDQSxxQkFBcUI7QUFBQSxVQUNwQixTQUFTO0FBQUEsVUFDVCxZQUFZO0FBQUEsVUFDWixRQUFRO0FBQUEsWUFDUCxhQUFhO0FBQUEsY0FDWixTQUFTO0FBQUEsY0FDVCxPQUFPO0FBQUEsWUFDUjtBQUFBLFlBQ0EsZUFBZTtBQUFBLFlBQ2YsbUJBQW1CO0FBQUEsY0FDbEIsU0FBUztBQUFBLGNBQ1QsT0FBTztBQUFBLFlBQ1I7QUFBQSxVQUNEO0FBQUEsUUFDRDtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ2IsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osT0FBTztBQUFBLFFBQ1I7QUFBQSxRQUNBLGFBQWE7QUFBQSxVQUNaLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLE9BQU87QUFBQSxRQUNSO0FBQUEsUUFDQSxXQUFXO0FBQUEsUUFDWCxXQUFXO0FBQUEsUUFDWCxrQkFBa0I7QUFBQSxVQUNqQixTQUFTO0FBQUEsVUFDVCxPQUFPO0FBQUEsUUFDUjtBQUFBLFFBQ0EsY0FBYztBQUFBLFFBQ2QsZ0JBQWdCO0FBQUEsVUFDZixTQUFTO0FBQUEsVUFDVCxPQUFPO0FBQUEsUUFDUjtBQUFBLFFBQ0EsbUJBQW1CO0FBQUEsVUFDbEIsU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFFBQ1I7QUFBQSxRQUNBLHFCQUFxQjtBQUFBLFVBQ3BCLFNBQVM7QUFBQSxVQUFnRSxPQUFPO0FBQUEsUUFDakY7QUFBQSxRQUNBLHlCQUF5QjtBQUFBLFVBQ3hCLEVBQUUsU0FBUyxzQ0FBc0MsT0FBTyxTQUFTO0FBQUEsVUFDakUsRUFBRSxTQUFTLHNDQUFzQyxPQUFPLFNBQVM7QUFBQSxVQUNqRSxFQUFFLFNBQVMsNEJBQTRCLE9BQU8sU0FBUztBQUFBLFVBQ3ZELEVBQUUsU0FBUyxlQUFlLE9BQU8sU0FBUztBQUFBLFFBQzNDO0FBQUEsUUFDQSxlQUFlO0FBQUEsVUFDZCxTQUFTO0FBQUEsVUFDVCxPQUFPO0FBQUEsUUFDUjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFVBQ1gsRUFBRSxTQUFTLHlDQUF5QztBQUFBLFVBQ3BELEVBQUUsU0FBUyxZQUFZO0FBQUEsVUFDdkIsRUFBRSxTQUFTLDJDQUEyQztBQUFBLFVBQ3RELEVBQUUsU0FBUyx3QkFBd0IsWUFBWSxLQUFLO0FBQUEsVUFDcEQsRUFBRSxTQUFTLG1DQUFtQyxZQUFZLEtBQUs7QUFBQSxVQUMvRCxFQUFFLFNBQVMseURBQXlEO0FBQUEsVUFDcEUsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUNqQjtBQUFBLFFBQ0EsZUFBZTtBQUFBLE1BQ2hCO0FBRUEsWUFBTSxVQUFVLE9BQU8sTUFBTSxVQUFVLE9BQU8sVUFBVTtBQUFBLFFBQ3ZELGlCQUFpQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLE9BQU87QUFBQSxRQUNSO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxRQUFRO0FBQUEsWUFDUCxlQUFlO0FBQUEsWUFDZixhQUFhO0FBQUEsVUFDZDtBQUFBLFFBQ0Q7QUFBQSxRQUNBLFlBQVk7QUFBQTtBQUFBLFVBRVgsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFlBQ1AsZUFBZTtBQUFBLGNBQ2QsU0FBUztBQUFBLGNBQ1QsWUFBWTtBQUFBLGNBQ1osT0FBTyxDQUFDLFFBQVEsUUFBUTtBQUFBLFlBQ3pCO0FBQUEsWUFDQSxRQUFRO0FBQUEsY0FDUCxTQUFTO0FBQUEsY0FDVCxZQUFZO0FBQUEsWUFDYjtBQUFBLFlBQ0EsVUFBVTtBQUFBLGNBQ1QsU0FBUztBQUFBLGNBQ1QsWUFBWTtBQUFBLFlBQ2I7QUFBQSxZQUNBLGVBQWU7QUFBQSxVQUNoQjtBQUFBLFFBQ0Q7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNMLFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxRQUNSO0FBQUEsUUFDQSxPQUFPO0FBQUEsVUFDTjtBQUFBLFVBQ0E7QUFBQSxRQUNEO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDWDtBQUFBO0FBQUE7QUFBQSxVQUdBO0FBQUEsVUFDQTtBQUFBLFFBQ0Q7QUFBQSxRQUNBLFVBQVU7QUFBQSxVQUNUO0FBQUEsVUFDQTtBQUFBLFFBQ0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBS0EsYUFBYTtBQUFBLFVBQ1osU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osUUFBUTtBQUFBLFlBQ1AsYUFBYTtBQUFBLGNBQ1osU0FBUztBQUFBLGNBQ1QsT0FBTztBQUFBLFlBQ1I7QUFBQSxZQUNBLE1BQU0sTUFBTSxVQUFVLE9BQU8sS0FBSyxFQUFFO0FBQUEsVUFDckM7QUFBQSxRQUNEO0FBQUEsUUFDQSxlQUFlO0FBQUEsTUFDaEIsQ0FBQztBQUVELFlBQU0sVUFBVSxhQUFhLFFBQVEsT0FBTztBQUFBO0FBQUEsUUFFM0MsVUFBVTtBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFlBQ1AsT0FBTztBQUFBLGNBQ04sU0FBUztBQUFBLGNBQ1QsUUFBUSxNQUFNLFVBQVUsT0FBTyxLQUFLLEVBQUU7QUFBQSxZQUN2QztBQUFBLFVBQ0Q7QUFBQSxRQUNEO0FBQUEsTUFDRCxDQUFDO0FBRUQsWUFBTSxVQUFVLFVBQVU7QUFBQSxRQUN6QjtBQUFBO0FBQUEsVUFDQztBQUFBO0FBQUEsUUFDRCxVQUFVO0FBQUEsVUFDVCxTQUFTO0FBQUEsVUFDVCxRQUFRO0FBQUEsUUFDVDtBQUFBLFFBQ0EsV0FBVztBQUFBLFFBQ1gsV0FBVztBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFFBQ1I7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxRQUNSO0FBQUEsUUFDQSxtQkFBbUI7QUFBQSxVQUNsQixTQUFTO0FBQUEsVUFDVCxPQUFPO0FBQUEsUUFDUjtBQUFBLFFBQ0EsV0FBVztBQUFBLFFBQ1gsVUFBVTtBQUFBLFFBQ1YsWUFBWTtBQUFBLFFBQ1osZUFBZTtBQUFBLE1BQ2hCO0FBRUEsWUFBTSxVQUFVLGNBQWMsTUFBTSxVQUFVO0FBQzlDLFlBQU0sVUFBVSxLQUFLLE1BQU0sVUFBVTtBQUNyQyxZQUFNLFVBQVUsS0FBSyxNQUFNLFVBQVU7QUFJckMsWUFBTSxVQUFVLE9BQU87QUFBQTtBQUFBO0FBQUEsUUFHdEIsV0FBVztBQUFBLFVBQ1Y7QUFBQTtBQUFBO0FBQUEsWUFHQyxTQUFTO0FBQUEsWUFDVCxRQUFRO0FBQUEsVUFDVDtBQUFBLFVBQ0E7QUFBQSxZQUNDLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLFFBQVE7QUFBQSxVQUNUO0FBQUEsUUFDRDtBQUFBO0FBQUE7QUFBQSxRQUlBLHdCQUF3QjtBQUFBLFVBQ3ZCLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxRQUNSO0FBQUE7QUFBQSxRQUdBLGtCQUFrQjtBQUFBO0FBQUEsUUFHbEIsWUFBWTtBQUFBLFVBQ1gsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFVBQ1IsT0FBTztBQUFBLFFBQ1I7QUFBQTtBQUFBLFFBR0EsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBSVosU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFFBQ1I7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNiO0FBQUE7QUFBQTtBQUFBLFlBR0MsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFVBQ2I7QUFBQTtBQUFBO0FBQUEsVUFHQTtBQUFBLFFBQ0Q7QUFBQTtBQUFBLFFBR0EsWUFBWTtBQUFBLFFBRVosUUFBUTtBQUFBLFVBQ1AsU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFFBQ1I7QUFBQSxRQUNBLFdBQVc7QUFBQSxRQUNYLFdBQVc7QUFBQSxRQUNYLFVBQVU7QUFBQTtBQUFBLFFBR1YsWUFBWTtBQUFBLFFBRVosWUFBWTtBQUFBLFFBQ1osZUFBZTtBQUFBLE1BQ2hCO0FBRUEsWUFBTSxVQUFVLEtBQUssZ0JBQWdCLElBQUk7QUFBQTtBQUFBLFFBRXhDLFNBQVM7QUFBQSxRQUNULFlBQVk7QUFBQSxRQUNaLFFBQVE7QUFBQSxRQUNSLFFBQVE7QUFBQSxVQUNQLGlCQUFpQjtBQUFBO0FBQUEsWUFFaEIsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFlBQ1osUUFBUTtBQUFBLGNBQ1AsY0FBYztBQUFBLGdCQUNiLFNBQVM7QUFBQSxnQkFDVCxZQUFZO0FBQUEsZ0JBQ1osUUFBUSxNQUFNLFVBQVU7QUFBQSxjQUN6QjtBQUFBLGNBQ0EsNkJBQTZCO0FBQUEsZ0JBQzVCLFNBQVM7QUFBQSxnQkFDVCxPQUFPO0FBQUEsY0FDUjtBQUFBLFlBQ0Q7QUFBQSxVQUNEO0FBQUEsVUFDQSxVQUFVO0FBQUEsUUFDWDtBQUFBLE1BQ0Q7QUFFQSxPQUFDLFNBQVVBLFFBQU87QUFDakIsUUFBQUEsT0FBTSxVQUFVLFFBQVFBLE9BQU0sVUFBVSxPQUFPLFVBQVU7QUFBQSxVQUN4RCxZQUFZO0FBQUEsWUFDWCxTQUFTO0FBQUEsWUFDVCxRQUFRO0FBQUEsY0FDUCxlQUFlO0FBQUEsZ0JBQ2QsU0FBUztBQUFBLGNBQ1Y7QUFBQSxZQUNEO0FBQUEsVUFDRDtBQUFBLFVBQ0EsWUFBWTtBQUFBLFlBQ1gsU0FBUztBQUFBLFlBQ1QsUUFBUTtBQUFBLGNBQ1AsZUFBZTtBQUFBLGdCQUNkLFNBQVM7QUFBQSxjQUNWO0FBQUEsY0FDQSxZQUFZO0FBQUEsZ0JBQ1gsU0FBUztBQUFBLGNBQ1Y7QUFBQSxZQUNEO0FBQUEsVUFDRDtBQUFBLFVBQ0EsbUJBQW1CO0FBQUEsWUFDbEIsU0FBUztBQUFBLFlBQ1QsUUFBUTtBQUFBLGNBQ1AsWUFBWTtBQUFBLGdCQUNYLFNBQVM7QUFBQSxnQkFDVCxRQUFRO0FBQUEsa0JBQ1AsZUFBZTtBQUFBLG9CQUNkLFNBQVM7QUFBQSxrQkFDVjtBQUFBLGtCQUNBLFlBQVk7QUFBQSxvQkFDWCxTQUFTO0FBQUEsa0JBQ1Y7QUFBQSxnQkFDRDtBQUFBLGNBQ0Q7QUFBQSxjQUNBLGVBQWU7QUFBQSxnQkFDZCxTQUFTO0FBQUEsY0FDVjtBQUFBLFlBQ0Q7QUFBQSxZQUNBLE9BQU87QUFBQSxVQUNSO0FBQUEsVUFDQSxrQkFBa0I7QUFBQSxZQUNqQixTQUFTO0FBQUEsWUFDVCxRQUFRO0FBQUEsY0FDUCxlQUFlO0FBQUEsZ0JBQ2QsU0FBUztBQUFBLGNBQ1Y7QUFBQSxZQUNEO0FBQUEsWUFDQSxPQUFPO0FBQUEsVUFDUjtBQUFBLFVBQ0Esb0JBQW9CO0FBQUEsWUFDbkIsU0FBUztBQUFBLFlBQ1QsUUFBUTtBQUFBLGNBQ1AsZUFBZTtBQUFBLGdCQUNkLFNBQVM7QUFBQSxnQkFDVCxRQUFRO0FBQUEsa0JBQ1AsT0FBTztBQUFBLG9CQUNOLFNBQVM7QUFBQSxrQkFDVjtBQUFBLGdCQUNEO0FBQUEsY0FDRDtBQUFBLFlBQ0Q7QUFBQSxZQUNBLE9BQU87QUFBQSxVQUNSO0FBQUEsVUFDQSx3QkFBd0I7QUFBQSxZQUN2QixTQUFTO0FBQUEsWUFDVCxRQUFRO0FBQUEsY0FDUCxlQUFlO0FBQUEsZ0JBQ2QsU0FBUztBQUFBLGdCQUNULFFBQVE7QUFBQSxrQkFDUCxPQUFPO0FBQUEsb0JBQ04sU0FBUztBQUFBLGtCQUNWO0FBQUEsZ0JBQ0Q7QUFBQSxjQUNEO0FBQUEsY0FDQSxhQUFhO0FBQUEsZ0JBQ1osU0FBUztBQUFBLGdCQUNULFFBQVE7QUFBQSxrQkFDUCxlQUFlO0FBQUEsb0JBQ2QsU0FBUztBQUFBLGtCQUNWO0FBQUEsZ0JBQ0Q7QUFBQSxnQkFDQSxPQUFPO0FBQUEsY0FDUjtBQUFBLFlBQ0Q7QUFBQSxZQUNBLE9BQU87QUFBQSxVQUNSO0FBQUEsVUFDQSw2QkFBNkI7QUFBQSxZQUM1QixTQUFTO0FBQUEsWUFDVCxRQUFRO0FBQUEsY0FDUCxlQUFlO0FBQUEsZ0JBQ2QsU0FBUztBQUFBLGNBQ1Y7QUFBQSxZQUNEO0FBQUEsWUFDQSxPQUFPO0FBQUEsVUFDUjtBQUFBLFVBQ0EseUJBQXlCO0FBQUEsWUFDeEIsU0FBUztBQUFBLFlBQ1QsUUFBUTtBQUFBLGNBQ1AsZUFBZTtBQUFBLGdCQUNkLFNBQVM7QUFBQSxjQUNWO0FBQUEsWUFDRDtBQUFBLFlBQ0EsT0FBTztBQUFBLFVBQ1I7QUFBQSxRQUNELENBQUM7QUFFRCxRQUFBQSxPQUFNLFVBQVUsYUFBYSxVQUFVLGVBQWU7QUFBQSxVQUNyRCxZQUFZQSxPQUFNLFVBQVUsTUFBTSxpQkFBaUIsRUFBRSxPQUFPLFVBQVU7QUFBQSxRQUN2RSxHQUFHQSxPQUFNLFVBQVUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxRQUFBQSxPQUFNLFVBQVUsWUFBWUEsT0FBTSxVQUFVO0FBQUEsTUFFN0MsR0FBRSxLQUFLO0FBRVAsT0FBQyxTQUFVQSxRQUFPO0FBUWpCLGlCQUFTLGlCQUFpQixNQUFNLFlBQVk7QUFDM0MsY0FBSUEsT0FBTSxVQUFVLElBQUksR0FBRztBQUMxQixZQUFBQSxPQUFNLFVBQVUsYUFBYSxNQUFNLFdBQVc7QUFBQSxjQUM3QyxlQUFlO0FBQUEsWUFDaEIsQ0FBQztBQUFBLFVBQ0Y7QUFBQSxRQUNEO0FBRUEsWUFBSSxNQUFNQSxPQUFNLFVBQVUsT0FBTztBQUVqQyxZQUFJLGtCQUFrQjtBQUFBLFVBQ3JCLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxVQUNQLFFBQVE7QUFBQSxZQUNQLE9BQU87QUFBQSxVQUNSO0FBQUEsUUFDRDtBQUNBLFlBQUksaUJBQWlCO0FBQUEsVUFDcEIsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFVBQ1IsT0FBTztBQUFBLFVBQ1AsUUFBUTtBQUFBLFlBQ1AsT0FBTztBQUFBLFVBQ1I7QUFBQSxRQUNEO0FBRUEseUJBQWlCLFVBQVUsZUFBZTtBQUMxQyx5QkFBaUIsVUFBVSxlQUFlO0FBQzFDLHlCQUFpQixTQUFTLGNBQWM7QUFBQSxNQUV6QyxHQUFFLEtBQUs7QUFFUCxZQUFNLFVBQVUsT0FBTztBQUFBLFFBQ3RCLFdBQVc7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxRQUNUO0FBQUEsUUFDQSxVQUFVO0FBQUEsVUFDVCxTQUFTO0FBQUEsVUFDVCxRQUFRO0FBQUEsUUFDVDtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ1Q7QUFBQSxVQUNBO0FBQUEsUUFDRDtBQUFBLFFBQ0EsYUFBYTtBQUFBLFVBQ1osU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFFBQ1I7QUFBQSxRQUNBLFdBQVc7QUFBQSxRQUNYLFlBQVk7QUFBQSxRQUNaLGVBQWU7QUFBQSxNQUNoQjtBQUVBLE9BQUMsU0FBVUEsUUFBTztBQUVqQixRQUFBQSxPQUFNLFVBQVUsU0FBU0EsT0FBTSxVQUFVLE9BQU8sVUFBVTtBQUFBLFVBQ3pELGtCQUFrQjtBQUFBLFlBQ2pCLFNBQVM7QUFBQSxZQUNULFFBQVE7QUFBQSxZQUNSLE9BQU87QUFBQSxVQUNSO0FBQUEsVUFDQSxVQUFVO0FBQUEsWUFDVCxTQUFTO0FBQUEsWUFDVCxRQUFRO0FBQUEsVUFDVDtBQUFBLFVBQ0EsYUFBYTtBQUFBLFlBQ1osU0FBUztBQUFBLFlBQ1QsT0FBTztBQUFBLFVBQ1I7QUFBQSxVQUNBLFlBQVk7QUFBQSxVQUNaLFFBQVE7QUFBQSxZQUNQLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLE9BQU87QUFBQSxVQUNSO0FBQUEsVUFDQSxvQkFBb0I7QUFBQSxZQUNuQixTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsWUFDWixPQUFPO0FBQUEsVUFDUjtBQUFBLFVBQ0EsV0FBVztBQUFBLFlBQ1YsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFVBQ2I7QUFBQSxVQUNBLFlBQVk7QUFBQSxVQUNaLGtCQUFrQjtBQUFBLFlBQ2pCLFNBQVM7QUFBQSxZQUNULFlBQVk7QUFBQSxZQUNaLE9BQU87QUFBQSxVQUNSO0FBQUEsVUFDQSxvQkFBb0I7QUFBQSxZQUNuQixTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsWUFDWixPQUFPO0FBQUEsVUFDUjtBQUFBLFVBQ0EsV0FBVztBQUFBLFlBQ1YsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFVBQ2I7QUFBQSxVQUNBLFVBQVU7QUFBQSxVQUNWLFlBQVk7QUFBQSxZQUNYO0FBQUEsWUFDQTtBQUFBLGNBQ0MsU0FBUztBQUFBLGNBQ1QsWUFBWTtBQUFBLFlBQ2I7QUFBQSxVQUNEO0FBQUEsVUFDQSxlQUFlO0FBQUEsUUFDaEIsQ0FBQztBQUVELFFBQUFBLE9BQU0sVUFBVSxPQUFPLElBQUksVUFBVTtBQUNyQyxRQUFBQSxPQUFNLFVBQVUsT0FBTyxLQUFLLEVBQUUsT0FBTyxZQUFZLEVBQUUsVUFBVTtBQUM3RCxRQUFBQSxPQUFNLFVBQVUsT0FBTyxLQUFLLEVBQUUsT0FBTyxZQUFZLEVBQUUsT0FBTyxhQUFhLElBQUk7QUFDM0UsUUFBQUEsT0FBTSxVQUFVLE9BQU8sS0FBSyxFQUFFLE9BQU8sWUFBWSxFQUFFLE9BQU8sWUFBWSxJQUFJO0FBQUE7QUFBQSxVQUV6RSxTQUFTO0FBQUEsVUFDVCxRQUFRQSxPQUFNLFVBQVU7QUFBQSxVQUN4QixPQUFPO0FBQUEsUUFDUjtBQUdBLFlBQUksaUJBQWlCLFNBQVUsT0FBTztBQUNyQyxjQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzlCLG1CQUFPO0FBQUEsVUFDUjtBQUNBLGNBQUksT0FBTyxNQUFNLFlBQVksVUFBVTtBQUN0QyxtQkFBTyxNQUFNO0FBQUEsVUFDZDtBQUNBLGlCQUFPLE1BQU0sUUFBUSxJQUFJLGNBQWMsRUFBRSxLQUFLLEVBQUU7QUFBQSxRQUNqRDtBQUVBLFlBQUksYUFBYSxTQUFVLFFBQVE7QUFDbEMsY0FBSSxhQUFhLENBQUM7QUFDbEIsbUJBQVMsSUFBSSxHQUFHLElBQUksT0FBTyxRQUFRLEtBQUs7QUFDdkMsZ0JBQUksUUFBUSxPQUFPLENBQUM7QUFDcEIsZ0JBQUksaUJBQWlCO0FBRXJCLGdCQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzlCLGtCQUFJLE1BQU0sU0FBUyxTQUFTLE1BQU0sUUFBUSxDQUFDLEtBQUssTUFBTSxRQUFRLENBQUMsRUFBRSxTQUFTLE9BQU87QUFHaEYsb0JBQUksTUFBTSxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxZQUFZLE1BQU07QUFFakQsc0JBQUksV0FBVyxTQUFTLEtBQUssV0FBVyxXQUFXLFNBQVMsQ0FBQyxFQUFFLFlBQVksZUFBZSxNQUFNLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEdBQUc7QUFFdkgsK0JBQVcsSUFBSTtBQUFBLGtCQUNoQjtBQUFBLGdCQUNELE9BQU87QUFDTixzQkFBSSxNQUFNLFFBQVEsTUFBTSxRQUFRLFNBQVMsQ0FBQyxFQUFFLFlBQVksTUFBTTtBQUFBLGtCQUU5RCxPQUFPO0FBRU4sK0JBQVcsS0FBSztBQUFBLHNCQUNmLFNBQVMsZUFBZSxNQUFNLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQUEsc0JBQ25ELGNBQWM7QUFBQSxvQkFDZixDQUFDO0FBQUEsa0JBQ0Y7QUFBQSxnQkFDRDtBQUFBLGNBQ0QsV0FDQyxXQUFXLFNBQVMsS0FBSyxNQUFNLFNBQVMsaUJBQWlCLE1BQU0sWUFBWTtBQUFBLGVBRTFFLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxFQUFFLFNBQVMsaUJBQWlCLE9BQU8sSUFBSSxDQUFDLEVBQUUsWUFBWSxTQUNwRixDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsRUFBRSxTQUFTLGdCQUFnQixPQUFPLElBQUksQ0FBQyxFQUFFLFlBQVksTUFDbkY7QUFFRCwyQkFBVyxXQUFXLFNBQVMsQ0FBQyxFQUFFO0FBQUEsY0FFbkMsV0FBVyxXQUFXLFNBQVMsS0FBSyxXQUFXLFdBQVcsU0FBUyxDQUFDLEVBQUUsZUFBZSxLQUFLLE1BQU0sU0FBUyxpQkFBaUIsTUFBTSxZQUFZLEtBQUs7QUFHaEosMkJBQVcsV0FBVyxTQUFTLENBQUMsRUFBRTtBQUFBLGNBRW5DLFdBQVcsTUFBTSxTQUFTLFdBQVc7QUFDcEMsaUNBQWlCO0FBQUEsY0FDbEI7QUFBQSxZQUNEO0FBQ0EsZ0JBQUksa0JBQWtCLE9BQU8sVUFBVSxVQUFVO0FBQ2hELGtCQUFJLFdBQVcsU0FBUyxLQUFLLFdBQVcsV0FBVyxTQUFTLENBQUMsRUFBRSxpQkFBaUIsR0FBRztBQUdsRixvQkFBSSxZQUFZLGVBQWUsS0FBSztBQUdwQyxvQkFBSSxJQUFJLE9BQU8sU0FBUyxNQUFNLE9BQU8sT0FBTyxJQUFJLENBQUMsTUFBTSxZQUFZLE9BQU8sSUFBSSxDQUFDLEVBQUUsU0FBUyxlQUFlO0FBQ3hHLCtCQUFhLGVBQWUsT0FBTyxJQUFJLENBQUMsQ0FBQztBQUN6Qyx5QkFBTyxPQUFPLElBQUksR0FBRyxDQUFDO0FBQUEsZ0JBQ3ZCO0FBQ0Esb0JBQUksSUFBSSxNQUFNLE9BQU8sT0FBTyxJQUFJLENBQUMsTUFBTSxZQUFZLE9BQU8sSUFBSSxDQUFDLEVBQUUsU0FBUyxlQUFlO0FBQ3hGLDhCQUFZLGVBQWUsT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJO0FBQzVDLHlCQUFPLE9BQU8sSUFBSSxHQUFHLENBQUM7QUFDdEI7QUFBQSxnQkFDRDtBQUVBLG9CQUFJLFFBQVEsS0FBSyxTQUFTLEdBQUc7QUFDNUIseUJBQU8sQ0FBQyxJQUFJO0FBQUEsZ0JBQ2IsT0FBTztBQUNOLHlCQUFPLENBQUMsSUFBSSxJQUFJQSxPQUFNLE1BQU0sY0FBYyxXQUFXLE1BQU0sU0FBUztBQUFBLGdCQUNyRTtBQUFBLGNBQ0Q7QUFBQSxZQUNEO0FBRUEsZ0JBQUksTUFBTSxXQUFXLE9BQU8sTUFBTSxZQUFZLFVBQVU7QUFDdkQseUJBQVcsTUFBTSxPQUFPO0FBQUEsWUFDekI7QUFBQSxVQUNEO0FBQUEsUUFDRDtBQUVBLFFBQUFBLE9BQU0sTUFBTSxJQUFJLGtCQUFrQixTQUFVLEtBQUs7QUFDaEQsY0FBSSxJQUFJLGFBQWEsVUFBVTtBQUM5QjtBQUFBLFVBQ0Q7QUFDQSxxQkFBVyxJQUFJLE1BQU07QUFBQSxRQUN0QixDQUFDO0FBQUEsTUFFRixHQUFFLEtBQUs7QUFFUCxZQUFNLFVBQVUsT0FBTztBQUFBO0FBQUE7QUFBQSxRQUd0QixXQUFXO0FBQUEsUUFDWCxVQUFVO0FBQUEsVUFDVCxTQUFTO0FBQUEsVUFDVCxRQUFRO0FBQUEsUUFDVDtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFFBQ2I7QUFBQSxRQUNBLGFBQWE7QUFBQSxVQUNaLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxRQUNiO0FBQUEsUUFDQSxXQUFXO0FBQUEsUUFDWCxZQUFZO0FBQUEsUUFDWixlQUFlO0FBQUEsTUFDaEI7QUFFQSxPQUFDLFNBQVVBLFFBQU87QUFFakIsaUJBQVMsUUFBUSxLQUFLO0FBQ3JCLGlCQUFPLFdBQVk7QUFBRSxtQkFBTztBQUFBLFVBQUs7QUFBQSxRQUNsQztBQUVBLFlBQUksVUFBVTtBQUVkLFlBQUksYUFBYSxXQUFXLFFBQVEsU0FBUztBQUM3QyxZQUFJLFFBQVEsb0NBQW9DO0FBQ2hELFlBQUksaUJBQWlCLDBHQUEwRyxPQUFPLFFBQVEsWUFBWSxRQUFRLEtBQUssQ0FBQztBQUN4SyxZQUFJLGNBQWMsMkRBQTJELE9BQU8sUUFBUSxTQUFTLFFBQVEsVUFBVSxDQUFDO0FBQ3hILFlBQUksT0FBTyx3QkFBd0IsaUJBQWlCLFdBQVcsY0FBYztBQW1CN0UsUUFBQUEsT0FBTSxVQUFVLE1BQU07QUFBQSxVQUNyQixXQUFXO0FBQUEsWUFDVjtBQUFBLGNBQ0MsU0FBUztBQUFBLGNBQ1QsT0FBTztBQUFBLFlBQ1I7QUFBQSxZQUNBO0FBQUEsVUFDRDtBQUFBLFVBQ0EsVUFBVTtBQUFBLFlBQ1Q7QUFBQTtBQUFBLGNBRUMsU0FBUztBQUFBLGNBQ1QsWUFBWTtBQUFBLGNBQ1osUUFBUTtBQUFBLFlBQ1Q7QUFBQSxZQUNBO0FBQUE7QUFBQSxjQUVDLFNBQVM7QUFBQSxjQUNULFlBQVk7QUFBQSxjQUNaLFFBQVE7QUFBQSxZQUNUO0FBQUEsVUFDRDtBQUFBLFVBQ0EsUUFBUTtBQUFBO0FBQUEsWUFFUCxTQUFTO0FBQUEsWUFDVCxZQUFZO0FBQUEsWUFDWixRQUFRO0FBQUEsVUFDVDtBQUFBLFVBQ0EsV0FBVztBQUFBLFVBQ1gsU0FBUztBQUFBLFlBQ1IsU0FBUztBQUFBLFlBQ1QsWUFBWTtBQUFBLFVBQ2I7QUFBQSxVQUNBLGNBQWM7QUFBQTtBQUFBLFlBRWI7QUFBQSxZQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FJQyxTQUFTLE9BQU8sMEVBQTBFLE9BQU8sUUFBUSxXQUFXLFFBQVEsSUFBSSxDQUFDLEVBQUUsUUFBUSxZQUFZLFFBQVEsS0FBSyxDQUFDLENBQUM7QUFBQSxjQUN0SyxZQUFZO0FBQUEsY0FDWixRQUFRO0FBQUE7QUFBQSxZQUNUO0FBQUEsWUFDQTtBQUFBO0FBQUEsY0FFQyxTQUFTLE9BQU8sdUNBQXVDLE9BQU8sUUFBUSxXQUFXLFFBQVEsSUFBSSxDQUFDLEVBQUUsUUFBUSxZQUFZLFFBQVEsS0FBSyxDQUFDLENBQUM7QUFBQSxjQUNuSSxZQUFZO0FBQUEsY0FDWixRQUFRO0FBQUE7QUFBQSxZQUNUO0FBQUEsVUFDRDtBQUFBLFVBQ0EsZ0JBQWdCO0FBQUEsWUFDZixTQUFTO0FBQUEsWUFDVCxPQUFPO0FBQUEsVUFDUjtBQUFBLFVBQ0EsV0FBVztBQUFBLFVBQ1gsWUFBWTtBQUFBLFVBQ1osVUFBVTtBQUFBLFVBQ1YsV0FBVztBQUFBLFVBQ1gsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFFBQ2hCO0FBRUEsUUFBQUEsT0FBTSxVQUFVLElBQUksWUFBWSxFQUFFLFFBQVEsU0FBVSxLQUFLO0FBQ3hELGNBQUksSUFBSSxXQUFXLE1BQU07QUFDeEIsZ0JBQUksU0FBU0EsT0FBTSxVQUFVO0FBQUEsVUFDOUI7QUFBQSxRQUNELENBQUM7QUFBQSxNQUVGLEdBQUUsS0FBSztBQUVQLE9BQUMsV0FBWTtBQUVaLFlBQUksT0FBTyxVQUFVLGVBQWUsT0FBTyxhQUFhLGFBQWE7QUFDcEU7QUFBQSxRQUNEO0FBT0EsWUFBSSxjQUFjO0FBT2xCLFlBQUksZUFBZTtBQU1uQixZQUFJLFNBQVMsTUFBTSxRQUFRLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBUXhDLFNBQVMsU0FBVSxTQUFTLFFBQVE7QUFDbkMsZ0JBQUksUUFBUSxZQUFZLFNBQVMsQ0FBQyxRQUFRLFVBQVUsU0FBUyxXQUFXLEdBQUc7QUFDMUU7QUFBQSxZQUNEO0FBRUEsZ0JBQUksaUJBQWlCLFFBQVEsY0FBYyxvQkFBb0I7QUFDL0QsZ0JBQUksQ0FBQyxnQkFBZ0I7QUFDcEI7QUFBQSxZQUNEO0FBQ0EsZ0JBQUksa0JBQWtCLFNBQVMsUUFBUSxhQUFhLFlBQVksR0FBRyxFQUFFLEtBQUs7QUFDMUUsZ0JBQUksZ0JBQWdCLG1CQUFtQixlQUFlLFNBQVMsU0FBUztBQUV4RSxnQkFBSSxTQUFTLGlCQUFpQjtBQUM3Qix1QkFBUztBQUFBLFlBQ1Y7QUFDQSxnQkFBSSxTQUFTLGVBQWU7QUFDM0IsdUJBQVM7QUFBQSxZQUNWO0FBRUEsZ0JBQUksWUFBWSxTQUFTO0FBRXpCLG1CQUFPLGVBQWUsU0FBUyxTQUFTO0FBQUEsVUFDekM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUFVQSxRQUFRLFNBQVUsU0FBUztBQUMxQiwyQkFBZSxDQUFDLE9BQU8sQ0FBQztBQUFBLFVBQ3pCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQVlBLDRCQUE0QjtBQUFBLFFBQzdCO0FBT0EsaUJBQVMsZUFBZSxVQUFVO0FBQ2pDLHFCQUFXLFNBQVMsT0FBTyxTQUFVLEdBQUc7QUFDdkMsZ0JBQUksYUFBYSxVQUFVLENBQUM7QUFDNUIsZ0JBQUksYUFBYSxXQUFXLGFBQWE7QUFDekMsbUJBQU8sZUFBZSxjQUFjLGVBQWU7QUFBQSxVQUNwRCxDQUFDO0FBRUQsY0FBSSxTQUFTLFVBQVUsR0FBRztBQUN6QjtBQUFBLFVBQ0Q7QUFFQSxjQUFJLFFBQVEsU0FBUyxJQUFJLFNBQVUsU0FBUztBQUMzQyxnQkFBSSxjQUFjLFFBQVEsY0FBYyxNQUFNO0FBQzlDLGdCQUFJLHFCQUFxQixRQUFRLGNBQWMsb0JBQW9CO0FBQ25FLGdCQUFJLENBQUMsZUFBZSxDQUFDLG9CQUFvQjtBQUN4QyxxQkFBTztBQUFBLFlBQ1I7QUFHQSxnQkFBSSxrQkFBa0IsUUFBUSxjQUFjLHFCQUFxQjtBQUNqRSxnQkFBSSxZQUFZLFlBQVksWUFBWSxNQUFNLFlBQVk7QUFFMUQsZ0JBQUksQ0FBQyxpQkFBaUI7QUFDckIsZ0NBQWtCLFNBQVMsY0FBYyxNQUFNO0FBQy9DLDhCQUFnQixZQUFZO0FBRTVCLDBCQUFZLFlBQVksZUFBZTtBQUFBLFlBQ3hDO0FBRUEsNEJBQWdCLFlBQVk7QUFDNUIsNEJBQWdCLE1BQU0sVUFBVTtBQUVoQyxnQkFBSSxpQkFBaUIsZ0JBQWdCLHNCQUFzQixFQUFFO0FBQzdELDRCQUFnQixZQUFZO0FBRTVCLG1CQUFPO0FBQUEsY0FDTjtBQUFBLGNBQ0EsT0FBTztBQUFBLGNBQ1AsYUFBYSxDQUFDO0FBQUEsY0FDZDtBQUFBLGNBQ0EsT0FBTztBQUFBLFlBQ1I7QUFBQSxVQUNELENBQUMsRUFBRSxPQUFPLE9BQU87QUFFakIsZ0JBQU0sUUFBUSxTQUFVLE1BQU07QUFDN0IsZ0JBQUksa0JBQWtCLEtBQUs7QUFDM0IsZ0JBQUksUUFBUSxLQUFLO0FBQ2pCLGdCQUFJLGNBQWMsS0FBSztBQUN2QixnQkFBSSxpQkFBaUIsS0FBSztBQUUxQix3QkFBWSxNQUFNLFNBQVMsQ0FBQyxJQUFJO0FBQ2hDLGtCQUFNLFFBQVEsU0FBVSxNQUFNLE9BQU87QUFDcEMsa0JBQUksUUFBUSxLQUFLLFNBQVMsR0FBRztBQUM1QixvQkFBSSxJQUFJLGdCQUFnQixZQUFZLFNBQVMsY0FBYyxNQUFNLENBQUM7QUFDbEUsa0JBQUUsTUFBTSxVQUFVO0FBQ2xCLGtCQUFFLGNBQWM7QUFBQSxjQUNqQixPQUFPO0FBQ04sNEJBQVksS0FBSyxJQUFJO0FBQUEsY0FDdEI7QUFBQSxZQUNELENBQUM7QUFBQSxVQUNGLENBQUM7QUFFRCxnQkFBTSxRQUFRLFNBQVUsTUFBTTtBQUM3QixnQkFBSSxrQkFBa0IsS0FBSztBQUMzQixnQkFBSSxjQUFjLEtBQUs7QUFFdkIsZ0JBQUksYUFBYTtBQUNqQixxQkFBUyxJQUFJLEdBQUcsSUFBSSxZQUFZLFFBQVEsS0FBSztBQUM1QyxrQkFBSSxZQUFZLENBQUMsTUFBTSxRQUFXO0FBQ2pDLDRCQUFZLENBQUMsSUFBSSxnQkFBZ0IsU0FBUyxZQUFZLEVBQUUsc0JBQXNCLEVBQUU7QUFBQSxjQUNqRjtBQUFBLFlBQ0Q7QUFBQSxVQUNELENBQUM7QUFFRCxnQkFBTSxRQUFRLFNBQVUsTUFBTTtBQUM3QixnQkFBSSxrQkFBa0IsS0FBSztBQUMzQixnQkFBSSxVQUFVLEtBQUssUUFBUSxjQUFjLG9CQUFvQjtBQUU3RCw0QkFBZ0IsTUFBTSxVQUFVO0FBQ2hDLDRCQUFnQixZQUFZO0FBRTVCLGlCQUFLLFlBQVksUUFBUSxTQUFVLFFBQVEsWUFBWTtBQUN0RCxzQkFBUSxTQUFTLFVBQVUsRUFBRSxNQUFNLFNBQVMsU0FBUztBQUFBLFlBQ3RELENBQUM7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNGO0FBT0EsaUJBQVMsVUFBVSxTQUFTO0FBQzNCLGNBQUksQ0FBQyxTQUFTO0FBQ2IsbUJBQU87QUFBQSxVQUNSO0FBRUEsaUJBQU8sT0FBTyxtQkFBbUIsaUJBQWlCLE9BQU8sSUFBSyxRQUFRLGdCQUFnQjtBQUFBLFFBQ3ZGO0FBRUEsWUFBSSxZQUFZO0FBQ2hCLGVBQU8saUJBQWlCLFVBQVUsV0FBWTtBQUM3QyxjQUFJLE9BQU8sOEJBQThCLGNBQWMsT0FBTyxZQUFZO0FBQ3pFO0FBQUEsVUFDRDtBQUNBLHNCQUFZLE9BQU87QUFFbkIseUJBQWUsTUFBTSxVQUFVLE1BQU0sS0FBSyxTQUFTLGlCQUFpQixTQUFTLFdBQVcsQ0FBQyxDQUFDO0FBQUEsUUFDM0YsQ0FBQztBQUVELGNBQU0sTUFBTSxJQUFJLFlBQVksU0FBVSxLQUFLO0FBQzFDLGNBQUksQ0FBQyxJQUFJLE1BQU07QUFDZDtBQUFBLFVBQ0Q7QUFFQSxjQUFJO0FBQUE7QUFBQSxZQUErQixJQUFJO0FBQUE7QUFDdkMsY0FBSTtBQUFBO0FBQUEsWUFBa0MsS0FBSztBQUFBO0FBRzNDLGNBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLElBQUksUUFBUSxHQUFHO0FBQ3ZDO0FBQUEsVUFDRDtBQUdBLGNBQUksS0FBSyxjQUFjLG9CQUFvQixHQUFHO0FBQzdDO0FBQUEsVUFDRDtBQUdBLGNBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxNQUFNLFdBQVcsR0FBRztBQUM1QztBQUFBLFVBQ0Q7QUFHQSxlQUFLLFVBQVUsT0FBTyxXQUFXO0FBRWpDLGNBQUksVUFBVSxJQUFJLFdBQVc7QUFFN0IsY0FBSSxRQUFRLElBQUksS0FBSyxNQUFNLFlBQVk7QUFDdkMsY0FBSSxXQUFXLFFBQVEsTUFBTSxTQUFTLElBQUk7QUFDMUMsY0FBSTtBQUVKLGNBQUksUUFBUSxJQUFJLE1BQU0sV0FBVyxDQUFDLEVBQUUsS0FBSyxlQUFlO0FBRXhELCtCQUFxQixTQUFTLGNBQWMsTUFBTTtBQUNsRCw2QkFBbUIsYUFBYSxlQUFlLE1BQU07QUFDckQsNkJBQW1CLFlBQVk7QUFDL0IsNkJBQW1CLFlBQVk7QUFFL0IsY0FBSSxJQUFJLGFBQWEsWUFBWSxHQUFHO0FBQ25DLGdCQUFJLE1BQU0sZUFBZSxpQkFBaUIsU0FBUyxJQUFJLGFBQWEsWUFBWSxHQUFHLEVBQUUsSUFBSTtBQUFBLFVBQzFGO0FBRUEsY0FBSSxRQUFRLFlBQVksa0JBQWtCO0FBRTFDLHlCQUFlLENBQUMsR0FBRyxDQUFDO0FBRXBCLGdCQUFNLE1BQU0sSUFBSSxnQkFBZ0IsR0FBRztBQUFBLFFBQ3BDLENBQUM7QUFFRCxjQUFNLE1BQU0sSUFBSSxnQkFBZ0IsU0FBVSxLQUFLO0FBQzlDLGNBQUksVUFBVSxJQUFJLFdBQVcsQ0FBQztBQUM5QixjQUFJLFFBQVEsY0FBYztBQUFBLFFBQzNCLENBQUM7QUFBQSxNQUVGLEdBQUU7QUFFRixPQUFDLFdBQVk7QUFFWixZQUFJLE9BQU8sVUFBVSxlQUFlLE9BQU8sYUFBYSxhQUFhO0FBQ3BFO0FBQUEsUUFDRDtBQUdBLFlBQUksQ0FBQyxRQUFRLFVBQVUsU0FBUztBQUMvQixrQkFBUSxVQUFVLFVBQVUsUUFBUSxVQUFVLHFCQUFxQixRQUFRLFVBQVU7QUFBQSxRQUN0RjtBQUVBLFlBQUksa0JBQWtCO0FBQ3RCLFlBQUksa0JBQWtCLFNBQVUsUUFBUSxTQUFTO0FBQ2hELGlCQUFPLGtCQUFhLFNBQVMsMkJBQTJCO0FBQUEsUUFDekQ7QUFDQSxZQUFJLHdCQUF3QjtBQUU1QixZQUFJLGFBQWE7QUFBQSxVQUNoQixNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsVUFDTixPQUFPO0FBQUEsVUFDUCxRQUFRO0FBQUEsVUFDUixNQUFNO0FBQUEsVUFDTixPQUFPO0FBQUEsVUFDUCxLQUFLO0FBQUEsVUFDTCxPQUFPO0FBQUEsUUFDUjtBQUVBLFlBQUksY0FBYztBQUNsQixZQUFJLGlCQUFpQjtBQUNyQixZQUFJLGdCQUFnQjtBQUNwQixZQUFJLGdCQUFnQjtBQUVwQixZQUFJLFdBQVcsd0JBQXdCLGNBQWMsT0FBTyxnQkFBZ0IsY0FDOUQsY0FBYyxPQUFPLGlCQUFpQjtBQVNwRCxpQkFBUyxTQUFTLEtBQUssU0FBUyxPQUFPO0FBQ3RDLGNBQUksTUFBTSxJQUFJLGVBQWU7QUFDN0IsY0FBSSxLQUFLLE9BQU8sS0FBSyxJQUFJO0FBQ3pCLGNBQUkscUJBQXFCLFdBQVk7QUFDcEMsZ0JBQUksSUFBSSxjQUFjLEdBQUc7QUFDeEIsa0JBQUksSUFBSSxTQUFTLE9BQU8sSUFBSSxjQUFjO0FBQ3pDLHdCQUFRLElBQUksWUFBWTtBQUFBLGNBQ3pCLE9BQU87QUFDTixvQkFBSSxJQUFJLFVBQVUsS0FBSztBQUN0Qix3QkFBTSxnQkFBZ0IsSUFBSSxRQUFRLElBQUksVUFBVSxDQUFDO0FBQUEsZ0JBQ2xELE9BQU87QUFDTix3QkFBTSxxQkFBcUI7QUFBQSxnQkFDNUI7QUFBQSxjQUNEO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFDQSxjQUFJLEtBQUssSUFBSTtBQUFBLFFBQ2Q7QUFVQSxpQkFBUyxXQUFXUSxRQUFPO0FBQzFCLGNBQUksSUFBSSx3Q0FBd0MsS0FBS0EsVUFBUyxFQUFFO0FBQ2hFLGNBQUksR0FBRztBQUNOLGdCQUFJQyxTQUFRLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDdkIsZ0JBQUksUUFBUSxFQUFFLENBQUM7QUFDZixnQkFBSUMsT0FBTSxFQUFFLENBQUM7QUFFYixnQkFBSSxDQUFDLE9BQU87QUFDWCxxQkFBTyxDQUFDRCxRQUFPQSxNQUFLO0FBQUEsWUFDckI7QUFDQSxnQkFBSSxDQUFDQyxNQUFLO0FBQ1QscUJBQU8sQ0FBQ0QsUUFBTyxNQUFTO0FBQUEsWUFDekI7QUFDQSxtQkFBTyxDQUFDQSxRQUFPLE9BQU9DLElBQUcsQ0FBQztBQUFBLFVBQzNCO0FBQ0EsaUJBQU87QUFBQSxRQUNSO0FBRUEsY0FBTSxNQUFNLElBQUksdUJBQXVCLFNBQVUsS0FBSztBQUNyRCxjQUFJLFlBQVksT0FBTztBQUFBLFFBQ3hCLENBQUM7QUFFRCxjQUFNLE1BQU0sSUFBSSx1QkFBdUIsU0FBVSxLQUFLO0FBQ3JELGNBQUk7QUFBQTtBQUFBLFlBQXFDLElBQUk7QUFBQTtBQUM3QyxjQUFJLElBQUksUUFBUSxRQUFRLEdBQUc7QUFDMUIsZ0JBQUksT0FBTztBQUVYLGdCQUFJLGFBQWEsYUFBYSxjQUFjO0FBRzVDLGdCQUFJLE9BQU8sSUFBSSxZQUFZLFNBQVMsY0FBYyxNQUFNLENBQUM7QUFDekQsaUJBQUssY0FBYztBQUVuQixnQkFBSSxNQUFNLElBQUksYUFBYSxVQUFVO0FBRXJDLGdCQUFJLFdBQVcsSUFBSTtBQUNuQixnQkFBSSxhQUFhLFFBQVE7QUFHeEIsa0JBQUksYUFBYSxXQUFXLEtBQUssR0FBRyxLQUFLLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQztBQUN0RCx5QkFBVyxXQUFXLFNBQVMsS0FBSztBQUFBLFlBQ3JDO0FBR0Esa0JBQU0sS0FBSyxZQUFZLE1BQU0sUUFBUTtBQUNyQyxrQkFBTSxLQUFLLFlBQVksS0FBSyxRQUFRO0FBR3BDLGdCQUFJLGFBQWEsTUFBTSxRQUFRO0FBQy9CLGdCQUFJLFlBQVk7QUFDZix5QkFBVyxjQUFjLFFBQVE7QUFBQSxZQUNsQztBQUdBO0FBQUEsY0FDQztBQUFBLGNBQ0EsU0FBVSxNQUFNO0FBRWYsb0JBQUksYUFBYSxhQUFhLGFBQWE7QUFHM0Msb0JBQUlGLFNBQVEsV0FBVyxJQUFJLGFBQWEsWUFBWSxDQUFDO0FBQ3JELG9CQUFJQSxRQUFPO0FBQ1Ysc0JBQUksUUFBUSxLQUFLLE1BQU0sV0FBVztBQUdsQyxzQkFBSUMsU0FBUUQsT0FBTSxDQUFDO0FBQ25CLHNCQUFJRSxPQUFNRixPQUFNLENBQUMsS0FBSyxPQUFPLE1BQU0sU0FBU0EsT0FBTSxDQUFDO0FBRW5ELHNCQUFJQyxTQUFRLEdBQUc7QUFBRSxvQkFBQUEsVUFBUyxNQUFNO0FBQUEsa0JBQVE7QUFDeEMsa0JBQUFBLFNBQVEsS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJQSxTQUFRLEdBQUcsTUFBTSxNQUFNLENBQUM7QUFDckQsc0JBQUlDLE9BQU0sR0FBRztBQUFFLG9CQUFBQSxRQUFPLE1BQU07QUFBQSxrQkFBUTtBQUNwQyxrQkFBQUEsT0FBTSxLQUFLLElBQUksR0FBRyxLQUFLLElBQUlBLE1BQUssTUFBTSxNQUFNLENBQUM7QUFFN0MseUJBQU8sTUFBTSxNQUFNRCxRQUFPQyxJQUFHLEVBQUUsS0FBSyxJQUFJO0FBR3hDLHNCQUFJLENBQUMsSUFBSSxhQUFhLFlBQVksR0FBRztBQUNwQyx3QkFBSSxhQUFhLGNBQWMsT0FBT0QsU0FBUSxDQUFDLENBQUM7QUFBQSxrQkFDakQ7QUFBQSxnQkFDRDtBQUdBLHFCQUFLLGNBQWM7QUFDbkIsc0JBQU0saUJBQWlCLElBQUk7QUFBQSxjQUM1QjtBQUFBLGNBQ0EsU0FBVSxPQUFPO0FBRWhCLG9CQUFJLGFBQWEsYUFBYSxhQUFhO0FBRTNDLHFCQUFLLGNBQWM7QUFBQSxjQUNwQjtBQUFBLFlBQ0Q7QUFBQSxVQUNEO0FBQUEsUUFDRCxDQUFDO0FBRUQsY0FBTSxRQUFRLGdCQUFnQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUFRN0IsV0FBVyxTQUFTLFVBQVUsV0FBVztBQUN4QyxnQkFBSSxZQUFZLGFBQWEsVUFBVSxpQkFBaUIsUUFBUTtBQUVoRSxxQkFBUyxJQUFJLEdBQUcsU0FBVSxVQUFVLFNBQVMsR0FBRyxLQUFLO0FBQ3BELG9CQUFNLGlCQUFpQixPQUFPO0FBQUEsWUFDL0I7QUFBQSxVQUNEO0FBQUEsUUFDRDtBQUVBLFlBQUksU0FBUztBQUViLGNBQU0sZ0JBQWdCLFdBQVk7QUFDakMsY0FBSSxDQUFDLFFBQVE7QUFDWixvQkFBUSxLQUFLLHlGQUF5RjtBQUN0RyxxQkFBUztBQUFBLFVBQ1Y7QUFDQSxnQkFBTSxRQUFRLGNBQWMsVUFBVSxNQUFNLE1BQU0sU0FBUztBQUFBLFFBQzVEO0FBQUEsTUFFRCxHQUFFO0FBQUE7QUFBQTs7O0FDbndxQkY7QUFBQTtBQU1BLE9BQUMsU0FBVUUsU0FBUUMsV0FBVTtBQUMzQjtBQUdBLFNBQUMsV0FBWTtBQUNYLGNBQUksV0FBVztBQUNmLGNBQUksVUFBVSxDQUFDLE1BQU0sT0FBTyxVQUFVLEdBQUc7QUFDekMsbUJBQVMsSUFBSSxHQUFHLElBQUksUUFBUSxVQUFVLENBQUNELFFBQU8sdUJBQXVCLEVBQUUsR0FBRztBQUN4RSxZQUFBQSxRQUFPLHdCQUNMQSxRQUFPLFFBQVEsQ0FBQyxJQUFJLHVCQUF1QjtBQUM3QyxZQUFBQSxRQUFPLHVCQUNMQSxRQUFPLFFBQVEsQ0FBQyxJQUFJLHNCQUFzQixLQUMxQ0EsUUFBTyxRQUFRLENBQUMsSUFBSSw2QkFBNkI7QUFBQSxVQUNyRDtBQUNBLGNBQUksQ0FBQ0EsUUFBTztBQUNWLFlBQUFBLFFBQU8sd0JBQXdCLFNBQVUsVUFBVSxTQUFTO0FBQzFELGtCQUFJLFlBQVcsb0JBQUksS0FBSyxHQUFFLFFBQVE7QUFDbEMsa0JBQUksYUFBYSxLQUFLLElBQUksR0FBRyxNQUFNLFdBQVcsU0FBUztBQUN2RCxrQkFBSSxLQUFLQSxRQUFPLFdBQVcsV0FBWTtBQUNyQyx5QkFBUyxXQUFXLFVBQVU7QUFBQSxjQUNoQyxHQUFHLFVBQVU7QUFDYix5QkFBVyxXQUFXO0FBQ3RCLHFCQUFPO0FBQUEsWUFDVDtBQUNGLGNBQUksQ0FBQ0EsUUFBTztBQUNWLFlBQUFBLFFBQU8sdUJBQXVCLFNBQVUsSUFBSTtBQUMxQywyQkFBYSxFQUFFO0FBQUEsWUFDakI7QUFBQSxRQUNKLEdBQUc7QUFFSCxZQUFJLFFBQ0YsaUJBQ0EsYUFDQSxpQkFDQSxTQUNBLFdBQVcsU0FBVSxNQUFNLE1BQU0sU0FBUztBQUN4QyxjQUFJLEtBQUs7QUFBa0IsaUJBQUssaUJBQWlCLE1BQU0sU0FBUyxLQUFLO0FBQUEsbUJBQzVELEtBQUs7QUFBYSxpQkFBSyxZQUFZLE9BQU8sTUFBTSxPQUFPO0FBQUE7QUFDM0QsaUJBQUssT0FBTyxJQUFJLElBQUk7QUFBQSxRQUMzQixHQUNBLFVBQVU7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULGNBQWM7QUFBQSxVQUNkLFdBQVc7QUFBQSxZQUNULEdBQUc7QUFBQSxZQUNILE9BQU87QUFBQSxZQUNQLE9BQU87QUFBQSxZQUNQLE9BQU87QUFBQSxZQUNQLE9BQU87QUFBQSxVQUNUO0FBQUEsVUFDQSxZQUFZO0FBQUEsVUFDWixhQUFhO0FBQUEsVUFDYixXQUFXO0FBQUEsUUFDYixHQUNBLFVBQVUsV0FBWTtBQUNwQixpQkFBTyxRQUFRQSxRQUFPO0FBQ3RCLGlCQUFPLFNBQVMsUUFBUSxlQUFlO0FBRXZDLGNBQUksTUFBTSxPQUFPLFdBQVcsSUFBSTtBQUNoQyxjQUFJLGFBQWEsUUFBUTtBQUN6QixjQUFJLGNBQWMsUUFBUTtBQUUxQixjQUFJLGVBQWUsSUFBSSxxQkFBcUIsR0FBRyxHQUFHLE9BQU8sT0FBTyxDQUFDO0FBQ2pFLG1CQUFTLFFBQVEsUUFBUTtBQUN2Qix5QkFBYSxhQUFhLE1BQU0sUUFBUSxVQUFVLElBQUksQ0FBQztBQUN6RCxjQUFJLFlBQVksUUFBUTtBQUN4QixjQUFJLFVBQVU7QUFDZCxjQUFJLE9BQU8sR0FBRyxRQUFRLGVBQWUsQ0FBQztBQUN0QyxjQUFJO0FBQUEsWUFDRixLQUFLLEtBQUssa0JBQWtCLE9BQU8sS0FBSztBQUFBLFlBQ3hDLFFBQVEsZUFBZTtBQUFBLFVBQ3pCO0FBQ0EsY0FBSSxjQUFjO0FBQ2xCLGNBQUksT0FBTztBQUFBLFFBQ2IsR0FDQSxlQUFlLFdBQVk7QUFDekIsbUJBQVNDLFVBQVMsY0FBYyxRQUFRO0FBQ3hDLGNBQUksUUFBUSxPQUFPO0FBQ25CLGdCQUFNLFdBQVc7QUFDakIsZ0JBQU0sTUFBTSxNQUFNLE9BQU8sTUFBTSxRQUFRLE1BQU0sU0FBUyxNQUFNLFVBQVU7QUFDdEUsZ0JBQU0sU0FBUztBQUNmLGdCQUFNLFVBQVU7QUFDaEIsY0FBSSxRQUFRO0FBQVcsbUJBQU8sVUFBVSxJQUFJLFFBQVEsU0FBUztBQUM3RCxVQUFBQSxVQUFTLEtBQUssWUFBWSxNQUFNO0FBQ2hDLG1CQUFTRCxTQUFRLFVBQVUsT0FBTztBQUFBLFFBQ3BDLEdBQ0FFLFVBQVM7QUFBQSxVQUNQLFFBQVEsU0FBVSxNQUFNO0FBQ3RCLHFCQUFTLE9BQU87QUFDZCxrQkFBSSxRQUFRLGVBQWUsR0FBRztBQUFHLHdCQUFRLEdBQUcsSUFBSSxLQUFLLEdBQUc7QUFBQSxVQUM1RDtBQUFBLFVBQ0EsTUFBTSxXQUFZO0FBQ2hCLGdCQUFJO0FBQVM7QUFDYixzQkFBVTtBQUNWLGdCQUFJLGdCQUFnQjtBQUFNLGNBQUFGLFFBQU8scUJBQXFCLFdBQVc7QUFDakUsZ0JBQUksQ0FBQztBQUFRLDJCQUFhO0FBQzFCLG1CQUFPLE1BQU0sVUFBVTtBQUN2QixtQkFBTyxNQUFNLFVBQVU7QUFDdkIsWUFBQUUsUUFBTyxTQUFTLENBQUM7QUFDakIsZ0JBQUksUUFBUSxTQUFTO0FBQ25CLGVBQUMsU0FBUyxPQUFPO0FBQ2Ysa0NBQWtCRixRQUFPLHNCQUFzQixJQUFJO0FBQ25ELGdCQUFBRSxRQUFPO0FBQUEsa0JBQ0wsTUFBTSxPQUFPLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxlQUFlLEdBQUcsQ0FBQztBQUFBLGdCQUN6RDtBQUFBLGNBQ0YsR0FBRztBQUFBLFlBQ0w7QUFBQSxVQUNGO0FBQUEsVUFDQSxVQUFVLFNBQVUsSUFBSTtBQUN0QixnQkFBSSxPQUFPLE9BQU87QUFBYSxxQkFBTztBQUN0QyxnQkFBSSxPQUFPLE9BQU8sVUFBVTtBQUMxQixvQkFDRyxHQUFHLFFBQVEsR0FBRyxLQUFLLEtBQUssR0FBRyxRQUFRLEdBQUcsS0FBSyxJQUN4QyxrQkFDQSxLQUFLLFdBQVcsRUFBRTtBQUFBLFlBQzFCO0FBQ0EsOEJBQWtCLEtBQUssSUFBSSxJQUFJO0FBQy9CLG9CQUFRO0FBQ1IsbUJBQU87QUFBQSxVQUNUO0FBQUEsVUFDQSxNQUFNLFdBQVk7QUFDaEIsZ0JBQUksQ0FBQztBQUFTO0FBQ2Qsc0JBQVU7QUFDVixnQkFBSSxtQkFBbUIsTUFBTTtBQUMzQixjQUFBRixRQUFPLHFCQUFxQixlQUFlO0FBQzNDLGdDQUFrQjtBQUFBLFlBQ3BCO0FBQ0EsYUFBQyxTQUFTLE9BQU87QUFDZixrQkFBSUUsUUFBTyxTQUFTLEtBQUssS0FBSyxHQUFHO0FBQy9CLHVCQUFPLE1BQU0sV0FBVztBQUN4QixvQkFBSSxPQUFPLE1BQU0sV0FBVyxNQUFNO0FBQ2hDLHlCQUFPLE1BQU0sVUFBVTtBQUN2QixnQ0FBYztBQUNkO0FBQUEsZ0JBQ0Y7QUFBQSxjQUNGO0FBQ0EsNEJBQWNGLFFBQU8sc0JBQXNCLElBQUk7QUFBQSxZQUNqRCxHQUFHO0FBQUEsVUFDTDtBQUFBLFFBQ0Y7QUFFRixZQUFJLE9BQU8sV0FBVyxZQUFZLE9BQU8sT0FBTyxZQUFZLFVBQVU7QUFDcEUsaUJBQU8sVUFBVUU7QUFBQSxRQUNuQixXQUFXLE9BQU8sV0FBVyxjQUFjLE9BQU8sS0FBSztBQUNyRCxpQkFBTyxXQUFZO0FBQ2pCLG1CQUFPQTtBQUFBLFVBQ1QsQ0FBQztBQUFBLFFBQ0gsT0FBTztBQUNMLGVBQUssU0FBU0E7QUFBQSxRQUNoQjtBQUFBLE1BQ0YsR0FBRSxLQUFLLFNBQU0sUUFBUSxRQUFRO0FBQUE7QUFBQTs7O0FDNUo3QixNQUFBQyxpQkFBYzs7O0FDQWQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsd0JBQUFDO0FBQUEsSUFBQTtBQUFBLDRCQUFBQTtBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQU8sTUFBSSxNQUFNO0FBQ1YsTUFBSSxTQUFTO0FBQ2IsTUFBSSxRQUFRO0FBQ1osTUFBSSxPQUFPO0FBQ1gsTUFBSSxPQUFPO0FBQ1gsTUFBSSxpQkFBaUIsQ0FBQyxLQUFLLFFBQVEsT0FBTyxJQUFJO0FBQzlDLE1BQUksUUFBUTtBQUNaLE1BQUksTUFBTTtBQUNWLE1BQUksa0JBQWtCO0FBQ3RCLE1BQUksV0FBVztBQUNmLE1BQUksU0FBUztBQUNiLE1BQUksWUFBWTtBQUNoQixNQUFJLHNCQUFtQywrQkFBZSxPQUFPLFNBQVUsS0FBSyxXQUFXO0FBQzVGLFdBQU8sSUFBSSxPQUFPLENBQUMsWUFBWSxNQUFNLE9BQU8sWUFBWSxNQUFNLEdBQUcsQ0FBQztBQUFBLEVBQ3BFLEdBQUcsQ0FBQyxDQUFDO0FBQ0UsTUFBSSxhQUEwQixpQkFBQyxFQUFFLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxTQUFVLEtBQUssV0FBVztBQUN0RyxXQUFPLElBQUksT0FBTyxDQUFDLFdBQVcsWUFBWSxNQUFNLE9BQU8sWUFBWSxNQUFNLEdBQUcsQ0FBQztBQUFBLEVBQy9FLEdBQUcsQ0FBQyxDQUFDO0FBRUUsTUFBSSxhQUFhO0FBQ2pCLE1BQUksT0FBTztBQUNYLE1BQUksWUFBWTtBQUVoQixNQUFJLGFBQWE7QUFDakIsTUFBSSxPQUFPO0FBQ1gsTUFBSSxZQUFZO0FBRWhCLE1BQUksY0FBYztBQUNsQixNQUFJLFFBQVE7QUFDWixNQUFJLGFBQWE7QUFDakIsTUFBSSxpQkFBaUIsQ0FBQyxZQUFZLE1BQU0sV0FBVyxZQUFZLE1BQU0sV0FBVyxhQUFhLE9BQU8sVUFBVTs7O0FDOUJ0RyxXQUFSLFlBQTZCLFNBQVM7QUFDM0MsV0FBTyxXQUFXLFFBQVEsWUFBWSxJQUFJLFlBQVksSUFBSTtBQUFBLEVBQzVEOzs7QUNGZSxXQUFSLFVBQTJCLE1BQU07QUFDdEMsUUFBSSxRQUFRLE1BQU07QUFDaEIsYUFBTztBQUFBLElBQ1Q7QUFFQSxRQUFJLEtBQUssU0FBUyxNQUFNLG1CQUFtQjtBQUN6QyxVQUFJLGdCQUFnQixLQUFLO0FBQ3pCLGFBQU8sZ0JBQWdCLGNBQWMsZUFBZSxTQUFTO0FBQUEsSUFDL0Q7QUFFQSxXQUFPO0FBQUEsRUFDVDs7O0FDVEEsV0FBUyxVQUFVLE1BQU07QUFDdkIsUUFBSSxhQUFhLFVBQVUsSUFBSSxFQUFFO0FBQ2pDLFdBQU8sZ0JBQWdCLGNBQWMsZ0JBQWdCO0FBQUEsRUFDdkQ7QUFFQSxXQUFTLGNBQWMsTUFBTTtBQUMzQixRQUFJLGFBQWEsVUFBVSxJQUFJLEVBQUU7QUFDakMsV0FBTyxnQkFBZ0IsY0FBYyxnQkFBZ0I7QUFBQSxFQUN2RDtBQUVBLFdBQVMsYUFBYSxNQUFNO0FBRTFCLFFBQUksT0FBTyxlQUFlLGFBQWE7QUFDckMsYUFBTztBQUFBLElBQ1Q7QUFFQSxRQUFJLGFBQWEsVUFBVSxJQUFJLEVBQUU7QUFDakMsV0FBTyxnQkFBZ0IsY0FBYyxnQkFBZ0I7QUFBQSxFQUN2RDs7O0FDaEJBLFdBQVMsWUFBWSxNQUFNO0FBQ3pCLFFBQUksUUFBUSxLQUFLO0FBQ2pCLFdBQU8sS0FBSyxNQUFNLFFBQVEsRUFBRSxRQUFRLFNBQVUsTUFBTTtBQUNsRCxVQUFJLFFBQVEsTUFBTSxPQUFPLElBQUksS0FBSyxDQUFDO0FBQ25DLFVBQUksYUFBYSxNQUFNLFdBQVcsSUFBSSxLQUFLLENBQUM7QUFDNUMsVUFBSSxVQUFVLE1BQU0sU0FBUyxJQUFJO0FBRWpDLFVBQUksQ0FBQyxjQUFjLE9BQU8sS0FBSyxDQUFDLFlBQVksT0FBTyxHQUFHO0FBQ3BEO0FBQUEsTUFDRjtBQUtBLGFBQU8sT0FBTyxRQUFRLE9BQU8sS0FBSztBQUNsQyxhQUFPLEtBQUssVUFBVSxFQUFFLFFBQVEsU0FBVUMsT0FBTTtBQUM5QyxZQUFJLFFBQVEsV0FBV0EsS0FBSTtBQUUzQixZQUFJLFVBQVUsT0FBTztBQUNuQixrQkFBUSxnQkFBZ0JBLEtBQUk7QUFBQSxRQUM5QixPQUFPO0FBQ0wsa0JBQVEsYUFBYUEsT0FBTSxVQUFVLE9BQU8sS0FBSyxLQUFLO0FBQUEsUUFDeEQ7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNILENBQUM7QUFBQSxFQUNIO0FBRUEsV0FBUyxPQUFPLE9BQU87QUFDckIsUUFBSSxRQUFRLE1BQU07QUFDbEIsUUFBSSxnQkFBZ0I7QUFBQSxNQUNsQixRQUFRO0FBQUEsUUFDTixVQUFVLE1BQU0sUUFBUTtBQUFBLFFBQ3hCLE1BQU07QUFBQSxRQUNOLEtBQUs7QUFBQSxRQUNMLFFBQVE7QUFBQSxNQUNWO0FBQUEsTUFDQSxPQUFPO0FBQUEsUUFDTCxVQUFVO0FBQUEsTUFDWjtBQUFBLE1BQ0EsV0FBVyxDQUFDO0FBQUEsSUFDZDtBQUNBLFdBQU8sT0FBTyxNQUFNLFNBQVMsT0FBTyxPQUFPLGNBQWMsTUFBTTtBQUMvRCxVQUFNLFNBQVM7QUFFZixRQUFJLE1BQU0sU0FBUyxPQUFPO0FBQ3hCLGFBQU8sT0FBTyxNQUFNLFNBQVMsTUFBTSxPQUFPLGNBQWMsS0FBSztBQUFBLElBQy9EO0FBRUEsV0FBTyxXQUFZO0FBQ2pCLGFBQU8sS0FBSyxNQUFNLFFBQVEsRUFBRSxRQUFRLFNBQVUsTUFBTTtBQUNsRCxZQUFJLFVBQVUsTUFBTSxTQUFTLElBQUk7QUFDakMsWUFBSSxhQUFhLE1BQU0sV0FBVyxJQUFJLEtBQUssQ0FBQztBQUM1QyxZQUFJLGtCQUFrQixPQUFPLEtBQUssTUFBTSxPQUFPLGVBQWUsSUFBSSxJQUFJLE1BQU0sT0FBTyxJQUFJLElBQUksY0FBYyxJQUFJLENBQUM7QUFFOUcsWUFBSSxRQUFRLGdCQUFnQixPQUFPLFNBQVVDLFFBQU8sVUFBVTtBQUM1RCxVQUFBQSxPQUFNLFFBQVEsSUFBSTtBQUNsQixpQkFBT0E7QUFBQSxRQUNULEdBQUcsQ0FBQyxDQUFDO0FBRUwsWUFBSSxDQUFDLGNBQWMsT0FBTyxLQUFLLENBQUMsWUFBWSxPQUFPLEdBQUc7QUFDcEQ7QUFBQSxRQUNGO0FBRUEsZUFBTyxPQUFPLFFBQVEsT0FBTyxLQUFLO0FBQ2xDLGVBQU8sS0FBSyxVQUFVLEVBQUUsUUFBUSxTQUFVLFdBQVc7QUFDbkQsa0JBQVEsZ0JBQWdCLFNBQVM7QUFBQSxRQUNuQyxDQUFDO0FBQUEsTUFDSCxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFHQSxNQUFPLHNCQUFRO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixTQUFTO0FBQUEsSUFDVCxPQUFPO0FBQUEsSUFDUCxJQUFJO0FBQUEsSUFDSjtBQUFBLElBQ0EsVUFBVSxDQUFDLGVBQWU7QUFBQSxFQUM1Qjs7O0FDbEZlLFdBQVIsaUJBQWtDLFdBQVc7QUFDbEQsV0FBTyxVQUFVLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFBQSxFQUMvQjs7O0FDSE8sTUFBSSxNQUFNLEtBQUs7QUFDZixNQUFJLE1BQU0sS0FBSztBQUNmLE1BQUksUUFBUSxLQUFLOzs7QUNGVCxXQUFSLGNBQStCO0FBQ3BDLFFBQUksU0FBUyxVQUFVO0FBRXZCLFFBQUksVUFBVSxRQUFRLE9BQU8sVUFBVSxNQUFNLFFBQVEsT0FBTyxNQUFNLEdBQUc7QUFDbkUsYUFBTyxPQUFPLE9BQU8sSUFBSSxTQUFVLE1BQU07QUFDdkMsZUFBTyxLQUFLLFFBQVEsTUFBTSxLQUFLO0FBQUEsTUFDakMsQ0FBQyxFQUFFLEtBQUssR0FBRztBQUFBLElBQ2I7QUFFQSxXQUFPLFVBQVU7QUFBQSxFQUNuQjs7O0FDVGUsV0FBUixtQkFBb0M7QUFDekMsV0FBTyxDQUFDLGlDQUFpQyxLQUFLLFlBQVksQ0FBQztBQUFBLEVBQzdEOzs7QUNDZSxXQUFSLHNCQUF1QyxTQUFTLGNBQWMsaUJBQWlCO0FBQ3BGLFFBQUksaUJBQWlCLFFBQVE7QUFDM0IscUJBQWU7QUFBQSxJQUNqQjtBQUVBLFFBQUksb0JBQW9CLFFBQVE7QUFDOUIsd0JBQWtCO0FBQUEsSUFDcEI7QUFFQSxRQUFJLGFBQWEsUUFBUSxzQkFBc0I7QUFDL0MsUUFBSSxTQUFTO0FBQ2IsUUFBSSxTQUFTO0FBRWIsUUFBSSxnQkFBZ0IsY0FBYyxPQUFPLEdBQUc7QUFDMUMsZUFBUyxRQUFRLGNBQWMsSUFBSSxNQUFNLFdBQVcsS0FBSyxJQUFJLFFBQVEsZUFBZSxJQUFJO0FBQ3hGLGVBQVMsUUFBUSxlQUFlLElBQUksTUFBTSxXQUFXLE1BQU0sSUFBSSxRQUFRLGdCQUFnQixJQUFJO0FBQUEsSUFDN0Y7QUFFQSxRQUFJLE9BQU8sVUFBVSxPQUFPLElBQUksVUFBVSxPQUFPLElBQUksUUFDakQsaUJBQWlCLEtBQUs7QUFFMUIsUUFBSSxtQkFBbUIsQ0FBQyxpQkFBaUIsS0FBSztBQUM5QyxRQUFJLEtBQUssV0FBVyxRQUFRLG9CQUFvQixpQkFBaUIsZUFBZSxhQUFhLE1BQU07QUFDbkcsUUFBSSxLQUFLLFdBQVcsT0FBTyxvQkFBb0IsaUJBQWlCLGVBQWUsWUFBWSxNQUFNO0FBQ2pHLFFBQUksUUFBUSxXQUFXLFFBQVE7QUFDL0IsUUFBSSxTQUFTLFdBQVcsU0FBUztBQUNqQyxXQUFPO0FBQUEsTUFDTDtBQUFBLE1BQ0E7QUFBQSxNQUNBLEtBQUs7QUFBQSxNQUNMLE9BQU8sSUFBSTtBQUFBLE1BQ1gsUUFBUSxJQUFJO0FBQUEsTUFDWixNQUFNO0FBQUEsTUFDTjtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsRUFDRjs7O0FDckNlLFdBQVIsY0FBK0IsU0FBUztBQUM3QyxRQUFJLGFBQWEsc0JBQXNCLE9BQU87QUFHOUMsUUFBSSxRQUFRLFFBQVE7QUFDcEIsUUFBSSxTQUFTLFFBQVE7QUFFckIsUUFBSSxLQUFLLElBQUksV0FBVyxRQUFRLEtBQUssS0FBSyxHQUFHO0FBQzNDLGNBQVEsV0FBVztBQUFBLElBQ3JCO0FBRUEsUUFBSSxLQUFLLElBQUksV0FBVyxTQUFTLE1BQU0sS0FBSyxHQUFHO0FBQzdDLGVBQVMsV0FBVztBQUFBLElBQ3RCO0FBRUEsV0FBTztBQUFBLE1BQ0wsR0FBRyxRQUFRO0FBQUEsTUFDWCxHQUFHLFFBQVE7QUFBQSxNQUNYO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUNGOzs7QUN2QmUsV0FBUixTQUEwQixRQUFRLE9BQU87QUFDOUMsUUFBSSxXQUFXLE1BQU0sZUFBZSxNQUFNLFlBQVk7QUFFdEQsUUFBSSxPQUFPLFNBQVMsS0FBSyxHQUFHO0FBQzFCLGFBQU87QUFBQSxJQUNULFdBQ1MsWUFBWSxhQUFhLFFBQVEsR0FBRztBQUN6QyxVQUFJLE9BQU87QUFFWCxTQUFHO0FBQ0QsWUFBSSxRQUFRLE9BQU8sV0FBVyxJQUFJLEdBQUc7QUFDbkMsaUJBQU87QUFBQSxRQUNUO0FBR0EsZUFBTyxLQUFLLGNBQWMsS0FBSztBQUFBLE1BQ2pDLFNBQVM7QUFBQSxJQUNYO0FBR0YsV0FBTztBQUFBLEVBQ1Q7OztBQ3JCZSxXQUFSQyxrQkFBa0MsU0FBUztBQUNoRCxXQUFPLFVBQVUsT0FBTyxFQUFFLGlCQUFpQixPQUFPO0FBQUEsRUFDcEQ7OztBQ0ZlLFdBQVIsZUFBZ0MsU0FBUztBQUM5QyxXQUFPLENBQUMsU0FBUyxNQUFNLElBQUksRUFBRSxRQUFRLFlBQVksT0FBTyxDQUFDLEtBQUs7QUFBQSxFQUNoRTs7O0FDRmUsV0FBUixtQkFBb0MsU0FBUztBQUVsRCxhQUFTLFVBQVUsT0FBTyxJQUFJLFFBQVE7QUFBQTtBQUFBLE1BQ3RDLFFBQVE7QUFBQSxVQUFhLE9BQU8sVUFBVTtBQUFBLEVBQ3hDOzs7QUNGZSxXQUFSLGNBQStCLFNBQVM7QUFDN0MsUUFBSSxZQUFZLE9BQU8sTUFBTSxRQUFRO0FBQ25DLGFBQU87QUFBQSxJQUNUO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUdFLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxPQUNSLGFBQWEsT0FBTyxJQUFJLFFBQVEsT0FBTztBQUFBO0FBQUEsTUFFdkMsbUJBQW1CLE9BQU87QUFBQTtBQUFBLEVBRzlCOzs7QUNWQSxXQUFTLG9CQUFvQixTQUFTO0FBQ3BDLFFBQUksQ0FBQyxjQUFjLE9BQU87QUFBQSxJQUMxQkMsa0JBQWlCLE9BQU8sRUFBRSxhQUFhLFNBQVM7QUFDOUMsYUFBTztBQUFBLElBQ1Q7QUFFQSxXQUFPLFFBQVE7QUFBQSxFQUNqQjtBQUlBLFdBQVMsbUJBQW1CLFNBQVM7QUFDbkMsUUFBSSxZQUFZLFdBQVcsS0FBSyxZQUFZLENBQUM7QUFDN0MsUUFBSSxPQUFPLFdBQVcsS0FBSyxZQUFZLENBQUM7QUFFeEMsUUFBSSxRQUFRLGNBQWMsT0FBTyxHQUFHO0FBRWxDLFVBQUksYUFBYUEsa0JBQWlCLE9BQU87QUFFekMsVUFBSSxXQUFXLGFBQWEsU0FBUztBQUNuQyxlQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFFQSxRQUFJLGNBQWMsY0FBYyxPQUFPO0FBRXZDLFFBQUksYUFBYSxXQUFXLEdBQUc7QUFDN0Isb0JBQWMsWUFBWTtBQUFBLElBQzVCO0FBRUEsV0FBTyxjQUFjLFdBQVcsS0FBSyxDQUFDLFFBQVEsTUFBTSxFQUFFLFFBQVEsWUFBWSxXQUFXLENBQUMsSUFBSSxHQUFHO0FBQzNGLFVBQUksTUFBTUEsa0JBQWlCLFdBQVc7QUFJdEMsVUFBSSxJQUFJLGNBQWMsVUFBVSxJQUFJLGdCQUFnQixVQUFVLElBQUksWUFBWSxXQUFXLENBQUMsYUFBYSxhQUFhLEVBQUUsUUFBUSxJQUFJLFVBQVUsTUFBTSxNQUFNLGFBQWEsSUFBSSxlQUFlLFlBQVksYUFBYSxJQUFJLFVBQVUsSUFBSSxXQUFXLFFBQVE7QUFDcFAsZUFBTztBQUFBLE1BQ1QsT0FBTztBQUNMLHNCQUFjLFlBQVk7QUFBQSxNQUM1QjtBQUFBLElBQ0Y7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUllLFdBQVIsZ0JBQWlDLFNBQVM7QUFDL0MsUUFBSUMsVUFBUyxVQUFVLE9BQU87QUFDOUIsUUFBSSxlQUFlLG9CQUFvQixPQUFPO0FBRTlDLFdBQU8sZ0JBQWdCLGVBQWUsWUFBWSxLQUFLRCxrQkFBaUIsWUFBWSxFQUFFLGFBQWEsVUFBVTtBQUMzRyxxQkFBZSxvQkFBb0IsWUFBWTtBQUFBLElBQ2pEO0FBRUEsUUFBSSxpQkFBaUIsWUFBWSxZQUFZLE1BQU0sVUFBVSxZQUFZLFlBQVksTUFBTSxVQUFVQSxrQkFBaUIsWUFBWSxFQUFFLGFBQWEsV0FBVztBQUMxSixhQUFPQztBQUFBLElBQ1Q7QUFFQSxXQUFPLGdCQUFnQixtQkFBbUIsT0FBTyxLQUFLQTtBQUFBLEVBQ3hEOzs7QUNwRWUsV0FBUix5QkFBMEMsV0FBVztBQUMxRCxXQUFPLENBQUMsT0FBTyxRQUFRLEVBQUUsUUFBUSxTQUFTLEtBQUssSUFBSSxNQUFNO0FBQUEsRUFDM0Q7OztBQ0RPLFdBQVMsT0FBT0MsTUFBSyxPQUFPQyxNQUFLO0FBQ3RDLFdBQU8sSUFBUUQsTUFBSyxJQUFRLE9BQU9DLElBQUcsQ0FBQztBQUFBLEVBQ3pDO0FBQ08sV0FBUyxlQUFlRCxNQUFLLE9BQU9DLE1BQUs7QUFDOUMsUUFBSSxJQUFJLE9BQU9ELE1BQUssT0FBT0MsSUFBRztBQUM5QixXQUFPLElBQUlBLE9BQU1BLE9BQU07QUFBQSxFQUN6Qjs7O0FDUGUsV0FBUixxQkFBc0M7QUFDM0MsV0FBTztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1IsTUFBTTtBQUFBLElBQ1I7QUFBQSxFQUNGOzs7QUNOZSxXQUFSLG1CQUFvQyxlQUFlO0FBQ3hELFdBQU8sT0FBTyxPQUFPLENBQUMsR0FBRyxtQkFBbUIsR0FBRyxhQUFhO0FBQUEsRUFDOUQ7OztBQ0hlLFdBQVIsZ0JBQWlDLE9BQU8sTUFBTTtBQUNuRCxXQUFPLEtBQUssT0FBTyxTQUFVLFNBQVMsS0FBSztBQUN6QyxjQUFRLEdBQUcsSUFBSTtBQUNmLGFBQU87QUFBQSxJQUNULEdBQUcsQ0FBQyxDQUFDO0FBQUEsRUFDUDs7O0FDS0EsTUFBSSxrQkFBa0IsU0FBU0MsaUJBQWdCLFNBQVMsT0FBTztBQUM3RCxjQUFVLE9BQU8sWUFBWSxhQUFhLFFBQVEsT0FBTyxPQUFPLENBQUMsR0FBRyxNQUFNLE9BQU87QUFBQSxNQUMvRSxXQUFXLE1BQU07QUFBQSxJQUNuQixDQUFDLENBQUMsSUFBSTtBQUNOLFdBQU8sbUJBQW1CLE9BQU8sWUFBWSxXQUFXLFVBQVUsZ0JBQWdCLFNBQVMsY0FBYyxDQUFDO0FBQUEsRUFDNUc7QUFFQSxXQUFTLE1BQU0sTUFBTTtBQUNuQixRQUFJO0FBRUosUUFBSSxRQUFRLEtBQUssT0FDYixPQUFPLEtBQUssTUFDWixVQUFVLEtBQUs7QUFDbkIsUUFBSSxlQUFlLE1BQU0sU0FBUztBQUNsQyxRQUFJQyxpQkFBZ0IsTUFBTSxjQUFjO0FBQ3hDLFFBQUksZ0JBQWdCLGlCQUFpQixNQUFNLFNBQVM7QUFDcEQsUUFBSSxPQUFPLHlCQUF5QixhQUFhO0FBQ2pELFFBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxFQUFFLFFBQVEsYUFBYSxLQUFLO0FBQ3pELFFBQUksTUFBTSxhQUFhLFdBQVc7QUFFbEMsUUFBSSxDQUFDLGdCQUFnQixDQUFDQSxnQkFBZTtBQUNuQztBQUFBLElBQ0Y7QUFFQSxRQUFJLGdCQUFnQixnQkFBZ0IsUUFBUSxTQUFTLEtBQUs7QUFDMUQsUUFBSSxZQUFZLGNBQWMsWUFBWTtBQUMxQyxRQUFJLFVBQVUsU0FBUyxNQUFNLE1BQU07QUFDbkMsUUFBSSxVQUFVLFNBQVMsTUFBTSxTQUFTO0FBQ3RDLFFBQUksVUFBVSxNQUFNLE1BQU0sVUFBVSxHQUFHLElBQUksTUFBTSxNQUFNLFVBQVUsSUFBSSxJQUFJQSxlQUFjLElBQUksSUFBSSxNQUFNLE1BQU0sT0FBTyxHQUFHO0FBQ3JILFFBQUksWUFBWUEsZUFBYyxJQUFJLElBQUksTUFBTSxNQUFNLFVBQVUsSUFBSTtBQUNoRSxRQUFJLG9CQUFvQixnQkFBZ0IsWUFBWTtBQUNwRCxRQUFJLGFBQWEsb0JBQW9CLFNBQVMsTUFBTSxrQkFBa0IsZ0JBQWdCLElBQUksa0JBQWtCLGVBQWUsSUFBSTtBQUMvSCxRQUFJLG9CQUFvQixVQUFVLElBQUksWUFBWTtBQUdsRCxRQUFJQyxPQUFNLGNBQWMsT0FBTztBQUMvQixRQUFJQyxPQUFNLGFBQWEsVUFBVSxHQUFHLElBQUksY0FBYyxPQUFPO0FBQzdELFFBQUksU0FBUyxhQUFhLElBQUksVUFBVSxHQUFHLElBQUksSUFBSTtBQUNuRCxRQUFJQyxVQUFTLE9BQU9GLE1BQUssUUFBUUMsSUFBRztBQUVwQyxRQUFJLFdBQVc7QUFDZixVQUFNLGNBQWMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLEdBQUcsc0JBQXNCLFFBQVEsSUFBSUMsU0FBUSxzQkFBc0IsZUFBZUEsVUFBUyxRQUFRO0FBQUEsRUFDM0o7QUFFQSxXQUFTQyxRQUFPLE9BQU87QUFDckIsUUFBSSxRQUFRLE1BQU0sT0FDZCxVQUFVLE1BQU07QUFDcEIsUUFBSSxtQkFBbUIsUUFBUSxTQUMzQixlQUFlLHFCQUFxQixTQUFTLHdCQUF3QjtBQUV6RSxRQUFJLGdCQUFnQixNQUFNO0FBQ3hCO0FBQUEsSUFDRjtBQUdBLFFBQUksT0FBTyxpQkFBaUIsVUFBVTtBQUNwQyxxQkFBZSxNQUFNLFNBQVMsT0FBTyxjQUFjLFlBQVk7QUFFL0QsVUFBSSxDQUFDLGNBQWM7QUFDakI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVBLFFBQUksQ0FBQyxTQUFTLE1BQU0sU0FBUyxRQUFRLFlBQVksR0FBRztBQUNsRDtBQUFBLElBQ0Y7QUFFQSxVQUFNLFNBQVMsUUFBUTtBQUFBLEVBQ3pCO0FBR0EsTUFBTyxnQkFBUTtBQUFBLElBQ2IsTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsT0FBTztBQUFBLElBQ1AsSUFBSTtBQUFBLElBQ0osUUFBUUE7QUFBQSxJQUNSLFVBQVUsQ0FBQyxlQUFlO0FBQUEsSUFDMUIsa0JBQWtCLENBQUMsaUJBQWlCO0FBQUEsRUFDdEM7OztBQ3pGZSxXQUFSLGFBQThCLFdBQVc7QUFDOUMsV0FBTyxVQUFVLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFBQSxFQUMvQjs7O0FDT0EsTUFBSSxhQUFhO0FBQUEsSUFDZixLQUFLO0FBQUEsSUFDTCxPQUFPO0FBQUEsSUFDUCxRQUFRO0FBQUEsSUFDUixNQUFNO0FBQUEsRUFDUjtBQUlBLFdBQVMsa0JBQWtCLE1BQU0sS0FBSztBQUNwQyxRQUFJLElBQUksS0FBSyxHQUNULElBQUksS0FBSztBQUNiLFFBQUksTUFBTSxJQUFJLG9CQUFvQjtBQUNsQyxXQUFPO0FBQUEsTUFDTCxHQUFHLE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTztBQUFBLE1BQzNCLEdBQUcsTUFBTSxJQUFJLEdBQUcsSUFBSSxPQUFPO0FBQUEsSUFDN0I7QUFBQSxFQUNGO0FBRU8sV0FBUyxZQUFZLE9BQU87QUFDakMsUUFBSTtBQUVKLFFBQUlDLFVBQVMsTUFBTSxRQUNmLGFBQWEsTUFBTSxZQUNuQixZQUFZLE1BQU0sV0FDbEIsWUFBWSxNQUFNLFdBQ2xCLFVBQVUsTUFBTSxTQUNoQixXQUFXLE1BQU0sVUFDakIsa0JBQWtCLE1BQU0saUJBQ3hCLFdBQVcsTUFBTSxVQUNqQixlQUFlLE1BQU0sY0FDckIsVUFBVSxNQUFNO0FBQ3BCLFFBQUksYUFBYSxRQUFRLEdBQ3JCLElBQUksZUFBZSxTQUFTLElBQUksWUFDaEMsYUFBYSxRQUFRLEdBQ3JCLElBQUksZUFBZSxTQUFTLElBQUk7QUFFcEMsUUFBSSxRQUFRLE9BQU8saUJBQWlCLGFBQWEsYUFBYTtBQUFBLE1BQzVEO0FBQUEsTUFDQTtBQUFBLElBQ0YsQ0FBQyxJQUFJO0FBQUEsTUFDSDtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBRUEsUUFBSSxNQUFNO0FBQ1YsUUFBSSxNQUFNO0FBQ1YsUUFBSSxPQUFPLFFBQVEsZUFBZSxHQUFHO0FBQ3JDLFFBQUksT0FBTyxRQUFRLGVBQWUsR0FBRztBQUNyQyxRQUFJLFFBQVE7QUFDWixRQUFJLFFBQVE7QUFDWixRQUFJLE1BQU07QUFFVixRQUFJLFVBQVU7QUFDWixVQUFJLGVBQWUsZ0JBQWdCQSxPQUFNO0FBQ3pDLFVBQUksYUFBYTtBQUNqQixVQUFJLFlBQVk7QUFFaEIsVUFBSSxpQkFBaUIsVUFBVUEsT0FBTSxHQUFHO0FBQ3RDLHVCQUFlLG1CQUFtQkEsT0FBTTtBQUV4QyxZQUFJQyxrQkFBaUIsWUFBWSxFQUFFLGFBQWEsWUFBWSxhQUFhLFlBQVk7QUFDbkYsdUJBQWE7QUFDYixzQkFBWTtBQUFBLFFBQ2Q7QUFBQSxNQUNGO0FBR0EscUJBQWU7QUFFZixVQUFJLGNBQWMsUUFBUSxjQUFjLFFBQVEsY0FBYyxVQUFVLGNBQWMsS0FBSztBQUN6RixnQkFBUTtBQUNSLFlBQUksVUFBVSxXQUFXLGlCQUFpQixPQUFPLElBQUksaUJBQWlCLElBQUksZUFBZTtBQUFBO0FBQUEsVUFDekYsYUFBYSxVQUFVO0FBQUE7QUFDdkIsYUFBSyxVQUFVLFdBQVc7QUFDMUIsYUFBSyxrQkFBa0IsSUFBSTtBQUFBLE1BQzdCO0FBRUEsVUFBSSxjQUFjLFNBQVMsY0FBYyxPQUFPLGNBQWMsV0FBVyxjQUFjLEtBQUs7QUFDMUYsZ0JBQVE7QUFDUixZQUFJLFVBQVUsV0FBVyxpQkFBaUIsT0FBTyxJQUFJLGlCQUFpQixJQUFJLGVBQWU7QUFBQTtBQUFBLFVBQ3pGLGFBQWEsU0FBUztBQUFBO0FBQ3RCLGFBQUssVUFBVSxXQUFXO0FBQzFCLGFBQUssa0JBQWtCLElBQUk7QUFBQSxNQUM3QjtBQUFBLElBQ0Y7QUFFQSxRQUFJLGVBQWUsT0FBTyxPQUFPO0FBQUEsTUFDL0I7QUFBQSxJQUNGLEdBQUcsWUFBWSxVQUFVO0FBRXpCLFFBQUksUUFBUSxpQkFBaUIsT0FBTyxrQkFBa0I7QUFBQSxNQUNwRDtBQUFBLE1BQ0E7QUFBQSxJQUNGLEdBQUcsVUFBVUQsT0FBTSxDQUFDLElBQUk7QUFBQSxNQUN0QjtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBRUEsUUFBSSxNQUFNO0FBQ1YsUUFBSSxNQUFNO0FBRVYsUUFBSSxpQkFBaUI7QUFDbkIsVUFBSTtBQUVKLGFBQU8sT0FBTyxPQUFPLENBQUMsR0FBRyxlQUFlLGlCQUFpQixDQUFDLEdBQUcsZUFBZSxLQUFLLElBQUksT0FBTyxNQUFNLElBQUksZUFBZSxLQUFLLElBQUksT0FBTyxNQUFNLElBQUksZUFBZSxhQUFhLElBQUksb0JBQW9CLE1BQU0sSUFBSSxlQUFlLElBQUksU0FBUyxJQUFJLFFBQVEsaUJBQWlCLElBQUksU0FBUyxJQUFJLFVBQVUsZUFBZTtBQUFBLElBQ2xUO0FBRUEsV0FBTyxPQUFPLE9BQU8sQ0FBQyxHQUFHLGVBQWUsa0JBQWtCLENBQUMsR0FBRyxnQkFBZ0IsS0FBSyxJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksZ0JBQWdCLEtBQUssSUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLGdCQUFnQixZQUFZLElBQUksZ0JBQWdCO0FBQUEsRUFDOU07QUFFQSxXQUFTLGNBQWMsT0FBTztBQUM1QixRQUFJLFFBQVEsTUFBTSxPQUNkLFVBQVUsTUFBTTtBQUNwQixRQUFJLHdCQUF3QixRQUFRLGlCQUNoQyxrQkFBa0IsMEJBQTBCLFNBQVMsT0FBTyx1QkFDNUQsb0JBQW9CLFFBQVEsVUFDNUIsV0FBVyxzQkFBc0IsU0FBUyxPQUFPLG1CQUNqRCx3QkFBd0IsUUFBUSxjQUNoQyxlQUFlLDBCQUEwQixTQUFTLE9BQU87QUFDN0QsUUFBSSxlQUFlO0FBQUEsTUFDakIsV0FBVyxpQkFBaUIsTUFBTSxTQUFTO0FBQUEsTUFDM0MsV0FBVyxhQUFhLE1BQU0sU0FBUztBQUFBLE1BQ3ZDLFFBQVEsTUFBTSxTQUFTO0FBQUEsTUFDdkIsWUFBWSxNQUFNLE1BQU07QUFBQSxNQUN4QjtBQUFBLE1BQ0EsU0FBUyxNQUFNLFFBQVEsYUFBYTtBQUFBLElBQ3RDO0FBRUEsUUFBSSxNQUFNLGNBQWMsaUJBQWlCLE1BQU07QUFDN0MsWUFBTSxPQUFPLFNBQVMsT0FBTyxPQUFPLENBQUMsR0FBRyxNQUFNLE9BQU8sUUFBUSxZQUFZLE9BQU8sT0FBTyxDQUFDLEdBQUcsY0FBYztBQUFBLFFBQ3ZHLFNBQVMsTUFBTSxjQUFjO0FBQUEsUUFDN0IsVUFBVSxNQUFNLFFBQVE7QUFBQSxRQUN4QjtBQUFBLFFBQ0E7QUFBQSxNQUNGLENBQUMsQ0FBQyxDQUFDO0FBQUEsSUFDTDtBQUVBLFFBQUksTUFBTSxjQUFjLFNBQVMsTUFBTTtBQUNyQyxZQUFNLE9BQU8sUUFBUSxPQUFPLE9BQU8sQ0FBQyxHQUFHLE1BQU0sT0FBTyxPQUFPLFlBQVksT0FBTyxPQUFPLENBQUMsR0FBRyxjQUFjO0FBQUEsUUFDckcsU0FBUyxNQUFNLGNBQWM7QUFBQSxRQUM3QixVQUFVO0FBQUEsUUFDVixVQUFVO0FBQUEsUUFDVjtBQUFBLE1BQ0YsQ0FBQyxDQUFDLENBQUM7QUFBQSxJQUNMO0FBRUEsVUFBTSxXQUFXLFNBQVMsT0FBTyxPQUFPLENBQUMsR0FBRyxNQUFNLFdBQVcsUUFBUTtBQUFBLE1BQ25FLHlCQUF5QixNQUFNO0FBQUEsSUFDakMsQ0FBQztBQUFBLEVBQ0g7QUFHQSxNQUFPLHdCQUFRO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixTQUFTO0FBQUEsSUFDVCxPQUFPO0FBQUEsSUFDUCxJQUFJO0FBQUEsSUFDSixNQUFNLENBQUM7QUFBQSxFQUNUOzs7QUN0S0EsTUFBSSxVQUFVO0FBQUEsSUFDWixTQUFTO0FBQUEsRUFDWDtBQUVBLFdBQVNFLFFBQU8sTUFBTTtBQUNwQixRQUFJLFFBQVEsS0FBSyxPQUNiLFdBQVcsS0FBSyxVQUNoQixVQUFVLEtBQUs7QUFDbkIsUUFBSSxrQkFBa0IsUUFBUSxRQUMxQixTQUFTLG9CQUFvQixTQUFTLE9BQU8saUJBQzdDLGtCQUFrQixRQUFRLFFBQzFCLFNBQVMsb0JBQW9CLFNBQVMsT0FBTztBQUNqRCxRQUFJQyxVQUFTLFVBQVUsTUFBTSxTQUFTLE1BQU07QUFDNUMsUUFBSSxnQkFBZ0IsQ0FBQyxFQUFFLE9BQU8sTUFBTSxjQUFjLFdBQVcsTUFBTSxjQUFjLE1BQU07QUFFdkYsUUFBSSxRQUFRO0FBQ1Ysb0JBQWMsUUFBUSxTQUFVLGNBQWM7QUFDNUMscUJBQWEsaUJBQWlCLFVBQVUsU0FBUyxRQUFRLE9BQU87QUFBQSxNQUNsRSxDQUFDO0FBQUEsSUFDSDtBQUVBLFFBQUksUUFBUTtBQUNWLE1BQUFBLFFBQU8saUJBQWlCLFVBQVUsU0FBUyxRQUFRLE9BQU87QUFBQSxJQUM1RDtBQUVBLFdBQU8sV0FBWTtBQUNqQixVQUFJLFFBQVE7QUFDVixzQkFBYyxRQUFRLFNBQVUsY0FBYztBQUM1Qyx1QkFBYSxvQkFBb0IsVUFBVSxTQUFTLFFBQVEsT0FBTztBQUFBLFFBQ3JFLENBQUM7QUFBQSxNQUNIO0FBRUEsVUFBSSxRQUFRO0FBQ1YsUUFBQUEsUUFBTyxvQkFBb0IsVUFBVSxTQUFTLFFBQVEsT0FBTztBQUFBLE1BQy9EO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFHQSxNQUFPLHlCQUFRO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixTQUFTO0FBQUEsSUFDVCxPQUFPO0FBQUEsSUFDUCxJQUFJLFNBQVMsS0FBSztBQUFBLElBQUM7QUFBQSxJQUNuQixRQUFRRDtBQUFBLElBQ1IsTUFBTSxDQUFDO0FBQUEsRUFDVDs7O0FDaERBLE1BQUksT0FBTztBQUFBLElBQ1QsTUFBTTtBQUFBLElBQ04sT0FBTztBQUFBLElBQ1AsUUFBUTtBQUFBLElBQ1IsS0FBSztBQUFBLEVBQ1A7QUFDZSxXQUFSLHFCQUFzQyxXQUFXO0FBQ3RELFdBQU8sVUFBVSxRQUFRLDBCQUEwQixTQUFVLFNBQVM7QUFDcEUsYUFBTyxLQUFLLE9BQU87QUFBQSxJQUNyQixDQUFDO0FBQUEsRUFDSDs7O0FDVkEsTUFBSUUsUUFBTztBQUFBLElBQ1QsT0FBTztBQUFBLElBQ1AsS0FBSztBQUFBLEVBQ1A7QUFDZSxXQUFSLDhCQUErQyxXQUFXO0FBQy9ELFdBQU8sVUFBVSxRQUFRLGNBQWMsU0FBVSxTQUFTO0FBQ3hELGFBQU9BLE1BQUssT0FBTztBQUFBLElBQ3JCLENBQUM7QUFBQSxFQUNIOzs7QUNQZSxXQUFSLGdCQUFpQyxNQUFNO0FBQzVDLFFBQUksTUFBTSxVQUFVLElBQUk7QUFDeEIsUUFBSSxhQUFhLElBQUk7QUFDckIsUUFBSSxZQUFZLElBQUk7QUFDcEIsV0FBTztBQUFBLE1BQ0w7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7OztBQ05lLFdBQVIsb0JBQXFDLFNBQVM7QUFRbkQsV0FBTyxzQkFBc0IsbUJBQW1CLE9BQU8sQ0FBQyxFQUFFLE9BQU8sZ0JBQWdCLE9BQU8sRUFBRTtBQUFBLEVBQzVGOzs7QUNSZSxXQUFSLGdCQUFpQyxTQUFTLFVBQVU7QUFDekQsUUFBSSxNQUFNLFVBQVUsT0FBTztBQUMzQixRQUFJLE9BQU8sbUJBQW1CLE9BQU87QUFDckMsUUFBSSxpQkFBaUIsSUFBSTtBQUN6QixRQUFJLFFBQVEsS0FBSztBQUNqQixRQUFJLFNBQVMsS0FBSztBQUNsQixRQUFJLElBQUk7QUFDUixRQUFJLElBQUk7QUFFUixRQUFJLGdCQUFnQjtBQUNsQixjQUFRLGVBQWU7QUFDdkIsZUFBUyxlQUFlO0FBQ3hCLFVBQUksaUJBQWlCLGlCQUFpQjtBQUV0QyxVQUFJLGtCQUFrQixDQUFDLGtCQUFrQixhQUFhLFNBQVM7QUFDN0QsWUFBSSxlQUFlO0FBQ25CLFlBQUksZUFBZTtBQUFBLE1BQ3JCO0FBQUEsSUFDRjtBQUVBLFdBQU87QUFBQSxNQUNMO0FBQUEsTUFDQTtBQUFBLE1BQ0EsR0FBRyxJQUFJLG9CQUFvQixPQUFPO0FBQUEsTUFDbEM7QUFBQSxJQUNGO0FBQUEsRUFDRjs7O0FDdkJlLFdBQVIsZ0JBQWlDLFNBQVM7QUFDL0MsUUFBSTtBQUVKLFFBQUksT0FBTyxtQkFBbUIsT0FBTztBQUNyQyxRQUFJLFlBQVksZ0JBQWdCLE9BQU87QUFDdkMsUUFBSSxRQUFRLHdCQUF3QixRQUFRLGtCQUFrQixPQUFPLFNBQVMsc0JBQXNCO0FBQ3BHLFFBQUksUUFBUSxJQUFJLEtBQUssYUFBYSxLQUFLLGFBQWEsT0FBTyxLQUFLLGNBQWMsR0FBRyxPQUFPLEtBQUssY0FBYyxDQUFDO0FBQzVHLFFBQUksU0FBUyxJQUFJLEtBQUssY0FBYyxLQUFLLGNBQWMsT0FBTyxLQUFLLGVBQWUsR0FBRyxPQUFPLEtBQUssZUFBZSxDQUFDO0FBQ2pILFFBQUksSUFBSSxDQUFDLFVBQVUsYUFBYSxvQkFBb0IsT0FBTztBQUMzRCxRQUFJLElBQUksQ0FBQyxVQUFVO0FBRW5CLFFBQUlDLGtCQUFpQixRQUFRLElBQUksRUFBRSxjQUFjLE9BQU87QUFDdEQsV0FBSyxJQUFJLEtBQUssYUFBYSxPQUFPLEtBQUssY0FBYyxDQUFDLElBQUk7QUFBQSxJQUM1RDtBQUVBLFdBQU87QUFBQSxNQUNMO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7OztBQzNCZSxXQUFSLGVBQWdDLFNBQVM7QUFFOUMsUUFBSSxvQkFBb0JDLGtCQUFpQixPQUFPLEdBQzVDLFdBQVcsa0JBQWtCLFVBQzdCLFlBQVksa0JBQWtCLFdBQzlCLFlBQVksa0JBQWtCO0FBRWxDLFdBQU8sNkJBQTZCLEtBQUssV0FBVyxZQUFZLFNBQVM7QUFBQSxFQUMzRTs7O0FDTGUsV0FBUixnQkFBaUMsTUFBTTtBQUM1QyxRQUFJLENBQUMsUUFBUSxRQUFRLFdBQVcsRUFBRSxRQUFRLFlBQVksSUFBSSxDQUFDLEtBQUssR0FBRztBQUVqRSxhQUFPLEtBQUssY0FBYztBQUFBLElBQzVCO0FBRUEsUUFBSSxjQUFjLElBQUksS0FBSyxlQUFlLElBQUksR0FBRztBQUMvQyxhQUFPO0FBQUEsSUFDVDtBQUVBLFdBQU8sZ0JBQWdCLGNBQWMsSUFBSSxDQUFDO0FBQUEsRUFDNUM7OztBQ0plLFdBQVIsa0JBQW1DLFNBQVMsTUFBTTtBQUN2RCxRQUFJO0FBRUosUUFBSSxTQUFTLFFBQVE7QUFDbkIsYUFBTyxDQUFDO0FBQUEsSUFDVjtBQUVBLFFBQUksZUFBZSxnQkFBZ0IsT0FBTztBQUMxQyxRQUFJLFNBQVMsbUJBQW1CLHdCQUF3QixRQUFRLGtCQUFrQixPQUFPLFNBQVMsc0JBQXNCO0FBQ3hILFFBQUksTUFBTSxVQUFVLFlBQVk7QUFDaEMsUUFBSSxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxJQUFJLGtCQUFrQixDQUFDLEdBQUcsZUFBZSxZQUFZLElBQUksZUFBZSxDQUFDLENBQUMsSUFBSTtBQUNqSCxRQUFJLGNBQWMsS0FBSyxPQUFPLE1BQU07QUFDcEMsV0FBTyxTQUFTO0FBQUE7QUFBQSxNQUNoQixZQUFZLE9BQU8sa0JBQWtCLGNBQWMsTUFBTSxDQUFDLENBQUM7QUFBQTtBQUFBLEVBQzdEOzs7QUN6QmUsV0FBUixpQkFBa0MsTUFBTTtBQUM3QyxXQUFPLE9BQU8sT0FBTyxDQUFDLEdBQUcsTUFBTTtBQUFBLE1BQzdCLE1BQU0sS0FBSztBQUFBLE1BQ1gsS0FBSyxLQUFLO0FBQUEsTUFDVixPQUFPLEtBQUssSUFBSSxLQUFLO0FBQUEsTUFDckIsUUFBUSxLQUFLLElBQUksS0FBSztBQUFBLElBQ3hCLENBQUM7QUFBQSxFQUNIOzs7QUNRQSxXQUFTLDJCQUEyQixTQUFTLFVBQVU7QUFDckQsUUFBSSxPQUFPLHNCQUFzQixTQUFTLE9BQU8sYUFBYSxPQUFPO0FBQ3JFLFNBQUssTUFBTSxLQUFLLE1BQU0sUUFBUTtBQUM5QixTQUFLLE9BQU8sS0FBSyxPQUFPLFFBQVE7QUFDaEMsU0FBSyxTQUFTLEtBQUssTUFBTSxRQUFRO0FBQ2pDLFNBQUssUUFBUSxLQUFLLE9BQU8sUUFBUTtBQUNqQyxTQUFLLFFBQVEsUUFBUTtBQUNyQixTQUFLLFNBQVMsUUFBUTtBQUN0QixTQUFLLElBQUksS0FBSztBQUNkLFNBQUssSUFBSSxLQUFLO0FBQ2QsV0FBTztBQUFBLEVBQ1Q7QUFFQSxXQUFTLDJCQUEyQixTQUFTLGdCQUFnQixVQUFVO0FBQ3JFLFdBQU8sbUJBQW1CLFdBQVcsaUJBQWlCLGdCQUFnQixTQUFTLFFBQVEsQ0FBQyxJQUFJLFVBQVUsY0FBYyxJQUFJLDJCQUEyQixnQkFBZ0IsUUFBUSxJQUFJLGlCQUFpQixnQkFBZ0IsbUJBQW1CLE9BQU8sQ0FBQyxDQUFDO0FBQUEsRUFDOU87QUFLQSxXQUFTLG1CQUFtQixTQUFTO0FBQ25DLFFBQUlDLG1CQUFrQixrQkFBa0IsY0FBYyxPQUFPLENBQUM7QUFDOUQsUUFBSSxvQkFBb0IsQ0FBQyxZQUFZLE9BQU8sRUFBRSxRQUFRQyxrQkFBaUIsT0FBTyxFQUFFLFFBQVEsS0FBSztBQUM3RixRQUFJLGlCQUFpQixxQkFBcUIsY0FBYyxPQUFPLElBQUksZ0JBQWdCLE9BQU8sSUFBSTtBQUU5RixRQUFJLENBQUMsVUFBVSxjQUFjLEdBQUc7QUFDOUIsYUFBTyxDQUFDO0FBQUEsSUFDVjtBQUdBLFdBQU9ELGlCQUFnQixPQUFPLFNBQVUsZ0JBQWdCO0FBQ3RELGFBQU8sVUFBVSxjQUFjLEtBQUssU0FBUyxnQkFBZ0IsY0FBYyxLQUFLLFlBQVksY0FBYyxNQUFNO0FBQUEsSUFDbEgsQ0FBQztBQUFBLEVBQ0g7QUFJZSxXQUFSLGdCQUFpQyxTQUFTLFVBQVUsY0FBYyxVQUFVO0FBQ2pGLFFBQUksc0JBQXNCLGFBQWEsb0JBQW9CLG1CQUFtQixPQUFPLElBQUksQ0FBQyxFQUFFLE9BQU8sUUFBUTtBQUMzRyxRQUFJQSxtQkFBa0IsQ0FBQyxFQUFFLE9BQU8scUJBQXFCLENBQUMsWUFBWSxDQUFDO0FBQ25FLFFBQUksc0JBQXNCQSxpQkFBZ0IsQ0FBQztBQUMzQyxRQUFJLGVBQWVBLGlCQUFnQixPQUFPLFNBQVUsU0FBUyxnQkFBZ0I7QUFDM0UsVUFBSSxPQUFPLDJCQUEyQixTQUFTLGdCQUFnQixRQUFRO0FBQ3ZFLGNBQVEsTUFBTSxJQUFJLEtBQUssS0FBSyxRQUFRLEdBQUc7QUFDdkMsY0FBUSxRQUFRLElBQUksS0FBSyxPQUFPLFFBQVEsS0FBSztBQUM3QyxjQUFRLFNBQVMsSUFBSSxLQUFLLFFBQVEsUUFBUSxNQUFNO0FBQ2hELGNBQVEsT0FBTyxJQUFJLEtBQUssTUFBTSxRQUFRLElBQUk7QUFDMUMsYUFBTztBQUFBLElBQ1QsR0FBRywyQkFBMkIsU0FBUyxxQkFBcUIsUUFBUSxDQUFDO0FBQ3JFLGlCQUFhLFFBQVEsYUFBYSxRQUFRLGFBQWE7QUFDdkQsaUJBQWEsU0FBUyxhQUFhLFNBQVMsYUFBYTtBQUN6RCxpQkFBYSxJQUFJLGFBQWE7QUFDOUIsaUJBQWEsSUFBSSxhQUFhO0FBQzlCLFdBQU87QUFBQSxFQUNUOzs7QUNqRWUsV0FBUixlQUFnQyxNQUFNO0FBQzNDLFFBQUlFLGFBQVksS0FBSyxXQUNqQixVQUFVLEtBQUssU0FDZixZQUFZLEtBQUs7QUFDckIsUUFBSSxnQkFBZ0IsWUFBWSxpQkFBaUIsU0FBUyxJQUFJO0FBQzlELFFBQUksWUFBWSxZQUFZLGFBQWEsU0FBUyxJQUFJO0FBQ3RELFFBQUksVUFBVUEsV0FBVSxJQUFJQSxXQUFVLFFBQVEsSUFBSSxRQUFRLFFBQVE7QUFDbEUsUUFBSSxVQUFVQSxXQUFVLElBQUlBLFdBQVUsU0FBUyxJQUFJLFFBQVEsU0FBUztBQUNwRSxRQUFJO0FBRUosWUFBUSxlQUFlO0FBQUEsTUFDckIsS0FBSztBQUNILGtCQUFVO0FBQUEsVUFDUixHQUFHO0FBQUEsVUFDSCxHQUFHQSxXQUFVLElBQUksUUFBUTtBQUFBLFFBQzNCO0FBQ0E7QUFBQSxNQUVGLEtBQUs7QUFDSCxrQkFBVTtBQUFBLFVBQ1IsR0FBRztBQUFBLFVBQ0gsR0FBR0EsV0FBVSxJQUFJQSxXQUFVO0FBQUEsUUFDN0I7QUFDQTtBQUFBLE1BRUYsS0FBSztBQUNILGtCQUFVO0FBQUEsVUFDUixHQUFHQSxXQUFVLElBQUlBLFdBQVU7QUFBQSxVQUMzQixHQUFHO0FBQUEsUUFDTDtBQUNBO0FBQUEsTUFFRixLQUFLO0FBQ0gsa0JBQVU7QUFBQSxVQUNSLEdBQUdBLFdBQVUsSUFBSSxRQUFRO0FBQUEsVUFDekIsR0FBRztBQUFBLFFBQ0w7QUFDQTtBQUFBLE1BRUY7QUFDRSxrQkFBVTtBQUFBLFVBQ1IsR0FBR0EsV0FBVTtBQUFBLFVBQ2IsR0FBR0EsV0FBVTtBQUFBLFFBQ2Y7QUFBQSxJQUNKO0FBRUEsUUFBSSxXQUFXLGdCQUFnQix5QkFBeUIsYUFBYSxJQUFJO0FBRXpFLFFBQUksWUFBWSxNQUFNO0FBQ3BCLFVBQUksTUFBTSxhQUFhLE1BQU0sV0FBVztBQUV4QyxjQUFRLFdBQVc7QUFBQSxRQUNqQixLQUFLO0FBQ0gsa0JBQVEsUUFBUSxJQUFJLFFBQVEsUUFBUSxLQUFLQSxXQUFVLEdBQUcsSUFBSSxJQUFJLFFBQVEsR0FBRyxJQUFJO0FBQzdFO0FBQUEsUUFFRixLQUFLO0FBQ0gsa0JBQVEsUUFBUSxJQUFJLFFBQVEsUUFBUSxLQUFLQSxXQUFVLEdBQUcsSUFBSSxJQUFJLFFBQVEsR0FBRyxJQUFJO0FBQzdFO0FBQUEsUUFFRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBRUEsV0FBTztBQUFBLEVBQ1Q7OztBQzNEZSxXQUFSLGVBQWdDLE9BQU8sU0FBUztBQUNyRCxRQUFJLFlBQVksUUFBUTtBQUN0QixnQkFBVSxDQUFDO0FBQUEsSUFDYjtBQUVBLFFBQUksV0FBVyxTQUNYLHFCQUFxQixTQUFTLFdBQzlCLFlBQVksdUJBQXVCLFNBQVMsTUFBTSxZQUFZLG9CQUM5RCxvQkFBb0IsU0FBUyxVQUM3QixXQUFXLHNCQUFzQixTQUFTLE1BQU0sV0FBVyxtQkFDM0Qsb0JBQW9CLFNBQVMsVUFDN0IsV0FBVyxzQkFBc0IsU0FBUyxrQkFBa0IsbUJBQzVELHdCQUF3QixTQUFTLGNBQ2pDLGVBQWUsMEJBQTBCLFNBQVMsV0FBVyx1QkFDN0Qsd0JBQXdCLFNBQVMsZ0JBQ2pDLGlCQUFpQiwwQkFBMEIsU0FBUyxTQUFTLHVCQUM3RCx1QkFBdUIsU0FBUyxhQUNoQyxjQUFjLHlCQUF5QixTQUFTLFFBQVEsc0JBQ3hELG1CQUFtQixTQUFTLFNBQzVCLFVBQVUscUJBQXFCLFNBQVMsSUFBSTtBQUNoRCxRQUFJLGdCQUFnQixtQkFBbUIsT0FBTyxZQUFZLFdBQVcsVUFBVSxnQkFBZ0IsU0FBUyxjQUFjLENBQUM7QUFDdkgsUUFBSSxhQUFhLG1CQUFtQixTQUFTLFlBQVk7QUFDekQsUUFBSSxhQUFhLE1BQU0sTUFBTTtBQUM3QixRQUFJLFVBQVUsTUFBTSxTQUFTLGNBQWMsYUFBYSxjQUFjO0FBQ3RFLFFBQUkscUJBQXFCLGdCQUFnQixVQUFVLE9BQU8sSUFBSSxVQUFVLFFBQVEsa0JBQWtCLG1CQUFtQixNQUFNLFNBQVMsTUFBTSxHQUFHLFVBQVUsY0FBYyxRQUFRO0FBQzdLLFFBQUksc0JBQXNCLHNCQUFzQixNQUFNLFNBQVMsU0FBUztBQUN4RSxRQUFJQyxpQkFBZ0IsZUFBZTtBQUFBLE1BQ2pDLFdBQVc7QUFBQSxNQUNYLFNBQVM7QUFBQSxNQUNULFVBQVU7QUFBQSxNQUNWO0FBQUEsSUFDRixDQUFDO0FBQ0QsUUFBSSxtQkFBbUIsaUJBQWlCLE9BQU8sT0FBTyxDQUFDLEdBQUcsWUFBWUEsY0FBYSxDQUFDO0FBQ3BGLFFBQUksb0JBQW9CLG1CQUFtQixTQUFTLG1CQUFtQjtBQUd2RSxRQUFJLGtCQUFrQjtBQUFBLE1BQ3BCLEtBQUssbUJBQW1CLE1BQU0sa0JBQWtCLE1BQU0sY0FBYztBQUFBLE1BQ3BFLFFBQVEsa0JBQWtCLFNBQVMsbUJBQW1CLFNBQVMsY0FBYztBQUFBLE1BQzdFLE1BQU0sbUJBQW1CLE9BQU8sa0JBQWtCLE9BQU8sY0FBYztBQUFBLE1BQ3ZFLE9BQU8sa0JBQWtCLFFBQVEsbUJBQW1CLFFBQVEsY0FBYztBQUFBLElBQzVFO0FBQ0EsUUFBSSxhQUFhLE1BQU0sY0FBYztBQUVyQyxRQUFJLG1CQUFtQixVQUFVLFlBQVk7QUFDM0MsVUFBSUMsVUFBUyxXQUFXLFNBQVM7QUFDakMsYUFBTyxLQUFLLGVBQWUsRUFBRSxRQUFRLFNBQVUsS0FBSztBQUNsRCxZQUFJLFdBQVcsQ0FBQyxPQUFPLE1BQU0sRUFBRSxRQUFRLEdBQUcsS0FBSyxJQUFJLElBQUk7QUFDdkQsWUFBSSxPQUFPLENBQUMsS0FBSyxNQUFNLEVBQUUsUUFBUSxHQUFHLEtBQUssSUFBSSxNQUFNO0FBQ25ELHdCQUFnQixHQUFHLEtBQUtBLFFBQU8sSUFBSSxJQUFJO0FBQUEsTUFDekMsQ0FBQztBQUFBLElBQ0g7QUFFQSxXQUFPO0FBQUEsRUFDVDs7O0FDNURlLFdBQVIscUJBQXNDLE9BQU8sU0FBUztBQUMzRCxRQUFJLFlBQVksUUFBUTtBQUN0QixnQkFBVSxDQUFDO0FBQUEsSUFDYjtBQUVBLFFBQUksV0FBVyxTQUNYLFlBQVksU0FBUyxXQUNyQixXQUFXLFNBQVMsVUFDcEIsZUFBZSxTQUFTLGNBQ3hCLFVBQVUsU0FBUyxTQUNuQixpQkFBaUIsU0FBUyxnQkFDMUIsd0JBQXdCLFNBQVMsdUJBQ2pDLHdCQUF3QiwwQkFBMEIsU0FBUyxhQUFnQjtBQUMvRSxRQUFJLFlBQVksYUFBYSxTQUFTO0FBQ3RDLFFBQUlDLGNBQWEsWUFBWSxpQkFBaUIsc0JBQXNCLG9CQUFvQixPQUFPLFNBQVVDLFlBQVc7QUFDbEgsYUFBTyxhQUFhQSxVQUFTLE1BQU07QUFBQSxJQUNyQyxDQUFDLElBQUk7QUFDTCxRQUFJLG9CQUFvQkQsWUFBVyxPQUFPLFNBQVVDLFlBQVc7QUFDN0QsYUFBTyxzQkFBc0IsUUFBUUEsVUFBUyxLQUFLO0FBQUEsSUFDckQsQ0FBQztBQUVELFFBQUksa0JBQWtCLFdBQVcsR0FBRztBQUNsQywwQkFBb0JEO0FBQUEsSUFDdEI7QUFHQSxRQUFJLFlBQVksa0JBQWtCLE9BQU8sU0FBVSxLQUFLQyxZQUFXO0FBQ2pFLFVBQUlBLFVBQVMsSUFBSSxlQUFlLE9BQU87QUFBQSxRQUNyQyxXQUFXQTtBQUFBLFFBQ1g7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0YsQ0FBQyxFQUFFLGlCQUFpQkEsVUFBUyxDQUFDO0FBQzlCLGFBQU87QUFBQSxJQUNULEdBQUcsQ0FBQyxDQUFDO0FBQ0wsV0FBTyxPQUFPLEtBQUssU0FBUyxFQUFFLEtBQUssU0FBVSxHQUFHLEdBQUc7QUFDakQsYUFBTyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUM7QUFBQSxJQUNuQyxDQUFDO0FBQUEsRUFDSDs7O0FDbENBLFdBQVMsOEJBQThCLFdBQVc7QUFDaEQsUUFBSSxpQkFBaUIsU0FBUyxNQUFNLE1BQU07QUFDeEMsYUFBTyxDQUFDO0FBQUEsSUFDVjtBQUVBLFFBQUksb0JBQW9CLHFCQUFxQixTQUFTO0FBQ3RELFdBQU8sQ0FBQyw4QkFBOEIsU0FBUyxHQUFHLG1CQUFtQiw4QkFBOEIsaUJBQWlCLENBQUM7QUFBQSxFQUN2SDtBQUVBLFdBQVMsS0FBSyxNQUFNO0FBQ2xCLFFBQUksUUFBUSxLQUFLLE9BQ2IsVUFBVSxLQUFLLFNBQ2YsT0FBTyxLQUFLO0FBRWhCLFFBQUksTUFBTSxjQUFjLElBQUksRUFBRSxPQUFPO0FBQ25DO0FBQUEsSUFDRjtBQUVBLFFBQUksb0JBQW9CLFFBQVEsVUFDNUIsZ0JBQWdCLHNCQUFzQixTQUFTLE9BQU8sbUJBQ3RELG1CQUFtQixRQUFRLFNBQzNCLGVBQWUscUJBQXFCLFNBQVMsT0FBTyxrQkFDcEQsOEJBQThCLFFBQVEsb0JBQ3RDLFVBQVUsUUFBUSxTQUNsQixXQUFXLFFBQVEsVUFDbkIsZUFBZSxRQUFRLGNBQ3ZCLGNBQWMsUUFBUSxhQUN0Qix3QkFBd0IsUUFBUSxnQkFDaEMsaUJBQWlCLDBCQUEwQixTQUFTLE9BQU8sdUJBQzNELHdCQUF3QixRQUFRO0FBQ3BDLFFBQUkscUJBQXFCLE1BQU0sUUFBUTtBQUN2QyxRQUFJLGdCQUFnQixpQkFBaUIsa0JBQWtCO0FBQ3ZELFFBQUksa0JBQWtCLGtCQUFrQjtBQUN4QyxRQUFJLHFCQUFxQixnQ0FBZ0MsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLGtCQUFrQixDQUFDLElBQUksOEJBQThCLGtCQUFrQjtBQUMzTCxRQUFJQyxjQUFhLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxrQkFBa0IsRUFBRSxPQUFPLFNBQVUsS0FBS0MsWUFBVztBQUNoRyxhQUFPLElBQUksT0FBTyxpQkFBaUJBLFVBQVMsTUFBTSxPQUFPLHFCQUFxQixPQUFPO0FBQUEsUUFDbkYsV0FBV0E7QUFBQSxRQUNYO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0YsQ0FBQyxJQUFJQSxVQUFTO0FBQUEsSUFDaEIsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFJLGdCQUFnQixNQUFNLE1BQU07QUFDaEMsUUFBSSxhQUFhLE1BQU0sTUFBTTtBQUM3QixRQUFJLFlBQVksb0JBQUksSUFBSTtBQUN4QixRQUFJLHFCQUFxQjtBQUN6QixRQUFJLHdCQUF3QkQsWUFBVyxDQUFDO0FBRXhDLGFBQVMsSUFBSSxHQUFHLElBQUlBLFlBQVcsUUFBUSxLQUFLO0FBQzFDLFVBQUksWUFBWUEsWUFBVyxDQUFDO0FBRTVCLFVBQUksaUJBQWlCLGlCQUFpQixTQUFTO0FBRS9DLFVBQUksbUJBQW1CLGFBQWEsU0FBUyxNQUFNO0FBQ25ELFVBQUksYUFBYSxDQUFDLEtBQUssTUFBTSxFQUFFLFFBQVEsY0FBYyxLQUFLO0FBQzFELFVBQUksTUFBTSxhQUFhLFVBQVU7QUFDakMsVUFBSSxXQUFXLGVBQWUsT0FBTztBQUFBLFFBQ25DO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0YsQ0FBQztBQUNELFVBQUksb0JBQW9CLGFBQWEsbUJBQW1CLFFBQVEsT0FBTyxtQkFBbUIsU0FBUztBQUVuRyxVQUFJLGNBQWMsR0FBRyxJQUFJLFdBQVcsR0FBRyxHQUFHO0FBQ3hDLDRCQUFvQixxQkFBcUIsaUJBQWlCO0FBQUEsTUFDNUQ7QUFFQSxVQUFJLG1CQUFtQixxQkFBcUIsaUJBQWlCO0FBQzdELFVBQUksU0FBUyxDQUFDO0FBRWQsVUFBSSxlQUFlO0FBQ2pCLGVBQU8sS0FBSyxTQUFTLGNBQWMsS0FBSyxDQUFDO0FBQUEsTUFDM0M7QUFFQSxVQUFJLGNBQWM7QUFDaEIsZUFBTyxLQUFLLFNBQVMsaUJBQWlCLEtBQUssR0FBRyxTQUFTLGdCQUFnQixLQUFLLENBQUM7QUFBQSxNQUMvRTtBQUVBLFVBQUksT0FBTyxNQUFNLFNBQVUsT0FBTztBQUNoQyxlQUFPO0FBQUEsTUFDVCxDQUFDLEdBQUc7QUFDRixnQ0FBd0I7QUFDeEIsNkJBQXFCO0FBQ3JCO0FBQUEsTUFDRjtBQUVBLGdCQUFVLElBQUksV0FBVyxNQUFNO0FBQUEsSUFDakM7QUFFQSxRQUFJLG9CQUFvQjtBQUV0QixVQUFJLGlCQUFpQixpQkFBaUIsSUFBSTtBQUUxQyxVQUFJLFFBQVEsU0FBU0UsT0FBTUMsS0FBSTtBQUM3QixZQUFJLG1CQUFtQkgsWUFBVyxLQUFLLFNBQVVDLFlBQVc7QUFDMUQsY0FBSUcsVUFBUyxVQUFVLElBQUlILFVBQVM7QUFFcEMsY0FBSUcsU0FBUTtBQUNWLG1CQUFPQSxRQUFPLE1BQU0sR0FBR0QsR0FBRSxFQUFFLE1BQU0sU0FBVSxPQUFPO0FBQ2hELHFCQUFPO0FBQUEsWUFDVCxDQUFDO0FBQUEsVUFDSDtBQUFBLFFBQ0YsQ0FBQztBQUVELFlBQUksa0JBQWtCO0FBQ3BCLGtDQUF3QjtBQUN4QixpQkFBTztBQUFBLFFBQ1Q7QUFBQSxNQUNGO0FBRUEsZUFBUyxLQUFLLGdCQUFnQixLQUFLLEdBQUcsTUFBTTtBQUMxQyxZQUFJLE9BQU8sTUFBTSxFQUFFO0FBRW5CLFlBQUksU0FBUztBQUFTO0FBQUEsTUFDeEI7QUFBQSxJQUNGO0FBRUEsUUFBSSxNQUFNLGNBQWMsdUJBQXVCO0FBQzdDLFlBQU0sY0FBYyxJQUFJLEVBQUUsUUFBUTtBQUNsQyxZQUFNLFlBQVk7QUFDbEIsWUFBTSxRQUFRO0FBQUEsSUFDaEI7QUFBQSxFQUNGO0FBR0EsTUFBTyxlQUFRO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixTQUFTO0FBQUEsSUFDVCxPQUFPO0FBQUEsSUFDUCxJQUFJO0FBQUEsSUFDSixrQkFBa0IsQ0FBQyxRQUFRO0FBQUEsSUFDM0IsTUFBTTtBQUFBLE1BQ0osT0FBTztBQUFBLElBQ1Q7QUFBQSxFQUNGOzs7QUMvSUEsV0FBUyxlQUFlLFVBQVUsTUFBTSxrQkFBa0I7QUFDeEQsUUFBSSxxQkFBcUIsUUFBUTtBQUMvQix5QkFBbUI7QUFBQSxRQUNqQixHQUFHO0FBQUEsUUFDSCxHQUFHO0FBQUEsTUFDTDtBQUFBLElBQ0Y7QUFFQSxXQUFPO0FBQUEsTUFDTCxLQUFLLFNBQVMsTUFBTSxLQUFLLFNBQVMsaUJBQWlCO0FBQUEsTUFDbkQsT0FBTyxTQUFTLFFBQVEsS0FBSyxRQUFRLGlCQUFpQjtBQUFBLE1BQ3RELFFBQVEsU0FBUyxTQUFTLEtBQUssU0FBUyxpQkFBaUI7QUFBQSxNQUN6RCxNQUFNLFNBQVMsT0FBTyxLQUFLLFFBQVEsaUJBQWlCO0FBQUEsSUFDdEQ7QUFBQSxFQUNGO0FBRUEsV0FBUyxzQkFBc0IsVUFBVTtBQUN2QyxXQUFPLENBQUMsS0FBSyxPQUFPLFFBQVEsSUFBSSxFQUFFLEtBQUssU0FBVSxNQUFNO0FBQ3JELGFBQU8sU0FBUyxJQUFJLEtBQUs7QUFBQSxJQUMzQixDQUFDO0FBQUEsRUFDSDtBQUVBLFdBQVMsS0FBSyxNQUFNO0FBQ2xCLFFBQUksUUFBUSxLQUFLLE9BQ2IsT0FBTyxLQUFLO0FBQ2hCLFFBQUksZ0JBQWdCLE1BQU0sTUFBTTtBQUNoQyxRQUFJLGFBQWEsTUFBTSxNQUFNO0FBQzdCLFFBQUksbUJBQW1CLE1BQU0sY0FBYztBQUMzQyxRQUFJLG9CQUFvQixlQUFlLE9BQU87QUFBQSxNQUM1QyxnQkFBZ0I7QUFBQSxJQUNsQixDQUFDO0FBQ0QsUUFBSSxvQkFBb0IsZUFBZSxPQUFPO0FBQUEsTUFDNUMsYUFBYTtBQUFBLElBQ2YsQ0FBQztBQUNELFFBQUksMkJBQTJCLGVBQWUsbUJBQW1CLGFBQWE7QUFDOUUsUUFBSSxzQkFBc0IsZUFBZSxtQkFBbUIsWUFBWSxnQkFBZ0I7QUFDeEYsUUFBSSxvQkFBb0Isc0JBQXNCLHdCQUF3QjtBQUN0RSxRQUFJLG1CQUFtQixzQkFBc0IsbUJBQW1CO0FBQ2hFLFVBQU0sY0FBYyxJQUFJLElBQUk7QUFBQSxNQUMxQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFDQSxVQUFNLFdBQVcsU0FBUyxPQUFPLE9BQU8sQ0FBQyxHQUFHLE1BQU0sV0FBVyxRQUFRO0FBQUEsTUFDbkUsZ0NBQWdDO0FBQUEsTUFDaEMsdUJBQXVCO0FBQUEsSUFDekIsQ0FBQztBQUFBLEVBQ0g7QUFHQSxNQUFPLGVBQVE7QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFNBQVM7QUFBQSxJQUNULE9BQU87QUFBQSxJQUNQLGtCQUFrQixDQUFDLGlCQUFpQjtBQUFBLElBQ3BDLElBQUk7QUFBQSxFQUNOOzs7QUN6RE8sV0FBUyx3QkFBd0IsV0FBVyxPQUFPRSxTQUFRO0FBQ2hFLFFBQUksZ0JBQWdCLGlCQUFpQixTQUFTO0FBQzlDLFFBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLEVBQUUsUUFBUSxhQUFhLEtBQUssSUFBSSxLQUFLO0FBRXBFLFFBQUksT0FBTyxPQUFPQSxZQUFXLGFBQWFBLFFBQU8sT0FBTyxPQUFPLENBQUMsR0FBRyxPQUFPO0FBQUEsTUFDeEU7QUFBQSxJQUNGLENBQUMsQ0FBQyxJQUFJQSxTQUNGLFdBQVcsS0FBSyxDQUFDLEdBQ2pCLFdBQVcsS0FBSyxDQUFDO0FBRXJCLGVBQVcsWUFBWTtBQUN2QixnQkFBWSxZQUFZLEtBQUs7QUFDN0IsV0FBTyxDQUFDLE1BQU0sS0FBSyxFQUFFLFFBQVEsYUFBYSxLQUFLLElBQUk7QUFBQSxNQUNqRCxHQUFHO0FBQUEsTUFDSCxHQUFHO0FBQUEsSUFDTCxJQUFJO0FBQUEsTUFDRixHQUFHO0FBQUEsTUFDSCxHQUFHO0FBQUEsSUFDTDtBQUFBLEVBQ0Y7QUFFQSxXQUFTLE9BQU8sT0FBTztBQUNyQixRQUFJLFFBQVEsTUFBTSxPQUNkLFVBQVUsTUFBTSxTQUNoQixPQUFPLE1BQU07QUFDakIsUUFBSSxrQkFBa0IsUUFBUSxRQUMxQkEsVUFBUyxvQkFBb0IsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJO0FBQ25ELFFBQUksT0FBTyxXQUFXLE9BQU8sU0FBVSxLQUFLLFdBQVc7QUFDckQsVUFBSSxTQUFTLElBQUksd0JBQXdCLFdBQVcsTUFBTSxPQUFPQSxPQUFNO0FBQ3ZFLGFBQU87QUFBQSxJQUNULEdBQUcsQ0FBQyxDQUFDO0FBQ0wsUUFBSSx3QkFBd0IsS0FBSyxNQUFNLFNBQVMsR0FDNUMsSUFBSSxzQkFBc0IsR0FDMUIsSUFBSSxzQkFBc0I7QUFFOUIsUUFBSSxNQUFNLGNBQWMsaUJBQWlCLE1BQU07QUFDN0MsWUFBTSxjQUFjLGNBQWMsS0FBSztBQUN2QyxZQUFNLGNBQWMsY0FBYyxLQUFLO0FBQUEsSUFDekM7QUFFQSxVQUFNLGNBQWMsSUFBSSxJQUFJO0FBQUEsRUFDOUI7QUFHQSxNQUFPLGlCQUFRO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixTQUFTO0FBQUEsSUFDVCxPQUFPO0FBQUEsSUFDUCxVQUFVLENBQUMsZUFBZTtBQUFBLElBQzFCLElBQUk7QUFBQSxFQUNOOzs7QUNuREEsV0FBUyxjQUFjLE1BQU07QUFDM0IsUUFBSSxRQUFRLEtBQUssT0FDYixPQUFPLEtBQUs7QUFLaEIsVUFBTSxjQUFjLElBQUksSUFBSSxlQUFlO0FBQUEsTUFDekMsV0FBVyxNQUFNLE1BQU07QUFBQSxNQUN2QixTQUFTLE1BQU0sTUFBTTtBQUFBLE1BQ3JCLFVBQVU7QUFBQSxNQUNWLFdBQVcsTUFBTTtBQUFBLElBQ25CLENBQUM7QUFBQSxFQUNIO0FBR0EsTUFBTyx3QkFBUTtBQUFBLElBQ2IsTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsT0FBTztBQUFBLElBQ1AsSUFBSTtBQUFBLElBQ0osTUFBTSxDQUFDO0FBQUEsRUFDVDs7O0FDeEJlLFdBQVIsV0FBNEIsTUFBTTtBQUN2QyxXQUFPLFNBQVMsTUFBTSxNQUFNO0FBQUEsRUFDOUI7OztBQ1VBLFdBQVMsZ0JBQWdCLE1BQU07QUFDN0IsUUFBSSxRQUFRLEtBQUssT0FDYixVQUFVLEtBQUssU0FDZixPQUFPLEtBQUs7QUFDaEIsUUFBSSxvQkFBb0IsUUFBUSxVQUM1QixnQkFBZ0Isc0JBQXNCLFNBQVMsT0FBTyxtQkFDdEQsbUJBQW1CLFFBQVEsU0FDM0IsZUFBZSxxQkFBcUIsU0FBUyxRQUFRLGtCQUNyRCxXQUFXLFFBQVEsVUFDbkIsZUFBZSxRQUFRLGNBQ3ZCLGNBQWMsUUFBUSxhQUN0QixVQUFVLFFBQVEsU0FDbEIsa0JBQWtCLFFBQVEsUUFDMUIsU0FBUyxvQkFBb0IsU0FBUyxPQUFPLGlCQUM3Qyx3QkFBd0IsUUFBUSxjQUNoQyxlQUFlLDBCQUEwQixTQUFTLElBQUk7QUFDMUQsUUFBSSxXQUFXLGVBQWUsT0FBTztBQUFBLE1BQ25DO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixDQUFDO0FBQ0QsUUFBSSxnQkFBZ0IsaUJBQWlCLE1BQU0sU0FBUztBQUNwRCxRQUFJLFlBQVksYUFBYSxNQUFNLFNBQVM7QUFDNUMsUUFBSSxrQkFBa0IsQ0FBQztBQUN2QixRQUFJLFdBQVcseUJBQXlCLGFBQWE7QUFDckQsUUFBSSxVQUFVLFdBQVcsUUFBUTtBQUNqQyxRQUFJQyxpQkFBZ0IsTUFBTSxjQUFjO0FBQ3hDLFFBQUksZ0JBQWdCLE1BQU0sTUFBTTtBQUNoQyxRQUFJLGFBQWEsTUFBTSxNQUFNO0FBQzdCLFFBQUksb0JBQW9CLE9BQU8saUJBQWlCLGFBQWEsYUFBYSxPQUFPLE9BQU8sQ0FBQyxHQUFHLE1BQU0sT0FBTztBQUFBLE1BQ3ZHLFdBQVcsTUFBTTtBQUFBLElBQ25CLENBQUMsQ0FBQyxJQUFJO0FBQ04sUUFBSSw4QkFBOEIsT0FBTyxzQkFBc0IsV0FBVztBQUFBLE1BQ3hFLFVBQVU7QUFBQSxNQUNWLFNBQVM7QUFBQSxJQUNYLElBQUksT0FBTyxPQUFPO0FBQUEsTUFDaEIsVUFBVTtBQUFBLE1BQ1YsU0FBUztBQUFBLElBQ1gsR0FBRyxpQkFBaUI7QUFDcEIsUUFBSSxzQkFBc0IsTUFBTSxjQUFjLFNBQVMsTUFBTSxjQUFjLE9BQU8sTUFBTSxTQUFTLElBQUk7QUFDckcsUUFBSSxPQUFPO0FBQUEsTUFDVCxHQUFHO0FBQUEsTUFDSCxHQUFHO0FBQUEsSUFDTDtBQUVBLFFBQUksQ0FBQ0EsZ0JBQWU7QUFDbEI7QUFBQSxJQUNGO0FBRUEsUUFBSSxlQUFlO0FBQ2pCLFVBQUk7QUFFSixVQUFJLFdBQVcsYUFBYSxNQUFNLE1BQU07QUFDeEMsVUFBSSxVQUFVLGFBQWEsTUFBTSxTQUFTO0FBQzFDLFVBQUksTUFBTSxhQUFhLE1BQU0sV0FBVztBQUN4QyxVQUFJQyxVQUFTRCxlQUFjLFFBQVE7QUFDbkMsVUFBSUUsT0FBTUQsVUFBUyxTQUFTLFFBQVE7QUFDcEMsVUFBSUUsT0FBTUYsVUFBUyxTQUFTLE9BQU87QUFDbkMsVUFBSSxXQUFXLFNBQVMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxJQUFJO0FBQy9DLFVBQUksU0FBUyxjQUFjLFFBQVEsY0FBYyxHQUFHLElBQUksV0FBVyxHQUFHO0FBQ3RFLFVBQUksU0FBUyxjQUFjLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRztBQUd4RSxVQUFJLGVBQWUsTUFBTSxTQUFTO0FBQ2xDLFVBQUksWUFBWSxVQUFVLGVBQWUsY0FBYyxZQUFZLElBQUk7QUFBQSxRQUNyRSxPQUFPO0FBQUEsUUFDUCxRQUFRO0FBQUEsTUFDVjtBQUNBLFVBQUkscUJBQXFCLE1BQU0sY0FBYyxrQkFBa0IsSUFBSSxNQUFNLGNBQWMsa0JBQWtCLEVBQUUsVUFBVSxtQkFBbUI7QUFDeEksVUFBSSxrQkFBa0IsbUJBQW1CLFFBQVE7QUFDakQsVUFBSSxrQkFBa0IsbUJBQW1CLE9BQU87QUFNaEQsVUFBSSxXQUFXLE9BQU8sR0FBRyxjQUFjLEdBQUcsR0FBRyxVQUFVLEdBQUcsQ0FBQztBQUMzRCxVQUFJLFlBQVksa0JBQWtCLGNBQWMsR0FBRyxJQUFJLElBQUksV0FBVyxXQUFXLGtCQUFrQiw0QkFBNEIsV0FBVyxTQUFTLFdBQVcsa0JBQWtCLDRCQUE0QjtBQUM1TSxVQUFJLFlBQVksa0JBQWtCLENBQUMsY0FBYyxHQUFHLElBQUksSUFBSSxXQUFXLFdBQVcsa0JBQWtCLDRCQUE0QixXQUFXLFNBQVMsV0FBVyxrQkFBa0IsNEJBQTRCO0FBQzdNLFVBQUksb0JBQW9CLE1BQU0sU0FBUyxTQUFTLGdCQUFnQixNQUFNLFNBQVMsS0FBSztBQUNwRixVQUFJLGVBQWUsb0JBQW9CLGFBQWEsTUFBTSxrQkFBa0IsYUFBYSxJQUFJLGtCQUFrQixjQUFjLElBQUk7QUFDakksVUFBSSx1QkFBdUIsd0JBQXdCLHVCQUF1QixPQUFPLFNBQVMsb0JBQW9CLFFBQVEsTUFBTSxPQUFPLHdCQUF3QjtBQUMzSixVQUFJLFlBQVlBLFVBQVMsWUFBWSxzQkFBc0I7QUFDM0QsVUFBSSxZQUFZQSxVQUFTLFlBQVk7QUFDckMsVUFBSSxrQkFBa0IsT0FBTyxTQUFTLElBQVFDLE1BQUssU0FBUyxJQUFJQSxNQUFLRCxTQUFRLFNBQVMsSUFBUUUsTUFBSyxTQUFTLElBQUlBLElBQUc7QUFDbkgsTUFBQUgsZUFBYyxRQUFRLElBQUk7QUFDMUIsV0FBSyxRQUFRLElBQUksa0JBQWtCQztBQUFBLElBQ3JDO0FBRUEsUUFBSSxjQUFjO0FBQ2hCLFVBQUk7QUFFSixVQUFJLFlBQVksYUFBYSxNQUFNLE1BQU07QUFFekMsVUFBSSxXQUFXLGFBQWEsTUFBTSxTQUFTO0FBRTNDLFVBQUksVUFBVUQsZUFBYyxPQUFPO0FBRW5DLFVBQUksT0FBTyxZQUFZLE1BQU0sV0FBVztBQUV4QyxVQUFJLE9BQU8sVUFBVSxTQUFTLFNBQVM7QUFFdkMsVUFBSSxPQUFPLFVBQVUsU0FBUyxRQUFRO0FBRXRDLFVBQUksZUFBZSxDQUFDLEtBQUssSUFBSSxFQUFFLFFBQVEsYUFBYSxNQUFNO0FBRTFELFVBQUksd0JBQXdCLHlCQUF5Qix1QkFBdUIsT0FBTyxTQUFTLG9CQUFvQixPQUFPLE1BQU0sT0FBTyx5QkFBeUI7QUFFN0osVUFBSSxhQUFhLGVBQWUsT0FBTyxVQUFVLGNBQWMsSUFBSSxJQUFJLFdBQVcsSUFBSSxJQUFJLHVCQUF1Qiw0QkFBNEI7QUFFN0ksVUFBSSxhQUFhLGVBQWUsVUFBVSxjQUFjLElBQUksSUFBSSxXQUFXLElBQUksSUFBSSx1QkFBdUIsNEJBQTRCLFVBQVU7QUFFaEosVUFBSSxtQkFBbUIsVUFBVSxlQUFlLGVBQWUsWUFBWSxTQUFTLFVBQVUsSUFBSSxPQUFPLFNBQVMsYUFBYSxNQUFNLFNBQVMsU0FBUyxhQUFhLElBQUk7QUFFeEssTUFBQUEsZUFBYyxPQUFPLElBQUk7QUFDekIsV0FBSyxPQUFPLElBQUksbUJBQW1CO0FBQUEsSUFDckM7QUFFQSxVQUFNLGNBQWMsSUFBSSxJQUFJO0FBQUEsRUFDOUI7QUFHQSxNQUFPLDBCQUFRO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixTQUFTO0FBQUEsSUFDVCxPQUFPO0FBQUEsSUFDUCxJQUFJO0FBQUEsSUFDSixrQkFBa0IsQ0FBQyxRQUFRO0FBQUEsRUFDN0I7OztBQzdJZSxXQUFSLHFCQUFzQyxTQUFTO0FBQ3BELFdBQU87QUFBQSxNQUNMLFlBQVksUUFBUTtBQUFBLE1BQ3BCLFdBQVcsUUFBUTtBQUFBLElBQ3JCO0FBQUEsRUFDRjs7O0FDRGUsV0FBUixjQUErQixNQUFNO0FBQzFDLFFBQUksU0FBUyxVQUFVLElBQUksS0FBSyxDQUFDLGNBQWMsSUFBSSxHQUFHO0FBQ3BELGFBQU8sZ0JBQWdCLElBQUk7QUFBQSxJQUM3QixPQUFPO0FBQ0wsYUFBTyxxQkFBcUIsSUFBSTtBQUFBLElBQ2xDO0FBQUEsRUFDRjs7O0FDREEsV0FBUyxnQkFBZ0IsU0FBUztBQUNoQyxRQUFJLE9BQU8sUUFBUSxzQkFBc0I7QUFDekMsUUFBSSxTQUFTLE1BQU0sS0FBSyxLQUFLLElBQUksUUFBUSxlQUFlO0FBQ3hELFFBQUksU0FBUyxNQUFNLEtBQUssTUFBTSxJQUFJLFFBQVEsZ0JBQWdCO0FBQzFELFdBQU8sV0FBVyxLQUFLLFdBQVc7QUFBQSxFQUNwQztBQUllLFdBQVIsaUJBQWtDLHlCQUF5QixjQUFjLFNBQVM7QUFDdkYsUUFBSSxZQUFZLFFBQVE7QUFDdEIsZ0JBQVU7QUFBQSxJQUNaO0FBRUEsUUFBSSwwQkFBMEIsY0FBYyxZQUFZO0FBQ3hELFFBQUksdUJBQXVCLGNBQWMsWUFBWSxLQUFLLGdCQUFnQixZQUFZO0FBQ3RGLFFBQUksa0JBQWtCLG1CQUFtQixZQUFZO0FBQ3JELFFBQUksT0FBTyxzQkFBc0IseUJBQXlCLHNCQUFzQixPQUFPO0FBQ3ZGLFFBQUksU0FBUztBQUFBLE1BQ1gsWUFBWTtBQUFBLE1BQ1osV0FBVztBQUFBLElBQ2I7QUFDQSxRQUFJLFVBQVU7QUFBQSxNQUNaLEdBQUc7QUFBQSxNQUNILEdBQUc7QUFBQSxJQUNMO0FBRUEsUUFBSSwyQkFBMkIsQ0FBQywyQkFBMkIsQ0FBQyxTQUFTO0FBQ25FLFVBQUksWUFBWSxZQUFZLE1BQU07QUFBQSxNQUNsQyxlQUFlLGVBQWUsR0FBRztBQUMvQixpQkFBUyxjQUFjLFlBQVk7QUFBQSxNQUNyQztBQUVBLFVBQUksY0FBYyxZQUFZLEdBQUc7QUFDL0Isa0JBQVUsc0JBQXNCLGNBQWMsSUFBSTtBQUNsRCxnQkFBUSxLQUFLLGFBQWE7QUFDMUIsZ0JBQVEsS0FBSyxhQUFhO0FBQUEsTUFDNUIsV0FBVyxpQkFBaUI7QUFDMUIsZ0JBQVEsSUFBSSxvQkFBb0IsZUFBZTtBQUFBLE1BQ2pEO0FBQUEsSUFDRjtBQUVBLFdBQU87QUFBQSxNQUNMLEdBQUcsS0FBSyxPQUFPLE9BQU8sYUFBYSxRQUFRO0FBQUEsTUFDM0MsR0FBRyxLQUFLLE1BQU0sT0FBTyxZQUFZLFFBQVE7QUFBQSxNQUN6QyxPQUFPLEtBQUs7QUFBQSxNQUNaLFFBQVEsS0FBSztBQUFBLElBQ2Y7QUFBQSxFQUNGOzs7QUN2REEsV0FBUyxNQUFNLFdBQVc7QUFDeEIsUUFBSSxNQUFNLG9CQUFJLElBQUk7QUFDbEIsUUFBSSxVQUFVLG9CQUFJLElBQUk7QUFDdEIsUUFBSSxTQUFTLENBQUM7QUFDZCxjQUFVLFFBQVEsU0FBVSxVQUFVO0FBQ3BDLFVBQUksSUFBSSxTQUFTLE1BQU0sUUFBUTtBQUFBLElBQ2pDLENBQUM7QUFFRCxhQUFTLEtBQUssVUFBVTtBQUN0QixjQUFRLElBQUksU0FBUyxJQUFJO0FBQ3pCLFVBQUksV0FBVyxDQUFDLEVBQUUsT0FBTyxTQUFTLFlBQVksQ0FBQyxHQUFHLFNBQVMsb0JBQW9CLENBQUMsQ0FBQztBQUNqRixlQUFTLFFBQVEsU0FBVSxLQUFLO0FBQzlCLFlBQUksQ0FBQyxRQUFRLElBQUksR0FBRyxHQUFHO0FBQ3JCLGNBQUksY0FBYyxJQUFJLElBQUksR0FBRztBQUU3QixjQUFJLGFBQWE7QUFDZixpQkFBSyxXQUFXO0FBQUEsVUFDbEI7QUFBQSxRQUNGO0FBQUEsTUFDRixDQUFDO0FBQ0QsYUFBTyxLQUFLLFFBQVE7QUFBQSxJQUN0QjtBQUVBLGNBQVUsUUFBUSxTQUFVLFVBQVU7QUFDcEMsVUFBSSxDQUFDLFFBQVEsSUFBSSxTQUFTLElBQUksR0FBRztBQUUvQixhQUFLLFFBQVE7QUFBQSxNQUNmO0FBQUEsSUFDRixDQUFDO0FBQ0QsV0FBTztBQUFBLEVBQ1Q7QUFFZSxXQUFSLGVBQWdDLFdBQVc7QUFFaEQsUUFBSSxtQkFBbUIsTUFBTSxTQUFTO0FBRXRDLFdBQU8sZUFBZSxPQUFPLFNBQVUsS0FBSyxPQUFPO0FBQ2pELGFBQU8sSUFBSSxPQUFPLGlCQUFpQixPQUFPLFNBQVUsVUFBVTtBQUM1RCxlQUFPLFNBQVMsVUFBVTtBQUFBLE1BQzVCLENBQUMsQ0FBQztBQUFBLElBQ0osR0FBRyxDQUFDLENBQUM7QUFBQSxFQUNQOzs7QUMzQ2UsV0FBUixTQUEwQkksS0FBSTtBQUNuQyxRQUFJO0FBQ0osV0FBTyxXQUFZO0FBQ2pCLFVBQUksQ0FBQyxTQUFTO0FBQ1osa0JBQVUsSUFBSSxRQUFRLFNBQVUsU0FBUztBQUN2QyxrQkFBUSxRQUFRLEVBQUUsS0FBSyxXQUFZO0FBQ2pDLHNCQUFVO0FBQ1Ysb0JBQVFBLElBQUcsQ0FBQztBQUFBLFVBQ2QsQ0FBQztBQUFBLFFBQ0gsQ0FBQztBQUFBLE1BQ0g7QUFFQSxhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7OztBQ2RlLFdBQVIsWUFBNkIsV0FBVztBQUM3QyxRQUFJLFNBQVMsVUFBVSxPQUFPLFNBQVVDLFNBQVEsU0FBUztBQUN2RCxVQUFJLFdBQVdBLFFBQU8sUUFBUSxJQUFJO0FBQ2xDLE1BQUFBLFFBQU8sUUFBUSxJQUFJLElBQUksV0FBVyxPQUFPLE9BQU8sQ0FBQyxHQUFHLFVBQVUsU0FBUztBQUFBLFFBQ3JFLFNBQVMsT0FBTyxPQUFPLENBQUMsR0FBRyxTQUFTLFNBQVMsUUFBUSxPQUFPO0FBQUEsUUFDNUQsTUFBTSxPQUFPLE9BQU8sQ0FBQyxHQUFHLFNBQVMsTUFBTSxRQUFRLElBQUk7QUFBQSxNQUNyRCxDQUFDLElBQUk7QUFDTCxhQUFPQTtBQUFBLElBQ1QsR0FBRyxDQUFDLENBQUM7QUFFTCxXQUFPLE9BQU8sS0FBSyxNQUFNLEVBQUUsSUFBSSxTQUFVLEtBQUs7QUFDNUMsYUFBTyxPQUFPLEdBQUc7QUFBQSxJQUNuQixDQUFDO0FBQUEsRUFDSDs7O0FDSkEsTUFBSSxrQkFBa0I7QUFBQSxJQUNwQixXQUFXO0FBQUEsSUFDWCxXQUFXLENBQUM7QUFBQSxJQUNaLFVBQVU7QUFBQSxFQUNaO0FBRUEsV0FBUyxtQkFBbUI7QUFDMUIsYUFBUyxPQUFPLFVBQVUsUUFBUSxPQUFPLElBQUksTUFBTSxJQUFJLEdBQUcsT0FBTyxHQUFHLE9BQU8sTUFBTSxRQUFRO0FBQ3ZGLFdBQUssSUFBSSxJQUFJLFVBQVUsSUFBSTtBQUFBLElBQzdCO0FBRUEsV0FBTyxDQUFDLEtBQUssS0FBSyxTQUFVLFNBQVM7QUFDbkMsYUFBTyxFQUFFLFdBQVcsT0FBTyxRQUFRLDBCQUEwQjtBQUFBLElBQy9ELENBQUM7QUFBQSxFQUNIO0FBRU8sV0FBUyxnQkFBZ0Isa0JBQWtCO0FBQ2hELFFBQUkscUJBQXFCLFFBQVE7QUFDL0IseUJBQW1CLENBQUM7QUFBQSxJQUN0QjtBQUVBLFFBQUksb0JBQW9CLGtCQUNwQix3QkFBd0Isa0JBQWtCLGtCQUMxQ0Msb0JBQW1CLDBCQUEwQixTQUFTLENBQUMsSUFBSSx1QkFDM0QseUJBQXlCLGtCQUFrQixnQkFDM0MsaUJBQWlCLDJCQUEyQixTQUFTLGtCQUFrQjtBQUMzRSxXQUFPLFNBQVNDLGNBQWFDLFlBQVdDLFNBQVEsU0FBUztBQUN2RCxVQUFJLFlBQVksUUFBUTtBQUN0QixrQkFBVTtBQUFBLE1BQ1o7QUFFQSxVQUFJLFFBQVE7QUFBQSxRQUNWLFdBQVc7QUFBQSxRQUNYLGtCQUFrQixDQUFDO0FBQUEsUUFDbkIsU0FBUyxPQUFPLE9BQU8sQ0FBQyxHQUFHLGlCQUFpQixjQUFjO0FBQUEsUUFDMUQsZUFBZSxDQUFDO0FBQUEsUUFDaEIsVUFBVTtBQUFBLFVBQ1IsV0FBV0Q7QUFBQSxVQUNYLFFBQVFDO0FBQUEsUUFDVjtBQUFBLFFBQ0EsWUFBWSxDQUFDO0FBQUEsUUFDYixRQUFRLENBQUM7QUFBQSxNQUNYO0FBQ0EsVUFBSSxtQkFBbUIsQ0FBQztBQUN4QixVQUFJLGNBQWM7QUFDbEIsVUFBSSxXQUFXO0FBQUEsUUFDYjtBQUFBLFFBQ0EsWUFBWSxTQUFTLFdBQVcsa0JBQWtCO0FBQ2hELGNBQUlDLFdBQVUsT0FBTyxxQkFBcUIsYUFBYSxpQkFBaUIsTUFBTSxPQUFPLElBQUk7QUFDekYsaUNBQXVCO0FBQ3ZCLGdCQUFNLFVBQVUsT0FBTyxPQUFPLENBQUMsR0FBRyxnQkFBZ0IsTUFBTSxTQUFTQSxRQUFPO0FBQ3hFLGdCQUFNLGdCQUFnQjtBQUFBLFlBQ3BCLFdBQVcsVUFBVUYsVUFBUyxJQUFJLGtCQUFrQkEsVUFBUyxJQUFJQSxXQUFVLGlCQUFpQixrQkFBa0JBLFdBQVUsY0FBYyxJQUFJLENBQUM7QUFBQSxZQUMzSSxRQUFRLGtCQUFrQkMsT0FBTTtBQUFBLFVBQ2xDO0FBR0EsY0FBSSxtQkFBbUIsZUFBZSxZQUFZLENBQUMsRUFBRSxPQUFPSCxtQkFBa0IsTUFBTSxRQUFRLFNBQVMsQ0FBQyxDQUFDO0FBRXZHLGdCQUFNLG1CQUFtQixpQkFBaUIsT0FBTyxTQUFVLEdBQUc7QUFDNUQsbUJBQU8sRUFBRTtBQUFBLFVBQ1gsQ0FBQztBQUNELDZCQUFtQjtBQUNuQixpQkFBTyxTQUFTLE9BQU87QUFBQSxRQUN6QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQU1BLGFBQWEsU0FBUyxjQUFjO0FBQ2xDLGNBQUksYUFBYTtBQUNmO0FBQUEsVUFDRjtBQUVBLGNBQUksa0JBQWtCLE1BQU0sVUFDeEJFLGFBQVksZ0JBQWdCLFdBQzVCQyxVQUFTLGdCQUFnQjtBQUc3QixjQUFJLENBQUMsaUJBQWlCRCxZQUFXQyxPQUFNLEdBQUc7QUFDeEM7QUFBQSxVQUNGO0FBR0EsZ0JBQU0sUUFBUTtBQUFBLFlBQ1osV0FBVyxpQkFBaUJELFlBQVcsZ0JBQWdCQyxPQUFNLEdBQUcsTUFBTSxRQUFRLGFBQWEsT0FBTztBQUFBLFlBQ2xHLFFBQVEsY0FBY0EsT0FBTTtBQUFBLFVBQzlCO0FBTUEsZ0JBQU0sUUFBUTtBQUNkLGdCQUFNLFlBQVksTUFBTSxRQUFRO0FBS2hDLGdCQUFNLGlCQUFpQixRQUFRLFNBQVUsVUFBVTtBQUNqRCxtQkFBTyxNQUFNLGNBQWMsU0FBUyxJQUFJLElBQUksT0FBTyxPQUFPLENBQUMsR0FBRyxTQUFTLElBQUk7QUFBQSxVQUM3RSxDQUFDO0FBRUQsbUJBQVMsUUFBUSxHQUFHLFFBQVEsTUFBTSxpQkFBaUIsUUFBUSxTQUFTO0FBQ2xFLGdCQUFJLE1BQU0sVUFBVSxNQUFNO0FBQ3hCLG9CQUFNLFFBQVE7QUFDZCxzQkFBUTtBQUNSO0FBQUEsWUFDRjtBQUVBLGdCQUFJLHdCQUF3QixNQUFNLGlCQUFpQixLQUFLLEdBQ3BERSxNQUFLLHNCQUFzQixJQUMzQix5QkFBeUIsc0JBQXNCLFNBQy9DLFdBQVcsMkJBQTJCLFNBQVMsQ0FBQyxJQUFJLHdCQUNwRCxPQUFPLHNCQUFzQjtBQUVqQyxnQkFBSSxPQUFPQSxRQUFPLFlBQVk7QUFDNUIsc0JBQVFBLElBQUc7QUFBQSxnQkFDVDtBQUFBLGdCQUNBLFNBQVM7QUFBQSxnQkFDVDtBQUFBLGdCQUNBO0FBQUEsY0FDRixDQUFDLEtBQUs7QUFBQSxZQUNSO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQTtBQUFBO0FBQUEsUUFHQSxRQUFRLFNBQVMsV0FBWTtBQUMzQixpQkFBTyxJQUFJLFFBQVEsU0FBVSxTQUFTO0FBQ3BDLHFCQUFTLFlBQVk7QUFDckIsb0JBQVEsS0FBSztBQUFBLFVBQ2YsQ0FBQztBQUFBLFFBQ0gsQ0FBQztBQUFBLFFBQ0QsU0FBUyxTQUFTLFVBQVU7QUFDMUIsaUNBQXVCO0FBQ3ZCLHdCQUFjO0FBQUEsUUFDaEI7QUFBQSxNQUNGO0FBRUEsVUFBSSxDQUFDLGlCQUFpQkgsWUFBV0MsT0FBTSxHQUFHO0FBQ3hDLGVBQU87QUFBQSxNQUNUO0FBRUEsZUFBUyxXQUFXLE9BQU8sRUFBRSxLQUFLLFNBQVVHLFFBQU87QUFDakQsWUFBSSxDQUFDLGVBQWUsUUFBUSxlQUFlO0FBQ3pDLGtCQUFRLGNBQWNBLE1BQUs7QUFBQSxRQUM3QjtBQUFBLE1BQ0YsQ0FBQztBQU1ELGVBQVMscUJBQXFCO0FBQzVCLGNBQU0saUJBQWlCLFFBQVEsU0FBVSxNQUFNO0FBQzdDLGNBQUksT0FBTyxLQUFLLE1BQ1osZUFBZSxLQUFLLFNBQ3BCRixXQUFVLGlCQUFpQixTQUFTLENBQUMsSUFBSSxjQUN6Q0csVUFBUyxLQUFLO0FBRWxCLGNBQUksT0FBT0EsWUFBVyxZQUFZO0FBQ2hDLGdCQUFJLFlBQVlBLFFBQU87QUFBQSxjQUNyQjtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQSxTQUFTSDtBQUFBLFlBQ1gsQ0FBQztBQUVELGdCQUFJLFNBQVMsU0FBU0ksVUFBUztBQUFBLFlBQUM7QUFFaEMsNkJBQWlCLEtBQUssYUFBYSxNQUFNO0FBQUEsVUFDM0M7QUFBQSxRQUNGLENBQUM7QUFBQSxNQUNIO0FBRUEsZUFBUyx5QkFBeUI7QUFDaEMseUJBQWlCLFFBQVEsU0FBVUgsS0FBSTtBQUNyQyxpQkFBT0EsSUFBRztBQUFBLFFBQ1osQ0FBQztBQUNELDJCQUFtQixDQUFDO0FBQUEsTUFDdEI7QUFFQSxhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFDTyxNQUFJLGVBQTRCLGdDQUFnQjs7O0FDL0x2RCxNQUFJLG1CQUFtQixDQUFDLHdCQUFnQix1QkFBZSx1QkFBZSxtQkFBVztBQUNqRixNQUFJSSxnQkFBNEIsZ0NBQWdCO0FBQUEsSUFDOUM7QUFBQSxFQUNGLENBQUM7OztBQ0VELE1BQUlDLG9CQUFtQixDQUFDLHdCQUFnQix1QkFBZSx1QkFBZSxxQkFBYSxnQkFBUSxjQUFNLHlCQUFpQixlQUFPLFlBQUk7QUFDN0gsTUFBSUMsZ0JBQTRCLGdDQUFnQjtBQUFBLElBQzlDLGtCQUFrQkQ7QUFBQSxFQUNwQixDQUFDOzs7QUNGRCxNQUFNRSxhQUFhLG9CQUFJQyxJQUFHO0FBRTFCLE1BQUEsT0FBZTtJQUNiQyxJQUFJQyxTQUFTQyxLQUFLQyxVQUFVO0FBQzFCLFVBQUksQ0FBQ0wsV0FBV00sSUFBSUgsT0FBTyxHQUFHO0FBQzVCSCxtQkFBV0UsSUFBSUMsU0FBUyxvQkFBSUYsSUFBRyxDQUFFO01BQ25DO0FBRUEsWUFBTU0sY0FBY1AsV0FBV1EsSUFBSUwsT0FBTztBQUkxQyxVQUFJLENBQUNJLFlBQVlELElBQUlGLEdBQUcsS0FBS0csWUFBWUUsU0FBUyxHQUFHO0FBRW5EQyxnQkFBUUMsTUFBTywrRUFBOEVDLE1BQU1DLEtBQUtOLFlBQVlPLEtBQUksQ0FBRSxFQUFFLENBQUMsQ0FBRSxHQUFFO0FBQ2pJO01BQ0Y7QUFFQVAsa0JBQVlMLElBQUlFLEtBQUtDLFFBQVE7O0lBRy9CRyxJQUFJTCxTQUFTQyxLQUFLO0FBQ2hCLFVBQUlKLFdBQVdNLElBQUlILE9BQU8sR0FBRztBQUMzQixlQUFPSCxXQUFXUSxJQUFJTCxPQUFPLEVBQUVLLElBQUlKLEdBQUcsS0FBSztNQUM3QztBQUVBLGFBQU87O0lBR1RXLE9BQU9aLFNBQVNDLEtBQUs7QUFDbkIsVUFBSSxDQUFDSixXQUFXTSxJQUFJSCxPQUFPLEdBQUc7QUFDNUI7TUFDRjtBQUVBLFlBQU1JLGNBQWNQLFdBQVdRLElBQUlMLE9BQU87QUFFMUNJLGtCQUFZUyxPQUFPWixHQUFHO0FBR3RCLFVBQUlHLFlBQVlFLFNBQVMsR0FBRztBQUMxQlQsbUJBQVdnQixPQUFPYixPQUFPO01BQzNCO0lBQ0Y7RUFDRjtBQy9DQSxNQUFNYyxVQUFVO0FBQ2hCLE1BQU1DLDBCQUEwQjtBQUNoQyxNQUFNQyxpQkFBaUI7QUFPdkIsTUFBTUMsZ0JBQWdCQyxjQUFZO0FBQ2hDLFFBQUlBLFlBQVlDLE9BQU9DLE9BQU9ELE9BQU9DLElBQUlDLFFBQVE7QUFFL0NILGlCQUFXQSxTQUFTSSxRQUFRLGlCQUFpQixDQUFDQyxPQUFPQyxPQUFRLElBQUdKLElBQUlDLE9BQU9HLEVBQUUsQ0FBRSxFQUFDO0lBQ2xGO0FBRUEsV0FBT047RUFDVDtBQUdBLE1BQU1PLFNBQVNDLFlBQVU7QUFDdkIsUUFBSUEsV0FBVyxRQUFRQSxXQUFXQyxRQUFXO0FBQzNDLGFBQVEsR0FBRUQsTUFBTztJQUNuQjtBQUVBLFdBQU9FLE9BQU9DLFVBQVVDLFNBQVNDLEtBQUtMLE1BQU0sRUFBRUgsTUFBTSxhQUFhLEVBQUUsQ0FBQyxFQUFFUyxZQUFXO0VBQ25GO0FBTUEsTUFBTUMsU0FBU0MsWUFBVTtBQUN2QixPQUFHO0FBQ0RBLGdCQUFVQyxLQUFLQyxNQUFNRCxLQUFLRSxPQUFNLElBQUt2QixPQUFPO0lBQzlDLFNBQVN3QixTQUFTQyxlQUFlTCxNQUFNO0FBRXZDLFdBQU9BO0VBQ1Q7QUFFQSxNQUFNTSxtQ0FBbUN4QyxhQUFXO0FBQ2xELFFBQUksQ0FBQ0EsU0FBUztBQUNaLGFBQU87SUFDVDtBQUdBLFFBQUk7TUFBRXlDO01BQW9CQztJQUFnQixJQUFJdkIsT0FBT3dCLGlCQUFpQjNDLE9BQU87QUFFN0UsVUFBTTRDLDBCQUEwQkMsT0FBT0MsV0FBV0wsa0JBQWtCO0FBQ3BFLFVBQU1NLHVCQUF1QkYsT0FBT0MsV0FBV0osZUFBZTtBQUc5RCxRQUFJLENBQUNFLDJCQUEyQixDQUFDRyxzQkFBc0I7QUFDckQsYUFBTztJQUNUO0FBR0FOLHlCQUFxQkEsbUJBQW1CTyxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3BETixzQkFBa0JBLGdCQUFnQk0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUU5QyxZQUFRSCxPQUFPQyxXQUFXTCxrQkFBa0IsSUFBSUksT0FBT0MsV0FBV0osZUFBZSxLQUFLM0I7RUFDeEY7QUFFQSxNQUFNa0MsdUJBQXVCakQsYUFBVztBQUN0Q0EsWUFBUWtELGNBQWMsSUFBSUMsTUFBTW5DLGNBQWMsQ0FBQztFQUNqRDtBQUVBLE1BQU1vQyxhQUFZMUIsWUFBVTtBQUMxQixRQUFJLENBQUNBLFVBQVUsT0FBT0EsV0FBVyxVQUFVO0FBQ3pDLGFBQU87SUFDVDtBQUVBLFFBQUksT0FBT0EsT0FBTzJCLFdBQVcsYUFBYTtBQUN4QzNCLGVBQVNBLE9BQU8sQ0FBQztJQUNuQjtBQUVBLFdBQU8sT0FBT0EsT0FBTzRCLGFBQWE7RUFDcEM7QUFFQSxNQUFNQyxhQUFhN0IsWUFBVTtBQUUzQixRQUFJMEIsV0FBVTFCLE1BQU0sR0FBRztBQUNyQixhQUFPQSxPQUFPMkIsU0FBUzNCLE9BQU8sQ0FBQyxJQUFJQTtJQUNyQztBQUVBLFFBQUksT0FBT0EsV0FBVyxZQUFZQSxPQUFPOEIsU0FBUyxHQUFHO0FBQ25ELGFBQU9sQixTQUFTbUIsY0FBY3hDLGNBQWNTLE1BQU0sQ0FBQztJQUNyRDtBQUVBLFdBQU87RUFDVDtBQUVBLE1BQU1nQyxZQUFZMUQsYUFBVztBQUMzQixRQUFJLENBQUNvRCxXQUFVcEQsT0FBTyxLQUFLQSxRQUFRMkQsZUFBYyxFQUFHSCxXQUFXLEdBQUc7QUFDaEUsYUFBTztJQUNUO0FBRUEsVUFBTUksbUJBQW1CakIsaUJBQWlCM0MsT0FBTyxFQUFFNkQsaUJBQWlCLFlBQVksTUFBTTtBQUV0RixVQUFNQyxnQkFBZ0I5RCxRQUFRK0QsUUFBUSxxQkFBcUI7QUFFM0QsUUFBSSxDQUFDRCxlQUFlO0FBQ2xCLGFBQU9GO0lBQ1Q7QUFFQSxRQUFJRSxrQkFBa0I5RCxTQUFTO0FBQzdCLFlBQU1nRSxVQUFVaEUsUUFBUStELFFBQVEsU0FBUztBQUN6QyxVQUFJQyxXQUFXQSxRQUFRQyxlQUFlSCxlQUFlO0FBQ25ELGVBQU87TUFDVDtBQUVBLFVBQUlFLFlBQVksTUFBTTtBQUNwQixlQUFPO01BQ1Q7SUFDRjtBQUVBLFdBQU9KO0VBQ1Q7QUFFQSxNQUFNTSxhQUFhbEUsYUFBVztBQUM1QixRQUFJLENBQUNBLFdBQVdBLFFBQVFzRCxhQUFhYSxLQUFLQyxjQUFjO0FBQ3RELGFBQU87SUFDVDtBQUVBLFFBQUlwRSxRQUFRcUUsVUFBVUMsU0FBUyxVQUFVLEdBQUc7QUFDMUMsYUFBTztJQUNUO0FBRUEsUUFBSSxPQUFPdEUsUUFBUXVFLGFBQWEsYUFBYTtBQUMzQyxhQUFPdkUsUUFBUXVFO0lBQ2pCO0FBRUEsV0FBT3ZFLFFBQVF3RSxhQUFhLFVBQVUsS0FBS3hFLFFBQVF5RSxhQUFhLFVBQVUsTUFBTTtFQUNsRjtBQUVBLE1BQU1DLGlCQUFpQjFFLGFBQVc7QUFDaEMsUUFBSSxDQUFDc0MsU0FBU3FDLGdCQUFnQkMsY0FBYztBQUMxQyxhQUFPO0lBQ1Q7QUFHQSxRQUFJLE9BQU81RSxRQUFRNkUsZ0JBQWdCLFlBQVk7QUFDN0MsWUFBTUMsT0FBTzlFLFFBQVE2RSxZQUFXO0FBQ2hDLGFBQU9DLGdCQUFnQkMsYUFBYUQsT0FBTztJQUM3QztBQUVBLFFBQUk5RSxtQkFBbUIrRSxZQUFZO0FBQ2pDLGFBQU8vRTtJQUNUO0FBR0EsUUFBSSxDQUFDQSxRQUFRaUUsWUFBWTtBQUN2QixhQUFPO0lBQ1Q7QUFFQSxXQUFPUyxlQUFlMUUsUUFBUWlFLFVBQVU7RUFDMUM7QUFFQSxNQUFNZSxPQUFPQSxNQUFNO0VBQUE7QUFVbkIsTUFBTUMsU0FBU2pGLGFBQVc7QUFDeEJBLFlBQVFrRjtFQUNWO0FBRUEsTUFBTUMsWUFBWUEsTUFBTTtBQUN0QixRQUFJaEUsT0FBT2lFLFVBQVUsQ0FBQzlDLFNBQVMrQyxLQUFLYixhQUFhLG1CQUFtQixHQUFHO0FBQ3JFLGFBQU9yRCxPQUFPaUU7SUFDaEI7QUFFQSxXQUFPO0VBQ1Q7QUFFQSxNQUFNRSw0QkFBNEIsQ0FBQTtBQUVsQyxNQUFNQyxxQkFBcUJDLGNBQVk7QUFDckMsUUFBSWxELFNBQVNtRCxlQUFlLFdBQVc7QUFFckMsVUFBSSxDQUFDSCwwQkFBMEI5QixRQUFRO0FBQ3JDbEIsaUJBQVNvRCxpQkFBaUIsb0JBQW9CLE1BQU07QUFDbEQscUJBQVdGLGFBQVlGLDJCQUEyQjtBQUNoREUsWUFBQUEsVUFBUTtVQUNWO1FBQ0YsQ0FBQztNQUNIO0FBRUFGLGdDQUEwQkssS0FBS0gsUUFBUTtJQUN6QyxPQUFPO0FBQ0xBLGVBQVE7SUFDVjtFQUNGO0FBRUEsTUFBTUksUUFBUUEsTUFBTXRELFNBQVNxQyxnQkFBZ0JrQixRQUFRO0FBRXJELE1BQU1DLHFCQUFxQkMsWUFBVTtBQUNuQ1IsdUJBQW1CLE1BQU07QUFDdkIsWUFBTVMsS0FBSWIsVUFBUztBQUVuQixVQUFJYSxJQUFHO0FBQ0wsY0FBTUMsT0FBT0YsT0FBT0c7QUFDcEIsY0FBTUMscUJBQXFCSCxHQUFFSSxHQUFHSCxJQUFJO0FBQ3BDRCxRQUFBQSxHQUFFSSxHQUFHSCxJQUFJLElBQUlGLE9BQU9NO0FBQ3BCTCxRQUFBQSxHQUFFSSxHQUFHSCxJQUFJLEVBQUVLLGNBQWNQO0FBQ3pCQyxRQUFBQSxHQUFFSSxHQUFHSCxJQUFJLEVBQUVNLGFBQWEsTUFBTTtBQUM1QlAsVUFBQUEsR0FBRUksR0FBR0gsSUFBSSxJQUFJRTtBQUNiLGlCQUFPSixPQUFPTTs7TUFFbEI7SUFDRixDQUFDO0VBQ0g7QUFFQSxNQUFNRyxVQUFVQSxDQUFDQyxrQkFBa0JDLE9BQU8sQ0FBQSxHQUFJQyxlQUFlRixxQkFBcUI7QUFDaEYsV0FBTyxPQUFPQSxxQkFBcUIsYUFBYUEsaUJBQWlCLEdBQUdDLElBQUksSUFBSUM7RUFDOUU7QUFFQSxNQUFNQyx5QkFBeUJBLENBQUNwQixVQUFVcUIsbUJBQW1CQyxvQkFBb0IsU0FBUztBQUN4RixRQUFJLENBQUNBLG1CQUFtQjtBQUN0Qk4sY0FBUWhCLFFBQVE7QUFDaEI7SUFDRjtBQUVBLFVBQU11QixrQkFBa0I7QUFDeEIsVUFBTUMsbUJBQW1CeEUsaUNBQWlDcUUsaUJBQWlCLElBQUlFO0FBRS9FLFFBQUlFLFNBQVM7QUFFYixVQUFNQyxVQUFVQSxDQUFDO01BQUVDO0lBQU8sTUFBTTtBQUM5QixVQUFJQSxXQUFXTixtQkFBbUI7QUFDaEM7TUFDRjtBQUVBSSxlQUFTO0FBQ1RKLHdCQUFrQk8sb0JBQW9CcEcsZ0JBQWdCa0csT0FBTztBQUM3RFYsY0FBUWhCLFFBQVE7O0FBR2xCcUIsc0JBQWtCbkIsaUJBQWlCMUUsZ0JBQWdCa0csT0FBTztBQUMxREcsZUFBVyxNQUFNO0FBQ2YsVUFBSSxDQUFDSixRQUFRO0FBQ1hoRSw2QkFBcUI0RCxpQkFBaUI7TUFDeEM7T0FDQ0csZ0JBQWdCO0VBQ3JCO0FBV0EsTUFBTU0sdUJBQXVCQSxDQUFDQyxNQUFNQyxlQUFlQyxlQUFlQyxtQkFBbUI7QUFDbkYsVUFBTUMsYUFBYUosS0FBSy9EO0FBQ3hCLFFBQUlvRSxRQUFRTCxLQUFLTSxRQUFRTCxhQUFhO0FBSXRDLFFBQUlJLFVBQVUsSUFBSTtBQUNoQixhQUFPLENBQUNILGlCQUFpQkMsaUJBQWlCSCxLQUFLSSxhQUFhLENBQUMsSUFBSUosS0FBSyxDQUFDO0lBQ3pFO0FBRUFLLGFBQVNILGdCQUFnQixJQUFJO0FBRTdCLFFBQUlDLGdCQUFnQjtBQUNsQkUsZUFBU0EsUUFBUUQsY0FBY0E7SUFDakM7QUFFQSxXQUFPSixLQUFLcEYsS0FBSzJGLElBQUksR0FBRzNGLEtBQUs0RixJQUFJSCxPQUFPRCxhQUFhLENBQUMsQ0FBQyxDQUFDO0VBQzFEO0FDOVFBLE1BQU1LLGlCQUFpQjtBQUN2QixNQUFNQyxpQkFBaUI7QUFDdkIsTUFBTUMsZ0JBQWdCO0FBQ3RCLE1BQU1DLGdCQUFnQixDQUFBO0FBQ3RCLE1BQUlDLFdBQVc7QUFDZixNQUFNQyxlQUFlO0lBQ25CQyxZQUFZO0lBQ1pDLFlBQVk7RUFDZDtBQUVBLE1BQU1DLGVBQWUsb0JBQUlDLElBQUksQ0FDM0IsU0FDQSxZQUNBLFdBQ0EsYUFDQSxlQUNBLGNBQ0Esa0JBQ0EsYUFDQSxZQUNBLGFBQ0EsZUFDQSxhQUNBLFdBQ0EsWUFDQSxTQUNBLHFCQUNBLGNBQ0EsYUFDQSxZQUNBLGVBQ0EsZUFDQSxlQUNBLGFBQ0EsZ0JBQ0EsaUJBQ0EsZ0JBQ0EsaUJBQ0EsY0FDQSxTQUNBLFFBQ0EsVUFDQSxTQUNBLFVBQ0EsVUFDQSxXQUNBLFlBQ0EsUUFDQSxVQUNBLGdCQUNBLFVBQ0EsUUFDQSxvQkFDQSxvQkFDQSxTQUNBLFNBQ0EsUUFBUSxDQUNUO0FBTUQsV0FBU0MsYUFBYTFJLFNBQVMySSxLQUFLO0FBQ2xDLFdBQVFBLE9BQVEsR0FBRUEsR0FBSSxLQUFJUCxVQUFXLE1BQU1wSSxRQUFRb0ksWUFBWUE7RUFDakU7QUFFQSxXQUFTUSxpQkFBaUI1SSxTQUFTO0FBQ2pDLFVBQU0ySSxNQUFNRCxhQUFhMUksT0FBTztBQUVoQ0EsWUFBUW9JLFdBQVdPO0FBQ25CUixrQkFBY1EsR0FBRyxJQUFJUixjQUFjUSxHQUFHLEtBQUssQ0FBQTtBQUUzQyxXQUFPUixjQUFjUSxHQUFHO0VBQzFCO0FBRUEsV0FBU0UsaUJBQWlCN0ksU0FBU29HLEtBQUk7QUFDckMsV0FBTyxTQUFTYyxRQUFRNEIsT0FBTztBQUM3QkMsaUJBQVdELE9BQU87UUFBRUUsZ0JBQWdCaEo7TUFBUSxDQUFDO0FBRTdDLFVBQUlrSCxRQUFRK0IsUUFBUTtBQUNsQkMscUJBQWFDLElBQUluSixTQUFTOEksTUFBTU0sTUFBTWhELEdBQUU7TUFDMUM7QUFFQSxhQUFPQSxJQUFHaUQsTUFBTXJKLFNBQVMsQ0FBQzhJLEtBQUssQ0FBQzs7RUFFcEM7QUFFQSxXQUFTUSwyQkFBMkJ0SixTQUFTa0IsVUFBVWtGLEtBQUk7QUFDekQsV0FBTyxTQUFTYyxRQUFRNEIsT0FBTztBQUM3QixZQUFNUyxjQUFjdkosUUFBUXdKLGlCQUFpQnRJLFFBQVE7QUFFckQsZUFBUztRQUFFaUc7TUFBTyxJQUFJMkIsT0FBTzNCLFVBQVVBLFdBQVcsTUFBTUEsU0FBU0EsT0FBT2xELFlBQVk7QUFDbEYsbUJBQVd3RixjQUFjRixhQUFhO0FBQ3BDLGNBQUlFLGVBQWV0QyxRQUFRO0FBQ3pCO1VBQ0Y7QUFFQTRCLHFCQUFXRCxPQUFPO1lBQUVFLGdCQUFnQjdCO1VBQU8sQ0FBQztBQUU1QyxjQUFJRCxRQUFRK0IsUUFBUTtBQUNsQkMseUJBQWFDLElBQUluSixTQUFTOEksTUFBTU0sTUFBTWxJLFVBQVVrRixHQUFFO1VBQ3BEO0FBRUEsaUJBQU9BLElBQUdpRCxNQUFNbEMsUUFBUSxDQUFDMkIsS0FBSyxDQUFDO1FBQ2pDO01BQ0Y7O0VBRUo7QUFFQSxXQUFTWSxZQUFZQyxRQUFRQyxVQUFVQyxxQkFBcUIsTUFBTTtBQUNoRSxXQUFPakksT0FBT2tJLE9BQU9ILE1BQU0sRUFDeEJJLEtBQUtqQixXQUFTQSxNQUFNYyxhQUFhQSxZQUFZZCxNQUFNZSx1QkFBdUJBLGtCQUFrQjtFQUNqRztBQUVBLFdBQVNHLG9CQUFvQkMsbUJBQW1CL0MsU0FBU2dELG9CQUFvQjtBQUMzRSxVQUFNQyxjQUFjLE9BQU9qRCxZQUFZO0FBRXZDLFVBQU0wQyxXQUFXTyxjQUFjRCxxQkFBc0JoRCxXQUFXZ0Q7QUFDaEUsUUFBSUUsWUFBWUMsYUFBYUosaUJBQWlCO0FBRTlDLFFBQUksQ0FBQ3pCLGFBQWFySSxJQUFJaUssU0FBUyxHQUFHO0FBQ2hDQSxrQkFBWUg7SUFDZDtBQUVBLFdBQU8sQ0FBQ0UsYUFBYVAsVUFBVVEsU0FBUztFQUMxQztBQUVBLFdBQVNFLFdBQVd0SyxTQUFTaUssbUJBQW1CL0MsU0FBU2dELG9CQUFvQmpCLFFBQVE7QUFDbkYsUUFBSSxPQUFPZ0Isc0JBQXNCLFlBQVksQ0FBQ2pLLFNBQVM7QUFDckQ7SUFDRjtBQUVBLFFBQUksQ0FBQ21LLGFBQWFQLFVBQVVRLFNBQVMsSUFBSUosb0JBQW9CQyxtQkFBbUIvQyxTQUFTZ0Qsa0JBQWtCO0FBSTNHLFFBQUlELHFCQUFxQjVCLGNBQWM7QUFDckMsWUFBTWtDLGVBQWVuRSxDQUFBQSxRQUFNO0FBQ3pCLGVBQU8sU0FBVTBDLE9BQU87QUFDdEIsY0FBSSxDQUFDQSxNQUFNMEIsaUJBQWtCMUIsTUFBTTBCLGtCQUFrQjFCLE1BQU1FLGtCQUFrQixDQUFDRixNQUFNRSxlQUFlMUUsU0FBU3dFLE1BQU0wQixhQUFhLEdBQUk7QUFDakksbUJBQU9wRSxJQUFHckUsS0FBSyxNQUFNK0csS0FBSztVQUM1Qjs7O0FBSUpjLGlCQUFXVyxhQUFhWCxRQUFRO0lBQ2xDO0FBRUEsVUFBTUQsU0FBU2YsaUJBQWlCNUksT0FBTztBQUN2QyxVQUFNeUssV0FBV2QsT0FBT1MsU0FBUyxNQUFNVCxPQUFPUyxTQUFTLElBQUksQ0FBQTtBQUMzRCxVQUFNTSxtQkFBbUJoQixZQUFZZSxVQUFVYixVQUFVTyxjQUFjakQsVUFBVSxJQUFJO0FBRXJGLFFBQUl3RCxrQkFBa0I7QUFDcEJBLHVCQUFpQnpCLFNBQVN5QixpQkFBaUJ6QixVQUFVQTtBQUVyRDtJQUNGO0FBRUEsVUFBTU4sTUFBTUQsYUFBYWtCLFVBQVVLLGtCQUFrQjNJLFFBQVEwRyxnQkFBZ0IsRUFBRSxDQUFDO0FBQ2hGLFVBQU01QixNQUFLK0QsY0FDVGIsMkJBQTJCdEosU0FBU2tILFNBQVMwQyxRQUFRLElBQ3JEZixpQkFBaUI3SSxTQUFTNEosUUFBUTtBQUVwQ3hELElBQUFBLElBQUd5RCxxQkFBcUJNLGNBQWNqRCxVQUFVO0FBQ2hEZCxJQUFBQSxJQUFHd0QsV0FBV0E7QUFDZHhELElBQUFBLElBQUc2QyxTQUFTQTtBQUNaN0MsSUFBQUEsSUFBR2dDLFdBQVdPO0FBQ2Q4QixhQUFTOUIsR0FBRyxJQUFJdkM7QUFFaEJwRyxZQUFRMEYsaUJBQWlCMEUsV0FBV2hFLEtBQUkrRCxXQUFXO0VBQ3JEO0FBRUEsV0FBU1EsY0FBYzNLLFNBQVMySixRQUFRUyxXQUFXbEQsU0FBUzJDLG9CQUFvQjtBQUM5RSxVQUFNekQsTUFBS3NELFlBQVlDLE9BQU9TLFNBQVMsR0FBR2xELFNBQVMyQyxrQkFBa0I7QUFFckUsUUFBSSxDQUFDekQsS0FBSTtBQUNQO0lBQ0Y7QUFFQXBHLFlBQVFvSCxvQkFBb0JnRCxXQUFXaEUsS0FBSXdFLFFBQVFmLGtCQUFrQixDQUFDO0FBQ3RFLFdBQU9GLE9BQU9TLFNBQVMsRUFBRWhFLElBQUdnQyxRQUFRO0VBQ3RDO0FBRUEsV0FBU3lDLHlCQUF5QjdLLFNBQVMySixRQUFRUyxXQUFXVSxXQUFXO0FBQ3ZFLFVBQU1DLG9CQUFvQnBCLE9BQU9TLFNBQVMsS0FBSyxDQUFBO0FBRS9DLGVBQVcsQ0FBQ1ksWUFBWWxDLEtBQUssS0FBS2xILE9BQU9xSixRQUFRRixpQkFBaUIsR0FBRztBQUNuRSxVQUFJQyxXQUFXRSxTQUFTSixTQUFTLEdBQUc7QUFDbENILHNCQUFjM0ssU0FBUzJKLFFBQVFTLFdBQVd0QixNQUFNYyxVQUFVZCxNQUFNZSxrQkFBa0I7TUFDcEY7SUFDRjtFQUNGO0FBRUEsV0FBU1EsYUFBYXZCLE9BQU87QUFFM0JBLFlBQVFBLE1BQU14SCxRQUFRMkcsZ0JBQWdCLEVBQUU7QUFDeEMsV0FBT0ksYUFBYVMsS0FBSyxLQUFLQTtFQUNoQztBQUVBLE1BQU1JLGVBQWU7SUFDbkJpQyxHQUFHbkwsU0FBUzhJLE9BQU81QixTQUFTZ0Qsb0JBQW9CO0FBQzlDSSxpQkFBV3RLLFNBQVM4SSxPQUFPNUIsU0FBU2dELG9CQUFvQixLQUFLOztJQUcvRGtCLElBQUlwTCxTQUFTOEksT0FBTzVCLFNBQVNnRCxvQkFBb0I7QUFDL0NJLGlCQUFXdEssU0FBUzhJLE9BQU81QixTQUFTZ0Qsb0JBQW9CLElBQUk7O0lBRzlEZixJQUFJbkosU0FBU2lLLG1CQUFtQi9DLFNBQVNnRCxvQkFBb0I7QUFDM0QsVUFBSSxPQUFPRCxzQkFBc0IsWUFBWSxDQUFDakssU0FBUztBQUNyRDtNQUNGO0FBRUEsWUFBTSxDQUFDbUssYUFBYVAsVUFBVVEsU0FBUyxJQUFJSixvQkFBb0JDLG1CQUFtQi9DLFNBQVNnRCxrQkFBa0I7QUFDN0csWUFBTW1CLGNBQWNqQixjQUFjSDtBQUNsQyxZQUFNTixTQUFTZixpQkFBaUI1SSxPQUFPO0FBQ3ZDLFlBQU0rSyxvQkFBb0JwQixPQUFPUyxTQUFTLEtBQUssQ0FBQTtBQUMvQyxZQUFNa0IsY0FBY3JCLGtCQUFrQnNCLFdBQVcsR0FBRztBQUVwRCxVQUFJLE9BQU8zQixhQUFhLGFBQWE7QUFFbkMsWUFBSSxDQUFDaEksT0FBT2pCLEtBQUtvSyxpQkFBaUIsRUFBRXZILFFBQVE7QUFDMUM7UUFDRjtBQUVBbUgsc0JBQWMzSyxTQUFTMkosUUFBUVMsV0FBV1IsVUFBVU8sY0FBY2pELFVBQVUsSUFBSTtBQUNoRjtNQUNGO0FBRUEsVUFBSW9FLGFBQWE7QUFDZixtQkFBV0UsZ0JBQWdCNUosT0FBT2pCLEtBQUtnSixNQUFNLEdBQUc7QUFDOUNrQixtQ0FBeUI3SyxTQUFTMkosUUFBUTZCLGNBQWN2QixrQkFBa0J3QixNQUFNLENBQUMsQ0FBQztRQUNwRjtNQUNGO0FBRUEsaUJBQVcsQ0FBQ0MsYUFBYTVDLEtBQUssS0FBS2xILE9BQU9xSixRQUFRRixpQkFBaUIsR0FBRztBQUNwRSxjQUFNQyxhQUFhVSxZQUFZcEssUUFBUTRHLGVBQWUsRUFBRTtBQUV4RCxZQUFJLENBQUNtRCxlQUFlcEIsa0JBQWtCaUIsU0FBU0YsVUFBVSxHQUFHO0FBQzFETCx3QkFBYzNLLFNBQVMySixRQUFRUyxXQUFXdEIsTUFBTWMsVUFBVWQsTUFBTWUsa0JBQWtCO1FBQ3BGO01BQ0Y7O0lBR0Y4QixRQUFRM0wsU0FBUzhJLE9BQU9wQyxNQUFNO0FBQzVCLFVBQUksT0FBT29DLFVBQVUsWUFBWSxDQUFDOUksU0FBUztBQUN6QyxlQUFPO01BQ1Q7QUFFQSxZQUFNZ0csS0FBSWIsVUFBUztBQUNuQixZQUFNaUYsWUFBWUMsYUFBYXZCLEtBQUs7QUFDcEMsWUFBTXVDLGNBQWN2QyxVQUFVc0I7QUFFOUIsVUFBSXdCLGNBQWM7QUFDbEIsVUFBSUMsVUFBVTtBQUNkLFVBQUlDLGlCQUFpQjtBQUNyQixVQUFJQyxtQkFBbUI7QUFFdkIsVUFBSVYsZUFBZXJGLElBQUc7QUFDcEI0RixzQkFBYzVGLEdBQUU3QyxNQUFNMkYsT0FBT3BDLElBQUk7QUFFakNWLFFBQUFBLEdBQUVoRyxPQUFPLEVBQUUyTCxRQUFRQyxXQUFXO0FBQzlCQyxrQkFBVSxDQUFDRCxZQUFZSSxxQkFBb0I7QUFDM0NGLHlCQUFpQixDQUFDRixZQUFZSyw4QkFBNkI7QUFDM0RGLDJCQUFtQkgsWUFBWU0sbUJBQWtCO01BQ25EO0FBRUEsWUFBTUMsTUFBTXBELFdBQVcsSUFBSTVGLE1BQU0yRixPQUFPO1FBQUUrQztRQUFTTyxZQUFZO09BQU0sR0FBRzFGLElBQUk7QUFFNUUsVUFBSXFGLGtCQUFrQjtBQUNwQkksWUFBSUUsZUFBYztNQUNwQjtBQUVBLFVBQUlQLGdCQUFnQjtBQUNsQjlMLGdCQUFRa0QsY0FBY2lKLEdBQUc7TUFDM0I7QUFFQSxVQUFJQSxJQUFJSixvQkFBb0JILGFBQWE7QUFDdkNBLG9CQUFZUyxlQUFjO01BQzVCO0FBRUEsYUFBT0Y7SUFDVDtFQUNGO0FBRUEsV0FBU3BELFdBQVd1RCxLQUFLQyxPQUFPLENBQUEsR0FBSTtBQUNsQyxlQUFXLENBQUN0TSxLQUFLdU0sS0FBSyxLQUFLNUssT0FBT3FKLFFBQVFzQixJQUFJLEdBQUc7QUFDL0MsVUFBSTtBQUNGRCxZQUFJck0sR0FBRyxJQUFJdU07ZUFDWEMsU0FBTTtBQUNON0ssZUFBTzhLLGVBQWVKLEtBQUtyTSxLQUFLO1VBQzlCME0sY0FBYztVQUNkdE0sTUFBTTtBQUNKLG1CQUFPbU07VUFDVDtRQUNGLENBQUM7TUFDSDtJQUNGO0FBRUEsV0FBT0Y7RUFDVDtBQ25UQSxXQUFTTSxjQUFjSixPQUFPO0FBQzVCLFFBQUlBLFVBQVUsUUFBUTtBQUNwQixhQUFPO0lBQ1Q7QUFFQSxRQUFJQSxVQUFVLFNBQVM7QUFDckIsYUFBTztJQUNUO0FBRUEsUUFBSUEsVUFBVTNKLE9BQU8ySixLQUFLLEVBQUUxSyxTQUFRLEdBQUk7QUFDdEMsYUFBT2UsT0FBTzJKLEtBQUs7SUFDckI7QUFFQSxRQUFJQSxVQUFVLE1BQU1BLFVBQVUsUUFBUTtBQUNwQyxhQUFPO0lBQ1Q7QUFFQSxRQUFJLE9BQU9BLFVBQVUsVUFBVTtBQUM3QixhQUFPQTtJQUNUO0FBRUEsUUFBSTtBQUNGLGFBQU9LLEtBQUtDLE1BQU1DLG1CQUFtQlAsS0FBSyxDQUFDO2FBQzNDQyxTQUFNO0FBQ04sYUFBT0Q7SUFDVDtFQUNGO0FBRUEsV0FBU1EsaUJBQWlCL00sS0FBSztBQUM3QixXQUFPQSxJQUFJcUIsUUFBUSxVQUFVMkwsU0FBUSxJQUFHQSxJQUFJakwsWUFBVyxDQUFHLEVBQUM7RUFDN0Q7QUFFQSxNQUFNa0wsY0FBYztJQUNsQkMsaUJBQWlCbk4sU0FBU0MsS0FBS3VNLE9BQU87QUFDcEN4TSxjQUFRb04sYUFBYyxXQUFVSixpQkFBaUIvTSxHQUFHLENBQUUsSUFBR3VNLEtBQUs7O0lBR2hFYSxvQkFBb0JyTixTQUFTQyxLQUFLO0FBQ2hDRCxjQUFRc04sZ0JBQWlCLFdBQVVOLGlCQUFpQi9NLEdBQUcsQ0FBRSxFQUFDOztJQUc1RHNOLGtCQUFrQnZOLFNBQVM7QUFDekIsVUFBSSxDQUFDQSxTQUFTO0FBQ1osZUFBTyxDQUFBO01BQ1Q7QUFFQSxZQUFNd04sYUFBYSxDQUFBO0FBQ25CLFlBQU1DLFNBQVM3TCxPQUFPakIsS0FBS1gsUUFBUTBOLE9BQU8sRUFBRUMsT0FBTzFOLFNBQU9BLElBQUlzTCxXQUFXLElBQUksS0FBSyxDQUFDdEwsSUFBSXNMLFdBQVcsVUFBVSxDQUFDO0FBRTdHLGlCQUFXdEwsT0FBT3dOLFFBQVE7QUFDeEIsWUFBSUcsVUFBVTNOLElBQUlxQixRQUFRLE9BQU8sRUFBRTtBQUNuQ3NNLGtCQUFVQSxRQUFRQyxPQUFPLENBQUMsRUFBRTdMLFlBQVcsSUFBSzRMLFFBQVFuQyxNQUFNLEdBQUdtQyxRQUFRcEssTUFBTTtBQUMzRWdLLG1CQUFXSSxPQUFPLElBQUloQixjQUFjNU0sUUFBUTBOLFFBQVF6TixHQUFHLENBQUM7TUFDMUQ7QUFFQSxhQUFPdU47O0lBR1RNLGlCQUFpQjlOLFNBQVNDLEtBQUs7QUFDN0IsYUFBTzJNLGNBQWM1TSxRQUFReUUsYUFBYyxXQUFVdUksaUJBQWlCL00sR0FBRyxDQUFFLEVBQUMsQ0FBQztJQUMvRTtFQUNGO0FDdERBLE1BQU04TixTQUFOLE1BQWE7O0lBRVgsV0FBV0MsVUFBVTtBQUNuQixhQUFPLENBQUE7SUFDVDtJQUVBLFdBQVdDLGNBQWM7QUFDdkIsYUFBTyxDQUFBO0lBQ1Q7SUFFQSxXQUFXL0gsT0FBTztBQUNoQixZQUFNLElBQUlnSSxNQUFNLHFFQUFxRTtJQUN2RjtJQUVBQyxXQUFXQyxRQUFRO0FBQ2pCQSxlQUFTLEtBQUtDLGdCQUFnQkQsTUFBTTtBQUNwQ0EsZUFBUyxLQUFLRSxrQkFBa0JGLE1BQU07QUFDdEMsV0FBS0csaUJBQWlCSCxNQUFNO0FBQzVCLGFBQU9BO0lBQ1Q7SUFFQUUsa0JBQWtCRixRQUFRO0FBQ3hCLGFBQU9BO0lBQ1Q7SUFFQUMsZ0JBQWdCRCxRQUFRcE8sU0FBUztBQUMvQixZQUFNd08sYUFBYXBMLFdBQVVwRCxPQUFPLElBQUlrTixZQUFZWSxpQkFBaUI5TixTQUFTLFFBQVEsSUFBSSxDQUFBO0FBRTFGLGFBQU8sZ0VBQ0YsS0FBS3lPLFlBQVlULFVBQ2hCLE9BQU9RLGVBQWUsV0FBV0EsYUFBYSxDQUFBLElBQzlDcEwsV0FBVXBELE9BQU8sSUFBSWtOLFlBQVlLLGtCQUFrQnZOLE9BQU8sSUFBSSxDQUFBLElBQzlELE9BQU9vTyxXQUFXLFdBQVdBLFNBQVMsQ0FBQTtJQUU5QztJQUVBRyxpQkFBaUJILFFBQVFNLGNBQWMsS0FBS0QsWUFBWVIsYUFBYTtBQUNuRSxpQkFBVyxDQUFDVSxVQUFVQyxhQUFhLEtBQUtoTixPQUFPcUosUUFBUXlELFdBQVcsR0FBRztBQUNuRSxjQUFNbEMsUUFBUTRCLE9BQU9PLFFBQVE7QUFDN0IsY0FBTUUsWUFBWXpMLFdBQVVvSixLQUFLLElBQUksWUFBWS9LLE9BQU8rSyxLQUFLO0FBRTdELFlBQUksQ0FBQyxJQUFJc0MsT0FBT0YsYUFBYSxFQUFFRyxLQUFLRixTQUFTLEdBQUc7QUFDOUMsZ0JBQU0sSUFBSUcsVUFDUCxHQUFFLEtBQUtQLFlBQVl2SSxLQUFLK0ksWUFBVyxDQUFHLGFBQVlOLFFBQVMsb0JBQW1CRSxTQUFVLHdCQUF1QkQsYUFBYyxJQUNoSTtRQUNGO01BQ0Y7SUFDRjtFQUNGO0FDOUNBLE1BQU1NLFVBQVU7QUFNaEIsTUFBTUMsZ0JBQU4sY0FBNEJwQixPQUFPO0lBQ2pDVSxZQUFZek8sU0FBU29PLFFBQVE7QUFDM0IsWUFBSztBQUVMcE8sZ0JBQVV1RCxXQUFXdkQsT0FBTztBQUM1QixVQUFJLENBQUNBLFNBQVM7QUFDWjtNQUNGO0FBRUEsV0FBS29QLFdBQVdwUDtBQUNoQixXQUFLcVAsVUFBVSxLQUFLbEIsV0FBV0MsTUFBTTtBQUVyQ2tCLFdBQUt2UCxJQUFJLEtBQUtxUCxVQUFVLEtBQUtYLFlBQVljLFVBQVUsSUFBSTtJQUN6RDs7SUFHQUMsVUFBVTtBQUNSRixXQUFLMU8sT0FBTyxLQUFLd08sVUFBVSxLQUFLWCxZQUFZYyxRQUFRO0FBQ3BEckcsbUJBQWFDLElBQUksS0FBS2lHLFVBQVUsS0FBS1gsWUFBWWdCLFNBQVM7QUFFMUQsaUJBQVdDLGdCQUFnQjlOLE9BQU8rTixvQkFBb0IsSUFBSSxHQUFHO0FBQzNELGFBQUtELFlBQVksSUFBSTtNQUN2QjtJQUNGO0lBRUFFLGVBQWVwSyxVQUFVeEYsU0FBUzZQLGFBQWEsTUFBTTtBQUNuRGpKLDZCQUF1QnBCLFVBQVV4RixTQUFTNlAsVUFBVTtJQUN0RDtJQUVBMUIsV0FBV0MsUUFBUTtBQUNqQkEsZUFBUyxLQUFLQyxnQkFBZ0JELFFBQVEsS0FBS2dCLFFBQVE7QUFDbkRoQixlQUFTLEtBQUtFLGtCQUFrQkYsTUFBTTtBQUN0QyxXQUFLRyxpQkFBaUJILE1BQU07QUFDNUIsYUFBT0E7SUFDVDs7SUFHQSxPQUFPMEIsWUFBWTlQLFNBQVM7QUFDMUIsYUFBT3NQLEtBQUtqUCxJQUFJa0QsV0FBV3ZELE9BQU8sR0FBRyxLQUFLdVAsUUFBUTtJQUNwRDtJQUVBLE9BQU9RLG9CQUFvQi9QLFNBQVNvTyxTQUFTLENBQUEsR0FBSTtBQUMvQyxhQUFPLEtBQUswQixZQUFZOVAsT0FBTyxLQUFLLElBQUksS0FBS0EsU0FBUyxPQUFPb08sV0FBVyxXQUFXQSxTQUFTLElBQUk7SUFDbEc7SUFFQSxXQUFXYyxVQUFVO0FBQ25CLGFBQU9BO0lBQ1Q7SUFFQSxXQUFXSyxXQUFXO0FBQ3BCLGFBQVEsTUFBSyxLQUFLckosSUFBSztJQUN6QjtJQUVBLFdBQVd1SixZQUFZO0FBQ3JCLGFBQVEsSUFBRyxLQUFLRixRQUFTO0lBQzNCO0lBRUEsT0FBT1MsVUFBVS9KLE1BQU07QUFDckIsYUFBUSxHQUFFQSxJQUFLLEdBQUUsS0FBS3dKLFNBQVU7SUFDbEM7RUFDRjtBQ3pFQSxNQUFNUSxjQUFjalEsYUFBVztBQUM3QixRQUFJa0IsV0FBV2xCLFFBQVF5RSxhQUFhLGdCQUFnQjtBQUVwRCxRQUFJLENBQUN2RCxZQUFZQSxhQUFhLEtBQUs7QUFDakMsVUFBSWdQLGdCQUFnQmxRLFFBQVF5RSxhQUFhLE1BQU07QUFNL0MsVUFBSSxDQUFDeUwsaUJBQWtCLENBQUNBLGNBQWNoRixTQUFTLEdBQUcsS0FBSyxDQUFDZ0YsY0FBYzNFLFdBQVcsR0FBRyxHQUFJO0FBQ3RGLGVBQU87TUFDVDtBQUdBLFVBQUkyRSxjQUFjaEYsU0FBUyxHQUFHLEtBQUssQ0FBQ2dGLGNBQWMzRSxXQUFXLEdBQUcsR0FBRztBQUNqRTJFLHdCQUFpQixJQUFHQSxjQUFjbE4sTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFFO01BQ2xEO0FBRUE5QixpQkFBV2dQLGlCQUFpQkEsa0JBQWtCLE1BQU1BLGNBQWNDLEtBQUksSUFBSztJQUM3RTtBQUVBLFdBQU9qUCxXQUFXQSxTQUFTOEIsTUFBTSxHQUFHLEVBQUVvTixJQUFJQyxTQUFPcFAsY0FBY29QLEdBQUcsQ0FBQyxFQUFFQyxLQUFLLEdBQUcsSUFBSTtFQUNuRjtBQUVBLE1BQU1DLGlCQUFpQjtJQUNyQnhHLEtBQUs3SSxVQUFVbEIsVUFBVXNDLFNBQVNxQyxpQkFBaUI7QUFDakQsYUFBTyxDQUFBLEVBQUc2TCxPQUFPLEdBQUdDLFFBQVE1TyxVQUFVMkgsaUJBQWlCekgsS0FBSy9CLFNBQVNrQixRQUFRLENBQUM7O0lBR2hGd1AsUUFBUXhQLFVBQVVsQixVQUFVc0MsU0FBU3FDLGlCQUFpQjtBQUNwRCxhQUFPOEwsUUFBUTVPLFVBQVU0QixjQUFjMUIsS0FBSy9CLFNBQVNrQixRQUFROztJQUcvRHlQLFNBQVMzUSxTQUFTa0IsVUFBVTtBQUMxQixhQUFPLENBQUEsRUFBR3NQLE9BQU8sR0FBR3hRLFFBQVEyUSxRQUFRLEVBQUVoRCxPQUFPaUQsV0FBU0EsTUFBTUMsUUFBUTNQLFFBQVEsQ0FBQzs7SUFHL0U0UCxRQUFROVEsU0FBU2tCLFVBQVU7QUFDekIsWUFBTTRQLFVBQVUsQ0FBQTtBQUNoQixVQUFJQyxXQUFXL1EsUUFBUWlFLFdBQVdGLFFBQVE3QyxRQUFRO0FBRWxELGFBQU82UCxVQUFVO0FBQ2ZELGdCQUFRbkwsS0FBS29MLFFBQVE7QUFDckJBLG1CQUFXQSxTQUFTOU0sV0FBV0YsUUFBUTdDLFFBQVE7TUFDakQ7QUFFQSxhQUFPNFA7O0lBR1RFLEtBQUtoUixTQUFTa0IsVUFBVTtBQUN0QixVQUFJK1AsV0FBV2pSLFFBQVFrUjtBQUV2QixhQUFPRCxVQUFVO0FBQ2YsWUFBSUEsU0FBU0osUUFBUTNQLFFBQVEsR0FBRztBQUM5QixpQkFBTyxDQUFDK1AsUUFBUTtRQUNsQjtBQUVBQSxtQkFBV0EsU0FBU0M7TUFDdEI7QUFFQSxhQUFPLENBQUE7OztJQUdUQyxLQUFLblIsU0FBU2tCLFVBQVU7QUFDdEIsVUFBSWlRLE9BQU9uUixRQUFRb1I7QUFFbkIsYUFBT0QsTUFBTTtBQUNYLFlBQUlBLEtBQUtOLFFBQVEzUCxRQUFRLEdBQUc7QUFDMUIsaUJBQU8sQ0FBQ2lRLElBQUk7UUFDZDtBQUVBQSxlQUFPQSxLQUFLQztNQUNkO0FBRUEsYUFBTyxDQUFBOztJQUdUQyxrQkFBa0JyUixTQUFTO0FBQ3pCLFlBQU1zUixhQUFhLENBQ2pCLEtBQ0EsVUFDQSxTQUNBLFlBQ0EsVUFDQSxXQUNBLGNBQ0EsMEJBQTBCLEVBQzFCbEIsSUFBSWxQLGNBQWEsR0FBRUEsUUFBUyx1QkFBc0IsRUFBRW9QLEtBQUssR0FBRztBQUU5RCxhQUFPLEtBQUt2RyxLQUFLdUgsWUFBWXRSLE9BQU8sRUFBRTJOLE9BQU80RCxRQUFNLENBQUNyTixXQUFXcU4sRUFBRSxLQUFLN04sVUFBVTZOLEVBQUUsQ0FBQzs7SUFHckZDLHVCQUF1QnhSLFNBQVM7QUFDOUIsWUFBTWtCLFdBQVcrTyxZQUFZalEsT0FBTztBQUVwQyxVQUFJa0IsVUFBVTtBQUNaLGVBQU9xUCxlQUFlRyxRQUFReFAsUUFBUSxJQUFJQSxXQUFXO01BQ3ZEO0FBRUEsYUFBTzs7SUFHVHVRLHVCQUF1QnpSLFNBQVM7QUFDOUIsWUFBTWtCLFdBQVcrTyxZQUFZalEsT0FBTztBQUVwQyxhQUFPa0IsV0FBV3FQLGVBQWVHLFFBQVF4UCxRQUFRLElBQUk7O0lBR3ZEd1EsZ0NBQWdDMVIsU0FBUztBQUN2QyxZQUFNa0IsV0FBVytPLFlBQVlqUSxPQUFPO0FBRXBDLGFBQU9rQixXQUFXcVAsZUFBZXhHLEtBQUs3SSxRQUFRLElBQUksQ0FBQTtJQUNwRDtFQUNGO0FDaEhBLE1BQU15USx1QkFBdUJBLENBQUNDLFdBQVdDLFNBQVMsV0FBVztBQUMzRCxVQUFNQyxhQUFjLGdCQUFlRixVQUFVbkMsU0FBVTtBQUN2RCxVQUFNeEosT0FBTzJMLFVBQVUxTDtBQUV2QmdELGlCQUFhaUMsR0FBRzdJLFVBQVV3UCxZQUFhLHFCQUFvQjdMLElBQUssTUFBSyxTQUFVNkMsT0FBTztBQUNwRixVQUFJLENBQUMsS0FBSyxNQUFNLEVBQUVvQyxTQUFTLEtBQUs2RyxPQUFPLEdBQUc7QUFDeENqSixjQUFNdUQsZUFBYztNQUN0QjtBQUVBLFVBQUluSSxXQUFXLElBQUksR0FBRztBQUNwQjtNQUNGO0FBRUEsWUFBTWlELFNBQVNvSixlQUFla0IsdUJBQXVCLElBQUksS0FBSyxLQUFLMU4sUUFBUyxJQUFHa0MsSUFBSyxFQUFDO0FBQ3JGLFlBQU0vRixXQUFXMFIsVUFBVTdCLG9CQUFvQjVJLE1BQU07QUFHckRqSCxlQUFTMlIsTUFBTSxFQUFDO0lBQ2xCLENBQUM7RUFDSDtBQ2RBLE1BQU0zTCxTQUFPO0FBQ2IsTUFBTXFKLGFBQVc7QUFDakIsTUFBTUUsY0FBYSxJQUFHRixVQUFTO0FBRS9CLE1BQU15QyxjQUFlLFFBQU92QyxXQUFVO0FBQ3RDLE1BQU13QyxlQUFnQixTQUFReEMsV0FBVTtBQUN4QyxNQUFNeUMsb0JBQWtCO0FBQ3hCLE1BQU1DLG9CQUFrQjtBQU14QixNQUFNQyxRQUFOLE1BQU1BLGVBQWNqRCxjQUFjOztJQUVoQyxXQUFXakosT0FBTztBQUNoQixhQUFPQTtJQUNUOztJQUdBbU0sUUFBUTtBQUNOLFlBQU1DLGFBQWFwSixhQUFheUMsUUFBUSxLQUFLeUQsVUFBVTRDLFdBQVc7QUFFbEUsVUFBSU0sV0FBV3ZHLGtCQUFrQjtBQUMvQjtNQUNGO0FBRUEsV0FBS3FELFNBQVMvSyxVQUFVekQsT0FBT3VSLGlCQUFlO0FBRTlDLFlBQU10QyxhQUFhLEtBQUtULFNBQVMvSyxVQUFVQyxTQUFTNE4saUJBQWU7QUFDbkUsV0FBS3RDLGVBQWUsTUFBTSxLQUFLMkMsZ0JBQWUsR0FBSSxLQUFLbkQsVUFBVVMsVUFBVTtJQUM3RTs7SUFHQTBDLGtCQUFrQjtBQUNoQixXQUFLbkQsU0FBU3hPLE9BQU07QUFDcEJzSSxtQkFBYXlDLFFBQVEsS0FBS3lELFVBQVU2QyxZQUFZO0FBQ2hELFdBQUt6QyxRQUFPO0lBQ2Q7O0lBR0EsT0FBT25KLGdCQUFnQitILFFBQVE7QUFDN0IsYUFBTyxLQUFLb0UsS0FBSyxXQUFZO0FBQzNCLGNBQU1DLE9BQU9MLE9BQU1yQyxvQkFBb0IsSUFBSTtBQUUzQyxZQUFJLE9BQU8zQixXQUFXLFVBQVU7QUFDOUI7UUFDRjtBQUVBLFlBQUlxRSxLQUFLckUsTUFBTSxNQUFNek0sVUFBYXlNLE9BQU83QyxXQUFXLEdBQUcsS0FBSzZDLFdBQVcsZUFBZTtBQUNwRixnQkFBTSxJQUFJWSxVQUFXLG9CQUFtQlosTUFBTyxHQUFFO1FBQ25EO0FBRUFxRSxhQUFLckUsTUFBTSxFQUFFLElBQUk7TUFDbkIsQ0FBQztJQUNIO0VBQ0Y7QUFNQXVELHVCQUFxQlMsT0FBTyxPQUFPO0FBTW5DdE0scUJBQW1Cc00sS0FBSztBQ3JFeEIsTUFBTWxNLFNBQU87QUFDYixNQUFNcUosYUFBVztBQUNqQixNQUFNRSxjQUFhLElBQUdGLFVBQVM7QUFDL0IsTUFBTW1ELGlCQUFlO0FBRXJCLE1BQU1DLHNCQUFvQjtBQUMxQixNQUFNQyx5QkFBdUI7QUFDN0IsTUFBTUMseUJBQXdCLFFBQU9wRCxXQUFVLEdBQUVpRCxjQUFhO0FBTTlELE1BQU1JLFNBQU4sTUFBTUEsZ0JBQWUzRCxjQUFjOztJQUVqQyxXQUFXakosT0FBTztBQUNoQixhQUFPQTtJQUNUOztJQUdBNk0sU0FBUztBQUVQLFdBQUszRCxTQUFTaEMsYUFBYSxnQkFBZ0IsS0FBS2dDLFNBQVMvSyxVQUFVME8sT0FBT0osbUJBQWlCLENBQUM7SUFDOUY7O0lBR0EsT0FBT3RNLGdCQUFnQitILFFBQVE7QUFDN0IsYUFBTyxLQUFLb0UsS0FBSyxXQUFZO0FBQzNCLGNBQU1DLE9BQU9LLFFBQU8vQyxvQkFBb0IsSUFBSTtBQUU1QyxZQUFJM0IsV0FBVyxVQUFVO0FBQ3ZCcUUsZUFBS3JFLE1BQU0sRUFBQztRQUNkO01BQ0YsQ0FBQztJQUNIO0VBQ0Y7QUFNQWxGLGVBQWFpQyxHQUFHN0ksVUFBVXVRLHdCQUFzQkQsd0JBQXNCOUosV0FBUztBQUM3RUEsVUFBTXVELGVBQWM7QUFFcEIsVUFBTTJHLFNBQVNsSyxNQUFNM0IsT0FBT3BELFFBQVE2TyxzQkFBb0I7QUFDeEQsVUFBTUgsT0FBT0ssT0FBTy9DLG9CQUFvQmlELE1BQU07QUFFOUNQLFNBQUtNLE9BQU07RUFDYixDQUFDO0FBTURqTixxQkFBbUJnTixNQUFNO0FDdER6QixNQUFNNU0sU0FBTztBQUNiLE1BQU11SixjQUFZO0FBQ2xCLE1BQU13RCxtQkFBb0IsYUFBWXhELFdBQVU7QUFDaEQsTUFBTXlELGtCQUFtQixZQUFXekQsV0FBVTtBQUM5QyxNQUFNMEQsaUJBQWtCLFdBQVUxRCxXQUFVO0FBQzVDLE1BQU0yRCxvQkFBcUIsY0FBYTNELFdBQVU7QUFDbEQsTUFBTTRELGtCQUFtQixZQUFXNUQsV0FBVTtBQUM5QyxNQUFNNkQscUJBQXFCO0FBQzNCLE1BQU1DLG1CQUFtQjtBQUN6QixNQUFNQywyQkFBMkI7QUFDakMsTUFBTUMsa0JBQWtCO0FBRXhCLE1BQU16RixZQUFVO0lBQ2QwRixhQUFhO0lBQ2JDLGNBQWM7SUFDZEMsZUFBZTtFQUNqQjtBQUVBLE1BQU0zRixnQkFBYztJQUNsQnlGLGFBQWE7SUFDYkMsY0FBYztJQUNkQyxlQUFlO0VBQ2pCO0FBTUEsTUFBTUMsUUFBTixNQUFNQSxlQUFjOUYsT0FBTztJQUN6QlUsWUFBWXpPLFNBQVNvTyxRQUFRO0FBQzNCLFlBQUs7QUFDTCxXQUFLZ0IsV0FBV3BQO0FBRWhCLFVBQUksQ0FBQ0EsV0FBVyxDQUFDNlQsT0FBTUMsWUFBVyxHQUFJO0FBQ3BDO01BQ0Y7QUFFQSxXQUFLekUsVUFBVSxLQUFLbEIsV0FBV0MsTUFBTTtBQUNyQyxXQUFLMkYsVUFBVTtBQUNmLFdBQUtDLHdCQUF3QnBKLFFBQVF6SixPQUFPOFMsWUFBWTtBQUN4RCxXQUFLQyxZQUFXO0lBQ2xCOztJQUdBLFdBQVdsRyxVQUFVO0FBQ25CLGFBQU9BO0lBQ1Q7SUFFQSxXQUFXQyxjQUFjO0FBQ3ZCLGFBQU9BO0lBQ1Q7SUFFQSxXQUFXL0gsT0FBTztBQUNoQixhQUFPQTtJQUNUOztJQUdBc0osVUFBVTtBQUNSdEcsbUJBQWFDLElBQUksS0FBS2lHLFVBQVVLLFdBQVM7SUFDM0M7O0lBR0EwRSxPQUFPckwsT0FBTztBQUNaLFVBQUksQ0FBQyxLQUFLa0wsdUJBQXVCO0FBQy9CLGFBQUtELFVBQVVqTCxNQUFNc0wsUUFBUSxDQUFDLEVBQUVDO0FBRWhDO01BQ0Y7QUFFQSxVQUFJLEtBQUtDLHdCQUF3QnhMLEtBQUssR0FBRztBQUN2QyxhQUFLaUwsVUFBVWpMLE1BQU11TDtNQUN2QjtJQUNGO0lBRUFFLEtBQUt6TCxPQUFPO0FBQ1YsVUFBSSxLQUFLd0wsd0JBQXdCeEwsS0FBSyxHQUFHO0FBQ3ZDLGFBQUtpTCxVQUFVakwsTUFBTXVMLFVBQVUsS0FBS047TUFDdEM7QUFFQSxXQUFLUyxhQUFZO0FBQ2pCaE8sY0FBUSxLQUFLNkksUUFBUXFFLFdBQVc7SUFDbEM7SUFFQWUsTUFBTTNMLE9BQU87QUFDWCxXQUFLaUwsVUFBVWpMLE1BQU1zTCxXQUFXdEwsTUFBTXNMLFFBQVE1USxTQUFTLElBQ3JELElBQ0FzRixNQUFNc0wsUUFBUSxDQUFDLEVBQUVDLFVBQVUsS0FBS047SUFDcEM7SUFFQVMsZUFBZTtBQUNiLFlBQU1FLFlBQVl2UyxLQUFLd1MsSUFBSSxLQUFLWixPQUFPO0FBRXZDLFVBQUlXLGFBQWFqQixpQkFBaUI7QUFDaEM7TUFDRjtBQUVBLFlBQU1tQixZQUFZRixZQUFZLEtBQUtYO0FBRW5DLFdBQUtBLFVBQVU7QUFFZixVQUFJLENBQUNhLFdBQVc7QUFDZDtNQUNGO0FBRUFwTyxjQUFRb08sWUFBWSxJQUFJLEtBQUt2RixRQUFRdUUsZ0JBQWdCLEtBQUt2RSxRQUFRc0UsWUFBWTtJQUNoRjtJQUVBTyxjQUFjO0FBQ1osVUFBSSxLQUFLRix1QkFBdUI7QUFDOUI5SyxxQkFBYWlDLEdBQUcsS0FBS2lFLFVBQVVnRSxtQkFBbUJ0SyxXQUFTLEtBQUtxTCxPQUFPckwsS0FBSyxDQUFDO0FBQzdFSSxxQkFBYWlDLEdBQUcsS0FBS2lFLFVBQVVpRSxpQkFBaUJ2SyxXQUFTLEtBQUt5TCxLQUFLekwsS0FBSyxDQUFDO0FBRXpFLGFBQUtzRyxTQUFTL0ssVUFBVXdRLElBQUlyQix3QkFBd0I7TUFDdEQsT0FBTztBQUNMdEsscUJBQWFpQyxHQUFHLEtBQUtpRSxVQUFVNkQsa0JBQWtCbkssV0FBUyxLQUFLcUwsT0FBT3JMLEtBQUssQ0FBQztBQUM1RUkscUJBQWFpQyxHQUFHLEtBQUtpRSxVQUFVOEQsaUJBQWlCcEssV0FBUyxLQUFLMkwsTUFBTTNMLEtBQUssQ0FBQztBQUMxRUkscUJBQWFpQyxHQUFHLEtBQUtpRSxVQUFVK0QsZ0JBQWdCckssV0FBUyxLQUFLeUwsS0FBS3pMLEtBQUssQ0FBQztNQUMxRTtJQUNGO0lBRUF3TCx3QkFBd0J4TCxPQUFPO0FBQzdCLGFBQU8sS0FBS2tMLDBCQUEwQmxMLE1BQU1nTSxnQkFBZ0J2QixvQkFBb0J6SyxNQUFNZ00sZ0JBQWdCeEI7SUFDeEc7O0lBR0EsT0FBT1EsY0FBYztBQUNuQixhQUFPLGtCQUFrQnhSLFNBQVNxQyxtQkFBbUJvUSxVQUFVQyxpQkFBaUI7SUFDbEY7RUFDRjtBQ3RIQSxNQUFNOU8sU0FBTztBQUNiLE1BQU1xSixhQUFXO0FBQ2pCLE1BQU1FLGNBQWEsSUFBR0YsVUFBUztBQUMvQixNQUFNbUQsaUJBQWU7QUFFckIsTUFBTXVDLG1CQUFpQjtBQUN2QixNQUFNQyxvQkFBa0I7QUFDeEIsTUFBTUMseUJBQXlCO0FBRS9CLE1BQU1DLGFBQWE7QUFDbkIsTUFBTUMsYUFBYTtBQUNuQixNQUFNQyxpQkFBaUI7QUFDdkIsTUFBTUMsa0JBQWtCO0FBRXhCLE1BQU1DLGNBQWUsUUFBTy9GLFdBQVU7QUFDdEMsTUFBTWdHLGFBQWMsT0FBTWhHLFdBQVU7QUFDcEMsTUFBTWlHLGtCQUFpQixVQUFTakcsV0FBVTtBQUMxQyxNQUFNa0cscUJBQW9CLGFBQVlsRyxXQUFVO0FBQ2hELE1BQU1tRyxxQkFBb0IsYUFBWW5HLFdBQVU7QUFDaEQsTUFBTW9HLG1CQUFvQixZQUFXcEcsV0FBVTtBQUMvQyxNQUFNcUcsd0JBQXVCLE9BQU1yRyxXQUFVLEdBQUVpRCxjQUFhO0FBQzVELE1BQU1HLHlCQUF3QixRQUFPcEQsV0FBVSxHQUFFaUQsY0FBYTtBQUU5RCxNQUFNcUQsc0JBQXNCO0FBQzVCLE1BQU1wRCxzQkFBb0I7QUFDMUIsTUFBTXFELG1CQUFtQjtBQUN6QixNQUFNQyxpQkFBaUI7QUFDdkIsTUFBTUMsbUJBQW1CO0FBQ3pCLE1BQU1DLGtCQUFrQjtBQUN4QixNQUFNQyxrQkFBa0I7QUFFeEIsTUFBTUMsa0JBQWtCO0FBQ3hCLE1BQU1DLGdCQUFnQjtBQUN0QixNQUFNQyx1QkFBdUJGLGtCQUFrQkM7QUFDL0MsTUFBTUUsb0JBQW9CO0FBQzFCLE1BQU1DLHNCQUFzQjtBQUM1QixNQUFNQyxzQkFBc0I7QUFDNUIsTUFBTUMscUJBQXFCO0FBRTNCLE1BQU1DLG1CQUFtQjtJQUN2QixDQUFDM0IsZ0JBQWMsR0FBR007SUFDbEIsQ0FBQ0wsaUJBQWUsR0FBR0k7RUFDckI7QUFFQSxNQUFNdEgsWUFBVTtJQUNkNkksVUFBVTtJQUNWQyxVQUFVO0lBQ1ZDLE9BQU87SUFDUEMsTUFBTTtJQUNOQyxPQUFPO0lBQ1BDLE1BQU07RUFDUjtBQUVBLE1BQU1qSixnQkFBYztJQUNsQjRJLFVBQVU7O0lBQ1ZDLFVBQVU7SUFDVkMsT0FBTztJQUNQQyxNQUFNO0lBQ05DLE9BQU87SUFDUEMsTUFBTTtFQUNSO0FBTUEsTUFBTUMsV0FBTixNQUFNQSxrQkFBaUJoSSxjQUFjO0lBQ25DVixZQUFZek8sU0FBU29PLFFBQVE7QUFDM0IsWUFBTXBPLFNBQVNvTyxNQUFNO0FBRXJCLFdBQUtnSixZQUFZO0FBQ2pCLFdBQUtDLGlCQUFpQjtBQUN0QixXQUFLQyxhQUFhO0FBQ2xCLFdBQUtDLGVBQWU7QUFDcEIsV0FBS0MsZUFBZTtBQUVwQixXQUFLQyxxQkFBcUJsSCxlQUFlRyxRQUFRK0YscUJBQXFCLEtBQUtySCxRQUFRO0FBQ25GLFdBQUtzSSxtQkFBa0I7QUFFdkIsVUFBSSxLQUFLckksUUFBUTJILFNBQVNqQixxQkFBcUI7QUFDN0MsYUFBSzRCLE1BQUs7TUFDWjtJQUNGOztJQUdBLFdBQVczSixVQUFVO0FBQ25CLGFBQU9BO0lBQ1Q7SUFFQSxXQUFXQyxjQUFjO0FBQ3ZCLGFBQU9BO0lBQ1Q7SUFFQSxXQUFXL0gsT0FBTztBQUNoQixhQUFPQTtJQUNUOztJQUdBaUwsT0FBTztBQUNMLFdBQUt5RyxPQUFPeEMsVUFBVTtJQUN4QjtJQUVBeUMsa0JBQWtCO0FBSWhCLFVBQUksQ0FBQ3ZWLFNBQVN3VixVQUFVcFUsVUFBVSxLQUFLMEwsUUFBUSxHQUFHO0FBQ2hELGFBQUsrQixLQUFJO01BQ1g7SUFDRjtJQUVBSCxPQUFPO0FBQ0wsV0FBSzRHLE9BQU92QyxVQUFVO0lBQ3hCO0lBRUEwQixRQUFRO0FBQ04sVUFBSSxLQUFLTyxZQUFZO0FBQ25CclUsNkJBQXFCLEtBQUttTSxRQUFRO01BQ3BDO0FBRUEsV0FBSzJJLGVBQWM7SUFDckI7SUFFQUosUUFBUTtBQUNOLFdBQUtJLGVBQWM7QUFDbkIsV0FBS0MsZ0JBQWU7QUFFcEIsV0FBS1osWUFBWWEsWUFBWSxNQUFNLEtBQUtKLGdCQUFlLEdBQUksS0FBS3hJLFFBQVF3SCxRQUFRO0lBQ2xGO0lBRUFxQixvQkFBb0I7QUFDbEIsVUFBSSxDQUFDLEtBQUs3SSxRQUFRMkgsTUFBTTtBQUN0QjtNQUNGO0FBRUEsVUFBSSxLQUFLTSxZQUFZO0FBQ25CcE8scUJBQWFrQyxJQUFJLEtBQUtnRSxVQUFVcUcsWUFBWSxNQUFNLEtBQUtrQyxNQUFLLENBQUU7QUFDOUQ7TUFDRjtBQUVBLFdBQUtBLE1BQUs7SUFDWjtJQUVBUSxHQUFHdlEsT0FBTztBQUNSLFlBQU13USxRQUFRLEtBQUtDLFVBQVM7QUFDNUIsVUFBSXpRLFFBQVF3USxNQUFNNVUsU0FBUyxLQUFLb0UsUUFBUSxHQUFHO0FBQ3pDO01BQ0Y7QUFFQSxVQUFJLEtBQUswUCxZQUFZO0FBQ25CcE8scUJBQWFrQyxJQUFJLEtBQUtnRSxVQUFVcUcsWUFBWSxNQUFNLEtBQUswQyxHQUFHdlEsS0FBSyxDQUFDO0FBQ2hFO01BQ0Y7QUFFQSxZQUFNMFEsY0FBYyxLQUFLQyxjQUFjLEtBQUtDLFdBQVUsQ0FBRTtBQUN4RCxVQUFJRixnQkFBZ0IxUSxPQUFPO0FBQ3pCO01BQ0Y7QUFFQSxZQUFNNlEsU0FBUTdRLFFBQVEwUSxjQUFjbEQsYUFBYUM7QUFFakQsV0FBS3VDLE9BQU9hLFFBQU9MLE1BQU14USxLQUFLLENBQUM7SUFDakM7SUFFQTRILFVBQVU7QUFDUixVQUFJLEtBQUtnSSxjQUFjO0FBQ3JCLGFBQUtBLGFBQWFoSSxRQUFPO01BQzNCO0FBRUEsWUFBTUEsUUFBTztJQUNmOztJQUdBbEIsa0JBQWtCRixRQUFRO0FBQ3hCQSxhQUFPc0ssa0JBQWtCdEssT0FBT3lJO0FBQ2hDLGFBQU96STtJQUNUO0lBRUFzSixxQkFBcUI7QUFDbkIsVUFBSSxLQUFLckksUUFBUXlILFVBQVU7QUFDekI1TixxQkFBYWlDLEdBQUcsS0FBS2lFLFVBQVVzRyxpQkFBZTVNLFdBQVMsS0FBSzZQLFNBQVM3UCxLQUFLLENBQUM7TUFDN0U7QUFFQSxVQUFJLEtBQUt1RyxRQUFRMEgsVUFBVSxTQUFTO0FBQ2xDN04scUJBQWFpQyxHQUFHLEtBQUtpRSxVQUFVdUcsb0JBQWtCLE1BQU0sS0FBS29CLE1BQUssQ0FBRTtBQUNuRTdOLHFCQUFhaUMsR0FBRyxLQUFLaUUsVUFBVXdHLG9CQUFrQixNQUFNLEtBQUtzQyxrQkFBaUIsQ0FBRTtNQUNqRjtBQUVBLFVBQUksS0FBSzdJLFFBQVE0SCxTQUFTcEQsTUFBTUMsWUFBVyxHQUFJO0FBQzdDLGFBQUs4RSx3QkFBdUI7TUFDOUI7SUFDRjtJQUVBQSwwQkFBMEI7QUFDeEIsaUJBQVdDLE9BQU90SSxlQUFleEcsS0FBS3lNLG1CQUFtQixLQUFLcEgsUUFBUSxHQUFHO0FBQ3ZFbEcscUJBQWFpQyxHQUFHME4sS0FBS2hELGtCQUFrQi9NLFdBQVNBLE1BQU11RCxlQUFjLENBQUU7TUFDeEU7QUFFQSxZQUFNeU0sY0FBY0EsTUFBTTtBQUN4QixZQUFJLEtBQUt6SixRQUFRMEgsVUFBVSxTQUFTO0FBQ2xDO1FBQ0Y7QUFVQSxhQUFLQSxNQUFLO0FBQ1YsWUFBSSxLQUFLUSxjQUFjO0FBQ3JCd0IsdUJBQWEsS0FBS3hCLFlBQVk7UUFDaEM7QUFFQSxhQUFLQSxlQUFlbFEsV0FBVyxNQUFNLEtBQUs2USxrQkFBaUIsR0FBSS9DLHlCQUF5QixLQUFLOUYsUUFBUXdILFFBQVE7O0FBRy9HLFlBQU1tQyxjQUFjO1FBQ2xCckYsY0FBY0EsTUFBTSxLQUFLaUUsT0FBTyxLQUFLcUIsa0JBQWtCM0QsY0FBYyxDQUFDO1FBQ3RFMUIsZUFBZUEsTUFBTSxLQUFLZ0UsT0FBTyxLQUFLcUIsa0JBQWtCMUQsZUFBZSxDQUFDO1FBQ3hFN0IsYUFBYW9GOztBQUdmLFdBQUt0QixlQUFlLElBQUkzRCxNQUFNLEtBQUt6RSxVQUFVNEosV0FBVztJQUMxRDtJQUVBTCxTQUFTN1AsT0FBTztBQUNkLFVBQUksa0JBQWtCaUcsS0FBS2pHLE1BQU0zQixPQUFPNEssT0FBTyxHQUFHO0FBQ2hEO01BQ0Y7QUFFQSxZQUFNNkMsWUFBWWdDLGlCQUFpQjlOLE1BQU03SSxHQUFHO0FBQzVDLFVBQUkyVSxXQUFXO0FBQ2I5TCxjQUFNdUQsZUFBYztBQUNwQixhQUFLdUwsT0FBTyxLQUFLcUIsa0JBQWtCckUsU0FBUyxDQUFDO01BQy9DO0lBQ0Y7SUFFQTJELGNBQWN2WSxTQUFTO0FBQ3JCLGFBQU8sS0FBS3FZLFVBQVMsRUFBR3hRLFFBQVE3SCxPQUFPO0lBQ3pDO0lBRUFrWiwyQkFBMkJ0UixPQUFPO0FBQ2hDLFVBQUksQ0FBQyxLQUFLNlAsb0JBQW9CO0FBQzVCO01BQ0Y7QUFFQSxZQUFNMEIsa0JBQWtCNUksZUFBZUcsUUFBUTJGLGlCQUFpQixLQUFLb0Isa0JBQWtCO0FBRXZGMEIsc0JBQWdCOVUsVUFBVXpELE9BQU8rUixtQkFBaUI7QUFDbER3RyxzQkFBZ0I3TCxnQkFBZ0IsY0FBYztBQUU5QyxZQUFNOEwscUJBQXFCN0ksZUFBZUcsUUFBUyxzQkFBcUI5SSxLQUFNLE1BQUssS0FBSzZQLGtCQUFrQjtBQUUxRyxVQUFJMkIsb0JBQW9CO0FBQ3RCQSwyQkFBbUIvVSxVQUFVd1EsSUFBSWxDLG1CQUFpQjtBQUNsRHlHLDJCQUFtQmhNLGFBQWEsZ0JBQWdCLE1BQU07TUFDeEQ7SUFDRjtJQUVBNEssa0JBQWtCO0FBQ2hCLFlBQU1oWSxVQUFVLEtBQUtxWCxrQkFBa0IsS0FBS21CLFdBQVU7QUFFdEQsVUFBSSxDQUFDeFksU0FBUztBQUNaO01BQ0Y7QUFFQSxZQUFNcVosa0JBQWtCeFcsT0FBT3lXLFNBQVN0WixRQUFReUUsYUFBYSxrQkFBa0IsR0FBRyxFQUFFO0FBRXBGLFdBQUs0SyxRQUFRd0gsV0FBV3dDLG1CQUFtQixLQUFLaEssUUFBUXFKO0lBQzFEO0lBRUFkLE9BQU9hLFFBQU96WSxVQUFVLE1BQU07QUFDNUIsVUFBSSxLQUFLc1gsWUFBWTtBQUNuQjtNQUNGO0FBRUEsWUFBTTlQLGdCQUFnQixLQUFLZ1IsV0FBVTtBQUNyQyxZQUFNZSxTQUFTZCxXQUFVckQ7QUFDekIsWUFBTW9FLGNBQWN4WixXQUFXc0gscUJBQXFCLEtBQUsrUSxVQUFTLEdBQUk3USxlQUFlK1IsUUFBUSxLQUFLbEssUUFBUTZILElBQUk7QUFFOUcsVUFBSXNDLGdCQUFnQmhTLGVBQWU7QUFDakM7TUFDRjtBQUVBLFlBQU1pUyxtQkFBbUIsS0FBS2xCLGNBQWNpQixXQUFXO0FBRXZELFlBQU1FLGVBQWUxSixlQUFhO0FBQ2hDLGVBQU85RyxhQUFheUMsUUFBUSxLQUFLeUQsVUFBVVksV0FBVztVQUNwRHhGLGVBQWVnUDtVQUNmNUUsV0FBVyxLQUFLK0Usa0JBQWtCbEIsTUFBSztVQUN2Qy9YLE1BQU0sS0FBSzZYLGNBQWMvUSxhQUFhO1VBQ3RDMlEsSUFBSXNCO1FBQ04sQ0FBQzs7QUFHSCxZQUFNRyxhQUFhRixhQUFhbEUsV0FBVztBQUUzQyxVQUFJb0UsV0FBVzdOLGtCQUFrQjtBQUMvQjtNQUNGO0FBRUEsVUFBSSxDQUFDdkUsaUJBQWlCLENBQUNnUyxhQUFhO0FBR2xDO01BQ0Y7QUFFQSxZQUFNSyxZQUFZalAsUUFBUSxLQUFLd00sU0FBUztBQUN4QyxXQUFLTCxNQUFLO0FBRVYsV0FBS08sYUFBYTtBQUVsQixXQUFLNEIsMkJBQTJCTyxnQkFBZ0I7QUFDaEQsV0FBS3BDLGlCQUFpQm1DO0FBRXRCLFlBQU1NLHVCQUF1QlAsU0FBU3JELG1CQUFtQkQ7QUFDekQsWUFBTThELGlCQUFpQlIsU0FBU3BELGtCQUFrQkM7QUFFbERvRCxrQkFBWW5WLFVBQVV3USxJQUFJa0YsY0FBYztBQUV4QzlVLGFBQU91VSxXQUFXO0FBRWxCaFMsb0JBQWNuRCxVQUFVd1EsSUFBSWlGLG9CQUFvQjtBQUNoRE4sa0JBQVluVixVQUFVd1EsSUFBSWlGLG9CQUFvQjtBQUU5QyxZQUFNRSxtQkFBbUJBLE1BQU07QUFDN0JSLG9CQUFZblYsVUFBVXpELE9BQU9rWixzQkFBc0JDLGNBQWM7QUFDakVQLG9CQUFZblYsVUFBVXdRLElBQUlsQyxtQkFBaUI7QUFFM0NuTCxzQkFBY25ELFVBQVV6RCxPQUFPK1IscUJBQW1Cb0gsZ0JBQWdCRCxvQkFBb0I7QUFFdEYsYUFBS3hDLGFBQWE7QUFFbEJvQyxxQkFBYWpFLFVBQVU7O0FBR3pCLFdBQUs3RixlQUFlb0ssa0JBQWtCeFMsZUFBZSxLQUFLeVMsWUFBVyxDQUFFO0FBRXZFLFVBQUlKLFdBQVc7QUFDYixhQUFLbEMsTUFBSztNQUNaO0lBQ0Y7SUFFQXNDLGNBQWM7QUFDWixhQUFPLEtBQUs3SyxTQUFTL0ssVUFBVUMsU0FBUzBSLGdCQUFnQjtJQUMxRDtJQUVBd0MsYUFBYTtBQUNYLGFBQU9qSSxlQUFlRyxRQUFRNkYsc0JBQXNCLEtBQUtuSCxRQUFRO0lBQ25FO0lBRUFpSixZQUFZO0FBQ1YsYUFBTzlILGVBQWV4RyxLQUFLdU0sZUFBZSxLQUFLbEgsUUFBUTtJQUN6RDtJQUVBMkksaUJBQWlCO0FBQ2YsVUFBSSxLQUFLWCxXQUFXO0FBQ2xCOEMsc0JBQWMsS0FBSzlDLFNBQVM7QUFDNUIsYUFBS0EsWUFBWTtNQUNuQjtJQUNGO0lBRUE2QixrQkFBa0JyRSxXQUFXO0FBQzNCLFVBQUloUCxNQUFLLEdBQUk7QUFDWCxlQUFPZ1AsY0FBY1UsaUJBQWlCRCxhQUFhRDtNQUNyRDtBQUVBLGFBQU9SLGNBQWNVLGlCQUFpQkYsYUFBYUM7SUFDckQ7SUFFQXNFLGtCQUFrQmxCLFFBQU87QUFDdkIsVUFBSTdTLE1BQUssR0FBSTtBQUNYLGVBQU82UyxXQUFVcEQsYUFBYUMsaUJBQWlCQztNQUNqRDtBQUVBLGFBQU9rRCxXQUFVcEQsYUFBYUUsa0JBQWtCRDtJQUNsRDs7SUFHQSxPQUFPalAsZ0JBQWdCK0gsUUFBUTtBQUM3QixhQUFPLEtBQUtvRSxLQUFLLFdBQVk7QUFDM0IsY0FBTUMsT0FBTzBFLFVBQVNwSCxvQkFBb0IsTUFBTTNCLE1BQU07QUFFdEQsWUFBSSxPQUFPQSxXQUFXLFVBQVU7QUFDOUJxRSxlQUFLMEYsR0FBRy9KLE1BQU07QUFDZDtRQUNGO0FBRUEsWUFBSSxPQUFPQSxXQUFXLFVBQVU7QUFDOUIsY0FBSXFFLEtBQUtyRSxNQUFNLE1BQU16TSxVQUFheU0sT0FBTzdDLFdBQVcsR0FBRyxLQUFLNkMsV0FBVyxlQUFlO0FBQ3BGLGtCQUFNLElBQUlZLFVBQVcsb0JBQW1CWixNQUFPLEdBQUU7VUFDbkQ7QUFFQXFFLGVBQUtyRSxNQUFNLEVBQUM7UUFDZDtNQUNGLENBQUM7SUFDSDtFQUNGO0FBTUFsRixlQUFhaUMsR0FBRzdJLFVBQVV1USx3QkFBc0I2RCxxQkFBcUIsU0FBVTVOLE9BQU87QUFDcEYsVUFBTTNCLFNBQVNvSixlQUFla0IsdUJBQXVCLElBQUk7QUFFekQsUUFBSSxDQUFDdEssVUFBVSxDQUFDQSxPQUFPOUMsVUFBVUMsU0FBU3lSLG1CQUFtQixHQUFHO0FBQzlEO0lBQ0Y7QUFFQWpOLFVBQU11RCxlQUFjO0FBRXBCLFVBQU04TixXQUFXaEQsU0FBU3BILG9CQUFvQjVJLE1BQU07QUFDcEQsVUFBTWlULGFBQWEsS0FBSzNWLGFBQWEsa0JBQWtCO0FBRXZELFFBQUkyVixZQUFZO0FBQ2RELGVBQVNoQyxHQUFHaUMsVUFBVTtBQUN0QkQsZUFBU2pDLGtCQUFpQjtBQUMxQjtJQUNGO0FBRUEsUUFBSWhMLFlBQVlZLGlCQUFpQixNQUFNLE9BQU8sTUFBTSxRQUFRO0FBQzFEcU0sZUFBU2hKLEtBQUk7QUFDYmdKLGVBQVNqQyxrQkFBaUI7QUFDMUI7SUFDRjtBQUVBaUMsYUFBU25KLEtBQUk7QUFDYm1KLGFBQVNqQyxrQkFBaUI7RUFDNUIsQ0FBQztBQUVEaFAsZUFBYWlDLEdBQUdoSyxRQUFRMlUsdUJBQXFCLE1BQU07QUFDakQsVUFBTXVFLFlBQVk5SixlQUFleEcsS0FBSzRNLGtCQUFrQjtBQUV4RCxlQUFXd0QsWUFBWUUsV0FBVztBQUNoQ2xELGVBQVNwSCxvQkFBb0JvSyxRQUFRO0lBQ3ZDO0VBQ0YsQ0FBQztBQU1EclUscUJBQW1CcVIsUUFBUTtBQ25jM0IsTUFBTWpSLFNBQU87QUFDYixNQUFNcUosYUFBVztBQUNqQixNQUFNRSxjQUFhLElBQUdGLFVBQVM7QUFDL0IsTUFBTW1ELGlCQUFlO0FBRXJCLE1BQU00SCxlQUFjLE9BQU03SyxXQUFVO0FBQ3BDLE1BQU04SyxnQkFBZSxRQUFPOUssV0FBVTtBQUN0QyxNQUFNK0ssZUFBYyxPQUFNL0ssV0FBVTtBQUNwQyxNQUFNZ0wsaUJBQWdCLFNBQVFoTCxXQUFVO0FBQ3hDLE1BQU1vRCx5QkFBd0IsUUFBT3BELFdBQVUsR0FBRWlELGNBQWE7QUFFOUQsTUFBTVAsb0JBQWtCO0FBQ3hCLE1BQU11SSxzQkFBc0I7QUFDNUIsTUFBTUMsd0JBQXdCO0FBQzlCLE1BQU1DLHVCQUF1QjtBQUM3QixNQUFNQyw2QkFBOEIsV0FBVUgsbUJBQW9CLEtBQUlBLG1CQUFvQjtBQUMxRixNQUFNSSx3QkFBd0I7QUFFOUIsTUFBTUMsUUFBUTtBQUNkLE1BQU1DLFNBQVM7QUFFZixNQUFNQyxtQkFBbUI7QUFDekIsTUFBTXJJLHlCQUF1QjtBQUU3QixNQUFNNUUsWUFBVTtJQUNka04sUUFBUTtJQUNSbkksUUFBUTtFQUNWO0FBRUEsTUFBTTlFLGdCQUFjO0lBQ2xCaU4sUUFBUTtJQUNSbkksUUFBUTtFQUNWO0FBTUEsTUFBTW9JLFdBQU4sTUFBTUEsa0JBQWlCaE0sY0FBYztJQUNuQ1YsWUFBWXpPLFNBQVNvTyxRQUFRO0FBQzNCLFlBQU1wTyxTQUFTb08sTUFBTTtBQUVyQixXQUFLZ04sbUJBQW1CO0FBQ3hCLFdBQUtDLGdCQUFnQixDQUFBO0FBRXJCLFlBQU1DLGFBQWEvSyxlQUFleEcsS0FBSzZJLHNCQUFvQjtBQUUzRCxpQkFBVzJJLFFBQVFELFlBQVk7QUFDN0IsY0FBTXBhLFdBQVdxUCxlQUFlaUIsdUJBQXVCK0osSUFBSTtBQUMzRCxjQUFNQyxnQkFBZ0JqTCxlQUFleEcsS0FBSzdJLFFBQVEsRUFDL0N5TSxPQUFPOE4sa0JBQWdCQSxpQkFBaUIsS0FBS3JNLFFBQVE7QUFFeEQsWUFBSWxPLGFBQWEsUUFBUXNhLGNBQWNoWSxRQUFRO0FBQzdDLGVBQUs2WCxjQUFjMVYsS0FBSzRWLElBQUk7UUFDOUI7TUFDRjtBQUVBLFdBQUtHLG9CQUFtQjtBQUV4QixVQUFJLENBQUMsS0FBS3JNLFFBQVE2TCxRQUFRO0FBQ3hCLGFBQUtTLDBCQUEwQixLQUFLTixlQUFlLEtBQUtPLFNBQVEsQ0FBRTtNQUNwRTtBQUVBLFVBQUksS0FBS3ZNLFFBQVEwRCxRQUFRO0FBQ3ZCLGFBQUtBLE9BQU07TUFDYjtJQUNGOztJQUdBLFdBQVcvRSxVQUFVO0FBQ25CLGFBQU9BO0lBQ1Q7SUFFQSxXQUFXQyxjQUFjO0FBQ3ZCLGFBQU9BO0lBQ1Q7SUFFQSxXQUFXL0gsT0FBTztBQUNoQixhQUFPQTtJQUNUOztJQUdBNk0sU0FBUztBQUNQLFVBQUksS0FBSzZJLFNBQVEsR0FBSTtBQUNuQixhQUFLQyxLQUFJO01BQ1gsT0FBTztBQUNMLGFBQUtDLEtBQUk7TUFDWDtJQUNGO0lBRUFBLE9BQU87QUFDTCxVQUFJLEtBQUtWLG9CQUFvQixLQUFLUSxTQUFRLEdBQUk7QUFDNUM7TUFDRjtBQUVBLFVBQUlHLGlCQUFpQixDQUFBO0FBR3JCLFVBQUksS0FBSzFNLFFBQVE2TCxRQUFRO0FBQ3ZCYSx5QkFBaUIsS0FBS0MsdUJBQXVCZixnQkFBZ0IsRUFDMUR0TixPQUFPM04sYUFBV0EsWUFBWSxLQUFLb1AsUUFBUSxFQUMzQ2dCLElBQUlwUSxhQUFXbWIsVUFBU3BMLG9CQUFvQi9QLFNBQVM7VUFBRStTLFFBQVE7UUFBTSxDQUFDLENBQUM7TUFDNUU7QUFFQSxVQUFJZ0osZUFBZXZZLFVBQVV1WSxlQUFlLENBQUMsRUFBRVgsa0JBQWtCO0FBQy9EO01BQ0Y7QUFFQSxZQUFNYSxhQUFhL1MsYUFBYXlDLFFBQVEsS0FBS3lELFVBQVVrTCxZQUFVO0FBQ2pFLFVBQUkyQixXQUFXbFEsa0JBQWtCO0FBQy9CO01BQ0Y7QUFFQSxpQkFBV21RLGtCQUFrQkgsZ0JBQWdCO0FBQzNDRyx1QkFBZUwsS0FBSTtNQUNyQjtBQUVBLFlBQU1NLFlBQVksS0FBS0MsY0FBYTtBQUVwQyxXQUFLaE4sU0FBUy9LLFVBQVV6RCxPQUFPOFosbUJBQW1CO0FBQ2xELFdBQUt0TCxTQUFTL0ssVUFBVXdRLElBQUk4RixxQkFBcUI7QUFFakQsV0FBS3ZMLFNBQVNpTixNQUFNRixTQUFTLElBQUk7QUFFakMsV0FBS1IsMEJBQTBCLEtBQUtOLGVBQWUsSUFBSTtBQUN2RCxXQUFLRCxtQkFBbUI7QUFFeEIsWUFBTWtCLFdBQVdBLE1BQU07QUFDckIsYUFBS2xCLG1CQUFtQjtBQUV4QixhQUFLaE0sU0FBUy9LLFVBQVV6RCxPQUFPK1oscUJBQXFCO0FBQ3BELGFBQUt2TCxTQUFTL0ssVUFBVXdRLElBQUk2RixxQkFBcUJ2SSxpQkFBZTtBQUVoRSxhQUFLL0MsU0FBU2lOLE1BQU1GLFNBQVMsSUFBSTtBQUVqQ2pULHFCQUFheUMsUUFBUSxLQUFLeUQsVUFBVW1MLGFBQVc7O0FBR2pELFlBQU1nQyx1QkFBdUJKLFVBQVUsQ0FBQyxFQUFFbE4sWUFBVyxJQUFLa04sVUFBVTFRLE1BQU0sQ0FBQztBQUMzRSxZQUFNK1EsYUFBYyxTQUFRRCxvQkFBcUI7QUFFakQsV0FBSzNNLGVBQWUwTSxVQUFVLEtBQUtsTixVQUFVLElBQUk7QUFDakQsV0FBS0EsU0FBU2lOLE1BQU1GLFNBQVMsSUFBSyxHQUFFLEtBQUsvTSxTQUFTb04sVUFBVSxDQUFFO0lBQ2hFO0lBRUFYLE9BQU87QUFDTCxVQUFJLEtBQUtULG9CQUFvQixDQUFDLEtBQUtRLFNBQVEsR0FBSTtBQUM3QztNQUNGO0FBRUEsWUFBTUssYUFBYS9TLGFBQWF5QyxRQUFRLEtBQUt5RCxVQUFVb0wsWUFBVTtBQUNqRSxVQUFJeUIsV0FBV2xRLGtCQUFrQjtBQUMvQjtNQUNGO0FBRUEsWUFBTW9RLFlBQVksS0FBS0MsY0FBYTtBQUVwQyxXQUFLaE4sU0FBU2lOLE1BQU1GLFNBQVMsSUFBSyxHQUFFLEtBQUsvTSxTQUFTcU4sc0JBQXFCLEVBQUdOLFNBQVMsQ0FBRTtBQUVyRmxYLGFBQU8sS0FBS21LLFFBQVE7QUFFcEIsV0FBS0EsU0FBUy9LLFVBQVV3USxJQUFJOEYscUJBQXFCO0FBQ2pELFdBQUt2TCxTQUFTL0ssVUFBVXpELE9BQU84WixxQkFBcUJ2SSxpQkFBZTtBQUVuRSxpQkFBV3hHLFdBQVcsS0FBSzBQLGVBQWU7QUFDeEMsY0FBTXJiLFVBQVV1USxlQUFla0IsdUJBQXVCOUYsT0FBTztBQUU3RCxZQUFJM0wsV0FBVyxDQUFDLEtBQUs0YixTQUFTNWIsT0FBTyxHQUFHO0FBQ3RDLGVBQUsyYiwwQkFBMEIsQ0FBQ2hRLE9BQU8sR0FBRyxLQUFLO1FBQ2pEO01BQ0Y7QUFFQSxXQUFLeVAsbUJBQW1CO0FBRXhCLFlBQU1rQixXQUFXQSxNQUFNO0FBQ3JCLGFBQUtsQixtQkFBbUI7QUFDeEIsYUFBS2hNLFNBQVMvSyxVQUFVekQsT0FBTytaLHFCQUFxQjtBQUNwRCxhQUFLdkwsU0FBUy9LLFVBQVV3USxJQUFJNkYsbUJBQW1CO0FBQy9DeFIscUJBQWF5QyxRQUFRLEtBQUt5RCxVQUFVcUwsY0FBWTs7QUFHbEQsV0FBS3JMLFNBQVNpTixNQUFNRixTQUFTLElBQUk7QUFFakMsV0FBS3ZNLGVBQWUwTSxVQUFVLEtBQUtsTixVQUFVLElBQUk7SUFDbkQ7SUFFQXdNLFNBQVM1YixVQUFVLEtBQUtvUCxVQUFVO0FBQ2hDLGFBQU9wUCxRQUFRcUUsVUFBVUMsU0FBUzZOLGlCQUFlO0lBQ25EOztJQUdBN0Qsa0JBQWtCRixRQUFRO0FBQ3hCQSxhQUFPMkUsU0FBU25JLFFBQVF3RCxPQUFPMkUsTUFBTTtBQUNyQzNFLGFBQU84TSxTQUFTM1gsV0FBVzZLLE9BQU84TSxNQUFNO0FBQ3hDLGFBQU85TTtJQUNUO0lBRUFnTyxnQkFBZ0I7QUFDZCxhQUFPLEtBQUtoTixTQUFTL0ssVUFBVUMsU0FBU3dXLHFCQUFxQixJQUFJQyxRQUFRQztJQUMzRTtJQUVBVSxzQkFBc0I7QUFDcEIsVUFBSSxDQUFDLEtBQUtyTSxRQUFRNkwsUUFBUTtBQUN4QjtNQUNGO0FBRUEsWUFBTXZLLFdBQVcsS0FBS3FMLHVCQUF1QnBKLHNCQUFvQjtBQUVqRSxpQkFBVzVTLFdBQVcyUSxVQUFVO0FBQzlCLGNBQU0rTCxXQUFXbk0sZUFBZWtCLHVCQUF1QnpSLE9BQU87QUFFOUQsWUFBSTBjLFVBQVU7QUFDWixlQUFLZiwwQkFBMEIsQ0FBQzNiLE9BQU8sR0FBRyxLQUFLNGIsU0FBU2MsUUFBUSxDQUFDO1FBQ25FO01BQ0Y7SUFDRjtJQUVBVix1QkFBdUI5YSxVQUFVO0FBQy9CLFlBQU15UCxXQUFXSixlQUFleEcsS0FBSzhRLDRCQUE0QixLQUFLeEwsUUFBUTZMLE1BQU07QUFFcEYsYUFBTzNLLGVBQWV4RyxLQUFLN0ksVUFBVSxLQUFLbU8sUUFBUTZMLE1BQU0sRUFBRXZOLE9BQU8zTixhQUFXLENBQUMyUSxTQUFTekYsU0FBU2xMLE9BQU8sQ0FBQztJQUN6RztJQUVBMmIsMEJBQTBCZ0IsY0FBY0MsUUFBUTtBQUM5QyxVQUFJLENBQUNELGFBQWFuWixRQUFRO0FBQ3hCO01BQ0Y7QUFFQSxpQkFBV3hELFdBQVcyYyxjQUFjO0FBQ2xDM2MsZ0JBQVFxRSxVQUFVME8sT0FBTzZILHNCQUFzQixDQUFDZ0MsTUFBTTtBQUN0RDVjLGdCQUFRb04sYUFBYSxpQkFBaUJ3UCxNQUFNO01BQzlDO0lBQ0Y7O0lBR0EsT0FBT3ZXLGdCQUFnQitILFFBQVE7QUFDN0IsWUFBTWlCLFVBQVUsQ0FBQTtBQUNoQixVQUFJLE9BQU9qQixXQUFXLFlBQVksWUFBWVcsS0FBS1gsTUFBTSxHQUFHO0FBQzFEaUIsZ0JBQVEwRCxTQUFTO01BQ25CO0FBRUEsYUFBTyxLQUFLUCxLQUFLLFdBQVk7QUFDM0IsY0FBTUMsT0FBTzBJLFVBQVNwTCxvQkFBb0IsTUFBTVYsT0FBTztBQUV2RCxZQUFJLE9BQU9qQixXQUFXLFVBQVU7QUFDOUIsY0FBSSxPQUFPcUUsS0FBS3JFLE1BQU0sTUFBTSxhQUFhO0FBQ3ZDLGtCQUFNLElBQUlZLFVBQVcsb0JBQW1CWixNQUFPLEdBQUU7VUFDbkQ7QUFFQXFFLGVBQUtyRSxNQUFNLEVBQUM7UUFDZDtNQUNGLENBQUM7SUFDSDtFQUNGO0FBTUFsRixlQUFhaUMsR0FBRzdJLFVBQVV1USx3QkFBc0JELHdCQUFzQixTQUFVOUosT0FBTztBQUVyRixRQUFJQSxNQUFNM0IsT0FBTzRLLFlBQVksT0FBUWpKLE1BQU1FLGtCQUFrQkYsTUFBTUUsZUFBZStJLFlBQVksS0FBTTtBQUNsR2pKLFlBQU11RCxlQUFjO0lBQ3RCO0FBRUEsZUFBV3JNLFdBQVd1USxlQUFlbUIsZ0NBQWdDLElBQUksR0FBRztBQUMxRXlKLGVBQVNwTCxvQkFBb0IvUCxTQUFTO1FBQUUrUyxRQUFRO01BQU0sQ0FBQyxFQUFFQSxPQUFNO0lBQ2pFO0VBQ0YsQ0FBQztBQU1Eak4scUJBQW1CcVYsUUFBUTtBQzFRM0IsTUFBTWpWLFNBQU87QUFDYixNQUFNcUosYUFBVztBQUNqQixNQUFNRSxjQUFhLElBQUdGLFVBQVM7QUFDL0IsTUFBTW1ELGlCQUFlO0FBRXJCLE1BQU1tSyxlQUFhO0FBQ25CLE1BQU1DLFlBQVU7QUFDaEIsTUFBTUMsaUJBQWU7QUFDckIsTUFBTUMsbUJBQWlCO0FBQ3ZCLE1BQU1DLHFCQUFxQjtBQUUzQixNQUFNekMsZUFBYyxPQUFNL0ssV0FBVTtBQUNwQyxNQUFNZ0wsaUJBQWdCLFNBQVFoTCxXQUFVO0FBQ3hDLE1BQU02SyxlQUFjLE9BQU03SyxXQUFVO0FBQ3BDLE1BQU04SyxnQkFBZSxRQUFPOUssV0FBVTtBQUN0QyxNQUFNb0QseUJBQXdCLFFBQU9wRCxXQUFVLEdBQUVpRCxjQUFhO0FBQzlELE1BQU13Syx5QkFBMEIsVUFBU3pOLFdBQVUsR0FBRWlELGNBQWE7QUFDbEUsTUFBTXlLLHVCQUF3QixRQUFPMU4sV0FBVSxHQUFFaUQsY0FBYTtBQUU5RCxNQUFNUCxvQkFBa0I7QUFDeEIsTUFBTWlMLG9CQUFvQjtBQUMxQixNQUFNQyxxQkFBcUI7QUFDM0IsTUFBTUMsdUJBQXVCO0FBQzdCLE1BQU1DLDJCQUEyQjtBQUNqQyxNQUFNQyw2QkFBNkI7QUFFbkMsTUFBTTVLLHlCQUF1QjtBQUM3QixNQUFNNkssNkJBQThCLEdBQUU3SyxzQkFBcUIsSUFBR1QsaUJBQWdCO0FBQzlFLE1BQU11TCxnQkFBZ0I7QUFDdEIsTUFBTUMsa0JBQWtCO0FBQ3hCLE1BQU1DLHNCQUFzQjtBQUM1QixNQUFNQyx5QkFBeUI7QUFFL0IsTUFBTUMsZ0JBQWdCbFksTUFBSyxJQUFLLFlBQVk7QUFDNUMsTUFBTW1ZLG1CQUFtQm5ZLE1BQUssSUFBSyxjQUFjO0FBQ2pELE1BQU1vWSxtQkFBbUJwWSxNQUFLLElBQUssZUFBZTtBQUNsRCxNQUFNcVksc0JBQXNCclksTUFBSyxJQUFLLGlCQUFpQjtBQUN2RCxNQUFNc1ksa0JBQWtCdFksTUFBSyxJQUFLLGVBQWU7QUFDakQsTUFBTXVZLGlCQUFpQnZZLE1BQUssSUFBSyxnQkFBZ0I7QUFDakQsTUFBTXdZLHNCQUFzQjtBQUM1QixNQUFNQyx5QkFBeUI7QUFFL0IsTUFBTXJRLFlBQVU7SUFDZHNRLFdBQVc7SUFDWEMsVUFBVTtJQUNWQyxTQUFTO0lBQ1RDLFFBQVEsQ0FBQyxHQUFHLENBQUM7SUFDYkMsY0FBYztJQUNkQyxXQUFXO0VBQ2I7QUFFQSxNQUFNMVEsZ0JBQWM7SUFDbEJxUSxXQUFXO0lBQ1hDLFVBQVU7SUFDVkMsU0FBUztJQUNUQyxRQUFRO0lBQ1JDLGNBQWM7SUFDZEMsV0FBVztFQUNiO0FBTUEsTUFBTUMsV0FBTixNQUFNQSxrQkFBaUJ6UCxjQUFjO0lBQ25DVixZQUFZek8sU0FBU29PLFFBQVE7QUFDM0IsWUFBTXBPLFNBQVNvTyxNQUFNO0FBRXJCLFdBQUt5USxVQUFVO0FBQ2YsV0FBS0MsVUFBVSxLQUFLMVAsU0FBU25MO0FBRTdCLFdBQUs4YSxRQUFReE8sZUFBZVksS0FBSyxLQUFLL0IsVUFBVXNPLGFBQWEsRUFBRSxDQUFDLEtBQzlEbk4sZUFBZVMsS0FBSyxLQUFLNUIsVUFBVXNPLGFBQWEsRUFBRSxDQUFDLEtBQ25Ebk4sZUFBZUcsUUFBUWdOLGVBQWUsS0FBS29CLE9BQU87QUFDcEQsV0FBS0UsWUFBWSxLQUFLQyxjQUFhO0lBQ3JDOztJQUdBLFdBQVdqUixVQUFVO0FBQ25CLGFBQU9BO0lBQ1Q7SUFFQSxXQUFXQyxjQUFjO0FBQ3ZCLGFBQU9BO0lBQ1Q7SUFFQSxXQUFXL0gsT0FBTztBQUNoQixhQUFPQTtJQUNUOztJQUdBNk0sU0FBUztBQUNQLGFBQU8sS0FBSzZJLFNBQVEsSUFBSyxLQUFLQyxLQUFJLElBQUssS0FBS0MsS0FBSTtJQUNsRDtJQUVBQSxPQUFPO0FBQ0wsVUFBSTVYLFdBQVcsS0FBS2tMLFFBQVEsS0FBSyxLQUFLd00sU0FBUSxHQUFJO0FBQ2hEO01BQ0Y7QUFFQSxZQUFNcFIsZ0JBQWdCO1FBQ3BCQSxlQUFlLEtBQUs0RTs7QUFHdEIsWUFBTThQLFlBQVloVyxhQUFheUMsUUFBUSxLQUFLeUQsVUFBVWtMLGNBQVk5UCxhQUFhO0FBRS9FLFVBQUkwVSxVQUFVblQsa0JBQWtCO0FBQzlCO01BQ0Y7QUFFQSxXQUFLb1QsY0FBYTtBQU1sQixVQUFJLGtCQUFrQjdjLFNBQVNxQyxtQkFBbUIsQ0FBQyxLQUFLbWEsUUFBUS9hLFFBQVE2WixtQkFBbUIsR0FBRztBQUM1RixtQkFBVzVkLFdBQVcsQ0FBQSxFQUFHd1EsT0FBTyxHQUFHbE8sU0FBUytDLEtBQUtzTCxRQUFRLEdBQUc7QUFDMUR6SCx1QkFBYWlDLEdBQUduTCxTQUFTLGFBQWFnRixJQUFJO1FBQzVDO01BQ0Y7QUFFQSxXQUFLb0ssU0FBU2dRLE1BQUs7QUFDbkIsV0FBS2hRLFNBQVNoQyxhQUFhLGlCQUFpQixJQUFJO0FBRWhELFdBQUsyUixNQUFNMWEsVUFBVXdRLElBQUkxQyxpQkFBZTtBQUN4QyxXQUFLL0MsU0FBUy9LLFVBQVV3USxJQUFJMUMsaUJBQWU7QUFDM0NqSixtQkFBYXlDLFFBQVEsS0FBS3lELFVBQVVtTCxlQUFhL1AsYUFBYTtJQUNoRTtJQUVBcVIsT0FBTztBQUNMLFVBQUkzWCxXQUFXLEtBQUtrTCxRQUFRLEtBQUssQ0FBQyxLQUFLd00sU0FBUSxHQUFJO0FBQ2pEO01BQ0Y7QUFFQSxZQUFNcFIsZ0JBQWdCO1FBQ3BCQSxlQUFlLEtBQUs0RTs7QUFHdEIsV0FBS2lRLGNBQWM3VSxhQUFhO0lBQ2xDO0lBRUFnRixVQUFVO0FBQ1IsVUFBSSxLQUFLcVAsU0FBUztBQUNoQixhQUFLQSxRQUFRUyxRQUFPO01BQ3RCO0FBRUEsWUFBTTlQLFFBQU87SUFDZjtJQUVBK1AsU0FBUztBQUNQLFdBQUtQLFlBQVksS0FBS0MsY0FBYTtBQUNuQyxVQUFJLEtBQUtKLFNBQVM7QUFDaEIsYUFBS0EsUUFBUVUsT0FBTTtNQUNyQjtJQUNGOztJQUdBRixjQUFjN1UsZUFBZTtBQUMzQixZQUFNZ1YsWUFBWXRXLGFBQWF5QyxRQUFRLEtBQUt5RCxVQUFVb0wsY0FBWWhRLGFBQWE7QUFDL0UsVUFBSWdWLFVBQVV6VCxrQkFBa0I7QUFDOUI7TUFDRjtBQUlBLFVBQUksa0JBQWtCekosU0FBU3FDLGlCQUFpQjtBQUM5QyxtQkFBVzNFLFdBQVcsQ0FBQSxFQUFHd1EsT0FBTyxHQUFHbE8sU0FBUytDLEtBQUtzTCxRQUFRLEdBQUc7QUFDMUR6SCx1QkFBYUMsSUFBSW5KLFNBQVMsYUFBYWdGLElBQUk7UUFDN0M7TUFDRjtBQUVBLFVBQUksS0FBSzZaLFNBQVM7QUFDaEIsYUFBS0EsUUFBUVMsUUFBTztNQUN0QjtBQUVBLFdBQUtQLE1BQU0xYSxVQUFVekQsT0FBT3VSLGlCQUFlO0FBQzNDLFdBQUsvQyxTQUFTL0ssVUFBVXpELE9BQU91UixpQkFBZTtBQUM5QyxXQUFLL0MsU0FBU2hDLGFBQWEsaUJBQWlCLE9BQU87QUFDbkRGLGtCQUFZRyxvQkFBb0IsS0FBSzBSLE9BQU8sUUFBUTtBQUNwRDdWLG1CQUFheUMsUUFBUSxLQUFLeUQsVUFBVXFMLGdCQUFjalEsYUFBYTtJQUNqRTtJQUVBMkQsV0FBV0MsUUFBUTtBQUNqQkEsZUFBUyxNQUFNRCxXQUFXQyxNQUFNO0FBRWhDLFVBQUksT0FBT0EsT0FBT3VRLGNBQWMsWUFBWSxDQUFDdmIsV0FBVWdMLE9BQU91USxTQUFTLEtBQ3JFLE9BQU92USxPQUFPdVEsVUFBVWxDLDBCQUEwQixZQUNsRDtBQUVBLGNBQU0sSUFBSXpOLFVBQVcsR0FBRTlJLE9BQUsrSSxZQUFXLENBQUcsZ0dBQStGO01BQzNJO0FBRUEsYUFBT2I7SUFDVDtJQUVBK1EsZ0JBQWdCO0FBQ2QsVUFBSSxPQUFPTSxnQkFBVyxhQUFhO0FBQ2pDLGNBQU0sSUFBSXpRLFVBQVUsOERBQStEO01BQ3JGO0FBRUEsVUFBSTBRLG1CQUFtQixLQUFLdFE7QUFFNUIsVUFBSSxLQUFLQyxRQUFRc1AsY0FBYyxVQUFVO0FBQ3ZDZSwyQkFBbUIsS0FBS1o7aUJBQ2YxYixXQUFVLEtBQUtpTSxRQUFRc1AsU0FBUyxHQUFHO0FBQzVDZSwyQkFBbUJuYyxXQUFXLEtBQUs4TCxRQUFRc1AsU0FBUztpQkFDM0MsT0FBTyxLQUFLdFAsUUFBUXNQLGNBQWMsVUFBVTtBQUNyRGUsMkJBQW1CLEtBQUtyUSxRQUFRc1A7TUFDbEM7QUFFQSxZQUFNRCxlQUFlLEtBQUtpQixpQkFBZ0I7QUFDMUMsV0FBS2QsVUFBaUJlLGNBQWFGLGtCQUFrQixLQUFLWCxPQUFPTCxZQUFZO0lBQy9FO0lBRUE5QyxXQUFXO0FBQ1QsYUFBTyxLQUFLbUQsTUFBTTFhLFVBQVVDLFNBQVM2TixpQkFBZTtJQUN0RDtJQUVBME4sZ0JBQWdCO0FBQ2QsWUFBTUMsaUJBQWlCLEtBQUtoQjtBQUU1QixVQUFJZ0IsZUFBZXpiLFVBQVVDLFNBQVMrWSxrQkFBa0IsR0FBRztBQUN6RCxlQUFPYTtNQUNUO0FBRUEsVUFBSTRCLGVBQWV6YixVQUFVQyxTQUFTZ1osb0JBQW9CLEdBQUc7QUFDM0QsZUFBT2E7TUFDVDtBQUVBLFVBQUkyQixlQUFlemIsVUFBVUMsU0FBU2laLHdCQUF3QixHQUFHO0FBQy9ELGVBQU9hO01BQ1Q7QUFFQSxVQUFJMEIsZUFBZXpiLFVBQVVDLFNBQVNrWiwwQkFBMEIsR0FBRztBQUNqRSxlQUFPYTtNQUNUO0FBR0EsWUFBTTBCLFFBQVFwZCxpQkFBaUIsS0FBS29jLEtBQUssRUFBRWxiLGlCQUFpQixlQUFlLEVBQUVzTSxLQUFJLE1BQU87QUFFeEYsVUFBSTJQLGVBQWV6YixVQUFVQyxTQUFTOFksaUJBQWlCLEdBQUc7QUFDeEQsZUFBTzJDLFFBQVFoQyxtQkFBbUJEO01BQ3BDO0FBRUEsYUFBT2lDLFFBQVE5QixzQkFBc0JEO0lBQ3ZDO0lBRUFpQixnQkFBZ0I7QUFDZCxhQUFPLEtBQUs3UCxTQUFTckwsUUFBUTRaLGVBQWUsTUFBTTtJQUNwRDtJQUVBcUMsYUFBYTtBQUNYLFlBQU07UUFBRXZCLFFBQUFBO1VBQVcsS0FBS3BQO0FBRXhCLFVBQUksT0FBT29QLFlBQVcsVUFBVTtBQUM5QixlQUFPQSxRQUFPemIsTUFBTSxHQUFHLEVBQUVvTixJQUFJNUQsV0FBUzNKLE9BQU95VyxTQUFTOU0sT0FBTyxFQUFFLENBQUM7TUFDbEU7QUFFQSxVQUFJLE9BQU9pUyxZQUFXLFlBQVk7QUFDaEMsZUFBT3dCLGdCQUFjeEIsUUFBT3dCLFlBQVksS0FBSzdRLFFBQVE7TUFDdkQ7QUFFQSxhQUFPcVA7SUFDVDtJQUVBa0IsbUJBQW1CO0FBQ2pCLFlBQU1PLHdCQUF3QjtRQUM1QkMsV0FBVyxLQUFLTixjQUFhO1FBQzdCTyxXQUFXLENBQUM7VUFDVm5hLE1BQU07VUFDTm9hLFNBQVM7WUFDUDlCLFVBQVUsS0FBS2xQLFFBQVFrUDtVQUN6QjtRQUNGLEdBQ0E7VUFDRXRZLE1BQU07VUFDTm9hLFNBQVM7WUFDUDVCLFFBQVEsS0FBS3VCLFdBQVU7VUFDekI7U0FDRDs7QUFJSCxVQUFJLEtBQUtoQixhQUFhLEtBQUszUCxRQUFRbVAsWUFBWSxVQUFVO0FBQ3ZEdFIsb0JBQVlDLGlCQUFpQixLQUFLNFIsT0FBTyxVQUFVLFFBQVE7QUFDM0RtQiw4QkFBc0JFLFlBQVksQ0FBQztVQUNqQ25hLE1BQU07VUFDTnFhLFNBQVM7UUFDWCxDQUFDO01BQ0g7QUFFQSxhQUFPLGtDQUNGSix3QkFDQTFaLFFBQVEsS0FBSzZJLFFBQVFxUCxjQUFjLENBQUN3QixxQkFBcUIsQ0FBQztJQUVqRTtJQUVBSyxnQkFBZ0I7TUFBRXRnQjtNQUFLa0g7SUFBTyxHQUFHO0FBQy9CLFlBQU1pUixRQUFRN0gsZUFBZXhHLEtBQUs4VCx3QkFBd0IsS0FBS2tCLEtBQUssRUFBRXBSLE9BQU8zTixhQUFXMEQsVUFBVTFELE9BQU8sQ0FBQztBQUUxRyxVQUFJLENBQUNvWSxNQUFNNVUsUUFBUTtBQUNqQjtNQUNGO0FBSUE4RCwyQkFBcUI4USxPQUFPalIsUUFBUWxILFFBQVErYyxrQkFBZ0IsQ0FBQzVFLE1BQU1sTixTQUFTL0QsTUFBTSxDQUFDLEVBQUVpWSxNQUFLO0lBQzVGOztJQUdBLE9BQU8vWSxnQkFBZ0IrSCxRQUFRO0FBQzdCLGFBQU8sS0FBS29FLEtBQUssV0FBWTtBQUMzQixjQUFNQyxPQUFPbU0sVUFBUzdPLG9CQUFvQixNQUFNM0IsTUFBTTtBQUV0RCxZQUFJLE9BQU9BLFdBQVcsVUFBVTtBQUM5QjtRQUNGO0FBRUEsWUFBSSxPQUFPcUUsS0FBS3JFLE1BQU0sTUFBTSxhQUFhO0FBQ3ZDLGdCQUFNLElBQUlZLFVBQVcsb0JBQW1CWixNQUFPLEdBQUU7UUFDbkQ7QUFFQXFFLGFBQUtyRSxNQUFNLEVBQUM7TUFDZCxDQUFDO0lBQ0g7SUFFQSxPQUFPb1MsV0FBVzFYLE9BQU87QUFDdkIsVUFBSUEsTUFBTWtLLFdBQVdpSyxzQkFBdUJuVSxNQUFNTSxTQUFTLFdBQVdOLE1BQU03SSxRQUFRNmMsV0FBVTtBQUM1RjtNQUNGO0FBRUEsWUFBTTJELGNBQWNsUSxlQUFleEcsS0FBSzBULDBCQUEwQjtBQUVsRSxpQkFBVzFLLFVBQVUwTixhQUFhO0FBQ2hDLGNBQU1DLFVBQVU5QixVQUFTOU8sWUFBWWlELE1BQU07QUFDM0MsWUFBSSxDQUFDMk4sV0FBV0EsUUFBUXJSLFFBQVFpUCxjQUFjLE9BQU87QUFDbkQ7UUFDRjtBQUVBLGNBQU1xQyxlQUFlN1gsTUFBTTZYLGFBQVk7QUFDdkMsY0FBTUMsZUFBZUQsYUFBYXpWLFNBQVN3VixRQUFRM0IsS0FBSztBQUN4RCxZQUNFNEIsYUFBYXpWLFNBQVN3VixRQUFRdFIsUUFBUSxLQUNyQ3NSLFFBQVFyUixRQUFRaVAsY0FBYyxZQUFZLENBQUNzQyxnQkFDM0NGLFFBQVFyUixRQUFRaVAsY0FBYyxhQUFhc0MsY0FDNUM7QUFDQTtRQUNGO0FBR0EsWUFBSUYsUUFBUTNCLE1BQU16YSxTQUFTd0UsTUFBTTNCLE1BQU0sTUFBTzJCLE1BQU1NLFNBQVMsV0FBV04sTUFBTTdJLFFBQVE2YyxhQUFZLHFDQUFxQy9OLEtBQUtqRyxNQUFNM0IsT0FBTzRLLE9BQU8sSUFBSTtBQUNsSztRQUNGO0FBRUEsY0FBTXZILGdCQUFnQjtVQUFFQSxlQUFla1csUUFBUXRSOztBQUUvQyxZQUFJdEcsTUFBTU0sU0FBUyxTQUFTO0FBQzFCb0Isd0JBQWNzSCxhQUFhaEo7UUFDN0I7QUFFQTRYLGdCQUFRckIsY0FBYzdVLGFBQWE7TUFDckM7SUFDRjtJQUVBLE9BQU9xVyxzQkFBc0IvWCxPQUFPO0FBSWxDLFlBQU1nWSxVQUFVLGtCQUFrQi9SLEtBQUtqRyxNQUFNM0IsT0FBTzRLLE9BQU87QUFDM0QsWUFBTWdQLGdCQUFnQmpZLE1BQU03SSxRQUFRNGM7QUFDcEMsWUFBTW1FLGtCQUFrQixDQUFDakUsZ0JBQWNDLGdCQUFjLEVBQUU5UixTQUFTcEMsTUFBTTdJLEdBQUc7QUFFekUsVUFBSSxDQUFDK2dCLG1CQUFtQixDQUFDRCxlQUFlO0FBQ3RDO01BQ0Y7QUFFQSxVQUFJRCxXQUFXLENBQUNDLGVBQWU7QUFDN0I7TUFDRjtBQUVBalksWUFBTXVELGVBQWM7QUFHcEIsWUFBTTRVLGtCQUFrQixLQUFLcFEsUUFBUStCLHNCQUFvQixJQUN2RCxPQUNDckMsZUFBZVMsS0FBSyxNQUFNNEIsc0JBQW9CLEVBQUUsQ0FBQyxLQUNoRHJDLGVBQWVZLEtBQUssTUFBTXlCLHNCQUFvQixFQUFFLENBQUMsS0FDakRyQyxlQUFlRyxRQUFRa0Msd0JBQXNCOUosTUFBTUUsZUFBZS9FLFVBQVU7QUFFaEYsWUFBTS9ELFdBQVcwZSxVQUFTN08sb0JBQW9Ca1IsZUFBZTtBQUU3RCxVQUFJRCxpQkFBaUI7QUFDbkJsWSxjQUFNb1ksZ0JBQWU7QUFDckJoaEIsaUJBQVM0YixLQUFJO0FBQ2I1YixpQkFBU3FnQixnQkFBZ0J6WCxLQUFLO0FBQzlCO01BQ0Y7QUFFQSxVQUFJNUksU0FBUzBiLFNBQVEsR0FBSTtBQUN2QjlTLGNBQU1vWSxnQkFBZTtBQUNyQmhoQixpQkFBUzJiLEtBQUk7QUFDYm9GLHdCQUFnQjdCLE1BQUs7TUFDdkI7SUFDRjtFQUNGO0FBTUFsVyxlQUFhaUMsR0FBRzdJLFVBQVU0YSx3QkFBd0J0Syx3QkFBc0JnTSxTQUFTaUMscUJBQXFCO0FBQ3RHM1gsZUFBYWlDLEdBQUc3SSxVQUFVNGEsd0JBQXdCUSxlQUFla0IsU0FBU2lDLHFCQUFxQjtBQUMvRjNYLGVBQWFpQyxHQUFHN0ksVUFBVXVRLHdCQUFzQitMLFNBQVM0QixVQUFVO0FBQ25FdFgsZUFBYWlDLEdBQUc3SSxVQUFVNmEsc0JBQXNCeUIsU0FBUzRCLFVBQVU7QUFDbkV0WCxlQUFhaUMsR0FBRzdJLFVBQVV1USx3QkFBc0JELHdCQUFzQixTQUFVOUosT0FBTztBQUNyRkEsVUFBTXVELGVBQWM7QUFDcEJ1UyxhQUFTN08sb0JBQW9CLElBQUksRUFBRWdELE9BQU07RUFDM0MsQ0FBQztBQU1Eak4scUJBQW1COFksUUFBUTtBQ25iM0IsTUFBTTFZLFNBQU87QUFDYixNQUFNZ00sb0JBQWtCO0FBQ3hCLE1BQU1DLG9CQUFrQjtBQUN4QixNQUFNZ1Asa0JBQW1CLGdCQUFlamIsTUFBSztBQUU3QyxNQUFNOEgsWUFBVTtJQUNkb1QsV0FBVztJQUNYQyxlQUFlO0lBQ2Z4UixZQUFZO0lBQ1puTSxXQUFXOztJQUNYNGQsYUFBYTs7RUFDZjtBQUVBLE1BQU1yVCxnQkFBYztJQUNsQm1ULFdBQVc7SUFDWEMsZUFBZTtJQUNmeFIsWUFBWTtJQUNabk0sV0FBVztJQUNYNGQsYUFBYTtFQUNmO0FBTUEsTUFBTUMsV0FBTixjQUF1QnhULE9BQU87SUFDNUJVLFlBQVlMLFFBQVE7QUFDbEIsWUFBSztBQUNMLFdBQUtpQixVQUFVLEtBQUtsQixXQUFXQyxNQUFNO0FBQ3JDLFdBQUtvVCxjQUFjO0FBQ25CLFdBQUtwUyxXQUFXO0lBQ2xCOztJQUdBLFdBQVdwQixVQUFVO0FBQ25CLGFBQU9BO0lBQ1Q7SUFFQSxXQUFXQyxjQUFjO0FBQ3ZCLGFBQU9BO0lBQ1Q7SUFFQSxXQUFXL0gsT0FBTztBQUNoQixhQUFPQTtJQUNUOztJQUdBNFYsS0FBS3RXLFVBQVU7QUFDYixVQUFJLENBQUMsS0FBSzZKLFFBQVEzTCxXQUFXO0FBQzNCOEMsZ0JBQVFoQixRQUFRO0FBQ2hCO01BQ0Y7QUFFQSxXQUFLaWMsUUFBTztBQUVaLFlBQU16aEIsVUFBVSxLQUFLMGhCLFlBQVc7QUFDaEMsVUFBSSxLQUFLclMsUUFBUVEsWUFBWTtBQUMzQjVLLGVBQU9qRixPQUFPO01BQ2hCO0FBRUFBLGNBQVFxRSxVQUFVd1EsSUFBSTFDLGlCQUFlO0FBRXJDLFdBQUt3UCxrQkFBa0IsTUFBTTtBQUMzQm5iLGdCQUFRaEIsUUFBUTtNQUNsQixDQUFDO0lBQ0g7SUFFQXFXLEtBQUtyVyxVQUFVO0FBQ2IsVUFBSSxDQUFDLEtBQUs2SixRQUFRM0wsV0FBVztBQUMzQjhDLGdCQUFRaEIsUUFBUTtBQUNoQjtNQUNGO0FBRUEsV0FBS2tjLFlBQVcsRUFBR3JkLFVBQVV6RCxPQUFPdVIsaUJBQWU7QUFFbkQsV0FBS3dQLGtCQUFrQixNQUFNO0FBQzNCLGFBQUtuUyxRQUFPO0FBQ1poSixnQkFBUWhCLFFBQVE7TUFDbEIsQ0FBQztJQUNIO0lBRUFnSyxVQUFVO0FBQ1IsVUFBSSxDQUFDLEtBQUtnUyxhQUFhO0FBQ3JCO01BQ0Y7QUFFQXRZLG1CQUFhQyxJQUFJLEtBQUtpRyxVQUFVK1IsZUFBZTtBQUUvQyxXQUFLL1IsU0FBU3hPLE9BQU07QUFDcEIsV0FBSzRnQixjQUFjO0lBQ3JCOztJQUdBRSxjQUFjO0FBQ1osVUFBSSxDQUFDLEtBQUt0UyxVQUFVO0FBQ2xCLGNBQU13UyxXQUFXdGYsU0FBU3VmLGNBQWMsS0FBSztBQUM3Q0QsaUJBQVNSLFlBQVksS0FBSy9SLFFBQVErUjtBQUNsQyxZQUFJLEtBQUsvUixRQUFRUSxZQUFZO0FBQzNCK1IsbUJBQVN2ZCxVQUFVd1EsSUFBSTNDLGlCQUFlO1FBQ3hDO0FBRUEsYUFBSzlDLFdBQVd3UztNQUNsQjtBQUVBLGFBQU8sS0FBS3hTO0lBQ2Q7SUFFQWQsa0JBQWtCRixRQUFRO0FBRXhCQSxhQUFPa1QsY0FBYy9kLFdBQVc2SyxPQUFPa1QsV0FBVztBQUNsRCxhQUFPbFQ7SUFDVDtJQUVBcVQsVUFBVTtBQUNSLFVBQUksS0FBS0QsYUFBYTtBQUNwQjtNQUNGO0FBRUEsWUFBTXhoQixVQUFVLEtBQUswaEIsWUFBVztBQUNoQyxXQUFLclMsUUFBUWlTLFlBQVlRLE9BQU85aEIsT0FBTztBQUV2Q2tKLG1CQUFhaUMsR0FBR25MLFNBQVNtaEIsaUJBQWlCLE1BQU07QUFDOUMzYSxnQkFBUSxLQUFLNkksUUFBUWdTLGFBQWE7TUFDcEMsQ0FBQztBQUVELFdBQUtHLGNBQWM7SUFDckI7SUFFQUcsa0JBQWtCbmMsVUFBVTtBQUMxQm9CLDZCQUF1QnBCLFVBQVUsS0FBS2tjLFlBQVcsR0FBSSxLQUFLclMsUUFBUVEsVUFBVTtJQUM5RTtFQUNGO0FDcklBLE1BQU0zSixTQUFPO0FBQ2IsTUFBTXFKLGFBQVc7QUFDakIsTUFBTUUsY0FBYSxJQUFHRixVQUFTO0FBQy9CLE1BQU13UyxrQkFBaUIsVUFBU3RTLFdBQVU7QUFDMUMsTUFBTXVTLG9CQUFxQixjQUFhdlMsV0FBVTtBQUVsRCxNQUFNcU4sVUFBVTtBQUNoQixNQUFNbUYsa0JBQWtCO0FBQ3hCLE1BQU1DLG1CQUFtQjtBQUV6QixNQUFNbFUsWUFBVTtJQUNkbVUsV0FBVztJQUNYQyxhQUFhOztFQUNmO0FBRUEsTUFBTW5VLGdCQUFjO0lBQ2xCa1UsV0FBVztJQUNYQyxhQUFhO0VBQ2Y7QUFNQSxNQUFNQyxZQUFOLGNBQXdCdFUsT0FBTztJQUM3QlUsWUFBWUwsUUFBUTtBQUNsQixZQUFLO0FBQ0wsV0FBS2lCLFVBQVUsS0FBS2xCLFdBQVdDLE1BQU07QUFDckMsV0FBS2tVLFlBQVk7QUFDakIsV0FBS0MsdUJBQXVCO0lBQzlCOztJQUdBLFdBQVd2VSxVQUFVO0FBQ25CLGFBQU9BO0lBQ1Q7SUFFQSxXQUFXQyxjQUFjO0FBQ3ZCLGFBQU9BO0lBQ1Q7SUFFQSxXQUFXL0gsT0FBTztBQUNoQixhQUFPQTtJQUNUOztJQUdBc2MsV0FBVztBQUNULFVBQUksS0FBS0YsV0FBVztBQUNsQjtNQUNGO0FBRUEsVUFBSSxLQUFLalQsUUFBUThTLFdBQVc7QUFDMUIsYUFBSzlTLFFBQVErUyxZQUFZaEQsTUFBSztNQUNoQztBQUVBbFcsbUJBQWFDLElBQUk3RyxVQUFVbU4sV0FBUztBQUNwQ3ZHLG1CQUFhaUMsR0FBRzdJLFVBQVV5ZixpQkFBZWpaLFdBQVMsS0FBSzJaLGVBQWUzWixLQUFLLENBQUM7QUFDNUVJLG1CQUFhaUMsR0FBRzdJLFVBQVUwZixtQkFBbUJsWixXQUFTLEtBQUs0WixlQUFlNVosS0FBSyxDQUFDO0FBRWhGLFdBQUt3WixZQUFZO0lBQ25CO0lBRUFLLGFBQWE7QUFDWCxVQUFJLENBQUMsS0FBS0wsV0FBVztBQUNuQjtNQUNGO0FBRUEsV0FBS0EsWUFBWTtBQUNqQnBaLG1CQUFhQyxJQUFJN0csVUFBVW1OLFdBQVM7SUFDdEM7O0lBR0FnVCxlQUFlM1osT0FBTztBQUNwQixZQUFNO1FBQUVzWjtVQUFnQixLQUFLL1M7QUFFN0IsVUFBSXZHLE1BQU0zQixXQUFXN0UsWUFBWXdHLE1BQU0zQixXQUFXaWIsZUFBZUEsWUFBWTlkLFNBQVN3RSxNQUFNM0IsTUFBTSxHQUFHO0FBQ25HO01BQ0Y7QUFFQSxZQUFNeWIsV0FBV3JTLGVBQWVjLGtCQUFrQitRLFdBQVc7QUFFN0QsVUFBSVEsU0FBU3BmLFdBQVcsR0FBRztBQUN6QjRlLG9CQUFZaEQsTUFBSztNQUNuQixXQUFXLEtBQUttRCx5QkFBeUJMLGtCQUFrQjtBQUN6RFUsaUJBQVNBLFNBQVNwZixTQUFTLENBQUMsRUFBRTRiLE1BQUs7TUFDckMsT0FBTztBQUNMd0QsaUJBQVMsQ0FBQyxFQUFFeEQsTUFBSztNQUNuQjtJQUNGO0lBRUFzRCxlQUFlNVosT0FBTztBQUNwQixVQUFJQSxNQUFNN0ksUUFBUTZjLFNBQVM7QUFDekI7TUFDRjtBQUVBLFdBQUt5Rix1QkFBdUJ6WixNQUFNK1osV0FBV1gsbUJBQW1CRDtJQUNsRTtFQUNGO0FDakdBLE1BQU1hLHlCQUF5QjtBQUMvQixNQUFNQywwQkFBMEI7QUFDaEMsTUFBTUMsbUJBQW1CO0FBQ3pCLE1BQU1DLGtCQUFrQjtBQU14QixNQUFNQyxrQkFBTixNQUFzQjtJQUNwQnpVLGNBQWM7QUFDWixXQUFLVyxXQUFXOU0sU0FBUytDO0lBQzNCOztJQUdBOGQsV0FBVztBQUVULFlBQU1DLGdCQUFnQjlnQixTQUFTcUMsZ0JBQWdCMGU7QUFDL0MsYUFBT2xoQixLQUFLd1MsSUFBSXhULE9BQU9taUIsYUFBYUYsYUFBYTtJQUNuRDtJQUVBdkgsT0FBTztBQUNMLFlBQU0wSCxRQUFRLEtBQUtKLFNBQVE7QUFDM0IsV0FBS0ssaUJBQWdCO0FBRXJCLFdBQUtDLHNCQUFzQixLQUFLclUsVUFBVTRULGtCQUFrQlUscUJBQW1CQSxrQkFBa0JILEtBQUs7QUFFdEcsV0FBS0Usc0JBQXNCWCx3QkFBd0JFLGtCQUFrQlUscUJBQW1CQSxrQkFBa0JILEtBQUs7QUFDL0csV0FBS0Usc0JBQXNCVix5QkFBeUJFLGlCQUFpQlMscUJBQW1CQSxrQkFBa0JILEtBQUs7SUFDakg7SUFFQUksUUFBUTtBQUNOLFdBQUtDLHdCQUF3QixLQUFLeFUsVUFBVSxVQUFVO0FBQ3RELFdBQUt3VSx3QkFBd0IsS0FBS3hVLFVBQVU0VCxnQkFBZ0I7QUFDNUQsV0FBS1ksd0JBQXdCZCx3QkFBd0JFLGdCQUFnQjtBQUNyRSxXQUFLWSx3QkFBd0JiLHlCQUF5QkUsZUFBZTtJQUN2RTtJQUVBWSxnQkFBZ0I7QUFDZCxhQUFPLEtBQUtWLFNBQVEsSUFBSztJQUMzQjs7SUFHQUssbUJBQW1CO0FBQ2pCLFdBQUtNLHNCQUFzQixLQUFLMVUsVUFBVSxVQUFVO0FBQ3BELFdBQUtBLFNBQVNpTixNQUFNMEgsV0FBVztJQUNqQztJQUVBTixzQkFBc0J2aUIsVUFBVThpQixlQUFleGUsVUFBVTtBQUN2RCxZQUFNeWUsaUJBQWlCLEtBQUtkLFNBQVE7QUFDcEMsWUFBTWUsdUJBQXVCbGtCLGFBQVc7QUFDdEMsWUFBSUEsWUFBWSxLQUFLb1AsWUFBWWpPLE9BQU9taUIsYUFBYXRqQixRQUFRcWpCLGNBQWNZLGdCQUFnQjtBQUN6RjtRQUNGO0FBRUEsYUFBS0gsc0JBQXNCOWpCLFNBQVNna0IsYUFBYTtBQUNqRCxjQUFNTixrQkFBa0J2aUIsT0FBT3dCLGlCQUFpQjNDLE9BQU8sRUFBRTZELGlCQUFpQm1nQixhQUFhO0FBQ3ZGaGtCLGdCQUFRcWMsTUFBTThILFlBQVlILGVBQWdCLEdBQUV4ZSxTQUFTM0MsT0FBT0MsV0FBVzRnQixlQUFlLENBQUMsQ0FBRSxJQUFHOztBQUc5RixXQUFLVSwyQkFBMkJsakIsVUFBVWdqQixvQkFBb0I7SUFDaEU7SUFFQUosc0JBQXNCOWpCLFNBQVNna0IsZUFBZTtBQUM1QyxZQUFNSyxjQUFjcmtCLFFBQVFxYyxNQUFNeFksaUJBQWlCbWdCLGFBQWE7QUFDaEUsVUFBSUssYUFBYTtBQUNmblgsb0JBQVlDLGlCQUFpQm5OLFNBQVNna0IsZUFBZUssV0FBVztNQUNsRTtJQUNGO0lBRUFULHdCQUF3QjFpQixVQUFVOGlCLGVBQWU7QUFDL0MsWUFBTUUsdUJBQXVCbGtCLGFBQVc7QUFDdEMsY0FBTXdNLFFBQVFVLFlBQVlZLGlCQUFpQjlOLFNBQVNna0IsYUFBYTtBQUVqRSxZQUFJeFgsVUFBVSxNQUFNO0FBQ2xCeE0sa0JBQVFxYyxNQUFNaUksZUFBZU4sYUFBYTtBQUMxQztRQUNGO0FBRUE5VyxvQkFBWUcsb0JBQW9Cck4sU0FBU2drQixhQUFhO0FBQ3REaGtCLGdCQUFRcWMsTUFBTThILFlBQVlILGVBQWV4WCxLQUFLOztBQUdoRCxXQUFLNFgsMkJBQTJCbGpCLFVBQVVnakIsb0JBQW9CO0lBQ2hFO0lBRUFFLDJCQUEyQmxqQixVQUFVcWpCLFVBQVU7QUFDN0MsVUFBSW5oQixXQUFVbEMsUUFBUSxHQUFHO0FBQ3ZCcWpCLGlCQUFTcmpCLFFBQVE7QUFDakI7TUFDRjtBQUVBLGlCQUFXbVAsT0FBT0UsZUFBZXhHLEtBQUs3SSxVQUFVLEtBQUtrTyxRQUFRLEdBQUc7QUFDOURtVixpQkFBU2xVLEdBQUc7TUFDZDtJQUNGO0VBQ0Y7QUN6RkEsTUFBTW5LLFNBQU87QUFDYixNQUFNcUosYUFBVztBQUNqQixNQUFNRSxjQUFhLElBQUdGLFVBQVM7QUFDL0IsTUFBTW1ELGlCQUFlO0FBQ3JCLE1BQU1tSyxlQUFhO0FBRW5CLE1BQU1yQyxlQUFjLE9BQU0vSyxXQUFVO0FBQ3BDLE1BQU0rVSx5QkFBd0IsZ0JBQWUvVSxXQUFVO0FBQ3ZELE1BQU1nTCxpQkFBZ0IsU0FBUWhMLFdBQVU7QUFDeEMsTUFBTTZLLGVBQWMsT0FBTTdLLFdBQVU7QUFDcEMsTUFBTThLLGdCQUFlLFFBQU85SyxXQUFVO0FBQ3RDLE1BQU1nVixpQkFBZ0IsU0FBUWhWLFdBQVU7QUFDeEMsTUFBTWlWLHNCQUF1QixnQkFBZWpWLFdBQVU7QUFDdEQsTUFBTWtWLDBCQUEyQixvQkFBbUJsVixXQUFVO0FBQzlELE1BQU1tViwwQkFBeUIsa0JBQWlCblYsV0FBVTtBQUMxRCxNQUFNb0QseUJBQXdCLFFBQU9wRCxXQUFVLEdBQUVpRCxjQUFhO0FBRTlELE1BQU1tUyxrQkFBa0I7QUFDeEIsTUFBTTNTLG9CQUFrQjtBQUN4QixNQUFNQyxvQkFBa0I7QUFDeEIsTUFBTTJTLG9CQUFvQjtBQUUxQixNQUFNQyxrQkFBZ0I7QUFDdEIsTUFBTUMsa0JBQWtCO0FBQ3hCLE1BQU1DLHNCQUFzQjtBQUM1QixNQUFNclMseUJBQXVCO0FBRTdCLE1BQU01RSxZQUFVO0lBQ2Q0VCxVQUFVO0lBQ1Z4QyxPQUFPO0lBQ1B0SSxVQUFVO0VBQ1o7QUFFQSxNQUFNN0ksZ0JBQWM7SUFDbEIyVCxVQUFVO0lBQ1Z4QyxPQUFPO0lBQ1B0SSxVQUFVO0VBQ1o7QUFNQSxNQUFNb08sUUFBTixNQUFNQSxlQUFjL1YsY0FBYztJQUNoQ1YsWUFBWXpPLFNBQVNvTyxRQUFRO0FBQzNCLFlBQU1wTyxTQUFTb08sTUFBTTtBQUVyQixXQUFLK1csVUFBVTVVLGVBQWVHLFFBQVFzVSxpQkFBaUIsS0FBSzVWLFFBQVE7QUFDcEUsV0FBS2dXLFlBQVksS0FBS0Msb0JBQW1CO0FBQ3pDLFdBQUtDLGFBQWEsS0FBS0MscUJBQW9CO0FBQzNDLFdBQUszSixXQUFXO0FBQ2hCLFdBQUtSLG1CQUFtQjtBQUN4QixXQUFLb0ssYUFBYSxJQUFJdEMsZ0JBQWU7QUFFckMsV0FBS3hMLG1CQUFrQjtJQUN6Qjs7SUFHQSxXQUFXMUosVUFBVTtBQUNuQixhQUFPQTtJQUNUO0lBRUEsV0FBV0MsY0FBYztBQUN2QixhQUFPQTtJQUNUO0lBRUEsV0FBVy9ILE9BQU87QUFDaEIsYUFBT0E7SUFDVDs7SUFHQTZNLE9BQU92SSxlQUFlO0FBQ3BCLGFBQU8sS0FBS29SLFdBQVcsS0FBS0MsS0FBSSxJQUFLLEtBQUtDLEtBQUt0UixhQUFhO0lBQzlEO0lBRUFzUixLQUFLdFIsZUFBZTtBQUNsQixVQUFJLEtBQUtvUixZQUFZLEtBQUtSLGtCQUFrQjtBQUMxQztNQUNGO0FBRUEsWUFBTThELFlBQVloVyxhQUFheUMsUUFBUSxLQUFLeUQsVUFBVWtMLGNBQVk7UUFDaEU5UDtNQUNGLENBQUM7QUFFRCxVQUFJMFUsVUFBVW5ULGtCQUFrQjtBQUM5QjtNQUNGO0FBRUEsV0FBSzZQLFdBQVc7QUFDaEIsV0FBS1IsbUJBQW1CO0FBRXhCLFdBQUtvSyxXQUFXM0osS0FBSTtBQUVwQnZaLGVBQVMrQyxLQUFLaEIsVUFBVXdRLElBQUlnUSxlQUFlO0FBRTNDLFdBQUtZLGNBQWE7QUFFbEIsV0FBS0wsVUFBVXRKLEtBQUssTUFBTSxLQUFLNEosYUFBYWxiLGFBQWEsQ0FBQztJQUM1RDtJQUVBcVIsT0FBTztBQUNMLFVBQUksQ0FBQyxLQUFLRCxZQUFZLEtBQUtSLGtCQUFrQjtBQUMzQztNQUNGO0FBRUEsWUFBTW9FLFlBQVl0VyxhQUFheUMsUUFBUSxLQUFLeUQsVUFBVW9MLFlBQVU7QUFFaEUsVUFBSWdGLFVBQVV6VCxrQkFBa0I7QUFDOUI7TUFDRjtBQUVBLFdBQUs2UCxXQUFXO0FBQ2hCLFdBQUtSLG1CQUFtQjtBQUN4QixXQUFLa0ssV0FBVzNDLFdBQVU7QUFFMUIsV0FBS3ZULFNBQVMvSyxVQUFVekQsT0FBT3VSLGlCQUFlO0FBRTlDLFdBQUt2QyxlQUFlLE1BQU0sS0FBSytWLFdBQVUsR0FBSSxLQUFLdlcsVUFBVSxLQUFLNkssWUFBVyxDQUFFO0lBQ2hGO0lBRUF6SyxVQUFVO0FBQ1J0RyxtQkFBYUMsSUFBSWhJLFFBQVFzTyxXQUFTO0FBQ2xDdkcsbUJBQWFDLElBQUksS0FBS2djLFNBQVMxVixXQUFTO0FBRXhDLFdBQUsyVixVQUFVNVYsUUFBTztBQUN0QixXQUFLOFYsV0FBVzNDLFdBQVU7QUFFMUIsWUFBTW5ULFFBQU87SUFDZjtJQUVBb1csZUFBZTtBQUNiLFdBQUtILGNBQWE7SUFDcEI7O0lBR0FKLHNCQUFzQjtBQUNwQixhQUFPLElBQUk5RCxTQUFTO1FBQ2xCN2QsV0FBV2tILFFBQVEsS0FBS3lFLFFBQVF1UyxRQUFROztRQUN4Qy9SLFlBQVksS0FBS29LLFlBQVc7TUFDOUIsQ0FBQztJQUNIO0lBRUFzTCx1QkFBdUI7QUFDckIsYUFBTyxJQUFJbEQsVUFBVTtRQUNuQkQsYUFBYSxLQUFLaFQ7TUFDcEIsQ0FBQztJQUNIO0lBRUFzVyxhQUFhbGIsZUFBZTtBQUUxQixVQUFJLENBQUNsSSxTQUFTK0MsS0FBS2YsU0FBUyxLQUFLOEssUUFBUSxHQUFHO0FBQzFDOU0saUJBQVMrQyxLQUFLeWMsT0FBTyxLQUFLMVMsUUFBUTtNQUNwQztBQUVBLFdBQUtBLFNBQVNpTixNQUFNbUMsVUFBVTtBQUM5QixXQUFLcFAsU0FBUzlCLGdCQUFnQixhQUFhO0FBQzNDLFdBQUs4QixTQUFTaEMsYUFBYSxjQUFjLElBQUk7QUFDN0MsV0FBS2dDLFNBQVNoQyxhQUFhLFFBQVEsUUFBUTtBQUMzQyxXQUFLZ0MsU0FBU3lXLFlBQVk7QUFFMUIsWUFBTUMsWUFBWXZWLGVBQWVHLFFBQVF1VSxxQkFBcUIsS0FBS0UsT0FBTztBQUMxRSxVQUFJVyxXQUFXO0FBQ2JBLGtCQUFVRCxZQUFZO01BQ3hCO0FBRUE1Z0IsYUFBTyxLQUFLbUssUUFBUTtBQUVwQixXQUFLQSxTQUFTL0ssVUFBVXdRLElBQUkxQyxpQkFBZTtBQUUzQyxZQUFNNFQscUJBQXFCQSxNQUFNO0FBQy9CLFlBQUksS0FBSzFXLFFBQVErUCxPQUFPO0FBQ3RCLGVBQUtrRyxXQUFXOUMsU0FBUTtRQUMxQjtBQUVBLGFBQUtwSCxtQkFBbUI7QUFDeEJsUyxxQkFBYXlDLFFBQVEsS0FBS3lELFVBQVVtTCxlQUFhO1VBQy9DL1A7UUFDRixDQUFDOztBQUdILFdBQUtvRixlQUFlbVcsb0JBQW9CLEtBQUtaLFNBQVMsS0FBS2xMLFlBQVcsQ0FBRTtJQUMxRTtJQUVBdkMscUJBQXFCO0FBQ25CeE8sbUJBQWFpQyxHQUFHLEtBQUtpRSxVQUFVd1YseUJBQXVCOWIsV0FBUztBQUM3RCxZQUFJQSxNQUFNN0ksUUFBUTRjLGNBQVk7QUFDNUI7UUFDRjtBQUVBLFlBQUksS0FBS3hOLFFBQVF5SCxVQUFVO0FBQ3pCLGVBQUsrRSxLQUFJO0FBQ1Q7UUFDRjtBQUVBLGFBQUttSywyQkFBMEI7TUFDakMsQ0FBQztBQUVEOWMsbUJBQWFpQyxHQUFHaEssUUFBUXNqQixnQkFBYyxNQUFNO0FBQzFDLFlBQUksS0FBSzdJLFlBQVksQ0FBQyxLQUFLUixrQkFBa0I7QUFDM0MsZUFBS3FLLGNBQWE7UUFDcEI7TUFDRixDQUFDO0FBRUR2YyxtQkFBYWlDLEdBQUcsS0FBS2lFLFVBQVV1Vix5QkFBeUI3YixXQUFTO0FBRS9ESSxxQkFBYWtDLElBQUksS0FBS2dFLFVBQVVzVixxQkFBcUJ1QixZQUFVO0FBQzdELGNBQUksS0FBSzdXLGFBQWF0RyxNQUFNM0IsVUFBVSxLQUFLaUksYUFBYTZXLE9BQU85ZSxRQUFRO0FBQ3JFO1VBQ0Y7QUFFQSxjQUFJLEtBQUtrSSxRQUFRdVMsYUFBYSxVQUFVO0FBQ3RDLGlCQUFLb0UsMkJBQTBCO0FBQy9CO1VBQ0Y7QUFFQSxjQUFJLEtBQUszVyxRQUFRdVMsVUFBVTtBQUN6QixpQkFBSy9GLEtBQUk7VUFDWDtRQUNGLENBQUM7TUFDSCxDQUFDO0lBQ0g7SUFFQThKLGFBQWE7QUFDWCxXQUFLdlcsU0FBU2lOLE1BQU1tQyxVQUFVO0FBQzlCLFdBQUtwUCxTQUFTaEMsYUFBYSxlQUFlLElBQUk7QUFDOUMsV0FBS2dDLFNBQVM5QixnQkFBZ0IsWUFBWTtBQUMxQyxXQUFLOEIsU0FBUzlCLGdCQUFnQixNQUFNO0FBQ3BDLFdBQUs4TixtQkFBbUI7QUFFeEIsV0FBS2dLLFVBQVV2SixLQUFLLE1BQU07QUFDeEJ2WixpQkFBUytDLEtBQUtoQixVQUFVekQsT0FBT2lrQixlQUFlO0FBQzlDLGFBQUtxQixrQkFBaUI7QUFDdEIsYUFBS1YsV0FBVzdCLE1BQUs7QUFDckJ6YSxxQkFBYXlDLFFBQVEsS0FBS3lELFVBQVVxTCxjQUFZO01BQ2xELENBQUM7SUFDSDtJQUVBUixjQUFjO0FBQ1osYUFBTyxLQUFLN0ssU0FBUy9LLFVBQVVDLFNBQVM0TixpQkFBZTtJQUN6RDtJQUVBOFQsNkJBQTZCO0FBQzNCLFlBQU14RyxZQUFZdFcsYUFBYXlDLFFBQVEsS0FBS3lELFVBQVVvVixzQkFBb0I7QUFDMUUsVUFBSWhGLFVBQVV6VCxrQkFBa0I7QUFDOUI7TUFDRjtBQUVBLFlBQU1vYSxxQkFBcUIsS0FBSy9XLFNBQVNnWCxlQUFlOWpCLFNBQVNxQyxnQkFBZ0IwaEI7QUFDakYsWUFBTUMsbUJBQW1CLEtBQUtsWCxTQUFTaU4sTUFBTWtLO0FBRTdDLFVBQUlELHFCQUFxQixZQUFZLEtBQUtsWCxTQUFTL0ssVUFBVUMsU0FBU3dnQixpQkFBaUIsR0FBRztBQUN4RjtNQUNGO0FBRUEsVUFBSSxDQUFDcUIsb0JBQW9CO0FBQ3ZCLGFBQUsvVyxTQUFTaU4sTUFBTWtLLFlBQVk7TUFDbEM7QUFFQSxXQUFLblgsU0FBUy9LLFVBQVV3USxJQUFJaVEsaUJBQWlCO0FBQzdDLFdBQUtsVixlQUFlLE1BQU07QUFDeEIsYUFBS1IsU0FBUy9LLFVBQVV6RCxPQUFPa2tCLGlCQUFpQjtBQUNoRCxhQUFLbFYsZUFBZSxNQUFNO0FBQ3hCLGVBQUtSLFNBQVNpTixNQUFNa0ssWUFBWUQ7UUFDbEMsR0FBRyxLQUFLbkIsT0FBTztNQUNqQixHQUFHLEtBQUtBLE9BQU87QUFFZixXQUFLL1YsU0FBU2dRLE1BQUs7SUFDckI7Ozs7SUFNQXFHLGdCQUFnQjtBQUNkLFlBQU1VLHFCQUFxQixLQUFLL1csU0FBU2dYLGVBQWU5akIsU0FBU3FDLGdCQUFnQjBoQjtBQUNqRixZQUFNcEMsaUJBQWlCLEtBQUt1QixXQUFXckMsU0FBUTtBQUMvQyxZQUFNcUQsb0JBQW9CdkMsaUJBQWlCO0FBRTNDLFVBQUl1QyxxQkFBcUIsQ0FBQ0wsb0JBQW9CO0FBQzVDLGNBQU14WCxXQUFXL0ksTUFBSyxJQUFLLGdCQUFnQjtBQUMzQyxhQUFLd0osU0FBU2lOLE1BQU0xTixRQUFRLElBQUssR0FBRXNWLGNBQWU7TUFDcEQ7QUFFQSxVQUFJLENBQUN1QyxxQkFBcUJMLG9CQUFvQjtBQUM1QyxjQUFNeFgsV0FBVy9JLE1BQUssSUFBSyxpQkFBaUI7QUFDNUMsYUFBS3dKLFNBQVNpTixNQUFNMU4sUUFBUSxJQUFLLEdBQUVzVixjQUFlO01BQ3BEO0lBQ0Y7SUFFQWlDLG9CQUFvQjtBQUNsQixXQUFLOVcsU0FBU2lOLE1BQU1vSyxjQUFjO0FBQ2xDLFdBQUtyWCxTQUFTaU4sTUFBTXFLLGVBQWU7SUFDckM7O0lBR0EsT0FBT3JnQixnQkFBZ0IrSCxRQUFRNUQsZUFBZTtBQUM1QyxhQUFPLEtBQUtnSSxLQUFLLFdBQVk7QUFDM0IsY0FBTUMsT0FBT3lTLE9BQU1uVixvQkFBb0IsTUFBTTNCLE1BQU07QUFFbkQsWUFBSSxPQUFPQSxXQUFXLFVBQVU7QUFDOUI7UUFDRjtBQUVBLFlBQUksT0FBT3FFLEtBQUtyRSxNQUFNLE1BQU0sYUFBYTtBQUN2QyxnQkFBTSxJQUFJWSxVQUFXLG9CQUFtQlosTUFBTyxHQUFFO1FBQ25EO0FBRUFxRSxhQUFLckUsTUFBTSxFQUFFNUQsYUFBYTtNQUM1QixDQUFDO0lBQ0g7RUFDRjtBQU1BdEIsZUFBYWlDLEdBQUc3SSxVQUFVdVEsd0JBQXNCRCx3QkFBc0IsU0FBVTlKLE9BQU87QUFDckYsVUFBTTNCLFNBQVNvSixlQUFla0IsdUJBQXVCLElBQUk7QUFFekQsUUFBSSxDQUFDLEtBQUssTUFBTSxFQUFFdkcsU0FBUyxLQUFLNkcsT0FBTyxHQUFHO0FBQ3hDakosWUFBTXVELGVBQWM7SUFDdEI7QUFFQW5ELGlCQUFha0MsSUFBSWpFLFFBQVFtVCxjQUFZNEUsZUFBYTtBQUNoRCxVQUFJQSxVQUFVblQsa0JBQWtCO0FBRTlCO01BQ0Y7QUFFQTdDLG1CQUFha0MsSUFBSWpFLFFBQVFzVCxnQkFBYyxNQUFNO0FBQzNDLFlBQUkvVyxVQUFVLElBQUksR0FBRztBQUNuQixlQUFLMGIsTUFBSztRQUNaO01BQ0YsQ0FBQztJQUNILENBQUM7QUFHRCxVQUFNdUgsY0FBY3BXLGVBQWVHLFFBQVFxVSxlQUFhO0FBQ3hELFFBQUk0QixhQUFhO0FBQ2Z6QixZQUFNcFYsWUFBWTZXLFdBQVcsRUFBRTlLLEtBQUk7SUFDckM7QUFFQSxVQUFNcEosT0FBT3lTLE1BQU1uVixvQkFBb0I1SSxNQUFNO0FBRTdDc0wsU0FBS00sT0FBTyxJQUFJO0VBQ2xCLENBQUM7QUFFRHBCLHVCQUFxQnVULEtBQUs7QUFNMUJwZixxQkFBbUJvZixLQUFLO0FDL1Z4QixNQUFNaGYsU0FBTztBQUNiLE1BQU1xSixhQUFXO0FBQ2pCLE1BQU1FLGNBQWEsSUFBR0YsVUFBUztBQUMvQixNQUFNbUQsaUJBQWU7QUFDckIsTUFBTW9ELHdCQUF1QixPQUFNckcsV0FBVSxHQUFFaUQsY0FBYTtBQUM1RCxNQUFNbUssYUFBYTtBQUVuQixNQUFNMUssb0JBQWtCO0FBQ3hCLE1BQU15VSx1QkFBcUI7QUFDM0IsTUFBTUMsb0JBQW9CO0FBQzFCLE1BQU1DLHNCQUFzQjtBQUM1QixNQUFNL0IsZ0JBQWdCO0FBRXRCLE1BQU16SyxlQUFjLE9BQU03SyxXQUFVO0FBQ3BDLE1BQU04SyxnQkFBZSxRQUFPOUssV0FBVTtBQUN0QyxNQUFNK0ssZUFBYyxPQUFNL0ssV0FBVTtBQUNwQyxNQUFNK1UsdUJBQXdCLGdCQUFlL1UsV0FBVTtBQUN2RCxNQUFNZ0wsaUJBQWdCLFNBQVFoTCxXQUFVO0FBQ3hDLE1BQU1nVixlQUFnQixTQUFRaFYsV0FBVTtBQUN4QyxNQUFNb0QseUJBQXdCLFFBQU9wRCxXQUFVLEdBQUVpRCxjQUFhO0FBQzlELE1BQU1rUyx3QkFBeUIsa0JBQWlCblYsV0FBVTtBQUUxRCxNQUFNbUQseUJBQXVCO0FBRTdCLE1BQU01RSxZQUFVO0lBQ2Q0VCxVQUFVO0lBQ1Y5SyxVQUFVO0lBQ1ZpUSxRQUFRO0VBQ1Y7QUFFQSxNQUFNOVksZ0JBQWM7SUFDbEIyVCxVQUFVO0lBQ1Y5SyxVQUFVO0lBQ1ZpUSxRQUFRO0VBQ1Y7QUFNQSxNQUFNQyxZQUFOLE1BQU1BLG1CQUFrQjdYLGNBQWM7SUFDcENWLFlBQVl6TyxTQUFTb08sUUFBUTtBQUMzQixZQUFNcE8sU0FBU29PLE1BQU07QUFFckIsV0FBS3dOLFdBQVc7QUFDaEIsV0FBS3dKLFlBQVksS0FBS0Msb0JBQW1CO0FBQ3pDLFdBQUtDLGFBQWEsS0FBS0MscUJBQW9CO0FBQzNDLFdBQUs3TixtQkFBa0I7SUFDekI7O0lBR0EsV0FBVzFKLFVBQVU7QUFDbkIsYUFBT0E7SUFDVDtJQUVBLFdBQVdDLGNBQWM7QUFDdkIsYUFBT0E7SUFDVDtJQUVBLFdBQVcvSCxPQUFPO0FBQ2hCLGFBQU9BO0lBQ1Q7O0lBR0E2TSxPQUFPdkksZUFBZTtBQUNwQixhQUFPLEtBQUtvUixXQUFXLEtBQUtDLEtBQUksSUFBSyxLQUFLQyxLQUFLdFIsYUFBYTtJQUM5RDtJQUVBc1IsS0FBS3RSLGVBQWU7QUFDbEIsVUFBSSxLQUFLb1IsVUFBVTtBQUNqQjtNQUNGO0FBRUEsWUFBTXNELFlBQVloVyxhQUFheUMsUUFBUSxLQUFLeUQsVUFBVWtMLGNBQVk7UUFBRTlQO01BQWMsQ0FBQztBQUVuRixVQUFJMFUsVUFBVW5ULGtCQUFrQjtBQUM5QjtNQUNGO0FBRUEsV0FBSzZQLFdBQVc7QUFDaEIsV0FBS3dKLFVBQVV0SixLQUFJO0FBRW5CLFVBQUksQ0FBQyxLQUFLek0sUUFBUTBYLFFBQVE7QUFDeEIsWUFBSTdELGdCQUFlLEVBQUdySCxLQUFJO01BQzVCO0FBRUEsV0FBS3pNLFNBQVNoQyxhQUFhLGNBQWMsSUFBSTtBQUM3QyxXQUFLZ0MsU0FBU2hDLGFBQWEsUUFBUSxRQUFRO0FBQzNDLFdBQUtnQyxTQUFTL0ssVUFBVXdRLElBQUkrUixvQkFBa0I7QUFFOUMsWUFBTTVNLG1CQUFtQkEsTUFBTTtBQUM3QixZQUFJLENBQUMsS0FBSzNLLFFBQVEwWCxVQUFVLEtBQUsxWCxRQUFRdVMsVUFBVTtBQUNqRCxlQUFLMEQsV0FBVzlDLFNBQVE7UUFDMUI7QUFFQSxhQUFLcFQsU0FBUy9LLFVBQVV3USxJQUFJMUMsaUJBQWU7QUFDM0MsYUFBSy9DLFNBQVMvSyxVQUFVekQsT0FBT2dtQixvQkFBa0I7QUFDakQxZCxxQkFBYXlDLFFBQVEsS0FBS3lELFVBQVVtTCxlQUFhO1VBQUUvUDtRQUFjLENBQUM7O0FBR3BFLFdBQUtvRixlQUFlb0ssa0JBQWtCLEtBQUs1SyxVQUFVLElBQUk7SUFDM0Q7SUFFQXlNLE9BQU87QUFDTCxVQUFJLENBQUMsS0FBS0QsVUFBVTtBQUNsQjtNQUNGO0FBRUEsWUFBTTRELFlBQVl0VyxhQUFheUMsUUFBUSxLQUFLeUQsVUFBVW9MLFlBQVU7QUFFaEUsVUFBSWdGLFVBQVV6VCxrQkFBa0I7QUFDOUI7TUFDRjtBQUVBLFdBQUt1WixXQUFXM0MsV0FBVTtBQUMxQixXQUFLdlQsU0FBUzZYLEtBQUk7QUFDbEIsV0FBS3JMLFdBQVc7QUFDaEIsV0FBS3hNLFNBQVMvSyxVQUFVd1EsSUFBSWdTLGlCQUFpQjtBQUM3QyxXQUFLekIsVUFBVXZKLEtBQUk7QUFFbkIsWUFBTXFMLG1CQUFtQkEsTUFBTTtBQUM3QixhQUFLOVgsU0FBUy9LLFVBQVV6RCxPQUFPdVIsbUJBQWlCMFUsaUJBQWlCO0FBQ2pFLGFBQUt6WCxTQUFTOUIsZ0JBQWdCLFlBQVk7QUFDMUMsYUFBSzhCLFNBQVM5QixnQkFBZ0IsTUFBTTtBQUVwQyxZQUFJLENBQUMsS0FBSytCLFFBQVEwWCxRQUFRO0FBQ3hCLGNBQUk3RCxnQkFBZSxFQUFHUyxNQUFLO1FBQzdCO0FBRUF6YSxxQkFBYXlDLFFBQVEsS0FBS3lELFVBQVVxTCxjQUFZOztBQUdsRCxXQUFLN0ssZUFBZXNYLGtCQUFrQixLQUFLOVgsVUFBVSxJQUFJO0lBQzNEO0lBRUFJLFVBQVU7QUFDUixXQUFLNFYsVUFBVTVWLFFBQU87QUFDdEIsV0FBSzhWLFdBQVczQyxXQUFVO0FBQzFCLFlBQU1uVCxRQUFPO0lBQ2Y7O0lBR0E2VixzQkFBc0I7QUFDcEIsWUFBTWhFLGdCQUFnQkEsTUFBTTtBQUMxQixZQUFJLEtBQUtoUyxRQUFRdVMsYUFBYSxVQUFVO0FBQ3RDMVksdUJBQWF5QyxRQUFRLEtBQUt5RCxVQUFVb1Ysb0JBQW9CO0FBQ3hEO1FBQ0Y7QUFFQSxhQUFLM0ksS0FBSTs7QUFJWCxZQUFNblksYUFBWWtILFFBQVEsS0FBS3lFLFFBQVF1UyxRQUFRO0FBRS9DLGFBQU8sSUFBSUwsU0FBUztRQUNsQkgsV0FBVzBGO1FBQ1hwakIsV0FBQUE7UUFDQW1NLFlBQVk7UUFDWnlSLGFBQWEsS0FBS2xTLFNBQVNuTDtRQUMzQm9kLGVBQWUzZCxhQUFZMmQsZ0JBQWdCO01BQzdDLENBQUM7SUFDSDtJQUVBa0UsdUJBQXVCO0FBQ3JCLGFBQU8sSUFBSWxELFVBQVU7UUFDbkJELGFBQWEsS0FBS2hUO01BQ3BCLENBQUM7SUFDSDtJQUVBc0kscUJBQXFCO0FBQ25CeE8sbUJBQWFpQyxHQUFHLEtBQUtpRSxVQUFVd1YsdUJBQXVCOWIsV0FBUztBQUM3RCxZQUFJQSxNQUFNN0ksUUFBUTRjLFlBQVk7QUFDNUI7UUFDRjtBQUVBLFlBQUksS0FBS3hOLFFBQVF5SCxVQUFVO0FBQ3pCLGVBQUsrRSxLQUFJO0FBQ1Q7UUFDRjtBQUVBM1MscUJBQWF5QyxRQUFRLEtBQUt5RCxVQUFVb1Ysb0JBQW9CO01BQzFELENBQUM7SUFDSDs7SUFHQSxPQUFPbmUsZ0JBQWdCK0gsUUFBUTtBQUM3QixhQUFPLEtBQUtvRSxLQUFLLFdBQVk7QUFDM0IsY0FBTUMsT0FBT3VVLFdBQVVqWCxvQkFBb0IsTUFBTTNCLE1BQU07QUFFdkQsWUFBSSxPQUFPQSxXQUFXLFVBQVU7QUFDOUI7UUFDRjtBQUVBLFlBQUlxRSxLQUFLckUsTUFBTSxNQUFNek0sVUFBYXlNLE9BQU83QyxXQUFXLEdBQUcsS0FBSzZDLFdBQVcsZUFBZTtBQUNwRixnQkFBTSxJQUFJWSxVQUFXLG9CQUFtQlosTUFBTyxHQUFFO1FBQ25EO0FBRUFxRSxhQUFLckUsTUFBTSxFQUFFLElBQUk7TUFDbkIsQ0FBQztJQUNIO0VBQ0Y7QUFNQWxGLGVBQWFpQyxHQUFHN0ksVUFBVXVRLHdCQUFzQkQsd0JBQXNCLFNBQVU5SixPQUFPO0FBQ3JGLFVBQU0zQixTQUFTb0osZUFBZWtCLHVCQUF1QixJQUFJO0FBRXpELFFBQUksQ0FBQyxLQUFLLE1BQU0sRUFBRXZHLFNBQVMsS0FBSzZHLE9BQU8sR0FBRztBQUN4Q2pKLFlBQU11RCxlQUFjO0lBQ3RCO0FBRUEsUUFBSW5JLFdBQVcsSUFBSSxHQUFHO0FBQ3BCO0lBQ0Y7QUFFQWdGLGlCQUFha0MsSUFBSWpFLFFBQVFzVCxnQkFBYyxNQUFNO0FBRTNDLFVBQUkvVyxVQUFVLElBQUksR0FBRztBQUNuQixhQUFLMGIsTUFBSztNQUNaO0lBQ0YsQ0FBQztBQUdELFVBQU11SCxjQUFjcFcsZUFBZUcsUUFBUXFVLGFBQWE7QUFDeEQsUUFBSTRCLGVBQWVBLGdCQUFnQnhmLFFBQVE7QUFDekM2ZixnQkFBVWxYLFlBQVk2VyxXQUFXLEVBQUU5SyxLQUFJO0lBQ3pDO0FBRUEsVUFBTXBKLE9BQU91VSxVQUFValgsb0JBQW9CNUksTUFBTTtBQUNqRHNMLFNBQUtNLE9BQU8sSUFBSTtFQUNsQixDQUFDO0FBRUQ3SixlQUFhaUMsR0FBR2hLLFFBQVEyVSx1QkFBcUIsTUFBTTtBQUNqRCxlQUFXNVUsWUFBWXFQLGVBQWV4RyxLQUFLZ2IsYUFBYSxHQUFHO0FBQ3pEaUMsZ0JBQVVqWCxvQkFBb0I3TyxRQUFRLEVBQUU0YSxLQUFJO0lBQzlDO0VBQ0YsQ0FBQztBQUVENVMsZUFBYWlDLEdBQUdoSyxRQUFRc2pCLGNBQWMsTUFBTTtBQUMxQyxlQUFXemtCLFdBQVd1USxlQUFleEcsS0FBSyw4Q0FBOEMsR0FBRztBQUN6RixVQUFJcEgsaUJBQWlCM0MsT0FBTyxFQUFFbW5CLGFBQWEsU0FBUztBQUNsREgsa0JBQVVqWCxvQkFBb0IvUCxPQUFPLEVBQUU2YixLQUFJO01BQzdDO0lBQ0Y7RUFDRixDQUFDO0FBRURsSyx1QkFBcUJxVixTQUFTO0FBTTlCbGhCLHFCQUFtQmtoQixTQUFTO0FDL1E1QixNQUFNSSx5QkFBeUI7QUFFeEIsTUFBTUMsbUJBQW1COztJQUU5QixLQUFLLENBQUMsU0FBUyxPQUFPLE1BQU0sUUFBUSxRQUFRRCxzQkFBc0I7SUFDbEVFLEdBQUcsQ0FBQyxVQUFVLFFBQVEsU0FBUyxLQUFLO0lBQ3BDQyxNQUFNLENBQUE7SUFDTkMsR0FBRyxDQUFBO0lBQ0hDLElBQUksQ0FBQTtJQUNKQyxLQUFLLENBQUE7SUFDTEMsTUFBTSxDQUFBO0lBQ05DLElBQUksQ0FBQTtJQUNKQyxLQUFLLENBQUE7SUFDTEMsSUFBSSxDQUFBO0lBQ0pDLElBQUksQ0FBQTtJQUNKQyxJQUFJLENBQUE7SUFDSkMsSUFBSSxDQUFBO0lBQ0pDLElBQUksQ0FBQTtJQUNKQyxJQUFJLENBQUE7SUFDSkMsSUFBSSxDQUFBO0lBQ0pDLElBQUksQ0FBQTtJQUNKQyxJQUFJLENBQUE7SUFDSkMsSUFBSSxDQUFBO0lBQ0pDLEdBQUcsQ0FBQTtJQUNIM1AsS0FBSyxDQUFDLE9BQU8sVUFBVSxPQUFPLFNBQVMsU0FBUyxRQUFRO0lBQ3hENFAsSUFBSSxDQUFBO0lBQ0pDLElBQUksQ0FBQTtJQUNKQyxHQUFHLENBQUE7SUFDSEMsS0FBSyxDQUFBO0lBQ0xDLEdBQUcsQ0FBQTtJQUNIQyxPQUFPLENBQUE7SUFDUEMsTUFBTSxDQUFBO0lBQ05DLEtBQUssQ0FBQTtJQUNMQyxLQUFLLENBQUE7SUFDTEMsUUFBUSxDQUFBO0lBQ1JDLEdBQUcsQ0FBQTtJQUNIQyxJQUFJLENBQUE7RUFDTjtBQUdBLE1BQU1DLGdCQUFnQixvQkFBSTVnQixJQUFJLENBQzVCLGNBQ0EsUUFDQSxRQUNBLFlBQ0EsWUFDQSxVQUNBLE9BQ0EsWUFBWSxDQUNiO0FBU0QsTUFBTTZnQixtQkFBbUI7QUFFekIsTUFBTUMsbUJBQW1CQSxDQUFDQyxXQUFXQyx5QkFBeUI7QUFDNUQsVUFBTUMsZ0JBQWdCRixVQUFVRyxTQUFTM25CLFlBQVc7QUFFcEQsUUFBSXluQixxQkFBcUJ2ZSxTQUFTd2UsYUFBYSxHQUFHO0FBQ2hELFVBQUlMLGNBQWNscEIsSUFBSXVwQixhQUFhLEdBQUc7QUFDcEMsZUFBTzllLFFBQVEwZSxpQkFBaUJ2YSxLQUFLeWEsVUFBVUksU0FBUyxDQUFDO01BQzNEO0FBRUEsYUFBTztJQUNUO0FBR0EsV0FBT0gscUJBQXFCOWIsT0FBT2tjLG9CQUFrQkEsMEJBQTBCL2EsTUFBTSxFQUNsRmdiLEtBQUtDLFdBQVNBLE1BQU1oYixLQUFLMmEsYUFBYSxDQUFDO0VBQzVDO0FBRU8sV0FBU00sYUFBYUMsWUFBWUMsV0FBV0Msa0JBQWtCO0FBQ3BFLFFBQUksQ0FBQ0YsV0FBV3ptQixRQUFRO0FBQ3RCLGFBQU95bUI7SUFDVDtBQUVBLFFBQUlFLG9CQUFvQixPQUFPQSxxQkFBcUIsWUFBWTtBQUM5RCxhQUFPQSxpQkFBaUJGLFVBQVU7SUFDcEM7QUFFQSxVQUFNRyxZQUFZLElBQUlqcEIsT0FBT2twQixVQUFTO0FBQ3RDLFVBQU1DLGtCQUFrQkYsVUFBVUcsZ0JBQWdCTixZQUFZLFdBQVc7QUFDekUsVUFBTXJILFdBQVcsQ0FBQSxFQUFHcFMsT0FBTyxHQUFHOFosZ0JBQWdCamxCLEtBQUttRSxpQkFBaUIsR0FBRyxDQUFDO0FBRXhFLGVBQVd4SixXQUFXNGlCLFVBQVU7QUFDOUIsWUFBTTRILGNBQWN4cUIsUUFBUTJwQixTQUFTM25CLFlBQVc7QUFFaEQsVUFBSSxDQUFDSixPQUFPakIsS0FBS3VwQixTQUFTLEVBQUVoZixTQUFTc2YsV0FBVyxHQUFHO0FBQ2pEeHFCLGdCQUFRWSxPQUFNO0FBQ2Q7TUFDRjtBQUVBLFlBQU02cEIsZ0JBQWdCLENBQUEsRUFBR2phLE9BQU8sR0FBR3hRLFFBQVF3TixVQUFVO0FBQ3JELFlBQU1rZCxvQkFBb0IsQ0FBQSxFQUFHbGEsT0FBTzBaLFVBQVUsR0FBRyxLQUFLLENBQUEsR0FBSUEsVUFBVU0sV0FBVyxLQUFLLENBQUEsQ0FBRTtBQUV0RixpQkFBV2hCLGFBQWFpQixlQUFlO0FBQ3JDLFlBQUksQ0FBQ2xCLGlCQUFpQkMsV0FBV2tCLGlCQUFpQixHQUFHO0FBQ25EMXFCLGtCQUFRc04sZ0JBQWdCa2MsVUFBVUcsUUFBUTtRQUM1QztNQUNGO0lBQ0Y7QUFFQSxXQUFPVyxnQkFBZ0JqbEIsS0FBS3NsQjtFQUM5QjtBQ3BHQSxNQUFNemtCLFNBQU87QUFFYixNQUFNOEgsWUFBVTtJQUNka2MsV0FBVzdDO0lBQ1h1RCxTQUFTLENBQUE7O0lBQ1RDLFlBQVk7SUFDWkMsTUFBTTtJQUNOQyxVQUFVO0lBQ1ZDLFlBQVk7SUFDWkMsVUFBVTtFQUNaO0FBRUEsTUFBTWhkLGdCQUFjO0lBQ2xCaWMsV0FBVztJQUNYVSxTQUFTO0lBQ1RDLFlBQVk7SUFDWkMsTUFBTTtJQUNOQyxVQUFVO0lBQ1ZDLFlBQVk7SUFDWkMsVUFBVTtFQUNaO0FBRUEsTUFBTUMscUJBQXFCO0lBQ3pCQyxPQUFPO0lBQ1BqcUIsVUFBVTtFQUNaO0FBTUEsTUFBTWtxQixrQkFBTixjQUE4QnJkLE9BQU87SUFDbkNVLFlBQVlMLFFBQVE7QUFDbEIsWUFBSztBQUNMLFdBQUtpQixVQUFVLEtBQUtsQixXQUFXQyxNQUFNO0lBQ3ZDOztJQUdBLFdBQVdKLFVBQVU7QUFDbkIsYUFBT0E7SUFDVDtJQUVBLFdBQVdDLGNBQWM7QUFDdkIsYUFBT0E7SUFDVDtJQUVBLFdBQVcvSCxPQUFPO0FBQ2hCLGFBQU9BO0lBQ1Q7O0lBR0FtbEIsYUFBYTtBQUNYLGFBQU96cEIsT0FBT2tJLE9BQU8sS0FBS3VGLFFBQVF1YixPQUFPLEVBQ3RDeGEsSUFBSWhDLFlBQVUsS0FBS2tkLHlCQUF5QmxkLE1BQU0sQ0FBQyxFQUNuRFQsT0FBTy9DLE9BQU87SUFDbkI7SUFFQTJnQixhQUFhO0FBQ1gsYUFBTyxLQUFLRixXQUFVLEVBQUc3bkIsU0FBUztJQUNwQztJQUVBZ29CLGNBQWNaLFNBQVM7QUFDckIsV0FBS2EsY0FBY2IsT0FBTztBQUMxQixXQUFLdmIsUUFBUXViLFVBQVUsa0NBQUssS0FBS3ZiLFFBQVF1YixVQUFZQTtBQUNyRCxhQUFPO0lBQ1Q7SUFFQWMsU0FBUztBQUNQLFlBQU1DLGtCQUFrQnJwQixTQUFTdWYsY0FBYyxLQUFLO0FBQ3BEOEosc0JBQWdCaEIsWUFBWSxLQUFLaUIsZUFBZSxLQUFLdmMsUUFBUTRiLFFBQVE7QUFFckUsaUJBQVcsQ0FBQy9wQixVQUFVMnFCLElBQUksS0FBS2pxQixPQUFPcUosUUFBUSxLQUFLb0UsUUFBUXViLE9BQU8sR0FBRztBQUNuRSxhQUFLa0IsWUFBWUgsaUJBQWlCRSxNQUFNM3FCLFFBQVE7TUFDbEQ7QUFFQSxZQUFNK3BCLFdBQVdVLGdCQUFnQmhiLFNBQVMsQ0FBQztBQUMzQyxZQUFNa2EsYUFBYSxLQUFLUyx5QkFBeUIsS0FBS2pjLFFBQVF3YixVQUFVO0FBRXhFLFVBQUlBLFlBQVk7QUFDZEksaUJBQVM1bUIsVUFBVXdRLElBQUksR0FBR2dXLFdBQVc3bkIsTUFBTSxHQUFHLENBQUM7TUFDakQ7QUFFQSxhQUFPaW9CO0lBQ1Q7O0lBR0ExYyxpQkFBaUJILFFBQVE7QUFDdkIsWUFBTUcsaUJBQWlCSCxNQUFNO0FBQzdCLFdBQUtxZCxjQUFjcmQsT0FBT3djLE9BQU87SUFDbkM7SUFFQWEsY0FBY00sS0FBSztBQUNqQixpQkFBVyxDQUFDN3FCLFVBQVUwcEIsT0FBTyxLQUFLaHBCLE9BQU9xSixRQUFROGdCLEdBQUcsR0FBRztBQUNyRCxjQUFNeGQsaUJBQWlCO1VBQUVyTjtVQUFVaXFCLE9BQU9QO1dBQVdNLGtCQUFrQjtNQUN6RTtJQUNGO0lBRUFZLFlBQVliLFVBQVVMLFNBQVMxcEIsVUFBVTtBQUN2QyxZQUFNOHFCLGtCQUFrQnpiLGVBQWVHLFFBQVF4UCxVQUFVK3BCLFFBQVE7QUFFakUsVUFBSSxDQUFDZSxpQkFBaUI7QUFDcEI7TUFDRjtBQUVBcEIsZ0JBQVUsS0FBS1UseUJBQXlCVixPQUFPO0FBRS9DLFVBQUksQ0FBQ0EsU0FBUztBQUNab0Isd0JBQWdCcHJCLE9BQU07QUFDdEI7TUFDRjtBQUVBLFVBQUl3QyxXQUFVd25CLE9BQU8sR0FBRztBQUN0QixhQUFLcUIsc0JBQXNCMW9CLFdBQVdxbkIsT0FBTyxHQUFHb0IsZUFBZTtBQUMvRDtNQUNGO0FBRUEsVUFBSSxLQUFLM2MsUUFBUXliLE1BQU07QUFDckJrQix3QkFBZ0JyQixZQUFZLEtBQUtpQixlQUFlaEIsT0FBTztBQUN2RDtNQUNGO0FBRUFvQixzQkFBZ0JFLGNBQWN0QjtJQUNoQztJQUVBZ0IsZUFBZUcsS0FBSztBQUNsQixhQUFPLEtBQUsxYyxRQUFRMGIsV0FBV2YsYUFBYStCLEtBQUssS0FBSzFjLFFBQVE2YSxXQUFXLEtBQUs3YSxRQUFRMmIsVUFBVSxJQUFJZTtJQUN0RztJQUVBVCx5QkFBeUJTLEtBQUs7QUFDNUIsYUFBT3ZsQixRQUFRdWxCLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFDNUI7SUFFQUUsc0JBQXNCanNCLFNBQVNnc0IsaUJBQWlCO0FBQzlDLFVBQUksS0FBSzNjLFFBQVF5YixNQUFNO0FBQ3JCa0Isd0JBQWdCckIsWUFBWTtBQUM1QnFCLHdCQUFnQmxLLE9BQU85aEIsT0FBTztBQUM5QjtNQUNGO0FBRUFnc0Isc0JBQWdCRSxjQUFjbHNCLFFBQVFrc0I7SUFDeEM7RUFDRjtBQ3hJQSxNQUFNaG1CLFNBQU87QUFDYixNQUFNaW1CLHdCQUF3QixvQkFBSTFqQixJQUFJLENBQUMsWUFBWSxhQUFhLFlBQVksQ0FBQztBQUU3RSxNQUFNeUosb0JBQWtCO0FBQ3hCLE1BQU1rYSxtQkFBbUI7QUFDekIsTUFBTWphLG9CQUFrQjtBQUV4QixNQUFNa2EseUJBQXlCO0FBQy9CLE1BQU1DLGlCQUFrQixJQUFHRixnQkFBaUI7QUFFNUMsTUFBTUcsbUJBQW1CO0FBRXpCLE1BQU1DLGdCQUFnQjtBQUN0QixNQUFNQyxnQkFBZ0I7QUFDdEIsTUFBTUMsZ0JBQWdCO0FBQ3RCLE1BQU1DLGlCQUFpQjtBQUV2QixNQUFNblMsZUFBYTtBQUNuQixNQUFNQyxpQkFBZTtBQUNyQixNQUFNSCxlQUFhO0FBQ25CLE1BQU1DLGdCQUFjO0FBQ3BCLE1BQU1xUyxpQkFBaUI7QUFDdkIsTUFBTUMsZ0JBQWM7QUFDcEIsTUFBTTlLLGtCQUFnQjtBQUN0QixNQUFNK0ssbUJBQWlCO0FBQ3ZCLE1BQU1uWCxtQkFBbUI7QUFDekIsTUFBTUMsbUJBQW1CO0FBRXpCLE1BQU1tWCxnQkFBZ0I7SUFDcEJDLE1BQU07SUFDTkMsS0FBSztJQUNMQyxPQUFPdG5CLE1BQUssSUFBSyxTQUFTO0lBQzFCdW5CLFFBQVE7SUFDUkMsTUFBTXhuQixNQUFLLElBQUssVUFBVTtFQUM1QjtBQUVBLE1BQU1vSSxZQUFVO0lBQ2RrYyxXQUFXN0M7SUFDWGdHLFdBQVc7SUFDWDlPLFVBQVU7SUFDVitPLFdBQVc7SUFDWEMsYUFBYTtJQUNiQyxPQUFPO0lBQ1BDLG9CQUFvQixDQUFDLE9BQU8sU0FBUyxVQUFVLE1BQU07SUFDckQzQyxNQUFNO0lBQ05yTSxRQUFRLENBQUMsR0FBRyxDQUFDO0lBQ2IwQixXQUFXO0lBQ1h6QixjQUFjO0lBQ2RxTSxVQUFVO0lBQ1ZDLFlBQVk7SUFDWjlwQixVQUFVO0lBQ1YrcEIsVUFBVTtJQUlWeUMsT0FBTztJQUNQL2hCLFNBQVM7RUFDWDtBQUVBLE1BQU1zQyxnQkFBYztJQUNsQmljLFdBQVc7SUFDWG1ELFdBQVc7SUFDWDlPLFVBQVU7SUFDVitPLFdBQVc7SUFDWEMsYUFBYTtJQUNiQyxPQUFPO0lBQ1BDLG9CQUFvQjtJQUNwQjNDLE1BQU07SUFDTnJNLFFBQVE7SUFDUjBCLFdBQVc7SUFDWHpCLGNBQWM7SUFDZHFNLFVBQVU7SUFDVkMsWUFBWTtJQUNaOXBCLFVBQVU7SUFDVitwQixVQUFVO0lBQ1Z5QyxPQUFPO0lBQ1AvaEIsU0FBUztFQUNYO0FBTUEsTUFBTWdpQixVQUFOLE1BQU1BLGlCQUFnQnhlLGNBQWM7SUFDbENWLFlBQVl6TyxTQUFTb08sUUFBUTtBQUMzQixVQUFJLE9BQU9xUixnQkFBVyxhQUFhO0FBQ2pDLGNBQU0sSUFBSXpRLFVBQVUsNkRBQThEO01BQ3BGO0FBRUEsWUFBTWhQLFNBQVNvTyxNQUFNO0FBR3JCLFdBQUt3ZixhQUFhO0FBQ2xCLFdBQUtDLFdBQVc7QUFDaEIsV0FBS0MsYUFBYTtBQUNsQixXQUFLQyxpQkFBaUIsQ0FBQTtBQUN0QixXQUFLbFAsVUFBVTtBQUNmLFdBQUttUCxtQkFBbUI7QUFDeEIsV0FBS0MsY0FBYztBQUduQixXQUFLQyxNQUFNO0FBRVgsV0FBS0MsY0FBYTtBQUVsQixVQUFJLENBQUMsS0FBSzllLFFBQVFuTyxVQUFVO0FBQzFCLGFBQUtrdEIsVUFBUztNQUNoQjtJQUNGOztJQUdBLFdBQVdwZ0IsVUFBVTtBQUNuQixhQUFPQTtJQUNUO0lBRUEsV0FBV0MsY0FBYztBQUN2QixhQUFPQTtJQUNUO0lBRUEsV0FBVy9ILE9BQU87QUFDaEIsYUFBT0E7SUFDVDs7SUFHQW1vQixTQUFTO0FBQ1AsV0FBS1QsYUFBYTtJQUNwQjtJQUVBVSxVQUFVO0FBQ1IsV0FBS1YsYUFBYTtJQUNwQjtJQUVBVyxnQkFBZ0I7QUFDZCxXQUFLWCxhQUFhLENBQUMsS0FBS0E7SUFDMUI7SUFFQTdhLFNBQVM7QUFDUCxVQUFJLENBQUMsS0FBSzZhLFlBQVk7QUFDcEI7TUFDRjtBQUVBLFdBQUtHLGVBQWVTLFFBQVEsQ0FBQyxLQUFLVCxlQUFlUztBQUNqRCxVQUFJLEtBQUs1UyxTQUFRLEdBQUk7QUFDbkIsYUFBSzZTLE9BQU07QUFDWDtNQUNGO0FBRUEsV0FBS0MsT0FBTTtJQUNiO0lBRUFsZixVQUFVO0FBQ1J1SixtQkFBYSxLQUFLOFUsUUFBUTtBQUUxQjNrQixtQkFBYUMsSUFBSSxLQUFLaUcsU0FBU3JMLFFBQVF1b0IsY0FBYyxHQUFHQyxrQkFBa0IsS0FBS29DLGlCQUFpQjtBQUVoRyxVQUFJLEtBQUt2ZixTQUFTM0ssYUFBYSx3QkFBd0IsR0FBRztBQUN4RCxhQUFLMkssU0FBU2hDLGFBQWEsU0FBUyxLQUFLZ0MsU0FBUzNLLGFBQWEsd0JBQXdCLENBQUM7TUFDMUY7QUFFQSxXQUFLbXFCLGVBQWM7QUFDbkIsWUFBTXBmLFFBQU87SUFDZjtJQUVBc00sT0FBTztBQUNMLFVBQUksS0FBSzFNLFNBQVNpTixNQUFNbUMsWUFBWSxRQUFRO0FBQzFDLGNBQU0sSUFBSXRRLE1BQU0scUNBQXFDO01BQ3ZEO0FBRUEsVUFBSSxFQUFFLEtBQUsyZ0IsZUFBYyxLQUFNLEtBQUtqQixhQUFhO0FBQy9DO01BQ0Y7QUFFQSxZQUFNMU8sWUFBWWhXLGFBQWF5QyxRQUFRLEtBQUt5RCxVQUFVLEtBQUtYLFlBQVl1QixVQUFVc0ssWUFBVSxDQUFDO0FBQzVGLFlBQU13VSxhQUFhcHFCLGVBQWUsS0FBSzBLLFFBQVE7QUFDL0MsWUFBTTJmLGNBQWNELGNBQWMsS0FBSzFmLFNBQVM0ZixjQUFjcnFCLGlCQUFpQkwsU0FBUyxLQUFLOEssUUFBUTtBQUVyRyxVQUFJOFAsVUFBVW5ULG9CQUFvQixDQUFDZ2pCLFlBQVk7QUFDN0M7TUFDRjtBQUdBLFdBQUtILGVBQWM7QUFFbkIsWUFBTVYsTUFBTSxLQUFLZSxlQUFjO0FBRS9CLFdBQUs3ZixTQUFTaEMsYUFBYSxvQkFBb0I4Z0IsSUFBSXpwQixhQUFhLElBQUksQ0FBQztBQUVyRSxZQUFNO1FBQUU2b0I7VUFBYyxLQUFLamU7QUFFM0IsVUFBSSxDQUFDLEtBQUtELFNBQVM0ZixjQUFjcnFCLGdCQUFnQkwsU0FBUyxLQUFLNHBCLEdBQUcsR0FBRztBQUNuRVosa0JBQVV4TCxPQUFPb00sR0FBRztBQUNwQmhsQixxQkFBYXlDLFFBQVEsS0FBS3lELFVBQVUsS0FBS1gsWUFBWXVCLFVBQVU0YyxjQUFjLENBQUM7TUFDaEY7QUFFQSxXQUFLL04sVUFBVSxLQUFLTSxjQUFjK08sR0FBRztBQUVyQ0EsVUFBSTdwQixVQUFVd1EsSUFBSTFDLGlCQUFlO0FBTWpDLFVBQUksa0JBQWtCN1AsU0FBU3FDLGlCQUFpQjtBQUM5QyxtQkFBVzNFLFdBQVcsQ0FBQSxFQUFHd1EsT0FBTyxHQUFHbE8sU0FBUytDLEtBQUtzTCxRQUFRLEdBQUc7QUFDMUR6SCx1QkFBYWlDLEdBQUduTCxTQUFTLGFBQWFnRixJQUFJO1FBQzVDO01BQ0Y7QUFFQSxZQUFNc1gsV0FBV0EsTUFBTTtBQUNyQnBULHFCQUFheUMsUUFBUSxLQUFLeUQsVUFBVSxLQUFLWCxZQUFZdUIsVUFBVXVLLGFBQVcsQ0FBQztBQUUzRSxZQUFJLEtBQUt1VCxlQUFlLE9BQU87QUFDN0IsZUFBS1csT0FBTTtRQUNiO0FBRUEsYUFBS1gsYUFBYTs7QUFHcEIsV0FBS2xlLGVBQWUwTSxVQUFVLEtBQUs0UixLQUFLLEtBQUtqVSxZQUFXLENBQUU7SUFDNUQ7SUFFQTRCLE9BQU87QUFDTCxVQUFJLENBQUMsS0FBS0QsU0FBUSxHQUFJO0FBQ3BCO01BQ0Y7QUFFQSxZQUFNNEQsWUFBWXRXLGFBQWF5QyxRQUFRLEtBQUt5RCxVQUFVLEtBQUtYLFlBQVl1QixVQUFVd0ssWUFBVSxDQUFDO0FBQzVGLFVBQUlnRixVQUFVelQsa0JBQWtCO0FBQzlCO01BQ0Y7QUFFQSxZQUFNbWlCLE1BQU0sS0FBS2UsZUFBYztBQUMvQmYsVUFBSTdwQixVQUFVekQsT0FBT3VSLGlCQUFlO0FBSXBDLFVBQUksa0JBQWtCN1AsU0FBU3FDLGlCQUFpQjtBQUM5QyxtQkFBVzNFLFdBQVcsQ0FBQSxFQUFHd1EsT0FBTyxHQUFHbE8sU0FBUytDLEtBQUtzTCxRQUFRLEdBQUc7QUFDMUR6SCx1QkFBYUMsSUFBSW5KLFNBQVMsYUFBYWdGLElBQUk7UUFDN0M7TUFDRjtBQUVBLFdBQUsrb0IsZUFBZXJCLGFBQWEsSUFBSTtBQUNyQyxXQUFLcUIsZUFBZXRCLGFBQWEsSUFBSTtBQUNyQyxXQUFLc0IsZUFBZXZCLGFBQWEsSUFBSTtBQUNyQyxXQUFLc0IsYUFBYTtBQUVsQixZQUFNeFIsV0FBV0EsTUFBTTtBQUNyQixZQUFJLEtBQUs0UyxxQkFBb0IsR0FBSTtBQUMvQjtRQUNGO0FBRUEsWUFBSSxDQUFDLEtBQUtwQixZQUFZO0FBQ3BCLGVBQUtjLGVBQWM7UUFDckI7QUFFQSxhQUFLeGYsU0FBUzlCLGdCQUFnQixrQkFBa0I7QUFDaERwRSxxQkFBYXlDLFFBQVEsS0FBS3lELFVBQVUsS0FBS1gsWUFBWXVCLFVBQVV5SyxjQUFZLENBQUM7O0FBRzlFLFdBQUs3SyxlQUFlME0sVUFBVSxLQUFLNFIsS0FBSyxLQUFLalUsWUFBVyxDQUFFO0lBQzVEO0lBRUFzRixTQUFTO0FBQ1AsVUFBSSxLQUFLVixTQUFTO0FBQ2hCLGFBQUtBLFFBQVFVLE9BQU07TUFDckI7SUFDRjs7SUFHQXNQLGlCQUFpQjtBQUNmLGFBQU9qa0IsUUFBUSxLQUFLdWtCLFVBQVMsQ0FBRTtJQUNqQztJQUVBRixpQkFBaUI7QUFDZixVQUFJLENBQUMsS0FBS2YsS0FBSztBQUNiLGFBQUtBLE1BQU0sS0FBS2tCLGtCQUFrQixLQUFLbkIsZUFBZSxLQUFLb0IsdUJBQXNCLENBQUU7TUFDckY7QUFFQSxhQUFPLEtBQUtuQjtJQUNkO0lBRUFrQixrQkFBa0J4RSxTQUFTO0FBQ3pCLFlBQU1zRCxNQUFNLEtBQUtvQixvQkFBb0IxRSxPQUFPLEVBQUVjLE9BQU07QUFHcEQsVUFBSSxDQUFDd0MsS0FBSztBQUNSLGVBQU87TUFDVDtBQUVBQSxVQUFJN3BCLFVBQVV6RCxPQUFPc1IsbUJBQWlCQyxpQkFBZTtBQUVyRCtiLFVBQUk3cEIsVUFBVXdRLElBQUssTUFBSyxLQUFLcEcsWUFBWXZJLElBQUssT0FBTTtBQUVwRCxZQUFNcXBCLFFBQVF0dEIsT0FBTyxLQUFLd00sWUFBWXZJLElBQUksRUFBRXBFLFNBQVE7QUFFcERvc0IsVUFBSTlnQixhQUFhLE1BQU1taUIsS0FBSztBQUU1QixVQUFJLEtBQUt0VixZQUFXLEdBQUk7QUFDdEJpVSxZQUFJN3BCLFVBQVV3USxJQUFJM0MsaUJBQWU7TUFDbkM7QUFFQSxhQUFPZ2M7SUFDVDtJQUVBc0IsV0FBVzVFLFNBQVM7QUFDbEIsV0FBS3FELGNBQWNyRDtBQUNuQixVQUFJLEtBQUtoUCxTQUFRLEdBQUk7QUFDbkIsYUFBS2dULGVBQWM7QUFDbkIsYUFBSzlTLEtBQUk7TUFDWDtJQUNGO0lBRUF3VCxvQkFBb0IxRSxTQUFTO0FBQzNCLFVBQUksS0FBS29ELGtCQUFrQjtBQUN6QixhQUFLQSxpQkFBaUJ4QyxjQUFjWixPQUFPO01BQzdDLE9BQU87QUFDTCxhQUFLb0QsbUJBQW1CLElBQUk1QyxnQkFBZ0IsaUNBQ3ZDLEtBQUsvYixVQURrQzs7O1VBSTFDdWI7VUFDQUMsWUFBWSxLQUFLUyx5QkFBeUIsS0FBS2pjLFFBQVFrZSxXQUFXO1FBQ3BFLEVBQUM7TUFDSDtBQUVBLGFBQU8sS0FBS1M7SUFDZDtJQUVBcUIseUJBQXlCO0FBQ3ZCLGFBQU87UUFDTCxDQUFDaEQsc0JBQXNCLEdBQUcsS0FBSzhDLFVBQVM7O0lBRTVDO0lBRUFBLFlBQVk7QUFDVixhQUFPLEtBQUs3RCx5QkFBeUIsS0FBS2pjLFFBQVFxZSxLQUFLLEtBQUssS0FBS3RlLFNBQVMzSyxhQUFhLHdCQUF3QjtJQUNqSDs7SUFHQWdyQiw2QkFBNkIzbUIsT0FBTztBQUNsQyxhQUFPLEtBQUsyRixZQUFZc0Isb0JBQW9CakgsTUFBTUUsZ0JBQWdCLEtBQUswbUIsbUJBQWtCLENBQUU7SUFDN0Y7SUFFQXpWLGNBQWM7QUFDWixhQUFPLEtBQUs1SyxRQUFRZ2UsYUFBYyxLQUFLYSxPQUFPLEtBQUtBLElBQUk3cEIsVUFBVUMsU0FBUzROLGlCQUFlO0lBQzNGO0lBRUEwSixXQUFXO0FBQ1QsYUFBTyxLQUFLc1MsT0FBTyxLQUFLQSxJQUFJN3BCLFVBQVVDLFNBQVM2TixpQkFBZTtJQUNoRTtJQUVBZ04sY0FBYytPLEtBQUs7QUFDakIsWUFBTS9OLFlBQVkzWixRQUFRLEtBQUs2SSxRQUFROFEsV0FBVyxDQUFDLE1BQU0rTixLQUFLLEtBQUs5ZSxRQUFRLENBQUM7QUFDNUUsWUFBTXVnQixhQUFhNUMsY0FBYzVNLFVBQVVsUixZQUFXLENBQUU7QUFDeEQsYUFBYzJRLGNBQWEsS0FBS3hRLFVBQVU4ZSxLQUFLLEtBQUt2TyxpQkFBaUJnUSxVQUFVLENBQUM7SUFDbEY7SUFFQTNQLGFBQWE7QUFDWCxZQUFNO1FBQUV2QixRQUFBQTtVQUFXLEtBQUtwUDtBQUV4QixVQUFJLE9BQU9vUCxZQUFXLFVBQVU7QUFDOUIsZUFBT0EsUUFBT3piLE1BQU0sR0FBRyxFQUFFb04sSUFBSTVELFdBQVMzSixPQUFPeVcsU0FBUzlNLE9BQU8sRUFBRSxDQUFDO01BQ2xFO0FBRUEsVUFBSSxPQUFPaVMsWUFBVyxZQUFZO0FBQ2hDLGVBQU93QixnQkFBY3hCLFFBQU93QixZQUFZLEtBQUs3USxRQUFRO01BQ3ZEO0FBRUEsYUFBT3FQO0lBQ1Q7SUFFQTZNLHlCQUF5QlMsS0FBSztBQUM1QixhQUFPdmxCLFFBQVF1bEIsS0FBSyxDQUFDLEtBQUszYyxRQUFRLENBQUM7SUFDckM7SUFFQXVRLGlCQUFpQmdRLFlBQVk7QUFDM0IsWUFBTXpQLHdCQUF3QjtRQUM1QkMsV0FBV3dQO1FBQ1h2UCxXQUFXLENBQ1Q7VUFDRW5hLE1BQU07VUFDTm9hLFNBQVM7WUFDUG9OLG9CQUFvQixLQUFLcGUsUUFBUW9lO1VBQ25DO1FBQ0YsR0FDQTtVQUNFeG5CLE1BQU07VUFDTm9hLFNBQVM7WUFDUDVCLFFBQVEsS0FBS3VCLFdBQVU7VUFDekI7UUFDRixHQUNBO1VBQ0UvWixNQUFNO1VBQ05vYSxTQUFTO1lBQ1A5QixVQUFVLEtBQUtsUCxRQUFRa1A7VUFDekI7UUFDRixHQUNBO1VBQ0V0WSxNQUFNO1VBQ05vYSxTQUFTO1lBQ1ByZ0IsU0FBVSxJQUFHLEtBQUt5TyxZQUFZdkksSUFBSztVQUNyQztRQUNGLEdBQ0E7VUFDRUQsTUFBTTtVQUNOcWEsU0FBUztVQUNUc1AsT0FBTztVQUNQeHBCLElBQUlxTSxVQUFRO0FBR1YsaUJBQUt3YyxlQUFjLEVBQUc3aEIsYUFBYSx5QkFBeUJxRixLQUFLb2QsTUFBTTFQLFNBQVM7VUFDbEY7U0FDRDs7QUFJTCxhQUFPLGtDQUNGRCx3QkFDQTFaLFFBQVEsS0FBSzZJLFFBQVFxUCxjQUFjLENBQUN3QixxQkFBcUIsQ0FBQztJQUVqRTtJQUVBaU8sZ0JBQWdCO0FBQ2QsWUFBTTJCLFdBQVcsS0FBS3pnQixRQUFRMUQsUUFBUTNJLE1BQU0sR0FBRztBQUUvQyxpQkFBVzJJLFdBQVdta0IsVUFBVTtBQUM5QixZQUFJbmtCLFlBQVksU0FBUztBQUN2QnpDLHVCQUFhaUMsR0FBRyxLQUFLaUUsVUFBVSxLQUFLWCxZQUFZdUIsVUFBVTZjLGFBQVcsR0FBRyxLQUFLeGQsUUFBUW5PLFVBQVU0SCxXQUFTO0FBQ3RHLGtCQUFNNFgsVUFBVSxLQUFLK08sNkJBQTZCM21CLEtBQUs7QUFDdkQ0WCxvQkFBUTNOLE9BQU07VUFDaEIsQ0FBQztRQUNILFdBQVdwSCxZQUFZZ2hCLGdCQUFnQjtBQUNyQyxnQkFBTW9ELFVBQVVwa0IsWUFBWTZnQixnQkFDMUIsS0FBSy9kLFlBQVl1QixVQUFVMkYsZ0JBQWdCLElBQzNDLEtBQUtsSCxZQUFZdUIsVUFBVStSLGVBQWE7QUFDMUMsZ0JBQU1pTyxXQUFXcmtCLFlBQVk2Z0IsZ0JBQzNCLEtBQUsvZCxZQUFZdUIsVUFBVTRGLGdCQUFnQixJQUMzQyxLQUFLbkgsWUFBWXVCLFVBQVU4YyxnQkFBYztBQUUzQzVqQix1QkFBYWlDLEdBQUcsS0FBS2lFLFVBQVUyZ0IsU0FBUyxLQUFLMWdCLFFBQVFuTyxVQUFVNEgsV0FBUztBQUN0RSxrQkFBTTRYLFVBQVUsS0FBSytPLDZCQUE2QjNtQixLQUFLO0FBQ3ZENFgsb0JBQVFxTixlQUFlamxCLE1BQU1NLFNBQVMsWUFBWXFqQixnQkFBZ0JELGFBQWEsSUFBSTtBQUNuRjlMLG9CQUFRZ08sT0FBTTtVQUNoQixDQUFDO0FBQ0R4bEIsdUJBQWFpQyxHQUFHLEtBQUtpRSxVQUFVNGdCLFVBQVUsS0FBSzNnQixRQUFRbk8sVUFBVTRILFdBQVM7QUFDdkUsa0JBQU00WCxVQUFVLEtBQUsrTyw2QkFBNkIzbUIsS0FBSztBQUN2RDRYLG9CQUFRcU4sZUFBZWpsQixNQUFNTSxTQUFTLGFBQWFxakIsZ0JBQWdCRCxhQUFhLElBQzlFOUwsUUFBUXRSLFNBQVM5SyxTQUFTd0UsTUFBTTBCLGFBQWE7QUFFL0NrVyxvQkFBUStOLE9BQU07VUFDaEIsQ0FBQztRQUNIO01BQ0Y7QUFFQSxXQUFLRSxvQkFBb0IsTUFBTTtBQUM3QixZQUFJLEtBQUt2ZixVQUFVO0FBQ2pCLGVBQUt5TSxLQUFJO1FBQ1g7O0FBR0YzUyxtQkFBYWlDLEdBQUcsS0FBS2lFLFNBQVNyTCxRQUFRdW9CLGNBQWMsR0FBR0Msa0JBQWtCLEtBQUtvQyxpQkFBaUI7SUFDakc7SUFFQVAsWUFBWTtBQUNWLFlBQU1WLFFBQVEsS0FBS3RlLFNBQVMzSyxhQUFhLE9BQU87QUFFaEQsVUFBSSxDQUFDaXBCLE9BQU87QUFDVjtNQUNGO0FBRUEsVUFBSSxDQUFDLEtBQUt0ZSxTQUFTM0ssYUFBYSxZQUFZLEtBQUssQ0FBQyxLQUFLMkssU0FBUzhjLFlBQVkvYixLQUFJLEdBQUk7QUFDbEYsYUFBS2YsU0FBU2hDLGFBQWEsY0FBY3NnQixLQUFLO01BQ2hEO0FBRUEsV0FBS3RlLFNBQVNoQyxhQUFhLDBCQUEwQnNnQixLQUFLO0FBQzFELFdBQUt0ZSxTQUFTOUIsZ0JBQWdCLE9BQU87SUFDdkM7SUFFQW9oQixTQUFTO0FBQ1AsVUFBSSxLQUFLOVMsU0FBUSxLQUFNLEtBQUtrUyxZQUFZO0FBQ3RDLGFBQUtBLGFBQWE7QUFDbEI7TUFDRjtBQUVBLFdBQUtBLGFBQWE7QUFFbEIsV0FBS21DLFlBQVksTUFBTTtBQUNyQixZQUFJLEtBQUtuQyxZQUFZO0FBQ25CLGVBQUtoUyxLQUFJO1FBQ1g7U0FDQyxLQUFLek0sUUFBUW1lLE1BQU0xUixJQUFJO0lBQzVCO0lBRUEyUyxTQUFTO0FBQ1AsVUFBSSxLQUFLUyxxQkFBb0IsR0FBSTtBQUMvQjtNQUNGO0FBRUEsV0FBS3BCLGFBQWE7QUFFbEIsV0FBS21DLFlBQVksTUFBTTtBQUNyQixZQUFJLENBQUMsS0FBS25DLFlBQVk7QUFDcEIsZUFBS2pTLEtBQUk7UUFDWDtTQUNDLEtBQUt4TSxRQUFRbWUsTUFBTTNSLElBQUk7SUFDNUI7SUFFQW9VLFlBQVkvb0IsU0FBU2dwQixTQUFTO0FBQzVCblgsbUJBQWEsS0FBSzhVLFFBQVE7QUFDMUIsV0FBS0EsV0FBV3htQixXQUFXSCxTQUFTZ3BCLE9BQU87SUFDN0M7SUFFQWhCLHVCQUF1QjtBQUNyQixhQUFPdHRCLE9BQU9rSSxPQUFPLEtBQUtpa0IsY0FBYyxFQUFFN2lCLFNBQVMsSUFBSTtJQUN6RDtJQUVBaUQsV0FBV0MsUUFBUTtBQUNqQixZQUFNK2hCLGlCQUFpQmpqQixZQUFZSyxrQkFBa0IsS0FBSzZCLFFBQVE7QUFFbEUsaUJBQVdnaEIsaUJBQWlCeHVCLE9BQU9qQixLQUFLd3ZCLGNBQWMsR0FBRztBQUN2RCxZQUFJaEUsc0JBQXNCaHNCLElBQUlpd0IsYUFBYSxHQUFHO0FBQzVDLGlCQUFPRCxlQUFlQyxhQUFhO1FBQ3JDO01BQ0Y7QUFFQWhpQixlQUFTLGtDQUNKK2hCLGlCQUNDLE9BQU8vaEIsV0FBVyxZQUFZQSxTQUFTQSxTQUFTLENBQUE7QUFFdERBLGVBQVMsS0FBS0MsZ0JBQWdCRCxNQUFNO0FBQ3BDQSxlQUFTLEtBQUtFLGtCQUFrQkYsTUFBTTtBQUN0QyxXQUFLRyxpQkFBaUJILE1BQU07QUFDNUIsYUFBT0E7SUFDVDtJQUVBRSxrQkFBa0JGLFFBQVE7QUFDeEJBLGFBQU9rZixZQUFZbGYsT0FBT2tmLGNBQWMsUUFBUWhyQixTQUFTK0MsT0FBTzlCLFdBQVc2SyxPQUFPa2YsU0FBUztBQUUzRixVQUFJLE9BQU9sZixPQUFPb2YsVUFBVSxVQUFVO0FBQ3BDcGYsZUFBT29mLFFBQVE7VUFDYjFSLE1BQU0xTixPQUFPb2Y7VUFDYjNSLE1BQU16TixPQUFPb2Y7O01BRWpCO0FBRUEsVUFBSSxPQUFPcGYsT0FBT3NmLFVBQVUsVUFBVTtBQUNwQ3RmLGVBQU9zZixRQUFRdGYsT0FBT3NmLE1BQU01ckIsU0FBUTtNQUN0QztBQUVBLFVBQUksT0FBT3NNLE9BQU93YyxZQUFZLFVBQVU7QUFDdEN4YyxlQUFPd2MsVUFBVXhjLE9BQU93YyxRQUFROW9CLFNBQVE7TUFDMUM7QUFFQSxhQUFPc007SUFDVDtJQUVBc2hCLHFCQUFxQjtBQUNuQixZQUFNdGhCLFNBQVMsQ0FBQTtBQUVmLGlCQUFXLENBQUNuTyxLQUFLdU0sS0FBSyxLQUFLNUssT0FBT3FKLFFBQVEsS0FBS29FLE9BQU8sR0FBRztBQUN2RCxZQUFJLEtBQUtaLFlBQVlULFFBQVEvTixHQUFHLE1BQU11TSxPQUFPO0FBQzNDNEIsaUJBQU9uTyxHQUFHLElBQUl1TTtRQUNoQjtNQUNGO0FBRUE0QixhQUFPbE4sV0FBVztBQUNsQmtOLGFBQU96QyxVQUFVO0FBS2pCLGFBQU95QztJQUNUO0lBRUF3Z0IsaUJBQWlCO0FBQ2YsVUFBSSxLQUFLL1AsU0FBUztBQUNoQixhQUFLQSxRQUFRUyxRQUFPO0FBQ3BCLGFBQUtULFVBQVU7TUFDakI7QUFFQSxVQUFJLEtBQUtxUCxLQUFLO0FBQ1osYUFBS0EsSUFBSXR0QixPQUFNO0FBQ2YsYUFBS3N0QixNQUFNO01BQ2I7SUFDRjs7SUFHQSxPQUFPN25CLGdCQUFnQitILFFBQVE7QUFDN0IsYUFBTyxLQUFLb0UsS0FBSyxXQUFZO0FBQzNCLGNBQU1DLE9BQU9rYixTQUFRNWQsb0JBQW9CLE1BQU0zQixNQUFNO0FBRXJELFlBQUksT0FBT0EsV0FBVyxVQUFVO0FBQzlCO1FBQ0Y7QUFFQSxZQUFJLE9BQU9xRSxLQUFLckUsTUFBTSxNQUFNLGFBQWE7QUFDdkMsZ0JBQU0sSUFBSVksVUFBVyxvQkFBbUJaLE1BQU8sR0FBRTtRQUNuRDtBQUVBcUUsYUFBS3JFLE1BQU0sRUFBQztNQUNkLENBQUM7SUFDSDtFQUNGO0FBTUF0SSxxQkFBbUI2bkIsT0FBTztBQ3htQjFCLE1BQU16bkIsU0FBTztBQUViLE1BQU1tcUIsaUJBQWlCO0FBQ3ZCLE1BQU1DLG1CQUFtQjtBQUV6QixNQUFNdGlCLFlBQVUsaUNBQ1gyZixRQUFRM2YsVUFERztJQUVkNGMsU0FBUztJQUNUbk0sUUFBUSxDQUFDLEdBQUcsQ0FBQztJQUNiMEIsV0FBVztJQUNYOEssVUFBVTtJQUtWdGYsU0FBUztFQUNYO0FBRUEsTUFBTXNDLGdCQUFjLGlDQUNmMGYsUUFBUTFmLGNBRE87SUFFbEIyYyxTQUFTO0VBQ1g7QUFNQSxNQUFNMkYsVUFBTixNQUFNQSxpQkFBZ0I1QyxRQUFROztJQUU1QixXQUFXM2YsVUFBVTtBQUNuQixhQUFPQTtJQUNUO0lBRUEsV0FBV0MsY0FBYztBQUN2QixhQUFPQTtJQUNUO0lBRUEsV0FBVy9ILE9BQU87QUFDaEIsYUFBT0E7SUFDVDs7SUFHQTJvQixpQkFBaUI7QUFDZixhQUFPLEtBQUtNLFVBQVMsS0FBTSxLQUFLcUIsWUFBVztJQUM3Qzs7SUFHQW5CLHlCQUF5QjtBQUN2QixhQUFPO1FBQ0wsQ0FBQ2dCLGNBQWMsR0FBRyxLQUFLbEIsVUFBUztRQUNoQyxDQUFDbUIsZ0JBQWdCLEdBQUcsS0FBS0UsWUFBVzs7SUFFeEM7SUFFQUEsY0FBYztBQUNaLGFBQU8sS0FBS2xGLHlCQUF5QixLQUFLamMsUUFBUXViLE9BQU87SUFDM0Q7O0lBR0EsT0FBT3ZrQixnQkFBZ0IrSCxRQUFRO0FBQzdCLGFBQU8sS0FBS29FLEtBQUssV0FBWTtBQUMzQixjQUFNQyxPQUFPOGQsU0FBUXhnQixvQkFBb0IsTUFBTTNCLE1BQU07QUFFckQsWUFBSSxPQUFPQSxXQUFXLFVBQVU7QUFDOUI7UUFDRjtBQUVBLFlBQUksT0FBT3FFLEtBQUtyRSxNQUFNLE1BQU0sYUFBYTtBQUN2QyxnQkFBTSxJQUFJWSxVQUFXLG9CQUFtQlosTUFBTyxHQUFFO1FBQ25EO0FBRUFxRSxhQUFLckUsTUFBTSxFQUFDO01BQ2QsQ0FBQztJQUNIO0VBQ0Y7QUFNQXRJLHFCQUFtQnlxQixPQUFPO0FDNUUxQixNQUFNcnFCLFNBQU87QUFDYixNQUFNcUosYUFBVztBQUNqQixNQUFNRSxjQUFhLElBQUdGLFVBQVM7QUFDL0IsTUFBTW1ELGVBQWU7QUFFckIsTUFBTStkLGlCQUFrQixXQUFVaGhCLFdBQVU7QUFDNUMsTUFBTW9kLGNBQWUsUUFBT3BkLFdBQVU7QUFDdEMsTUFBTXFHLHdCQUF1QixPQUFNckcsV0FBVSxHQUFFaUQsWUFBYTtBQUU1RCxNQUFNZ2UsMkJBQTJCO0FBQ2pDLE1BQU0vZCxzQkFBb0I7QUFFMUIsTUFBTWdlLG9CQUFvQjtBQUMxQixNQUFNQyx3QkFBd0I7QUFDOUIsTUFBTUMsMEJBQTBCO0FBQ2hDLE1BQU1DLHFCQUFxQjtBQUMzQixNQUFNQyxxQkFBcUI7QUFDM0IsTUFBTUMsc0JBQXNCO0FBQzVCLE1BQU1DLHNCQUF1QixHQUFFSCxrQkFBbUIsS0FBSUMsa0JBQW1CLE1BQUtELGtCQUFtQixLQUFJRSxtQkFBb0I7QUFDekgsTUFBTUUsb0JBQW9CO0FBQzFCLE1BQU1DLDZCQUEyQjtBQUVqQyxNQUFNbmpCLFlBQVU7SUFDZHlRLFFBQVE7O0lBQ1IyUyxZQUFZO0lBQ1pDLGNBQWM7SUFDZGxxQixRQUFRO0lBQ1JtcUIsV0FBVyxDQUFDLEtBQUssS0FBSyxDQUFDO0VBQ3pCO0FBRUEsTUFBTXJqQixnQkFBYztJQUNsQndRLFFBQVE7O0lBQ1IyUyxZQUFZO0lBQ1pDLGNBQWM7SUFDZGxxQixRQUFRO0lBQ1JtcUIsV0FBVztFQUNiO0FBTUEsTUFBTUMsWUFBTixNQUFNQSxtQkFBa0JwaUIsY0FBYztJQUNwQ1YsWUFBWXpPLFNBQVNvTyxRQUFRO0FBQzNCLFlBQU1wTyxTQUFTb08sTUFBTTtBQUdyQixXQUFLb2pCLGVBQWUsb0JBQUkxeEIsSUFBRztBQUMzQixXQUFLMnhCLHNCQUFzQixvQkFBSTN4QixJQUFHO0FBQ2xDLFdBQUs0eEIsZUFBZS91QixpQkFBaUIsS0FBS3lNLFFBQVEsRUFBRW1YLGNBQWMsWUFBWSxPQUFPLEtBQUtuWDtBQUMxRixXQUFLdWlCLGdCQUFnQjtBQUNyQixXQUFLQyxZQUFZO0FBQ2pCLFdBQUtDLHNCQUFzQjtRQUN6QkMsaUJBQWlCO1FBQ2pCQyxpQkFBaUI7O0FBRW5CLFdBQUtDLFFBQU87SUFDZDs7SUFHQSxXQUFXaGtCLFVBQVU7QUFDbkIsYUFBT0E7SUFDVDtJQUVBLFdBQVdDLGNBQWM7QUFDdkIsYUFBT0E7SUFDVDtJQUVBLFdBQVcvSCxPQUFPO0FBQ2hCLGFBQU9BO0lBQ1Q7O0lBR0E4ckIsVUFBVTtBQUNSLFdBQUtDLGlDQUFnQztBQUNyQyxXQUFLQyx5QkFBd0I7QUFFN0IsVUFBSSxLQUFLTixXQUFXO0FBQ2xCLGFBQUtBLFVBQVVPLFdBQVU7TUFDM0IsT0FBTztBQUNMLGFBQUtQLFlBQVksS0FBS1EsZ0JBQWU7TUFDdkM7QUFFQSxpQkFBV0MsV0FBVyxLQUFLWixvQkFBb0IzbkIsT0FBTSxHQUFJO0FBQ3ZELGFBQUs4bkIsVUFBVVUsUUFBUUQsT0FBTztNQUNoQztJQUNGO0lBRUE3aUIsVUFBVTtBQUNSLFdBQUtvaUIsVUFBVU8sV0FBVTtBQUN6QixZQUFNM2lCLFFBQU87SUFDZjs7SUFHQWxCLGtCQUFrQkYsUUFBUTtBQUV4QkEsYUFBT2pILFNBQVM1RCxXQUFXNkssT0FBT2pILE1BQU0sS0FBSzdFLFNBQVMrQztBQUd0RCtJLGFBQU9nakIsYUFBYWhqQixPQUFPcVEsU0FBVSxHQUFFclEsT0FBT3FRLE1BQU8sZ0JBQWVyUSxPQUFPZ2pCO0FBRTNFLFVBQUksT0FBT2hqQixPQUFPa2pCLGNBQWMsVUFBVTtBQUN4Q2xqQixlQUFPa2pCLFlBQVlsakIsT0FBT2tqQixVQUFVdHVCLE1BQU0sR0FBRyxFQUFFb04sSUFBSTVELFdBQVMzSixPQUFPQyxXQUFXMEosS0FBSyxDQUFDO01BQ3RGO0FBRUEsYUFBTzRCO0lBQ1Q7SUFFQThqQiwyQkFBMkI7QUFDekIsVUFBSSxDQUFDLEtBQUs3aUIsUUFBUWdpQixjQUFjO0FBQzlCO01BQ0Y7QUFHQW5vQixtQkFBYUMsSUFBSSxLQUFLa0csUUFBUWxJLFFBQVEwbEIsV0FBVztBQUVqRDNqQixtQkFBYWlDLEdBQUcsS0FBS2tFLFFBQVFsSSxRQUFRMGxCLGFBQWErRCx1QkFBdUI5bkIsV0FBUztBQUNoRixjQUFNeXBCLG9CQUFvQixLQUFLZCxvQkFBb0JweEIsSUFBSXlJLE1BQU0zQixPQUFPcXJCLElBQUk7QUFDeEUsWUFBSUQsbUJBQW1CO0FBQ3JCenBCLGdCQUFNdUQsZUFBYztBQUNwQixnQkFBTXZILE9BQU8sS0FBSzRzQixnQkFBZ0J2d0I7QUFDbEMsZ0JBQU1zeEIsU0FBU0Ysa0JBQWtCRyxZQUFZLEtBQUt0akIsU0FBU3NqQjtBQUMzRCxjQUFJNXRCLEtBQUs2dEIsVUFBVTtBQUNqQjd0QixpQkFBSzZ0QixTQUFTO2NBQUVDLEtBQUtIO2NBQVFJLFVBQVU7WUFBUyxDQUFDO0FBQ2pEO1VBQ0Y7QUFHQS90QixlQUFLK2dCLFlBQVk0TTtRQUNuQjtNQUNGLENBQUM7SUFDSDtJQUVBTCxrQkFBa0I7QUFDaEIsWUFBTS9SLFVBQVU7UUFDZHZiLE1BQU0sS0FBSzRzQjtRQUNYSixXQUFXLEtBQUtqaUIsUUFBUWlpQjtRQUN4QkYsWUFBWSxLQUFLL2hCLFFBQVEraEI7O0FBRzNCLGFBQU8sSUFBSTBCLHFCQUFxQjduQixhQUFXLEtBQUs4bkIsa0JBQWtCOW5CLE9BQU8sR0FBR29WLE9BQU87SUFDckY7O0lBR0EwUyxrQkFBa0I5bkIsU0FBUztBQUN6QixZQUFNK25CLGdCQUFnQjdILFdBQVMsS0FBS3FHLGFBQWFueEIsSUFBSyxJQUFHOHFCLE1BQU1oa0IsT0FBTzNGLEVBQUcsRUFBQztBQUMxRSxZQUFNZ2hCLFdBQVcySSxXQUFTO0FBQ3hCLGFBQUswRyxvQkFBb0JDLGtCQUFrQjNHLE1BQU1oa0IsT0FBT3VyQjtBQUN4RCxhQUFLTyxTQUFTRCxjQUFjN0gsS0FBSyxDQUFDOztBQUdwQyxZQUFNNEcsbUJBQW1CLEtBQUtMLGdCQUFnQnB2QixTQUFTcUMsaUJBQWlCa2hCO0FBQ3hFLFlBQU1xTixrQkFBa0JuQixtQkFBbUIsS0FBS0Ysb0JBQW9CRTtBQUNwRSxXQUFLRixvQkFBb0JFLGtCQUFrQkE7QUFFM0MsaUJBQVc1RyxTQUFTbGdCLFNBQVM7QUFDM0IsWUFBSSxDQUFDa2dCLE1BQU1nSSxnQkFBZ0I7QUFDekIsZUFBS3hCLGdCQUFnQjtBQUNyQixlQUFLeUIsa0JBQWtCSixjQUFjN0gsS0FBSyxDQUFDO0FBRTNDO1FBQ0Y7QUFFQSxjQUFNa0ksMkJBQTJCbEksTUFBTWhrQixPQUFPdXJCLGFBQWEsS0FBS2Isb0JBQW9CQztBQUVwRixZQUFJb0IsbUJBQW1CRywwQkFBMEI7QUFDL0M3USxtQkFBUzJJLEtBQUs7QUFFZCxjQUFJLENBQUM0RyxpQkFBaUI7QUFDcEI7VUFDRjtBQUVBO1FBQ0Y7QUFHQSxZQUFJLENBQUNtQixtQkFBbUIsQ0FBQ0csMEJBQTBCO0FBQ2pEN1EsbUJBQVMySSxLQUFLO1FBQ2hCO01BQ0Y7SUFDRjtJQUVBOEcsbUNBQW1DO0FBQ2pDLFdBQUtULGVBQWUsb0JBQUkxeEIsSUFBRztBQUMzQixXQUFLMnhCLHNCQUFzQixvQkFBSTN4QixJQUFHO0FBRWxDLFlBQU13ekIsY0FBYy9pQixlQUFleEcsS0FBSzZtQix1QkFBdUIsS0FBS3ZoQixRQUFRbEksTUFBTTtBQUVsRixpQkFBV29zQixVQUFVRCxhQUFhO0FBRWhDLFlBQUksQ0FBQ0MsT0FBT2YsUUFBUXR1QixXQUFXcXZCLE1BQU0sR0FBRztBQUN0QztRQUNGO0FBRUEsY0FBTWhCLG9CQUFvQmhpQixlQUFlRyxRQUFROGlCLFVBQVVELE9BQU9mLElBQUksR0FBRyxLQUFLcGpCLFFBQVE7QUFHdEYsWUFBSTFMLFVBQVU2dUIsaUJBQWlCLEdBQUc7QUFDaEMsZUFBS2YsYUFBYXp4QixJQUFJeXpCLFVBQVVELE9BQU9mLElBQUksR0FBR2UsTUFBTTtBQUNwRCxlQUFLOUIsb0JBQW9CMXhCLElBQUl3ekIsT0FBT2YsTUFBTUQsaUJBQWlCO1FBQzdEO01BQ0Y7SUFDRjtJQUVBVSxTQUFTOXJCLFFBQVE7QUFDZixVQUFJLEtBQUt3cUIsa0JBQWtCeHFCLFFBQVE7QUFDakM7TUFDRjtBQUVBLFdBQUtpc0Isa0JBQWtCLEtBQUsvakIsUUFBUWxJLE1BQU07QUFDMUMsV0FBS3dxQixnQkFBZ0J4cUI7QUFDckJBLGFBQU85QyxVQUFVd1EsSUFBSWxDLG1CQUFpQjtBQUN0QyxXQUFLOGdCLGlCQUFpQnRzQixNQUFNO0FBRTVCK0IsbUJBQWF5QyxRQUFRLEtBQUt5RCxVQUFVcWhCLGdCQUFnQjtRQUFFam1CLGVBQWVyRDtNQUFPLENBQUM7SUFDL0U7SUFFQXNzQixpQkFBaUJ0c0IsUUFBUTtBQUV2QixVQUFJQSxPQUFPOUMsVUFBVUMsU0FBU29zQix3QkFBd0IsR0FBRztBQUN2RG5nQix1QkFBZUcsUUFBUXlnQiw0QkFBMEJocUIsT0FBT3BELFFBQVFtdEIsaUJBQWlCLENBQUMsRUFDL0U3c0IsVUFBVXdRLElBQUlsQyxtQkFBaUI7QUFDbEM7TUFDRjtBQUVBLGlCQUFXK2dCLGFBQWFuakIsZUFBZU8sUUFBUTNKLFFBQVEwcEIsdUJBQXVCLEdBQUc7QUFHL0UsbUJBQVc4QyxRQUFRcGpCLGVBQWVTLEtBQUswaUIsV0FBV3pDLG1CQUFtQixHQUFHO0FBQ3RFMEMsZUFBS3R2QixVQUFVd1EsSUFBSWxDLG1CQUFpQjtRQUN0QztNQUNGO0lBQ0Y7SUFFQXlnQixrQkFBa0JsWSxRQUFRO0FBQ3hCQSxhQUFPN1csVUFBVXpELE9BQU8rUixtQkFBaUI7QUFFekMsWUFBTWloQixjQUFjcmpCLGVBQWV4RyxLQUFNLEdBQUU2bUIscUJBQXNCLElBQUdqZSxtQkFBa0IsSUFBR3VJLE1BQU07QUFDL0YsaUJBQVcyWSxRQUFRRCxhQUFhO0FBQzlCQyxhQUFLeHZCLFVBQVV6RCxPQUFPK1IsbUJBQWlCO01BQ3pDO0lBQ0Y7O0lBR0EsT0FBT3RNLGdCQUFnQitILFFBQVE7QUFDN0IsYUFBTyxLQUFLb0UsS0FBSyxXQUFZO0FBQzNCLGNBQU1DLE9BQU84ZSxXQUFVeGhCLG9CQUFvQixNQUFNM0IsTUFBTTtBQUV2RCxZQUFJLE9BQU9BLFdBQVcsVUFBVTtBQUM5QjtRQUNGO0FBRUEsWUFBSXFFLEtBQUtyRSxNQUFNLE1BQU16TSxVQUFheU0sT0FBTzdDLFdBQVcsR0FBRyxLQUFLNkMsV0FBVyxlQUFlO0FBQ3BGLGdCQUFNLElBQUlZLFVBQVcsb0JBQW1CWixNQUFPLEdBQUU7UUFDbkQ7QUFFQXFFLGFBQUtyRSxNQUFNLEVBQUM7TUFDZCxDQUFDO0lBQ0g7RUFDRjtBQU1BbEYsZUFBYWlDLEdBQUdoSyxRQUFRMlUsdUJBQXFCLE1BQU07QUFDakQsZUFBV2dlLE9BQU92akIsZUFBZXhHLEtBQUs0bUIsaUJBQWlCLEdBQUc7QUFDeERZLGdCQUFVeGhCLG9CQUFvQitqQixHQUFHO0lBQ25DO0VBQ0YsQ0FBQztBQU1EaHVCLHFCQUFtQnlyQixTQUFTO0FDclI1QixNQUFNcnJCLFNBQU87QUFDYixNQUFNcUosYUFBVztBQUNqQixNQUFNRSxjQUFhLElBQUdGLFVBQVM7QUFFL0IsTUFBTWlMLGVBQWMsT0FBTS9LLFdBQVU7QUFDcEMsTUFBTWdMLGlCQUFnQixTQUFRaEwsV0FBVTtBQUN4QyxNQUFNNkssZUFBYyxPQUFNN0ssV0FBVTtBQUNwQyxNQUFNOEssZ0JBQWUsUUFBTzlLLFdBQVU7QUFDdEMsTUFBTW9ELHVCQUF3QixRQUFPcEQsV0FBVTtBQUMvQyxNQUFNaUcsZ0JBQWlCLFVBQVNqRyxXQUFVO0FBQzFDLE1BQU1xRyxzQkFBdUIsT0FBTXJHLFdBQVU7QUFFN0MsTUFBTXdGLGlCQUFpQjtBQUN2QixNQUFNQyxrQkFBa0I7QUFDeEIsTUFBTTZILGVBQWU7QUFDckIsTUFBTUMsaUJBQWlCO0FBQ3ZCLE1BQU0rVyxXQUFXO0FBQ2pCLE1BQU1DLFVBQVU7QUFFaEIsTUFBTXJoQixvQkFBb0I7QUFDMUIsTUFBTVQsb0JBQWtCO0FBQ3hCLE1BQU1DLG9CQUFrQjtBQUN4QixNQUFNOGhCLGlCQUFpQjtBQUV2QixNQUFNOUMsMkJBQTJCO0FBQ2pDLE1BQU0rQyx5QkFBeUI7QUFDL0IsTUFBTUMsK0JBQWdDLFFBQU9oRCx3QkFBeUI7QUFFdEUsTUFBTWlELHFCQUFxQjtBQUMzQixNQUFNQyxpQkFBaUI7QUFDdkIsTUFBTUMsaUJBQWtCLFlBQVdILDRCQUE2QixxQkFBb0JBLDRCQUE2QixpQkFBZ0JBLDRCQUE2QjtBQUM5SixNQUFNdmhCLHVCQUF1QjtBQUM3QixNQUFNMmhCLHNCQUF1QixHQUFFRCxjQUFlLEtBQUkxaEIsb0JBQXFCO0FBRXZFLE1BQU00aEIsOEJBQStCLElBQUc3aEIsaUJBQWtCLDRCQUEyQkEsaUJBQWtCLDZCQUE0QkEsaUJBQWtCO0FBTXJKLE1BQU04aEIsTUFBTixNQUFNQSxhQUFZdGxCLGNBQWM7SUFDOUJWLFlBQVl6TyxTQUFTO0FBQ25CLFlBQU1BLE9BQU87QUFDYixXQUFLOGUsVUFBVSxLQUFLMVAsU0FBU3JMLFFBQVFxd0Isa0JBQWtCO0FBRXZELFVBQUksQ0FBQyxLQUFLdFYsU0FBUztBQUNqQjtNQUdGO0FBR0EsV0FBSzRWLHNCQUFzQixLQUFLNVYsU0FBUyxLQUFLNlYsYUFBWSxDQUFFO0FBRTVEenJCLG1CQUFhaUMsR0FBRyxLQUFLaUUsVUFBVXNHLGVBQWU1TSxXQUFTLEtBQUs2UCxTQUFTN1AsS0FBSyxDQUFDO0lBQzdFOztJQUdBLFdBQVc1QyxPQUFPO0FBQ2hCLGFBQU9BO0lBQ1Q7O0lBR0E0VixPQUFPO0FBQ0wsWUFBTThZLFlBQVksS0FBS3hsQjtBQUN2QixVQUFJLEtBQUt5bEIsY0FBY0QsU0FBUyxHQUFHO0FBQ2pDO01BQ0Y7QUFHQSxZQUFNRSxTQUFTLEtBQUtDLGVBQWM7QUFFbEMsWUFBTXZWLFlBQVlzVixTQUNoQjVyQixhQUFheUMsUUFBUW1wQixRQUFRdGEsY0FBWTtRQUFFaFEsZUFBZW9xQjtPQUFXLElBQ3JFO0FBRUYsWUFBTTFWLFlBQVloVyxhQUFheUMsUUFBUWlwQixXQUFXdGEsY0FBWTtRQUFFOVAsZUFBZXNxQjtNQUFPLENBQUM7QUFFdkYsVUFBSTVWLFVBQVVuVCxvQkFBcUJ5VCxhQUFhQSxVQUFVelQsa0JBQW1CO0FBQzNFO01BQ0Y7QUFFQSxXQUFLaXBCLFlBQVlGLFFBQVFGLFNBQVM7QUFDbEMsV0FBS0ssVUFBVUwsV0FBV0UsTUFBTTtJQUNsQzs7SUFHQUcsVUFBVWoxQixTQUFTazFCLGFBQWE7QUFDOUIsVUFBSSxDQUFDbDFCLFNBQVM7QUFDWjtNQUNGO0FBRUFBLGNBQVFxRSxVQUFVd1EsSUFBSWxDLGlCQUFpQjtBQUV2QyxXQUFLc2lCLFVBQVUxa0IsZUFBZWtCLHVCQUF1QnpSLE9BQU8sQ0FBQztBQUU3RCxZQUFNc2MsV0FBV0EsTUFBTTtBQUNyQixZQUFJdGMsUUFBUXlFLGFBQWEsTUFBTSxNQUFNLE9BQU87QUFDMUN6RSxrQkFBUXFFLFVBQVV3USxJQUFJMUMsaUJBQWU7QUFDckM7UUFDRjtBQUVBblMsZ0JBQVFzTixnQkFBZ0IsVUFBVTtBQUNsQ3ROLGdCQUFRb04sYUFBYSxpQkFBaUIsSUFBSTtBQUMxQyxhQUFLK25CLGdCQUFnQm4xQixTQUFTLElBQUk7QUFDbENrSixxQkFBYXlDLFFBQVEzTCxTQUFTdWEsZUFBYTtVQUN6Qy9QLGVBQWUwcUI7UUFDakIsQ0FBQzs7QUFHSCxXQUFLdGxCLGVBQWUwTSxVQUFVdGMsU0FBU0EsUUFBUXFFLFVBQVVDLFNBQVM0TixpQkFBZSxDQUFDO0lBQ3BGO0lBRUE4aUIsWUFBWWgxQixTQUFTazFCLGFBQWE7QUFDaEMsVUFBSSxDQUFDbDFCLFNBQVM7QUFDWjtNQUNGO0FBRUFBLGNBQVFxRSxVQUFVekQsT0FBTytSLGlCQUFpQjtBQUMxQzNTLGNBQVFpbkIsS0FBSTtBQUVaLFdBQUsrTixZQUFZemtCLGVBQWVrQix1QkFBdUJ6UixPQUFPLENBQUM7QUFFL0QsWUFBTXNjLFdBQVdBLE1BQU07QUFDckIsWUFBSXRjLFFBQVF5RSxhQUFhLE1BQU0sTUFBTSxPQUFPO0FBQzFDekUsa0JBQVFxRSxVQUFVekQsT0FBT3VSLGlCQUFlO0FBQ3hDO1FBQ0Y7QUFFQW5TLGdCQUFRb04sYUFBYSxpQkFBaUIsS0FBSztBQUMzQ3BOLGdCQUFRb04sYUFBYSxZQUFZLElBQUk7QUFDckMsYUFBSytuQixnQkFBZ0JuMUIsU0FBUyxLQUFLO0FBQ25Da0oscUJBQWF5QyxRQUFRM0wsU0FBU3lhLGdCQUFjO1VBQUVqUSxlQUFlMHFCO1FBQVksQ0FBQzs7QUFHNUUsV0FBS3RsQixlQUFlME0sVUFBVXRjLFNBQVNBLFFBQVFxRSxVQUFVQyxTQUFTNE4saUJBQWUsQ0FBQztJQUNwRjtJQUVBeUcsU0FBUzdQLE9BQU87QUFDZCxVQUFJLENBQUUsQ0FBQ21NLGdCQUFnQkMsaUJBQWlCNkgsY0FBY0MsZ0JBQWdCK1csVUFBVUMsT0FBTyxFQUFFOW9CLFNBQVNwQyxNQUFNN0ksR0FBRyxHQUFJO0FBQzdHO01BQ0Y7QUFFQTZJLFlBQU1vWSxnQkFBZTtBQUNyQnBZLFlBQU11RCxlQUFjO0FBRXBCLFlBQU1zRSxXQUFXLEtBQUtna0IsYUFBWSxFQUFHaG5CLE9BQU8zTixhQUFXLENBQUNrRSxXQUFXbEUsT0FBTyxDQUFDO0FBQzNFLFVBQUlvMUI7QUFFSixVQUFJLENBQUNyQixVQUFVQyxPQUFPLEVBQUU5b0IsU0FBU3BDLE1BQU03SSxHQUFHLEdBQUc7QUFDM0NtMUIsNEJBQW9CemtCLFNBQVM3SCxNQUFNN0ksUUFBUTh6QixXQUFXLElBQUlwakIsU0FBU25OLFNBQVMsQ0FBQztNQUMvRSxPQUFPO0FBQ0wsY0FBTStWLFNBQVMsQ0FBQ3JFLGlCQUFpQjhILGNBQWMsRUFBRTlSLFNBQVNwQyxNQUFNN0ksR0FBRztBQUNuRW0xQiw0QkFBb0I5dEIscUJBQXFCcUosVUFBVTdILE1BQU0zQixRQUFRb1MsUUFBUSxJQUFJO01BQy9FO0FBRUEsVUFBSTZiLG1CQUFtQjtBQUNyQkEsMEJBQWtCaFcsTUFBTTtVQUFFaVcsZUFBZTtRQUFLLENBQUM7QUFDL0NaLGFBQUkxa0Isb0JBQW9CcWxCLGlCQUFpQixFQUFFdFosS0FBSTtNQUNqRDtJQUNGO0lBRUE2WSxlQUFlO0FBQ2IsYUFBT3BrQixlQUFleEcsS0FBS3dxQixxQkFBcUIsS0FBS3pWLE9BQU87SUFDOUQ7SUFFQWlXLGlCQUFpQjtBQUNmLGFBQU8sS0FBS0osYUFBWSxFQUFHNXFCLEtBQUs2RyxXQUFTLEtBQUtpa0IsY0FBY2prQixLQUFLLENBQUMsS0FBSztJQUN6RTtJQUVBOGpCLHNCQUFzQnhaLFFBQVF2SyxVQUFVO0FBQ3RDLFdBQUsya0IseUJBQXlCcGEsUUFBUSxRQUFRLFNBQVM7QUFFdkQsaUJBQVd0SyxTQUFTRCxVQUFVO0FBQzVCLGFBQUs0a0IsNkJBQTZCM2tCLEtBQUs7TUFDekM7SUFDRjtJQUVBMmtCLDZCQUE2QjNrQixPQUFPO0FBQ2xDQSxjQUFRLEtBQUs0a0IsaUJBQWlCNWtCLEtBQUs7QUFDbkMsWUFBTTZrQixXQUFXLEtBQUtaLGNBQWNqa0IsS0FBSztBQUN6QyxZQUFNOGtCLFlBQVksS0FBS0MsaUJBQWlCL2tCLEtBQUs7QUFDN0NBLFlBQU14RCxhQUFhLGlCQUFpQnFvQixRQUFRO0FBRTVDLFVBQUlDLGNBQWM5a0IsT0FBTztBQUN2QixhQUFLMGtCLHlCQUF5QkksV0FBVyxRQUFRLGNBQWM7TUFDakU7QUFFQSxVQUFJLENBQUNELFVBQVU7QUFDYjdrQixjQUFNeEQsYUFBYSxZQUFZLElBQUk7TUFDckM7QUFFQSxXQUFLa29CLHlCQUF5QjFrQixPQUFPLFFBQVEsS0FBSztBQUdsRCxXQUFLZ2xCLG1DQUFtQ2hsQixLQUFLO0lBQy9DO0lBRUFnbEIsbUNBQW1DaGxCLE9BQU87QUFDeEMsWUFBTXpKLFNBQVNvSixlQUFla0IsdUJBQXVCYixLQUFLO0FBRTFELFVBQUksQ0FBQ3pKLFFBQVE7QUFDWDtNQUNGO0FBRUEsV0FBS211Qix5QkFBeUJudUIsUUFBUSxRQUFRLFVBQVU7QUFFeEQsVUFBSXlKLE1BQU1wUCxJQUFJO0FBQ1osYUFBSzh6Qix5QkFBeUJudUIsUUFBUSxtQkFBb0IsR0FBRXlKLE1BQU1wUCxFQUFHLEVBQUM7TUFDeEU7SUFDRjtJQUVBMnpCLGdCQUFnQm4xQixTQUFTNjFCLE1BQU07QUFDN0IsWUFBTUgsWUFBWSxLQUFLQyxpQkFBaUIzMUIsT0FBTztBQUMvQyxVQUFJLENBQUMwMUIsVUFBVXJ4QixVQUFVQyxTQUFTMnZCLGNBQWMsR0FBRztBQUNqRDtNQUNGO0FBRUEsWUFBTWxoQixTQUFTQSxDQUFDN1IsVUFBVWtnQixjQUFjO0FBQ3RDLGNBQU1waEIsV0FBVXVRLGVBQWVHLFFBQVF4UCxVQUFVdzBCLFNBQVM7QUFDMUQsWUFBSTExQixVQUFTO0FBQ1hBLFVBQUFBLFNBQVFxRSxVQUFVME8sT0FBT3FPLFdBQVd5VSxJQUFJO1FBQzFDOztBQUdGOWlCLGFBQU9vZSwwQkFBMEJ4ZSxpQkFBaUI7QUFDbERJLGFBQU9taEIsd0JBQXdCL2hCLGlCQUFlO0FBQzlDdWpCLGdCQUFVdG9CLGFBQWEsaUJBQWlCeW9CLElBQUk7SUFDOUM7SUFFQVAseUJBQXlCdDFCLFNBQVN3cEIsV0FBV2hkLE9BQU87QUFDbEQsVUFBSSxDQUFDeE0sUUFBUXdFLGFBQWFnbEIsU0FBUyxHQUFHO0FBQ3BDeHBCLGdCQUFRb04sYUFBYW9jLFdBQVdoZCxLQUFLO01BQ3ZDO0lBQ0Y7SUFFQXFvQixjQUFjdFosTUFBTTtBQUNsQixhQUFPQSxLQUFLbFgsVUFBVUMsU0FBU3FPLGlCQUFpQjtJQUNsRDs7SUFHQTZpQixpQkFBaUJqYSxNQUFNO0FBQ3JCLGFBQU9BLEtBQUsxSyxRQUFRMGpCLG1CQUFtQixJQUFJaFosT0FBT2hMLGVBQWVHLFFBQVE2akIscUJBQXFCaFosSUFBSTtJQUNwRzs7SUFHQW9hLGlCQUFpQnBhLE1BQU07QUFDckIsYUFBT0EsS0FBS3hYLFFBQVFzd0IsY0FBYyxLQUFLOVk7SUFDekM7O0lBR0EsT0FBT2xWLGdCQUFnQitILFFBQVE7QUFDN0IsYUFBTyxLQUFLb0UsS0FBSyxXQUFZO0FBQzNCLGNBQU1DLE9BQU9naUIsS0FBSTFrQixvQkFBb0IsSUFBSTtBQUV6QyxZQUFJLE9BQU8zQixXQUFXLFVBQVU7QUFDOUI7UUFDRjtBQUVBLFlBQUlxRSxLQUFLckUsTUFBTSxNQUFNek0sVUFBYXlNLE9BQU83QyxXQUFXLEdBQUcsS0FBSzZDLFdBQVcsZUFBZTtBQUNwRixnQkFBTSxJQUFJWSxVQUFXLG9CQUFtQlosTUFBTyxHQUFFO1FBQ25EO0FBRUFxRSxhQUFLckUsTUFBTSxFQUFDO01BQ2QsQ0FBQztJQUNIO0VBQ0Y7QUFNQWxGLGVBQWFpQyxHQUFHN0ksVUFBVXVRLHNCQUFzQkQsc0JBQXNCLFNBQVU5SixPQUFPO0FBQ3JGLFFBQUksQ0FBQyxLQUFLLE1BQU0sRUFBRW9DLFNBQVMsS0FBSzZHLE9BQU8sR0FBRztBQUN4Q2pKLFlBQU11RCxlQUFjO0lBQ3RCO0FBRUEsUUFBSW5JLFdBQVcsSUFBSSxHQUFHO0FBQ3BCO0lBQ0Y7QUFFQXV3QixRQUFJMWtCLG9CQUFvQixJQUFJLEVBQUUrTCxLQUFJO0VBQ3BDLENBQUM7QUFLRDVTLGVBQWFpQyxHQUFHaEssUUFBUTJVLHFCQUFxQixNQUFNO0FBQ2pELGVBQVc5VixXQUFXdVEsZUFBZXhHLEtBQUt5cUIsMkJBQTJCLEdBQUc7QUFDdEVDLFVBQUkxa0Isb0JBQW9CL1AsT0FBTztJQUNqQztFQUNGLENBQUM7QUFLRDhGLHFCQUFtQjJ1QixHQUFHO0FDeFN0QixNQUFNdnVCLE9BQU87QUFDYixNQUFNcUosV0FBVztBQUNqQixNQUFNRSxZQUFhLElBQUdGLFFBQVM7QUFFL0IsTUFBTXVtQixrQkFBbUIsWUFBV3JtQixTQUFVO0FBQzlDLE1BQU1zbUIsaUJBQWtCLFdBQVV0bUIsU0FBVTtBQUM1QyxNQUFNc1MsZ0JBQWlCLFVBQVN0UyxTQUFVO0FBQzFDLE1BQU1xZCxpQkFBa0IsV0FBVXJkLFNBQVU7QUFDNUMsTUFBTStLLGFBQWMsT0FBTS9LLFNBQVU7QUFDcEMsTUFBTWdMLGVBQWdCLFNBQVFoTCxTQUFVO0FBQ3hDLE1BQU02SyxhQUFjLE9BQU03SyxTQUFVO0FBQ3BDLE1BQU04SyxjQUFlLFFBQU85SyxTQUFVO0FBRXRDLE1BQU15QyxrQkFBa0I7QUFDeEIsTUFBTThqQixrQkFBa0I7QUFDeEIsTUFBTTdqQixrQkFBa0I7QUFDeEIsTUFBTXlVLHFCQUFxQjtBQUUzQixNQUFNM1ksY0FBYztJQUNsQm9mLFdBQVc7SUFDWDRJLFVBQVU7SUFDVnpJLE9BQU87RUFDVDtBQUVBLE1BQU14ZixVQUFVO0lBQ2RxZixXQUFXO0lBQ1g0SSxVQUFVO0lBQ1Z6SSxPQUFPO0VBQ1Q7QUFNQSxNQUFNMEksUUFBTixNQUFNQSxlQUFjL21CLGNBQWM7SUFDaENWLFlBQVl6TyxTQUFTb08sUUFBUTtBQUMzQixZQUFNcE8sU0FBU29PLE1BQU07QUFFckIsV0FBS3lmLFdBQVc7QUFDaEIsV0FBS3NJLHVCQUF1QjtBQUM1QixXQUFLQywwQkFBMEI7QUFDL0IsV0FBS2pJLGNBQWE7SUFDcEI7O0lBR0EsV0FBV25nQixVQUFVO0FBQ25CLGFBQU9BO0lBQ1Q7SUFFQSxXQUFXQyxjQUFjO0FBQ3ZCLGFBQU9BO0lBQ1Q7SUFFQSxXQUFXL0gsT0FBTztBQUNoQixhQUFPQTtJQUNUOztJQUdBNFYsT0FBTztBQUNMLFlBQU1vRCxZQUFZaFcsYUFBYXlDLFFBQVEsS0FBS3lELFVBQVVrTCxVQUFVO0FBRWhFLFVBQUk0RSxVQUFVblQsa0JBQWtCO0FBQzlCO01BQ0Y7QUFFQSxXQUFLc3FCLGNBQWE7QUFFbEIsVUFBSSxLQUFLaG5CLFFBQVFnZSxXQUFXO0FBQzFCLGFBQUtqZSxTQUFTL0ssVUFBVXdRLElBQUkzQyxlQUFlO01BQzdDO0FBRUEsWUFBTW9LLFdBQVdBLE1BQU07QUFDckIsYUFBS2xOLFNBQVMvSyxVQUFVekQsT0FBT2dtQixrQkFBa0I7QUFDakQxZCxxQkFBYXlDLFFBQVEsS0FBS3lELFVBQVVtTCxXQUFXO0FBRS9DLGFBQUsrYixtQkFBa0I7O0FBR3pCLFdBQUtsbkIsU0FBUy9LLFVBQVV6RCxPQUFPbzFCLGVBQWU7QUFDOUMvd0IsYUFBTyxLQUFLbUssUUFBUTtBQUNwQixXQUFLQSxTQUFTL0ssVUFBVXdRLElBQUkxQyxpQkFBaUJ5VSxrQkFBa0I7QUFFL0QsV0FBS2hYLGVBQWUwTSxVQUFVLEtBQUtsTixVQUFVLEtBQUtDLFFBQVFnZSxTQUFTO0lBQ3JFO0lBRUF4UixPQUFPO0FBQ0wsVUFBSSxDQUFDLEtBQUswYSxRQUFPLEdBQUk7QUFDbkI7TUFDRjtBQUVBLFlBQU0vVyxZQUFZdFcsYUFBYXlDLFFBQVEsS0FBS3lELFVBQVVvTCxVQUFVO0FBRWhFLFVBQUlnRixVQUFVelQsa0JBQWtCO0FBQzlCO01BQ0Y7QUFFQSxZQUFNdVEsV0FBV0EsTUFBTTtBQUNyQixhQUFLbE4sU0FBUy9LLFVBQVV3USxJQUFJbWhCLGVBQWU7QUFDM0MsYUFBSzVtQixTQUFTL0ssVUFBVXpELE9BQU9nbUIsb0JBQW9CelUsZUFBZTtBQUNsRWpKLHFCQUFheUMsUUFBUSxLQUFLeUQsVUFBVXFMLFlBQVk7O0FBR2xELFdBQUtyTCxTQUFTL0ssVUFBVXdRLElBQUkrUixrQkFBa0I7QUFDOUMsV0FBS2hYLGVBQWUwTSxVQUFVLEtBQUtsTixVQUFVLEtBQUtDLFFBQVFnZSxTQUFTO0lBQ3JFO0lBRUE3ZCxVQUFVO0FBQ1IsV0FBSzZtQixjQUFhO0FBRWxCLFVBQUksS0FBS0UsUUFBTyxHQUFJO0FBQ2xCLGFBQUtubkIsU0FBUy9LLFVBQVV6RCxPQUFPdVIsZUFBZTtNQUNoRDtBQUVBLFlBQU0zQyxRQUFPO0lBQ2Y7SUFFQSttQixVQUFVO0FBQ1IsYUFBTyxLQUFLbm5CLFNBQVMvSyxVQUFVQyxTQUFTNk4sZUFBZTtJQUN6RDs7SUFJQW1rQixxQkFBcUI7QUFDbkIsVUFBSSxDQUFDLEtBQUtqbkIsUUFBUTRtQixVQUFVO0FBQzFCO01BQ0Y7QUFFQSxVQUFJLEtBQUtFLHdCQUF3QixLQUFLQyx5QkFBeUI7QUFDN0Q7TUFDRjtBQUVBLFdBQUt2SSxXQUFXeG1CLFdBQVcsTUFBTTtBQUMvQixhQUFLd1UsS0FBSTtNQUNYLEdBQUcsS0FBS3hNLFFBQVFtZSxLQUFLO0lBQ3ZCO0lBRUFnSixlQUFlMXRCLE9BQU8ydEIsZUFBZTtBQUNuQyxjQUFRM3RCLE1BQU1NLE1BQUk7UUFDaEIsS0FBSztRQUNMLEtBQUssWUFBWTtBQUNmLGVBQUsrc0IsdUJBQXVCTTtBQUM1QjtRQUNGO1FBRUEsS0FBSztRQUNMLEtBQUssWUFBWTtBQUNmLGVBQUtMLDBCQUEwQks7QUFDL0I7UUFDRjtNQUtGO0FBRUEsVUFBSUEsZUFBZTtBQUNqQixhQUFLSixjQUFhO0FBQ2xCO01BQ0Y7QUFFQSxZQUFNN2MsY0FBYzFRLE1BQU0wQjtBQUMxQixVQUFJLEtBQUs0RSxhQUFhb0ssZUFBZSxLQUFLcEssU0FBUzlLLFNBQVNrVixXQUFXLEdBQUc7QUFDeEU7TUFDRjtBQUVBLFdBQUs4YyxtQkFBa0I7SUFDekI7SUFFQW5JLGdCQUFnQjtBQUNkamxCLG1CQUFhaUMsR0FBRyxLQUFLaUUsVUFBVTBtQixpQkFBaUJodEIsV0FBUyxLQUFLMHRCLGVBQWUxdEIsT0FBTyxJQUFJLENBQUM7QUFDekZJLG1CQUFhaUMsR0FBRyxLQUFLaUUsVUFBVTJtQixnQkFBZ0JqdEIsV0FBUyxLQUFLMHRCLGVBQWUxdEIsT0FBTyxLQUFLLENBQUM7QUFDekZJLG1CQUFhaUMsR0FBRyxLQUFLaUUsVUFBVTJTLGVBQWVqWixXQUFTLEtBQUswdEIsZUFBZTF0QixPQUFPLElBQUksQ0FBQztBQUN2RkksbUJBQWFpQyxHQUFHLEtBQUtpRSxVQUFVMGQsZ0JBQWdCaGtCLFdBQVMsS0FBSzB0QixlQUFlMXRCLE9BQU8sS0FBSyxDQUFDO0lBQzNGO0lBRUF1dEIsZ0JBQWdCO0FBQ2R0ZCxtQkFBYSxLQUFLOFUsUUFBUTtBQUMxQixXQUFLQSxXQUFXO0lBQ2xCOztJQUdBLE9BQU94bkIsZ0JBQWdCK0gsUUFBUTtBQUM3QixhQUFPLEtBQUtvRSxLQUFLLFdBQVk7QUFDM0IsY0FBTUMsT0FBT3lqQixPQUFNbm1CLG9CQUFvQixNQUFNM0IsTUFBTTtBQUVuRCxZQUFJLE9BQU9BLFdBQVcsVUFBVTtBQUM5QixjQUFJLE9BQU9xRSxLQUFLckUsTUFBTSxNQUFNLGFBQWE7QUFDdkMsa0JBQU0sSUFBSVksVUFBVyxvQkFBbUJaLE1BQU8sR0FBRTtVQUNuRDtBQUVBcUUsZUFBS3JFLE1BQU0sRUFBRSxJQUFJO1FBQ25CO01BQ0YsQ0FBQztJQUNIO0VBQ0Y7QUFNQXVELHVCQUFxQnVrQixLQUFLO0FBTTFCcHdCLHFCQUFtQm93QixLQUFLOzs7QWxGek54QixxQkFBTzs7O0FtRkxQLHNCQUFjO0FBRWQsb0JBQUFRLFNBQUUsV0FBWTtBQUNaLHNCQUFBQSxTQUFFLGFBQWEsRUFBRSxPQUFPLFdBQVk7QUFDbEMsZUFBUyxXQUFXLEtBQUs7QUFBQSxJQUMzQixDQUFDO0FBQUEsRUFDSCxDQUFDOzs7QUNORCxNQUFBQyxpQkFBYzs7O0FDQWQsTUFBTSxhQUFhO0FBQUEsSUFDakIsYUFBZTtBQUFBLElBQ2YsWUFBZTtBQUFBLElBQ2YsYUFBZTtBQUFBLElBQ2YsYUFBZTtBQUFBLElBQ2YsYUFBZTtBQUFBLElBQ2YsYUFBZTtBQUFBLElBQ2YsYUFBZTtBQUFBLElBQ2YsU0FBUztBQUFBLE1BQ1A7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsSUFDQSxZQUFlO0FBQUEsSUFDZixhQUFlO0FBQUEsSUFDZixhQUFlO0FBQUEsSUFDZixjQUFlO0FBQUEsSUFDZixjQUFlO0FBQUEsSUFDZixlQUFlO0FBQUEsSUFDZixlQUFlO0FBQUEsSUFDZixZQUFlO0FBQUEsSUFDZixhQUFlO0FBQUEsSUFDZixjQUFlO0FBQUEsSUFDZixjQUFlO0FBQUEsSUFDZixjQUFlO0FBQUEsSUFDZixlQUFlO0FBQUEsSUFDZixlQUFnQjtBQUFBLElBQ2hCLGVBQWU7QUFBQSxFQUNqQjtBQUNBLE1BQU8scUJBQVE7OztBRDdDZixXQUFTLGFBQWFDLE1BQUs7QUFDekIsV0FBTyxLQUFLLE1BQU0sS0FBSyxPQUFPLElBQUlBLElBQUc7QUFBQSxFQUN2QztBQUVBLHFCQUFBQyxTQUFFLFdBQVc7QUFDWCxnQkFBWSxXQUFXO0FBQ3JCLFlBQU0sSUFBSSxhQUFhLG1CQUFXLE1BQU0sTUFBTTtBQUM5QyxZQUFNLE9BQU8sbUJBQVcsTUFBTSxDQUFDO0FBQy9CLFlBQU0sUUFBUSxtQkFBVyxJQUFJO0FBQzdCLFlBQU0sS0FBSyxhQUFhLEVBQUUsSUFBSSxNQUFNO0FBQ3BDLHlCQUFBQSxTQUFFLEdBQUcsRUFBRSxJQUFJLGVBQWUsT0FBTztBQUNqQyx5QkFBQUEsU0FBRSxTQUFTLEVBQUUsSUFBSSxlQUFlLElBQUksWUFBWSxLQUFLO0FBQUEsSUFDdkQsR0FBRyxHQUFHO0FBQUEsRUFDUixDQUFDOzs7QUVkRCxHQUFDLFdBQVc7QUFDVixRQUFJLGdCQUFnQixpQkFBaUI7QUFFckMsYUFBUyxtQkFBbUI7QUFDMUIsVUFBSSxPQUFPLE9BQU8sZ0JBQWdCO0FBQVksZUFBTyxPQUFPO0FBRTVELGVBQVNDLGFBQVksT0FBTyxRQUFRO0FBQ2xDLGlCQUFTLFVBQVUsRUFBQyxTQUFTLE9BQU8sWUFBWSxPQUFPLFFBQVEsT0FBUztBQUN4RSxZQUFJLE1BQU0sU0FBUyxZQUFZLGFBQWE7QUFDNUMsWUFBSSxnQkFBZ0IsT0FBTyxPQUFPLFNBQVMsT0FBTyxZQUFZLE9BQU8sTUFBTTtBQUMzRSxlQUFPO0FBQUEsTUFDVDtBQUNBLE1BQUFBLGFBQVksWUFBWSxPQUFPLE1BQU07QUFDckMsYUFBT0E7QUFBQSxJQUNUO0FBRUEsYUFBUyxpQkFBaUIsTUFBTSxPQUFPO0FBQ3JDLFVBQUksUUFBUSxTQUFTLGNBQWMsT0FBTztBQUMxQyxZQUFNLE9BQU87QUFDYixZQUFNLE9BQU87QUFDYixZQUFNLFFBQVE7QUFDZCxhQUFPO0FBQUEsSUFDVDtBQUVBLGFBQVMsWUFBWSxTQUFTLG1CQUFtQjtBQUMvQyxVQUFJLEtBQUssUUFBUSxhQUFhLFNBQVMsR0FDbkMsU0FBUyxpQkFBaUIsV0FBVyxRQUFRLGFBQWEsYUFBYSxDQUFDLEdBQ3hFLE9BQU8saUJBQWlCLGVBQWUsUUFBUSxhQUFhLFdBQVcsQ0FBQyxHQUN4RSxPQUFPLFNBQVMsY0FBYyxNQUFNLEdBQ3BDLFNBQVMsU0FBUyxjQUFjLE9BQU8sR0FDdkMsU0FBUyxRQUFRLGFBQWEsUUFBUTtBQUUxQyxXQUFLLFNBQVUsUUFBUSxhQUFhLGFBQWEsTUFBTSxRQUFTLFFBQVE7QUFDeEUsV0FBSyxTQUFTO0FBQ2QsV0FBSyxNQUFNLFVBQVU7QUFFckIsVUFBSTtBQUFRLGFBQUssU0FBUztBQUFBLGVBQ2pCO0FBQW1CLGFBQUssU0FBUztBQUUxQyxXQUFLLFlBQVksSUFBSTtBQUNyQixXQUFLLFlBQVksTUFBTTtBQUN2QixlQUFTLEtBQUssWUFBWSxJQUFJO0FBSTlCLGFBQU8sT0FBTztBQUNkLFdBQUssWUFBWSxNQUFNO0FBQ3ZCLGFBQU8sTUFBTTtBQUFBLElBQ2Y7QUFFQSxXQUFPLGlCQUFpQixTQUFTLFNBQVMsR0FBRztBQUMzQyxVQUFJLFVBQVUsRUFBRTtBQUNoQixVQUFJLEVBQUU7QUFBa0I7QUFFeEIsYUFBTyxXQUFXLFFBQVEsY0FBYztBQUN0QyxZQUFJLG1CQUFtQixJQUFJLGNBQWMsc0JBQXNCO0FBQUEsVUFDN0QsV0FBVztBQUFBLFVBQU0sY0FBYztBQUFBLFFBQ2pDLENBQUM7QUFFRCxZQUFJLENBQUMsUUFBUSxjQUFjLGdCQUFnQixHQUFHO0FBQzVDLFlBQUUsZUFBZTtBQUNqQixZQUFFLHlCQUF5QjtBQUMzQixpQkFBTztBQUFBLFFBQ1Q7QUFFQSxZQUFJLFFBQVEsYUFBYSxhQUFhLEdBQUc7QUFDdkMsc0JBQVksU0FBUyxFQUFFLFdBQVcsRUFBRSxRQUFRO0FBQzVDLFlBQUUsZUFBZTtBQUNqQixpQkFBTztBQUFBLFFBQ1QsT0FBTztBQUNMLG9CQUFVLFFBQVE7QUFBQSxRQUNwQjtBQUFBLE1BQ0Y7QUFBQSxJQUNGLEdBQUcsS0FBSztBQUVSLFdBQU8saUJBQWlCLHNCQUFzQixTQUFVLEdBQUc7QUFDekQsVUFBSSxVQUFVLEVBQUUsT0FBTyxhQUFhLGNBQWM7QUFDbEQsVUFBRyxXQUFXLENBQUMsT0FBTyxRQUFRLE9BQU8sR0FBRztBQUN0QyxVQUFFLGVBQWU7QUFBQSxNQUNuQjtBQUFBLElBQ0YsR0FBRyxLQUFLO0FBQUEsRUFDVixHQUFHOzs7QUNsRkksTUFBSSxVQUFVLENBQUMsVUFBVTtBQUM5QixRQUFHLE9BQU8sVUFBVSxZQUFXO0FBQzdCLGFBQU87SUFDVCxPQUFPO0FBQ0wsVUFBSUMsWUFBVSxXQUFXO0FBQUUsZUFBTztNQUFNO0FBQ3hDLGFBQU9BO0lBQ1Q7RUFDRjtBQ1JPLE1BQU0sYUFBYSxPQUFPLFNBQVMsY0FBYyxPQUFPO0FBQ3hELE1BQU0sWUFBWSxPQUFPLFdBQVcsY0FBYyxTQUFTO0FBQzNELE1BQU1DLFVBQVMsY0FBYyxhQUFhQTtBQUMxQyxNQUFNLGNBQWM7QUFDcEIsTUFBTSxnQkFBZ0IsRUFBQyxZQUFZLEdBQUcsTUFBTSxHQUFHLFNBQVMsR0FBRyxRQUFRLEVBQUM7QUFDcEUsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxpQkFBaUI7SUFDNUIsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7RUFDWDtBQUNPLE1BQU0saUJBQWlCO0lBQzVCLE9BQU87SUFDUCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0VBQ1Q7QUFFTyxNQUFNLGFBQWE7SUFDeEIsVUFBVTtJQUNWLFdBQVc7RUFDYjtBQUNPLE1BQU0sYUFBYTtJQUN4QixVQUFVO0VBQ1o7QUNyQkEsTUFBcUIsT0FBckIsTUFBMEI7SUFDeEIsWUFBWSxTQUFTLE9BQU8sU0FBUyxTQUFRO0FBQzNDLFdBQUssVUFBVTtBQUNmLFdBQUssUUFBUTtBQUNiLFdBQUssVUFBVSxXQUFXLFdBQVc7QUFBRSxlQUFPLENBQUM7TUFBRTtBQUNqRCxXQUFLLGVBQWU7QUFDcEIsV0FBSyxVQUFVO0FBQ2YsV0FBSyxlQUFlO0FBQ3BCLFdBQUssV0FBVyxDQUFDO0FBQ2pCLFdBQUssT0FBTztJQUNkO0lBTUEsT0FBTyxTQUFRO0FBQ2IsV0FBSyxVQUFVO0FBQ2YsV0FBSyxNQUFNO0FBQ1gsV0FBSyxLQUFLO0lBQ1o7SUFLQSxPQUFNO0FBQ0osVUFBRyxLQUFLLFlBQVksU0FBUyxHQUFFO0FBQUU7TUFBTztBQUN4QyxXQUFLLGFBQWE7QUFDbEIsV0FBSyxPQUFPO0FBQ1osV0FBSyxRQUFRLE9BQU8sS0FBSztRQUN2QixPQUFPLEtBQUssUUFBUTtRQUNwQixPQUFPLEtBQUs7UUFDWixTQUFTLEtBQUssUUFBUTtRQUN0QixLQUFLLEtBQUs7UUFDVixVQUFVLEtBQUssUUFBUSxRQUFRO01BQ2pDLENBQUM7SUFDSDtJQU9BLFFBQVEsUUFBUSxVQUFTO0FBQ3ZCLFVBQUcsS0FBSyxZQUFZLE1BQU0sR0FBRTtBQUMxQixpQkFBUyxLQUFLLGFBQWEsUUFBUTtNQUNyQztBQUVBLFdBQUssU0FBUyxLQUFLLEVBQUMsUUFBUSxTQUFRLENBQUM7QUFDckMsYUFBTztJQUNUO0lBS0EsUUFBTztBQUNMLFdBQUssZUFBZTtBQUNwQixXQUFLLE1BQU07QUFDWCxXQUFLLFdBQVc7QUFDaEIsV0FBSyxlQUFlO0FBQ3BCLFdBQUssT0FBTztJQUNkO0lBS0EsYUFBYSxFQUFDLFFBQVEsVUFBVSxLQUFBLEdBQU07QUFDcEMsV0FBSyxTQUFTLE9BQU8sQ0FBQSxNQUFLLEVBQUUsV0FBVyxNQUFNLEVBQzFDLFFBQVEsQ0FBQSxNQUFLLEVBQUUsU0FBUyxRQUFRLENBQUM7SUFDdEM7SUFLQSxpQkFBZ0I7QUFDZCxVQUFHLENBQUMsS0FBSyxVQUFTO0FBQUU7TUFBTztBQUMzQixXQUFLLFFBQVEsSUFBSSxLQUFLLFFBQVE7SUFDaEM7SUFLQSxnQkFBZTtBQUNiLG1CQUFhLEtBQUssWUFBWTtBQUM5QixXQUFLLGVBQWU7SUFDdEI7SUFLQSxlQUFjO0FBQ1osVUFBRyxLQUFLLGNBQWE7QUFBRSxhQUFLLGNBQWM7TUFBRTtBQUM1QyxXQUFLLE1BQU0sS0FBSyxRQUFRLE9BQU8sUUFBUTtBQUN2QyxXQUFLLFdBQVcsS0FBSyxRQUFRLGVBQWUsS0FBSyxHQUFHO0FBRXBELFdBQUssUUFBUSxHQUFHLEtBQUssVUFBVSxDQUFBLFlBQVc7QUFDeEMsYUFBSyxlQUFlO0FBQ3BCLGFBQUssY0FBYztBQUNuQixhQUFLLGVBQWU7QUFDcEIsYUFBSyxhQUFhLE9BQU87TUFDM0IsQ0FBQztBQUVELFdBQUssZUFBZSxXQUFXLE1BQU07QUFDbkMsYUFBSyxRQUFRLFdBQVcsQ0FBQyxDQUFDO01BQzVCLEdBQUcsS0FBSyxPQUFPO0lBQ2pCO0lBS0EsWUFBWSxRQUFPO0FBQ2pCLGFBQU8sS0FBSyxnQkFBZ0IsS0FBSyxhQUFhLFdBQVc7SUFDM0Q7SUFLQSxRQUFRLFFBQVEsVUFBUztBQUN2QixXQUFLLFFBQVEsUUFBUSxLQUFLLFVBQVUsRUFBQyxRQUFRLFNBQVEsQ0FBQztJQUN4RDtFQUNGO0FDOUdBLE1BQXFCLFFBQXJCLE1BQTJCO0lBQ3pCLFlBQVksVUFBVSxXQUFVO0FBQzlCLFdBQUssV0FBVztBQUNoQixXQUFLLFlBQVk7QUFDakIsV0FBSyxRQUFRO0FBQ2IsV0FBSyxRQUFRO0lBQ2Y7SUFFQSxRQUFPO0FBQ0wsV0FBSyxRQUFRO0FBQ2IsbUJBQWEsS0FBSyxLQUFLO0lBQ3pCO0lBS0Esa0JBQWlCO0FBQ2YsbUJBQWEsS0FBSyxLQUFLO0FBRXZCLFdBQUssUUFBUSxXQUFXLE1BQU07QUFDNUIsYUFBSyxRQUFRLEtBQUssUUFBUTtBQUMxQixhQUFLLFNBQVM7TUFDaEIsR0FBRyxLQUFLLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQztJQUNuQztFQUNGO0FDMUJBLE1BQXFCLFVBQXJCLE1BQTZCO0lBQzNCLFlBQVksT0FBTyxRQUFRLFFBQU87QUFDaEMsV0FBSyxRQUFRLGVBQWU7QUFDNUIsV0FBSyxRQUFRO0FBQ2IsV0FBSyxTQUFTLFFBQVEsVUFBVSxDQUFDLENBQUM7QUFDbEMsV0FBSyxTQUFTO0FBQ2QsV0FBSyxXQUFXLENBQUM7QUFDakIsV0FBSyxhQUFhO0FBQ2xCLFdBQUssVUFBVSxLQUFLLE9BQU87QUFDM0IsV0FBSyxhQUFhO0FBQ2xCLFdBQUssV0FBVyxJQUFJLEtBQUssTUFBTSxlQUFlLE1BQU0sS0FBSyxRQUFRLEtBQUssT0FBTztBQUM3RSxXQUFLLGFBQWEsQ0FBQztBQUNuQixXQUFLLGtCQUFrQixDQUFDO0FBRXhCLFdBQUssY0FBYyxJQUFJLE1BQU0sTUFBTTtBQUNqQyxZQUFHLEtBQUssT0FBTyxZQUFZLEdBQUU7QUFBRSxlQUFLLE9BQU87UUFBRTtNQUMvQyxHQUFHLEtBQUssT0FBTyxhQUFhO0FBQzVCLFdBQUssZ0JBQWdCLEtBQUssS0FBSyxPQUFPLFFBQVEsTUFBTSxLQUFLLFlBQVksTUFBTSxDQUFDLENBQUM7QUFDN0UsV0FBSyxnQkFBZ0IsS0FBSyxLQUFLLE9BQU8sT0FBTyxNQUFNO0FBQ2pELGFBQUssWUFBWSxNQUFNO0FBQ3ZCLFlBQUcsS0FBSyxVQUFVLEdBQUU7QUFBRSxlQUFLLE9BQU87UUFBRTtNQUN0QyxDQUFDLENBQ0Q7QUFDQSxXQUFLLFNBQVMsUUFBUSxNQUFNLE1BQU07QUFDaEMsYUFBSyxRQUFRLGVBQWU7QUFDNUIsYUFBSyxZQUFZLE1BQU07QUFDdkIsYUFBSyxXQUFXLFFBQVEsQ0FBQSxjQUFhLFVBQVUsS0FBSyxDQUFDO0FBQ3JELGFBQUssYUFBYSxDQUFDO01BQ3JCLENBQUM7QUFDRCxXQUFLLFNBQVMsUUFBUSxTQUFTLE1BQU07QUFDbkMsYUFBSyxRQUFRLGVBQWU7QUFDNUIsWUFBRyxLQUFLLE9BQU8sWUFBWSxHQUFFO0FBQUUsZUFBSyxZQUFZLGdCQUFnQjtRQUFFO01BQ3BFLENBQUM7QUFDRCxXQUFLLFFBQVEsTUFBTTtBQUNqQixhQUFLLFlBQVksTUFBTTtBQUN2QixZQUFHLEtBQUssT0FBTyxVQUFVO0FBQUcsZUFBSyxPQUFPLElBQUksV0FBVyxTQUFTLEtBQUssS0FBQSxJQUFTLEtBQUssUUFBUSxDQUFBLEVBQUc7QUFDOUYsYUFBSyxRQUFRLGVBQWU7QUFDNUIsYUFBSyxPQUFPLE9BQU8sSUFBSTtNQUN6QixDQUFDO0FBQ0QsV0FBSyxRQUFRLENBQUEsV0FBVTtBQUNyQixZQUFHLEtBQUssT0FBTyxVQUFVO0FBQUcsZUFBSyxPQUFPLElBQUksV0FBVyxTQUFTLEtBQUssS0FBQSxJQUFTLE1BQU07QUFDcEYsWUFBRyxLQUFLLFVBQVUsR0FBRTtBQUFFLGVBQUssU0FBUyxNQUFNO1FBQUU7QUFDNUMsYUFBSyxRQUFRLGVBQWU7QUFDNUIsWUFBRyxLQUFLLE9BQU8sWUFBWSxHQUFFO0FBQUUsZUFBSyxZQUFZLGdCQUFnQjtRQUFFO01BQ3BFLENBQUM7QUFDRCxXQUFLLFNBQVMsUUFBUSxXQUFXLE1BQU07QUFDckMsWUFBRyxLQUFLLE9BQU8sVUFBVTtBQUFHLGVBQUssT0FBTyxJQUFJLFdBQVcsV0FBVyxLQUFLLEtBQUEsS0FBVSxLQUFLLFFBQVEsQ0FBQSxLQUFNLEtBQUssU0FBUyxPQUFPO0FBQ3pILFlBQUksWUFBWSxJQUFJLEtBQUssTUFBTSxlQUFlLE9BQU8sUUFBUSxDQUFDLENBQUMsR0FBRyxLQUFLLE9BQU87QUFDOUUsa0JBQVUsS0FBSztBQUNmLGFBQUssUUFBUSxlQUFlO0FBQzVCLGFBQUssU0FBUyxNQUFNO0FBQ3BCLFlBQUcsS0FBSyxPQUFPLFlBQVksR0FBRTtBQUFFLGVBQUssWUFBWSxnQkFBZ0I7UUFBRTtNQUNwRSxDQUFDO0FBQ0QsV0FBSyxHQUFHLGVBQWUsT0FBTyxDQUFDLFNBQVMsUUFBUTtBQUM5QyxhQUFLLFFBQVEsS0FBSyxlQUFlLEdBQUcsR0FBRyxPQUFPO01BQ2hELENBQUM7SUFDSDtJQU9BLEtBQUssVUFBVSxLQUFLLFNBQVE7QUFDMUIsVUFBRyxLQUFLLFlBQVc7QUFDakIsY0FBTSxJQUFJLE1BQU0sNEZBQTRGO01BQzlHLE9BQU87QUFDTCxhQUFLLFVBQVU7QUFDZixhQUFLLGFBQWE7QUFDbEIsYUFBSyxPQUFPO0FBQ1osZUFBTyxLQUFLO01BQ2Q7SUFDRjtJQU1BLFFBQVEsVUFBUztBQUNmLFdBQUssR0FBRyxlQUFlLE9BQU8sUUFBUTtJQUN4QztJQU1BLFFBQVEsVUFBUztBQUNmLGFBQU8sS0FBSyxHQUFHLGVBQWUsT0FBTyxDQUFBLFdBQVUsU0FBUyxNQUFNLENBQUM7SUFDakU7SUFtQkEsR0FBRyxPQUFPLFVBQVM7QUFDakIsVUFBSSxNQUFNLEtBQUs7QUFDZixXQUFLLFNBQVMsS0FBSyxFQUFDLE9BQU8sS0FBSyxTQUFRLENBQUM7QUFDekMsYUFBTztJQUNUO0lBb0JBLElBQUksT0FBTyxLQUFJO0FBQ2IsV0FBSyxXQUFXLEtBQUssU0FBUyxPQUFPLENBQUMsU0FBUztBQUM3QyxlQUFPLEVBQUUsS0FBSyxVQUFVLFVBQVUsT0FBTyxRQUFRLGVBQWUsUUFBUSxLQUFLO01BQy9FLENBQUM7SUFDSDtJQUtBLFVBQVM7QUFBRSxhQUFPLEtBQUssT0FBTyxZQUFZLEtBQUssS0FBSyxTQUFTO0lBQUU7SUFrQi9ELEtBQUssT0FBTyxTQUFTLFVBQVUsS0FBSyxTQUFRO0FBQzFDLGdCQUFVLFdBQVcsQ0FBQztBQUN0QixVQUFHLENBQUMsS0FBSyxZQUFXO0FBQ2xCLGNBQU0sSUFBSSxNQUFNLGtCQUFrQixLQUFBLFNBQWMsS0FBSyxLQUFBLDREQUFpRTtNQUN4SDtBQUNBLFVBQUksWUFBWSxJQUFJLEtBQUssTUFBTSxPQUFPLFdBQVc7QUFBRSxlQUFPO01BQVEsR0FBRyxPQUFPO0FBQzVFLFVBQUcsS0FBSyxRQUFRLEdBQUU7QUFDaEIsa0JBQVUsS0FBSztNQUNqQixPQUFPO0FBQ0wsa0JBQVUsYUFBYTtBQUN2QixhQUFLLFdBQVcsS0FBSyxTQUFTO01BQ2hDO0FBRUEsYUFBTztJQUNUO0lBa0JBLE1BQU0sVUFBVSxLQUFLLFNBQVE7QUFDM0IsV0FBSyxZQUFZLE1BQU07QUFDdkIsV0FBSyxTQUFTLGNBQWM7QUFFNUIsV0FBSyxRQUFRLGVBQWU7QUFDNUIsVUFBSSxVQUFVLE1BQU07QUFDbEIsWUFBRyxLQUFLLE9BQU8sVUFBVTtBQUFHLGVBQUssT0FBTyxJQUFJLFdBQVcsU0FBUyxLQUFLLEtBQUEsRUFBTztBQUM1RSxhQUFLLFFBQVEsZUFBZSxPQUFPLE9BQU87TUFDNUM7QUFDQSxVQUFJLFlBQVksSUFBSSxLQUFLLE1BQU0sZUFBZSxPQUFPLFFBQVEsQ0FBQyxDQUFDLEdBQUcsT0FBTztBQUN6RSxnQkFBVSxRQUFRLE1BQU0sTUFBTSxRQUFRLENBQUMsRUFDcEMsUUFBUSxXQUFXLE1BQU0sUUFBUSxDQUFDO0FBQ3JDLGdCQUFVLEtBQUs7QUFDZixVQUFHLENBQUMsS0FBSyxRQUFRLEdBQUU7QUFBRSxrQkFBVSxRQUFRLE1BQU0sQ0FBQyxDQUFDO01BQUU7QUFFakQsYUFBTztJQUNUO0lBY0EsVUFBVSxRQUFRLFNBQVMsTUFBSztBQUFFLGFBQU87SUFBUTtJQUtqRCxTQUFTLE9BQU8sT0FBTyxTQUFTLFNBQVE7QUFDdEMsVUFBRyxLQUFLLFVBQVUsT0FBTTtBQUFFLGVBQU87TUFBTTtBQUV2QyxVQUFHLFdBQVcsWUFBWSxLQUFLLFFBQVEsR0FBRTtBQUN2QyxZQUFHLEtBQUssT0FBTyxVQUFVO0FBQUcsZUFBSyxPQUFPLElBQUksV0FBVyw2QkFBNkIsRUFBQyxPQUFPLE9BQU8sU0FBUyxRQUFPLENBQUM7QUFDcEgsZUFBTztNQUNULE9BQU87QUFDTCxlQUFPO01BQ1Q7SUFDRjtJQUtBLFVBQVM7QUFBRSxhQUFPLEtBQUssU0FBUztJQUFJO0lBS3BDLE9BQU8sVUFBVSxLQUFLLFNBQVE7QUFDNUIsVUFBRyxLQUFLLFVBQVUsR0FBRTtBQUFFO01BQU87QUFDN0IsV0FBSyxPQUFPLGVBQWUsS0FBSyxLQUFLO0FBQ3JDLFdBQUssUUFBUSxlQUFlO0FBQzVCLFdBQUssU0FBUyxPQUFPLE9BQU87SUFDOUI7SUFLQSxRQUFRLE9BQU8sU0FBUyxLQUFLLFNBQVE7QUFDbkMsVUFBSSxpQkFBaUIsS0FBSyxVQUFVLE9BQU8sU0FBUyxLQUFLLE9BQU87QUFDaEUsVUFBRyxXQUFXLENBQUMsZ0JBQWU7QUFBRSxjQUFNLElBQUksTUFBTSw2RUFBNkU7TUFBRTtBQUUvSCxVQUFJLGdCQUFnQixLQUFLLFNBQVMsT0FBTyxDQUFBLFNBQVEsS0FBSyxVQUFVLEtBQUs7QUFFckUsZUFBUSxJQUFJLEdBQUcsSUFBSSxjQUFjLFFBQVEsS0FBSTtBQUMzQyxZQUFJLE9BQU8sY0FBYyxDQUFBO0FBQ3pCLGFBQUssU0FBUyxnQkFBZ0IsS0FBSyxXQUFXLEtBQUssUUFBUSxDQUFDO01BQzlEO0lBQ0Y7SUFLQSxlQUFlLEtBQUk7QUFBRSxhQUFPLGNBQWMsR0FBQTtJQUFNO0lBS2hELFdBQVU7QUFBRSxhQUFPLEtBQUssVUFBVSxlQUFlO0lBQU87SUFLeEQsWUFBVztBQUFFLGFBQU8sS0FBSyxVQUFVLGVBQWU7SUFBUTtJQUsxRCxXQUFVO0FBQUUsYUFBTyxLQUFLLFVBQVUsZUFBZTtJQUFPO0lBS3hELFlBQVc7QUFBRSxhQUFPLEtBQUssVUFBVSxlQUFlO0lBQVE7SUFLMUQsWUFBVztBQUFFLGFBQU8sS0FBSyxVQUFVLGVBQWU7SUFBUTtFQUM1RDtBQ2pUQSxNQUFxQixPQUFyQixNQUEwQjtJQUV4QixPQUFPLFFBQVEsUUFBUSxVQUFVLFFBQVEsTUFBTSxTQUFTLFdBQVcsVUFBUztBQUMxRSxVQUFHQSxRQUFPLGdCQUFlO0FBQ3ZCLFlBQUksTUFBTSxJQUFJQSxRQUFPLGVBQWU7QUFDcEMsZUFBTyxLQUFLLGVBQWUsS0FBSyxRQUFRLFVBQVUsTUFBTSxTQUFTLFdBQVcsUUFBUTtNQUN0RixPQUFPO0FBQ0wsWUFBSSxNQUFNLElBQUlBLFFBQU8sZUFBZTtBQUNwQyxlQUFPLEtBQUssV0FBVyxLQUFLLFFBQVEsVUFBVSxRQUFRLE1BQU0sU0FBUyxXQUFXLFFBQVE7TUFDMUY7SUFDRjtJQUVBLE9BQU8sZUFBZSxLQUFLLFFBQVEsVUFBVSxNQUFNLFNBQVMsV0FBVyxVQUFTO0FBQzlFLFVBQUksVUFBVTtBQUNkLFVBQUksS0FBSyxRQUFRLFFBQVE7QUFDekIsVUFBSSxTQUFTLE1BQU07QUFDakIsWUFBSSxXQUFXLEtBQUssVUFBVSxJQUFJLFlBQVk7QUFDOUMsb0JBQVksU0FBUyxRQUFRO01BQy9CO0FBQ0EsVUFBRyxXQUFVO0FBQUUsWUFBSSxZQUFZO01BQVU7QUFHekMsVUFBSSxhQUFhLE1BQU07TUFBRTtBQUV6QixVQUFJLEtBQUssSUFBSTtBQUNiLGFBQU87SUFDVDtJQUVBLE9BQU8sV0FBVyxLQUFLLFFBQVEsVUFBVSxRQUFRLE1BQU0sU0FBUyxXQUFXLFVBQVM7QUFDbEYsVUFBSSxLQUFLLFFBQVEsVUFBVSxJQUFJO0FBQy9CLFVBQUksVUFBVTtBQUNkLFVBQUksaUJBQWlCLGdCQUFnQixNQUFNO0FBQzNDLFVBQUksVUFBVSxNQUFNLFlBQVksU0FBUyxJQUFJO0FBQzdDLFVBQUkscUJBQXFCLE1BQU07QUFDN0IsWUFBRyxJQUFJLGVBQWUsV0FBVyxZQUFZLFVBQVM7QUFDcEQsY0FBSSxXQUFXLEtBQUssVUFBVSxJQUFJLFlBQVk7QUFDOUMsbUJBQVMsUUFBUTtRQUNuQjtNQUNGO0FBQ0EsVUFBRyxXQUFVO0FBQUUsWUFBSSxZQUFZO01BQVU7QUFFekMsVUFBSSxLQUFLLElBQUk7QUFDYixhQUFPO0lBQ1Q7SUFFQSxPQUFPLFVBQVUsTUFBSztBQUNwQixVQUFHLENBQUMsUUFBUSxTQUFTLElBQUc7QUFBRSxlQUFPO01BQUs7QUFFdEMsVUFBSTtBQUNGLGVBQU8sS0FBSyxNQUFNLElBQUk7TUFDeEIsU0FBUyxHQUFQO0FBQ0EsbUJBQVcsUUFBUSxJQUFJLGlDQUFpQyxJQUFJO0FBQzVELGVBQU87TUFDVDtJQUNGO0lBRUEsT0FBTyxVQUFVLEtBQUssV0FBVTtBQUM5QixVQUFJLFdBQVcsQ0FBQztBQUNoQixlQUFRLE9BQU8sS0FBSTtBQUNqQixZQUFHLENBQUMsT0FBTyxVQUFVLGVBQWUsS0FBSyxLQUFLLEdBQUcsR0FBRTtBQUFFO1FBQVM7QUFDOUQsWUFBSSxXQUFXLFlBQVksR0FBRyxTQUFBLElBQWEsR0FBQSxNQUFTO0FBQ3BELFlBQUksV0FBVyxJQUFJLEdBQUE7QUFDbkIsWUFBRyxPQUFPLGFBQWEsVUFBUztBQUM5QixtQkFBUyxLQUFLLEtBQUssVUFBVSxVQUFVLFFBQVEsQ0FBQztRQUNsRCxPQUFPO0FBQ0wsbUJBQVMsS0FBSyxtQkFBbUIsUUFBUSxJQUFJLE1BQU0sbUJBQW1CLFFBQVEsQ0FBQztRQUNqRjtNQUNGO0FBQ0EsYUFBTyxTQUFTLEtBQUssR0FBRztJQUMxQjtJQUVBLE9BQU8sYUFBYSxLQUFLLFFBQU87QUFDOUIsVUFBRyxPQUFPLEtBQUssTUFBTSxFQUFFLFdBQVcsR0FBRTtBQUFFLGVBQU87TUFBSTtBQUVqRCxVQUFJLFNBQVMsSUFBSSxNQUFNLElBQUksSUFBSSxNQUFNO0FBQ3JDLGFBQU8sR0FBRyxHQUFBLEdBQU0sTUFBQSxHQUFTLEtBQUssVUFBVSxNQUFNLENBQUE7SUFDaEQ7RUFDRjtBQzNFQSxNQUFxQixXQUFyQixNQUE4QjtJQUU1QixZQUFZLFVBQVM7QUFDbkIsV0FBSyxXQUFXO0FBQ2hCLFdBQUssUUFBUTtBQUNiLFdBQUssZ0JBQWdCO0FBQ3JCLFdBQUssT0FBTyxvQkFBSSxJQUFJO0FBQ3BCLFdBQUssU0FBUyxXQUFXO01BQUU7QUFDM0IsV0FBSyxVQUFVLFdBQVc7TUFBRTtBQUM1QixXQUFLLFlBQVksV0FBVztNQUFFO0FBQzlCLFdBQUssVUFBVSxXQUFXO01BQUU7QUFDNUIsV0FBSyxlQUFlLEtBQUssa0JBQWtCLFFBQVE7QUFDbkQsV0FBSyxhQUFhLGNBQWM7QUFDaEMsV0FBSyxLQUFLO0lBQ1o7SUFFQSxrQkFBa0IsVUFBUztBQUN6QixhQUFRLFNBQ0wsUUFBUSxTQUFTLFNBQVMsRUFDMUIsUUFBUSxVQUFVLFVBQVUsRUFDNUIsUUFBUSxJQUFJLE9BQU8sVUFBVyxXQUFXLFNBQVMsR0FBRyxRQUFRLFdBQVcsUUFBUTtJQUNyRjtJQUVBLGNBQWE7QUFDWCxhQUFPLEtBQUssYUFBYSxLQUFLLGNBQWMsRUFBQyxPQUFPLEtBQUssTUFBSyxDQUFDO0lBQ2pFO0lBRUEsY0FBYyxNQUFNLFFBQVEsVUFBUztBQUNuQyxXQUFLLE1BQU0sTUFBTSxRQUFRLFFBQVE7QUFDakMsV0FBSyxhQUFhLGNBQWM7SUFDbEM7SUFFQSxZQUFXO0FBQ1QsV0FBSyxRQUFRLFNBQVM7QUFDdEIsV0FBSyxjQUFjLE1BQU0sV0FBVyxLQUFLO0lBQzNDO0lBRUEsV0FBVTtBQUFFLGFBQU8sS0FBSyxlQUFlLGNBQWMsUUFBUSxLQUFLLGVBQWUsY0FBYztJQUFXO0lBRTFHLE9BQU07QUFDSixXQUFLLEtBQUssT0FBTyxNQUFNLE1BQU0sS0FBSyxVQUFVLEdBQUcsQ0FBQSxTQUFRO0FBQ3JELFlBQUcsTUFBSztBQUNOLGNBQUksRUFBQyxRQUFRLE9BQU8sU0FBQSxJQUFZO0FBQ2hDLGVBQUssUUFBUTtRQUNmLE9BQU87QUFDTCxtQkFBUztRQUNYO0FBRUEsZ0JBQU8sUUFBQTtVQUFBLEtBQ0E7QUFDSCxxQkFBUyxRQUFRLENBQUEsUUFBTztBQW1CdEIseUJBQVcsTUFBTSxLQUFLLFVBQVUsRUFBQyxNQUFNLElBQUcsQ0FBQyxHQUFHLENBQUM7WUFDakQsQ0FBQztBQUNELGlCQUFLLEtBQUs7QUFDVjtVQUFBLEtBQ0c7QUFDSCxpQkFBSyxLQUFLO0FBQ1Y7VUFBQSxLQUNHO0FBQ0gsaUJBQUssYUFBYSxjQUFjO0FBQ2hDLGlCQUFLLE9BQU8sQ0FBQyxDQUFDO0FBQ2QsaUJBQUssS0FBSztBQUNWO1VBQUEsS0FDRztBQUNILGlCQUFLLFFBQVEsR0FBRztBQUNoQixpQkFBSyxNQUFNLE1BQU0sYUFBYSxLQUFLO0FBQ25DO1VBQUEsS0FDRztVQUFBLEtBQ0E7QUFDSCxpQkFBSyxRQUFRLEdBQUc7QUFDaEIsaUJBQUssY0FBYyxNQUFNLHlCQUF5QixHQUFHO0FBQ3JEO1VBQUE7QUFDTyxrQkFBTSxJQUFJLE1BQU0seUJBQXlCLE1BQUEsRUFBUTtRQUFBO01BRTlELENBQUM7SUFDSDtJQUVBLEtBQUssTUFBSztBQUNSLFdBQUssS0FBSyxRQUFRLE1BQU0sTUFBTSxLQUFLLFFBQVEsU0FBUyxHQUFHLENBQUEsU0FBUTtBQUM3RCxZQUFHLENBQUMsUUFBUSxLQUFLLFdBQVcsS0FBSTtBQUM5QixlQUFLLFFBQVEsUUFBUSxLQUFLLE1BQU07QUFDaEMsZUFBSyxjQUFjLE1BQU0seUJBQXlCLEtBQUs7UUFDekQ7TUFDRixDQUFDO0lBQ0g7SUFFQSxNQUFNLE1BQU0sUUFBUSxVQUFTO0FBQzNCLGVBQVEsT0FBTyxLQUFLLE1BQUs7QUFBRSxZQUFJLE1BQU07TUFBRTtBQUN2QyxXQUFLLGFBQWEsY0FBYztBQUNoQyxVQUFJLE9BQU8sT0FBTyxPQUFPLEVBQUMsTUFBTSxLQUFNLFFBQVEsUUFBVyxVQUFVLEtBQUksR0FBRyxFQUFDLE1BQU0sUUFBUSxTQUFRLENBQUM7QUFDbEcsVUFBRyxPQUFPLGVBQWdCLGFBQVk7QUFDcEMsYUFBSyxRQUFRLElBQUksV0FBVyxTQUFTLElBQUksQ0FBQztNQUM1QyxPQUFPO0FBQ0wsYUFBSyxRQUFRLElBQUk7TUFDbkI7SUFDRjtJQUVBLEtBQUssUUFBUSxNQUFNLGlCQUFpQixVQUFTO0FBQzNDLFVBQUk7QUFDSixVQUFJLFlBQVksTUFBTTtBQUNwQixhQUFLLEtBQUssT0FBTyxHQUFHO0FBQ3BCLHdCQUFnQjtNQUNsQjtBQUNBLFlBQU0sS0FBSyxRQUFRLFFBQVEsS0FBSyxZQUFZLEdBQUcsb0JBQW9CLE1BQU0sS0FBSyxTQUFTLFdBQVcsQ0FBQSxTQUFRO0FBQ3hHLGFBQUssS0FBSyxPQUFPLEdBQUc7QUFDcEIsWUFBRyxLQUFLLFNBQVMsR0FBRTtBQUFFLG1CQUFTLElBQUk7UUFBRTtNQUN0QyxDQUFDO0FBQ0QsV0FBSyxLQUFLLElBQUksR0FBRztJQUNuQjtFQUNGO0FFaklBLE1BQU8scUJBQVE7SUFDYixlQUFlO0lBQ2YsYUFBYTtJQUNiLE9BQU8sRUFBQyxNQUFNLEdBQUcsT0FBTyxHQUFHLFdBQVcsRUFBQztJQUV2QyxPQUFPLEtBQUssVUFBUztBQUNuQixVQUFHLElBQUksUUFBUSxnQkFBZ0IsYUFBWTtBQUN6QyxlQUFPLFNBQVMsS0FBSyxhQUFhLEdBQUcsQ0FBQztNQUN4QyxPQUFPO0FBQ0wsWUFBSSxVQUFVLENBQUMsSUFBSSxVQUFVLElBQUksS0FBSyxJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksT0FBTztBQUN2RSxlQUFPLFNBQVMsS0FBSyxVQUFVLE9BQU8sQ0FBQztNQUN6QztJQUNGO0lBRUEsT0FBTyxZQUFZLFVBQVM7QUFDMUIsVUFBRyxXQUFXLGdCQUFnQixhQUFZO0FBQ3hDLGVBQU8sU0FBUyxLQUFLLGFBQWEsVUFBVSxDQUFDO01BQy9DLE9BQU87QUFDTCxZQUFJLENBQUMsVUFBVSxLQUFLLE9BQU8sT0FBTyxPQUFBLElBQVcsS0FBSyxNQUFNLFVBQVU7QUFDbEUsZUFBTyxTQUFTLEVBQUMsVUFBVSxLQUFLLE9BQU8sT0FBTyxRQUFPLENBQUM7TUFDeEQ7SUFDRjtJQUlBLGFBQWEsU0FBUTtBQUNuQixVQUFJLEVBQUMsVUFBVSxLQUFLLE9BQU8sT0FBTyxRQUFBLElBQVc7QUFDN0MsVUFBSSxhQUFhLEtBQUssY0FBYyxTQUFTLFNBQVMsSUFBSSxTQUFTLE1BQU0sU0FBUyxNQUFNO0FBQ3hGLFVBQUksU0FBUyxJQUFJLFlBQVksS0FBSyxnQkFBZ0IsVUFBVTtBQUM1RCxVQUFJLE9BQU8sSUFBSSxTQUFTLE1BQU07QUFDOUIsVUFBSUMsVUFBUztBQUViLFdBQUssU0FBU0EsV0FBVSxLQUFLLE1BQU0sSUFBSTtBQUN2QyxXQUFLLFNBQVNBLFdBQVUsU0FBUyxNQUFNO0FBQ3ZDLFdBQUssU0FBU0EsV0FBVSxJQUFJLE1BQU07QUFDbEMsV0FBSyxTQUFTQSxXQUFVLE1BQU0sTUFBTTtBQUNwQyxXQUFLLFNBQVNBLFdBQVUsTUFBTSxNQUFNO0FBQ3BDLFlBQU0sS0FBSyxVQUFVLENBQUEsU0FBUSxLQUFLLFNBQVNBLFdBQVUsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQ3hFLFlBQU0sS0FBSyxLQUFLLENBQUEsU0FBUSxLQUFLLFNBQVNBLFdBQVUsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQ25FLFlBQU0sS0FBSyxPQUFPLENBQUEsU0FBUSxLQUFLLFNBQVNBLFdBQVUsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLFlBQU0sS0FBSyxPQUFPLENBQUEsU0FBUSxLQUFLLFNBQVNBLFdBQVUsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBRXJFLFVBQUksV0FBVyxJQUFJLFdBQVcsT0FBTyxhQUFhLFFBQVEsVUFBVTtBQUNwRSxlQUFTLElBQUksSUFBSSxXQUFXLE1BQU0sR0FBRyxDQUFDO0FBQ3RDLGVBQVMsSUFBSSxJQUFJLFdBQVcsT0FBTyxHQUFHLE9BQU8sVUFBVTtBQUV2RCxhQUFPLFNBQVM7SUFDbEI7SUFFQSxhQUFhLFFBQU87QUFDbEIsVUFBSSxPQUFPLElBQUksU0FBUyxNQUFNO0FBQzlCLFVBQUksT0FBTyxLQUFLLFNBQVMsQ0FBQztBQUMxQixVQUFJLFVBQVUsSUFBSSxZQUFZO0FBQzlCLGNBQU8sTUFBQTtRQUFBLEtBQ0EsS0FBSyxNQUFNO0FBQU0saUJBQU8sS0FBSyxXQUFXLFFBQVEsTUFBTSxPQUFPO1FBQUEsS0FDN0QsS0FBSyxNQUFNO0FBQU8saUJBQU8sS0FBSyxZQUFZLFFBQVEsTUFBTSxPQUFPO1FBQUEsS0FDL0QsS0FBSyxNQUFNO0FBQVcsaUJBQU8sS0FBSyxnQkFBZ0IsUUFBUSxNQUFNLE9BQU87TUFBQTtJQUVoRjtJQUVBLFdBQVcsUUFBUSxNQUFNLFNBQVE7QUFDL0IsVUFBSSxjQUFjLEtBQUssU0FBUyxDQUFDO0FBQ2pDLFVBQUksWUFBWSxLQUFLLFNBQVMsQ0FBQztBQUMvQixVQUFJLFlBQVksS0FBSyxTQUFTLENBQUM7QUFDL0IsVUFBSUEsVUFBUyxLQUFLLGdCQUFnQixLQUFLLGNBQWM7QUFDckQsVUFBSSxVQUFVLFFBQVEsT0FBTyxPQUFPLE1BQU1BLFNBQVFBLFVBQVMsV0FBVyxDQUFDO0FBQ3ZFLE1BQUFBLFVBQVNBLFVBQVM7QUFDbEIsVUFBSSxRQUFRLFFBQVEsT0FBTyxPQUFPLE1BQU1BLFNBQVFBLFVBQVMsU0FBUyxDQUFDO0FBQ25FLE1BQUFBLFVBQVNBLFVBQVM7QUFDbEIsVUFBSSxRQUFRLFFBQVEsT0FBTyxPQUFPLE1BQU1BLFNBQVFBLFVBQVMsU0FBUyxDQUFDO0FBQ25FLE1BQUFBLFVBQVNBLFVBQVM7QUFDbEIsVUFBSSxPQUFPLE9BQU8sTUFBTUEsU0FBUSxPQUFPLFVBQVU7QUFDakQsYUFBTyxFQUFDLFVBQVUsU0FBUyxLQUFLLE1BQU0sT0FBYyxPQUFjLFNBQVMsS0FBSTtJQUNqRjtJQUVBLFlBQVksUUFBUSxNQUFNLFNBQVE7QUFDaEMsVUFBSSxjQUFjLEtBQUssU0FBUyxDQUFDO0FBQ2pDLFVBQUksVUFBVSxLQUFLLFNBQVMsQ0FBQztBQUM3QixVQUFJLFlBQVksS0FBSyxTQUFTLENBQUM7QUFDL0IsVUFBSSxZQUFZLEtBQUssU0FBUyxDQUFDO0FBQy9CLFVBQUlBLFVBQVMsS0FBSyxnQkFBZ0IsS0FBSztBQUN2QyxVQUFJLFVBQVUsUUFBUSxPQUFPLE9BQU8sTUFBTUEsU0FBUUEsVUFBUyxXQUFXLENBQUM7QUFDdkUsTUFBQUEsVUFBU0EsVUFBUztBQUNsQixVQUFJLE1BQU0sUUFBUSxPQUFPLE9BQU8sTUFBTUEsU0FBUUEsVUFBUyxPQUFPLENBQUM7QUFDL0QsTUFBQUEsVUFBU0EsVUFBUztBQUNsQixVQUFJLFFBQVEsUUFBUSxPQUFPLE9BQU8sTUFBTUEsU0FBUUEsVUFBUyxTQUFTLENBQUM7QUFDbkUsTUFBQUEsVUFBU0EsVUFBUztBQUNsQixVQUFJLFFBQVEsUUFBUSxPQUFPLE9BQU8sTUFBTUEsU0FBUUEsVUFBUyxTQUFTLENBQUM7QUFDbkUsTUFBQUEsVUFBU0EsVUFBUztBQUNsQixVQUFJLE9BQU8sT0FBTyxNQUFNQSxTQUFRLE9BQU8sVUFBVTtBQUNqRCxVQUFJLFVBQVUsRUFBQyxRQUFRLE9BQU8sVUFBVSxLQUFJO0FBQzVDLGFBQU8sRUFBQyxVQUFVLFNBQVMsS0FBVSxPQUFjLE9BQU8sZUFBZSxPQUFPLFFBQWdCO0lBQ2xHO0lBRUEsZ0JBQWdCLFFBQVEsTUFBTSxTQUFRO0FBQ3BDLFVBQUksWUFBWSxLQUFLLFNBQVMsQ0FBQztBQUMvQixVQUFJLFlBQVksS0FBSyxTQUFTLENBQUM7QUFDL0IsVUFBSUEsVUFBUyxLQUFLLGdCQUFnQjtBQUNsQyxVQUFJLFFBQVEsUUFBUSxPQUFPLE9BQU8sTUFBTUEsU0FBUUEsVUFBUyxTQUFTLENBQUM7QUFDbkUsTUFBQUEsVUFBU0EsVUFBUztBQUNsQixVQUFJLFFBQVEsUUFBUSxPQUFPLE9BQU8sTUFBTUEsU0FBUUEsVUFBUyxTQUFTLENBQUM7QUFDbkUsTUFBQUEsVUFBU0EsVUFBUztBQUNsQixVQUFJLE9BQU8sT0FBTyxNQUFNQSxTQUFRLE9BQU8sVUFBVTtBQUVqRCxhQUFPLEVBQUMsVUFBVSxNQUFNLEtBQUssTUFBTSxPQUFjLE9BQWMsU0FBUyxLQUFJO0lBQzlFO0VBQ0Y7QUN0QkEsTUFBcUIsU0FBckIsTUFBNEI7SUFDMUIsWUFBWSxVQUFVLE9BQU8sQ0FBQyxHQUFFO0FBQzlCLFdBQUssdUJBQXVCLEVBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsU0FBUyxDQUFDLEVBQUM7QUFDeEUsV0FBSyxXQUFXLENBQUM7QUFDakIsV0FBSyxhQUFhLENBQUM7QUFDbkIsV0FBSyxNQUFNO0FBQ1gsV0FBSyxVQUFVLEtBQUssV0FBVztBQUMvQixXQUFLLFlBQVksS0FBSyxhQUFhQyxRQUFPLGFBQWE7QUFDdkQsV0FBSyx5QkFBeUI7QUFDOUIsV0FBSyxpQkFBaUIsbUJBQVcsT0FBTyxLQUFLLGtCQUFVO0FBQ3ZELFdBQUssaUJBQWlCLG1CQUFXLE9BQU8sS0FBSyxrQkFBVTtBQUN2RCxXQUFLLGdCQUFnQjtBQUNyQixXQUFLLGFBQWEsS0FBSyxjQUFjO0FBQ3JDLFdBQUssZUFBZTtBQUNwQixVQUFHLEtBQUssY0FBYyxVQUFTO0FBQzdCLGFBQUssU0FBUyxLQUFLLFVBQVUsS0FBSztBQUNsQyxhQUFLLFNBQVMsS0FBSyxVQUFVLEtBQUs7TUFDcEMsT0FBTztBQUNMLGFBQUssU0FBUyxLQUFLO0FBQ25CLGFBQUssU0FBUyxLQUFLO01BQ3JCO0FBQ0EsVUFBSSwrQkFBK0I7QUFDbkMsVUFBRyxhQUFhLFVBQVUsa0JBQWlCO0FBQ3pDLGtCQUFVLGlCQUFpQixZQUFZLENBQUEsT0FBTTtBQUMzQyxjQUFHLEtBQUssTUFBSztBQUNYLGlCQUFLLFdBQVc7QUFDaEIsMkNBQStCLEtBQUs7VUFDdEM7UUFDRixDQUFDO0FBQ0Qsa0JBQVUsaUJBQWlCLFlBQVksQ0FBQSxPQUFNO0FBQzNDLGNBQUcsaUNBQWlDLEtBQUssY0FBYTtBQUNwRCwyQ0FBK0I7QUFDL0IsaUJBQUssUUFBUTtVQUNmO1FBQ0YsQ0FBQztNQUNIO0FBQ0EsV0FBSyxzQkFBc0IsS0FBSyx1QkFBdUI7QUFDdkQsV0FBSyxnQkFBZ0IsQ0FBQyxVQUFVO0FBQzlCLFlBQUcsS0FBSyxlQUFjO0FBQ3BCLGlCQUFPLEtBQUssY0FBYyxLQUFLO1FBQ2pDLE9BQU87QUFDTCxpQkFBTyxDQUFDLEtBQU0sS0FBTSxHQUFJLEVBQUUsUUFBUSxDQUFBLEtBQU07UUFDMUM7TUFDRjtBQUNBLFdBQUssbUJBQW1CLENBQUMsVUFBVTtBQUNqQyxZQUFHLEtBQUssa0JBQWlCO0FBQ3ZCLGlCQUFPLEtBQUssaUJBQWlCLEtBQUs7UUFDcEMsT0FBTztBQUNMLGlCQUFPLENBQUMsSUFBSSxJQUFJLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFNLEdBQUksRUFBRSxRQUFRLENBQUEsS0FBTTtRQUNyRTtNQUNGO0FBQ0EsV0FBSyxTQUFTLEtBQUssVUFBVTtBQUM3QixXQUFLLG9CQUFvQixLQUFLLHFCQUFxQjtBQUNuRCxXQUFLLFNBQVMsUUFBUSxLQUFLLFVBQVUsQ0FBQyxDQUFDO0FBQ3ZDLFdBQUssV0FBVyxHQUFHLFFBQUEsSUFBWSxXQUFXLFNBQUE7QUFDMUMsV0FBSyxNQUFNLEtBQUssT0FBTztBQUN2QixXQUFLLHdCQUF3QjtBQUM3QixXQUFLLGlCQUFpQjtBQUN0QixXQUFLLHNCQUFzQjtBQUMzQixXQUFLLGlCQUFpQixJQUFJLE1BQU0sTUFBTTtBQUNwQyxhQUFLLFNBQVMsTUFBTSxLQUFLLFFBQVEsQ0FBQztNQUNwQyxHQUFHLEtBQUssZ0JBQWdCO0lBQzFCO0lBS0EsdUJBQXNCO0FBQUUsYUFBTztJQUFTO0lBUXhDLGlCQUFpQixjQUFhO0FBQzVCLFdBQUs7QUFDTCxXQUFLLGdCQUFnQjtBQUNyQixXQUFLLGVBQWUsTUFBTTtBQUMxQixXQUFLLGFBQWEsQ0FBQztBQUNuQixVQUFHLEtBQUssTUFBSztBQUNYLGFBQUssS0FBSyxNQUFNO0FBQ2hCLGFBQUssT0FBTztNQUNkO0FBQ0EsV0FBSyxZQUFZO0lBQ25CO0lBT0EsV0FBVTtBQUFFLGFBQU8sU0FBUyxTQUFTLE1BQU0sUUFBUSxJQUFJLFFBQVE7SUFBSztJQU9wRSxjQUFhO0FBQ1gsVUFBSSxNQUFNLEtBQUssYUFDYixLQUFLLGFBQWEsS0FBSyxVQUFVLEtBQUssT0FBTyxDQUFDLEdBQUcsRUFBQyxLQUFLLEtBQUssSUFBRyxDQUFDO0FBQ2xFLFVBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFJO0FBQUUsZUFBTztNQUFJO0FBQ3RDLFVBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFJO0FBQUUsZUFBTyxHQUFHLEtBQUssU0FBUyxDQUFBLElBQUssR0FBQTtNQUFNO0FBRTlELGFBQU8sR0FBRyxLQUFLLFNBQVMsQ0FBQSxNQUFPLFNBQVMsSUFBQSxHQUFPLEdBQUE7SUFDakQ7SUFXQSxXQUFXLFVBQVUsTUFBTSxRQUFPO0FBQ2hDLFdBQUs7QUFDTCxXQUFLLGdCQUFnQjtBQUNyQixXQUFLLGVBQWUsTUFBTTtBQUMxQixXQUFLLFNBQVMsVUFBVSxNQUFNLE1BQU07SUFDdEM7SUFTQSxRQUFRLFFBQU87QUFDYixVQUFHLFFBQU87QUFDUixtQkFBVyxRQUFRLElBQUkseUZBQXlGO0FBQ2hILGFBQUssU0FBUyxRQUFRLE1BQU07TUFDOUI7QUFDQSxVQUFHLEtBQUssTUFBSztBQUFFO01BQU87QUFFdEIsV0FBSztBQUNMLFdBQUssZ0JBQWdCO0FBQ3JCLFdBQUssT0FBTyxJQUFJLEtBQUssVUFBVSxLQUFLLFlBQVksQ0FBQztBQUNqRCxXQUFLLEtBQUssYUFBYSxLQUFLO0FBQzVCLFdBQUssS0FBSyxVQUFVLEtBQUs7QUFDekIsV0FBSyxLQUFLLFNBQVMsTUFBTSxLQUFLLFdBQVc7QUFDekMsV0FBSyxLQUFLLFVBQVUsQ0FBQSxVQUFTLEtBQUssWUFBWSxLQUFLO0FBQ25ELFdBQUssS0FBSyxZQUFZLENBQUEsVUFBUyxLQUFLLGNBQWMsS0FBSztBQUN2RCxXQUFLLEtBQUssVUFBVSxDQUFBLFVBQVMsS0FBSyxZQUFZLEtBQUs7SUFDckQ7SUFRQSxJQUFJLE1BQU0sS0FBSyxNQUFLO0FBQUUsV0FBSyxPQUFPLE1BQU0sS0FBSyxJQUFJO0lBQUU7SUFLbkQsWUFBVztBQUFFLGFBQU8sS0FBSyxXQUFXO0lBQUs7SUFTekMsT0FBTyxVQUFTO0FBQ2QsVUFBSSxNQUFNLEtBQUssUUFBUTtBQUN2QixXQUFLLHFCQUFxQixLQUFLLEtBQUssQ0FBQyxLQUFLLFFBQVEsQ0FBQztBQUNuRCxhQUFPO0lBQ1Q7SUFNQSxRQUFRLFVBQVM7QUFDZixVQUFJLE1BQU0sS0FBSyxRQUFRO0FBQ3ZCLFdBQUsscUJBQXFCLE1BQU0sS0FBSyxDQUFDLEtBQUssUUFBUSxDQUFDO0FBQ3BELGFBQU87SUFDVDtJQVNBLFFBQVEsVUFBUztBQUNmLFVBQUksTUFBTSxLQUFLLFFBQVE7QUFDdkIsV0FBSyxxQkFBcUIsTUFBTSxLQUFLLENBQUMsS0FBSyxRQUFRLENBQUM7QUFDcEQsYUFBTztJQUNUO0lBTUEsVUFBVSxVQUFTO0FBQ2pCLFVBQUksTUFBTSxLQUFLLFFBQVE7QUFDdkIsV0FBSyxxQkFBcUIsUUFBUSxLQUFLLENBQUMsS0FBSyxRQUFRLENBQUM7QUFDdEQsYUFBTztJQUNUO0lBUUEsS0FBSyxVQUFTO0FBQ1osVUFBRyxDQUFDLEtBQUssWUFBWSxHQUFFO0FBQUUsZUFBTztNQUFNO0FBQ3RDLFVBQUksTUFBTSxLQUFLLFFBQVE7QUFDdkIsVUFBSSxZQUFZLEtBQUssSUFBSTtBQUN6QixXQUFLLEtBQUssRUFBQyxPQUFPLFdBQVcsT0FBTyxhQUFhLFNBQVMsQ0FBQyxHQUFHLElBQVEsQ0FBQztBQUN2RSxVQUFJLFdBQVcsS0FBSyxVQUFVLENBQUEsUUFBTztBQUNuQyxZQUFHLElBQUksUUFBUSxLQUFJO0FBQ2pCLGVBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQztBQUNuQixtQkFBUyxLQUFLLElBQUksSUFBSSxTQUFTO1FBQ2pDO01BQ0YsQ0FBQztBQUNELGFBQU87SUFDVDtJQU1BLGtCQUFpQjtBQUNmLG1CQUFhLEtBQUssY0FBYztBQUNoQyxtQkFBYSxLQUFLLHFCQUFxQjtJQUN6QztJQUVBLGFBQVk7QUFDVixVQUFHLEtBQUssVUFBVTtBQUFHLGFBQUssSUFBSSxhQUFhLGdCQUFnQixLQUFLLFlBQVksQ0FBQSxFQUFHO0FBQy9FLFdBQUssZ0JBQWdCO0FBQ3JCLFdBQUs7QUFDTCxXQUFLLGdCQUFnQjtBQUNyQixXQUFLLGVBQWUsTUFBTTtBQUMxQixXQUFLLGVBQWU7QUFDcEIsV0FBSyxxQkFBcUIsS0FBSyxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQUEsTUFBYyxTQUFTLENBQUM7SUFDckU7SUFNQSxtQkFBa0I7QUFDaEIsVUFBRyxLQUFLLHFCQUFvQjtBQUMxQixhQUFLLHNCQUFzQjtBQUMzQixZQUFHLEtBQUssVUFBVSxHQUFFO0FBQUUsZUFBSyxJQUFJLGFBQWEsMERBQTBEO1FBQUU7QUFDeEcsYUFBSyxpQkFBaUI7QUFDdEIsYUFBSyxnQkFBZ0I7QUFDckIsYUFBSyxTQUFTLE1BQU0sS0FBSyxlQUFlLGdCQUFnQixHQUFHLGlCQUFpQixtQkFBbUI7TUFDakc7SUFDRjtJQUVBLGlCQUFnQjtBQUNkLFVBQUcsS0FBSyxRQUFRLEtBQUssS0FBSyxlQUFjO0FBQUU7TUFBTztBQUNqRCxXQUFLLHNCQUFzQjtBQUMzQixXQUFLLGdCQUFnQjtBQUNyQixXQUFLLGlCQUFpQixXQUFXLE1BQU0sS0FBSyxjQUFjLEdBQUcsS0FBSyxtQkFBbUI7SUFDdkY7SUFFQSxTQUFTLFVBQVUsTUFBTSxRQUFPO0FBQzlCLFVBQUcsQ0FBQyxLQUFLLE1BQUs7QUFDWixlQUFPLFlBQVksU0FBUztNQUM5QjtBQUVBLFdBQUssa0JBQWtCLE1BQU07QUFDM0IsWUFBRyxLQUFLLE1BQUs7QUFDWCxjQUFHLE1BQUs7QUFBRSxpQkFBSyxLQUFLLE1BQU0sTUFBTSxVQUFVLEVBQUU7VUFBRSxPQUFPO0FBQUUsaUJBQUssS0FBSyxNQUFNO1VBQUU7UUFDM0U7QUFFQSxhQUFLLG9CQUFvQixNQUFNO0FBQzdCLGNBQUcsS0FBSyxNQUFLO0FBQ1gsaUJBQUssS0FBSyxTQUFTLFdBQVc7WUFBRTtBQUNoQyxpQkFBSyxLQUFLLFVBQVUsV0FBVztZQUFFO0FBQ2pDLGlCQUFLLEtBQUssWUFBWSxXQUFXO1lBQUU7QUFDbkMsaUJBQUssS0FBSyxVQUFVLFdBQVc7WUFBRTtBQUNqQyxpQkFBSyxPQUFPO1VBQ2Q7QUFFQSxzQkFBWSxTQUFTO1FBQ3ZCLENBQUM7TUFDSCxDQUFDO0lBQ0g7SUFFQSxrQkFBa0IsVUFBVSxRQUFRLEdBQUU7QUFDcEMsVUFBRyxVQUFVLEtBQUssQ0FBQyxLQUFLLFFBQVEsQ0FBQyxLQUFLLEtBQUssZ0JBQWU7QUFDeEQsaUJBQVM7QUFDVDtNQUNGO0FBRUEsaUJBQVcsTUFBTTtBQUNmLGFBQUssa0JBQWtCLFVBQVUsUUFBUSxDQUFDO01BQzVDLEdBQUcsTUFBTSxLQUFLO0lBQ2hCO0lBRUEsb0JBQW9CLFVBQVUsUUFBUSxHQUFFO0FBQ3RDLFVBQUcsVUFBVSxLQUFLLENBQUMsS0FBSyxRQUFRLEtBQUssS0FBSyxlQUFlLGNBQWMsUUFBTztBQUM1RSxpQkFBUztBQUNUO01BQ0Y7QUFFQSxpQkFBVyxNQUFNO0FBQ2YsYUFBSyxvQkFBb0IsVUFBVSxRQUFRLENBQUM7TUFDOUMsR0FBRyxNQUFNLEtBQUs7SUFDaEI7SUFFQSxZQUFZLE9BQU07QUFDaEIsVUFBSSxZQUFZLFNBQVMsTUFBTTtBQUMvQixVQUFHLEtBQUssVUFBVTtBQUFHLGFBQUssSUFBSSxhQUFhLFNBQVMsS0FBSztBQUN6RCxXQUFLLGlCQUFpQjtBQUN0QixXQUFLLGdCQUFnQjtBQUNyQixVQUFHLENBQUMsS0FBSyxpQkFBaUIsY0FBYyxLQUFLO0FBQzNDLGFBQUssZUFBZSxnQkFBZ0I7TUFDdEM7QUFDQSxXQUFLLHFCQUFxQixNQUFNLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBQSxNQUFjLFNBQVMsS0FBSyxDQUFDO0lBQzNFO0lBS0EsWUFBWSxPQUFNO0FBQ2hCLFVBQUcsS0FBSyxVQUFVO0FBQUcsYUFBSyxJQUFJLGFBQWEsS0FBSztBQUNoRCxVQUFJLGtCQUFrQixLQUFLO0FBQzNCLFVBQUksb0JBQW9CLEtBQUs7QUFDN0IsV0FBSyxxQkFBcUIsTUFBTSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQUEsTUFBYztBQUN4RCxpQkFBUyxPQUFPLGlCQUFpQixpQkFBaUI7TUFDcEQsQ0FBQztBQUNELFVBQUcsb0JBQW9CLEtBQUssYUFBYSxvQkFBb0IsR0FBRTtBQUM3RCxhQUFLLGlCQUFpQjtNQUN4QjtJQUNGO0lBS0EsbUJBQWtCO0FBQ2hCLFdBQUssU0FBUyxRQUFRLENBQUEsWUFBVztBQUMvQixZQUFHLEVBQUUsUUFBUSxVQUFVLEtBQUssUUFBUSxVQUFVLEtBQUssUUFBUSxTQUFTLElBQUc7QUFDckUsa0JBQVEsUUFBUSxlQUFlLEtBQUs7UUFDdEM7TUFDRixDQUFDO0lBQ0g7SUFLQSxrQkFBaUI7QUFDZixjQUFPLEtBQUssUUFBUSxLQUFLLEtBQUssWUFBQTtRQUFBLEtBQ3ZCLGNBQWM7QUFBWSxpQkFBTztRQUFBLEtBQ2pDLGNBQWM7QUFBTSxpQkFBTztRQUFBLEtBQzNCLGNBQWM7QUFBUyxpQkFBTztRQUFBO0FBQzFCLGlCQUFPO01BQUE7SUFFcEI7SUFLQSxjQUFhO0FBQUUsYUFBTyxLQUFLLGdCQUFnQixNQUFNO0lBQU87SUFPeEQsT0FBTyxTQUFRO0FBQ2IsV0FBSyxJQUFJLFFBQVEsZUFBZTtBQUNoQyxXQUFLLFdBQVcsS0FBSyxTQUFTLE9BQU8sQ0FBQSxNQUFLLEVBQUUsUUFBUSxNQUFNLFFBQVEsUUFBUSxDQUFDO0lBQzdFO0lBUUEsSUFBSSxNQUFLO0FBQ1AsZUFBUSxPQUFPLEtBQUssc0JBQXFCO0FBQ3ZDLGFBQUsscUJBQXFCLEdBQUEsSUFBTyxLQUFLLHFCQUFxQixHQUFBLEVBQUssT0FBTyxDQUFDLENBQUMsR0FBQSxNQUFTO0FBQ2hGLGlCQUFPLEtBQUssUUFBUSxHQUFHLE1BQU07UUFDL0IsQ0FBQztNQUNIO0lBQ0Y7SUFTQSxRQUFRLE9BQU8sYUFBYSxDQUFDLEdBQUU7QUFDN0IsVUFBSSxPQUFPLElBQUksUUFBUSxPQUFPLFlBQVksSUFBSTtBQUM5QyxXQUFLLFNBQVMsS0FBSyxJQUFJO0FBQ3ZCLGFBQU87SUFDVDtJQUtBLEtBQUssTUFBSztBQUNSLFVBQUcsS0FBSyxVQUFVLEdBQUU7QUFDbEIsWUFBSSxFQUFDLE9BQU8sT0FBTyxTQUFTLEtBQUssU0FBQSxJQUFZO0FBQzdDLGFBQUssSUFBSSxRQUFRLEdBQUcsS0FBQSxJQUFTLEtBQUEsS0FBVSxRQUFBLEtBQWEsR0FBQSxLQUFRLE9BQU87TUFDckU7QUFFQSxVQUFHLEtBQUssWUFBWSxHQUFFO0FBQ3BCLGFBQUssT0FBTyxNQUFNLENBQUEsV0FBVSxLQUFLLEtBQUssS0FBSyxNQUFNLENBQUM7TUFDcEQsT0FBTztBQUNMLGFBQUssV0FBVyxLQUFLLE1BQU0sS0FBSyxPQUFPLE1BQU0sQ0FBQSxXQUFVLEtBQUssS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDO01BQ2hGO0lBQ0Y7SUFNQSxVQUFTO0FBQ1AsVUFBSSxTQUFTLEtBQUssTUFBTTtBQUN4QixVQUFHLFdBQVcsS0FBSyxLQUFJO0FBQUUsYUFBSyxNQUFNO01BQUUsT0FBTztBQUFFLGFBQUssTUFBTTtNQUFPO0FBRWpFLGFBQU8sS0FBSyxJQUFJLFNBQVM7SUFDM0I7SUFFQSxnQkFBZTtBQUNiLFVBQUcsS0FBSyx1QkFBdUIsQ0FBQyxLQUFLLFlBQVksR0FBRTtBQUFFO01BQU87QUFDNUQsV0FBSyxzQkFBc0IsS0FBSyxRQUFRO0FBQ3hDLFdBQUssS0FBSyxFQUFDLE9BQU8sV0FBVyxPQUFPLGFBQWEsU0FBUyxDQUFDLEdBQUcsS0FBSyxLQUFLLG9CQUFtQixDQUFDO0FBQzVGLFdBQUssd0JBQXdCLFdBQVcsTUFBTSxLQUFLLGlCQUFpQixHQUFHLEtBQUssbUJBQW1CO0lBQ2pHO0lBRUEsa0JBQWlCO0FBQ2YsVUFBRyxLQUFLLFlBQVksS0FBSyxLQUFLLFdBQVcsU0FBUyxHQUFFO0FBQ2xELGFBQUssV0FBVyxRQUFRLENBQUEsYUFBWSxTQUFTLENBQUM7QUFDOUMsYUFBSyxhQUFhLENBQUM7TUFDckI7SUFDRjtJQUVBLGNBQWMsWUFBVztBQUN2QixXQUFLLE9BQU8sV0FBVyxNQUFNLENBQUEsUUFBTztBQUNsQyxZQUFJLEVBQUMsT0FBTyxPQUFPLFNBQVMsS0FBSyxTQUFBLElBQVk7QUFDN0MsWUFBRyxPQUFPLFFBQVEsS0FBSyxxQkFBb0I7QUFDekMsZUFBSyxnQkFBZ0I7QUFDckIsZUFBSyxzQkFBc0I7QUFDM0IsZUFBSyxpQkFBaUIsV0FBVyxNQUFNLEtBQUssY0FBYyxHQUFHLEtBQUssbUJBQW1CO1FBQ3ZGO0FBRUEsWUFBRyxLQUFLLFVBQVU7QUFBRyxlQUFLLElBQUksV0FBVyxHQUFHLFFBQVEsVUFBVSxFQUFBLElBQU0sS0FBQSxJQUFTLEtBQUEsSUFBUyxPQUFPLE1BQU0sTUFBTSxPQUFPLEVBQUEsSUFBTSxPQUFPO0FBRTdILGlCQUFRLElBQUksR0FBRyxJQUFJLEtBQUssU0FBUyxRQUFRLEtBQUk7QUFDM0MsZ0JBQU0sVUFBVSxLQUFLLFNBQVMsQ0FBQTtBQUM5QixjQUFHLENBQUMsUUFBUSxTQUFTLE9BQU8sT0FBTyxTQUFTLFFBQVEsR0FBRTtBQUFFO1VBQVM7QUFDakUsa0JBQVEsUUFBUSxPQUFPLFNBQVMsS0FBSyxRQUFRO1FBQy9DO0FBRUEsaUJBQVEsSUFBSSxHQUFHLElBQUksS0FBSyxxQkFBcUIsUUFBUSxRQUFRLEtBQUk7QUFDL0QsY0FBSSxDQUFDLEVBQUUsUUFBQSxJQUFZLEtBQUsscUJBQXFCLFFBQVEsQ0FBQTtBQUNyRCxtQkFBUyxHQUFHO1FBQ2Q7TUFDRixDQUFDO0lBQ0g7SUFFQSxlQUFlLE9BQU07QUFDbkIsVUFBSSxhQUFhLEtBQUssU0FBUyxLQUFLLENBQUEsTUFBSyxFQUFFLFVBQVUsVUFBVSxFQUFFLFNBQVMsS0FBSyxFQUFFLFVBQVUsRUFBRTtBQUM3RixVQUFHLFlBQVc7QUFDWixZQUFHLEtBQUssVUFBVTtBQUFHLGVBQUssSUFBSSxhQUFhLDRCQUE0QixLQUFBLEdBQVE7QUFDL0UsbUJBQVcsTUFBTTtNQUNuQjtJQUNGO0VBQ0Y7OztBQ3JqQk8sTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sb0JBQW9CO0lBQy9CO0lBQXFCO0lBQXNCO0lBQzNDO0lBQXVCO0lBQXFCO0lBQW9CO0VBQUE7QUFFM0QsTUFBTSxnQkFBZ0I7QUFDdEIsTUFBTSxnQkFBZ0I7QUFDdEIsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxVQUFVO0FBQ2hCLE1BQU0sY0FBYztBQUNwQixNQUFNLG9CQUFvQjtBQUMxQixNQUFNLGlCQUFpQjtBQUN2QixNQUFNLHVCQUF1QjtBQUM3QixNQUFNLGdCQUFnQjtBQUN0QixNQUFNLGtCQUFrQjtBQUN4QixNQUFNLHdCQUF3QjtBQUM5QixNQUFNLHdCQUF3QjtBQUM5QixNQUFNLFdBQVc7QUFDakIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sZ0JBQWdCO0FBQ3RCLE1BQU0sV0FBVztBQUNqQixNQUFNLGNBQWM7QUFDcEIsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxtQkFBbUIsQ0FBQyxRQUFRLFlBQVksVUFBVSxTQUFTLFlBQVksVUFBVSxPQUFPLE9BQU8sUUFBUSxRQUFRLGtCQUFrQixTQUFTLE9BQUE7QUFDaEosTUFBTSxtQkFBbUIsQ0FBQyxZQUFZLE9BQUE7QUFDdEMsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sb0JBQW9CLElBQUksV0FBQTtBQUM5QixNQUFNLGFBQWE7QUFDbkIsTUFBTSxhQUFhO0FBQ25CLE1BQU0sZUFBZTtBQUNyQixNQUFNLGVBQWU7QUFDckIsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSwyQkFBMkI7QUFDakMsTUFBTSxXQUFXO0FBQ2pCLE1BQU0sZUFBZTtBQUNyQixNQUFNLGVBQWU7QUFDckIsTUFBTSxhQUFhO0FBQ25CLE1BQU0sVUFBVTtBQUNoQixNQUFNLGNBQWM7QUFDcEIsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxlQUFlO0FBQ3JCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0scUJBQXFCO0FBQzNCLE1BQU0sZUFBZTtBQUNyQixNQUFNLGlCQUFpQjtBQUN2QixNQUFNLCtCQUErQjtBQUNyQyxNQUFNLGlCQUFpQjtBQUN2QixNQUFNLGVBQWU7QUFHckIsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sV0FBVztJQUN0QixVQUFVO0lBQ1YsVUFBVTtFQUFBO0FBSUwsTUFBTSxXQUFXO0FBQ2pCLE1BQU0sU0FBUztBQUNmLE1BQU0sYUFBYTtBQUNuQixNQUFNLFNBQVM7QUFDZixNQUFNLFFBQVE7QUFDZCxNQUFNLFFBQVE7QUFDZCxNQUFNLFlBQVk7QUMzRXpCLE1BQUEsZ0JBQUEsTUFBbUM7SUFDakMsWUFBWSxPQUFPLFdBQVdDLGFBQVc7QUFDdkMsV0FBSyxhQUFhQTtBQUNsQixXQUFLLFFBQVE7QUFDYixXQUFLLFNBQVM7QUFDZCxXQUFLLFlBQVk7QUFDakIsV0FBSyxhQUFhO0FBQ2xCLFdBQUssZ0JBQWdCQSxZQUFXLFFBQVEsT0FBTyxNQUFNLEdBQUEsSUFBTyxFQUFDLE9BQU8sTUFBTSxTQUFBLEVBQUEsQ0FBQTtJQUFBO0lBRzVFLE1BQU0sUUFBTztBQUNYLG1CQUFhLEtBQUssVUFBQTtBQUNsQixXQUFLLGNBQWMsTUFBQTtBQUNuQixXQUFLLE1BQU0sTUFBTSxNQUFBO0lBQUE7SUFHbkIsU0FBUTtBQUNOLFdBQUssY0FBYyxRQUFRLENBQUEsV0FBVSxLQUFLLE1BQU0sTUFBQSxDQUFBO0FBQ2hELFdBQUssY0FBYyxLQUFBLEVBQ2hCLFFBQVEsTUFBTSxDQUFBLFVBQVMsS0FBSyxjQUFBLENBQUEsRUFDNUIsUUFBUSxTQUFTLENBQUEsV0FBVSxLQUFLLE1BQU0sTUFBQSxDQUFBO0lBQUE7SUFHM0MsU0FBUTtBQUFFLGFBQU8sS0FBSyxVQUFVLEtBQUssTUFBTSxLQUFLO0lBQUE7SUFFaEQsZ0JBQWU7QUFDYixVQUFJLFNBQVMsSUFBSSxPQUFPLFdBQUE7QUFDeEIsVUFBSSxPQUFPLEtBQUssTUFBTSxLQUFLLE1BQU0sS0FBSyxRQUFRLEtBQUssWUFBWSxLQUFLLE1BQUE7QUFDcEUsYUFBTyxTQUFTLENBQUMsTUFBTTtBQUNyQixZQUFHLEVBQUUsT0FBTyxVQUFVLE1BQUs7QUFDekIsZUFBSyxVQUFVLEVBQUUsT0FBTyxPQUFPO0FBQy9CLGVBQUssVUFBVSxFQUFFLE9BQU8sTUFBQTtRQUFBLE9BQ25CO0FBQ0wsaUJBQU8sU0FBUyxpQkFBaUIsRUFBRSxPQUFPLEtBQUE7UUFBQTtNQUFBO0FBRzlDLGFBQU8sa0JBQWtCLElBQUE7SUFBQTtJQUczQixVQUFVLE9BQU07QUFDZCxVQUFHLENBQUMsS0FBSyxjQUFjLFNBQUEsR0FBVztBQUFFO01BQUE7QUFDcEMsV0FBSyxjQUFjLEtBQUssU0FBUyxLQUFBLEVBQzlCLFFBQVEsTUFBTSxNQUFNO0FBQ25CLGFBQUssTUFBTSxTQUFVLEtBQUssU0FBUyxLQUFLLE1BQU0sS0FBSyxPQUFRLEdBQUE7QUFDM0QsWUFBRyxDQUFDLEtBQUssT0FBQSxHQUFTO0FBQ2hCLGVBQUssYUFBYSxXQUFXLE1BQU0sS0FBSyxjQUFBLEdBQWlCLEtBQUssV0FBVyxjQUFBLEtBQW1CLENBQUE7UUFBQTtNQUFBLENBQUE7SUFBQTtFQUFBO0FDM0MvRixNQUFJLFdBQVcsQ0FBQyxLQUFLLFFBQVEsUUFBUSxTQUFTLFFBQVEsTUFBTSxLQUFLLEdBQUE7QUFFakUsTUFBSSxRQUFRLENBQUMsUUFBUTtBQUMxQixRQUFJLE9BQU8sT0FBTztBQUNsQixXQUFPLFNBQVMsWUFBYSxTQUFTLFlBQVksaUJBQWlCLEtBQUssR0FBQTtFQUFBO0FBR25FLFdBQUEscUJBQTZCO0FBQ2xDLFFBQUksTUFBTSxvQkFBSSxJQUFBO0FBQ2QsUUFBSSxRQUFRLFNBQVMsaUJBQWlCLE9BQUE7QUFDdEMsYUFBUSxJQUFJLEdBQUcsTUFBTSxNQUFNLFFBQVEsSUFBSSxLQUFLLEtBQUk7QUFDOUMsVUFBRyxJQUFJLElBQUksTUFBTSxDQUFBLEVBQUcsRUFBQSxHQUFJO0FBQ3RCLGdCQUFRLE1BQU0sMEJBQTBCLE1BQU0sQ0FBQSxFQUFHLEVBQUEsOEJBQUE7TUFBQSxPQUM1QztBQUNMLFlBQUksSUFBSSxNQUFNLENBQUEsRUFBRyxFQUFBO01BQUE7SUFBQTtFQUFBO0FBS2hCLE1BQUksUUFBUSxDQUFDLE1BQU0sTUFBTSxLQUFLLFFBQVE7QUFDM0MsUUFBRyxLQUFLLFdBQVcsZUFBQSxHQUFpQjtBQUNsQyxjQUFRLElBQUksR0FBRyxLQUFLLEVBQUEsSUFBTSxJQUFBLEtBQVMsR0FBQSxPQUFVLEdBQUE7SUFBQTtFQUFBO0FBSzFDLE1BQUlDLFdBQVUsQ0FBQyxRQUFRLE9BQU8sUUFBUSxhQUFhLE1BQU0sV0FBVztBQUFFLFdBQU87RUFBQTtBQUU3RSxNQUFJLFFBQVEsQ0FBQyxRQUFRO0FBQUUsV0FBTyxLQUFLLE1BQU0sS0FBSyxVQUFVLEdBQUEsQ0FBQTtFQUFBO0FBRXhELE1BQUksb0JBQW9CLENBQUMsSUFBSSxTQUFTLGFBQWE7QUFDeEQsT0FBRztBQUNELFVBQUcsR0FBRyxRQUFRLElBQUksT0FBQSxHQUFBLEdBQVk7QUFBRSxlQUFPO01BQUE7QUFDdkMsV0FBSyxHQUFHLGlCQUFpQixHQUFHO0lBQUEsU0FDdEIsT0FBTyxRQUFRLEdBQUcsYUFBYSxLQUFLLEVBQUcsWUFBWSxTQUFTLFdBQVcsRUFBQSxLQUFRLEdBQUcsUUFBUSxpQkFBQTtBQUNsRyxXQUFPO0VBQUE7QUFHRixNQUFJLFdBQVcsQ0FBQyxRQUFRO0FBQzdCLFdBQU8sUUFBUSxRQUFRLE9BQU8sUUFBUSxZQUFZLEVBQUUsZUFBZTtFQUFBO0FBRzlELE1BQUksYUFBYSxDQUFDLE1BQU0sU0FBUyxLQUFLLFVBQVUsSUFBQSxNQUFVLEtBQUssVUFBVSxJQUFBO0FBRXpFLE1BQUksVUFBVSxDQUFDLFFBQVE7QUFDNUIsYUFBUSxLQUFLLEtBQUk7QUFBRSxhQUFPO0lBQUE7QUFDMUIsV0FBTztFQUFBO0FBR0YsTUFBSSxRQUFRLENBQUMsSUFBSSxhQUFhLE1BQU0sU0FBUyxFQUFBO0FBRTdDLE1BQUksa0JBQWtCLFNBQVUsU0FBUyxTQUFTLE1BQU1ELGFBQVc7QUFDeEUsWUFBUSxRQUFRLENBQUEsVUFBUztBQUN2QixVQUFJLGdCQUFnQixJQUFJLGNBQWMsT0FBTyxLQUFLLE9BQU8sWUFBWUEsV0FBQTtBQUNyRSxvQkFBYyxPQUFBO0lBQUEsQ0FBQTtFQUFBO0FDNURsQixNQUFJLFVBQVU7SUFDWixlQUFjO0FBQUUsYUFBUSxPQUFRLFFBQVEsY0FBZTtJQUFBO0lBRXZELFVBQVUsY0FBYyxXQUFXLFFBQU87QUFDeEMsYUFBTyxhQUFhLFdBQVcsS0FBSyxTQUFTLFdBQVcsTUFBQSxDQUFBO0lBQUE7SUFHMUQsWUFBWSxjQUFjLFdBQVcsUUFBUSxTQUFTLE1BQUs7QUFDekQsVUFBSSxVQUFVLEtBQUssU0FBUyxjQUFjLFdBQVcsTUFBQTtBQUNyRCxVQUFJLE1BQU0sS0FBSyxTQUFTLFdBQVcsTUFBQTtBQUNuQyxVQUFJLFNBQVMsWUFBWSxPQUFPLFVBQVUsS0FBSyxPQUFBO0FBQy9DLG1CQUFhLFFBQVEsS0FBSyxLQUFLLFVBQVUsTUFBQSxDQUFBO0FBQ3pDLGFBQU87SUFBQTtJQUdULFNBQVMsY0FBYyxXQUFXLFFBQU87QUFDdkMsYUFBTyxLQUFLLE1BQU0sYUFBYSxRQUFRLEtBQUssU0FBUyxXQUFXLE1BQUEsQ0FBQSxDQUFBO0lBQUE7SUFHbEUsbUJBQW1CLFVBQVM7QUFDMUIsVUFBRyxDQUFDLEtBQUssYUFBQSxHQUFlO0FBQUU7TUFBQTtBQUMxQixjQUFRLGFBQWEsU0FBUyxRQUFRLFNBQVMsQ0FBQSxDQUFBLEdBQUssSUFBSSxPQUFPLFNBQVMsSUFBQTtJQUFBO0lBRzFFLFVBQVUsTUFBTSxNQUFNLElBQUc7QUFDdkIsVUFBRyxLQUFLLGFBQUEsR0FBZTtBQUNyQixZQUFHLE9BQU8sT0FBTyxTQUFTLE1BQUs7QUFDN0IsY0FBRyxLQUFLLFFBQVEsY0FBYyxLQUFLLFFBQU87QUFFeEMsZ0JBQUksZUFBZSxRQUFRLFNBQVMsQ0FBQTtBQUNwQyx5QkFBYSxTQUFTLEtBQUs7QUFDM0Isb0JBQVEsYUFBYSxjQUFjLElBQUksT0FBTyxTQUFTLElBQUE7VUFBQTtBQUd6RCxpQkFBTyxLQUFLO0FBQ1osa0JBQVEsT0FBTyxPQUFBLEVBQVMsTUFBTSxJQUFJLE1BQU0sSUFBQTtBQUN4QyxjQUFJLFNBQVMsS0FBSyxnQkFBZ0IsT0FBTyxTQUFTLElBQUE7QUFFbEQsY0FBRyxRQUFPO0FBQ1IsbUJBQU8sZUFBQTtVQUFBLFdBQ0MsS0FBSyxTQUFTLFlBQVc7QUFDakMsbUJBQU8sT0FBTyxHQUFHLENBQUE7VUFBQTtRQUFBO01BQUEsT0FHaEI7QUFDTCxhQUFLLFNBQVMsRUFBQTtNQUFBO0lBQUE7SUFJbEIsVUFBVSxNQUFNLE9BQU07QUFDcEIsZUFBUyxTQUFTLEdBQUcsSUFBQSxJQUFRLEtBQUE7SUFBQTtJQUcvQixVQUFVLE1BQUs7QUFDYixhQUFPLFNBQVMsT0FBTyxRQUFRLElBQUksT0FBTyxpQkFBa0IsSUFBQSx1QkFBQSxHQUFpQyxJQUFBO0lBQUE7SUFHL0YsU0FBUyxPQUFPLE9BQU07QUFDcEIsVUFBRyxPQUFNO0FBQUUsZ0JBQVEsVUFBVSxxQkFBcUIsUUFBUSx5QkFBQTtNQUFBO0FBQzFELGFBQU8sV0FBVztJQUFBO0lBR3BCLFNBQVMsV0FBVyxRQUFPO0FBQUUsYUFBTyxHQUFHLFNBQUEsSUFBYSxNQUFBO0lBQUE7SUFFcEQsZ0JBQWdCLFdBQVU7QUFDeEIsVUFBSUUsUUFBTyxVQUFVLFNBQUEsRUFBVyxVQUFVLENBQUE7QUFDMUMsVUFBR0EsVUFBUyxJQUFHO0FBQUU7TUFBQTtBQUNqQixhQUFPLFNBQVMsZUFBZUEsS0FBQSxLQUFTLFNBQVMsY0FBYyxXQUFXQSxLQUFBLElBQUE7SUFBQTtFQUFBO0FBSTlFLE1BQU8sa0JBQVE7QUMzQ2YsTUFBSSxNQUFNO0lBQ1IsS0FBSyxJQUFHO0FBQUUsYUFBTyxTQUFTLGVBQWUsRUFBQSxLQUFPLFNBQVMsbUJBQW1CLEVBQUEsRUFBQTtJQUFBO0lBRTVFLFlBQVksSUFBSSxXQUFVO0FBQ3hCLFNBQUcsVUFBVSxPQUFPLFNBQUE7QUFDcEIsVUFBRyxHQUFHLFVBQVUsV0FBVyxHQUFFO0FBQUUsV0FBRyxnQkFBZ0IsT0FBQTtNQUFBO0lBQUE7SUFHcEQsSUFBSSxNQUFNLE9BQU8sVUFBUztBQUN4QixVQUFHLENBQUMsTUFBSztBQUFFLGVBQU8sQ0FBQTtNQUFBO0FBQ2xCLFVBQUksUUFBUSxNQUFNLEtBQUssS0FBSyxpQkFBaUIsS0FBQSxDQUFBO0FBQzdDLGFBQU8sV0FBVyxNQUFNLFFBQVEsUUFBQSxJQUFZO0lBQUE7SUFHOUMsZ0JBQWdCLE1BQUs7QUFDbkIsVUFBSSxXQUFXLFNBQVMsY0FBYyxVQUFBO0FBQ3RDLGVBQVMsWUFBWTtBQUNyQixhQUFPLFNBQVMsUUFBUTtJQUFBO0lBRzFCLGNBQWMsSUFBRztBQUFFLGFBQU8sR0FBRyxTQUFTLFVBQVUsR0FBRyxhQUFhLGNBQUEsTUFBb0I7SUFBQTtJQUVwRixpQkFBaUIsTUFBSztBQUFFLGFBQU8sS0FBSyxJQUFJLE1BQU0sc0JBQXNCLGNBQUEsR0FBQTtJQUFBO0lBRXBFLHNCQUFzQixNQUFNLEtBQUk7QUFDOUIsYUFBTyxLQUFLLHlCQUF5QixLQUFLLElBQUksTUFBTSxJQUFJLGFBQUEsS0FBa0IsR0FBQSxJQUFBLEdBQVUsSUFBQTtJQUFBO0lBR3RGLGVBQWUsTUFBSztBQUNsQixhQUFPLEtBQUssTUFBTSxJQUFJLFFBQVEsTUFBTSxXQUFBLElBQWUsT0FBTztJQUFBO0lBRzVELHNCQUFzQixJQUFHO0FBQ3ZCLFVBQUcsS0FBSyxXQUFXLEVBQUEsR0FBSTtBQUFFLFdBQUcsYUFBYSxhQUFhLEVBQUE7TUFBQTtBQUN0RCxXQUFLLFdBQVcsSUFBSSxhQUFhLElBQUE7SUFBQTtJQUduQywwQkFBMEIsTUFBTSxVQUFTO0FBQ3ZDLFVBQUksV0FBVyxTQUFTLGNBQWMsVUFBQTtBQUN0QyxlQUFTLFlBQVk7QUFDckIsYUFBTyxLQUFLLGdCQUFnQixTQUFTLFNBQVMsUUFBQTtJQUFBO0lBR2hELFVBQVUsSUFBSSxXQUFVO0FBQ3RCLGNBQVEsR0FBRyxhQUFhLFNBQUEsS0FBYyxHQUFHLGFBQWEsaUJBQUEsT0FBd0I7SUFBQTtJQUdoRixZQUFZLElBQUksV0FBVyxhQUFZO0FBQ3JDLGFBQU8sR0FBRyxnQkFBZ0IsWUFBWSxRQUFRLEdBQUcsYUFBYSxTQUFBLENBQUEsS0FBZTtJQUFBO0lBRy9FLGNBQWMsSUFBRztBQUFFLGFBQU8sS0FBSyxJQUFJLElBQUksSUFBSSxVQUFBLEdBQUE7SUFBQTtJQUUzQyxnQkFBZ0IsSUFBSSxVQUFTO0FBQzNCLGFBQU8sS0FBSyxJQUFJLElBQUksR0FBRyxpQkFBQSxJQUFxQixhQUFBLEtBQWtCLFFBQUEsSUFBQTtJQUFBO0lBR2hFLGVBQWUsTUFBTSxNQUFLO0FBQ3hCLFVBQUksVUFBVSxJQUFJLElBQUksSUFBQTtBQUN0QixhQUFPLEtBQUssT0FBTyxDQUFDLEtBQUssUUFBUTtBQUMvQixZQUFJLFdBQVcsSUFBSSxhQUFBLEtBQWtCLEdBQUEsT0FBVSxhQUFBO0FBRS9DLGFBQUsseUJBQXlCLEtBQUssSUFBSSxNQUFNLFFBQUEsR0FBVyxJQUFBLEVBQ3JELElBQUksQ0FBQSxPQUFNLFNBQVMsR0FBRyxhQUFhLGFBQUEsQ0FBQSxDQUFBLEVBQ25DLFFBQVEsQ0FBQSxhQUFZLElBQUksT0FBTyxRQUFBLENBQUE7QUFFbEMsZUFBTztNQUFBLEdBQ04sT0FBQTtJQUFBO0lBR0wseUJBQXlCLE9BQU8sUUFBTztBQUNyQyxVQUFHLE9BQU8sY0FBYyxpQkFBQSxHQUFtQjtBQUN6QyxlQUFPLE1BQU0sT0FBTyxDQUFBLE9BQU0sS0FBSyxtQkFBbUIsSUFBSSxNQUFBLENBQUE7TUFBQSxPQUNqRDtBQUNMLGVBQU87TUFBQTtJQUFBO0lBSVgsbUJBQW1CLE1BQU0sUUFBTztBQUM5QixhQUFNLE9BQU8sS0FBSyxZQUFXO0FBQzNCLFlBQUcsS0FBSyxXQUFXLE1BQUEsR0FBUTtBQUFFLGlCQUFPO1FBQUE7QUFDcEMsWUFBRyxLQUFLLGFBQWEsV0FBQSxNQUFpQixNQUFLO0FBQUUsaUJBQU87UUFBQTtNQUFBO0lBQUE7SUFJeEQsUUFBUSxJQUFJLEtBQUk7QUFBRSxhQUFPLEdBQUcsV0FBQSxLQUFnQixHQUFHLFdBQUEsRUFBYSxHQUFBO0lBQUE7SUFFNUQsY0FBYyxJQUFJLEtBQUk7QUFBRSxTQUFHLFdBQUEsS0FBZ0IsT0FBUSxHQUFHLFdBQUEsRUFBYSxHQUFBO0lBQUE7SUFFbkUsV0FBVyxJQUFJLEtBQUssT0FBTTtBQUN4QixVQUFHLENBQUMsR0FBRyxXQUFBLEdBQWE7QUFBRSxXQUFHLFdBQUEsSUFBZSxDQUFBO01BQUE7QUFDeEMsU0FBRyxXQUFBLEVBQWEsR0FBQSxJQUFPO0lBQUE7SUFHekIsY0FBYyxJQUFJLEtBQUssWUFBWSxZQUFXO0FBQzVDLFVBQUksV0FBVyxLQUFLLFFBQVEsSUFBSSxHQUFBO0FBQ2hDLFVBQUcsYUFBYSxRQUFVO0FBQ3hCLGFBQUssV0FBVyxJQUFJLEtBQUssV0FBVyxVQUFBLENBQUE7TUFBQSxPQUMvQjtBQUNMLGFBQUssV0FBVyxJQUFJLEtBQUssV0FBVyxRQUFBLENBQUE7TUFBQTtJQUFBO0lBSXhDLGFBQWEsUUFBUSxRQUFPO0FBQzFCLFVBQUcsT0FBTyxXQUFBLEdBQWE7QUFDckIsZUFBTyxXQUFBLElBQWUsT0FBTyxXQUFBO01BQUE7SUFBQTtJQUlqQyxTQUFTLEtBQUk7QUFDWCxVQUFJLFVBQVUsU0FBUyxjQUFjLE9BQUE7QUFDckMsVUFBSSxFQUFDLFFBQVEsT0FBQSxJQUFVLFFBQVE7QUFDL0IsZUFBUyxRQUFRLEdBQUcsVUFBVSxFQUFBLEdBQUssR0FBQSxHQUFNLFVBQVUsRUFBQTtJQUFBO0lBR3JELFNBQVMsSUFBSSxPQUFPLGFBQWEsaUJBQWlCLGFBQWEsaUJBQWlCLGFBQWEsVUFBUztBQUNwRyxVQUFJQyxZQUFXLEdBQUcsYUFBYSxXQUFBO0FBQy9CLFVBQUksV0FBVyxHQUFHLGFBQWEsV0FBQTtBQUMvQixVQUFHQSxjQUFhLElBQUc7QUFBRSxRQUFBQSxZQUFXO01BQUE7QUFDaEMsVUFBRyxhQUFhLElBQUc7QUFBRSxtQkFBVztNQUFBO0FBQ2hDLFVBQUksUUFBUUEsYUFBWTtBQUN4QixjQUFPLE9BQUE7UUFBQSxLQUNBO0FBQU0saUJBQU8sU0FBQTtRQUFBLEtBRWI7QUFDSCxjQUFHLEtBQUssS0FBSyxJQUFJLGVBQUEsR0FBaUI7QUFDaEMsZUFBRyxpQkFBaUIsUUFBUSxNQUFNLFNBQUEsQ0FBQTtVQUFBO0FBRXBDO1FBQUE7QUFHQSxjQUFJLFVBQVUsU0FBUyxLQUFBO0FBQ3ZCLGNBQUksVUFBVSxNQUFNLFdBQVcsS0FBSyxjQUFjLElBQUksU0FBQSxJQUFhLFNBQUE7QUFDbkUsY0FBSSxlQUFlLEtBQUssU0FBUyxJQUFJLGtCQUFrQixPQUFBO0FBQ3ZELGNBQUcsTUFBTSxPQUFBLEdBQVM7QUFBRSxtQkFBTyxTQUFTLG9DQUFvQyxLQUFBLEVBQUE7VUFBQTtBQUN4RSxjQUFHLFVBQVM7QUFDVixnQkFBSSxhQUFhO0FBQ2pCLGdCQUFHLE1BQU0sU0FBUyxXQUFVO0FBQzFCLGtCQUFJLFVBQVUsS0FBSyxRQUFRLElBQUksaUJBQUE7QUFDL0IsbUJBQUssV0FBVyxJQUFJLG1CQUFtQixNQUFNLEdBQUE7QUFDN0MsMkJBQWEsWUFBWSxNQUFNO1lBQUE7QUFHakMsZ0JBQUcsQ0FBQyxjQUFjLEtBQUssUUFBUSxJQUFJLFNBQUEsR0FBVztBQUM1QyxxQkFBTztZQUFBLE9BQ0Y7QUFDTCx1QkFBQTtBQUNBLG1CQUFLLFdBQVcsSUFBSSxXQUFXLElBQUE7QUFDL0IseUJBQVcsTUFBTTtBQUNmLG9CQUFHLFlBQUEsR0FBYztBQUFFLHVCQUFLLGFBQWEsSUFBSSxnQkFBQTtnQkFBQTtjQUFBLEdBQ3hDLE9BQUE7WUFBQTtVQUFBLE9BRUE7QUFDTCx1QkFBVyxNQUFNO0FBQ2Ysa0JBQUcsWUFBQSxHQUFjO0FBQUUscUJBQUssYUFBYSxJQUFJLGtCQUFrQixZQUFBO2NBQUE7WUFBQSxHQUMxRCxPQUFBO1VBQUE7QUFHTCxjQUFJLE9BQU8sR0FBRztBQUNkLGNBQUcsUUFBUSxLQUFLLEtBQUssTUFBTSxlQUFBLEdBQWlCO0FBQzFDLGlCQUFLLGlCQUFpQixVQUFVLE1BQU07QUFDcEMsb0JBQU0sS0FBTSxJQUFJLFNBQVMsSUFBQSxFQUFPLFFBQUEsR0FBVyxDQUFDLENBQUMsSUFBQSxNQUFVO0FBQ3JELG9CQUFJLFFBQVEsS0FBSyxjQUFjLFVBQVUsSUFBQSxJQUFBO0FBQ3pDLHFCQUFLLFNBQVMsT0FBTyxnQkFBQTtBQUNyQixxQkFBSyxjQUFjLE9BQU8sU0FBQTtjQUFBLENBQUE7WUFBQSxDQUFBO1VBQUE7QUFJaEMsY0FBRyxLQUFLLEtBQUssSUFBSSxlQUFBLEdBQWlCO0FBQ2hDLGVBQUcsaUJBQWlCLFFBQVEsTUFBTSxLQUFLLGFBQWEsSUFBSSxnQkFBQSxDQUFBO1VBQUE7TUFBQTtJQUFBO0lBS2hFLGFBQWEsSUFBSSxLQUFLLGNBQWE7QUFDakMsVUFBSSxDQUFDLE9BQU8sT0FBQSxJQUFXLEtBQUssUUFBUSxJQUFJLEdBQUE7QUFDeEMsVUFBRyxDQUFDLGNBQWE7QUFBRSx1QkFBZTtNQUFBO0FBQ2xDLFVBQUcsaUJBQWlCLE9BQU07QUFDeEIsYUFBSyxTQUFTLElBQUksR0FBQTtBQUNsQixnQkFBQTtNQUFBO0lBQUE7SUFJSixLQUFLLElBQUksS0FBSTtBQUNYLFVBQUcsS0FBSyxRQUFRLElBQUksR0FBQSxNQUFTLE1BQUs7QUFBRSxlQUFPO01BQUE7QUFDM0MsV0FBSyxXQUFXLElBQUksS0FBSyxJQUFBO0FBQ3pCLGFBQU87SUFBQTtJQUdULFNBQVMsSUFBSSxLQUFLLFVBQVUsV0FBVztJQUFBLEdBQUk7QUFDekMsVUFBSSxDQUFDLFlBQUEsSUFBZ0IsS0FBSyxRQUFRLElBQUksR0FBQSxLQUFRLENBQUMsR0FBRyxPQUFBO0FBQ2xEO0FBQ0EsV0FBSyxXQUFXLElBQUksS0FBSyxDQUFDLGNBQWMsT0FBQSxDQUFBO0FBQ3hDLGFBQU87SUFBQTtJQUdULGFBQWEsV0FBVyxJQUFJLGdCQUFlO0FBQ3pDLFVBQUksUUFBUSxHQUFHLGdCQUFnQixHQUFHLGFBQWEsY0FBQTtBQUUvQyxVQUFJLFFBQVEsU0FBUyxVQUFVLGNBQWMsUUFBUSxLQUFBLGNBQW1CLEtBQUEsSUFBQTtBQUN4RSxVQUFHLENBQUMsT0FBTTtBQUFFO01BQUE7QUFFWixVQUFHLEVBQUUsS0FBSyxRQUFRLE9BQU8sZUFBQSxLQUFvQixLQUFLLFFBQVEsTUFBTSxNQUFNLGlCQUFBLElBQW9CO0FBQ3hGLFdBQUcsVUFBVSxJQUFJLHFCQUFBO01BQUE7SUFBQTtJQUlyQixVQUFVLFNBQVMsZ0JBQWU7QUFDaEMsVUFBRyxRQUFRLE1BQU0sUUFBUSxNQUFLO0FBQzVCLGFBQUssSUFBSSxRQUFRLE1BQU0sSUFBSSxjQUFBLEtBQW1CLFFBQVEsRUFBQSxRQUFVLGNBQUEsS0FBbUIsUUFBUSxJQUFBLE1BQVUsQ0FBQyxPQUFPO0FBQzNHLGVBQUssWUFBWSxJQUFJLHFCQUFBO1FBQUEsQ0FBQTtNQUFBO0lBQUE7SUFLM0IsV0FBVyxNQUFLO0FBQ2QsYUFBTyxLQUFLLGdCQUFnQixLQUFLLGFBQWEsYUFBQTtJQUFBO0lBR2hELFlBQVksTUFBSztBQUNmLGFBQU8sS0FBSyxnQkFBZ0IsS0FBSyxhQUFhLFVBQUEsTUFBZ0I7SUFBQTtJQUdoRSxjQUFjLElBQUc7QUFDZixhQUFPLEtBQUssV0FBVyxFQUFBLElBQU0sS0FBSyxLQUFLLElBQUksSUFBSSxJQUFJLGFBQUEsR0FBQSxFQUFrQixDQUFBO0lBQUE7SUFHdkUsY0FBYyxRQUFRLE1BQU0sT0FBTyxDQUFBLEdBQUc7QUFDcEMsVUFBSSxVQUFVLEtBQUssWUFBWSxTQUFZLE9BQU8sQ0FBQyxDQUFDLEtBQUs7QUFDekQsVUFBSSxZQUFZLEVBQUMsU0FBa0IsWUFBWSxNQUFNLFFBQVEsS0FBSyxVQUFVLENBQUEsRUFBQTtBQUM1RSxVQUFJLFFBQVEsU0FBUyxVQUFVLElBQUksV0FBVyxTQUFTLFNBQUEsSUFBYSxJQUFJLFlBQVksTUFBTSxTQUFBO0FBQzFGLGFBQU8sY0FBYyxLQUFBO0lBQUE7SUFHdkIsVUFBVSxNQUFNLE1BQUs7QUFDbkIsVUFBRyxPQUFRLFNBQVUsYUFBWTtBQUMvQixlQUFPLEtBQUssVUFBVSxJQUFBO01BQUEsT0FDakI7QUFDTCxZQUFJLFNBQVMsS0FBSyxVQUFVLEtBQUE7QUFDNUIsZUFBTyxZQUFZO0FBQ25CLGVBQU87TUFBQTtJQUFBO0lBSVgsV0FBVyxRQUFRLFFBQVEsT0FBTyxDQUFBLEdBQUc7QUFDbkMsVUFBSSxVQUFVLEtBQUssV0FBVyxDQUFBO0FBQzlCLFVBQUksWUFBWSxLQUFLO0FBQ3JCLFVBQUksY0FBYyxPQUFPO0FBQ3pCLGVBQVEsSUFBSSxZQUFZLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FBSTtBQUM5QyxZQUFJLE9BQU8sWUFBWSxDQUFBLEVBQUc7QUFDMUIsWUFBRyxRQUFRLFFBQVEsSUFBQSxJQUFRLEdBQUU7QUFBRSxpQkFBTyxhQUFhLE1BQU0sT0FBTyxhQUFhLElBQUEsQ0FBQTtRQUFBO01BQUE7QUFHL0UsVUFBSSxjQUFjLE9BQU87QUFDekIsZUFBUSxJQUFJLFlBQVksU0FBUyxHQUFHLEtBQUssR0FBRyxLQUFJO0FBQzlDLFlBQUksT0FBTyxZQUFZLENBQUEsRUFBRztBQUMxQixZQUFHLFdBQVU7QUFDWCxjQUFHLEtBQUssV0FBVyxPQUFBLEtBQVksQ0FBQyxPQUFPLGFBQWEsSUFBQSxHQUFNO0FBQUUsbUJBQU8sZ0JBQWdCLElBQUE7VUFBQTtRQUFBLE9BQzlFO0FBQ0wsY0FBRyxDQUFDLE9BQU8sYUFBYSxJQUFBLEdBQU07QUFBRSxtQkFBTyxnQkFBZ0IsSUFBQTtVQUFBO1FBQUE7TUFBQTtJQUFBO0lBSzdELGtCQUFrQixRQUFRLFFBQU87QUFFL0IsVUFBRyxFQUFFLGtCQUFrQixvQkFBbUI7QUFBRSxZQUFJLFdBQVcsUUFBUSxRQUFRLEVBQUMsU0FBUyxDQUFDLE9BQUEsRUFBQSxDQUFBO01BQUE7QUFDdEYsVUFBRyxPQUFPLFVBQVM7QUFDakIsZUFBTyxhQUFhLFlBQVksSUFBQTtNQUFBLE9BQzNCO0FBQ0wsZUFBTyxnQkFBZ0IsVUFBQTtNQUFBO0lBQUE7SUFJM0Isa0JBQWtCLElBQUc7QUFDbkIsYUFBTyxHQUFHLHNCQUFzQixHQUFHLFNBQVMsVUFBVSxHQUFHLFNBQVM7SUFBQTtJQUdwRSxhQUFhLFNBQVMsZ0JBQWdCLGNBQWE7QUFDakQsVUFBRyxDQUFDLElBQUksZUFBZSxPQUFBLEdBQVM7QUFBRTtNQUFBO0FBQ2xDLFVBQUksYUFBYSxRQUFRLFFBQVEsUUFBQTtBQUNqQyxVQUFHLFFBQVEsVUFBUztBQUFFLGdCQUFRLEtBQUE7TUFBQTtBQUM5QixVQUFHLENBQUMsWUFBVztBQUFFLGdCQUFRLE1BQUE7TUFBQTtBQUN6QixVQUFHLEtBQUssa0JBQWtCLE9BQUEsR0FBUztBQUNqQyxnQkFBUSxrQkFBa0IsZ0JBQWdCLFlBQUE7TUFBQTtJQUFBO0lBSTlDLFlBQVksSUFBRztBQUFFLGFBQU8sK0JBQStCLEtBQUssR0FBRyxPQUFBLEtBQVksR0FBRyxTQUFTO0lBQUE7SUFFdkYsaUJBQWlCLElBQUc7QUFDbEIsVUFBRyxjQUFjLG9CQUFvQixpQkFBaUIsUUFBUSxHQUFHLEtBQUssa0JBQUEsQ0FBQSxLQUF3QixHQUFFO0FBQzlGLFdBQUcsVUFBVSxHQUFHLGFBQWEsU0FBQSxNQUFlO01BQUE7SUFBQTtJQUloRCxlQUFlLElBQUc7QUFBRSxhQUFPLGlCQUFpQixRQUFRLEdBQUcsSUFBQSxLQUFTO0lBQUE7SUFFaEUseUJBQXlCLElBQUksb0JBQW1CO0FBQzlDLGFBQU8sR0FBRyxnQkFBZ0IsR0FBRyxhQUFhLGtCQUFBLE1BQXdCO0lBQUE7SUFHcEUsZUFBZSxRQUFRLE1BQU0sYUFBWTtBQUN2QyxVQUFJLE1BQU0sT0FBTyxhQUFhLE9BQUE7QUFDOUIsVUFBRyxRQUFRLE1BQUs7QUFBRSxlQUFPO01BQUE7QUFDekIsVUFBSSxTQUFTLE9BQU8sYUFBYSxXQUFBO0FBRWpDLFVBQUcsSUFBSSxZQUFZLE1BQUEsS0FBVyxPQUFPLGFBQWEsV0FBQSxNQUFpQixNQUFLO0FBQ3RFLFlBQUcsSUFBSSxjQUFjLE1BQUEsR0FBUTtBQUFFLGNBQUksV0FBVyxRQUFRLE1BQU0sRUFBQyxXQUFXLEtBQUEsQ0FBQTtRQUFBO0FBQ3hFLFlBQUksV0FBVyxRQUFRLFNBQVMsSUFBQTtBQUNoQyxlQUFPO01BQUEsT0FDRjtBQUNMLDBCQUFrQixRQUFRLENBQUEsY0FBYTtBQUNyQyxpQkFBTyxVQUFVLFNBQVMsU0FBQSxLQUFjLEtBQUssVUFBVSxJQUFJLFNBQUE7UUFBQSxDQUFBO0FBRTdELGFBQUssYUFBYSxTQUFTLEdBQUE7QUFDM0IsYUFBSyxhQUFhLGFBQWEsTUFBQTtBQUMvQixlQUFPO01BQUE7SUFBQTtJQUlYLGdCQUFnQixXQUFXLFdBQVU7QUFDbkMsVUFBRyxJQUFJLFlBQVksV0FBVyxXQUFXLENBQUMsVUFBVSxTQUFBLENBQUEsR0FBWTtBQUM5RCxZQUFJLFdBQVcsQ0FBQTtBQUNmLGtCQUFVLFdBQVcsUUFBUSxDQUFBLGNBQWE7QUFDeEMsY0FBRyxDQUFDLFVBQVUsSUFBRztBQUVmLGdCQUFJLGtCQUFrQixVQUFVLGFBQWEsS0FBSyxhQUFhLFVBQVUsVUFBVSxLQUFBLE1BQVc7QUFDOUYsZ0JBQUcsQ0FBQyxpQkFBZ0I7QUFDbEIsdUJBQVM7OzJCQUNxQixVQUFVLGFBQWEsVUFBVSxXQUFXLEtBQUEsQ0FBQTs7Q0FBQTtZQUFBO0FBRTVFLHFCQUFTLEtBQUssU0FBQTtVQUFBO1FBQUEsQ0FBQTtBQUdsQixpQkFBUyxRQUFRLENBQUEsY0FBYSxVQUFVLE9BQUEsQ0FBQTtNQUFBO0lBQUE7SUFJNUMscUJBQXFCLFdBQVcsU0FBUyxPQUFNO0FBQzdDLFVBQUksZ0JBQWdCLG9CQUFJLElBQUksQ0FBQyxNQUFNLGFBQWEsWUFBWSxVQUFVLFdBQUEsQ0FBQTtBQUN0RSxVQUFHLFVBQVUsUUFBUSxZQUFBLE1BQWtCLFFBQVEsWUFBQSxHQUFjO0FBQzNELGNBQU0sS0FBSyxVQUFVLFVBQUEsRUFDbEIsT0FBTyxDQUFBLFNBQVEsQ0FBQyxjQUFjLElBQUksS0FBSyxLQUFLLFlBQUEsQ0FBQSxDQUFBLEVBQzVDLFFBQVEsQ0FBQSxTQUFRLFVBQVUsZ0JBQWdCLEtBQUssSUFBQSxDQUFBO0FBRWxELGVBQU8sS0FBSyxLQUFBLEVBQ1QsT0FBTyxDQUFBLFNBQVEsQ0FBQyxjQUFjLElBQUksS0FBSyxZQUFBLENBQUEsQ0FBQSxFQUN2QyxRQUFRLENBQUEsU0FBUSxVQUFVLGFBQWEsTUFBTSxNQUFNLElBQUEsQ0FBQSxDQUFBO0FBRXRELGVBQU87TUFBQSxPQUVGO0FBQ0wsWUFBSSxlQUFlLFNBQVMsY0FBYyxPQUFBO0FBQzFDLGVBQU8sS0FBSyxLQUFBLEVBQU8sUUFBUSxDQUFBLFNBQVEsYUFBYSxhQUFhLE1BQU0sTUFBTSxJQUFBLENBQUEsQ0FBQTtBQUN6RSxzQkFBYyxRQUFRLENBQUEsU0FBUSxhQUFhLGFBQWEsTUFBTSxVQUFVLGFBQWEsSUFBQSxDQUFBLENBQUE7QUFDckYscUJBQWEsWUFBWSxVQUFVO0FBQ25DLGtCQUFVLFlBQVksWUFBQTtBQUN0QixlQUFPO01BQUE7SUFBQTtJQUlYLFVBQVUsSUFBSSxNQUFNLFlBQVc7QUFDN0IsVUFBSSxNQUFNLElBQUksUUFBUSxJQUFJLFFBQUEsS0FBYSxDQUFBLEdBQUksS0FBSyxDQUFDLENBQUMsWUFBQSxNQUFvQixTQUFTLFlBQUE7QUFDL0UsVUFBRyxJQUFHO0FBQ0osWUFBSSxDQUFDLE9BQU8sS0FBSyxhQUFBLElBQWlCO0FBQ2xDLGVBQU87TUFBQSxPQUNGO0FBQ0wsZUFBTyxPQUFPLGVBQWdCLGFBQWEsV0FBQSxJQUFlO01BQUE7SUFBQTtJQUk5RCxhQUFhLElBQUksTUFBSztBQUNwQixXQUFLLGNBQWMsSUFBSSxVQUFVLENBQUEsR0FBSSxDQUFBLFFBQU87QUFDMUMsZUFBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLGNBQWMsQ0FBQSxNQUFPLGlCQUFpQixJQUFBO01BQUEsQ0FBQTtJQUFBO0lBSTlELFVBQVUsSUFBSSxNQUFNLElBQUc7QUFDckIsVUFBSSxnQkFBZ0IsR0FBRyxFQUFBO0FBQ3ZCLFdBQUssY0FBYyxJQUFJLFVBQVUsQ0FBQSxHQUFJLENBQUEsUUFBTztBQUMxQyxZQUFJLGdCQUFnQixJQUFJLFVBQVUsQ0FBQyxDQUFDLFlBQUEsTUFBb0IsU0FBUyxZQUFBO0FBQ2pFLFlBQUcsaUJBQWlCLEdBQUU7QUFDcEIsY0FBSSxhQUFBLElBQWlCLENBQUMsTUFBTSxJQUFJLGFBQUE7UUFBQSxPQUMzQjtBQUNMLGNBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxhQUFBLENBQUE7UUFBQTtBQUV0QixlQUFPO01BQUEsQ0FBQTtJQUFBO0lBSVgsc0JBQXNCLElBQUc7QUFDdkIsVUFBSSxNQUFNLElBQUksUUFBUSxJQUFJLFFBQUE7QUFDMUIsVUFBRyxDQUFDLEtBQUk7QUFBRTtNQUFBO0FBRVYsVUFBSSxRQUFRLENBQUMsQ0FBQyxNQUFNLElBQUksUUFBQSxNQUFjLEtBQUssVUFBVSxJQUFJLE1BQU0sRUFBQSxDQUFBO0lBQUE7RUFBQTtBQUluRSxNQUFPLGNBQVE7QUM5WmYsTUFBQSxjQUFBLE1BQWlDO0lBQUEsT0FDeEIsU0FBUyxRQUFRLE1BQUs7QUFDM0IsVUFBSSxRQUFRLEtBQUssWUFBWTtBQUM3QixVQUFJLGFBQWEsT0FBTyxhQUFhLHFCQUFBLEVBQXVCLE1BQU0sR0FBQTtBQUNsRSxVQUFJLFdBQVcsV0FBVyxRQUFRLGFBQWEsV0FBVyxJQUFBLENBQUEsS0FBVTtBQUNwRSxhQUFPLEtBQUssT0FBTyxNQUFNLFNBQVM7SUFBQTtJQUFBLE9BRzdCLGNBQWMsUUFBUSxNQUFLO0FBQ2hDLFVBQUksa0JBQWtCLE9BQU8sYUFBYSxvQkFBQSxFQUFzQixNQUFNLEdBQUE7QUFDdEUsVUFBSSxnQkFBZ0IsZ0JBQWdCLFFBQVEsYUFBYSxXQUFXLElBQUEsQ0FBQSxLQUFVO0FBQzlFLGFBQU8saUJBQWlCLEtBQUssU0FBUyxRQUFRLElBQUE7SUFBQTtJQUdoRCxZQUFZLFFBQVEsTUFBTSxNQUFLO0FBQzdCLFdBQUssTUFBTSxhQUFhLFdBQVcsSUFBQTtBQUNuQyxXQUFLLFNBQVM7QUFDZCxXQUFLLE9BQU87QUFDWixXQUFLLE9BQU87QUFDWixXQUFLLE9BQU87QUFDWixXQUFLLGVBQWU7QUFDcEIsV0FBSyxVQUFVO0FBQ2YsV0FBSyxZQUFZO0FBQ2pCLFdBQUssb0JBQW9CO0FBQ3pCLFdBQUssVUFBVSxXQUFXO01BQUE7QUFDMUIsV0FBSyxlQUFlLEtBQUssWUFBWSxLQUFLLElBQUE7QUFDMUMsV0FBSyxPQUFPLGlCQUFpQix1QkFBdUIsS0FBSyxZQUFBO0lBQUE7SUFHM0QsV0FBVTtBQUFFLGFBQU8sS0FBSztJQUFBO0lBRXhCLFNBQVMsVUFBUztBQUNoQixXQUFLLFlBQVksS0FBSyxNQUFNLFFBQUE7QUFDNUIsVUFBRyxLQUFLLFlBQVksS0FBSyxtQkFBa0I7QUFDekMsWUFBRyxLQUFLLGFBQWEsS0FBSTtBQUN2QixlQUFLLFlBQVk7QUFDakIsZUFBSyxvQkFBb0I7QUFDekIsZUFBSyxVQUFVO0FBQ2YsZUFBSyxLQUFLLGlCQUFpQixLQUFLLFFBQVEsS0FBSyxLQUFLLEtBQUssTUFBTTtBQUMzRCx5QkFBYSxZQUFZLEtBQUssUUFBUSxLQUFLLElBQUE7QUFDM0MsaUJBQUssUUFBQTtVQUFBLENBQUE7UUFBQSxPQUVGO0FBQ0wsZUFBSyxvQkFBb0IsS0FBSztBQUM5QixlQUFLLEtBQUssaUJBQWlCLEtBQUssUUFBUSxLQUFLLEtBQUssS0FBSyxTQUFBO1FBQUE7TUFBQTtJQUFBO0lBSzdELFNBQVE7QUFDTixXQUFLLGVBQWU7QUFDcEIsV0FBSyxVQUFVO0FBQ2YsV0FBSyxRQUFBO0lBQUE7SUFHUCxTQUFRO0FBQUUsYUFBTyxLQUFLO0lBQUE7SUFFdEIsTUFBTSxTQUFTLFVBQVM7QUFDdEIsV0FBSyxLQUFLLGlCQUFpQixLQUFLLFFBQVEsS0FBSyxLQUFLLEVBQUMsT0FBTyxPQUFBLENBQUE7QUFDMUQsbUJBQWEsV0FBVyxLQUFLLE1BQUE7SUFBQTtJQUsvQixPQUFPLFVBQVM7QUFDZCxXQUFLLFVBQVUsTUFBTTtBQUNuQixhQUFLLE9BQU8sb0JBQW9CLHVCQUF1QixLQUFLLFlBQUE7QUFDNUQsaUJBQUE7TUFBQTtJQUFBO0lBSUosY0FBYTtBQUNYLFVBQUksYUFBYSxLQUFLLE9BQU8sYUFBYSxxQkFBQSxFQUF1QixNQUFNLEdBQUE7QUFDdkUsVUFBRyxXQUFXLFFBQVEsS0FBSyxHQUFBLE1BQVMsSUFBRztBQUFFLGFBQUssT0FBQTtNQUFBO0lBQUE7SUFHaEQscUJBQW9CO0FBQ2xCLGFBQU87UUFDTCxlQUFlLEtBQUssS0FBSztRQUN6QixNQUFNLEtBQUssS0FBSztRQUNoQixNQUFNLEtBQUssS0FBSztRQUNoQixNQUFNLEtBQUssS0FBSztRQUNoQixLQUFLLEtBQUs7TUFBQTtJQUFBO0lBSWQsU0FBUyxXQUFVO0FBQ2pCLFVBQUcsS0FBSyxLQUFLLFVBQVM7QUFDcEIsWUFBSSxXQUFXLFVBQVUsS0FBSyxLQUFLLFFBQUEsS0FBYSxTQUFTLDhCQUE4QixLQUFLLEtBQUssUUFBQSxFQUFBO0FBQ2pHLGVBQU8sRUFBQyxNQUFNLEtBQUssS0FBSyxVQUFVLFNBQUE7TUFBQSxPQUM3QjtBQUNMLGVBQU8sRUFBQyxNQUFNLFdBQVcsVUFBVSxnQkFBQTtNQUFBO0lBQUE7SUFJdkMsY0FBYyxNQUFLO0FBQ2pCLFdBQUssT0FBTyxLQUFLLFFBQVEsS0FBSyxHQUFBO0FBQzlCLFVBQUcsQ0FBQyxLQUFLLE1BQUs7QUFBRSxpQkFBUyxrREFBa0QsS0FBSyxHQUFBLElBQU8sRUFBQyxPQUFPLEtBQUssUUFBUSxVQUFVLEtBQUEsQ0FBQTtNQUFBO0lBQUE7RUFBQTtBQ2xHMUgsTUFBSSxzQkFBc0I7QUFFMUIsTUFBQSxlQUFBLE1BQWtDO0lBQUEsT0FDekIsV0FBVyxNQUFLO0FBQ3JCLFVBQUksTUFBTSxLQUFLO0FBQ2YsVUFBRyxRQUFRLFFBQVU7QUFDbkIsZUFBTztNQUFBLE9BQ0Y7QUFDTCxhQUFLLFdBQVcsdUJBQXVCLFNBQUE7QUFDdkMsZUFBTyxLQUFLO01BQUE7SUFBQTtJQUFBLE9BSVQsZ0JBQWdCLFNBQVMsS0FBSyxVQUFTO0FBQzVDLFVBQUksT0FBTyxLQUFLLFlBQVksT0FBQSxFQUFTLEtBQUssQ0FBQSxVQUFRLEtBQUssV0FBVyxLQUFBLE1BQVUsR0FBQTtBQUM1RSxlQUFTLElBQUksZ0JBQWdCLElBQUEsQ0FBQTtJQUFBO0lBQUEsT0FHeEIscUJBQXFCLFFBQU87QUFDakMsVUFBSSxTQUFTO0FBQ2Isa0JBQUksaUJBQWlCLE1BQUEsRUFBUSxRQUFRLENBQUEsVUFBUztBQUM1QyxZQUFHLE1BQU0sYUFBYSxvQkFBQSxNQUEwQixNQUFNLGFBQWEsYUFBQSxHQUFlO0FBQ2hGO1FBQUE7TUFBQSxDQUFBO0FBR0osYUFBTyxTQUFTO0lBQUE7SUFBQSxPQUdYLGlCQUFpQixTQUFRO0FBQzlCLFVBQUksUUFBUSxLQUFLLFlBQVksT0FBQTtBQUM3QixVQUFJLFdBQVcsQ0FBQTtBQUNmLFlBQU0sUUFBUSxDQUFBLFNBQVE7QUFDcEIsWUFBSSxRQUFRLEVBQUMsTUFBTSxRQUFRLEtBQUE7QUFDM0IsWUFBSSxZQUFZLFFBQVEsYUFBYSxjQUFBO0FBQ3JDLGlCQUFTLFNBQUEsSUFBYSxTQUFTLFNBQUEsS0FBYyxDQUFBO0FBQzdDLGNBQU0sTUFBTSxLQUFLLFdBQVcsSUFBQTtBQUM1QixjQUFNLE9BQU8sS0FBSyxRQUFRLE1BQU07QUFDaEMsY0FBTSxPQUFPLEtBQUs7QUFDbEIsY0FBTSxPQUFPLEtBQUs7QUFDbEIsaUJBQVMsU0FBQSxFQUFXLEtBQUssS0FBQTtNQUFBLENBQUE7QUFFM0IsYUFBTztJQUFBO0lBQUEsT0FHRixXQUFXLFNBQVE7QUFDeEIsY0FBUSxRQUFRO0FBQ2hCLGNBQVEsZ0JBQWdCLGNBQUE7QUFDeEIsa0JBQUksV0FBVyxTQUFTLFNBQVMsQ0FBQSxDQUFBO0lBQUE7SUFBQSxPQUc1QixZQUFZLFNBQVMsTUFBSztBQUMvQixrQkFBSSxXQUFXLFNBQVMsU0FBUyxZQUFJLFFBQVEsU0FBUyxPQUFBLEVBQVMsT0FBTyxDQUFBLE1BQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxJQUFBLENBQUEsQ0FBQTtJQUFBO0lBQUEsT0FHcEYsV0FBVyxTQUFTLE9BQU07QUFDL0IsVUFBRyxRQUFRLGFBQWEsVUFBQSxNQUFnQixNQUFLO0FBQzNDLFlBQUksV0FBVyxNQUFNLE9BQU8sQ0FBQSxTQUFRLENBQUMsS0FBSyxZQUFZLE9BQUEsRUFBUyxLQUFLLENBQUEsTUFBSyxPQUFPLEdBQUcsR0FBRyxJQUFBLENBQUEsQ0FBQTtBQUN0RixvQkFBSSxXQUFXLFNBQVMsU0FBUyxLQUFLLFlBQVksT0FBQSxFQUFTLE9BQU8sUUFBQSxDQUFBO0FBQ2xFLGdCQUFRLFFBQVE7TUFBQSxPQUNYO0FBQ0wsb0JBQUksV0FBVyxTQUFTLFNBQVMsS0FBQTtNQUFBO0lBQUE7SUFBQSxPQUk5QixpQkFBaUIsUUFBTztBQUM3QixVQUFJLGFBQWEsWUFBSSxpQkFBaUIsTUFBQTtBQUN0QyxhQUFPLE1BQU0sS0FBSyxVQUFBLEVBQVksT0FBTyxDQUFBLE9BQU0sR0FBRyxTQUFTLEtBQUssWUFBWSxFQUFBLEVBQUksU0FBUyxDQUFBO0lBQUE7SUFBQSxPQUdoRixZQUFZLE9BQU07QUFDdkIsY0FBUSxZQUFJLFFBQVEsT0FBTyxPQUFBLEtBQVksQ0FBQSxHQUFJLE9BQU8sQ0FBQSxNQUFLLFlBQVksU0FBUyxPQUFPLENBQUEsQ0FBQTtJQUFBO0lBQUEsT0FHOUUsd0JBQXdCLFFBQU87QUFDcEMsVUFBSSxhQUFhLFlBQUksaUJBQWlCLE1BQUE7QUFDdEMsYUFBTyxNQUFNLEtBQUssVUFBQSxFQUFZLE9BQU8sQ0FBQSxVQUFTLEtBQUssdUJBQXVCLEtBQUEsRUFBTyxTQUFTLENBQUE7SUFBQTtJQUFBLE9BR3JGLHVCQUF1QixPQUFNO0FBQ2xDLGFBQU8sS0FBSyxZQUFZLEtBQUEsRUFBTyxPQUFPLENBQUEsTUFBSyxDQUFDLFlBQVksY0FBYyxPQUFPLENBQUEsQ0FBQTtJQUFBO0lBRy9FLFlBQVksU0FBUyxNQUFNLFlBQVc7QUFDcEMsV0FBSyxPQUFPO0FBQ1osV0FBSyxhQUFhO0FBQ2xCLFdBQUssV0FDSCxNQUFNLEtBQUssYUFBYSx1QkFBdUIsT0FBQSxLQUFZLENBQUEsQ0FBQSxFQUN4RCxJQUFJLENBQUEsU0FBUSxJQUFJLFlBQVksU0FBUyxNQUFNLElBQUEsQ0FBQTtBQUVoRCxXQUFLLHVCQUF1QixLQUFLLFNBQVM7SUFBQTtJQUc1QyxVQUFTO0FBQUUsYUFBTyxLQUFLO0lBQUE7SUFFdkIsa0JBQWtCLE1BQU0sU0FBU0gsYUFBVztBQUMxQyxXQUFLLFdBQ0gsS0FBSyxTQUFTLElBQUksQ0FBQSxVQUFTO0FBQ3pCLGNBQU0sY0FBYyxJQUFBO0FBQ3BCLGNBQU0sT0FBTyxNQUFNO0FBQ2pCLGVBQUs7QUFDTCxjQUFHLEtBQUsseUJBQXlCLEdBQUU7QUFBRSxpQkFBSyxXQUFBO1VBQUE7UUFBQSxDQUFBO0FBRTVDLGVBQU87TUFBQSxDQUFBO0FBR1gsVUFBSSxpQkFBaUIsS0FBSyxTQUFTLE9BQU8sQ0FBQyxLQUFLLFVBQVU7QUFDeEQsWUFBSSxFQUFDLE1BQU0sU0FBQSxJQUFZLE1BQU0sU0FBU0EsWUFBVyxTQUFBO0FBQ2pELFlBQUksSUFBQSxJQUFRLElBQUksSUFBQSxLQUFTLEVBQUMsVUFBb0IsU0FBUyxDQUFBLEVBQUE7QUFDdkQsWUFBSSxJQUFBLEVBQU0sUUFBUSxLQUFLLEtBQUE7QUFDdkIsZUFBTztNQUFBLEdBQ04sQ0FBQSxDQUFBO0FBRUgsZUFBUSxRQUFRLGdCQUFlO0FBQzdCLFlBQUksRUFBQyxVQUFVLFFBQUEsSUFBVyxlQUFlLElBQUE7QUFDekMsaUJBQVMsU0FBUyxTQUFTLE1BQU1BLFdBQUE7TUFBQTtJQUFBO0VBQUE7QUNySHZDLE1BQUksUUFBUTtJQUNWLGdCQUFnQjtNQUNkLGFBQVk7QUFBRSxlQUFPLEtBQUssR0FBRyxhQUFhLHFCQUFBO01BQUE7TUFFMUMsa0JBQWlCO0FBQUUsZUFBTyxLQUFLLEdBQUcsYUFBYSxvQkFBQTtNQUFBO01BRS9DLFVBQVM7QUFBRSxhQUFLLGlCQUFpQixLQUFLLGdCQUFBO01BQUE7TUFFdEMsVUFBUztBQUNQLFlBQUksZ0JBQWdCLEtBQUssZ0JBQUE7QUFDekIsWUFBRyxLQUFLLG1CQUFtQixlQUFjO0FBQ3ZDLGVBQUssaUJBQWlCO0FBQ3RCLGNBQUcsa0JBQWtCLElBQUc7QUFDdEIsaUJBQUssT0FBTyxhQUFhLEtBQUssR0FBRyxJQUFBO1VBQUE7UUFBQTtBQUlyQyxZQUFHLEtBQUssV0FBQSxNQUFpQixJQUFHO0FBQUUsZUFBSyxHQUFHLFFBQVE7UUFBQTtBQUM5QyxhQUFLLEdBQUcsY0FBYyxJQUFJLFlBQVkscUJBQUEsQ0FBQTtNQUFBO0lBQUE7SUFJMUMsZ0JBQWdCO01BQ2QsVUFBUztBQUNQLGFBQUssTUFBTSxLQUFLLEdBQUcsYUFBYSxvQkFBQTtBQUNoQyxhQUFLLFVBQVUsU0FBUyxlQUFlLEtBQUssR0FBRyxhQUFhLGNBQUEsQ0FBQTtBQUM1RCxxQkFBYSxnQkFBZ0IsS0FBSyxTQUFTLEtBQUssS0FBSyxDQUFBLFFBQU87QUFDMUQsZUFBSyxNQUFNO0FBQ1gsZUFBSyxHQUFHLE1BQU07UUFBQSxDQUFBO01BQUE7TUFHbEIsWUFBVztBQUNULFlBQUksZ0JBQWdCLEtBQUssR0FBQTtNQUFBO0lBQUE7RUFBQTtBQUsvQixNQUFPLGdCQUFRO0FDeENmLE1BQUEsdUJBQUEsTUFBMEM7SUFDeEMsWUFBWSxpQkFBaUIsZ0JBQWdCLFlBQVc7QUFDdEQsVUFBSSxZQUFZLG9CQUFJLElBQUE7QUFDcEIsVUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLEdBQUcsZUFBZSxRQUFBLEVBQVUsSUFBSSxDQUFBLFVBQVMsTUFBTSxFQUFBLENBQUE7QUFFdkUsVUFBSSxtQkFBbUIsQ0FBQTtBQUV2QixZQUFNLEtBQUssZ0JBQWdCLFFBQUEsRUFBVSxRQUFRLENBQUEsVUFBUztBQUNwRCxZQUFHLE1BQU0sSUFBRztBQUNWLG9CQUFVLElBQUksTUFBTSxFQUFBO0FBQ3BCLGNBQUcsU0FBUyxJQUFJLE1BQU0sRUFBQSxHQUFJO0FBQ3hCLGdCQUFJLG9CQUFvQixNQUFNLDBCQUEwQixNQUFNLHVCQUF1QjtBQUNyRiw2QkFBaUIsS0FBSyxFQUFDLFdBQVcsTUFBTSxJQUFJLGtCQUFBLENBQUE7VUFBQTtRQUFBO01BQUEsQ0FBQTtBQUtsRCxXQUFLLGNBQWMsZUFBZTtBQUNsQyxXQUFLLGFBQWE7QUFDbEIsV0FBSyxtQkFBbUI7QUFDeEIsV0FBSyxrQkFBa0IsQ0FBQyxHQUFHLFFBQUEsRUFBVSxPQUFPLENBQUEsT0FBTSxDQUFDLFVBQVUsSUFBSSxFQUFBLENBQUE7SUFBQTtJQVNuRSxVQUFTO0FBQ1AsVUFBSSxZQUFZLFlBQUksS0FBSyxLQUFLLFdBQUE7QUFDOUIsV0FBSyxpQkFBaUIsUUFBUSxDQUFBLG9CQUFtQjtBQUMvQyxZQUFHLGdCQUFnQixtQkFBa0I7QUFDbkMsZ0JBQU0sU0FBUyxlQUFlLGdCQUFnQixpQkFBQSxHQUFvQixDQUFBLGlCQUFnQjtBQUNoRixrQkFBTSxTQUFTLGVBQWUsZ0JBQWdCLFNBQUEsR0FBWSxDQUFBLFNBQVE7QUFDaEUsa0JBQUksaUJBQWlCLEtBQUssMEJBQTBCLEtBQUssdUJBQXVCLE1BQU0sYUFBYTtBQUNuRyxrQkFBRyxDQUFDLGdCQUFlO0FBQ2pCLDZCQUFhLHNCQUFzQixZQUFZLElBQUE7Y0FBQTtZQUFBLENBQUE7VUFBQSxDQUFBO1FBQUEsT0FJaEQ7QUFFTCxnQkFBTSxTQUFTLGVBQWUsZ0JBQWdCLFNBQUEsR0FBWSxDQUFBLFNBQVE7QUFDaEUsZ0JBQUksaUJBQWlCLEtBQUssMEJBQTBCO0FBQ3BELGdCQUFHLENBQUMsZ0JBQWU7QUFDakIsd0JBQVUsc0JBQXNCLGNBQWMsSUFBQTtZQUFBO1VBQUEsQ0FBQTtRQUFBO01BQUEsQ0FBQTtBQU10RCxVQUFHLEtBQUssY0FBYyxXQUFVO0FBQzlCLGFBQUssZ0JBQWdCLFFBQUEsRUFBVSxRQUFRLENBQUEsV0FBVTtBQUMvQyxnQkFBTSxTQUFTLGVBQWUsTUFBQSxHQUFTLENBQUEsU0FBUSxVQUFVLHNCQUFzQixjQUFjLElBQUEsQ0FBQTtRQUFBLENBQUE7TUFBQTtJQUFBO0VBQUE7QUM1RHJHLE1BQUkseUJBQXlCO0FBRTdCLFdBQUEsV0FBb0IsVUFBVSxRQUFRO0FBQ2xDLFFBQUksY0FBYyxPQUFPO0FBQ3pCLFFBQUk7QUFDSixRQUFJO0FBQ0osUUFBSTtBQUNKLFFBQUk7QUFDSixRQUFJO0FBR0osUUFBSSxPQUFPLGFBQWEsMEJBQTBCLFNBQVMsYUFBYSx3QkFBd0I7QUFDOUY7SUFBQTtBQUlGLGFBQVMsSUFBSSxZQUFZLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FBSztBQUM5QyxhQUFPLFlBQVksQ0FBQTtBQUNuQixpQkFBVyxLQUFLO0FBQ2hCLHlCQUFtQixLQUFLO0FBQ3hCLGtCQUFZLEtBQUs7QUFFakIsVUFBSSxrQkFBa0I7QUFDbEIsbUJBQVcsS0FBSyxhQUFhO0FBQzdCLG9CQUFZLFNBQVMsZUFBZSxrQkFBa0IsUUFBQTtBQUV0RCxZQUFJLGNBQWMsV0FBVztBQUN6QixjQUFJLEtBQUssV0FBVyxTQUFRO0FBQ3hCLHVCQUFXLEtBQUs7VUFBQTtBQUVwQixtQkFBUyxlQUFlLGtCQUFrQixVQUFVLFNBQUE7UUFBQTtNQUFBLE9BRXJEO0FBQ0gsb0JBQVksU0FBUyxhQUFhLFFBQUE7QUFFbEMsWUFBSSxjQUFjLFdBQVc7QUFDekIsbUJBQVMsYUFBYSxVQUFVLFNBQUE7UUFBQTtNQUFBO0lBQUE7QUFPNUMsUUFBSSxnQkFBZ0IsU0FBUztBQUU3QixhQUFTLElBQUksY0FBYyxTQUFTLEdBQUcsS0FBSyxHQUFHLEtBQUs7QUFDaEQsYUFBTyxjQUFjLENBQUE7QUFDckIsaUJBQVcsS0FBSztBQUNoQix5QkFBbUIsS0FBSztBQUV4QixVQUFJLGtCQUFrQjtBQUNsQixtQkFBVyxLQUFLLGFBQWE7QUFFN0IsWUFBSSxDQUFDLE9BQU8sZUFBZSxrQkFBa0IsUUFBQSxHQUFXO0FBQ3BELG1CQUFTLGtCQUFrQixrQkFBa0IsUUFBQTtRQUFBO01BQUEsT0FFOUM7QUFDSCxZQUFJLENBQUMsT0FBTyxhQUFhLFFBQUEsR0FBVztBQUNoQyxtQkFBUyxnQkFBZ0IsUUFBQTtRQUFBO01BQUE7SUFBQTtFQUFBO0FBTXpDLE1BQUk7QUFDSixNQUFJLFdBQVc7QUFFZixNQUFJLE1BQU0sT0FBTyxhQUFhLGNBQWMsU0FBWTtBQUN4RCxNQUFJLHVCQUF1QixDQUFDLENBQUMsT0FBTyxhQUFhLElBQUksY0FBYyxVQUFBO0FBQ25FLE1BQUksb0JBQW9CLENBQUMsQ0FBQyxPQUFPLElBQUksZUFBZSw4QkFBOEIsSUFBSSxZQUFBO0FBRXRGLFdBQUEsMkJBQW9DLEtBQUs7QUFDckMsUUFBSSxXQUFXLElBQUksY0FBYyxVQUFBO0FBQ2pDLGFBQVMsWUFBWTtBQUNyQixXQUFPLFNBQVMsUUFBUSxXQUFXLENBQUE7RUFBQTtBQUd2QyxXQUFBLHdCQUFpQyxLQUFLO0FBQ2xDLFFBQUksQ0FBQyxPQUFPO0FBQ1IsY0FBUSxJQUFJLFlBQUE7QUFDWixZQUFNLFdBQVcsSUFBSSxJQUFBO0lBQUE7QUFHekIsUUFBSSxXQUFXLE1BQU0seUJBQXlCLEdBQUE7QUFDOUMsV0FBTyxTQUFTLFdBQVcsQ0FBQTtFQUFBO0FBRy9CLFdBQUEsdUJBQWdDLEtBQUs7QUFDakMsUUFBSSxXQUFXLElBQUksY0FBYyxNQUFBO0FBQ2pDLGFBQVMsWUFBWTtBQUNyQixXQUFPLFNBQVMsV0FBVyxDQUFBO0VBQUE7QUFXL0IsV0FBQSxVQUFtQixLQUFLO0FBQ3BCLFVBQU0sSUFBSSxLQUFBO0FBQ1YsUUFBSSxzQkFBc0I7QUFJeEIsYUFBTywyQkFBMkIsR0FBQTtJQUFBLFdBQ3pCLG1CQUFtQjtBQUM1QixhQUFPLHdCQUF3QixHQUFBO0lBQUE7QUFHakMsV0FBTyx1QkFBdUIsR0FBQTtFQUFBO0FBYWxDLFdBQUEsaUJBQTBCLFFBQVEsTUFBTTtBQUNwQyxRQUFJLGVBQWUsT0FBTztBQUMxQixRQUFJLGFBQWEsS0FBSztBQUN0QixRQUFJLGVBQWU7QUFFbkIsUUFBSSxpQkFBaUIsWUFBWTtBQUM3QixhQUFPO0lBQUE7QUFHWCxvQkFBZ0IsYUFBYSxXQUFXLENBQUE7QUFDeEMsa0JBQWMsV0FBVyxXQUFXLENBQUE7QUFNcEMsUUFBSSxpQkFBaUIsTUFBTSxlQUFlLElBQUk7QUFDMUMsYUFBTyxpQkFBaUIsV0FBVyxZQUFBO0lBQUEsV0FDNUIsZUFBZSxNQUFNLGlCQUFpQixJQUFJO0FBQ2pELGFBQU8sZUFBZSxhQUFhLFlBQUE7SUFBQSxPQUNoQztBQUNILGFBQU87SUFBQTtFQUFBO0FBYWYsV0FBQSxnQkFBeUIsTUFBTSxjQUFjO0FBQ3pDLFdBQU8sQ0FBQyxnQkFBZ0IsaUJBQWlCLFdBQ3JDLElBQUksY0FBYyxJQUFBLElBQ2xCLElBQUksZ0JBQWdCLGNBQWMsSUFBQTtFQUFBO0FBTTFDLFdBQUEsYUFBc0IsUUFBUSxNQUFNO0FBQ2hDLFFBQUksV0FBVyxPQUFPO0FBQ3RCLFdBQU8sVUFBVTtBQUNiLFVBQUksWUFBWSxTQUFTO0FBQ3pCLFdBQUssWUFBWSxRQUFBO0FBQ2pCLGlCQUFXO0lBQUE7QUFFZixXQUFPO0VBQUE7QUFHWCxXQUFBLG9CQUE2QixRQUFRLE1BQU0sTUFBTTtBQUM3QyxRQUFJLE9BQU8sSUFBQSxNQUFVLEtBQUssSUFBQSxHQUFPO0FBQzdCLGFBQU8sSUFBQSxJQUFRLEtBQUssSUFBQTtBQUNwQixVQUFJLE9BQU8sSUFBQSxHQUFPO0FBQ2QsZUFBTyxhQUFhLE1BQU0sRUFBQTtNQUFBLE9BQ3ZCO0FBQ0gsZUFBTyxnQkFBZ0IsSUFBQTtNQUFBO0lBQUE7RUFBQTtBQUtuQyxNQUFJLG9CQUFvQjtJQUNwQixRQUFRLFNBQVMsUUFBUSxNQUFNO0FBQzNCLFVBQUksYUFBYSxPQUFPO0FBQ3hCLFVBQUksWUFBWTtBQUNaLFlBQUksYUFBYSxXQUFXLFNBQVMsWUFBQTtBQUNyQyxZQUFJLGVBQWUsWUFBWTtBQUMzQix1QkFBYSxXQUFXO0FBQ3hCLHVCQUFhLGNBQWMsV0FBVyxTQUFTLFlBQUE7UUFBQTtBQUVuRCxZQUFJLGVBQWUsWUFBWSxDQUFDLFdBQVcsYUFBYSxVQUFBLEdBQWE7QUFDakUsY0FBSSxPQUFPLGFBQWEsVUFBQSxLQUFlLENBQUMsS0FBSyxVQUFVO0FBSW5ELG1CQUFPLGFBQWEsWUFBWSxVQUFBO0FBQ2hDLG1CQUFPLGdCQUFnQixVQUFBO1VBQUE7QUFLM0IscUJBQVcsZ0JBQWdCO1FBQUE7TUFBQTtBQUduQywwQkFBb0IsUUFBUSxNQUFNLFVBQUE7SUFBQTtJQVF0QyxPQUFPLFNBQVMsUUFBUSxNQUFNO0FBQzFCLDBCQUFvQixRQUFRLE1BQU0sU0FBQTtBQUNsQywwQkFBb0IsUUFBUSxNQUFNLFVBQUE7QUFFbEMsVUFBSSxPQUFPLFVBQVUsS0FBSyxPQUFPO0FBQzdCLGVBQU8sUUFBUSxLQUFLO01BQUE7QUFHeEIsVUFBSSxDQUFDLEtBQUssYUFBYSxPQUFBLEdBQVU7QUFDN0IsZUFBTyxnQkFBZ0IsT0FBQTtNQUFBO0lBQUE7SUFJL0IsVUFBVSxTQUFTLFFBQVEsTUFBTTtBQUM3QixVQUFJLFdBQVcsS0FBSztBQUNwQixVQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzNCLGVBQU8sUUFBUTtNQUFBO0FBR25CLFVBQUksYUFBYSxPQUFPO0FBQ3hCLFVBQUksWUFBWTtBQUdaLFlBQUksV0FBVyxXQUFXO0FBRTFCLFlBQUksWUFBWSxZQUFhLENBQUMsWUFBWSxZQUFZLE9BQU8sYUFBYztBQUN2RTtRQUFBO0FBR0osbUJBQVcsWUFBWTtNQUFBO0lBQUE7SUFHL0IsUUFBUSxTQUFTLFFBQVEsTUFBTTtBQUMzQixVQUFJLENBQUMsS0FBSyxhQUFhLFVBQUEsR0FBYTtBQUNoQyxZQUFJLGdCQUFnQjtBQUNwQixZQUFJLElBQUk7QUFLUixZQUFJLFdBQVcsT0FBTztBQUN0QixZQUFJO0FBQ0osWUFBSTtBQUNKLGVBQU0sVUFBVTtBQUNaLHFCQUFXLFNBQVMsWUFBWSxTQUFTLFNBQVMsWUFBQTtBQUNsRCxjQUFJLGFBQWEsWUFBWTtBQUN6Qix1QkFBVztBQUNYLHVCQUFXLFNBQVM7VUFBQSxPQUNqQjtBQUNILGdCQUFJLGFBQWEsVUFBVTtBQUN2QixrQkFBSSxTQUFTLGFBQWEsVUFBQSxHQUFhO0FBQ25DLGdDQUFnQjtBQUNoQjtjQUFBO0FBRUo7WUFBQTtBQUVKLHVCQUFXLFNBQVM7QUFDcEIsZ0JBQUksQ0FBQyxZQUFZLFVBQVU7QUFDdkIseUJBQVcsU0FBUztBQUNwQix5QkFBVztZQUFBO1VBQUE7UUFBQTtBQUt2QixlQUFPLGdCQUFnQjtNQUFBO0lBQUE7RUFBQTtBQUtuQyxNQUFJLGVBQWU7QUFDbkIsTUFBSSwyQkFBMkI7QUFDL0IsTUFBSSxZQUFZO0FBQ2hCLE1BQUksZUFBZTtBQUVuQixXQUFBSSxRQUFnQjtFQUFBO0FBRWhCLFdBQUEsa0JBQTJCLE1BQU07QUFDL0IsUUFBSSxNQUFNO0FBQ04sYUFBUSxLQUFLLGdCQUFnQixLQUFLLGFBQWEsSUFBQSxLQUFVLEtBQUs7SUFBQTtFQUFBO0FBSXBFLFdBQUEsZ0JBQXlCLGFBQVk7QUFFakMsV0FBTyxTQUFBLFVBQWtCLFVBQVUsUUFBUSxTQUFTO0FBQ2hELFVBQUksQ0FBQyxTQUFTO0FBQ1Ysa0JBQVUsQ0FBQTtNQUFBO0FBR2QsVUFBSSxPQUFPLFdBQVcsVUFBVTtBQUM1QixZQUFJLFNBQVMsYUFBYSxlQUFlLFNBQVMsYUFBYSxVQUFVLFNBQVMsYUFBYSxRQUFRO0FBQ25HLGNBQUksYUFBYTtBQUNqQixtQkFBUyxJQUFJLGNBQWMsTUFBQTtBQUMzQixpQkFBTyxZQUFZO1FBQUEsT0FDaEI7QUFDSCxtQkFBUyxVQUFVLE1BQUE7UUFBQTtNQUFBO0FBSTNCLFVBQUksYUFBYSxRQUFRLGNBQWM7QUFDdkMsVUFBSSxvQkFBb0IsUUFBUSxxQkFBcUJBO0FBQ3JELFVBQUksY0FBYyxRQUFRLGVBQWVBO0FBQ3pDLFVBQUksb0JBQW9CLFFBQVEscUJBQXFCQTtBQUNyRCxVQUFJLGNBQWMsUUFBUSxlQUFlQTtBQUN6QyxVQUFJLHdCQUF3QixRQUFRLHlCQUF5QkE7QUFDN0QsVUFBSSxrQkFBa0IsUUFBUSxtQkFBbUJBO0FBQ2pELFVBQUksNEJBQTRCLFFBQVEsNkJBQTZCQTtBQUNyRSxVQUFJLGVBQWUsUUFBUSxpQkFBaUI7QUFHNUMsVUFBSSxrQkFBa0IsdUJBQU8sT0FBTyxJQUFBO0FBQ3BDLFVBQUksbUJBQW1CLENBQUE7QUFFdkIsZUFBQSxnQkFBeUIsS0FBSztBQUMxQix5QkFBaUIsS0FBSyxHQUFBO01BQUE7QUFHMUIsZUFBQSx3QkFBaUMsTUFBTSxnQkFBZ0I7QUFDbkQsWUFBSSxLQUFLLGFBQWEsY0FBYztBQUNoQyxjQUFJLFdBQVcsS0FBSztBQUNwQixpQkFBTyxVQUFVO0FBRWIsZ0JBQUksTUFBTTtBQUVWLGdCQUFJLG1CQUFtQixNQUFNLFdBQVcsUUFBQSxJQUFZO0FBR2hELDhCQUFnQixHQUFBO1lBQUEsT0FDYjtBQUlILDhCQUFnQixRQUFBO0FBQ2hCLGtCQUFJLFNBQVMsWUFBWTtBQUNyQix3Q0FBd0IsVUFBVSxjQUFBO2NBQUE7WUFBQTtBQUkxQyx1QkFBVyxTQUFTO1VBQUE7UUFBQTtNQUFBO0FBYWhDLGVBQUEsV0FBb0IsTUFBTSxZQUFZLGdCQUFnQjtBQUNsRCxZQUFJLHNCQUFzQixJQUFBLE1BQVUsT0FBTztBQUN2QztRQUFBO0FBR0osWUFBSSxZQUFZO0FBQ1oscUJBQVcsWUFBWSxJQUFBO1FBQUE7QUFHM0Isd0JBQWdCLElBQUE7QUFDaEIsZ0NBQXdCLE1BQU0sY0FBQTtNQUFBO0FBK0JsQyxlQUFBLFVBQW1CLE1BQU07QUFDckIsWUFBSSxLQUFLLGFBQWEsZ0JBQWdCLEtBQUssYUFBYSwwQkFBMEI7QUFDOUUsY0FBSSxXQUFXLEtBQUs7QUFDcEIsaUJBQU8sVUFBVTtBQUNiLGdCQUFJLE1BQU0sV0FBVyxRQUFBO0FBQ3JCLGdCQUFJLEtBQUs7QUFDTCw4QkFBZ0IsR0FBQSxJQUFPO1lBQUE7QUFJM0Isc0JBQVUsUUFBQTtBQUVWLHVCQUFXLFNBQVM7VUFBQTtRQUFBO01BQUE7QUFLaEMsZ0JBQVUsUUFBQTtBQUVWLGVBQUEsZ0JBQXlCLElBQUk7QUFDekIsb0JBQVksRUFBQTtBQUVaLFlBQUksV0FBVyxHQUFHO0FBQ2xCLGVBQU8sVUFBVTtBQUNiLGNBQUksY0FBYyxTQUFTO0FBRTNCLGNBQUksTUFBTSxXQUFXLFFBQUE7QUFDckIsY0FBSSxLQUFLO0FBQ0wsZ0JBQUksa0JBQWtCLGdCQUFnQixHQUFBO0FBR3RDLGdCQUFJLG1CQUFtQixpQkFBaUIsVUFBVSxlQUFBLEdBQWtCO0FBQ2hFLHVCQUFTLFdBQVcsYUFBYSxpQkFBaUIsUUFBQTtBQUNsRCxzQkFBUSxpQkFBaUIsUUFBQTtZQUFBLE9BQ3RCO0FBQ0wsOEJBQWdCLFFBQUE7WUFBQTtVQUFBLE9BRWY7QUFHTCw0QkFBZ0IsUUFBQTtVQUFBO0FBR2xCLHFCQUFXO1FBQUE7TUFBQTtBQUluQixlQUFBLGNBQXVCLFFBQVEsa0JBQWtCLGdCQUFnQjtBQUk3RCxlQUFPLGtCQUFrQjtBQUNyQixjQUFJLGtCQUFrQixpQkFBaUI7QUFDdkMsY0FBSyxpQkFBaUIsV0FBVyxnQkFBQSxHQUFvQjtBQUdqRCw0QkFBZ0IsY0FBQTtVQUFBLE9BQ2I7QUFHSCx1QkFBVyxrQkFBa0IsUUFBUSxJQUFBO1VBQUE7QUFFekMsNkJBQW1CO1FBQUE7TUFBQTtBQUkzQixlQUFBLFFBQWlCLFFBQVEsTUFBTSxlQUFjO0FBQ3pDLFlBQUksVUFBVSxXQUFXLElBQUE7QUFFekIsWUFBSSxTQUFTO0FBR1QsaUJBQU8sZ0JBQWdCLE9BQUE7UUFBQTtBQUczQixZQUFJLENBQUMsZUFBYztBQUVmLGNBQUksa0JBQWtCLFFBQVEsSUFBQSxNQUFVLE9BQU87QUFDM0M7VUFBQTtBQUlKLHNCQUFXLFFBQVEsSUFBQTtBQUVuQixzQkFBWSxNQUFBO0FBRVosY0FBSSwwQkFBMEIsUUFBUSxJQUFBLE1BQVUsT0FBTztBQUNuRDtVQUFBO1FBQUE7QUFJUixZQUFJLE9BQU8sYUFBYSxZQUFZO0FBQ2xDLHdCQUFjLFFBQVEsSUFBQTtRQUFBLE9BQ2pCO0FBQ0wsNEJBQWtCLFNBQVMsUUFBUSxJQUFBO1FBQUE7TUFBQTtBQUl6QyxlQUFBLGNBQXVCLFFBQVEsTUFBTTtBQUNqQyxZQUFJLGlCQUFpQixLQUFLO0FBQzFCLFlBQUksbUJBQW1CLE9BQU87QUFDOUIsWUFBSTtBQUNKLFlBQUk7QUFFSixZQUFJO0FBQ0osWUFBSTtBQUNKLFlBQUk7QUFHSjtBQUFPLGlCQUFPLGdCQUFnQjtBQUMxQiw0QkFBZ0IsZUFBZTtBQUMvQiwyQkFBZSxXQUFXLGNBQUE7QUFHMUIsbUJBQU8sa0JBQWtCO0FBQ3JCLGdDQUFrQixpQkFBaUI7QUFFbkMsa0JBQUksZUFBZSxjQUFjLGVBQWUsV0FBVyxnQkFBQSxHQUFtQjtBQUMxRSxpQ0FBaUI7QUFDakIsbUNBQW1CO0FBQ25CLHlCQUFBO2NBQUE7QUFHSiwrQkFBaUIsV0FBVyxnQkFBQTtBQUU1QixrQkFBSSxrQkFBa0IsaUJBQWlCO0FBR3ZDLGtCQUFJLGVBQWU7QUFFbkIsa0JBQUksb0JBQW9CLGVBQWUsVUFBVTtBQUM3QyxvQkFBSSxvQkFBb0IsY0FBYztBQUdsQyxzQkFBSSxjQUFjO0FBR2Qsd0JBQUksaUJBQWlCLGdCQUFnQjtBQUlqQywwQkFBSyxpQkFBaUIsZ0JBQWdCLFlBQUEsR0FBZ0I7QUFDbEQsNEJBQUksb0JBQW9CLGdCQUFnQjtBQU1wQyx5Q0FBZTt3QkFBQSxPQUNaO0FBUUgsaUNBQU8sYUFBYSxnQkFBZ0IsZ0JBQUE7QUFJcEMsOEJBQUksZ0JBQWdCO0FBR2hCLDRDQUFnQixjQUFBOzBCQUFBLE9BQ2I7QUFHSCx1Q0FBVyxrQkFBa0IsUUFBUSxJQUFBOzBCQUFBO0FBR3pDLDZDQUFtQjt3QkFBQTtzQkFBQSxPQUVwQjtBQUdILHVDQUFlO3NCQUFBO29CQUFBO2tCQUFBLFdBR2hCLGdCQUFnQjtBQUV2QixtQ0FBZTtrQkFBQTtBQUduQixpQ0FBZSxpQkFBaUIsU0FBUyxpQkFBaUIsa0JBQWtCLGNBQUE7QUFDNUUsc0JBQUksY0FBYztBQUtkLDRCQUFRLGtCQUFrQixjQUFBO2tCQUFBO2dCQUFBLFdBR3ZCLG9CQUFvQixhQUFhLG1CQUFtQixjQUFjO0FBRXpFLGlDQUFlO0FBR2Ysc0JBQUksaUJBQWlCLGNBQWMsZUFBZSxXQUFXO0FBQ3pELHFDQUFpQixZQUFZLGVBQWU7a0JBQUE7Z0JBQUE7Y0FBQTtBQU14RCxrQkFBSSxjQUFjO0FBR2QsaUNBQWlCO0FBQ2pCLG1DQUFtQjtBQUNuQix5QkFBQTtjQUFBO0FBU0osa0JBQUksZ0JBQWdCO0FBR2hCLGdDQUFnQixjQUFBO2NBQUEsT0FDYjtBQUdILDJCQUFXLGtCQUFrQixRQUFRLElBQUE7Y0FBQTtBQUd6QyxpQ0FBbUI7WUFBQTtBQU92QixnQkFBSSxpQkFBaUIsaUJBQWlCLGdCQUFnQixZQUFBLE1BQWtCLGlCQUFpQixnQkFBZ0IsY0FBQSxHQUFpQjtBQUN0SCxxQkFBTyxZQUFZLGNBQUE7QUFFbkIsc0JBQVEsZ0JBQWdCLGNBQUE7WUFBQSxPQUNyQjtBQUNILGtCQUFJLDBCQUEwQixrQkFBa0IsY0FBQTtBQUNoRCxrQkFBSSw0QkFBNEIsT0FBTztBQUNuQyxvQkFBSSx5QkFBeUI7QUFDekIsbUNBQWlCO2dCQUFBO0FBR3JCLG9CQUFJLGVBQWUsV0FBVztBQUMxQixtQ0FBaUIsZUFBZSxVQUFVLE9BQU8saUJBQWlCLEdBQUE7Z0JBQUE7QUFFdEUsdUJBQU8sWUFBWSxjQUFBO0FBQ25CLGdDQUFnQixjQUFBO2NBQUE7WUFBQTtBQUl4Qiw2QkFBaUI7QUFDakIsK0JBQW1CO1VBQUE7QUFHdkIsc0JBQWMsUUFBUSxrQkFBa0IsY0FBQTtBQUV4QyxZQUFJLG1CQUFtQixrQkFBa0IsT0FBTyxRQUFBO0FBQ2hELFlBQUksa0JBQWtCO0FBQ2xCLDJCQUFpQixRQUFRLElBQUE7UUFBQTtNQUFBO0FBSWpDLFVBQUksY0FBYztBQUNsQixVQUFJLGtCQUFrQixZQUFZO0FBQ2xDLFVBQUksYUFBYSxPQUFPO0FBRXhCLFVBQUksQ0FBQyxjQUFjO0FBR2YsWUFBSSxvQkFBb0IsY0FBYztBQUNsQyxjQUFJLGVBQWUsY0FBYztBQUM3QixnQkFBSSxDQUFDLGlCQUFpQixVQUFVLE1BQUEsR0FBUztBQUNyQyw4QkFBZ0IsUUFBQTtBQUNoQiw0QkFBYyxhQUFhLFVBQVUsZ0JBQWdCLE9BQU8sVUFBVSxPQUFPLFlBQUEsQ0FBQTtZQUFBO1VBQUEsT0FFOUU7QUFFSCwwQkFBYztVQUFBO1FBQUEsV0FFWCxvQkFBb0IsYUFBYSxvQkFBb0IsY0FBYztBQUMxRSxjQUFJLGVBQWUsaUJBQWlCO0FBQ2hDLGdCQUFJLFlBQVksY0FBYyxPQUFPLFdBQVc7QUFDNUMsMEJBQVksWUFBWSxPQUFPO1lBQUE7QUFHbkMsbUJBQU87VUFBQSxPQUNKO0FBRUgsMEJBQWM7VUFBQTtRQUFBO01BQUE7QUFLMUIsVUFBSSxnQkFBZ0IsUUFBUTtBQUd4Qix3QkFBZ0IsUUFBQTtNQUFBLE9BQ2I7QUFDSCxZQUFJLE9BQU8sY0FBYyxPQUFPLFdBQVcsV0FBQSxHQUFjO0FBQ3JEO1FBQUE7QUFHSixnQkFBUSxhQUFhLFFBQVEsWUFBQTtBQU83QixZQUFJLGtCQUFrQjtBQUNsQixtQkFBUyxJQUFFLEdBQUcsTUFBSSxpQkFBaUIsUUFBUSxJQUFFLEtBQUssS0FBSztBQUNuRCxnQkFBSSxhQUFhLGdCQUFnQixpQkFBaUIsQ0FBQSxDQUFBO0FBQ2xELGdCQUFJLFlBQVk7QUFDWix5QkFBVyxZQUFZLFdBQVcsWUFBWSxLQUFBO1lBQUE7VUFBQTtRQUFBO01BQUE7QUFNOUQsVUFBSSxDQUFDLGdCQUFnQixnQkFBZ0IsWUFBWSxTQUFTLFlBQVk7QUFDbEUsWUFBSSxZQUFZLFdBQVc7QUFDdkIsd0JBQWMsWUFBWSxVQUFVLFNBQVMsaUJBQWlCLEdBQUE7UUFBQTtBQU9sRSxpQkFBUyxXQUFXLGFBQWEsYUFBYSxRQUFBO01BQUE7QUFHbEQsYUFBTztJQUFBO0VBQUE7QUFJZixNQUFJLFdBQVcsZ0JBQWdCLFVBQUE7QUFFL0IsTUFBTyx1QkFBUTtBQzV0QmYsTUFBQSxXQUFBLE1BQThCO0lBQUEsT0FDckIsUUFBUSxRQUFRLE1BQU0sZUFBYztBQUN6QywyQkFBUyxRQUFRLE1BQU07UUFDckIsY0FBYztRQUNkLG1CQUFtQixDQUFDLFNBQVEsVUFBUztBQUNuQyxjQUFHLGlCQUFpQixjQUFjLFdBQVcsT0FBQSxLQUFXLFlBQUksWUFBWSxPQUFBLEdBQVE7QUFDOUUsd0JBQUksa0JBQWtCLFNBQVEsS0FBQTtBQUM5QixtQkFBTztVQUFBO1FBQUE7TUFBQSxDQUFBO0lBQUE7SUFNZixZQUFZLE1BQU0sV0FBVyxJQUFJLE1BQU0sV0FBVTtBQUMvQyxXQUFLLE9BQU87QUFDWixXQUFLLGFBQWEsS0FBSztBQUN2QixXQUFLLFlBQVk7QUFDakIsV0FBSyxLQUFLO0FBQ1YsV0FBSyxTQUFTLEtBQUssS0FBSztBQUN4QixXQUFLLE9BQU87QUFDWixXQUFLLFlBQVk7QUFDakIsV0FBSyxXQUFXLE1BQU0sS0FBSyxTQUFBO0FBQzNCLFdBQUssWUFBWTtRQUNmLGFBQWEsQ0FBQTtRQUFJLGVBQWUsQ0FBQTtRQUFJLHFCQUFxQixDQUFBO1FBQ3pELFlBQVksQ0FBQTtRQUFJLGNBQWMsQ0FBQTtRQUFJLGdCQUFnQixDQUFBO1FBQUksb0JBQW9CLENBQUE7UUFDMUUsMkJBQTJCLENBQUE7TUFBQTtJQUFBO0lBSS9CLE9BQU8sTUFBTSxVQUFTO0FBQUUsV0FBSyxVQUFVLFNBQVMsSUFBQSxFQUFBLEVBQVEsS0FBSyxRQUFBO0lBQUE7SUFDN0QsTUFBTSxNQUFNLFVBQVM7QUFBRSxXQUFLLFVBQVUsUUFBUSxJQUFBLEVBQUEsRUFBUSxLQUFLLFFBQUE7SUFBQTtJQUUzRCxZQUFZLFNBQVMsTUFBSztBQUN4QixXQUFLLFVBQVUsU0FBUyxJQUFBLEVBQUEsRUFBUSxRQUFRLENBQUEsYUFBWSxTQUFTLEdBQUcsSUFBQSxDQUFBO0lBQUE7SUFHbEUsV0FBVyxTQUFTLE1BQUs7QUFDdkIsV0FBSyxVQUFVLFFBQVEsSUFBQSxFQUFBLEVBQVEsUUFBUSxDQUFBLGFBQVksU0FBUyxHQUFHLElBQUEsQ0FBQTtJQUFBO0lBR2pFLGdDQUErQjtBQUM3QixrQkFBSSxJQUFJLEtBQUssV0FBVyxxREFBcUQsQ0FBQSxPQUFNO0FBQ2pGLFdBQUcsYUFBYSxXQUFXLEVBQUE7TUFBQSxDQUFBO0lBQUE7SUFJL0IsVUFBUztBQUNQLFVBQUksRUFBQyxNQUFNLFlBQUFKLGFBQVksV0FBVyxLQUFBLElBQVE7QUFDMUMsVUFBSSxrQkFBa0IsS0FBSyxXQUFBLElBQWUsS0FBSyxtQkFBbUIsSUFBQSxJQUFRO0FBQzFFLFVBQUcsS0FBSyxXQUFBLEtBQWdCLENBQUMsaUJBQWdCO0FBQUU7TUFBQTtBQUUzQyxVQUFJLFVBQVVBLFlBQVcsaUJBQUE7QUFDekIsVUFBSSxFQUFDLGdCQUFnQixhQUFBLElBQWdCLFdBQVcsWUFBSSxrQkFBa0IsT0FBQSxJQUFXLFVBQVUsQ0FBQTtBQUMzRixVQUFJLFlBQVlBLFlBQVcsUUFBUSxVQUFBO0FBQ25DLFVBQUksaUJBQWlCQSxZQUFXLFFBQVEsZ0JBQUE7QUFDeEMsVUFBSSxjQUFjQSxZQUFXLFFBQVEsZ0JBQUE7QUFDckMsVUFBSSxxQkFBcUJBLFlBQVcsUUFBUSxrQkFBQTtBQUM1QyxVQUFJLFlBQVlBLFlBQVcsUUFBUSxRQUFBO0FBQ25DLFVBQUksUUFBUSxDQUFBO0FBQ1osVUFBSSxVQUFVLENBQUE7QUFDZCxVQUFJLHVCQUF1QixDQUFBO0FBQzNCLFVBQUksaUJBQWlCLENBQUE7QUFDckIsVUFBSSx3QkFBd0I7QUFFNUIsVUFBSSxXQUFXQSxZQUFXLEtBQUssMkJBQTJCLE1BQU07QUFDOUQsZUFBTyxLQUFLLGNBQWMsV0FBVyxNQUFNLFdBQVcsZUFBQTtNQUFBLENBQUE7QUFHeEQsV0FBSyxZQUFZLFNBQVMsU0FBQTtBQUMxQixXQUFLLFlBQVksV0FBVyxXQUFXLFNBQUE7QUFFdkMsTUFBQUEsWUFBVyxLQUFLLFlBQVksTUFBTTtBQUNoQyw2QkFBUyxpQkFBaUIsVUFBVTtVQUNsQyxjQUFjLGdCQUFnQixhQUFhLGFBQUEsTUFBbUI7VUFDOUQsWUFBWSxDQUFDLFNBQVM7QUFDcEIsbUJBQU8sWUFBSSxlQUFlLElBQUEsSUFBUSxPQUFPLEtBQUs7VUFBQTtVQUVoRCxtQkFBbUIsQ0FBQyxPQUFPO0FBQ3pCLGlCQUFLLFlBQVksU0FBUyxFQUFBO0FBQzFCLG1CQUFPO1VBQUE7VUFFVCxhQUFhLENBQUMsT0FBTztBQUVuQixnQkFBRyxjQUFjLG9CQUFvQixHQUFHLFFBQU87QUFDN0MsaUJBQUcsU0FBUyxHQUFHO1lBQUEsV0FDUCxjQUFjLG9CQUFvQixHQUFHLFVBQVM7QUFDdEQsaUJBQUcsS0FBQTtZQUFBO0FBRUwsZ0JBQUcsWUFBSSx5QkFBeUIsSUFBSSxrQkFBQSxHQUFvQjtBQUN0RCxzQ0FBd0I7WUFBQTtBQUcxQix3QkFBSSxhQUFhLGlCQUFpQixJQUFJLGNBQUE7QUFFdEMsZ0JBQUksWUFBSSxXQUFXLEVBQUEsS0FBTyxLQUFLLFlBQVksRUFBQSxLQUFRLFlBQUksWUFBWSxFQUFBLEtBQU8sS0FBSyxZQUFZLEdBQUcsVUFBQSxHQUFZO0FBQ3hHLG1CQUFLLFdBQVcsaUJBQWlCLEVBQUE7WUFBQTtBQUVuQyxrQkFBTSxLQUFLLEVBQUE7VUFBQTtVQUViLGlCQUFpQixDQUFDLE9BQU87QUFFdkIsZ0JBQUcsWUFBSSxXQUFXLEVBQUEsS0FBTyxZQUFJLFlBQVksRUFBQSxHQUFJO0FBQUUsY0FBQUEsWUFBVyxnQkFBZ0IsRUFBQTtZQUFBO0FBQzFFLGlCQUFLLFdBQVcsYUFBYSxFQUFBO1VBQUE7VUFFL0IsdUJBQXVCLENBQUMsT0FBTztBQUM3QixnQkFBRyxHQUFHLGdCQUFnQixHQUFHLGFBQWEsU0FBQSxNQUFlLE1BQUs7QUFBRSxxQkFBTztZQUFBO0FBQ25FLGdCQUFHLEdBQUcsZUFBZSxRQUFRLFlBQUksWUFBWSxHQUFHLFlBQVksV0FBVyxDQUFDLFVBQVUsU0FBQSxDQUFBLEtBQWUsR0FBRyxJQUFHO0FBQUUscUJBQU87WUFBQTtBQUNoSCxnQkFBRyxHQUFHLGdCQUFnQixHQUFHLGFBQWEsU0FBQSxHQUFXO0FBQy9DLDZCQUFlLEtBQUssRUFBQTtBQUNwQixxQkFBTztZQUFBO0FBRVQsZ0JBQUcsS0FBSyxlQUFlLEVBQUEsR0FBSTtBQUFFLHFCQUFPO1lBQUE7QUFDcEMsbUJBQU87VUFBQTtVQUVULGFBQWEsQ0FBQyxPQUFPO0FBQ25CLGdCQUFHLFlBQUkseUJBQXlCLElBQUksa0JBQUEsR0FBb0I7QUFDdEQsc0NBQXdCO1lBQUE7QUFFMUIsb0JBQVEsS0FBSyxFQUFBO1VBQUE7VUFFZixtQkFBbUIsQ0FBQyxRQUFRLFNBQVM7QUFDbkMsd0JBQUksZ0JBQWdCLE1BQU0sU0FBQTtBQUMxQixnQkFBRyxLQUFLLGVBQWUsSUFBQSxHQUFNO0FBQUUscUJBQU87WUFBQTtBQUN0QyxnQkFBRyxZQUFJLFlBQVksTUFBQSxHQUFRO0FBQUUscUJBQU87WUFBQTtBQUNwQyxnQkFBRyxZQUFJLFVBQVUsUUFBUSxTQUFBLEdBQVc7QUFDbEMsbUJBQUssWUFBWSxXQUFXLFFBQVEsSUFBQTtBQUNwQywwQkFBSSxXQUFXLFFBQVEsTUFBTSxFQUFDLFdBQVcsS0FBQSxDQUFBO0FBQ3pDLHNCQUFRLEtBQUssTUFBQTtBQUNiLDBCQUFJLHNCQUFzQixNQUFBO0FBQzFCLHFCQUFPO1lBQUE7QUFFVCxnQkFBRyxPQUFPLFNBQVMsYUFBYSxPQUFPLFlBQVksT0FBTyxTQUFTLFdBQVU7QUFBRSxxQkFBTztZQUFBO0FBQ3RGLGdCQUFHLENBQUMsWUFBSSxlQUFlLFFBQVEsTUFBTSxXQUFBLEdBQWE7QUFDaEQsa0JBQUcsWUFBSSxjQUFjLE1BQUEsR0FBUTtBQUMzQixxQkFBSyxZQUFZLFdBQVcsUUFBUSxJQUFBO0FBQ3BDLHdCQUFRLEtBQUssTUFBQTtjQUFBO0FBRWYsMEJBQUksc0JBQXNCLE1BQUE7QUFDMUIscUJBQU87WUFBQTtBQUlULGdCQUFHLFlBQUksV0FBVyxJQUFBLEdBQU07QUFDdEIsa0JBQUksY0FBYyxPQUFPLGFBQWEsV0FBQTtBQUN0QywwQkFBSSxXQUFXLFFBQVEsTUFBTSxFQUFDLFNBQVMsQ0FBQyxVQUFBLEVBQUEsQ0FBQTtBQUN4QyxrQkFBRyxnQkFBZ0IsSUFBRztBQUFFLHVCQUFPLGFBQWEsYUFBYSxXQUFBO2NBQUE7QUFDekQscUJBQU8sYUFBYSxhQUFhLEtBQUssTUFBQTtBQUN0QywwQkFBSSxzQkFBc0IsTUFBQTtBQUMxQixxQkFBTztZQUFBO0FBSVQsd0JBQUksYUFBYSxNQUFNLE1BQUE7QUFDdkIsd0JBQUksYUFBYSxpQkFBaUIsTUFBTSxjQUFBO0FBRXhDLGdCQUFJLGtCQUFrQixXQUFXLE9BQU8sV0FBVyxPQUFBLEtBQVksWUFBSSxZQUFZLE1BQUE7QUFDL0UsZ0JBQUcsaUJBQWdCO0FBQ2pCLG1CQUFLLFlBQVksV0FBVyxRQUFRLElBQUE7QUFDcEMsMEJBQUksa0JBQWtCLFFBQVEsSUFBQTtBQUM5QiwwQkFBSSxpQkFBaUIsTUFBQTtBQUNyQixzQkFBUSxLQUFLLE1BQUE7QUFDYiwwQkFBSSxzQkFBc0IsTUFBQTtBQUMxQixxQkFBTztZQUFBLE9BQ0Y7QUFDTCxrQkFBRyxZQUFJLFlBQVksTUFBTSxXQUFXLENBQUMsVUFBVSxTQUFBLENBQUEsR0FBWTtBQUN6RCxxQ0FBcUIsS0FBSyxJQUFJLHFCQUFxQixRQUFRLE1BQU0sS0FBSyxhQUFhLFNBQUEsQ0FBQSxDQUFBO2NBQUE7QUFFckYsMEJBQUksaUJBQWlCLElBQUE7QUFDckIsMEJBQUksc0JBQXNCLElBQUE7QUFDMUIsbUJBQUssWUFBWSxXQUFXLFFBQVEsSUFBQTtBQUNwQyxxQkFBTztZQUFBO1VBQUE7UUFBQSxDQUFBO01BQUEsQ0FBQTtBQU1mLFVBQUdBLFlBQVcsZUFBQSxHQUFpQjtBQUFFLDJCQUFBO01BQUE7QUFFakMsVUFBRyxxQkFBcUIsU0FBUyxHQUFFO0FBQ2pDLFFBQUFBLFlBQVcsS0FBSyx5Q0FBeUMsTUFBTTtBQUM3RCwrQkFBcUIsUUFBUSxDQUFBLFdBQVUsT0FBTyxRQUFBLENBQUE7UUFBQSxDQUFBO01BQUE7QUFJbEQsTUFBQUEsWUFBVyxjQUFjLE1BQU0sWUFBSSxhQUFhLFNBQVMsZ0JBQWdCLFlBQUEsQ0FBQTtBQUN6RSxrQkFBSSxjQUFjLFVBQVUsWUFBQTtBQUM1QixZQUFNLFFBQVEsQ0FBQSxPQUFNLEtBQUssV0FBVyxTQUFTLEVBQUEsQ0FBQTtBQUM3QyxjQUFRLFFBQVEsQ0FBQSxPQUFNLEtBQUssV0FBVyxXQUFXLEVBQUEsQ0FBQTtBQUVqRCxVQUFHLGVBQWUsU0FBUyxHQUFFO0FBQzNCLFFBQUFBLFlBQVcsa0JBQWtCLGNBQUE7QUFDN0IsUUFBQUEsWUFBVyxpQkFBaUIsTUFBTTtBQUNoQyx5QkFBZSxRQUFRLENBQUEsT0FBTTtBQUMzQixnQkFBSSxRQUFRLFlBQUksY0FBYyxFQUFBO0FBQzlCLGdCQUFHLE9BQU07QUFBRSxjQUFBQSxZQUFXLGdCQUFnQixLQUFBO1lBQUE7QUFDdEMsZUFBRyxPQUFBO1VBQUEsQ0FBQTtBQUVMLGVBQUssV0FBVyx3QkFBd0IsY0FBQTtRQUFBLENBQUE7TUFBQTtBQUk1QyxVQUFHLHVCQUFzQjtBQUN2QixRQUFBQSxZQUFXLFdBQUE7QUFDWCw4QkFBc0IsT0FBQTtNQUFBO0FBRXhCLGFBQU87SUFBQTtJQUdULGFBQVk7QUFBRSxhQUFPLEtBQUs7SUFBQTtJQUUxQixlQUFlLElBQUc7QUFDaEIsYUFBTyxHQUFHLGFBQWEsS0FBSyxnQkFBZ0IsR0FBRyxhQUFhLFFBQUEsTUFBYztJQUFBO0lBRzVFLG1CQUFtQixNQUFLO0FBQ3RCLFVBQUcsQ0FBQyxLQUFLLFdBQUEsR0FBYTtBQUFFO01BQUE7QUFDeEIsVUFBSSxDQUFDLE9BQUEsR0FBVSxJQUFBLElBQVEsWUFBSSxzQkFBc0IsS0FBSyxXQUFXLEtBQUssU0FBQTtBQUN0RSxVQUFHLEtBQUssV0FBVyxLQUFLLFlBQUksZ0JBQWdCLElBQUEsTUFBVSxHQUFFO0FBQ3RELGVBQU87TUFBQSxPQUNGO0FBQ0wsZUFBTyxTQUFTLE1BQU07TUFBQTtJQUFBO0lBVTFCLGNBQWMsV0FBVyxNQUFNLFdBQVcsaUJBQWdCO0FBQ3hELFVBQUksYUFBYSxLQUFLLFdBQUE7QUFDdEIsVUFBSSxzQkFBc0IsY0FBYyxnQkFBZ0IsYUFBYSxhQUFBLE1BQW1CLEtBQUssVUFBVSxTQUFBO0FBQ3ZHLFVBQUcsQ0FBQyxjQUFjLHFCQUFvQjtBQUNwQyxlQUFPO01BQUEsT0FDRjtBQUVMLFlBQUksZ0JBQWdCO0FBQ3BCLFlBQUksV0FBVyxTQUFTLGNBQWMsVUFBQTtBQUN0Qyx3QkFBZ0IsWUFBSSxVQUFVLGVBQUE7QUFDOUIsWUFBSSxDQUFDLGdCQUFBLEdBQW1CLElBQUEsSUFBUSxZQUFJLHNCQUFzQixlQUFlLEtBQUssU0FBQTtBQUM5RSxpQkFBUyxZQUFZO0FBQ3JCLGFBQUssUUFBUSxDQUFBLE9BQU0sR0FBRyxPQUFBLENBQUE7QUFDdEIsY0FBTSxLQUFLLGNBQWMsVUFBQSxFQUFZLFFBQVEsQ0FBQSxVQUFTO0FBRXBELGNBQUcsTUFBTSxNQUFNLE1BQU0sYUFBYSxLQUFLLGdCQUFnQixNQUFNLGFBQWEsYUFBQSxNQUFtQixLQUFLLFVBQVUsU0FBQSxHQUFXO0FBQ3JILGtCQUFNLGFBQWEsVUFBVSxFQUFBO0FBQzdCLGtCQUFNLFlBQVk7VUFBQTtRQUFBLENBQUE7QUFHdEIsY0FBTSxLQUFLLFNBQVMsUUFBUSxVQUFBLEVBQVksUUFBUSxDQUFBLE9BQU0sY0FBYyxhQUFhLElBQUksY0FBQSxDQUFBO0FBQ3JGLHVCQUFlLE9BQUE7QUFDZixlQUFPLGNBQWM7TUFBQTtJQUFBO0VBQUE7QUNoUTNCLE1BQUEsV0FBQSxNQUE4QjtJQUFBLE9BQ3JCLFFBQVEsTUFBSztBQUNsQixVQUFJLEVBQUEsQ0FBRSxLQUFBLEdBQVEsT0FBQSxDQUFRLE1BQUEsR0FBUyxRQUFBLENBQVMsS0FBQSxHQUFRLE1BQUEsSUFBUztBQUN6RCxhQUFPLEtBQUssS0FBQTtBQUNaLGFBQU8sS0FBSyxNQUFBO0FBQ1osYUFBTyxLQUFLLEtBQUE7QUFDWixhQUFPLEVBQUMsTUFBTSxPQUFPLE9BQU8sU0FBUyxNQUFNLFFBQVEsVUFBVSxDQUFBLEVBQUE7SUFBQTtJQUcvRCxZQUFZLFFBQVEsVUFBUztBQUMzQixXQUFLLFNBQVM7QUFDZCxXQUFLLFdBQVcsQ0FBQTtBQUNoQixXQUFLLFVBQVUsUUFBQTtJQUFBO0lBR2pCLGVBQWM7QUFBRSxhQUFPLEtBQUs7SUFBQTtJQUU1QixTQUFTLFVBQVM7QUFDaEIsYUFBTyxLQUFLLGtCQUFrQixLQUFLLFVBQVUsS0FBSyxTQUFTLFVBQUEsR0FBYSxRQUFBO0lBQUE7SUFHMUUsa0JBQWtCLFVBQVUsYUFBYSxTQUFTLFVBQUEsR0FBYSxVQUFTO0FBQ3RFLGlCQUFXLFdBQVcsSUFBSSxJQUFJLFFBQUEsSUFBWTtBQUMxQyxVQUFJLFNBQVMsRUFBQyxRQUFRLElBQUksWUFBd0IsU0FBQTtBQUNsRCxXQUFLLGVBQWUsVUFBVSxNQUFNLE1BQUE7QUFDcEMsYUFBTyxPQUFPO0lBQUE7SUFHaEIsY0FBYyxNQUFLO0FBQUUsYUFBTyxPQUFPLEtBQUssS0FBSyxVQUFBLEtBQWUsQ0FBQSxDQUFBLEVBQUksSUFBSSxDQUFBLE1BQUssU0FBUyxDQUFBLENBQUE7SUFBQTtJQUVsRixvQkFBb0IsTUFBSztBQUN2QixVQUFHLENBQUMsS0FBSyxVQUFBLEdBQVk7QUFBRSxlQUFPO01BQUE7QUFDOUIsYUFBTyxPQUFPLEtBQUssSUFBQSxFQUFNLFdBQVc7SUFBQTtJQUd0QyxhQUFhLE1BQU0sS0FBSTtBQUFFLGFBQU8sS0FBSyxVQUFBLEVBQVksR0FBQTtJQUFBO0lBRWpELFVBQVUsTUFBSztBQUNiLFVBQUksT0FBTyxLQUFLLFVBQUE7QUFDaEIsVUFBSSxRQUFRLENBQUE7QUFDWixhQUFPLEtBQUssVUFBQTtBQUNaLFdBQUssV0FBVyxLQUFLLGFBQWEsS0FBSyxVQUFVLElBQUE7QUFDakQsV0FBSyxTQUFTLFVBQUEsSUFBYyxLQUFLLFNBQVMsVUFBQSxLQUFlLENBQUE7QUFFekQsVUFBRyxNQUFLO0FBQ04sWUFBSSxPQUFPLEtBQUssU0FBUyxVQUFBO0FBRXpCLGlCQUFRLE9BQU8sTUFBSztBQUNsQixlQUFLLEdBQUEsSUFBTyxLQUFLLG9CQUFvQixLQUFLLEtBQUssR0FBQSxHQUFNLE1BQU0sTUFBTSxLQUFBO1FBQUE7QUFHbkUsaUJBQVEsT0FBTyxNQUFLO0FBQUUsZUFBSyxHQUFBLElBQU8sS0FBSyxHQUFBO1FBQUE7QUFDdkMsYUFBSyxVQUFBLElBQWM7TUFBQTtJQUFBO0lBSXZCLG9CQUFvQixLQUFLLE9BQU8sTUFBTSxNQUFNLE9BQU07QUFDaEQsVUFBRyxNQUFNLEdBQUEsR0FBSztBQUNaLGVBQU8sTUFBTSxHQUFBO01BQUEsT0FDUjtBQUNMLFlBQUksT0FBTyxNQUFNLE9BQU8sTUFBTSxNQUFBO0FBRTlCLFlBQUcsTUFBTSxJQUFBLEdBQU07QUFDYixjQUFJO0FBRUosY0FBRyxPQUFPLEdBQUU7QUFDVixvQkFBUSxLQUFLLG9CQUFvQixNQUFNLEtBQUssSUFBQSxHQUFPLE1BQU0sTUFBTSxLQUFBO1VBQUEsT0FDMUQ7QUFDTCxvQkFBUSxLQUFLLENBQUMsSUFBQTtVQUFBO0FBR2hCLGlCQUFPLE1BQU0sTUFBQTtBQUNiLGtCQUFRLEtBQUssV0FBVyxPQUFPLEtBQUE7QUFDL0IsZ0JBQU0sTUFBQSxJQUFVO1FBQUEsT0FDWDtBQUNMLGtCQUFRLE1BQU0sTUFBQSxNQUFZLFNBQVksUUFBUSxLQUFLLFdBQVcsS0FBSyxHQUFBLEtBQVEsQ0FBQSxHQUFJLEtBQUE7UUFBQTtBQUdqRixjQUFNLEdBQUEsSUFBTztBQUNiLGVBQU87TUFBQTtJQUFBO0lBSVgsYUFBYSxRQUFRLFFBQU87QUFDMUIsVUFBRyxPQUFPLE1BQUEsTUFBWSxRQUFVO0FBQzlCLGVBQU87TUFBQSxPQUNGO0FBQ0wsYUFBSyxlQUFlLFFBQVEsTUFBQTtBQUM1QixlQUFPO01BQUE7SUFBQTtJQUlYLGVBQWUsUUFBUSxRQUFPO0FBQzVCLGVBQVEsT0FBTyxRQUFPO0FBQ3BCLFlBQUksTUFBTSxPQUFPLEdBQUE7QUFDakIsWUFBSSxZQUFZLE9BQU8sR0FBQTtBQUN2QixZQUFHLFNBQVMsR0FBQSxLQUFRLElBQUksTUFBQSxNQUFZLFVBQWEsU0FBUyxTQUFBLEdBQVc7QUFDbkUsZUFBSyxlQUFlLFdBQVcsR0FBQTtRQUFBLE9BQzFCO0FBQ0wsaUJBQU8sR0FBQSxJQUFPO1FBQUE7TUFBQTtJQUFBO0lBS3BCLFdBQVcsUUFBUSxRQUFPO0FBQ3hCLFVBQUksU0FBUyxrQ0FBSSxTQUFXO0FBQzVCLGVBQVEsT0FBTyxRQUFPO0FBQ3BCLFlBQUksTUFBTSxPQUFPLEdBQUE7QUFDakIsWUFBSSxZQUFZLE9BQU8sR0FBQTtBQUN2QixZQUFHLFNBQVMsR0FBQSxLQUFRLElBQUksTUFBQSxNQUFZLFVBQWEsU0FBUyxTQUFBLEdBQVc7QUFDbkUsaUJBQU8sR0FBQSxJQUFPLEtBQUssV0FBVyxXQUFXLEdBQUE7UUFBQTtNQUFBO0FBRzdDLGFBQU87SUFBQTtJQUdULGtCQUFrQixLQUFJO0FBQUUsYUFBTyxLQUFLLHFCQUFxQixLQUFLLFNBQVMsVUFBQSxHQUFhLEdBQUE7SUFBQTtJQUVwRixVQUFVLE1BQUs7QUFDYixXQUFLLFFBQVEsQ0FBQSxRQUFPLE9BQU8sS0FBSyxTQUFTLFVBQUEsRUFBWSxHQUFBLENBQUE7SUFBQTtJQUt2RCxNQUFLO0FBQUUsYUFBTyxLQUFLO0lBQUE7SUFFbkIsaUJBQWlCLE9BQU8sQ0FBQSxHQUFHO0FBQUUsYUFBTyxDQUFDLENBQUMsS0FBSyxNQUFBO0lBQUE7SUFFM0MsZUFBZSxNQUFNLFdBQVU7QUFDN0IsVUFBRyxPQUFRLFNBQVUsVUFBVTtBQUM3QixlQUFPLFVBQVUsSUFBQTtNQUFBLE9BQ1o7QUFDTCxlQUFPO01BQUE7SUFBQTtJQUlYLGVBQWUsVUFBVSxXQUFXLFFBQU87QUFDekMsVUFBRyxTQUFTLFFBQUEsR0FBVTtBQUFFLGVBQU8sS0FBSyxzQkFBc0IsVUFBVSxXQUFXLE1BQUE7TUFBQTtBQUMvRSxVQUFJLEVBQUEsQ0FBRSxNQUFBLEdBQVMsUUFBQSxJQUFXO0FBQzFCLGdCQUFVLEtBQUssZUFBZSxTQUFTLFNBQUE7QUFFdkMsYUFBTyxVQUFVLFFBQVEsQ0FBQTtBQUN6QixlQUFRLElBQUksR0FBRyxJQUFJLFFBQVEsUUFBUSxLQUFJO0FBQ3JDLGFBQUssZ0JBQWdCLFNBQVMsSUFBSSxDQUFBLEdBQUksV0FBVyxNQUFBO0FBQ2pELGVBQU8sVUFBVSxRQUFRLENBQUE7TUFBQTtJQUFBO0lBSTdCLHNCQUFzQixVQUFVLFdBQVcsUUFBTztBQUNoRCxVQUFJLEVBQUEsQ0FBRSxRQUFBLEdBQVcsVUFBQSxDQUFXLE1BQUEsR0FBUyxRQUFBLElBQVc7QUFDaEQsZ0JBQVUsS0FBSyxlQUFlLFNBQVMsU0FBQTtBQUN2QyxVQUFJLGdCQUFnQixhQUFhLFNBQVMsU0FBQTtBQUUxQyxlQUFRLElBQUksR0FBRyxJQUFJLFNBQVMsUUFBUSxLQUFJO0FBQ3RDLFlBQUksVUFBVSxTQUFTLENBQUE7QUFDdkIsZUFBTyxVQUFVLFFBQVEsQ0FBQTtBQUN6QixpQkFBUSxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSTtBQUNyQyxlQUFLLGdCQUFnQixRQUFRLElBQUksQ0FBQSxHQUFJLGVBQWUsTUFBQTtBQUNwRCxpQkFBTyxVQUFVLFFBQVEsQ0FBQTtRQUFBO01BQUE7SUFBQTtJQUsvQixnQkFBZ0IsVUFBVSxXQUFXLFFBQU87QUFDMUMsVUFBRyxPQUFRLGFBQWMsVUFBUztBQUNoQyxlQUFPLFVBQVUsS0FBSyxxQkFBcUIsT0FBTyxZQUFZLFVBQVUsT0FBTyxRQUFBO01BQUEsV0FDdkUsU0FBUyxRQUFBLEdBQVU7QUFDM0IsYUFBSyxlQUFlLFVBQVUsV0FBVyxNQUFBO01BQUEsT0FDcEM7QUFDTCxlQUFPLFVBQVU7TUFBQTtJQUFBO0lBSXJCLHFCQUFxQixZQUFZLEtBQUssVUFBUztBQUM3QyxVQUFJLFlBQVksV0FBVyxHQUFBLEtBQVEsU0FBUyx3QkFBd0IsR0FBQSxJQUFPLFVBQUE7QUFDM0UsVUFBSSxXQUFXLFNBQVMsY0FBYyxVQUFBO0FBQ3RDLGVBQVMsWUFBWSxLQUFLLGtCQUFrQixXQUFXLFlBQVksUUFBQTtBQUNuRSxVQUFJLFlBQVksU0FBUztBQUN6QixVQUFJLE9BQU8sWUFBWSxDQUFDLFNBQVMsSUFBSSxHQUFBO0FBRXJDLFVBQUksQ0FBQyxlQUFlLGtCQUFBLElBQ2xCLE1BQU0sS0FBSyxVQUFVLFVBQUEsRUFBWSxPQUFPLENBQUMsQ0FBQyxVQUFVLGFBQUEsR0FBZ0IsT0FBTyxNQUFNO0FBQy9FLFlBQUcsTUFBTSxhQUFhLEtBQUssY0FBYTtBQUN0QyxjQUFHLE1BQU0sYUFBYSxhQUFBLEdBQWU7QUFDbkMsbUJBQU8sQ0FBQyxVQUFVLElBQUE7VUFBQTtBQUVwQixnQkFBTSxhQUFhLGVBQWUsR0FBQTtBQUNsQyxjQUFHLENBQUMsTUFBTSxJQUFHO0FBQUUsa0JBQU0sS0FBSyxHQUFHLEtBQUssYUFBQSxDQUFBLElBQWtCLEdBQUEsSUFBTyxDQUFBO1VBQUE7QUFDM0QsY0FBRyxNQUFLO0FBQ04sa0JBQU0sYUFBYSxVQUFVLEVBQUE7QUFDN0Isa0JBQU0sWUFBWTtVQUFBO0FBRXBCLGlCQUFPLENBQUMsTUFBTSxhQUFBO1FBQUEsT0FDVDtBQUNMLGNBQUcsTUFBTSxVQUFVLEtBQUEsTUFBVyxJQUFHO0FBQy9CLHFCQUFTOztRQUNFLE1BQU0sVUFBVSxLQUFBLENBQUE7OztHQUNaLFNBQVMsVUFBVSxLQUFBLENBQUE7QUFDbEMsa0JBQU0sWUFBWSxLQUFLLFdBQVcsTUFBTSxXQUFXLEdBQUEsQ0FBQTtBQUNuRCxtQkFBTyxDQUFDLE1BQU0sYUFBQTtVQUFBLE9BQ1Q7QUFDTCxrQkFBTSxPQUFBO0FBQ04sbUJBQU8sQ0FBQyxVQUFVLGFBQUE7VUFBQTtRQUFBO01BQUEsR0FHckIsQ0FBQyxPQUFPLEtBQUEsQ0FBQTtBQUViLFVBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBbUI7QUFDdkMsaUJBQVMsNEZBQ1AsU0FBUyxVQUFVLEtBQUEsQ0FBQTtBQUNyQixlQUFPLEtBQUssV0FBVyxJQUFJLEdBQUEsRUFBSztNQUFBLFdBQ3hCLENBQUMsaUJBQWlCLG9CQUFtQjtBQUM3QyxpQkFBUyxnTEFDUCxTQUFTLFVBQVUsS0FBQSxDQUFBO0FBQ3JCLGVBQU8sU0FBUztNQUFBLE9BQ1g7QUFDTCxlQUFPLFNBQVM7TUFBQTtJQUFBO0lBSXBCLFdBQVcsTUFBTSxLQUFJO0FBQ25CLFVBQUksT0FBTyxTQUFTLGNBQWMsTUFBQTtBQUNsQyxXQUFLLFlBQVk7QUFDakIsV0FBSyxhQUFhLGVBQWUsR0FBQTtBQUNqQyxhQUFPO0lBQUE7RUFBQTtBQ2xQWCxNQUFJLGFBQWE7QUFDakIsTUFBQSxXQUFBLE1BQThCO0lBQUEsT0FDckIsU0FBUTtBQUFFLGFBQU87SUFBQTtJQUFBLE9BQ2pCLFVBQVUsSUFBRztBQUFFLGFBQU8sR0FBRztJQUFBO0lBRWhDLFlBQVksTUFBTSxJQUFJLFdBQVU7QUFDOUIsV0FBSyxTQUFTO0FBQ2QsV0FBSyxhQUFhLEtBQUs7QUFDdkIsV0FBSyxjQUFjO0FBQ25CLFdBQUssY0FBYyxvQkFBSSxJQUFBO0FBQ3ZCLFdBQUssbUJBQW1CO0FBQ3hCLFdBQUssS0FBSztBQUNWLFdBQUssR0FBRyxZQUFZLEtBQUssWUFBWSxPQUFBO0FBQ3JDLGVBQVEsT0FBTyxLQUFLLGFBQVk7QUFBRSxhQUFLLEdBQUEsSUFBTyxLQUFLLFlBQVksR0FBQTtNQUFBO0lBQUE7SUFHakUsWUFBVztBQUFFLFdBQUssV0FBVyxLQUFLLFFBQUE7SUFBQTtJQUNsQyxZQUFXO0FBQUUsV0FBSyxXQUFXLEtBQUssUUFBQTtJQUFBO0lBQ2xDLGlCQUFnQjtBQUFFLFdBQUssZ0JBQWdCLEtBQUssYUFBQTtJQUFBO0lBQzVDLGNBQWE7QUFBRSxXQUFLLGFBQWEsS0FBSyxVQUFBO0lBQUE7SUFDdEMsZ0JBQWU7QUFDYixVQUFHLEtBQUssa0JBQWlCO0FBQ3ZCLGFBQUssbUJBQW1CO0FBQ3hCLGFBQUssZUFBZSxLQUFLLFlBQUE7TUFBQTtJQUFBO0lBRzdCLGlCQUFnQjtBQUNkLFdBQUssbUJBQW1CO0FBQ3hCLFdBQUssZ0JBQWdCLEtBQUssYUFBQTtJQUFBO0lBRzVCLFVBQVUsT0FBTyxVQUFVLENBQUEsR0FBSSxVQUFVLFdBQVc7SUFBQSxHQUFJO0FBQ3RELGFBQU8sS0FBSyxPQUFPLGNBQWMsTUFBTSxPQUFPLFNBQVMsT0FBQTtJQUFBO0lBR3pELFlBQVksV0FBVyxPQUFPLFVBQVUsQ0FBQSxHQUFJLFVBQVUsV0FBVztJQUFBLEdBQUk7QUFDbkUsYUFBTyxLQUFLLE9BQU8sY0FBYyxXQUFXLENBQUMsTUFBTSxjQUFjO0FBQy9ELGVBQU8sS0FBSyxjQUFjLFdBQVcsT0FBTyxTQUFTLE9BQUE7TUFBQSxDQUFBO0lBQUE7SUFJekQsWUFBWSxPQUFPLFVBQVM7QUFDMUIsVUFBSSxjQUFjLENBQUMsYUFBYSxXQUFXLFNBQVMsUUFBUSxTQUFTLFlBQVksTUFBQTtBQUNqRixhQUFPLGlCQUFpQixPQUFPLEtBQUEsSUFBUyxXQUFBO0FBQ3hDLFdBQUssWUFBWSxJQUFJLFdBQUE7QUFDckIsYUFBTztJQUFBO0lBR1Qsa0JBQWtCLGFBQVk7QUFDNUIsVUFBSSxRQUFRLFlBQVksTUFBTSxJQUFBO0FBQzlCLGFBQU8sb0JBQW9CLE9BQU8sS0FBQSxJQUFTLFdBQUE7QUFDM0MsV0FBSyxZQUFZLE9BQU8sV0FBQTtJQUFBO0lBRzFCLE9BQU8sTUFBTSxPQUFNO0FBQ2pCLGFBQU8sS0FBSyxPQUFPLGdCQUFnQixNQUFNLEtBQUE7SUFBQTtJQUczQyxTQUFTLFdBQVcsTUFBTSxPQUFNO0FBQzlCLGFBQU8sS0FBSyxPQUFPLGNBQWMsV0FBVyxDQUFBLFNBQVEsS0FBSyxnQkFBZ0IsTUFBTSxLQUFBLENBQUE7SUFBQTtJQUdqRixjQUFhO0FBQ1gsV0FBSyxZQUFZLFFBQVEsQ0FBQSxnQkFBZSxLQUFLLGtCQUFrQixXQUFBLENBQUE7SUFBQTtFQUFBO0FDN0RuRSxNQUFJLEtBQUs7SUFDUCxLQUFLLFdBQVcsVUFBVSxNQUFNLFVBQVUsVUFBUztBQUNqRCxVQUFJLENBQUMsYUFBYSxXQUFBLElBQWUsWUFBWSxDQUFDLE1BQU0sQ0FBQSxDQUFBO0FBQ3BELFVBQUksV0FBVyxTQUFTLE9BQU8sQ0FBQSxNQUFPLE1BQ3BDLEtBQUssTUFBTSxRQUFBLElBQVksQ0FBQyxDQUFDLGFBQWEsV0FBQSxDQUFBO0FBRXhDLGVBQVMsUUFBUSxDQUFDLENBQUMsTUFBTSxJQUFBLE1BQVU7QUFDakMsWUFBRyxTQUFTLGVBQWUsWUFBWSxNQUFLO0FBQzFDLGVBQUssT0FBTyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUEsR0FBSSxZQUFZLElBQUE7UUFBQTtBQUV6RCxhQUFLLFlBQVksVUFBVSxJQUFBLEVBQU0sUUFBUSxDQUFBLE9BQU07QUFDN0MsZUFBSyxRQUFRLElBQUEsRUFBQSxFQUFRLFdBQVcsVUFBVSxNQUFNLFVBQVUsSUFBSSxJQUFBO1FBQUEsQ0FBQTtNQUFBLENBQUE7SUFBQTtJQUtwRSxVQUFVLElBQUc7QUFDWCxhQUFPLENBQUMsRUFBRSxHQUFHLGVBQWUsR0FBRyxnQkFBZ0IsR0FBRyxlQUFBLEVBQWlCLFNBQVM7SUFBQTtJQU85RSxjQUFjLFdBQVcsVUFBVSxNQUFNLFVBQVUsSUFBSSxFQUFDLElBQUksT0FBTyxRQUFRLFFBQUEsR0FBUztBQUNsRixlQUFTLFVBQVUsQ0FBQTtBQUNuQixhQUFPLGFBQWE7QUFDcEIsa0JBQUksY0FBYyxJQUFJLE9BQU8sRUFBQyxRQUFRLFFBQUEsQ0FBQTtJQUFBO0lBR3hDLFVBQVUsV0FBVyxVQUFVLE1BQU0sVUFBVSxJQUFJLE1BQUs7QUFDdEQsVUFBRyxDQUFDLEtBQUssWUFBQSxHQUFjO0FBQUU7TUFBQTtBQUV6QixVQUFJLEVBQUMsT0FBTyxNQUFNLFFBQVEsY0FBYyxTQUFTLE9BQU8sV0FBQSxJQUFjO0FBQ3RFLFVBQUksV0FBVyxFQUFDLFNBQVMsT0FBTyxRQUFRLGNBQWMsQ0FBQyxDQUFDLGFBQUE7QUFDeEQsVUFBSSxZQUFZLGNBQWMsWUFBWSxhQUFhLGFBQWE7QUFDcEUsVUFBSSxZQUFZLFVBQVUsVUFBVSxhQUFhLEtBQUssUUFBUSxRQUFBLENBQUEsS0FBYztBQUM1RSxXQUFLLGNBQWMsV0FBVyxDQUFDLFlBQVksY0FBYztBQUN2RCxZQUFHLGNBQWMsVUFBUztBQUN4QixjQUFJLEVBQUMsUUFBUSxTQUFTLFNBQUEsSUFBWTtBQUNsQyxvQkFBVSxZQUFZLG9CQUFvQixtQkFBbUIsU0FBUyxPQUFPO0FBQzdFLGNBQUcsU0FBUTtBQUFFLHFCQUFTLFVBQVU7VUFBQTtBQUNoQyxxQkFBVyxVQUFVLFVBQVUsV0FBVyxRQUFRLFNBQVMsVUFBVSxVQUFVLFFBQUE7UUFBQSxXQUN2RSxjQUFjLFVBQVM7QUFDL0IscUJBQVcsV0FBVyxVQUFVLFdBQVcsU0FBUyxVQUFVLFFBQUE7UUFBQSxPQUN6RDtBQUNMLHFCQUFXLFVBQVUsV0FBVyxVQUFVLFdBQVcsU0FBUyxVQUFVLE1BQU0sUUFBQTtRQUFBO01BQUEsQ0FBQTtJQUFBO0lBS3BGLGVBQWUsV0FBVyxVQUFVLE1BQU0sVUFBVSxJQUFJLEVBQUMsT0FBTyxZQUFZLEtBQUEsR0FBTTtBQUNoRixXQUFLLG1CQUFtQixJQUFJLE9BQU8sQ0FBQSxHQUFJLFlBQVksTUFBTSxJQUFBO0lBQUE7SUFHM0Qsa0JBQWtCLFdBQVcsVUFBVSxNQUFNLFVBQVUsSUFBSSxFQUFDLE9BQU8sWUFBWSxLQUFBLEdBQU07QUFDbkYsV0FBSyxtQkFBbUIsSUFBSSxDQUFBLEdBQUksT0FBTyxZQUFZLE1BQU0sSUFBQTtJQUFBO0lBRzNELGdCQUFnQixXQUFXLFVBQVUsTUFBTSxVQUFVLElBQUksRUFBQyxNQUFNLFdBQUEsR0FBWTtBQUMxRSxVQUFJLENBQUMsa0JBQWtCLFNBQVMsY0FBQSxJQUFrQjtBQUNsRCxVQUFJLFVBQVUsTUFBTSxLQUFLLG1CQUFtQixJQUFJLGlCQUFpQixPQUFPLE9BQUEsR0FBVSxDQUFBLENBQUE7QUFDbEYsVUFBSSxTQUFTLE1BQU0sS0FBSyxtQkFBbUIsSUFBSSxnQkFBZ0IsaUJBQWlCLE9BQU8sT0FBQSxDQUFBO0FBQ3ZGLFdBQUssV0FBVyxNQUFNLFNBQVMsTUFBQTtJQUFBO0lBR2pDLFlBQVksV0FBVyxVQUFVLE1BQU0sVUFBVSxJQUFJLEVBQUMsU0FBUyxLQUFLLE1BQU0sS0FBQSxHQUFNO0FBQzlFLFdBQUssT0FBTyxXQUFXLE1BQU0sSUFBSSxTQUFTLEtBQUssTUFBTSxJQUFBO0lBQUE7SUFHdkQsVUFBVSxXQUFXLFVBQVUsTUFBTSxVQUFVLElBQUksRUFBQyxTQUFTLFlBQVksS0FBQSxHQUFNO0FBQzdFLFdBQUssS0FBSyxXQUFXLE1BQU0sSUFBSSxTQUFTLFlBQVksSUFBQTtJQUFBO0lBR3RELFVBQVUsV0FBVyxVQUFVLE1BQU0sVUFBVSxJQUFJLEVBQUMsU0FBUyxZQUFZLEtBQUEsR0FBTTtBQUM3RSxXQUFLLEtBQUssV0FBVyxNQUFNLElBQUksU0FBUyxZQUFZLElBQUE7SUFBQTtJQUd0RCxjQUFjLFdBQVcsVUFBVSxNQUFNLFVBQVUsSUFBSSxFQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUEsRUFBQSxHQUFNO0FBQ3pFLFdBQUssaUJBQWlCLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBQSxDQUFBLEdBQU8sQ0FBQSxDQUFBO0lBQUE7SUFHM0MsaUJBQWlCLFdBQVcsVUFBVSxNQUFNLFVBQVUsSUFBSSxFQUFDLEtBQUEsR0FBTTtBQUMvRCxXQUFLLGlCQUFpQixJQUFJLENBQUEsR0FBSSxDQUFDLElBQUEsQ0FBQTtJQUFBO0lBS2pDLEtBQUssV0FBVyxNQUFNLElBQUksU0FBUyxZQUFZLE1BQUs7QUFDbEQsVUFBRyxDQUFDLEtBQUssVUFBVSxFQUFBLEdBQUk7QUFDckIsYUFBSyxPQUFPLFdBQVcsTUFBTSxJQUFJLFNBQVMsWUFBWSxNQUFNLElBQUE7TUFBQTtJQUFBO0lBSWhFLEtBQUssV0FBVyxNQUFNLElBQUksU0FBUyxZQUFZLE1BQUs7QUFDbEQsVUFBRyxLQUFLLFVBQVUsRUFBQSxHQUFJO0FBQ3BCLGFBQUssT0FBTyxXQUFXLE1BQU0sSUFBSSxTQUFTLE1BQU0sWUFBWSxJQUFBO01BQUE7SUFBQTtJQUloRSxPQUFPLFdBQVcsTUFBTSxJQUFJLFNBQVMsS0FBSyxNQUFNLE1BQUs7QUFDbkQsVUFBSSxDQUFDLFdBQVcsZ0JBQWdCLFlBQUEsSUFBZ0IsT0FBTyxDQUFDLENBQUEsR0FBSSxDQUFBLEdBQUksQ0FBQSxDQUFBO0FBQ2hFLFVBQUksQ0FBQyxZQUFZLGlCQUFpQixhQUFBLElBQWlCLFFBQVEsQ0FBQyxDQUFBLEdBQUksQ0FBQSxHQUFJLENBQUEsQ0FBQTtBQUNwRSxVQUFHLFVBQVUsU0FBUyxLQUFLLFdBQVcsU0FBUyxHQUFFO0FBQy9DLFlBQUcsS0FBSyxVQUFVLEVBQUEsR0FBSTtBQUNwQixjQUFJLFVBQVUsTUFBTTtBQUNsQixpQkFBSyxtQkFBbUIsSUFBSSxpQkFBaUIsVUFBVSxPQUFPLGNBQUEsRUFBZ0IsT0FBTyxZQUFBLENBQUE7QUFDckYsbUJBQU8sc0JBQXNCLE1BQU07QUFDakMsbUJBQUssbUJBQW1CLElBQUksWUFBWSxDQUFBLENBQUE7QUFDeEMscUJBQU8sc0JBQXNCLE1BQU0sS0FBSyxtQkFBbUIsSUFBSSxlQUFlLGVBQUEsQ0FBQTtZQUFBLENBQUE7VUFBQTtBQUdsRixhQUFHLGNBQWMsSUFBSSxNQUFNLGdCQUFBLENBQUE7QUFDM0IsZUFBSyxXQUFXLE1BQU0sU0FBUyxNQUFNO0FBQ25DLGlCQUFLLG1CQUFtQixJQUFJLENBQUEsR0FBSSxXQUFXLE9BQU8sYUFBQSxDQUFBO0FBQ2xELHdCQUFJLFVBQVUsSUFBSSxVQUFVLENBQUEsY0FBYSxVQUFVLE1BQU0sVUFBVSxNQUFBO0FBQ25FLGVBQUcsY0FBYyxJQUFJLE1BQU0sY0FBQSxDQUFBO1VBQUEsQ0FBQTtRQUFBLE9BRXhCO0FBQ0wsY0FBRyxjQUFjLFVBQVM7QUFBRTtVQUFBO0FBQzVCLGNBQUksVUFBVSxNQUFNO0FBQ2xCLGlCQUFLLG1CQUFtQixJQUFJLGdCQUFnQixXQUFXLE9BQU8sZUFBQSxFQUFpQixPQUFPLGFBQUEsQ0FBQTtBQUN0Rix3QkFBSSxVQUFVLElBQUksVUFBVSxDQUFBLGNBQWEsVUFBVSxNQUFNLFVBQVcsV0FBVyxPQUFBO0FBQy9FLG1CQUFPLHNCQUFzQixNQUFNO0FBQ2pDLG1CQUFLLG1CQUFtQixJQUFJLFdBQVcsQ0FBQSxDQUFBO0FBQ3ZDLHFCQUFPLHNCQUFzQixNQUFNLEtBQUssbUJBQW1CLElBQUksY0FBYyxjQUFBLENBQUE7WUFBQSxDQUFBO1VBQUE7QUFHakYsYUFBRyxjQUFjLElBQUksTUFBTSxnQkFBQSxDQUFBO0FBQzNCLGVBQUssV0FBVyxNQUFNLFNBQVMsTUFBTTtBQUNuQyxpQkFBSyxtQkFBbUIsSUFBSSxDQUFBLEdBQUksVUFBVSxPQUFPLFlBQUEsQ0FBQTtBQUNqRCxlQUFHLGNBQWMsSUFBSSxNQUFNLGNBQUEsQ0FBQTtVQUFBLENBQUE7UUFBQTtNQUFBLE9BRzFCO0FBQ0wsWUFBRyxLQUFLLFVBQVUsRUFBQSxHQUFJO0FBQ3BCLGlCQUFPLHNCQUFzQixNQUFNO0FBQ2pDLGVBQUcsY0FBYyxJQUFJLE1BQU0sZ0JBQUEsQ0FBQTtBQUMzQix3QkFBSSxVQUFVLElBQUksVUFBVSxDQUFBLGNBQWEsVUFBVSxNQUFNLFVBQVUsTUFBQTtBQUNuRSxlQUFHLGNBQWMsSUFBSSxNQUFNLGNBQUEsQ0FBQTtVQUFBLENBQUE7UUFBQSxPQUV4QjtBQUNMLGlCQUFPLHNCQUFzQixNQUFNO0FBQ2pDLGVBQUcsY0FBYyxJQUFJLE1BQU0sZ0JBQUEsQ0FBQTtBQUMzQix3QkFBSSxVQUFVLElBQUksVUFBVSxDQUFBLGNBQWEsVUFBVSxNQUFNLFVBQVUsV0FBVyxPQUFBO0FBQzlFLGVBQUcsY0FBYyxJQUFJLE1BQU0sY0FBQSxDQUFBO1VBQUEsQ0FBQTtRQUFBO01BQUE7SUFBQTtJQU1uQyxtQkFBbUIsSUFBSSxNQUFNLFNBQVMsWUFBWSxNQUFNLE1BQUs7QUFDM0QsVUFBSSxDQUFDLGdCQUFnQixrQkFBa0IsY0FBQSxJQUFrQixjQUFjLENBQUMsQ0FBQSxHQUFJLENBQUEsR0FBSSxDQUFBLENBQUE7QUFDaEYsVUFBRyxlQUFlLFNBQVMsR0FBRTtBQUMzQixZQUFJLFVBQVUsTUFBTSxLQUFLLG1CQUFtQixJQUFJLGlCQUFpQixPQUFPLGNBQUEsR0FBaUIsQ0FBQSxDQUFBO0FBQ3pGLFlBQUksU0FBUyxNQUFNLEtBQUssbUJBQW1CLElBQUksS0FBSyxPQUFPLGNBQUEsR0FBaUIsUUFBUSxPQUFPLGNBQUEsRUFBZ0IsT0FBTyxnQkFBQSxDQUFBO0FBQ2xILGVBQU8sS0FBSyxXQUFXLE1BQU0sU0FBUyxNQUFBO01BQUE7QUFFeEMsYUFBTyxzQkFBc0IsTUFBTTtBQUNqQyxZQUFJLENBQUMsVUFBVSxXQUFBLElBQWUsWUFBSSxVQUFVLElBQUksV0FBVyxDQUFDLENBQUEsR0FBSSxDQUFBLENBQUEsQ0FBQTtBQUNoRSxZQUFJLFdBQVcsS0FBSyxPQUFPLENBQUEsU0FBUSxTQUFTLFFBQVEsSUFBQSxJQUFRLEtBQUssQ0FBQyxHQUFHLFVBQVUsU0FBUyxJQUFBLENBQUE7QUFDeEYsWUFBSSxjQUFjLFFBQVEsT0FBTyxDQUFBLFNBQVEsWUFBWSxRQUFRLElBQUEsSUFBUSxLQUFLLEdBQUcsVUFBVSxTQUFTLElBQUEsQ0FBQTtBQUNoRyxZQUFJLFVBQVUsU0FBUyxPQUFPLENBQUEsU0FBUSxRQUFRLFFBQVEsSUFBQSxJQUFRLENBQUEsRUFBRyxPQUFPLFFBQUE7QUFDeEUsWUFBSSxhQUFhLFlBQVksT0FBTyxDQUFBLFNBQVEsS0FBSyxRQUFRLElBQUEsSUFBUSxDQUFBLEVBQUcsT0FBTyxXQUFBO0FBRTNFLG9CQUFJLFVBQVUsSUFBSSxXQUFXLENBQUEsY0FBYTtBQUN4QyxvQkFBVSxVQUFVLE9BQU8sR0FBRyxVQUFBO0FBQzlCLG9CQUFVLFVBQVUsSUFBSSxHQUFHLE9BQUE7QUFDM0IsaUJBQU8sQ0FBQyxTQUFTLFVBQUE7UUFBQSxDQUFBO01BQUEsQ0FBQTtJQUFBO0lBS3ZCLGlCQUFpQixJQUFJLE1BQU0sU0FBUTtBQUNqQyxVQUFJLENBQUMsVUFBVSxXQUFBLElBQWUsWUFBSSxVQUFVLElBQUksU0FBUyxDQUFDLENBQUEsR0FBSSxDQUFBLENBQUEsQ0FBQTtBQUU5RCxVQUFJLGVBQWUsS0FBSyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUEsTUFBVSxJQUFBLEVBQU0sT0FBTyxPQUFBO0FBQzNELFVBQUksVUFBVSxTQUFTLE9BQU8sQ0FBQyxDQUFDLE1BQU0sSUFBQSxNQUFVLENBQUMsYUFBYSxTQUFTLElBQUEsQ0FBQSxFQUFPLE9BQU8sSUFBQTtBQUNyRixVQUFJLGFBQWEsWUFBWSxPQUFPLENBQUMsU0FBUyxDQUFDLGFBQWEsU0FBUyxJQUFBLENBQUEsRUFBTyxPQUFPLE9BQUE7QUFFbkYsa0JBQUksVUFBVSxJQUFJLFNBQVMsQ0FBQSxjQUFhO0FBQ3RDLG1CQUFXLFFBQVEsQ0FBQSxTQUFRLFVBQVUsZ0JBQWdCLElBQUEsQ0FBQTtBQUNyRCxnQkFBUSxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUEsTUFBUyxVQUFVLGFBQWEsTUFBTSxHQUFBLENBQUE7QUFDOUQsZUFBTyxDQUFDLFNBQVMsVUFBQTtNQUFBLENBQUE7SUFBQTtJQUlyQixjQUFjLElBQUksU0FBUTtBQUFFLGFBQU8sUUFBUSxNQUFNLENBQUEsU0FBUSxHQUFHLFVBQVUsU0FBUyxJQUFBLENBQUE7SUFBQTtJQUUvRSxhQUFhLElBQUksWUFBVztBQUMxQixhQUFPLENBQUMsS0FBSyxVQUFVLEVBQUEsS0FBTyxLQUFLLGNBQWMsSUFBSSxVQUFBO0lBQUE7SUFHdkQsWUFBWSxVQUFVLEVBQUMsR0FBQSxHQUFJO0FBQ3pCLGFBQU8sS0FBSyxZQUFJLElBQUksVUFBVSxFQUFBLElBQU0sQ0FBQyxRQUFBO0lBQUE7RUFBQTtBQUl6QyxNQUFPLGFBQVE7QUNwSmYsTUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLE1BQU0sWUFBWSxDQUFBLE1BQU87QUFDbEQsUUFBSSxXQUFXLElBQUksU0FBUyxJQUFBO0FBQzVCLFFBQUksV0FBVyxDQUFBO0FBRWYsYUFBUyxRQUFRLENBQUMsS0FBSyxLQUFLLFdBQVc7QUFDckMsVUFBRyxlQUFlLE1BQUs7QUFBRSxpQkFBUyxLQUFLLEdBQUE7TUFBQTtJQUFBLENBQUE7QUFJekMsYUFBUyxRQUFRLENBQUEsUUFBTyxTQUFTLE9BQU8sR0FBQSxDQUFBO0FBRXhDLFFBQUksU0FBUyxJQUFJLGdCQUFBO0FBQ2pCLGFBQVEsQ0FBQyxLQUFLLEdBQUEsS0FBUSxTQUFTLFFBQUEsR0FBVTtBQUN2QyxVQUFHLFVBQVUsV0FBVyxLQUFLLFVBQVUsUUFBUSxHQUFBLEtBQVEsR0FBRTtBQUN2RCxlQUFPLE9BQU8sS0FBSyxHQUFBO01BQUE7SUFBQTtBQUd2QixhQUFRLFdBQVcsTUFBSztBQUFFLGFBQU8sT0FBTyxTQUFTLEtBQUssT0FBQSxDQUFBO0lBQUE7QUFFdEQsV0FBTyxPQUFPLFNBQUE7RUFBQTtBQUdoQixNQUFBLE9BQUEsTUFBMEI7SUFDeEIsWUFBWSxJQUFJQSxhQUFZLFlBQVksT0FBTTtBQUM1QyxXQUFLLGFBQWFBO0FBQ2xCLFdBQUssUUFBUTtBQUNiLFdBQUssU0FBUztBQUNkLFdBQUssT0FBTyxhQUFhLFdBQVcsT0FBTztBQUMzQyxXQUFLLEtBQUs7QUFDVixXQUFLLEtBQUssS0FBSyxHQUFHO0FBQ2xCLFdBQUssTUFBTTtBQUNYLFdBQUssYUFBYTtBQUNsQixXQUFLLGNBQWM7QUFDbkIsV0FBSyxlQUFlLENBQUE7QUFDcEIsV0FBSyxjQUFjLENBQUE7QUFDbkIsV0FBSyxXQUFXO0FBQ2hCLFdBQUssT0FBTztBQUNaLFdBQUssWUFBWSxLQUFLLFNBQVMsS0FBSyxPQUFPLFlBQVksSUFBSTtBQUMzRCxXQUFLLGNBQWM7QUFDbkIsV0FBSyxZQUFZO0FBQ2pCLFdBQUssZUFBZSxTQUFTLFFBQU87QUFBRSxrQkFBVSxPQUFBO01BQUE7QUFDaEQsV0FBSyxlQUFlLFdBQVU7TUFBQTtBQUM5QixXQUFLLGlCQUFpQixLQUFLLFNBQVMsT0FBTyxDQUFBO0FBQzNDLFdBQUssWUFBWSxDQUFBO0FBQ2pCLFdBQUssWUFBWSxDQUFBO0FBQ2pCLFdBQUssY0FBYyxDQUFBO0FBQ25CLFdBQUssV0FBVyxLQUFLLFNBQVMsT0FBTyxDQUFBO0FBQ3JDLFdBQUssS0FBSyxTQUFTLEtBQUssRUFBQSxJQUFNLENBQUE7QUFDOUIsV0FBSyxVQUFVLEtBQUssV0FBVyxRQUFRLE1BQU0sS0FBSyxFQUFBLElBQU0sTUFBTTtBQUM1RCxlQUFPO1VBQ0wsVUFBVSxLQUFLLFdBQVcsS0FBSyxPQUFPO1VBQ3RDLEtBQUssS0FBSyxXQUFXLFNBQVksS0FBSyxRQUFRO1VBQzlDLFFBQVEsS0FBSyxjQUFBO1VBQ2IsU0FBUyxLQUFLLFdBQUE7VUFDZCxRQUFRLEtBQUssVUFBQTtVQUNiLE9BQU8sS0FBSztRQUFBO01BQUEsQ0FBQTtBQUdoQixXQUFLLFdBQVcsS0FBSyxXQUFXLGFBQUE7QUFDaEMsV0FBSyxZQUFBO0lBQUE7SUFHUCxRQUFRLE1BQUs7QUFBRSxXQUFLLE9BQU87SUFBQTtJQUUzQixZQUFZLE1BQUs7QUFDZixXQUFLLFdBQVc7QUFDaEIsV0FBSyxPQUFPO0lBQUE7SUFHZCxTQUFRO0FBQUUsYUFBTyxLQUFLLEdBQUcsYUFBYSxRQUFBO0lBQUE7SUFFdEMsZ0JBQWU7QUFDYixVQUFJLFNBQVMsS0FBSyxXQUFXLE9BQU8sS0FBSyxFQUFBO0FBQ3pDLFVBQUksV0FDRixZQUFJLElBQUksVUFBVSxJQUFJLEtBQUssUUFBUSxnQkFBQSxDQUFBLEdBQUEsRUFDaEMsSUFBSSxDQUFBLFNBQVEsS0FBSyxPQUFPLEtBQUssSUFBQSxFQUFNLE9BQU8sQ0FBQSxRQUFPLE9BQVEsUUFBUyxRQUFBO0FBRXZFLFVBQUcsU0FBUyxTQUFTLEdBQUU7QUFBRSxlQUFPLGVBQUEsSUFBbUI7TUFBQTtBQUNuRCxhQUFPLFNBQUEsSUFBYSxLQUFLO0FBRXpCLGFBQU87SUFBQTtJQUdULGNBQWE7QUFBRSxhQUFPLEtBQUssUUFBUSxRQUFBO0lBQUE7SUFFbkMsYUFBWTtBQUFFLGFBQU8sS0FBSyxHQUFHLGFBQWEsV0FBQTtJQUFBO0lBRTFDLFlBQVc7QUFDVCxVQUFJLE1BQU0sS0FBSyxHQUFHLGFBQWEsVUFBQTtBQUMvQixhQUFPLFFBQVEsS0FBSyxPQUFPO0lBQUE7SUFHN0IsUUFBUSxXQUFXLFdBQVc7SUFBQSxHQUFJO0FBQ2hDLFdBQUssbUJBQUE7QUFDTCxXQUFLLFlBQVk7QUFDakIsYUFBTyxLQUFLLEtBQUssU0FBUyxLQUFLLEVBQUE7QUFDL0IsVUFBRyxLQUFLLFFBQU87QUFBRSxlQUFPLEtBQUssS0FBSyxTQUFTLEtBQUssT0FBTyxFQUFBLEVBQUksS0FBSyxFQUFBO01BQUE7QUFDaEUsbUJBQWEsS0FBSyxXQUFBO0FBQ2xCLFVBQUksYUFBYSxNQUFNO0FBQ3JCLGlCQUFBO0FBQ0EsaUJBQVEsTUFBTSxLQUFLLFdBQVU7QUFDM0IsZUFBSyxZQUFZLEtBQUssVUFBVSxFQUFBLENBQUE7UUFBQTtNQUFBO0FBSXBDLGtCQUFJLHNCQUFzQixLQUFLLEVBQUE7QUFFL0IsV0FBSyxJQUFJLGFBQWEsTUFBTSxDQUFDLDRDQUFBLENBQUE7QUFDN0IsV0FBSyxRQUFRLE1BQUEsRUFDVixRQUFRLE1BQU0sVUFBQSxFQUNkLFFBQVEsU0FBUyxVQUFBLEVBQ2pCLFFBQVEsV0FBVyxVQUFBO0lBQUE7SUFHeEIsdUJBQXVCLFNBQVE7QUFDN0IsV0FBSyxHQUFHLFVBQVUsT0FDaEIscUJBQ0Esd0JBQ0EsZUFBQTtBQUVGLFdBQUssR0FBRyxVQUFVLElBQUksR0FBRyxPQUFBO0lBQUE7SUFHM0IsV0FBVyxTQUFRO0FBQ2pCLG1CQUFhLEtBQUssV0FBQTtBQUNsQixVQUFHLFNBQVE7QUFDVCxhQUFLLGNBQWMsV0FBVyxNQUFNLEtBQUssV0FBQSxHQUFjLE9BQUE7TUFBQSxPQUNsRDtBQUNMLGlCQUFRLE1BQU0sS0FBSyxXQUFVO0FBQUUsZUFBSyxVQUFVLEVBQUEsRUFBSSxlQUFBO1FBQUE7QUFDbEQsYUFBSyxvQkFBb0Isc0JBQUE7TUFBQTtJQUFBO0lBSTdCLGFBQVk7QUFDVixtQkFBYSxLQUFLLFdBQUE7QUFDbEIsV0FBSyxvQkFBb0IsbUJBQUE7SUFBQTtJQUczQixxQkFBb0I7QUFDbEIsZUFBUSxNQUFNLEtBQUssV0FBVTtBQUFFLGFBQUssVUFBVSxFQUFBLEVBQUksY0FBQTtNQUFBO0lBQUE7SUFHcEQsSUFBSSxNQUFNLGFBQVk7QUFDcEIsV0FBSyxXQUFXLElBQUksTUFBTSxNQUFNLFdBQUE7SUFBQTtJQUdsQyxXQUFXLE1BQU0sU0FBUyxTQUFTLFdBQVU7SUFBQSxHQUFHO0FBQzlDLFdBQUssV0FBVyxXQUFXLE1BQU0sU0FBUyxNQUFBO0lBQUE7SUFHNUMsY0FBYyxXQUFXLFVBQVM7QUFDaEMsVUFBRyxxQkFBcUIsZUFBZSxxQkFBcUIsWUFBVztBQUNyRSxlQUFPLEtBQUssV0FBVyxNQUFNLFdBQVcsQ0FBQSxTQUFRLFNBQVMsTUFBTSxTQUFBLENBQUE7TUFBQTtBQUdqRSxVQUFHLE1BQU0sU0FBQSxHQUFXO0FBQ2xCLFlBQUksVUFBVSxZQUFJLHNCQUFzQixLQUFLLElBQUksU0FBQTtBQUNqRCxZQUFHLFFBQVEsV0FBVyxHQUFFO0FBQ3RCLG1CQUFTLDZDQUE2QyxTQUFBLEVBQUE7UUFBQSxPQUNqRDtBQUNMLG1CQUFTLE1BQU0sU0FBUyxTQUFBLENBQUE7UUFBQTtNQUFBLE9BRXJCO0FBQ0wsWUFBSSxVQUFVLE1BQU0sS0FBSyxTQUFTLGlCQUFpQixTQUFBLENBQUE7QUFDbkQsWUFBRyxRQUFRLFdBQVcsR0FBRTtBQUFFLG1CQUFTLG1EQUFtRCxTQUFBLEdBQUE7UUFBQTtBQUN0RixnQkFBUSxRQUFRLENBQUEsV0FBVSxLQUFLLFdBQVcsTUFBTSxRQUFRLENBQUEsU0FBUSxTQUFTLE1BQU0sTUFBQSxDQUFBLENBQUE7TUFBQTtJQUFBO0lBSW5GLFVBQVUsTUFBTSxTQUFTLFVBQVM7QUFDaEMsV0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDLElBQUksTUFBTSxPQUFBLENBQUEsQ0FBQTtBQUNoQyxVQUFJLEVBQUMsTUFBTSxPQUFPLFFBQVEsTUFBQSxJQUFTLFNBQVMsUUFBUSxPQUFBO0FBQ3BELFVBQUcsT0FBTTtBQUFFLG9CQUFJLFNBQVMsS0FBQTtNQUFBO0FBRXhCLGVBQVMsRUFBQyxNQUFNLE9BQU8sT0FBQSxDQUFBO0FBQ3ZCLGFBQU87SUFBQTtJQUdULE9BQU8sTUFBSztBQUNWLFVBQUksRUFBQyxVQUFVLFVBQUEsSUFBYTtBQUM1QixVQUFHLFdBQVU7QUFDWCxZQUFJLENBQUMsS0FBSyxLQUFBLElBQVM7QUFDbkIsYUFBSyxLQUFLLFlBQUkscUJBQXFCLEtBQUssSUFBSSxLQUFLLEtBQUE7TUFBQTtBQUVuRCxXQUFLLGFBQWE7QUFDbEIsV0FBSyxjQUFjO0FBQ25CLFdBQUssUUFBUTtBQUViLHNCQUFRLFVBQVUsS0FBSyxXQUFXLGNBQWMsT0FBTyxTQUFTLFVBQVUsbUJBQUE7QUFDMUUsV0FBSyxVQUFVLFNBQVMsVUFBVSxDQUFDLEVBQUMsTUFBTSxPQUFBLE1BQVk7QUFDcEQsYUFBSyxXQUFXLElBQUksU0FBUyxLQUFLLElBQUksSUFBQTtBQUN0QyxZQUFJLE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSxNQUFBO0FBQ3RDLGFBQUssZ0JBQUE7QUFDTCxZQUFJLFFBQVEsS0FBSyxpQkFBaUIsSUFBQTtBQUNsQyxhQUFLO0FBRUwsWUFBRyxNQUFNLFNBQVMsR0FBRTtBQUNsQixnQkFBTSxRQUFRLENBQUMsQ0FBQyxNQUFNLFNBQVMsTUFBQSxHQUFTLE1BQU07QUFDNUMsaUJBQUssaUJBQWlCLE1BQU0sUUFBUSxDQUFBLFVBQVE7QUFDMUMsa0JBQUcsTUFBTSxNQUFNLFNBQVMsR0FBRTtBQUN4QixxQkFBSyxlQUFlLE9BQU0sTUFBTSxNQUFBO2NBQUE7WUFBQSxDQUFBO1VBQUEsQ0FBQTtRQUFBLE9BSWpDO0FBQ0wsZUFBSyxlQUFlLE1BQU0sTUFBTSxNQUFBO1FBQUE7TUFBQSxDQUFBO0lBQUE7SUFLdEMsa0JBQWlCO0FBQ2Ysa0JBQUksSUFBSSxVQUFVLElBQUksV0FBQSxLQUFnQixLQUFLLEVBQUEsTUFBUSxPQUFBLEtBQVksQ0FBQSxPQUFNO0FBQ25FLFdBQUcsZ0JBQWdCLE9BQUE7QUFDbkIsV0FBRyxnQkFBZ0IsV0FBQTtNQUFBLENBQUE7SUFBQTtJQUl2QixlQUFlLEVBQUMsV0FBQSxHQUFhLE1BQU0sUUFBTztBQUd4QyxVQUFHLEtBQUssWUFBWSxLQUFNLEtBQUssVUFBVSxDQUFDLEtBQUssT0FBTyxjQUFBLEdBQWlCO0FBQ3JFLGVBQU8sS0FBSyxlQUFlLFlBQVksTUFBTSxNQUFBO01BQUE7QUFPL0MsVUFBSSxjQUFjLFlBQUksMEJBQTBCLE1BQU0sS0FBSyxFQUFBLEVBQUksT0FBTyxDQUFBLFNBQVE7QUFDNUUsWUFBSSxTQUFTLEtBQUssTUFBTSxLQUFLLEdBQUcsY0FBYyxRQUFRLEtBQUssRUFBQSxJQUFBO0FBQzNELFlBQUksWUFBWSxVQUFVLE9BQU8sYUFBYSxVQUFBO0FBQzlDLFlBQUcsV0FBVTtBQUFFLGVBQUssYUFBYSxZQUFZLFNBQUE7UUFBQTtBQUM3QyxlQUFPLEtBQUssVUFBVSxJQUFBO01BQUEsQ0FBQTtBQUd4QixVQUFHLFlBQVksV0FBVyxHQUFFO0FBQzFCLFlBQUcsS0FBSyxRQUFPO0FBQ2IsZUFBSyxLQUFLLGVBQWUsS0FBSyxDQUFDLE1BQU0sTUFBTSxLQUFLLGVBQWUsWUFBWSxNQUFNLE1BQUEsQ0FBQSxDQUFBO0FBQ2pGLGVBQUssT0FBTyxRQUFRLElBQUE7UUFBQSxPQUNmO0FBQ0wsZUFBSyx3QkFBQTtBQUNMLGVBQUssZUFBZSxZQUFZLE1BQU0sTUFBQTtRQUFBO01BQUEsT0FFbkM7QUFDTCxhQUFLLEtBQUssZUFBZSxLQUFLLENBQUMsTUFBTSxNQUFNLEtBQUssZUFBZSxZQUFZLE1BQU0sTUFBQSxDQUFBLENBQUE7TUFBQTtJQUFBO0lBSXJGLGtCQUFpQjtBQUNmLFdBQUssS0FBSyxZQUFJLEtBQUssS0FBSyxFQUFBO0FBQ3hCLFdBQUssR0FBRyxhQUFhLGFBQWEsS0FBSyxLQUFLLEVBQUE7SUFBQTtJQUc5QyxlQUFlLFlBQVksTUFBTSxRQUFPO0FBQ3RDLFdBQUssZ0JBQUE7QUFDTCxVQUFJLFFBQVEsSUFBSSxTQUFTLE1BQU0sS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLElBQUE7QUFDdkQsWUFBTSw4QkFBQTtBQUNOLFdBQUssYUFBYSxPQUFPLEtBQUE7QUFDekIsV0FBSyxnQkFBQTtBQUNMLGtCQUFJLElBQUksS0FBSyxJQUFJLElBQUksS0FBSyxRQUFRLFFBQUEsQ0FBQSxnQkFBeUIsUUFBQSxLQUFhLENBQUEsV0FBVTtBQUNoRixZQUFJLE9BQU8sS0FBSyxRQUFRLE1BQUE7QUFDeEIsWUFBRyxNQUFLO0FBQUUsZUFBSyxVQUFBO1FBQUE7TUFBQSxDQUFBO0FBR2pCLFdBQUssY0FBYztBQUNuQixXQUFLLFdBQVcsZUFBZSxNQUFBO0FBQy9CLFdBQUssb0JBQUE7QUFFTCxVQUFHLFlBQVc7QUFDWixZQUFJLEVBQUMsTUFBTSxHQUFBLElBQU07QUFDakIsYUFBSyxXQUFXLGFBQWEsSUFBSSxJQUFBO01BQUE7QUFFbkMsV0FBSyxXQUFBO0FBQ0wsVUFBRyxLQUFLLFlBQVksR0FBRTtBQUFFLGFBQUssbUJBQUE7TUFBQTtBQUM3QixXQUFLLGFBQUE7SUFBQTtJQUdQLHdCQUF3QixRQUFRLE1BQUs7QUFDbkMsV0FBSyxXQUFXLFdBQVcscUJBQXFCLENBQUMsUUFBUSxJQUFBLENBQUE7QUFDekQsVUFBSSxPQUFPLEtBQUssUUFBUSxNQUFBO0FBQ3hCLFVBQUksWUFBWSxRQUFRLFlBQUksVUFBVSxRQUFRLEtBQUssUUFBUSxVQUFBLENBQUE7QUFDM0QsVUFBRyxRQUFRLENBQUMsT0FBTyxZQUFZLElBQUEsS0FBUyxFQUFFLGFBQWEsV0FBVyxPQUFPLFNBQVMsS0FBSyxPQUFBLElBQVU7QUFDL0YsYUFBSyxlQUFBO0FBQ0wsZUFBTztNQUFBO0lBQUE7SUFJWCxhQUFhLE9BQU8sV0FBVTtBQUM1QixVQUFJLGFBQWEsQ0FBQTtBQUNqQixVQUFJLG1CQUFtQjtBQUN2QixVQUFJLGlCQUFpQixvQkFBSSxJQUFBO0FBRXpCLFlBQU0sTUFBTSxTQUFTLENBQUEsT0FBTTtBQUN6QixhQUFLLFdBQVcsV0FBVyxlQUFlLENBQUMsRUFBQSxDQUFBO0FBRTNDLFlBQUksVUFBVSxLQUFLLFFBQVEsRUFBQTtBQUMzQixZQUFHLFNBQVE7QUFBRSxrQkFBUSxVQUFBO1FBQUE7TUFBQSxDQUFBO0FBR3ZCLFlBQU0sTUFBTSxpQkFBaUIsQ0FBQSxPQUFNO0FBQ2pDLFlBQUcsWUFBSSxZQUFZLEVBQUEsR0FBSTtBQUNyQixlQUFLLFdBQVcsY0FBQTtRQUFBLE9BQ1g7QUFDTCw2QkFBbUI7UUFBQTtNQUFBLENBQUE7QUFJdkIsWUFBTSxPQUFPLFdBQVcsQ0FBQyxRQUFRLFNBQVM7QUFDeEMsWUFBSSxPQUFPLEtBQUssd0JBQXdCLFFBQVEsSUFBQTtBQUNoRCxZQUFHLE1BQUs7QUFBRSx5QkFBZSxJQUFJLE9BQU8sRUFBQTtRQUFBO01BQUEsQ0FBQTtBQUd0QyxZQUFNLE1BQU0sV0FBVyxDQUFBLE9BQU07QUFDM0IsWUFBRyxlQUFlLElBQUksR0FBRyxFQUFBLEdBQUk7QUFBRSxlQUFLLFFBQVEsRUFBQSxFQUFJLFVBQUE7UUFBQTtNQUFBLENBQUE7QUFHbEQsWUFBTSxNQUFNLGFBQWEsQ0FBQyxPQUFPO0FBQy9CLFlBQUcsR0FBRyxhQUFhLEtBQUssY0FBYTtBQUFFLHFCQUFXLEtBQUssRUFBQTtRQUFBO01BQUEsQ0FBQTtBQUd6RCxZQUFNLE1BQU0sd0JBQXdCLENBQUEsUUFBTyxLQUFLLHFCQUFxQixLQUFLLFNBQUEsQ0FBQTtBQUMxRSxZQUFNLFFBQUE7QUFDTixXQUFLLHFCQUFxQixZQUFZLFNBQUE7QUFFdEMsYUFBTztJQUFBO0lBR1QscUJBQXFCLFVBQVUsV0FBVTtBQUN2QyxVQUFJLGdCQUFnQixDQUFBO0FBQ3BCLGVBQVMsUUFBUSxDQUFBLFdBQVU7QUFDekIsWUFBSSxhQUFhLFlBQUksSUFBSSxRQUFRLElBQUksYUFBQSxHQUFBO0FBQ3JDLFlBQUksUUFBUSxZQUFJLElBQUksUUFBUSxJQUFJLEtBQUssUUFBUSxRQUFBLENBQUEsR0FBQTtBQUM3QyxtQkFBVyxPQUFPLE1BQUEsRUFBUSxRQUFRLENBQUEsT0FBTTtBQUN0QyxjQUFJLE1BQU0sS0FBSyxZQUFZLEVBQUE7QUFDM0IsY0FBRyxNQUFNLEdBQUEsS0FBUSxjQUFjLFFBQVEsR0FBQSxNQUFTLElBQUc7QUFBRSwwQkFBYyxLQUFLLEdBQUE7VUFBQTtRQUFBLENBQUE7QUFFMUUsY0FBTSxPQUFPLE1BQUEsRUFBUSxRQUFRLENBQUEsV0FBVTtBQUNyQyxjQUFJLE9BQU8sS0FBSyxRQUFRLE1BQUE7QUFDeEIsa0JBQVEsS0FBSyxZQUFZLElBQUE7UUFBQSxDQUFBO01BQUEsQ0FBQTtBQU03QixVQUFHLFdBQVU7QUFDWCxhQUFLLDZCQUE2QixhQUFBO01BQUE7SUFBQTtJQUl0QyxrQkFBaUI7QUFDZixrQkFBSSxnQkFBZ0IsS0FBSyxJQUFJLEtBQUssRUFBQSxFQUFJLFFBQVEsQ0FBQSxPQUFNLEtBQUssVUFBVSxFQUFBLENBQUE7SUFBQTtJQUdyRSxhQUFhLElBQUc7QUFBRSxhQUFPLEtBQUssS0FBSyxTQUFTLEtBQUssRUFBQSxFQUFJLEVBQUE7SUFBQTtJQUVyRCxrQkFBa0IsSUFBRztBQUNuQixVQUFHLEdBQUcsT0FBTyxLQUFLLElBQUc7QUFDbkIsZUFBTztNQUFBLE9BQ0Y7QUFDTCxlQUFPLEtBQUssU0FBUyxHQUFHLGFBQWEsYUFBQSxDQUFBLEVBQWdCLEdBQUcsRUFBQTtNQUFBO0lBQUE7SUFJNUQsa0JBQWtCLElBQUc7QUFDbkIsZUFBUSxZQUFZLEtBQUssS0FBSyxVQUFTO0FBQ3JDLGlCQUFRLFdBQVcsS0FBSyxLQUFLLFNBQVMsUUFBQSxHQUFVO0FBQzlDLGNBQUcsWUFBWSxJQUFHO0FBQUUsbUJBQU8sS0FBSyxLQUFLLFNBQVMsUUFBQSxFQUFVLE9BQUEsRUFBUyxRQUFBO1VBQUE7UUFBQTtNQUFBO0lBQUE7SUFLdkUsVUFBVSxJQUFHO0FBQ1gsVUFBSSxRQUFRLEtBQUssYUFBYSxHQUFHLEVBQUE7QUFDakMsVUFBRyxDQUFDLE9BQU07QUFDUixZQUFJLE9BQU8sSUFBSSxLQUFLLElBQUksS0FBSyxZQUFZLElBQUE7QUFDekMsYUFBSyxLQUFLLFNBQVMsS0FBSyxFQUFBLEVBQUksS0FBSyxFQUFBLElBQU07QUFDdkMsYUFBSyxLQUFBO0FBQ0wsYUFBSztBQUNMLGVBQU87TUFBQTtJQUFBO0lBSVgsZ0JBQWU7QUFBRSxhQUFPLEtBQUs7SUFBQTtJQUU3QixRQUFRLFFBQU87QUFDYixXQUFLO0FBRUwsVUFBRyxLQUFLLGVBQWUsR0FBRTtBQUN2QixZQUFHLEtBQUssUUFBTztBQUNiLGVBQUssT0FBTyxRQUFRLElBQUE7UUFBQSxPQUNmO0FBQ0wsZUFBSyx3QkFBQTtRQUFBO01BQUE7SUFBQTtJQUtYLDBCQUF5QjtBQUN2QixXQUFLLGFBQWEsTUFBTTtBQUN0QixhQUFLLGVBQWUsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFBLE1BQVE7QUFDMUMsY0FBRyxDQUFDLEtBQUssWUFBQSxHQUFjO0FBQUUsZUFBQTtVQUFBO1FBQUEsQ0FBQTtBQUUzQixhQUFLLGlCQUFpQixDQUFBO01BQUEsQ0FBQTtJQUFBO0lBSTFCLE9BQU8sTUFBTSxRQUFPO0FBQ2xCLFVBQUcsS0FBSyxjQUFBLEtBQW9CLEtBQUssV0FBVyxlQUFBLEtBQW9CLENBQUMsWUFBSSxZQUFZLEtBQUssRUFBQSxHQUFLO0FBQ3pGLGVBQU8sS0FBSyxhQUFhLEtBQUssRUFBQyxNQUFNLE9BQUEsQ0FBQTtNQUFBO0FBR3ZDLFdBQUssU0FBUyxVQUFVLElBQUE7QUFDeEIsVUFBSSxtQkFBbUI7QUFLdkIsVUFBRyxLQUFLLFNBQVMsb0JBQW9CLElBQUEsR0FBTTtBQUN6QyxhQUFLLFdBQVcsS0FBSyw0QkFBNEIsTUFBTTtBQUNyRCxjQUFJLGFBQWEsWUFBSSxlQUFlLEtBQUssSUFBSSxLQUFLLFNBQVMsY0FBYyxJQUFBLENBQUE7QUFDekUscUJBQVcsUUFBUSxDQUFBLGNBQWE7QUFDOUIsZ0JBQUcsS0FBSyxlQUFlLEtBQUssU0FBUyxhQUFhLE1BQU0sU0FBQSxHQUFZLFNBQUEsR0FBVztBQUFFLGlDQUFtQjtZQUFBO1VBQUEsQ0FBQTtRQUFBLENBQUE7TUFBQSxXQUdoRyxDQUFDLFFBQVEsSUFBQSxHQUFNO0FBQ3ZCLGFBQUssV0FBVyxLQUFLLHVCQUF1QixNQUFNO0FBQ2hELGNBQUksT0FBTyxLQUFLLGdCQUFnQixNQUFNLFFBQUE7QUFDdEMsY0FBSSxRQUFRLElBQUksU0FBUyxNQUFNLEtBQUssSUFBSSxLQUFLLElBQUksTUFBTSxJQUFBO0FBQ3ZELDZCQUFtQixLQUFLLGFBQWEsT0FBTyxJQUFBO1FBQUEsQ0FBQTtNQUFBO0FBSWhELFdBQUssV0FBVyxlQUFlLE1BQUE7QUFDL0IsVUFBRyxrQkFBaUI7QUFBRSxhQUFLLGdCQUFBO01BQUE7SUFBQTtJQUc3QixnQkFBZ0IsTUFBTSxNQUFLO0FBQ3pCLGFBQU8sS0FBSyxXQUFXLEtBQUssa0JBQWtCLElBQUEsS0FBUyxNQUFNO0FBQzNELFlBQUksTUFBTSxLQUFLLEdBQUc7QUFHbEIsWUFBSSxPQUFPLE9BQU8sS0FBSyxTQUFTLGNBQWMsSUFBQSxFQUFNLE9BQU8sS0FBSyxXQUFBLElBQWU7QUFDL0UsWUFBSSxPQUFPLEtBQUssU0FBUyxTQUFTLElBQUE7QUFDbEMsZUFBTyxJQUFJLEdBQUEsSUFBTyxJQUFBLEtBQVMsR0FBQTtNQUFBLENBQUE7SUFBQTtJQUkvQixlQUFlLE1BQU0sS0FBSTtBQUN2QixVQUFHLFFBQVEsSUFBQTtBQUFPLGVBQU87QUFDekIsVUFBSSxPQUFPLEtBQUssU0FBUyxrQkFBa0IsR0FBQTtBQUMzQyxVQUFJLFFBQVEsSUFBSSxTQUFTLE1BQU0sS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLEdBQUE7QUFDdkQsVUFBSSxnQkFBZ0IsS0FBSyxhQUFhLE9BQU8sSUFBQTtBQUM3QyxhQUFPO0lBQUE7SUFHVCxRQUFRLElBQUc7QUFBRSxhQUFPLEtBQUssVUFBVSxTQUFTLFVBQVUsRUFBQSxDQUFBO0lBQUE7SUFFdEQsUUFBUSxJQUFHO0FBQ1QsVUFBRyxTQUFTLFVBQVUsRUFBQSxLQUFPLENBQUMsR0FBRyxjQUFhO0FBQUU7TUFBQTtBQUNoRCxVQUFJLFdBQVcsR0FBRyxhQUFhLFlBQVksUUFBQSxFQUFBLEtBQWUsR0FBRyxhQUFhLEtBQUssUUFBUSxRQUFBLENBQUE7QUFDdkYsVUFBRyxZQUFZLENBQUMsS0FBSyxZQUFZLEVBQUEsR0FBSTtBQUFFO01BQUE7QUFDdkMsVUFBSSxZQUFZLEtBQUssV0FBVyxpQkFBaUIsUUFBQTtBQUVqRCxVQUFHLFdBQVU7QUFDWCxZQUFHLENBQUMsR0FBRyxJQUFHO0FBQUUsbUJBQVMsdUJBQXVCLFFBQUEsaURBQXlELEVBQUE7UUFBQTtBQUNyRyxZQUFJLE9BQU8sSUFBSSxTQUFTLE1BQU0sSUFBSSxTQUFBO0FBQ2xDLGFBQUssVUFBVSxTQUFTLFVBQVUsS0FBSyxFQUFBLENBQUEsSUFBTztBQUM5QyxlQUFPO01BQUEsV0FDQyxhQUFhLE1BQUs7QUFDMUIsaUJBQVMsMkJBQTJCLFFBQUEsS0FBYSxFQUFBO01BQUE7SUFBQTtJQUlyRCxZQUFZLE1BQUs7QUFDZixXQUFLLFlBQUE7QUFDTCxXQUFLLFlBQUE7QUFDTCxhQUFPLEtBQUssVUFBVSxTQUFTLFVBQVUsS0FBSyxFQUFBLENBQUE7SUFBQTtJQUdoRCxzQkFBcUI7QUFDbkIsV0FBSyxhQUFhLFFBQVEsQ0FBQyxFQUFDLE1BQU0sT0FBQSxNQUFZLEtBQUssT0FBTyxNQUFNLE1BQUEsQ0FBQTtBQUNoRSxXQUFLLGVBQWUsQ0FBQTtJQUFBO0lBR3RCLFVBQVUsT0FBTyxJQUFHO0FBQ2xCLFdBQUssV0FBVyxVQUFVLEtBQUssU0FBUyxPQUFPLENBQUEsU0FBUTtBQUNyRCxZQUFHLEtBQUssY0FBQSxHQUFnQjtBQUN0QixlQUFLLEtBQUssZUFBZSxLQUFLLENBQUMsTUFBTSxNQUFNLEdBQUcsSUFBQSxDQUFBLENBQUE7UUFBQSxPQUN6QztBQUNMLGVBQUssV0FBVyxpQkFBaUIsTUFBTSxHQUFHLElBQUEsQ0FBQTtRQUFBO01BQUEsQ0FBQTtJQUFBO0lBS2hELGNBQWE7QUFHWCxXQUFLLFdBQVcsVUFBVSxLQUFLLFNBQVMsUUFBUSxDQUFDLFlBQVk7QUFDM0QsYUFBSyxXQUFXLGlCQUFpQixNQUFNO0FBQ3JDLGVBQUssVUFBVSxVQUFVLFNBQVMsQ0FBQyxFQUFDLE1BQU0sT0FBQSxNQUFZLEtBQUssT0FBTyxNQUFNLE1BQUEsQ0FBQTtRQUFBLENBQUE7TUFBQSxDQUFBO0FBRzVFLFdBQUssVUFBVSxZQUFZLENBQUMsRUFBQyxJQUFJLE1BQUEsTUFBVyxLQUFLLFdBQVcsRUFBQyxJQUFJLE1BQUEsQ0FBQSxDQUFBO0FBQ2pFLFdBQUssVUFBVSxjQUFjLENBQUMsVUFBVSxLQUFLLFlBQVksS0FBQSxDQUFBO0FBQ3pELFdBQUssVUFBVSxpQkFBaUIsQ0FBQyxVQUFVLEtBQUssZUFBZSxLQUFBLENBQUE7QUFDL0QsV0FBSyxRQUFRLFFBQVEsQ0FBQSxXQUFVLEtBQUssUUFBUSxNQUFBLENBQUE7QUFDNUMsV0FBSyxRQUFRLFFBQVEsQ0FBQSxXQUFVLEtBQUssUUFBUSxNQUFBLENBQUE7SUFBQTtJQUc5QyxxQkFBb0I7QUFDbEIsZUFBUSxNQUFNLEtBQUssS0FBSyxTQUFTLEtBQUssRUFBQSxHQUFJO0FBQ3hDLGFBQUssYUFBYSxFQUFBLEVBQUksUUFBQTtNQUFBO0lBQUE7SUFJMUIsZUFBZSxPQUFNO0FBQ25CLFVBQUksRUFBQyxJQUFJLE1BQU0sTUFBQSxJQUFTO0FBQ3hCLFVBQUksTUFBTSxLQUFLLFVBQVUsRUFBQTtBQUN6QixXQUFLLFdBQVcsZ0JBQWdCLEtBQUssTUFBTSxLQUFBO0lBQUE7SUFHN0MsWUFBWSxPQUFNO0FBQ2hCLFVBQUksRUFBQyxJQUFJLEtBQUEsSUFBUTtBQUNqQixXQUFLLE9BQU8sS0FBSyxVQUFVLEVBQUE7QUFDM0IsV0FBSyxXQUFXLGFBQWEsSUFBSSxJQUFBO0lBQUE7SUFHbkMsVUFBVSxJQUFHO0FBQ1gsYUFBTyxHQUFHLFdBQVcsR0FBQSxJQUFPLEdBQUcsT0FBTyxTQUFTLFFBQUEsS0FBYSxPQUFPLFNBQVMsSUFBQSxHQUFPLEVBQUEsS0FBTztJQUFBO0lBRzVGLFdBQVcsRUFBQyxJQUFJLE1BQUEsR0FBTztBQUFFLFdBQUssV0FBVyxTQUFTLElBQUksS0FBQTtJQUFBO0lBRXRELGNBQWE7QUFBRSxhQUFPLEtBQUs7SUFBQTtJQUUzQixLQUFLLFVBQVM7QUFDWixVQUFHLEtBQUssT0FBQSxHQUFTO0FBQ2YsYUFBSyxlQUFlLEtBQUssV0FBVyxnQkFBZ0IsRUFBQyxJQUFJLEtBQUssTUFBTSxNQUFNLFVBQUEsQ0FBQTtNQUFBO0FBRTVFLFdBQUssZUFBZSxDQUFDLFdBQVc7QUFDOUIsaUJBQVMsVUFBVSxXQUFVO1FBQUE7QUFDN0IsbUJBQVcsU0FBUyxLQUFLLFdBQVcsTUFBQSxJQUFVLE9BQUE7TUFBQTtBQUVoRCxXQUFLLFdBQVcsU0FBUyxNQUFNLEVBQUMsU0FBUyxNQUFBLEdBQVEsTUFBTTtBQUNyRCxlQUFPLEtBQUssUUFBUSxLQUFBLEVBQ2pCLFFBQVEsTUFBTSxDQUFBLFNBQVE7QUFDckIsY0FBRyxDQUFDLEtBQUssWUFBQSxHQUFjO0FBQ3JCLGlCQUFLLFdBQVcsaUJBQWlCLE1BQU0sS0FBSyxPQUFPLElBQUEsQ0FBQTtVQUFBO1FBQUEsQ0FBQSxFQUd0RCxRQUFRLFNBQVMsQ0FBQSxTQUFRLENBQUMsS0FBSyxZQUFBLEtBQWlCLEtBQUssWUFBWSxJQUFBLENBQUEsRUFDakUsUUFBUSxXQUFXLE1BQU0sQ0FBQyxLQUFLLFlBQUEsS0FBaUIsS0FBSyxZQUFZLEVBQUMsUUFBUSxVQUFBLENBQUEsQ0FBQTtNQUFBLENBQUE7SUFBQTtJQUlqRixZQUFZLE1BQUs7QUFDZixVQUFHLEtBQUssV0FBVyxrQkFBa0IsS0FBSyxXQUFXLFNBQVE7QUFDM0QsYUFBSyxJQUFJLFNBQVMsTUFBTSxDQUFDLDREQUE0RCxJQUFBLENBQUE7QUFDckYsZUFBTyxLQUFLLFdBQVcsRUFBQyxJQUFJLEtBQUssS0FBQSxDQUFBO01BQUE7QUFFbkMsVUFBRyxLQUFLLFlBQVksS0FBSyxlQUFjO0FBQ3JDLGFBQUssY0FBYztBQUNuQixhQUFLLFFBQVEsTUFBQTtNQUFBO0FBRWYsVUFBRyxLQUFLLFVBQVM7QUFBRSxlQUFPLEtBQUssV0FBVyxLQUFLLFFBQUE7TUFBQTtBQUMvQyxVQUFHLEtBQUssZUFBYztBQUFFLGVBQU8sS0FBSyxlQUFlLEtBQUssYUFBQTtNQUFBO0FBQ3hELFdBQUssSUFBSSxTQUFTLE1BQU0sQ0FBQyxrQkFBa0IsSUFBQSxDQUFBO0FBQzNDLFVBQUcsS0FBSyxXQUFXLFlBQUEsR0FBYztBQUFFLGFBQUssV0FBVyxpQkFBaUIsSUFBQTtNQUFBO0lBQUE7SUFHdEUsUUFBUSxRQUFPO0FBQ2IsVUFBRyxLQUFLLFlBQUEsR0FBYztBQUFFO01BQUE7QUFDeEIsVUFBRyxLQUFLLFdBQVcsZUFBQSxLQUFvQixXQUFXLFNBQVE7QUFDeEQsZUFBTyxLQUFLLFdBQVcsaUJBQWlCLElBQUE7TUFBQTtBQUUxQyxXQUFLLG1CQUFBO0FBQ0wsV0FBSyxXQUFXLGtCQUFrQixJQUFBO0FBRWxDLFVBQUcsU0FBUyxlQUFjO0FBQUUsaUJBQVMsY0FBYyxLQUFBO01BQUE7QUFDbkQsVUFBRyxLQUFLLFdBQVcsV0FBQSxHQUFhO0FBQzlCLGFBQUssV0FBVyw0QkFBQTtNQUFBO0lBQUE7SUFJcEIsUUFBUSxRQUFPO0FBQ2IsV0FBSyxRQUFRLE1BQUE7QUFDYixVQUFHLEtBQUssV0FBVyxZQUFBLEdBQWM7QUFBRSxhQUFLLElBQUksU0FBUyxNQUFNLENBQUMsZ0JBQWdCLE1BQUEsQ0FBQTtNQUFBO0FBQzVFLFVBQUcsQ0FBQyxLQUFLLFdBQVcsV0FBQSxHQUFhO0FBQUUsYUFBSyxhQUFBO01BQUE7SUFBQTtJQUcxQyxlQUFjO0FBQ1osVUFBRyxLQUFLLE9BQUEsR0FBUztBQUFFLG9CQUFJLGNBQWMsUUFBUSwwQkFBMEIsRUFBQyxRQUFRLEVBQUMsSUFBSSxLQUFLLE1BQU0sTUFBTSxRQUFBLEVBQUEsQ0FBQTtNQUFBO0FBQ3RHLFdBQUssV0FBQTtBQUNMLFdBQUssb0JBQW9CLHdCQUF3QixlQUFBO0lBQUE7SUFHbkQsY0FBYyxjQUFjLE9BQU8sU0FBUyxVQUFVLFdBQVc7SUFBQSxHQUFJO0FBQ25FLFVBQUcsQ0FBQyxLQUFLLFlBQUEsR0FBYztBQUFFO01BQUE7QUFFekIsVUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFBLEdBQUssSUFBQSxJQUFRLGVBQWUsYUFBQSxJQUFpQixDQUFDLE1BQU0sQ0FBQSxHQUFJLENBQUEsQ0FBQTtBQUNuRSxVQUFJLGdCQUFnQixXQUFVO01BQUE7QUFDOUIsVUFBRyxLQUFLLGdCQUFpQixNQUFPLEdBQUcsYUFBYSxLQUFLLFFBQVEsZ0JBQUEsQ0FBQSxNQUF1QixNQUFPO0FBQ3pGLHdCQUFnQixLQUFLLFdBQVcsZ0JBQWdCLEVBQUMsTUFBTSxXQUFXLFFBQVEsR0FBQSxDQUFBO01BQUE7QUFHNUUsVUFBRyxPQUFRLFFBQVEsUUFBUyxVQUFTO0FBQUUsZUFBTyxRQUFRO01BQUE7QUFDdEQsYUFDRSxLQUFLLFdBQVcsU0FBUyxNQUFNLEVBQUMsU0FBUyxLQUFBLEdBQU8sTUFBTTtBQUNwRCxlQUFPLEtBQUssUUFBUSxLQUFLLE9BQU8sU0FBUyxZQUFBLEVBQWMsUUFBUSxNQUFNLENBQUEsU0FBUTtBQUMzRSxjQUFHLFFBQVEsTUFBSztBQUFFLGlCQUFLLFNBQVMsR0FBQTtVQUFBO0FBQ2hDLGNBQUksU0FBUyxDQUFDLGNBQWM7QUFDMUIsZ0JBQUcsS0FBSyxVQUFTO0FBQUUsbUJBQUssV0FBVyxLQUFLLFFBQUE7WUFBQTtBQUN4QyxnQkFBRyxLQUFLLFlBQVc7QUFBRSxtQkFBSyxZQUFZLEtBQUssVUFBQTtZQUFBO0FBQzNDLGdCQUFHLEtBQUssZUFBYztBQUFFLG1CQUFLLGVBQWUsS0FBSyxhQUFBO1lBQUE7QUFDakQsMEJBQUE7QUFDQSxvQkFBUSxNQUFNLFNBQUE7VUFBQTtBQUVoQixjQUFHLEtBQUssTUFBSztBQUNYLGlCQUFLLFdBQVcsaUJBQWlCLE1BQU07QUFDckMsa0JBQUksWUFBWSxLQUFLLFVBQVUsVUFBVSxLQUFLLE1BQU0sQ0FBQyxFQUFDLE1BQU0sT0FBQSxNQUFZO0FBQ3RFLHFCQUFLLE9BQU8sTUFBTSxNQUFBO2NBQUEsQ0FBQTtBQUVwQixxQkFBTyxTQUFBO1lBQUEsQ0FBQTtVQUFBLE9BRUo7QUFDTCxtQkFBTyxJQUFBO1VBQUE7UUFBQSxDQUFBO01BQUEsQ0FBQTtJQUFBO0lBT2pCLFNBQVMsS0FBSTtBQUNYLGtCQUFJLElBQUksVUFBVSxJQUFJLFdBQUEsS0FBZ0IsS0FBSyxFQUFBLE1BQVEsT0FBQSxLQUFZLEdBQUEsTUFBUyxDQUFBLE9BQU07QUFDNUUsWUFBSSxjQUFjLEdBQUcsYUFBYSxZQUFBO0FBRWxDLFdBQUcsZ0JBQWdCLE9BQUE7QUFDbkIsV0FBRyxnQkFBZ0IsV0FBQTtBQUVuQixZQUFHLEdBQUcsYUFBYSxZQUFBLE1BQWtCLE1BQUs7QUFDeEMsYUFBRyxXQUFXO0FBQ2QsYUFBRyxnQkFBZ0IsWUFBQTtRQUFBO0FBRXJCLFlBQUcsZ0JBQWdCLE1BQUs7QUFDdEIsYUFBRyxXQUFXLGdCQUFnQixTQUFTLE9BQU87QUFDOUMsYUFBRyxnQkFBZ0IsWUFBQTtRQUFBO0FBR3JCLDBCQUFrQixRQUFRLENBQUEsY0FBYSxZQUFJLFlBQVksSUFBSSxTQUFBLENBQUE7QUFFM0QsWUFBSSxpQkFBaUIsR0FBRyxhQUFhLHdCQUFBO0FBQ3JDLFlBQUcsbUJBQW1CLE1BQUs7QUFDekIsYUFBRyxZQUFZO0FBQ2YsYUFBRyxnQkFBZ0Isd0JBQUE7UUFBQTtBQUVyQixZQUFJLE9BQU8sWUFBSSxRQUFRLElBQUksT0FBQTtBQUMzQixZQUFHLE1BQUs7QUFDTixjQUFJLE9BQU8sS0FBSyx3QkFBd0IsSUFBSSxJQUFBO0FBQzVDLG1CQUFTLFFBQVEsSUFBSSxNQUFNLEtBQUssV0FBVyxpQkFBQSxDQUFBO0FBQzNDLGNBQUcsTUFBSztBQUFFLGlCQUFLLFVBQUE7VUFBQTtBQUNmLHNCQUFJLGNBQWMsSUFBSSxPQUFBO1FBQUE7TUFBQSxDQUFBO0lBQUE7SUFLNUIsT0FBTyxVQUFVLE9BQU8sT0FBTyxDQUFBLEdBQUc7QUFDaEMsVUFBSSxTQUFTLEtBQUs7QUFDbEIsVUFBSSxjQUFjLEtBQUssUUFBUSxnQkFBQTtBQUMvQixVQUFHLEtBQUssU0FBUTtBQUFFLG1CQUFXLFNBQVMsT0FBTyxZQUFJLElBQUksVUFBVSxLQUFLLE9BQUEsQ0FBQTtNQUFBO0FBRXBFLGVBQVMsUUFBUSxDQUFBLE9BQU07QUFDckIsV0FBRyxVQUFVLElBQUksT0FBTyxLQUFBLFVBQUE7QUFDeEIsV0FBRyxhQUFhLFNBQVMsTUFBQTtBQUN6QixXQUFHLGFBQWEsYUFBYSxLQUFLLEdBQUcsRUFBQTtBQUNyQyxZQUFJLGNBQWMsR0FBRyxhQUFhLFdBQUE7QUFDbEMsWUFBRyxnQkFBZ0IsTUFBSztBQUN0QixjQUFHLENBQUMsR0FBRyxhQUFhLHdCQUFBLEdBQTBCO0FBQzVDLGVBQUcsYUFBYSwwQkFBMEIsR0FBRyxTQUFBO1VBQUE7QUFFL0MsY0FBRyxnQkFBZ0IsSUFBRztBQUFFLGVBQUcsWUFBWTtVQUFBO0FBQ3ZDLGFBQUcsYUFBYSxZQUFZLEVBQUE7UUFBQTtNQUFBLENBQUE7QUFHaEMsYUFBTyxDQUFDLFFBQVEsVUFBVSxJQUFBO0lBQUE7SUFHNUIsWUFBWSxJQUFHO0FBQ2IsVUFBSSxNQUFNLEdBQUcsZ0JBQWdCLEdBQUcsYUFBYSxhQUFBO0FBQzdDLGFBQU8sTUFBTSxTQUFTLEdBQUEsSUFBTztJQUFBO0lBRy9CLGtCQUFrQixRQUFRLFdBQVcsT0FBTyxDQUFBLEdBQUc7QUFDN0MsVUFBRyxNQUFNLFNBQUEsR0FBVztBQUFFLGVBQU87TUFBQTtBQUU3QixVQUFJLGdCQUFnQixPQUFPLGFBQWEsS0FBSyxRQUFRLFFBQUEsQ0FBQTtBQUNyRCxVQUFHLE1BQU0sYUFBQSxHQUFlO0FBQ3RCLGVBQU8sU0FBUyxhQUFBO01BQUEsV0FDUixjQUFjLGtCQUFrQixRQUFRLEtBQUssU0FBUTtBQUM3RCxlQUFPLEtBQUssbUJBQW1CLFNBQUE7TUFBQSxPQUMxQjtBQUNMLGVBQU87TUFBQTtJQUFBO0lBSVgsbUJBQW1CLFdBQVU7QUFDM0IsVUFBRyxNQUFNLFNBQUEsR0FBVztBQUNsQixlQUFPO01BQUEsV0FDQyxXQUFVO0FBQ2xCLGVBQU8sTUFBTSxVQUFVLFFBQVEsSUFBSSxhQUFBLEdBQUEsR0FBbUIsQ0FBQSxPQUFNLEtBQUssWUFBWSxFQUFBLEtBQU8sS0FBSyxZQUFZLEVBQUEsQ0FBQTtNQUFBLE9BQ2hHO0FBQ0wsZUFBTztNQUFBO0lBQUE7SUFJWCxjQUFjLFdBQVcsT0FBTyxTQUFTLFNBQVE7QUFDL0MsVUFBRyxDQUFDLEtBQUssWUFBQSxHQUFjO0FBQ3JCLGFBQUssSUFBSSxRQUFRLE1BQU0sQ0FBQyxxREFBcUQsT0FBTyxPQUFBLENBQUE7QUFDcEYsZUFBTztNQUFBO0FBRVQsVUFBSSxDQUFDLEtBQUssS0FBSyxJQUFBLElBQVEsS0FBSyxPQUFPLENBQUEsR0FBSSxNQUFBO0FBQ3ZDLFdBQUssY0FBYyxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUEsR0FBTyxTQUFTO1FBQ2xELE1BQU07UUFDTjtRQUNBLE9BQU87UUFDUCxLQUFLLEtBQUssbUJBQW1CLFNBQUE7TUFBQSxHQUM1QixDQUFDLE1BQU0sVUFBVSxRQUFRLE9BQU8sR0FBQSxDQUFBO0FBRW5DLGFBQU87SUFBQTtJQUdULFlBQVksSUFBSSxNQUFNLE9BQU07QUFDMUIsVUFBSSxTQUFTLEtBQUssUUFBUSxRQUFBO0FBQzFCLGVBQVEsSUFBSSxHQUFHLElBQUksR0FBRyxXQUFXLFFBQVEsS0FBSTtBQUMzQyxZQUFHLENBQUMsTUFBSztBQUFFLGlCQUFPLENBQUE7UUFBQTtBQUNsQixZQUFJLE9BQU8sR0FBRyxXQUFXLENBQUEsRUFBRztBQUM1QixZQUFHLEtBQUssV0FBVyxNQUFBLEdBQVE7QUFBRSxlQUFLLEtBQUssUUFBUSxRQUFRLEVBQUEsQ0FBQSxJQUFPLEdBQUcsYUFBYSxJQUFBO1FBQUE7TUFBQTtBQUVoRixVQUFHLEdBQUcsVUFBVSxRQUFVO0FBQ3hCLFlBQUcsQ0FBQyxNQUFLO0FBQUUsaUJBQU8sQ0FBQTtRQUFBO0FBQ2xCLGFBQUssUUFBUSxHQUFHO0FBRWhCLFlBQUcsR0FBRyxZQUFZLFdBQVcsaUJBQWlCLFFBQVEsR0FBRyxJQUFBLEtBQVMsS0FBSyxDQUFDLEdBQUcsU0FBUTtBQUNqRixpQkFBTyxLQUFLO1FBQUE7TUFBQTtBQUdoQixVQUFHLE9BQU07QUFDUCxZQUFHLENBQUMsTUFBSztBQUFFLGlCQUFPLENBQUE7UUFBQTtBQUNsQixpQkFBUSxPQUFPLE9BQU07QUFBRSxlQUFLLEdBQUEsSUFBTyxNQUFNLEdBQUE7UUFBQTtNQUFBO0FBRTNDLGFBQU87SUFBQTtJQUdULFVBQVUsTUFBTSxJQUFJLFdBQVcsVUFBVSxNQUFNLE9BQU8sQ0FBQSxHQUFHO0FBQ3ZELFdBQUssY0FBYyxNQUFNLEtBQUssT0FBTyxDQUFDLEVBQUEsR0FBSyxNQUFNLElBQUEsR0FBTyxTQUFTO1FBQy9EO1FBQ0EsT0FBTztRQUNQLE9BQU8sS0FBSyxZQUFZLElBQUksTUFBTSxLQUFLLEtBQUE7UUFDdkMsS0FBSyxLQUFLLGtCQUFrQixJQUFJLFdBQVcsSUFBQTtNQUFBLENBQUE7SUFBQTtJQUkvQyxpQkFBaUIsUUFBUSxVQUFVLFVBQVUsVUFBVSxXQUFXO0lBQUEsR0FBSTtBQUNwRSxXQUFLLFdBQVcsYUFBYSxPQUFPLE1BQU0sQ0FBQyxNQUFNLGNBQWM7QUFDN0QsYUFBSyxjQUFjLE1BQU0sWUFBWTtVQUNuQyxPQUFPLE9BQU8sYUFBYSxLQUFLLFFBQVEsWUFBQSxDQUFBO1VBQ3hDLEtBQUssT0FBTyxhQUFhLGNBQUE7VUFDekIsV0FBVztVQUNYO1VBQ0EsS0FBSyxLQUFLLGtCQUFrQixPQUFPLE1BQU0sU0FBQTtRQUFBLEdBQ3hDLE9BQUE7TUFBQSxDQUFBO0lBQUE7SUFJUCxVQUFVLFNBQVMsV0FBVyxVQUFVLFVBQVUsTUFBTSxVQUFTO0FBQy9ELFVBQUk7QUFDSixVQUFJLE1BQU0sTUFBTSxRQUFBLElBQVksV0FBVyxLQUFLLGtCQUFrQixRQUFRLE1BQU0sU0FBQTtBQUM1RSxVQUFJLGVBQWUsTUFBTSxLQUFLLE9BQU8sQ0FBQyxTQUFTLFFBQVEsSUFBQSxHQUFPLFVBQVUsSUFBQTtBQUN4RSxVQUFJO0FBQ0osVUFBRyxRQUFRLGFBQWEsS0FBSyxRQUFRLFFBQUEsQ0FBQSxHQUFXO0FBQzlDLG1CQUFXLGNBQWMsUUFBUSxNQUFNLEVBQUMsU0FBUyxLQUFLLFFBQUEsR0FBVSxDQUFDLFFBQVEsSUFBQSxDQUFBO01BQUEsT0FDcEU7QUFDTCxtQkFBVyxjQUFjLFFBQVEsTUFBTSxFQUFDLFNBQVMsS0FBSyxRQUFBLENBQUE7TUFBQTtBQUV4RCxVQUFHLFlBQUksY0FBYyxPQUFBLEtBQVksUUFBUSxTQUFTLFFBQVEsTUFBTSxTQUFTLEdBQUU7QUFDekUscUJBQWEsV0FBVyxTQUFTLE1BQU0sS0FBSyxRQUFRLEtBQUEsQ0FBQTtNQUFBO0FBRXRELGdCQUFVLGFBQWEsaUJBQWlCLE9BQUE7QUFDeEMsVUFBSSxRQUFRO1FBQ1YsTUFBTTtRQUNOLE9BQU87UUFDUCxPQUFPO1FBQ1A7UUFDQTtNQUFBO0FBRUYsV0FBSyxjQUFjLGNBQWMsU0FBUyxPQUFPLENBQUEsU0FBUTtBQUN2RCxvQkFBSSxVQUFVLFNBQVMsS0FBSyxXQUFXLFFBQVEsZ0JBQUEsQ0FBQTtBQUMvQyxZQUFHLFlBQUksY0FBYyxPQUFBLEtBQVksUUFBUSxhQUFhLHNCQUFBLE1BQTRCLE1BQUs7QUFDckYsY0FBRyxhQUFhLHVCQUF1QixPQUFBLEVBQVMsU0FBUyxHQUFFO0FBQ3pELGdCQUFJLENBQUMsS0FBSyxJQUFBLElBQVEsYUFBQTtBQUNsQixpQkFBSyxZQUFZLFFBQVEsTUFBTSxXQUFXLEtBQUssS0FBSyxDQUFDLGFBQWE7QUFDaEUsMEJBQVksU0FBUyxJQUFBO0FBQ3JCLG1CQUFLLHNCQUFzQixRQUFRLElBQUE7WUFBQSxDQUFBO1VBQUE7UUFBQSxPQUdsQztBQUNMLHNCQUFZLFNBQVMsSUFBQTtRQUFBO01BQUEsQ0FBQTtJQUFBO0lBSzNCLHNCQUFzQixRQUFPO0FBQzNCLFVBQUksaUJBQWlCLEtBQUssbUJBQW1CLE1BQUE7QUFDN0MsVUFBRyxnQkFBZTtBQUNoQixZQUFJLENBQUMsS0FBSyxNQUFNLE9BQU8sUUFBQSxJQUFZO0FBQ25DLGFBQUssYUFBYSxNQUFBO0FBQ2xCLGlCQUFBO01BQUE7SUFBQTtJQUlKLG1CQUFtQixRQUFPO0FBQ3hCLGFBQU8sS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLElBQUksTUFBTSxPQUFPLFNBQUEsTUFBZSxHQUFHLFdBQVcsTUFBQSxDQUFBO0lBQUE7SUFHL0UsZUFBZSxRQUFRLEtBQUssTUFBTSxVQUFTO0FBQ3pDLFVBQUcsS0FBSyxtQkFBbUIsTUFBQSxHQUFRO0FBQUUsZUFBTztNQUFBO0FBQzVDLFdBQUssWUFBWSxLQUFLLENBQUMsUUFBUSxLQUFLLE1BQU0sUUFBQSxDQUFBO0lBQUE7SUFHNUMsYUFBYSxRQUFPO0FBQ2xCLFdBQUssY0FBYyxLQUFLLFlBQVksT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQUEsTUFBZTtBQUNuRSxZQUFHLEdBQUcsV0FBVyxNQUFBLEdBQVE7QUFDdkIsZUFBSyxTQUFTLEdBQUE7QUFDZCxpQkFBTztRQUFBLE9BQ0Y7QUFDTCxpQkFBTztRQUFBO01BQUEsQ0FBQTtJQUFBO0lBS2IsZUFBZSxRQUFRLFdBQVcsVUFBVSxNQUFNLFNBQVE7QUFDeEQsVUFBSSxnQkFBZ0IsQ0FBQSxPQUFNO0FBQ3hCLFlBQUksY0FBYyxrQkFBa0IsSUFBSSxHQUFHLEtBQUssUUFBUSxVQUFBLENBQUEsV0FBc0IsR0FBRyxJQUFBO0FBQ2pGLGVBQU8sRUFBRSxlQUFlLGtCQUFrQixJQUFJLDBCQUEwQixHQUFHLElBQUE7TUFBQTtBQUU3RSxVQUFJLGlCQUFpQixDQUFBLE9BQU07QUFDekIsZUFBTyxHQUFHLGFBQWEsS0FBSyxRQUFRLGdCQUFBLENBQUE7TUFBQTtBQUV0QyxVQUFJLGVBQWUsQ0FBQSxPQUFNLEdBQUcsV0FBVztBQUV2QyxVQUFJLGNBQWMsQ0FBQSxPQUFNLENBQUMsU0FBUyxZQUFZLFFBQUEsRUFBVSxTQUFTLEdBQUcsT0FBQTtBQUVwRSxVQUFJLGVBQWUsTUFBTTtBQUN2QixZQUFJLGVBQWUsTUFBTSxLQUFLLE9BQU8sUUFBQTtBQUNyQyxZQUFJLFdBQVcsYUFBYSxPQUFPLGNBQUE7QUFDbkMsWUFBSSxVQUFVLGFBQWEsT0FBTyxZQUFBLEVBQWMsT0FBTyxhQUFBO0FBQ3ZELFlBQUksU0FBUyxhQUFhLE9BQU8sV0FBQSxFQUFhLE9BQU8sYUFBQTtBQUVyRCxnQkFBUSxRQUFRLENBQUEsV0FBVTtBQUN4QixpQkFBTyxhQUFhLGNBQWMsT0FBTyxRQUFBO0FBQ3pDLGlCQUFPLFdBQVc7UUFBQSxDQUFBO0FBRXBCLGVBQU8sUUFBUSxDQUFBLFVBQVM7QUFDdEIsZ0JBQU0sYUFBYSxjQUFjLE1BQU0sUUFBQTtBQUN2QyxnQkFBTSxXQUFXO0FBQ2pCLGNBQUcsTUFBTSxPQUFNO0FBQ2Isa0JBQU0sYUFBYSxjQUFjLE1BQU0sUUFBQTtBQUN2QyxrQkFBTSxXQUFXO1VBQUE7UUFBQSxDQUFBO0FBR3JCLGVBQU8sYUFBYSxLQUFLLFFBQVEsZ0JBQUEsR0FBbUIsRUFBQTtBQUNwRCxlQUFPLEtBQUssT0FBTyxDQUFDLE1BQUEsRUFBUSxPQUFPLFFBQUEsRUFBVSxPQUFPLE9BQUEsRUFBUyxPQUFPLE1BQUEsR0FBUyxVQUFVLElBQUE7TUFBQTtBQUd6RixVQUFJLE1BQU0sS0FBSyxrQkFBa0IsUUFBUSxTQUFBO0FBQ3pDLFVBQUcsYUFBYSxxQkFBcUIsTUFBQSxHQUFRO0FBQzNDLFlBQUksQ0FBQyxLQUFLLElBQUEsSUFBUSxhQUFBO0FBQ2xCLFlBQUksT0FBTyxNQUFNLEtBQUssZUFBZSxRQUFRLFdBQVcsVUFBVSxNQUFNLE9BQUE7QUFDeEUsZUFBTyxLQUFLLGVBQWUsUUFBUSxLQUFLLE1BQU0sSUFBQTtNQUFBLFdBQ3RDLGFBQWEsd0JBQXdCLE1BQUEsRUFBUSxTQUFTLEdBQUU7QUFDaEUsWUFBSSxDQUFDLEtBQUssR0FBQSxJQUFPLGFBQUE7QUFDakIsWUFBSSxjQUFjLE1BQU0sQ0FBQyxLQUFLLEtBQUssSUFBQTtBQUNuQyxhQUFLLFlBQVksUUFBUSxXQUFXLEtBQUssS0FBSyxDQUFDLGFBQWE7QUFDMUQsY0FBSSxXQUFXLGNBQWMsUUFBUSxDQUFBLENBQUE7QUFDckMsZUFBSyxjQUFjLGFBQWEsU0FBUztZQUN2QyxNQUFNO1lBQ04sT0FBTztZQUNQLE9BQU87WUFDUDtVQUFBLEdBQ0MsT0FBQTtRQUFBLENBQUE7TUFBQSxPQUVBO0FBQ0wsWUFBSSxXQUFXLGNBQWMsUUFBUSxDQUFBLENBQUE7QUFDckMsYUFBSyxjQUFjLGNBQWMsU0FBUztVQUN4QyxNQUFNO1VBQ04sT0FBTztVQUNQLE9BQU87VUFDUDtRQUFBLEdBQ0MsT0FBQTtNQUFBO0lBQUE7SUFJUCxZQUFZLFFBQVEsV0FBVyxLQUFLLEtBQUssWUFBVztBQUNsRCxVQUFJLG9CQUFvQixLQUFLO0FBQzdCLFVBQUksV0FBVyxhQUFhLGlCQUFpQixNQUFBO0FBQzdDLFVBQUksMEJBQTBCLFNBQVM7QUFHdkMsZUFBUyxRQUFRLENBQUEsWUFBVztBQUMxQixZQUFJLFdBQVcsSUFBSSxhQUFhLFNBQVMsTUFBTSxNQUFNO0FBQ25EO0FBQ0EsY0FBRyw0QkFBNEIsR0FBRTtBQUFFLHVCQUFBO1VBQUE7UUFBQSxDQUFBO0FBR3JDLGFBQUssVUFBVSxPQUFBLElBQVc7QUFDMUIsWUFBSSxVQUFVLFNBQVMsUUFBQSxFQUFVLElBQUksQ0FBQSxVQUFTLE1BQU0sbUJBQUEsQ0FBQTtBQUVwRCxZQUFJLFVBQVU7VUFDWixLQUFLLFFBQVEsYUFBYSxjQUFBO1VBQzFCO1VBQ0EsS0FBSyxLQUFLLGtCQUFrQixRQUFRLE1BQU0sU0FBQTtRQUFBO0FBRzVDLGFBQUssSUFBSSxVQUFVLE1BQU0sQ0FBQyw2QkFBNkIsT0FBQSxDQUFBO0FBRXZELGFBQUssY0FBYyxNQUFNLGdCQUFnQixTQUFTLENBQUEsU0FBUTtBQUN4RCxlQUFLLElBQUksVUFBVSxNQUFNLENBQUMsMEJBQTBCLElBQUEsQ0FBQTtBQUNwRCxjQUFHLEtBQUssT0FBTTtBQUNaLGlCQUFLLFNBQVMsR0FBQTtBQUNkLGdCQUFJLENBQUMsV0FBVyxNQUFBLElBQVUsS0FBSztBQUMvQixpQkFBSyxJQUFJLFVBQVUsTUFBTSxDQUFDLG1CQUFtQixTQUFBLElBQWEsTUFBQSxDQUFBO1VBQUEsT0FDckQ7QUFDTCxnQkFBSSxVQUFVLENBQUMsYUFBYTtBQUMxQixtQkFBSyxRQUFRLFFBQVEsTUFBTTtBQUN6QixvQkFBRyxLQUFLLGNBQWMsbUJBQWtCO0FBQUUsMkJBQUE7Z0JBQUE7Y0FBQSxDQUFBO1lBQUE7QUFHOUMscUJBQVMsa0JBQWtCLE1BQU0sU0FBUyxLQUFLLFVBQUE7VUFBQTtRQUFBLENBQUE7TUFBQSxDQUFBO0lBQUE7SUFNdkQsZ0JBQWdCLE1BQU0sY0FBYTtBQUNqQyxVQUFJLFNBQVMsWUFBSSxpQkFBaUIsS0FBSyxFQUFBLEVBQUksT0FBTyxDQUFBLE9BQU0sR0FBRyxTQUFTLElBQUE7QUFDcEUsVUFBRyxPQUFPLFdBQVcsR0FBRTtBQUFFLGlCQUFTLGdEQUFnRCxJQUFBLEdBQUE7TUFBQSxXQUMxRSxPQUFPLFNBQVMsR0FBRTtBQUFFLGlCQUFTLHVEQUF1RCxJQUFBLEdBQUE7TUFBQSxPQUN2RjtBQUFFLG9CQUFJLGNBQWMsT0FBTyxDQUFBLEdBQUksbUJBQW1CLEVBQUMsUUFBUSxFQUFDLE9BQU8sYUFBQSxFQUFBLENBQUE7TUFBQTtJQUFBO0lBRzFFLGlCQUFpQixNQUFNLFFBQVEsVUFBUztBQUN0QyxXQUFLLFdBQVcsYUFBYSxNQUFNLENBQUMsTUFBTSxjQUFjO0FBQ3RELFlBQUksUUFBUSxLQUFLLFNBQVMsQ0FBQTtBQUMxQixZQUFJLFdBQVcsS0FBSyxhQUFhLEtBQUssUUFBUSxnQkFBQSxDQUFBLEtBQXNCLEtBQUssYUFBYSxLQUFLLFFBQVEsUUFBQSxDQUFBO0FBRW5HLG1CQUFHLEtBQUssVUFBVSxVQUFVLE1BQU0sT0FBTyxDQUFDLFFBQVEsRUFBQyxTQUFTLE1BQU0sTUFBTSxRQUFnQixTQUFBLENBQUEsQ0FBQTtNQUFBLENBQUE7SUFBQTtJQUk1RixjQUFjLE1BQU0sVUFBVSxVQUFTO0FBQ3JDLFVBQUksVUFBVSxLQUFLLFdBQVcsZUFBZSxJQUFBO0FBQzdDLFVBQUksU0FBUyxXQUFXLE1BQU0sS0FBSyxPQUFPLENBQUMsUUFBQSxHQUFXLE9BQUEsSUFBVztBQUNqRSxVQUFJLFdBQVcsTUFBTSxLQUFLLFdBQVcsU0FBUyxPQUFPLFNBQVMsSUFBQTtBQUU5RCxVQUFJLE9BQU8sS0FBSyxjQUFjLFFBQVEsY0FBYyxFQUFDLEtBQUssS0FBQSxHQUFPLENBQUEsU0FBUTtBQUN2RSxhQUFLLFdBQVcsaUJBQWlCLE1BQU07QUFDckMsY0FBRyxLQUFLLGVBQWM7QUFDcEIsaUJBQUssV0FBVyxZQUFZLE1BQU0sTUFBTSxVQUFVLE9BQUE7VUFBQSxPQUM3QztBQUNMLGdCQUFHLEtBQUssV0FBVyxrQkFBa0IsT0FBQSxHQUFTO0FBQzVDLG1CQUFLLE9BQU87WUFBQTtBQUVkLGlCQUFLLG9CQUFBO0FBQ0wsd0JBQVksU0FBUyxPQUFBO1VBQUE7UUFBQSxDQUFBO01BQUEsQ0FBQTtBQUszQixVQUFHLE1BQUs7QUFDTixhQUFLLFFBQVEsV0FBVyxRQUFBO01BQUEsT0FDbkI7QUFDTCxpQkFBQTtNQUFBO0lBQUE7SUFJSixpQkFBaUIsTUFBSztBQUNwQixVQUFHLEtBQUssY0FBYyxHQUFFO0FBQUUsZUFBTyxDQUFBO01BQUE7QUFFakMsVUFBSSxZQUFZLEtBQUssUUFBUSxRQUFBO0FBQzdCLFVBQUksV0FBVyxTQUFTLGNBQWMsVUFBQTtBQUN0QyxlQUFTLFlBQVk7QUFFckIsYUFDRSxZQUFJLElBQUksS0FBSyxJQUFJLFFBQVEsU0FBQSxHQUFBLEVBQ3RCLE9BQU8sQ0FBQSxTQUFRLEtBQUssTUFBTSxLQUFLLFlBQVksSUFBQSxDQUFBLEVBQzNDLE9BQU8sQ0FBQSxTQUFRLEtBQUssU0FBUyxTQUFTLENBQUEsRUFDdEMsT0FBTyxDQUFBLFNBQVEsS0FBSyxhQUFhLEtBQUssUUFBUSxnQkFBQSxDQUFBLE1BQXVCLFFBQUEsRUFDckUsSUFBSSxDQUFBLFNBQVE7QUFDWCxZQUFJLFVBQVUsU0FBUyxRQUFRLGNBQWMsWUFBWSxLQUFLLEVBQUEsTUFBUSxTQUFBLEtBQWMsS0FBSyxhQUFhLFNBQUEsQ0FBQSxJQUFBO0FBQ3RHLFlBQUcsU0FBUTtBQUNULGlCQUFPLENBQUMsTUFBTSxTQUFTLEtBQUssa0JBQWtCLE9BQUEsQ0FBQTtRQUFBLE9BQ3pDO0FBQ0wsaUJBQU8sQ0FBQyxNQUFNLE1BQU0sSUFBQTtRQUFBO01BQUEsQ0FBQSxFQUd2QixPQUFPLENBQUMsQ0FBQyxNQUFNLFNBQVMsTUFBQSxNQUFZLE9BQUE7SUFBQTtJQUkzQyw2QkFBNkIsZUFBYztBQUN6QyxVQUFJLGtCQUFrQixjQUFjLE9BQU8sQ0FBQSxRQUFPO0FBQ2hELGVBQU8sWUFBSSxzQkFBc0IsS0FBSyxJQUFJLEdBQUEsRUFBSyxXQUFXO01BQUEsQ0FBQTtBQUU1RCxVQUFHLGdCQUFnQixTQUFTLEdBQUU7QUFDNUIsYUFBSyxZQUFZLEtBQUssR0FBRyxlQUFBO0FBRXpCLGFBQUssY0FBYyxNQUFNLHFCQUFxQixFQUFDLE1BQU0sZ0JBQUEsR0FBa0IsTUFBTTtBQUczRSxlQUFLLGNBQWMsS0FBSyxZQUFZLE9BQU8sQ0FBQSxRQUFPLGdCQUFnQixRQUFRLEdBQUEsTUFBUyxFQUFBO0FBSW5GLGNBQUksd0JBQXdCLGdCQUFnQixPQUFPLENBQUEsUUFBTztBQUN4RCxtQkFBTyxZQUFJLHNCQUFzQixLQUFLLElBQUksR0FBQSxFQUFLLFdBQVc7VUFBQSxDQUFBO0FBRzVELGNBQUcsc0JBQXNCLFNBQVMsR0FBRTtBQUNsQyxpQkFBSyxjQUFjLE1BQU0sa0JBQWtCLEVBQUMsTUFBTSxzQkFBQSxHQUF3QixDQUFDLFNBQVM7QUFDbEYsbUJBQUssU0FBUyxVQUFVLEtBQUssSUFBQTtZQUFBLENBQUE7VUFBQTtRQUFBLENBQUE7TUFBQTtJQUFBO0lBT3ZDLFlBQVksSUFBRztBQUNiLGFBQU8sR0FBRyxhQUFhLGFBQUEsTUFBbUIsS0FBSyxNQUM3QyxNQUFNLEdBQUcsUUFBUSxpQkFBQSxHQUFvQixDQUFBLFNBQVEsS0FBSyxFQUFBLE1BQVEsS0FBSztJQUFBO0lBR25FLFdBQVcsTUFBTSxXQUFXLFVBQVUsT0FBTyxDQUFBLEdBQUc7QUFDOUMsa0JBQUksV0FBVyxNQUFNLG1CQUFtQixJQUFBO0FBQ3hDLFVBQUksY0FBYyxLQUFLLFdBQVcsUUFBUSxnQkFBQTtBQUMxQyxVQUFJLFNBQVMsTUFBTSxLQUFLLEtBQUssUUFBQTtBQUM3QixXQUFLLFdBQVcsa0JBQWtCLElBQUE7QUFDbEMsV0FBSyxlQUFlLE1BQU0sV0FBVyxVQUFVLE1BQU0sTUFBTTtBQUN6RCxlQUFPLFFBQVEsQ0FBQSxVQUFTLFlBQUksVUFBVSxPQUFPLFdBQUEsQ0FBQTtBQUM3QyxhQUFLLFdBQVcsNkJBQUE7TUFBQSxDQUFBO0lBQUE7SUFJcEIsUUFBUSxNQUFLO0FBQUUsYUFBTyxLQUFLLFdBQVcsUUFBUSxJQUFBO0lBQUE7RUFBQTtBQ3o5QmhELE1BQUEsYUFBQSxNQUFnQztJQUM5QixZQUFZLEtBQUssV0FBVyxPQUFPLENBQUEsR0FBRztBQUNwQyxXQUFLLFdBQVc7QUFDaEIsVUFBRyxDQUFDLGFBQWEsVUFBVSxZQUFZLFNBQVMsVUFBUztBQUN2RCxjQUFNLElBQUksTUFBTTs7Ozs7O09BQUE7TUFBQTtBQVFsQixXQUFLLFNBQVMsSUFBSSxVQUFVLEtBQUssSUFBQTtBQUNqQyxXQUFLLGdCQUFnQixLQUFLLGlCQUFpQjtBQUMzQyxXQUFLLE9BQU87QUFDWixXQUFLLFNBQVNDLFNBQVEsS0FBSyxVQUFVLENBQUEsQ0FBQTtBQUNyQyxXQUFLLGFBQWEsS0FBSztBQUN2QixXQUFLLG9CQUFvQixLQUFLLFlBQVksQ0FBQTtBQUMxQyxXQUFLLFdBQVcsT0FBTyxPQUFPLE1BQU0sUUFBQSxHQUFXLEtBQUssWUFBWSxDQUFBLENBQUE7QUFDaEUsV0FBSyxnQkFBZ0I7QUFDckIsV0FBSyxhQUFhO0FBQ2xCLFdBQUssV0FBVztBQUNoQixXQUFLLE9BQU87QUFDWixXQUFLLGlCQUFpQjtBQUN0QixXQUFLLHVCQUF1QjtBQUM1QixXQUFLLFVBQVU7QUFDZixXQUFLLFFBQVEsQ0FBQTtBQUNiLFdBQUssT0FBTyxPQUFPLFNBQVM7QUFDNUIsV0FBSyxjQUFjO0FBQ25CLFdBQUssa0JBQWtCLE1BQU0sT0FBTyxRQUFBO0FBQ3BDLFdBQUssUUFBUSxLQUFLLFNBQVMsQ0FBQTtBQUMzQixXQUFLLFlBQVksS0FBSyxhQUFhLENBQUE7QUFDbkMsV0FBSyxnQkFBZ0IsS0FBSyxpQkFBaUI7QUFDM0MsV0FBSyx3QkFBd0I7QUFDN0IsV0FBSyxhQUFhLEtBQUssY0FBYztBQUNyQyxXQUFLLGtCQUFrQixLQUFLLG1CQUFtQjtBQUMvQyxXQUFLLGtCQUFrQixLQUFLLG1CQUFtQjtBQUMvQyxXQUFLLGlCQUFpQixLQUFLLGtCQUFrQjtBQUM3QyxXQUFLLGVBQWUsS0FBSyxnQkFBZ0IsT0FBTztBQUNoRCxXQUFLLGlCQUFpQixLQUFLLGtCQUFrQixPQUFPO0FBQ3BELFdBQUssc0JBQXNCO0FBQzNCLFdBQUssZUFBZSxPQUFPLE9BQU8sRUFBQyxhQUFhQSxTQUFBLEdBQVcsbUJBQW1CQSxTQUFBLEVBQUEsR0FBWSxLQUFLLE9BQU8sQ0FBQSxDQUFBO0FBQ3RHLFdBQUssY0FBYyxJQUFJLGNBQUE7QUFDdkIsYUFBTyxpQkFBaUIsWUFBWSxDQUFBLE9BQU07QUFDeEMsYUFBSyxXQUFXO01BQUEsQ0FBQTtBQUVsQixXQUFLLE9BQU8sT0FBTyxNQUFNO0FBQ3ZCLFlBQUcsS0FBSyxXQUFBLEdBQWE7QUFFbkIsaUJBQU8sU0FBUyxPQUFBO1FBQUE7TUFBQSxDQUFBO0lBQUE7SUFPdEIsbUJBQWtCO0FBQUUsYUFBTyxLQUFLLGVBQWUsUUFBUSxjQUFBLE1BQW9CO0lBQUE7SUFFM0UsaUJBQWdCO0FBQUUsYUFBTyxLQUFLLGVBQWUsUUFBUSxZQUFBLE1BQWtCO0lBQUE7SUFFdkUsa0JBQWlCO0FBQUUsYUFBTyxLQUFLLGVBQWUsUUFBUSxZQUFBLE1BQWtCO0lBQUE7SUFFeEUsY0FBYTtBQUFFLFdBQUssZUFBZSxRQUFRLGNBQWMsTUFBQTtJQUFBO0lBRXpELGtCQUFpQjtBQUFFLFdBQUssZUFBZSxRQUFRLGdCQUFnQixNQUFBO0lBQUE7SUFFL0QsZUFBYztBQUFFLFdBQUssZUFBZSxRQUFRLGNBQWMsT0FBQTtJQUFBO0lBRTFELG1CQUFrQjtBQUFFLFdBQUssZUFBZSxXQUFXLGNBQUE7SUFBQTtJQUVuRCxpQkFBaUIsY0FBYTtBQUM1QixXQUFLLFlBQUE7QUFDTCxjQUFRLElBQUkseUdBQUE7QUFDWixXQUFLLGVBQWUsUUFBUSxvQkFBb0IsWUFBQTtJQUFBO0lBR2xELG9CQUFtQjtBQUFFLFdBQUssZUFBZSxXQUFXLGtCQUFBO0lBQUE7SUFFcEQsZ0JBQWU7QUFDYixVQUFJLE1BQU0sS0FBSyxlQUFlLFFBQVEsa0JBQUE7QUFDdEMsYUFBTyxNQUFNLFNBQVMsR0FBQSxJQUFPO0lBQUE7SUFHL0IsWUFBVztBQUFFLGFBQU8sS0FBSztJQUFBO0lBRXpCLFVBQVM7QUFFUCxVQUFHLE9BQU8sU0FBUyxhQUFhLGVBQWUsQ0FBQyxLQUFLLGdCQUFBLEdBQWtCO0FBQUUsYUFBSyxZQUFBO01BQUE7QUFDOUUsVUFBSSxZQUFZLE1BQU07QUFDcEIsWUFBRyxLQUFLLGNBQUEsR0FBZ0I7QUFDdEIsZUFBSyxtQkFBQTtBQUNMLGVBQUssT0FBTyxRQUFBO1FBQUEsV0FDSixLQUFLLE1BQUs7QUFDbEIsZUFBSyxPQUFPLFFBQUE7UUFBQTtNQUFBO0FBR2hCLFVBQUcsQ0FBQyxZQUFZLFVBQVUsYUFBQSxFQUFlLFFBQVEsU0FBUyxVQUFBLEtBQWUsR0FBRTtBQUN6RSxrQkFBQTtNQUFBLE9BQ0s7QUFDTCxpQkFBUyxpQkFBaUIsb0JBQW9CLE1BQU0sVUFBQSxDQUFBO01BQUE7SUFBQTtJQUl4RCxXQUFXLFVBQVM7QUFDbEIsbUJBQWEsS0FBSyxxQkFBQTtBQUNsQixXQUFLLE9BQU8sV0FBVyxRQUFBO0lBQUE7SUFHekIsaUJBQWlCLFdBQVU7QUFDekIsbUJBQWEsS0FBSyxxQkFBQTtBQUNsQixXQUFLLE9BQU8saUJBQWlCLFNBQUE7QUFDN0IsV0FBSyxRQUFBO0lBQUE7SUFHUCxPQUFPLElBQUksV0FBVyxZQUFZLE1BQUs7QUFDckMsV0FBSyxNQUFNLElBQUksQ0FBQSxTQUFRLFdBQUcsS0FBSyxXQUFXLFdBQVcsTUFBTSxFQUFBLENBQUE7SUFBQTtJQUs3RCxXQUFXLE1BQU0sTUFBSztBQUFFLFdBQUssYUFBYSxJQUFBLEVBQU0sR0FBRyxJQUFBO0lBQUE7SUFFbkQsS0FBSyxNQUFNLE1BQUs7QUFDZCxVQUFHLENBQUMsS0FBSyxpQkFBQSxLQUFzQixDQUFDLFFBQVEsTUFBSztBQUFFLGVBQU8sS0FBQTtNQUFBO0FBQ3RELGNBQVEsS0FBSyxJQUFBO0FBQ2IsVUFBSSxTQUFTLEtBQUE7QUFDYixjQUFRLFFBQVEsSUFBQTtBQUNoQixhQUFPO0lBQUE7SUFHVCxJQUFJLE1BQU0sTUFBTSxhQUFZO0FBQzFCLFVBQUcsS0FBSyxZQUFXO0FBQ2pCLFlBQUksQ0FBQyxLQUFLLEdBQUEsSUFBTyxZQUFBO0FBQ2pCLGFBQUssV0FBVyxNQUFNLE1BQU0sS0FBSyxHQUFBO01BQUEsV0FDekIsS0FBSyxlQUFBLEdBQWlCO0FBQzlCLFlBQUksQ0FBQyxLQUFLLEdBQUEsSUFBTyxZQUFBO0FBQ2pCLGNBQU0sTUFBTSxNQUFNLEtBQUssR0FBQTtNQUFBO0lBQUE7SUFJM0IsaUJBQWlCLFVBQVM7QUFDeEIsV0FBSyxZQUFZLE1BQU0sUUFBQTtJQUFBO0lBR3pCLFdBQVcsTUFBTSxTQUFTLFNBQVMsV0FBVTtJQUFBLEdBQUc7QUFDOUMsV0FBSyxZQUFZLGNBQWMsTUFBTSxTQUFTLE1BQUE7SUFBQTtJQUdoRCxVQUFVLFNBQVMsT0FBTyxJQUFHO0FBQzNCLGNBQVEsR0FBRyxPQUFPLENBQUEsU0FBUTtBQUN4QixZQUFJLFVBQVUsS0FBSyxjQUFBO0FBQ25CLFlBQUcsQ0FBQyxTQUFRO0FBQ1YsYUFBRyxJQUFBO1FBQUEsT0FDRTtBQUNMLGtCQUFRLElBQUksY0FBYyxPQUFBLHFDQUFBO0FBQzFCLHFCQUFXLE1BQU0sR0FBRyxJQUFBLEdBQU8sT0FBQTtRQUFBO01BQUEsQ0FBQTtJQUFBO0lBS2pDLFNBQVMsTUFBTSxNQUFNLE1BQUs7QUFDeEIsVUFBSSxVQUFVLEtBQUssY0FBQTtBQUNuQixVQUFJLGVBQWUsS0FBSztBQUN4QixVQUFHLENBQUMsU0FBUTtBQUNWLFlBQUcsS0FBSyxZQUFBLEtBQWlCLEtBQUssU0FBUTtBQUNwQyxpQkFBTyxLQUFBLEVBQU8sUUFBUSxXQUFXLE1BQU07QUFDckMsZ0JBQUcsS0FBSyxjQUFjLGdCQUFnQixDQUFDLEtBQUssWUFBQSxHQUFjO0FBQ3hELG1CQUFLLGlCQUFpQixNQUFNLE1BQU07QUFDaEMscUJBQUssSUFBSSxNQUFNLFdBQVcsTUFBTSxDQUFDLDZGQUFBLENBQUE7Y0FBQSxDQUFBO1lBQUE7VUFBQSxDQUFBO1FBQUEsT0FJbEM7QUFDTCxpQkFBTyxLQUFBO1FBQUE7TUFBQTtBQUlYLGNBQVEsSUFBSSxjQUFjLE9BQUEscUNBQUE7QUFDMUIsVUFBSSxXQUFXO1FBQ2IsVUFBVSxDQUFBO1FBQ1YsUUFBUSxNQUFNLElBQUc7QUFBRSxlQUFLLFNBQVMsS0FBSyxDQUFDLE1BQU0sRUFBQSxDQUFBO1FBQUE7TUFBQTtBQUUvQyxpQkFBVyxNQUFNO0FBQ2YsWUFBRyxLQUFLLFlBQUEsR0FBYztBQUFFO1FBQUE7QUFDeEIsaUJBQVMsU0FBUyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBQSxNQUFRLElBQUksUUFBUSxNQUFNLEVBQUEsR0FBSyxLQUFBLENBQUE7TUFBQSxHQUNwRSxPQUFBO0FBQ0gsYUFBTztJQUFBO0lBR1QsaUJBQWlCLE1BQU0sS0FBSTtBQUN6QixtQkFBYSxLQUFLLHFCQUFBO0FBQ2xCLFdBQUssV0FBQTtBQUNMLFVBQUksUUFBUSxLQUFLO0FBQ2pCLFVBQUksUUFBUSxLQUFLO0FBQ2pCLFVBQUksVUFBVSxLQUFLLE1BQU0sS0FBSyxPQUFBLEtBQVksUUFBUSxRQUFRLEVBQUEsSUFBTTtBQUNoRSxVQUFJLFFBQVEsZ0JBQVEsWUFBWSxLQUFLLGNBQWMsT0FBTyxTQUFTLFVBQVUscUJBQXFCLEdBQUcsQ0FBQSxVQUFTLFFBQVEsQ0FBQTtBQUN0SCxVQUFHLFFBQVEsS0FBSyxZQUFXO0FBQ3pCLGtCQUFVLEtBQUs7TUFBQTtBQUVqQixXQUFLLHdCQUF3QixXQUFXLE1BQU07QUFFNUMsWUFBRyxLQUFLLFlBQUEsS0FBaUIsS0FBSyxZQUFBLEdBQWM7QUFBRTtRQUFBO0FBQzlDLGFBQUssUUFBQTtBQUNMLGNBQU0sSUFBQSxJQUFRLEtBQUssSUFBSSxNQUFNLFFBQVEsTUFBTSxDQUFDLGVBQWUsS0FBQSxzQkFBQSxDQUFBO0FBQzNELFlBQUcsUUFBUSxLQUFLLFlBQVc7QUFDekIsZUFBSyxJQUFJLE1BQU0sUUFBUSxNQUFNLENBQUMsWUFBWSxLQUFLLFVBQUEsOENBQUEsQ0FBQTtRQUFBO0FBRWpELFlBQUcsS0FBSyxlQUFBLEdBQWlCO0FBQ3ZCLGlCQUFPLFdBQVcsS0FBSztRQUFBLE9BQ2xCO0FBQ0wsaUJBQU8sU0FBUyxPQUFBO1FBQUE7TUFBQSxHQUVqQixPQUFBO0lBQUE7SUFHTCxpQkFBaUIsTUFBSztBQUNwQixhQUFPLFFBQVEsS0FBSyxXQUFXLFVBQUEsSUFBYyxjQUFNLEtBQUssTUFBTSxHQUFBLEVBQUssQ0FBQSxDQUFBLElBQU0sS0FBSyxNQUFNLElBQUE7SUFBQTtJQUd0RixhQUFZO0FBQUUsYUFBTyxLQUFLO0lBQUE7SUFFMUIsY0FBYTtBQUFFLGFBQU8sS0FBSyxPQUFPLFlBQUE7SUFBQTtJQUVsQyxtQkFBa0I7QUFBRSxhQUFPLEtBQUs7SUFBQTtJQUVoQyxRQUFRLE1BQUs7QUFBRSxhQUFPLEdBQUcsS0FBSyxpQkFBQSxDQUFBLEdBQXFCLElBQUE7SUFBQTtJQUVuRCxRQUFRLE9BQU8sUUFBTztBQUFFLGFBQU8sS0FBSyxPQUFPLFFBQVEsT0FBTyxNQUFBO0lBQUE7SUFFMUQsZ0JBQWU7QUFDYixVQUFJLGFBQWE7QUFDakIsa0JBQUksSUFBSSxVQUFVLEdBQUcsaUJBQUEsU0FBMEIsYUFBQSxNQUFtQixDQUFBLFdBQVU7QUFDMUUsWUFBRyxDQUFDLEtBQUssWUFBWSxPQUFPLEVBQUEsR0FBSTtBQUM5QixjQUFJLE9BQU8sS0FBSyxZQUFZLE1BQUE7QUFDNUIsZUFBSyxRQUFRLEtBQUssUUFBQSxDQUFBO0FBQ2xCLGVBQUssS0FBQTtBQUNMLGNBQUcsT0FBTyxhQUFhLFFBQUEsR0FBVTtBQUFFLGlCQUFLLE9BQU87VUFBQTtRQUFBO0FBRWpELHFCQUFhO01BQUEsQ0FBQTtBQUVmLGFBQU87SUFBQTtJQUdULFNBQVMsSUFBSSxPQUFNO0FBQ2pCLFdBQUssV0FBQTtBQUNMLHNCQUFRLFNBQVMsSUFBSSxLQUFBO0lBQUE7SUFHdkIsWUFBWSxNQUFNLE9BQU8sV0FBVyxNQUFNLFVBQVUsS0FBSyxlQUFlLElBQUEsR0FBTTtBQUM1RSxXQUFLLGlCQUFpQixLQUFLLGtCQUFrQixLQUFLLEtBQUs7QUFDdkQsVUFBSSxZQUFZLFlBQUksVUFBVSxLQUFLLGdCQUFnQixFQUFBO0FBQ25ELFdBQUssS0FBSyxXQUFXLEtBQUssYUFBQTtBQUMxQixXQUFLLEtBQUssUUFBQTtBQUVWLFdBQUssT0FBTyxLQUFLLFlBQVksV0FBVyxLQUFBO0FBQ3hDLFdBQUssS0FBSyxZQUFZLElBQUE7QUFDdEIsV0FBSyxrQkFBQTtBQUNMLFdBQUssS0FBSyxLQUFLLENBQUMsV0FBVyxXQUFXO0FBQ3BDLFlBQUcsY0FBYyxLQUFLLEtBQUssa0JBQWtCLE9BQUEsR0FBUztBQUNwRCxlQUFLLGlCQUFpQixNQUFNO0FBQzFCLHdCQUFJLGNBQWMsUUFBQSxFQUFVLFFBQVEsQ0FBQSxPQUFNLFVBQVUsWUFBWSxFQUFBLENBQUE7QUFDaEUsaUJBQUssZUFBZSxZQUFZLFNBQUE7QUFDaEMsaUJBQUssaUJBQWlCO0FBQ3RCLHdCQUFZLHNCQUFzQixRQUFBO0FBQ2xDLG1CQUFBO1VBQUEsQ0FBQTtRQUFBO01BQUEsQ0FBQTtJQUFBO0lBTVIsa0JBQWtCLFVBQVM7QUFDekIsVUFBSSxhQUFhLEtBQUssUUFBUSxRQUFBO0FBQzlCLGlCQUFXLFlBQVksWUFBSSxJQUFJLFVBQVUsSUFBSSxVQUFBLEdBQUE7QUFDN0MsZUFBUyxRQUFRLENBQUEsT0FBTTtBQUNyQixZQUFHLFNBQVMsS0FBSyxTQUFTLEVBQUEsR0FBSTtBQUM1QixlQUFLLE9BQU8sSUFBSSxHQUFHLGFBQWEsVUFBQSxHQUFhLFFBQUE7UUFBQTtNQUFBLENBQUE7SUFBQTtJQUtuRCxVQUFVLElBQUc7QUFBRSxhQUFPLEdBQUcsZ0JBQWdCLEdBQUcsYUFBYSxXQUFBLE1BQWlCO0lBQUE7SUFFMUUsWUFBWSxJQUFJLE9BQU07QUFDcEIsVUFBSSxPQUFPLElBQUksS0FBSyxJQUFJLE1BQU0sTUFBTSxLQUFBO0FBQ3BDLFdBQUssTUFBTSxLQUFLLEVBQUEsSUFBTTtBQUN0QixhQUFPO0lBQUE7SUFHVCxNQUFNLFNBQVMsVUFBUztBQUN0QixVQUFJLE9BQU8sTUFBTSxRQUFRLFFBQVEsaUJBQUEsR0FBb0IsQ0FBQSxPQUFNLEtBQUssWUFBWSxFQUFBLENBQUEsS0FBUSxLQUFLO0FBQ3pGLFVBQUcsTUFBSztBQUFFLGlCQUFTLElBQUE7TUFBQTtJQUFBO0lBR3JCLGFBQWEsU0FBUyxVQUFTO0FBQzdCLFdBQUssTUFBTSxTQUFTLENBQUEsU0FBUSxTQUFTLE1BQU0sT0FBQSxDQUFBO0lBQUE7SUFHN0MsWUFBWSxJQUFHO0FBQ2IsVUFBSSxTQUFTLEdBQUcsYUFBYSxXQUFBO0FBQzdCLGFBQU8sTUFBTSxLQUFLLFlBQVksTUFBQSxHQUFTLENBQUEsU0FBUSxLQUFLLGtCQUFrQixFQUFBLENBQUE7SUFBQTtJQUd4RSxZQUFZLElBQUc7QUFBRSxhQUFPLEtBQUssTUFBTSxFQUFBO0lBQUE7SUFFbkMsa0JBQWlCO0FBQ2YsZUFBUSxNQUFNLEtBQUssT0FBTTtBQUN2QixhQUFLLE1BQU0sRUFBQSxFQUFJLFFBQUE7QUFDZixlQUFPLEtBQUssTUFBTSxFQUFBO01BQUE7QUFFcEIsV0FBSyxPQUFPO0lBQUE7SUFHZCxnQkFBZ0IsSUFBRztBQUNqQixVQUFJLE9BQU8sS0FBSyxZQUFZLEdBQUcsYUFBYSxXQUFBLENBQUE7QUFDNUMsVUFBRyxRQUFRLEtBQUssT0FBTyxHQUFHLElBQUc7QUFDM0IsYUFBSyxRQUFBO0FBQ0wsZUFBTyxLQUFLLE1BQU0sS0FBSyxFQUFBO01BQUEsV0FDZixNQUFLO0FBQ2IsYUFBSyxrQkFBa0IsR0FBRyxFQUFBO01BQUE7SUFBQTtJQUk5QixpQkFBaUIsUUFBTztBQUN0QixVQUFHLEtBQUssa0JBQWtCLFFBQU87QUFBRTtNQUFBO0FBQ25DLFdBQUssZ0JBQWdCO0FBQ3JCLFVBQUksU0FBUyxNQUFNO0FBQ2pCLFlBQUcsV0FBVyxLQUFLLGVBQWM7QUFBRSxlQUFLLGdCQUFnQjtRQUFBO0FBQ3hELGVBQU8sb0JBQW9CLFdBQVcsSUFBQTtBQUN0QyxlQUFPLG9CQUFvQixZQUFZLElBQUE7TUFBQTtBQUV6QyxhQUFPLGlCQUFpQixXQUFXLE1BQUE7QUFDbkMsYUFBTyxpQkFBaUIsWUFBWSxNQUFBO0lBQUE7SUFHdEMsbUJBQWtCO0FBQ2hCLFVBQUcsU0FBUyxrQkFBa0IsU0FBUyxNQUFLO0FBQzFDLGVBQU8sS0FBSyxpQkFBaUIsU0FBUztNQUFBLE9BQ2pDO0FBRUwsZUFBTyxTQUFTLGlCQUFpQixTQUFTO01BQUE7SUFBQTtJQUk5QyxrQkFBa0IsTUFBSztBQUNyQixVQUFHLEtBQUssY0FBYyxLQUFLLFlBQVksS0FBSyxVQUFBLEdBQVk7QUFDdEQsYUFBSyxhQUFhO01BQUE7SUFBQTtJQUl0QiwrQkFBOEI7QUFDNUIsVUFBRyxLQUFLLGNBQWMsS0FBSyxlQUFlLFNBQVMsTUFBSztBQUN0RCxhQUFLLFdBQVcsTUFBQTtNQUFBO0lBQUE7SUFJcEIsb0JBQW1CO0FBQ2pCLFdBQUssYUFBYSxLQUFLLGlCQUFBO0FBQ3ZCLFVBQUcsS0FBSyxlQUFlLFNBQVMsTUFBSztBQUFFLGFBQUssV0FBVyxLQUFBO01BQUE7SUFBQTtJQUd6RCxxQkFBb0I7QUFDbEIsVUFBRyxLQUFLLHFCQUFvQjtBQUFFO01BQUE7QUFFOUIsV0FBSyxzQkFBc0I7QUFFM0IsV0FBSyxPQUFPLFFBQVEsQ0FBQSxVQUFTO0FBQzNCLFlBQUcsU0FBUyxNQUFNLFNBQVMsT0FBUSxLQUFLLE1BQUs7QUFDM0MsZUFBSyxpQkFBaUIsS0FBSyxJQUFBO1FBQUE7TUFBQSxDQUFBO0FBRy9CLGVBQVMsS0FBSyxpQkFBaUIsU0FBUyxXQUFXO01BQUEsQ0FBQTtBQUNuRCxhQUFPLGlCQUFpQixZQUFZLENBQUEsTUFBSztBQUN2QyxZQUFHLEVBQUUsV0FBVTtBQUNiLGVBQUssVUFBQSxFQUFZLFdBQUE7QUFDakIsZUFBSyxnQkFBZ0IsRUFBQyxJQUFJLE9BQU8sU0FBUyxNQUFNLE1BQU0sV0FBQSxDQUFBO0FBQ3RELGlCQUFPLFNBQVMsT0FBQTtRQUFBO01BQUEsR0FFakIsSUFBQTtBQUNILFdBQUssUUFBQTtBQUNMLFdBQUssV0FBQTtBQUNMLFdBQUssVUFBQTtBQUNMLFdBQUssS0FBSyxFQUFDLE9BQU8sU0FBUyxTQUFTLFVBQUEsR0FBWSxDQUFDLEdBQUcsTUFBTSxNQUFNLFVBQVUsVUFBVSxnQkFBZ0I7QUFDbEcsWUFBSSxXQUFXLFNBQVMsYUFBYSxLQUFLLFFBQVEsT0FBQSxDQUFBO0FBQ2xELFlBQUksYUFBYSxFQUFFLE9BQU8sRUFBRSxJQUFJLFlBQUE7QUFDaEMsWUFBRyxZQUFZLFNBQVMsWUFBQSxNQUFrQixZQUFXO0FBQUU7UUFBQTtBQUV2RCxZQUFJLE9BQU8saUJBQUMsS0FBSyxFQUFFLE9BQVEsS0FBSyxVQUFVLE1BQU0sR0FBRyxRQUFBO0FBQ25ELG1CQUFHLEtBQUssTUFBTSxVQUFVLE1BQU0sVUFBVSxDQUFDLFFBQVEsRUFBQyxLQUFBLENBQUEsQ0FBQTtNQUFBLENBQUE7QUFFcEQsV0FBSyxLQUFLLEVBQUMsTUFBTSxZQUFZLE9BQU8sVUFBQSxHQUFZLENBQUMsR0FBRyxNQUFNLE1BQU0sVUFBVSxVQUFVLGdCQUFnQjtBQUNsRyxZQUFHLENBQUMsYUFBWTtBQUNkLGNBQUksT0FBTyxpQkFBQyxLQUFLLEVBQUUsT0FBUSxLQUFLLFVBQVUsTUFBTSxHQUFHLFFBQUE7QUFDbkQscUJBQUcsS0FBSyxNQUFNLFVBQVUsTUFBTSxVQUFVLENBQUMsUUFBUSxFQUFDLEtBQUEsQ0FBQSxDQUFBO1FBQUE7TUFBQSxDQUFBO0FBR3RELFdBQUssS0FBSyxFQUFDLE1BQU0sUUFBUSxPQUFPLFFBQUEsR0FBVSxDQUFDLEdBQUcsTUFBTSxNQUFNLFVBQVUsV0FBVyxVQUFVLGNBQWM7QUFFckcsWUFBRyxjQUFjLFVBQVM7QUFDeEIsY0FBSSxPQUFPLEtBQUssVUFBVSxNQUFNLEdBQUcsUUFBQTtBQUNuQyxxQkFBRyxLQUFLLE1BQU0sVUFBVSxNQUFNLFVBQVUsQ0FBQyxRQUFRLEVBQUMsS0FBQSxDQUFBLENBQUE7UUFBQTtNQUFBLENBQUE7QUFHdEQsYUFBTyxpQkFBaUIsWUFBWSxDQUFBLE1BQUssRUFBRSxlQUFBLENBQUE7QUFDM0MsYUFBTyxpQkFBaUIsUUFBUSxDQUFBLE1BQUs7QUFDbkMsVUFBRSxlQUFBO0FBQ0YsWUFBSSxlQUFlLE1BQU0sa0JBQWtCLEVBQUUsUUFBUSxLQUFLLFFBQVEsZUFBQSxDQUFBLEdBQW1CLENBQUEsZUFBYztBQUNqRyxpQkFBTyxXQUFXLGFBQWEsS0FBSyxRQUFRLGVBQUEsQ0FBQTtRQUFBLENBQUE7QUFFOUMsWUFBSSxhQUFhLGdCQUFnQixTQUFTLGVBQWUsWUFBQTtBQUN6RCxZQUFJLFFBQVEsTUFBTSxLQUFLLEVBQUUsYUFBYSxTQUFTLENBQUEsQ0FBQTtBQUMvQyxZQUFHLENBQUMsY0FBYyxXQUFXLFlBQVksTUFBTSxXQUFXLEtBQUssRUFBRSxXQUFXLGlCQUFpQixXQUFVO0FBQUU7UUFBQTtBQUV6RyxxQkFBYSxXQUFXLFlBQVksS0FBQTtBQUNwQyxtQkFBVyxjQUFjLElBQUksTUFBTSxTQUFTLEVBQUMsU0FBUyxLQUFBLENBQUEsQ0FBQTtNQUFBLENBQUE7QUFFeEQsV0FBSyxHQUFHLG1CQUFtQixDQUFBLE1BQUs7QUFDOUIsWUFBSSxlQUFlLEVBQUU7QUFDckIsWUFBRyxDQUFDLFlBQUksY0FBYyxZQUFBLEdBQWM7QUFBRTtRQUFBO0FBQ3RDLFlBQUksUUFBUSxNQUFNLEtBQUssRUFBRSxPQUFPLFNBQVMsQ0FBQSxDQUFBLEVBQUksT0FBTyxDQUFBLE1BQUssYUFBYSxRQUFRLGFBQWEsSUFBQTtBQUMzRixxQkFBYSxXQUFXLGNBQWMsS0FBQTtBQUN0QyxxQkFBYSxjQUFjLElBQUksTUFBTSxTQUFTLEVBQUMsU0FBUyxLQUFBLENBQUEsQ0FBQTtNQUFBLENBQUE7SUFBQTtJQUk1RCxVQUFVLFdBQVcsR0FBRyxVQUFTO0FBQy9CLFVBQUksV0FBVyxLQUFLLGtCQUFrQixTQUFBO0FBQ3RDLGFBQU8sV0FBVyxTQUFTLEdBQUcsUUFBQSxJQUFZLENBQUE7SUFBQTtJQUc1QyxlQUFlLE1BQUs7QUFDbEIsV0FBSztBQUNMLFdBQUssY0FBYztBQUNuQixhQUFPLEtBQUs7SUFBQTtJQUdkLGtCQUFrQixTQUFRO0FBQ3hCLFVBQUcsS0FBSyxZQUFZLFNBQVE7QUFDMUIsZUFBTztNQUFBLE9BQ0Y7QUFDTCxhQUFLLE9BQU8sS0FBSztBQUNqQixhQUFLLGNBQWM7QUFDbkIsZUFBTztNQUFBO0lBQUE7SUFJWCxVQUFTO0FBQUUsYUFBTyxLQUFLO0lBQUE7SUFFdkIsaUJBQWdCO0FBQUUsYUFBTyxDQUFDLENBQUMsS0FBSztJQUFBO0lBRWhDLEtBQUssUUFBUSxVQUFTO0FBQ3BCLGVBQVEsU0FBUyxRQUFPO0FBQ3RCLFlBQUksbUJBQW1CLE9BQU8sS0FBQTtBQUU5QixhQUFLLEdBQUcsa0JBQWtCLENBQUEsTUFBSztBQUM3QixjQUFJLFVBQVUsS0FBSyxRQUFRLEtBQUE7QUFDM0IsY0FBSSxnQkFBZ0IsS0FBSyxRQUFRLFVBQVUsS0FBQSxFQUFBO0FBQzNDLGNBQUksaUJBQWlCLEVBQUUsT0FBTyxnQkFBZ0IsRUFBRSxPQUFPLGFBQWEsT0FBQTtBQUNwRSxjQUFHLGdCQUFlO0FBQ2hCLGlCQUFLLFNBQVMsRUFBRSxRQUFRLEdBQUcsa0JBQWtCLE1BQU07QUFDakQsbUJBQUssYUFBYSxFQUFFLFFBQVEsQ0FBQSxTQUFRO0FBQ2xDLHlCQUFTLEdBQUcsT0FBTyxNQUFNLEVBQUUsUUFBUSxnQkFBZ0IsSUFBQTtjQUFBLENBQUE7WUFBQSxDQUFBO1VBQUEsT0FHbEQ7QUFDTCx3QkFBSSxJQUFJLFVBQVUsSUFBSSxhQUFBLEtBQWtCLENBQUEsT0FBTTtBQUM1QyxrQkFBSSxXQUFXLEdBQUcsYUFBYSxhQUFBO0FBQy9CLG1CQUFLLFNBQVMsSUFBSSxHQUFHLGtCQUFrQixNQUFNO0FBQzNDLHFCQUFLLGFBQWEsSUFBSSxDQUFBLFNBQVE7QUFDNUIsMkJBQVMsR0FBRyxPQUFPLE1BQU0sSUFBSSxVQUFVLFFBQUE7Z0JBQUEsQ0FBQTtjQUFBLENBQUE7WUFBQSxDQUFBO1VBQUE7UUFBQSxDQUFBO01BQUE7SUFBQTtJQVNyRCxhQUFZO0FBQ1YsYUFBTyxpQkFBaUIsYUFBYSxDQUFBLE1BQUssS0FBSyx1QkFBdUIsRUFBRSxNQUFBO0FBQ3hFLFdBQUssVUFBVSxTQUFTLFNBQVMsS0FBQTtBQUNqQyxXQUFLLFVBQVUsYUFBYSxpQkFBaUIsSUFBQTtJQUFBO0lBRy9DLFVBQVUsV0FBVyxhQUFhLFNBQVE7QUFDeEMsVUFBSSxRQUFRLEtBQUssUUFBUSxXQUFBO0FBQ3pCLGFBQU8saUJBQWlCLFdBQVcsQ0FBQSxNQUFLO0FBQ3RDLFlBQUksU0FBUztBQUNiLFlBQUcsU0FBUTtBQUNULG1CQUFTLEVBQUUsT0FBTyxRQUFRLElBQUksS0FBQSxHQUFBLElBQVksRUFBRSxTQUFTLEVBQUUsT0FBTyxjQUFjLElBQUksS0FBQSxHQUFBO1FBQUEsT0FDM0U7QUFDTCxjQUFJLHVCQUF1QixLQUFLLHdCQUF3QixFQUFFO0FBQzFELG1CQUFTLGtCQUFrQixzQkFBc0IsS0FBQTtBQUNqRCxlQUFLLGtCQUFrQixHQUFHLG9CQUFBO0FBQzFCLGVBQUssdUJBQXVCO1FBQUE7QUFFOUIsWUFBSSxXQUFXLFVBQVUsT0FBTyxhQUFhLEtBQUE7QUFDN0MsWUFBRyxDQUFDLFVBQVM7QUFBRTtRQUFBO0FBQ2YsWUFBRyxPQUFPLGFBQWEsTUFBQSxNQUFZLEtBQUk7QUFBRSxZQUFFLGVBQUE7UUFBQTtBQUUzQyxhQUFLLFNBQVMsUUFBUSxHQUFHLFNBQVMsTUFBTTtBQUN0QyxlQUFLLGFBQWEsUUFBUSxDQUFBLFNBQVE7QUFDaEMsdUJBQUcsS0FBSyxTQUFTLFVBQVUsTUFBTSxRQUFRLENBQUMsUUFBUSxFQUFDLE1BQU0sS0FBSyxVQUFVLFNBQVMsR0FBRyxNQUFBLEVBQUEsQ0FBQSxDQUFBO1VBQUEsQ0FBQTtRQUFBLENBQUE7TUFBQSxHQUd2RixPQUFBO0lBQUE7SUFHTCxrQkFBa0IsR0FBRyxnQkFBZTtBQUNsQyxVQUFJLGVBQWUsS0FBSyxRQUFRLFlBQUE7QUFDaEMsa0JBQUksSUFBSSxVQUFVLElBQUksWUFBQSxLQUFpQixDQUFBLE9BQU07QUFDM0MsWUFBRyxFQUFFLEdBQUcsV0FBVyxjQUFBLEtBQW1CLEdBQUcsU0FBUyxjQUFBLElBQWlCO0FBQ2pFLGVBQUssYUFBYSxFQUFFLFFBQVEsQ0FBQSxTQUFRO0FBQ2xDLGdCQUFJLFdBQVcsR0FBRyxhQUFhLFlBQUE7QUFDL0IsZ0JBQUcsV0FBRyxVQUFVLEVBQUEsR0FBSTtBQUNsQix5QkFBRyxLQUFLLFNBQVMsVUFBVSxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUMsTUFBTSxLQUFLLFVBQVUsU0FBUyxHQUFHLEVBQUUsTUFBQSxFQUFBLENBQUEsQ0FBQTtZQUFBO1VBQUEsQ0FBQTtRQUFBO01BQUEsQ0FBQTtJQUFBO0lBTzVGLFVBQVM7QUFDUCxVQUFHLENBQUMsZ0JBQVEsYUFBQSxHQUFlO0FBQUU7TUFBQTtBQUM3QixVQUFHLFFBQVEsbUJBQWtCO0FBQUUsZ0JBQVEsb0JBQW9CO01BQUE7QUFDM0QsVUFBSSxjQUFjO0FBQ2xCLGFBQU8saUJBQWlCLFVBQVUsQ0FBQSxPQUFNO0FBQ3RDLHFCQUFhLFdBQUE7QUFDYixzQkFBYyxXQUFXLE1BQU07QUFDN0IsMEJBQVEsbUJBQW1CLENBQUEsVUFBUyxPQUFPLE9BQU8sT0FBTyxFQUFDLFFBQVEsT0FBTyxRQUFBLENBQUEsQ0FBQTtRQUFBLEdBQ3hFLEdBQUE7TUFBQSxDQUFBO0FBRUwsYUFBTyxpQkFBaUIsWUFBWSxDQUFBLFVBQVM7QUFDM0MsWUFBRyxDQUFDLEtBQUssb0JBQW9CLE9BQU8sUUFBQSxHQUFVO0FBQUU7UUFBQTtBQUNoRCxZQUFJLEVBQUMsTUFBTSxJQUFJLE1BQU0sT0FBQSxJQUFVLE1BQU0sU0FBUyxDQUFBO0FBQzlDLFlBQUksT0FBTyxPQUFPLFNBQVM7QUFFM0IsYUFBSyxpQkFBaUIsTUFBTTtBQUMxQixjQUFHLEtBQUssS0FBSyxZQUFBLE1BQWtCLFNBQVMsV0FBVyxPQUFPLEtBQUssS0FBSyxLQUFJO0FBQ3RFLGlCQUFLLEtBQUssY0FBYyxNQUFNLElBQUE7VUFBQSxPQUN6QjtBQUNMLGlCQUFLLFlBQVksTUFBTSxNQUFNLE1BQU07QUFDakMsa0JBQUcsTUFBSztBQUFFLHFCQUFLLG1CQUFBO2NBQUE7QUFDZixrQkFBRyxPQUFPLFdBQVksVUFBUztBQUM3QiwyQkFBVyxNQUFNO0FBQ2YseUJBQU8sU0FBUyxHQUFHLE1BQUE7Z0JBQUEsR0FDbEIsQ0FBQTtjQUFBO1lBQUEsQ0FBQTtVQUFBO1FBQUEsQ0FBQTtNQUFBLEdBS1YsS0FBQTtBQUNILGFBQU8saUJBQWlCLFNBQVMsQ0FBQSxNQUFLO0FBQ3BDLFlBQUksU0FBUyxrQkFBa0IsRUFBRSxRQUFRLGFBQUE7QUFDekMsWUFBSSxPQUFPLFVBQVUsT0FBTyxhQUFhLGFBQUE7QUFDekMsWUFBSSxjQUFjLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxXQUFXO0FBQ3pELFlBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxZQUFBLEtBQWlCLENBQUMsS0FBSyxRQUFRLGFBQVk7QUFBRTtRQUFBO0FBRS9ELFlBQUksT0FBTyxPQUFPO0FBQ2xCLFlBQUksWUFBWSxPQUFPLGFBQWEsY0FBQTtBQUNwQyxVQUFFLGVBQUE7QUFDRixVQUFFLHlCQUFBO0FBQ0YsWUFBRyxLQUFLLGdCQUFnQixNQUFLO0FBQUU7UUFBQTtBQUUvQixhQUFLLGlCQUFpQixNQUFNO0FBQzFCLGNBQUcsU0FBUyxTQUFRO0FBQ2xCLGlCQUFLLGlCQUFpQixNQUFNLFdBQVcsTUFBQTtVQUFBLFdBQy9CLFNBQVMsWUFBVztBQUM1QixpQkFBSyxnQkFBZ0IsTUFBTSxTQUFBO1VBQUEsT0FDdEI7QUFDTCxrQkFBTSxJQUFJLE1BQU0sWUFBWSxhQUFBLHNDQUFtRCxJQUFBLEVBQUE7VUFBQTtRQUFBLENBQUE7TUFBQSxHQUdsRixLQUFBO0lBQUE7SUFHTCxjQUFjLE9BQU8sVUFBVSxDQUFBLEdBQUc7QUFDaEMsa0JBQUksY0FBYyxRQUFRLE9BQU8sS0FBQSxJQUFTLEVBQUMsUUFBUSxRQUFBLENBQUE7SUFBQTtJQUdyRCxlQUFlLFFBQU87QUFDcEIsYUFBTyxRQUFRLENBQUMsQ0FBQyxPQUFPLE9BQUEsTUFBYSxLQUFLLGNBQWMsT0FBTyxPQUFBLENBQUE7SUFBQTtJQUdqRSxnQkFBZ0IsTUFBTSxVQUFTO0FBQzdCLGtCQUFJLGNBQWMsUUFBUSwwQkFBMEIsRUFBQyxRQUFRLEtBQUEsQ0FBQTtBQUM3RCxVQUFJLE9BQU8sTUFBTSxZQUFJLGNBQWMsUUFBUSx5QkFBeUIsRUFBQyxRQUFRLEtBQUEsQ0FBQTtBQUM3RSxhQUFPLFdBQVcsU0FBUyxJQUFBLElBQVE7SUFBQTtJQUdyQyxpQkFBaUIsTUFBTSxXQUFXLFVBQVM7QUFDekMsV0FBSyxnQkFBZ0IsRUFBQyxJQUFJLE1BQU0sTUFBTSxRQUFBLEdBQVUsQ0FBQSxTQUFRO0FBQ3RELGFBQUssS0FBSyxjQUFjLE1BQU0sVUFBVSxDQUFBLFlBQVc7QUFDakQsZUFBSyxhQUFhLE1BQU0sV0FBVyxPQUFBO0FBQ25DLGVBQUE7UUFBQSxDQUFBO01BQUEsQ0FBQTtJQUFBO0lBS04sYUFBYSxNQUFNLFdBQVcsVUFBVSxLQUFLLGVBQWUsSUFBQSxHQUFNO0FBQ2hFLFVBQUcsQ0FBQyxLQUFLLGtCQUFrQixPQUFBLEdBQVM7QUFBRTtNQUFBO0FBRXRDLHNCQUFRLFVBQVUsV0FBVyxFQUFDLE1BQU0sU0FBUyxJQUFJLEtBQUssS0FBSyxHQUFBLEdBQUssSUFBQTtBQUNoRSxXQUFLLG9CQUFvQixPQUFPLFFBQUE7SUFBQTtJQUdsQyxnQkFBZ0IsTUFBTSxXQUFXLE9BQU07QUFDckMsVUFBSSxTQUFTLE9BQU87QUFDcEIsV0FBSyxnQkFBZ0IsRUFBQyxJQUFJLE1BQU0sTUFBTSxXQUFBLEdBQWEsQ0FBQSxTQUFRO0FBQ3pELGFBQUssWUFBWSxNQUFNLE9BQU8sTUFBTTtBQUNsQywwQkFBUSxVQUFVLFdBQVcsRUFBQyxNQUFNLFlBQVksSUFBSSxLQUFLLEtBQUssSUFBSSxPQUFBLEdBQWlCLElBQUE7QUFDbkYsZUFBSyxvQkFBb0IsT0FBTyxRQUFBO0FBQ2hDLGVBQUE7UUFBQSxDQUFBO01BQUEsQ0FBQTtJQUFBO0lBS04scUJBQW9CO0FBQ2xCLHNCQUFRLFVBQVUsV0FBVyxFQUFDLE1BQU0sTUFBTSxNQUFNLFNBQVMsSUFBSSxLQUFLLEtBQUssR0FBQSxDQUFBO0lBQUE7SUFHekUsb0JBQW9CLGFBQVk7QUFDOUIsVUFBSSxFQUFDLFVBQVUsT0FBQSxJQUFVLEtBQUs7QUFDOUIsVUFBRyxXQUFXLFdBQVcsWUFBWSxXQUFXLFlBQVksUUFBTztBQUNqRSxlQUFPO01BQUEsT0FDRjtBQUNMLGFBQUssa0JBQWtCLE1BQU0sV0FBQTtBQUM3QixlQUFPO01BQUE7SUFBQTtJQUlYLFlBQVc7QUFDVCxVQUFJLGFBQWE7QUFDakIsV0FBSyxHQUFHLFVBQVUsQ0FBQSxNQUFLO0FBQ3JCLFlBQUksV0FBVyxFQUFFLE9BQU8sYUFBYSxLQUFLLFFBQVEsUUFBQSxDQUFBO0FBQ2xELFlBQUcsQ0FBQyxVQUFTO0FBQUU7UUFBQTtBQUNmLFVBQUUsZUFBQTtBQUNGLFVBQUUsT0FBTyxXQUFXO0FBQ3BCLGFBQUssYUFBYSxFQUFFLFFBQVEsQ0FBQSxTQUFRO0FBQ2xDLHFCQUFHLEtBQUssVUFBVSxVQUFVLE1BQU0sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFBLENBQUEsQ0FBQTtRQUFBLENBQUE7TUFBQSxHQUV0RCxLQUFBO0FBRUgsZUFBUSxRQUFRLENBQUMsVUFBVSxPQUFBLEdBQVM7QUFDbEMsYUFBSyxHQUFHLE1BQU0sQ0FBQSxNQUFLO0FBQ2pCLGNBQUksWUFBWSxLQUFLLFFBQVEsUUFBQTtBQUM3QixjQUFJLFFBQVEsRUFBRTtBQUNkLGNBQUksYUFBYSxNQUFNLGFBQWEsU0FBQTtBQUNwQyxjQUFJLFlBQVksTUFBTSxRQUFRLE1BQU0sS0FBSyxhQUFhLFNBQUE7QUFDdEQsY0FBSSxXQUFXLGNBQWM7QUFDN0IsY0FBRyxDQUFDLFVBQVM7QUFBRTtVQUFBO0FBQ2YsY0FBRyxNQUFNLFNBQVMsWUFBWSxNQUFNLFlBQVksTUFBTSxTQUFTLFVBQVM7QUFBRTtVQUFBO0FBRTFFLGNBQUksYUFBYSxhQUFhLFFBQVEsTUFBTTtBQUM1QyxjQUFJLG9CQUFvQjtBQUN4QjtBQUNBLGNBQUksRUFBQyxJQUFRLE1BQU0sU0FBQSxJQUFZLFlBQUksUUFBUSxPQUFPLGdCQUFBLEtBQXFCLENBQUE7QUFFdkUsY0FBRyxPQUFPLG9CQUFvQixLQUFLLFNBQVMsVUFBUztBQUFFO1VBQUE7QUFFdkQsc0JBQUksV0FBVyxPQUFPLGtCQUFrQixFQUFDLElBQUksbUJBQW1CLEtBQUEsQ0FBQTtBQUVoRSxlQUFLLFNBQVMsT0FBTyxHQUFHLE1BQU0sTUFBTTtBQUNsQyxpQkFBSyxhQUFhLFlBQVksQ0FBQSxTQUFRO0FBQ3BDLDBCQUFJLFdBQVcsT0FBTyxpQkFBaUIsSUFBQTtBQUN2QyxrQkFBRyxDQUFDLFlBQUksZUFBZSxLQUFBLEdBQU87QUFDNUIscUJBQUssaUJBQWlCLEtBQUE7Y0FBQTtBQUV4Qix5QkFBRyxLQUFLLFVBQVUsVUFBVSxNQUFNLE9BQU8sQ0FBQyxRQUFRLEVBQUMsU0FBUyxFQUFFLE9BQU8sTUFBTSxXQUFBLENBQUEsQ0FBQTtZQUFBLENBQUE7VUFBQSxDQUFBO1FBQUEsR0FHOUUsS0FBQTtNQUFBO0lBQUE7SUFJUCxTQUFTLElBQUksT0FBTyxXQUFXLFVBQVM7QUFDdEMsVUFBRyxjQUFjLFVBQVUsY0FBYyxZQUFXO0FBQUUsZUFBTyxTQUFBO01BQUE7QUFFN0QsVUFBSSxjQUFjLEtBQUssUUFBUSxZQUFBO0FBQy9CLFVBQUksY0FBYyxLQUFLLFFBQVEsWUFBQTtBQUMvQixVQUFJLGtCQUFrQixLQUFLLFNBQVMsU0FBUyxTQUFBO0FBQzdDLFVBQUksa0JBQWtCLEtBQUssU0FBUyxTQUFTLFNBQUE7QUFFN0MsV0FBSyxhQUFhLElBQUksQ0FBQSxTQUFRO0FBQzVCLFlBQUksY0FBYyxNQUFNLENBQUMsS0FBSyxZQUFBLEtBQWlCLFNBQVMsS0FBSyxTQUFTLEVBQUE7QUFDdEUsb0JBQUksU0FBUyxJQUFJLE9BQU8sYUFBYSxpQkFBaUIsYUFBYSxpQkFBaUIsYUFBYSxNQUFNO0FBQ3JHLG1CQUFBO1FBQUEsQ0FBQTtNQUFBLENBQUE7SUFBQTtJQUtOLGNBQWMsVUFBUztBQUNyQixXQUFLLFdBQVc7QUFDaEIsZUFBQTtBQUNBLFdBQUssV0FBVztJQUFBO0lBR2xCLEdBQUcsT0FBTyxVQUFTO0FBQ2pCLGFBQU8saUJBQWlCLE9BQU8sQ0FBQSxNQUFLO0FBQ2xDLFlBQUcsQ0FBQyxLQUFLLFVBQVM7QUFBRSxtQkFBUyxDQUFBO1FBQUE7TUFBQSxDQUFBO0lBQUE7RUFBQTtBQUtuQyxNQUFBLGdCQUFBLE1BQW9CO0lBQ2xCLGNBQWE7QUFDWCxXQUFLLGNBQWMsb0JBQUksSUFBQTtBQUN2QixXQUFLLGFBQWEsQ0FBQTtBQUNsQixXQUFLLE1BQUE7SUFBQTtJQUdQLFFBQU87QUFDTCxXQUFLLFlBQVksUUFBUSxDQUFBLFVBQVM7QUFDaEMsc0JBQWMsS0FBQTtBQUNkLGFBQUssWUFBWSxPQUFPLEtBQUE7TUFBQSxDQUFBO0FBRTFCLFdBQUssZ0JBQUE7SUFBQTtJQUdQLE1BQU0sVUFBUztBQUNiLFVBQUcsS0FBSyxLQUFBLE1BQVcsR0FBRTtBQUNuQixpQkFBQTtNQUFBLE9BQ0s7QUFDTCxhQUFLLGNBQWMsUUFBQTtNQUFBO0lBQUE7SUFJdkIsY0FBYyxNQUFNLFNBQVMsUUFBTztBQUNsQyxjQUFBO0FBQ0EsVUFBSSxRQUFRLFdBQVcsTUFBTTtBQUMzQixhQUFLLFlBQVksT0FBTyxLQUFBO0FBQ3hCLGVBQUE7QUFDQSxZQUFHLEtBQUssS0FBQSxNQUFXLEdBQUU7QUFBRSxlQUFLLGdCQUFBO1FBQUE7TUFBQSxHQUMzQixJQUFBO0FBQ0gsV0FBSyxZQUFZLElBQUksS0FBQTtJQUFBO0lBR3ZCLGNBQWMsSUFBRztBQUFFLFdBQUssV0FBVyxLQUFLLEVBQUE7SUFBQTtJQUV4QyxPQUFNO0FBQUUsYUFBTyxLQUFLLFlBQVk7SUFBQTtJQUVoQyxrQkFBaUI7QUFDZixXQUFLLFdBQVcsUUFBUSxDQUFBLE9BQU0sR0FBQSxDQUFBO0FBQzlCLFdBQUssYUFBYSxDQUFBO0lBQUE7RUFBQTs7O0FoSHgwQnRCLHNCQUFtQjtBQWxCbkIsU0FBTyxJQUFJLGVBQUFJO0FBQ1gsU0FBTyxTQUFTLGVBQUFBO0FBbUJoQixNQUFJLFlBQVksU0FBUyxjQUFjLHlCQUF5QixFQUFFLGFBQWEsU0FBUztBQUN4RixNQUFJLGFBQWEsSUFBSSxXQUFXLFNBQVMsUUFBUSxFQUFDLFFBQVEsRUFBQyxhQUFhLFVBQVMsRUFBQyxDQUFDO0FBR25GLGdCQUFBQyxRQUFPLE9BQU8sRUFBQyxXQUFXLEVBQUMsR0FBRyxPQUFNLEdBQUcsYUFBYSxvQkFBbUIsQ0FBQztBQUN4RSxTQUFPLGlCQUFpQiwwQkFBMEIsVUFBUSxjQUFBQSxRQUFPLEtBQUssQ0FBQztBQUN2RSxTQUFPLGlCQUFpQix5QkFBeUIsVUFBUSxjQUFBQSxRQUFPLEtBQUssQ0FBQztBQUd0RSxhQUFXLFFBQVE7QUFNbkIsU0FBTyxhQUFhOyIsCiAgIm5hbWVzIjogWyJnbG9iYWwiLCAid2luZG93IiwgImlzRnVuY3Rpb24iLCAiaXNXaW5kb3ciLCAiZG9jdW1lbnQiLCAiZG9jIiwgInRvVHlwZSIsICJjbG9uZSIsICJhcnIiLCAicHVzaCIsICJkb2N1bWVudEVsZW1lbnQiLCAicnF1aWNrRXhwciIsICJpIiwgImZuIiwgIm1hdGNoZXMiLCAibm9kZSIsICJzdGFydCIsICJkaXIiLCAiaGFzaCIsICJmaW5kIiwgImVsZW0iLCAic2VsZiIsICJ2YWx1ZSIsICJkZWZlcnJlZCIsICJEYXRhIiwgImRhdGEiLCAibm9kZU5hbWUiLCAibmFtZSIsICJlbmQiLCAiaW5kZXgiLCAibGVuZ3RoIiwgIm1heCIsICJsb2NhdGlvbiIsICJ2YWwiLCAiY29tcGxldGVkIiwgIm9mZnNldCIsICJ0b3AiLCAibWV0aG9kIiwgInR5cGUiLCAiX3NlbGYiLCAiY2xvbmUiLCAibGFuZyIsICJQcmlzbSIsICJvZmZzZXQiLCAiaSIsICJjb250ZW50VHlwZSIsICJyZWZlcmVuY2UiLCAia2V5IiwgImFycm93IiwgInJvdW5kIiwgInJhbmdlIiwgInN0YXJ0IiwgImVuZCIsICJ3aW5kb3ciLCAiZG9jdW1lbnQiLCAidG9wYmFyIiwgImltcG9ydF9qcXVlcnkiLCAiY3JlYXRlUG9wcGVyIiwgIm5hbWUiLCAic3R5bGUiLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJnZXRDb21wdXRlZFN0eWxlIiwgIndpbmRvdyIsICJtaW4iLCAibWF4IiwgInRvUGFkZGluZ09iamVjdCIsICJwb3BwZXJPZmZzZXRzIiwgIm1pbiIsICJtYXgiLCAib2Zmc2V0IiwgImVmZmVjdCIsICJwb3BwZXIiLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJlZmZlY3QiLCAid2luZG93IiwgImhhc2giLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJnZXRDb21wdXRlZFN0eWxlIiwgImNsaXBwaW5nUGFyZW50cyIsICJnZXRDb21wdXRlZFN0eWxlIiwgInJlZmVyZW5jZSIsICJwb3BwZXJPZmZzZXRzIiwgIm9mZnNldCIsICJwbGFjZW1lbnRzIiwgInBsYWNlbWVudCIsICJwbGFjZW1lbnRzIiwgInBsYWNlbWVudCIsICJfbG9vcCIsICJfaSIsICJjaGVja3MiLCAib2Zmc2V0IiwgInBvcHBlck9mZnNldHMiLCAib2Zmc2V0IiwgIm1pbiIsICJtYXgiLCAiZm4iLCAibWVyZ2VkIiwgImRlZmF1bHRNb2RpZmllcnMiLCAiY3JlYXRlUG9wcGVyIiwgInJlZmVyZW5jZSIsICJwb3BwZXIiLCAib3B0aW9ucyIsICJmbiIsICJzdGF0ZSIsICJlZmZlY3QiLCAibm9vcEZuIiwgImNyZWF0ZVBvcHBlciIsICJkZWZhdWx0TW9kaWZpZXJzIiwgImNyZWF0ZVBvcHBlciIsICJlbGVtZW50TWFwIiwgIk1hcCIsICJzZXQiLCAiZWxlbWVudCIsICJrZXkiLCAiaW5zdGFuY2UiLCAiaGFzIiwgImluc3RhbmNlTWFwIiwgImdldCIsICJzaXplIiwgImNvbnNvbGUiLCAiZXJyb3IiLCAiQXJyYXkiLCAiZnJvbSIsICJrZXlzIiwgInJlbW92ZSIsICJkZWxldGUiLCAiTUFYX1VJRCIsICJNSUxMSVNFQ09ORFNfTVVMVElQTElFUiIsICJUUkFOU0lUSU9OX0VORCIsICJwYXJzZVNlbGVjdG9yIiwgInNlbGVjdG9yIiwgIndpbmRvdyIsICJDU1MiLCAiZXNjYXBlIiwgInJlcGxhY2UiLCAibWF0Y2giLCAiaWQiLCAidG9UeXBlIiwgIm9iamVjdCIsICJ1bmRlZmluZWQiLCAiT2JqZWN0IiwgInByb3RvdHlwZSIsICJ0b1N0cmluZyIsICJjYWxsIiwgInRvTG93ZXJDYXNlIiwgImdldFVJRCIsICJwcmVmaXgiLCAiTWF0aCIsICJmbG9vciIsICJyYW5kb20iLCAiZG9jdW1lbnQiLCAiZ2V0RWxlbWVudEJ5SWQiLCAiZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQiLCAidHJhbnNpdGlvbkR1cmF0aW9uIiwgInRyYW5zaXRpb25EZWxheSIsICJnZXRDb21wdXRlZFN0eWxlIiwgImZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uIiwgIk51bWJlciIsICJwYXJzZUZsb2F0IiwgImZsb2F0VHJhbnNpdGlvbkRlbGF5IiwgInNwbGl0IiwgInRyaWdnZXJUcmFuc2l0aW9uRW5kIiwgImRpc3BhdGNoRXZlbnQiLCAiRXZlbnQiLCAiaXNFbGVtZW50IiwgImpxdWVyeSIsICJub2RlVHlwZSIsICJnZXRFbGVtZW50IiwgImxlbmd0aCIsICJxdWVyeVNlbGVjdG9yIiwgImlzVmlzaWJsZSIsICJnZXRDbGllbnRSZWN0cyIsICJlbGVtZW50SXNWaXNpYmxlIiwgImdldFByb3BlcnR5VmFsdWUiLCAiY2xvc2VkRGV0YWlscyIsICJjbG9zZXN0IiwgInN1bW1hcnkiLCAicGFyZW50Tm9kZSIsICJpc0Rpc2FibGVkIiwgIk5vZGUiLCAiRUxFTUVOVF9OT0RFIiwgImNsYXNzTGlzdCIsICJjb250YWlucyIsICJkaXNhYmxlZCIsICJoYXNBdHRyaWJ1dGUiLCAiZ2V0QXR0cmlidXRlIiwgImZpbmRTaGFkb3dSb290IiwgImRvY3VtZW50RWxlbWVudCIsICJhdHRhY2hTaGFkb3ciLCAiZ2V0Um9vdE5vZGUiLCAicm9vdCIsICJTaGFkb3dSb290IiwgIm5vb3AiLCAicmVmbG93IiwgIm9mZnNldEhlaWdodCIsICJnZXRqUXVlcnkiLCAialF1ZXJ5IiwgImJvZHkiLCAiRE9NQ29udGVudExvYWRlZENhbGxiYWNrcyIsICJvbkRPTUNvbnRlbnRMb2FkZWQiLCAiY2FsbGJhY2siLCAicmVhZHlTdGF0ZSIsICJhZGRFdmVudExpc3RlbmVyIiwgInB1c2giLCAiaXNSVEwiLCAiZGlyIiwgImRlZmluZUpRdWVyeVBsdWdpbiIsICJwbHVnaW4iLCAiJCIsICJuYW1lIiwgIk5BTUUiLCAiSlFVRVJZX05PX0NPTkZMSUNUIiwgImZuIiwgImpRdWVyeUludGVyZmFjZSIsICJDb25zdHJ1Y3RvciIsICJub0NvbmZsaWN0IiwgImV4ZWN1dGUiLCAicG9zc2libGVDYWxsYmFjayIsICJhcmdzIiwgImRlZmF1bHRWYWx1ZSIsICJleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uIiwgInRyYW5zaXRpb25FbGVtZW50IiwgIndhaXRGb3JUcmFuc2l0aW9uIiwgImR1cmF0aW9uUGFkZGluZyIsICJlbXVsYXRlZER1cmF0aW9uIiwgImNhbGxlZCIsICJoYW5kbGVyIiwgInRhcmdldCIsICJyZW1vdmVFdmVudExpc3RlbmVyIiwgInNldFRpbWVvdXQiLCAiZ2V0TmV4dEFjdGl2ZUVsZW1lbnQiLCAibGlzdCIsICJhY3RpdmVFbGVtZW50IiwgInNob3VsZEdldE5leHQiLCAiaXNDeWNsZUFsbG93ZWQiLCAibGlzdExlbmd0aCIsICJpbmRleCIsICJpbmRleE9mIiwgIm1heCIsICJtaW4iLCAibmFtZXNwYWNlUmVnZXgiLCAic3RyaXBOYW1lUmVnZXgiLCAic3RyaXBVaWRSZWdleCIsICJldmVudFJlZ2lzdHJ5IiwgInVpZEV2ZW50IiwgImN1c3RvbUV2ZW50cyIsICJtb3VzZWVudGVyIiwgIm1vdXNlbGVhdmUiLCAibmF0aXZlRXZlbnRzIiwgIlNldCIsICJtYWtlRXZlbnRVaWQiLCAidWlkIiwgImdldEVsZW1lbnRFdmVudHMiLCAiYm9vdHN0cmFwSGFuZGxlciIsICJldmVudCIsICJoeWRyYXRlT2JqIiwgImRlbGVnYXRlVGFyZ2V0IiwgIm9uZU9mZiIsICJFdmVudEhhbmRsZXIiLCAib2ZmIiwgInR5cGUiLCAiYXBwbHkiLCAiYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIiLCAiZG9tRWxlbWVudHMiLCAicXVlcnlTZWxlY3RvckFsbCIsICJkb21FbGVtZW50IiwgImZpbmRIYW5kbGVyIiwgImV2ZW50cyIsICJjYWxsYWJsZSIsICJkZWxlZ2F0aW9uU2VsZWN0b3IiLCAidmFsdWVzIiwgImZpbmQiLCAibm9ybWFsaXplUGFyYW1ldGVycyIsICJvcmlnaW5hbFR5cGVFdmVudCIsICJkZWxlZ2F0aW9uRnVuY3Rpb24iLCAiaXNEZWxlZ2F0ZWQiLCAidHlwZUV2ZW50IiwgImdldFR5cGVFdmVudCIsICJhZGRIYW5kbGVyIiwgIndyYXBGdW5jdGlvbiIsICJyZWxhdGVkVGFyZ2V0IiwgImhhbmRsZXJzIiwgInByZXZpb3VzRnVuY3Rpb24iLCAicmVtb3ZlSGFuZGxlciIsICJCb29sZWFuIiwgInJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyIsICJuYW1lc3BhY2UiLCAic3RvcmVFbGVtZW50RXZlbnQiLCAiaGFuZGxlcktleSIsICJlbnRyaWVzIiwgImluY2x1ZGVzIiwgIm9uIiwgIm9uZSIsICJpbk5hbWVzcGFjZSIsICJpc05hbWVzcGFjZSIsICJzdGFydHNXaXRoIiwgImVsZW1lbnRFdmVudCIsICJzbGljZSIsICJrZXlIYW5kbGVycyIsICJ0cmlnZ2VyIiwgImpRdWVyeUV2ZW50IiwgImJ1YmJsZXMiLCAibmF0aXZlRGlzcGF0Y2giLCAiZGVmYXVsdFByZXZlbnRlZCIsICJpc1Byb3BhZ2F0aW9uU3RvcHBlZCIsICJpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCIsICJpc0RlZmF1bHRQcmV2ZW50ZWQiLCAiZXZ0IiwgImNhbmNlbGFibGUiLCAicHJldmVudERlZmF1bHQiLCAib2JqIiwgIm1ldGEiLCAidmFsdWUiLCAiX3VudXNlZCIsICJkZWZpbmVQcm9wZXJ0eSIsICJjb25maWd1cmFibGUiLCAibm9ybWFsaXplRGF0YSIsICJKU09OIiwgInBhcnNlIiwgImRlY29kZVVSSUNvbXBvbmVudCIsICJub3JtYWxpemVEYXRhS2V5IiwgImNociIsICJNYW5pcHVsYXRvciIsICJzZXREYXRhQXR0cmlidXRlIiwgInNldEF0dHJpYnV0ZSIsICJyZW1vdmVEYXRhQXR0cmlidXRlIiwgInJlbW92ZUF0dHJpYnV0ZSIsICJnZXREYXRhQXR0cmlidXRlcyIsICJhdHRyaWJ1dGVzIiwgImJzS2V5cyIsICJkYXRhc2V0IiwgImZpbHRlciIsICJwdXJlS2V5IiwgImNoYXJBdCIsICJnZXREYXRhQXR0cmlidXRlIiwgIkNvbmZpZyIsICJEZWZhdWx0IiwgIkRlZmF1bHRUeXBlIiwgIkVycm9yIiwgIl9nZXRDb25maWciLCAiY29uZmlnIiwgIl9tZXJnZUNvbmZpZ09iaiIsICJfY29uZmlnQWZ0ZXJNZXJnZSIsICJfdHlwZUNoZWNrQ29uZmlnIiwgImpzb25Db25maWciLCAiY29uc3RydWN0b3IiLCAiY29uZmlnVHlwZXMiLCAicHJvcGVydHkiLCAiZXhwZWN0ZWRUeXBlcyIsICJ2YWx1ZVR5cGUiLCAiUmVnRXhwIiwgInRlc3QiLCAiVHlwZUVycm9yIiwgInRvVXBwZXJDYXNlIiwgIlZFUlNJT04iLCAiQmFzZUNvbXBvbmVudCIsICJfZWxlbWVudCIsICJfY29uZmlnIiwgIkRhdGEiLCAiREFUQV9LRVkiLCAiZGlzcG9zZSIsICJFVkVOVF9LRVkiLCAicHJvcGVydHlOYW1lIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiX3F1ZXVlQ2FsbGJhY2siLCAiaXNBbmltYXRlZCIsICJnZXRJbnN0YW5jZSIsICJnZXRPckNyZWF0ZUluc3RhbmNlIiwgImV2ZW50TmFtZSIsICJnZXRTZWxlY3RvciIsICJocmVmQXR0cmlidXRlIiwgInRyaW0iLCAibWFwIiwgInNlbCIsICJqb2luIiwgIlNlbGVjdG9yRW5naW5lIiwgImNvbmNhdCIsICJFbGVtZW50IiwgImZpbmRPbmUiLCAiY2hpbGRyZW4iLCAiY2hpbGQiLCAibWF0Y2hlcyIsICJwYXJlbnRzIiwgImFuY2VzdG9yIiwgInByZXYiLCAicHJldmlvdXMiLCAicHJldmlvdXNFbGVtZW50U2libGluZyIsICJuZXh0IiwgIm5leHRFbGVtZW50U2libGluZyIsICJmb2N1c2FibGVDaGlsZHJlbiIsICJmb2N1c2FibGVzIiwgImVsIiwgImdldFNlbGVjdG9yRnJvbUVsZW1lbnQiLCAiZ2V0RWxlbWVudEZyb21TZWxlY3RvciIsICJnZXRNdWx0aXBsZUVsZW1lbnRzRnJvbVNlbGVjdG9yIiwgImVuYWJsZURpc21pc3NUcmlnZ2VyIiwgImNvbXBvbmVudCIsICJtZXRob2QiLCAiY2xpY2tFdmVudCIsICJ0YWdOYW1lIiwgIkVWRU5UX0NMT1NFIiwgIkVWRU5UX0NMT1NFRCIsICJDTEFTU19OQU1FX0ZBREUiLCAiQ0xBU1NfTkFNRV9TSE9XIiwgIkFsZXJ0IiwgImNsb3NlIiwgImNsb3NlRXZlbnQiLCAiX2Rlc3Ryb3lFbGVtZW50IiwgImVhY2giLCAiZGF0YSIsICJEQVRBX0FQSV9LRVkiLCAiQ0xBU1NfTkFNRV9BQ1RJVkUiLCAiU0VMRUNUT1JfREFUQV9UT0dHTEUiLCAiRVZFTlRfQ0xJQ0tfREFUQV9BUEkiLCAiQnV0dG9uIiwgInRvZ2dsZSIsICJidXR0b24iLCAiRVZFTlRfVE9VQ0hTVEFSVCIsICJFVkVOVF9UT1VDSE1PVkUiLCAiRVZFTlRfVE9VQ0hFTkQiLCAiRVZFTlRfUE9JTlRFUkRPV04iLCAiRVZFTlRfUE9JTlRFUlVQIiwgIlBPSU5URVJfVFlQRV9UT1VDSCIsICJQT0lOVEVSX1RZUEVfUEVOIiwgIkNMQVNTX05BTUVfUE9JTlRFUl9FVkVOVCIsICJTV0lQRV9USFJFU0hPTEQiLCAiZW5kQ2FsbGJhY2siLCAibGVmdENhbGxiYWNrIiwgInJpZ2h0Q2FsbGJhY2siLCAiU3dpcGUiLCAiaXNTdXBwb3J0ZWQiLCAiX2RlbHRhWCIsICJfc3VwcG9ydFBvaW50ZXJFdmVudHMiLCAiUG9pbnRlckV2ZW50IiwgIl9pbml0RXZlbnRzIiwgIl9zdGFydCIsICJ0b3VjaGVzIiwgImNsaWVudFgiLCAiX2V2ZW50SXNQb2ludGVyUGVuVG91Y2giLCAiX2VuZCIsICJfaGFuZGxlU3dpcGUiLCAiX21vdmUiLCAiYWJzRGVsdGFYIiwgImFicyIsICJkaXJlY3Rpb24iLCAiYWRkIiwgInBvaW50ZXJUeXBlIiwgIm5hdmlnYXRvciIsICJtYXhUb3VjaFBvaW50cyIsICJBUlJPV19MRUZUX0tFWSIsICJBUlJPV19SSUdIVF9LRVkiLCAiVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCIsICJPUkRFUl9ORVhUIiwgIk9SREVSX1BSRVYiLCAiRElSRUNUSU9OX0xFRlQiLCAiRElSRUNUSU9OX1JJR0hUIiwgIkVWRU5UX1NMSURFIiwgIkVWRU5UX1NMSUQiLCAiRVZFTlRfS0VZRE9XTiIsICJFVkVOVF9NT1VTRUVOVEVSIiwgIkVWRU5UX01PVVNFTEVBVkUiLCAiRVZFTlRfRFJBR19TVEFSVCIsICJFVkVOVF9MT0FEX0RBVEFfQVBJIiwgIkNMQVNTX05BTUVfQ0FST1VTRUwiLCAiQ0xBU1NfTkFNRV9TTElERSIsICJDTEFTU19OQU1FX0VORCIsICJDTEFTU19OQU1FX1NUQVJUIiwgIkNMQVNTX05BTUVfTkVYVCIsICJDTEFTU19OQU1FX1BSRVYiLCAiU0VMRUNUT1JfQUNUSVZFIiwgIlNFTEVDVE9SX0lURU0iLCAiU0VMRUNUT1JfQUNUSVZFX0lURU0iLCAiU0VMRUNUT1JfSVRFTV9JTUciLCAiU0VMRUNUT1JfSU5ESUNBVE9SUyIsICJTRUxFQ1RPUl9EQVRBX1NMSURFIiwgIlNFTEVDVE9SX0RBVEFfUklERSIsICJLRVlfVE9fRElSRUNUSU9OIiwgImludGVydmFsIiwgImtleWJvYXJkIiwgInBhdXNlIiwgInJpZGUiLCAidG91Y2giLCAid3JhcCIsICJDYXJvdXNlbCIsICJfaW50ZXJ2YWwiLCAiX2FjdGl2ZUVsZW1lbnQiLCAiX2lzU2xpZGluZyIsICJ0b3VjaFRpbWVvdXQiLCAiX3N3aXBlSGVscGVyIiwgIl9pbmRpY2F0b3JzRWxlbWVudCIsICJfYWRkRXZlbnRMaXN0ZW5lcnMiLCAiY3ljbGUiLCAiX3NsaWRlIiwgIm5leHRXaGVuVmlzaWJsZSIsICJoaWRkZW4iLCAiX2NsZWFySW50ZXJ2YWwiLCAiX3VwZGF0ZUludGVydmFsIiwgInNldEludGVydmFsIiwgIl9tYXliZUVuYWJsZUN5Y2xlIiwgInRvIiwgIml0ZW1zIiwgIl9nZXRJdGVtcyIsICJhY3RpdmVJbmRleCIsICJfZ2V0SXRlbUluZGV4IiwgIl9nZXRBY3RpdmUiLCAib3JkZXIiLCAiZGVmYXVsdEludGVydmFsIiwgIl9rZXlkb3duIiwgIl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzIiwgImltZyIsICJlbmRDYWxsQmFjayIsICJjbGVhclRpbWVvdXQiLCAic3dpcGVDb25maWciLCAiX2RpcmVjdGlvblRvT3JkZXIiLCAiX3NldEFjdGl2ZUluZGljYXRvckVsZW1lbnQiLCAiYWN0aXZlSW5kaWNhdG9yIiwgIm5ld0FjdGl2ZUluZGljYXRvciIsICJlbGVtZW50SW50ZXJ2YWwiLCAicGFyc2VJbnQiLCAiaXNOZXh0IiwgIm5leHRFbGVtZW50IiwgIm5leHRFbGVtZW50SW5kZXgiLCAidHJpZ2dlckV2ZW50IiwgIl9vcmRlclRvRGlyZWN0aW9uIiwgInNsaWRlRXZlbnQiLCAiaXNDeWNsaW5nIiwgImRpcmVjdGlvbmFsQ2xhc3NOYW1lIiwgIm9yZGVyQ2xhc3NOYW1lIiwgImNvbXBsZXRlQ2FsbEJhY2siLCAiX2lzQW5pbWF0ZWQiLCAiY2xlYXJJbnRlcnZhbCIsICJjYXJvdXNlbCIsICJzbGlkZUluZGV4IiwgImNhcm91c2VscyIsICJFVkVOVF9TSE9XIiwgIkVWRU5UX1NIT1dOIiwgIkVWRU5UX0hJREUiLCAiRVZFTlRfSElEREVOIiwgIkNMQVNTX05BTUVfQ09MTEFQU0UiLCAiQ0xBU1NfTkFNRV9DT0xMQVBTSU5HIiwgIkNMQVNTX05BTUVfQ09MTEFQU0VEIiwgIkNMQVNTX05BTUVfREVFUEVSX0NISUxEUkVOIiwgIkNMQVNTX05BTUVfSE9SSVpPTlRBTCIsICJXSURUSCIsICJIRUlHSFQiLCAiU0VMRUNUT1JfQUNUSVZFUyIsICJwYXJlbnQiLCAiQ29sbGFwc2UiLCAiX2lzVHJhbnNpdGlvbmluZyIsICJfdHJpZ2dlckFycmF5IiwgInRvZ2dsZUxpc3QiLCAiZWxlbSIsICJmaWx0ZXJFbGVtZW50IiwgImZvdW5kRWxlbWVudCIsICJfaW5pdGlhbGl6ZUNoaWxkcmVuIiwgIl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MiLCAiX2lzU2hvd24iLCAiaGlkZSIsICJzaG93IiwgImFjdGl2ZUNoaWxkcmVuIiwgIl9nZXRGaXJzdExldmVsQ2hpbGRyZW4iLCAic3RhcnRFdmVudCIsICJhY3RpdmVJbnN0YW5jZSIsICJkaW1lbnNpb24iLCAiX2dldERpbWVuc2lvbiIsICJzdHlsZSIsICJjb21wbGV0ZSIsICJjYXBpdGFsaXplZERpbWVuc2lvbiIsICJzY3JvbGxTaXplIiwgImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsICJzZWxlY3RlZCIsICJ0cmlnZ2VyQXJyYXkiLCAiaXNPcGVuIiwgIkVTQ0FQRV9LRVkiLCAiVEFCX0tFWSIsICJBUlJPV19VUF9LRVkiLCAiQVJST1dfRE9XTl9LRVkiLCAiUklHSFRfTU9VU0VfQlVUVE9OIiwgIkVWRU5UX0tFWURPV05fREFUQV9BUEkiLCAiRVZFTlRfS0VZVVBfREFUQV9BUEkiLCAiQ0xBU1NfTkFNRV9EUk9QVVAiLCAiQ0xBU1NfTkFNRV9EUk9QRU5EIiwgIkNMQVNTX05BTUVfRFJPUFNUQVJUIiwgIkNMQVNTX05BTUVfRFJPUFVQX0NFTlRFUiIsICJDTEFTU19OQU1FX0RST1BET1dOX0NFTlRFUiIsICJTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TSE9XTiIsICJTRUxFQ1RPUl9NRU5VIiwgIlNFTEVDVE9SX05BVkJBUiIsICJTRUxFQ1RPUl9OQVZCQVJfTkFWIiwgIlNFTEVDVE9SX1ZJU0lCTEVfSVRFTVMiLCAiUExBQ0VNRU5UX1RPUCIsICJQTEFDRU1FTlRfVE9QRU5EIiwgIlBMQUNFTUVOVF9CT1RUT00iLCAiUExBQ0VNRU5UX0JPVFRPTUVORCIsICJQTEFDRU1FTlRfUklHSFQiLCAiUExBQ0VNRU5UX0xFRlQiLCAiUExBQ0VNRU5UX1RPUENFTlRFUiIsICJQTEFDRU1FTlRfQk9UVE9NQ0VOVEVSIiwgImF1dG9DbG9zZSIsICJib3VuZGFyeSIsICJkaXNwbGF5IiwgIm9mZnNldCIsICJwb3BwZXJDb25maWciLCAicmVmZXJlbmNlIiwgIkRyb3Bkb3duIiwgIl9wb3BwZXIiLCAiX3BhcmVudCIsICJfbWVudSIsICJfaW5OYXZiYXIiLCAiX2RldGVjdE5hdmJhciIsICJzaG93RXZlbnQiLCAiX2NyZWF0ZVBvcHBlciIsICJmb2N1cyIsICJfY29tcGxldGVIaWRlIiwgImRlc3Ryb3kiLCAidXBkYXRlIiwgImhpZGVFdmVudCIsICJQb3BwZXIiLCAicmVmZXJlbmNlRWxlbWVudCIsICJfZ2V0UG9wcGVyQ29uZmlnIiwgImNyZWF0ZVBvcHBlciIsICJfZ2V0UGxhY2VtZW50IiwgInBhcmVudERyb3Bkb3duIiwgImlzRW5kIiwgIl9nZXRPZmZzZXQiLCAicG9wcGVyRGF0YSIsICJkZWZhdWx0QnNQb3BwZXJDb25maWciLCAicGxhY2VtZW50IiwgIm1vZGlmaWVycyIsICJvcHRpb25zIiwgImVuYWJsZWQiLCAiX3NlbGVjdE1lbnVJdGVtIiwgImNsZWFyTWVudXMiLCAib3BlblRvZ2dsZXMiLCAiY29udGV4dCIsICJjb21wb3NlZFBhdGgiLCAiaXNNZW51VGFyZ2V0IiwgImRhdGFBcGlLZXlkb3duSGFuZGxlciIsICJpc0lucHV0IiwgImlzRXNjYXBlRXZlbnQiLCAiaXNVcE9yRG93bkV2ZW50IiwgImdldFRvZ2dsZUJ1dHRvbiIsICJzdG9wUHJvcGFnYXRpb24iLCAiRVZFTlRfTU9VU0VET1dOIiwgImNsYXNzTmFtZSIsICJjbGlja0NhbGxiYWNrIiwgInJvb3RFbGVtZW50IiwgIkJhY2tkcm9wIiwgIl9pc0FwcGVuZGVkIiwgIl9hcHBlbmQiLCAiX2dldEVsZW1lbnQiLCAiX2VtdWxhdGVBbmltYXRpb24iLCAiYmFja2Ryb3AiLCAiY3JlYXRlRWxlbWVudCIsICJhcHBlbmQiLCAiRVZFTlRfRk9DVVNJTiIsICJFVkVOVF9LRVlET1dOX1RBQiIsICJUQUJfTkFWX0ZPUldBUkQiLCAiVEFCX05BVl9CQUNLV0FSRCIsICJhdXRvZm9jdXMiLCAidHJhcEVsZW1lbnQiLCAiRm9jdXNUcmFwIiwgIl9pc0FjdGl2ZSIsICJfbGFzdFRhYk5hdkRpcmVjdGlvbiIsICJhY3RpdmF0ZSIsICJfaGFuZGxlRm9jdXNpbiIsICJfaGFuZGxlS2V5ZG93biIsICJkZWFjdGl2YXRlIiwgImVsZW1lbnRzIiwgInNoaWZ0S2V5IiwgIlNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQiLCAiU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQiLCAiUFJPUEVSVFlfUEFERElORyIsICJQUk9QRVJUWV9NQVJHSU4iLCAiU2Nyb2xsQmFySGVscGVyIiwgImdldFdpZHRoIiwgImRvY3VtZW50V2lkdGgiLCAiY2xpZW50V2lkdGgiLCAiaW5uZXJXaWR0aCIsICJ3aWR0aCIsICJfZGlzYWJsZU92ZXJGbG93IiwgIl9zZXRFbGVtZW50QXR0cmlidXRlcyIsICJjYWxjdWxhdGVkVmFsdWUiLCAicmVzZXQiLCAiX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMiLCAiaXNPdmVyZmxvd2luZyIsICJfc2F2ZUluaXRpYWxBdHRyaWJ1dGUiLCAib3ZlcmZsb3ciLCAic3R5bGVQcm9wZXJ0eSIsICJzY3JvbGxiYXJXaWR0aCIsICJtYW5pcHVsYXRpb25DYWxsQmFjayIsICJzZXRQcm9wZXJ0eSIsICJfYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayIsICJhY3R1YWxWYWx1ZSIsICJyZW1vdmVQcm9wZXJ0eSIsICJjYWxsQmFjayIsICJFVkVOVF9ISURFX1BSRVZFTlRFRCIsICJFVkVOVF9SRVNJWkUiLCAiRVZFTlRfQ0xJQ0tfRElTTUlTUyIsICJFVkVOVF9NT1VTRURPV05fRElTTUlTUyIsICJFVkVOVF9LRVlET1dOX0RJU01JU1MiLCAiQ0xBU1NfTkFNRV9PUEVOIiwgIkNMQVNTX05BTUVfU1RBVElDIiwgIk9QRU5fU0VMRUNUT1IiLCAiU0VMRUNUT1JfRElBTE9HIiwgIlNFTEVDVE9SX01PREFMX0JPRFkiLCAiTW9kYWwiLCAiX2RpYWxvZyIsICJfYmFja2Ryb3AiLCAiX2luaXRpYWxpemVCYWNrRHJvcCIsICJfZm9jdXN0cmFwIiwgIl9pbml0aWFsaXplRm9jdXNUcmFwIiwgIl9zY3JvbGxCYXIiLCAiX2FkanVzdERpYWxvZyIsICJfc2hvd0VsZW1lbnQiLCAiX2hpZGVNb2RhbCIsICJoYW5kbGVVcGRhdGUiLCAic2Nyb2xsVG9wIiwgIm1vZGFsQm9keSIsICJ0cmFuc2l0aW9uQ29tcGxldGUiLCAiX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24iLCAiZXZlbnQyIiwgIl9yZXNldEFkanVzdG1lbnRzIiwgImlzTW9kYWxPdmVyZmxvd2luZyIsICJzY3JvbGxIZWlnaHQiLCAiY2xpZW50SGVpZ2h0IiwgImluaXRpYWxPdmVyZmxvd1kiLCAib3ZlcmZsb3dZIiwgImlzQm9keU92ZXJmbG93aW5nIiwgInBhZGRpbmdMZWZ0IiwgInBhZGRpbmdSaWdodCIsICJhbHJlYWR5T3BlbiIsICJDTEFTU19OQU1FX1NIT1dJTkciLCAiQ0xBU1NfTkFNRV9ISURJTkciLCAiQ0xBU1NfTkFNRV9CQUNLRFJPUCIsICJzY3JvbGwiLCAiT2ZmY2FudmFzIiwgImJsdXIiLCAiY29tcGxldGVDYWxsYmFjayIsICJwb3NpdGlvbiIsICJBUklBX0FUVFJJQlVURV9QQVRURVJOIiwgIkRlZmF1bHRBbGxvd2xpc3QiLCAiYSIsICJhcmVhIiwgImIiLCAiYnIiLCAiY29sIiwgImNvZGUiLCAiZGQiLCAiZGl2IiwgImRsIiwgImR0IiwgImVtIiwgImhyIiwgImgxIiwgImgyIiwgImgzIiwgImg0IiwgImg1IiwgImg2IiwgImkiLCAibGkiLCAib2wiLCAicCIsICJwcmUiLCAicyIsICJzbWFsbCIsICJzcGFuIiwgInN1YiIsICJzdXAiLCAic3Ryb25nIiwgInUiLCAidWwiLCAidXJpQXR0cmlidXRlcyIsICJTQUZFX1VSTF9QQVRURVJOIiwgImFsbG93ZWRBdHRyaWJ1dGUiLCAiYXR0cmlidXRlIiwgImFsbG93ZWRBdHRyaWJ1dGVMaXN0IiwgImF0dHJpYnV0ZU5hbWUiLCAibm9kZU5hbWUiLCAibm9kZVZhbHVlIiwgImF0dHJpYnV0ZVJlZ2V4IiwgInNvbWUiLCAicmVnZXgiLCAic2FuaXRpemVIdG1sIiwgInVuc2FmZUh0bWwiLCAiYWxsb3dMaXN0IiwgInNhbml0aXplRnVuY3Rpb24iLCAiZG9tUGFyc2VyIiwgIkRPTVBhcnNlciIsICJjcmVhdGVkRG9jdW1lbnQiLCAicGFyc2VGcm9tU3RyaW5nIiwgImVsZW1lbnROYW1lIiwgImF0dHJpYnV0ZUxpc3QiLCAiYWxsb3dlZEF0dHJpYnV0ZXMiLCAiaW5uZXJIVE1MIiwgImNvbnRlbnQiLCAiZXh0cmFDbGFzcyIsICJodG1sIiwgInNhbml0aXplIiwgInNhbml0aXplRm4iLCAidGVtcGxhdGUiLCAiRGVmYXVsdENvbnRlbnRUeXBlIiwgImVudHJ5IiwgIlRlbXBsYXRlRmFjdG9yeSIsICJnZXRDb250ZW50IiwgIl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbiIsICJoYXNDb250ZW50IiwgImNoYW5nZUNvbnRlbnQiLCAiX2NoZWNrQ29udGVudCIsICJ0b0h0bWwiLCAidGVtcGxhdGVXcmFwcGVyIiwgIl9tYXliZVNhbml0aXplIiwgInRleHQiLCAiX3NldENvbnRlbnQiLCAiYXJnIiwgInRlbXBsYXRlRWxlbWVudCIsICJfcHV0RWxlbWVudEluVGVtcGxhdGUiLCAidGV4dENvbnRlbnQiLCAiRElTQUxMT1dFRF9BVFRSSUJVVEVTIiwgIkNMQVNTX05BTUVfTU9EQUwiLCAiU0VMRUNUT1JfVE9PTFRJUF9JTk5FUiIsICJTRUxFQ1RPUl9NT0RBTCIsICJFVkVOVF9NT0RBTF9ISURFIiwgIlRSSUdHRVJfSE9WRVIiLCAiVFJJR0dFUl9GT0NVUyIsICJUUklHR0VSX0NMSUNLIiwgIlRSSUdHRVJfTUFOVUFMIiwgIkVWRU5UX0lOU0VSVEVEIiwgIkVWRU5UX0NMSUNLIiwgIkVWRU5UX0ZPQ1VTT1VUIiwgIkF0dGFjaG1lbnRNYXAiLCAiQVVUTyIsICJUT1AiLCAiUklHSFQiLCAiQk9UVE9NIiwgIkxFRlQiLCAiYW5pbWF0aW9uIiwgImNvbnRhaW5lciIsICJjdXN0b21DbGFzcyIsICJkZWxheSIsICJmYWxsYmFja1BsYWNlbWVudHMiLCAidGl0bGUiLCAiVG9vbHRpcCIsICJfaXNFbmFibGVkIiwgIl90aW1lb3V0IiwgIl9pc0hvdmVyZWQiLCAiX2FjdGl2ZVRyaWdnZXIiLCAiX3RlbXBsYXRlRmFjdG9yeSIsICJfbmV3Q29udGVudCIsICJ0aXAiLCAiX3NldExpc3RlbmVycyIsICJfZml4VGl0bGUiLCAiZW5hYmxlIiwgImRpc2FibGUiLCAidG9nZ2xlRW5hYmxlZCIsICJjbGljayIsICJfbGVhdmUiLCAiX2VudGVyIiwgIl9oaWRlTW9kYWxIYW5kbGVyIiwgIl9kaXNwb3NlUG9wcGVyIiwgIl9pc1dpdGhDb250ZW50IiwgInNoYWRvd1Jvb3QiLCAiaXNJblRoZURvbSIsICJvd25lckRvY3VtZW50IiwgIl9nZXRUaXBFbGVtZW50IiwgIl9pc1dpdGhBY3RpdmVUcmlnZ2VyIiwgIl9nZXRUaXRsZSIsICJfY3JlYXRlVGlwRWxlbWVudCIsICJfZ2V0Q29udGVudEZvclRlbXBsYXRlIiwgIl9nZXRUZW1wbGF0ZUZhY3RvcnkiLCAidGlwSWQiLCAic2V0Q29udGVudCIsICJfaW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0IiwgIl9nZXREZWxlZ2F0ZUNvbmZpZyIsICJhdHRhY2htZW50IiwgInBoYXNlIiwgInN0YXRlIiwgInRyaWdnZXJzIiwgImV2ZW50SW4iLCAiZXZlbnRPdXQiLCAiX3NldFRpbWVvdXQiLCAidGltZW91dCIsICJkYXRhQXR0cmlidXRlcyIsICJkYXRhQXR0cmlidXRlIiwgIlNFTEVDVE9SX1RJVExFIiwgIlNFTEVDVE9SX0NPTlRFTlQiLCAiUG9wb3ZlciIsICJfZ2V0Q29udGVudCIsICJFVkVOVF9BQ1RJVkFURSIsICJDTEFTU19OQU1FX0RST1BET1dOX0lURU0iLCAiU0VMRUNUT1JfREFUQV9TUFkiLCAiU0VMRUNUT1JfVEFSR0VUX0xJTktTIiwgIlNFTEVDVE9SX05BVl9MSVNUX0dST1VQIiwgIlNFTEVDVE9SX05BVl9MSU5LUyIsICJTRUxFQ1RPUl9OQVZfSVRFTVMiLCAiU0VMRUNUT1JfTElTVF9JVEVNUyIsICJTRUxFQ1RPUl9MSU5LX0lURU1TIiwgIlNFTEVDVE9SX0RST1BET1dOIiwgIlNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSIsICJyb290TWFyZ2luIiwgInNtb290aFNjcm9sbCIsICJ0aHJlc2hvbGQiLCAiU2Nyb2xsU3B5IiwgIl90YXJnZXRMaW5rcyIsICJfb2JzZXJ2YWJsZVNlY3Rpb25zIiwgIl9yb290RWxlbWVudCIsICJfYWN0aXZlVGFyZ2V0IiwgIl9vYnNlcnZlciIsICJfcHJldmlvdXNTY3JvbGxEYXRhIiwgInZpc2libGVFbnRyeVRvcCIsICJwYXJlbnRTY3JvbGxUb3AiLCAicmVmcmVzaCIsICJfaW5pdGlhbGl6ZVRhcmdldHNBbmRPYnNlcnZhYmxlcyIsICJfbWF5YmVFbmFibGVTbW9vdGhTY3JvbGwiLCAiZGlzY29ubmVjdCIsICJfZ2V0TmV3T2JzZXJ2ZXIiLCAic2VjdGlvbiIsICJvYnNlcnZlIiwgIm9ic2VydmFibGVTZWN0aW9uIiwgImhhc2giLCAiaGVpZ2h0IiwgIm9mZnNldFRvcCIsICJzY3JvbGxUbyIsICJ0b3AiLCAiYmVoYXZpb3IiLCAiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLCAiX29ic2VydmVyQ2FsbGJhY2siLCAidGFyZ2V0RWxlbWVudCIsICJfcHJvY2VzcyIsICJ1c2VyU2Nyb2xsc0Rvd24iLCAiaXNJbnRlcnNlY3RpbmciLCAiX2NsZWFyQWN0aXZlQ2xhc3MiLCAiZW50cnlJc0xvd2VyVGhhblByZXZpb3VzIiwgInRhcmdldExpbmtzIiwgImFuY2hvciIsICJkZWNvZGVVUkkiLCAiX2FjdGl2YXRlUGFyZW50cyIsICJsaXN0R3JvdXAiLCAiaXRlbSIsICJhY3RpdmVOb2RlcyIsICJub2RlIiwgInNweSIsICJIT01FX0tFWSIsICJFTkRfS0VZIiwgIkNMQVNTX0RST1BET1dOIiwgIlNFTEVDVE9SX0RST1BET1dOX01FTlUiLCAiTk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRSIsICJTRUxFQ1RPUl9UQUJfUEFORUwiLCAiU0VMRUNUT1JfT1VURVIiLCAiU0VMRUNUT1JfSU5ORVIiLCAiU0VMRUNUT1JfSU5ORVJfRUxFTSIsICJTRUxFQ1RPUl9EQVRBX1RPR0dMRV9BQ1RJVkUiLCAiVGFiIiwgIl9zZXRJbml0aWFsQXR0cmlidXRlcyIsICJfZ2V0Q2hpbGRyZW4iLCAiaW5uZXJFbGVtIiwgIl9lbGVtSXNBY3RpdmUiLCAiYWN0aXZlIiwgIl9nZXRBY3RpdmVFbGVtIiwgIl9kZWFjdGl2YXRlIiwgIl9hY3RpdmF0ZSIsICJyZWxhdGVkRWxlbSIsICJfdG9nZ2xlRHJvcERvd24iLCAibmV4dEFjdGl2ZUVsZW1lbnQiLCAicHJldmVudFNjcm9sbCIsICJfc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMiLCAiX3NldEluaXRpYWxBdHRyaWJ1dGVzT25DaGlsZCIsICJfZ2V0SW5uZXJFbGVtZW50IiwgImlzQWN0aXZlIiwgIm91dGVyRWxlbSIsICJfZ2V0T3V0ZXJFbGVtZW50IiwgIl9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwiLCAib3BlbiIsICJFVkVOVF9NT1VTRU9WRVIiLCAiRVZFTlRfTU9VU0VPVVQiLCAiQ0xBU1NfTkFNRV9ISURFIiwgImF1dG9oaWRlIiwgIlRvYXN0IiwgIl9oYXNNb3VzZUludGVyYWN0aW9uIiwgIl9oYXNLZXlib2FyZEludGVyYWN0aW9uIiwgIl9jbGVhclRpbWVvdXQiLCAiX21heWJlU2NoZWR1bGVIaWRlIiwgImlzU2hvd24iLCAiX29uSW50ZXJhY3Rpb24iLCAiaXNJbnRlcmFjdGluZyIsICIkIiwgImltcG9ydF9qcXVlcnkiLCAibWF4IiwgIiQiLCAiQ3VzdG9tRXZlbnQiLCAiY2xvc3VyZTIiLCAiZ2xvYmFsIiwgIm9mZnNldCIsICJnbG9iYWwiLCAibGl2ZVNvY2tldCIsICJjbG9zdXJlIiwgImhhc2giLCAiZGVib3VuY2UiLCAibm9vcCIsICIkIiwgInRvcGJhciJdCn0K
+//# sourceMappingURL=app.js.map