gx
chenyc
2025-06-12 7b72ac13a83764a662159d4a49b7fffb90476ecb
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
/**
 * @license
 * Copyright 2017 Google LLC. All Rights Reserved.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * =============================================================================
 */
import * as tf from './index';
import { ALL_ENVS, describeWithFlags, SYNC_BACKEND_ENVS } from './jasmine_util';
import { tensor5d } from './ops/ops';
import { Tensor } from './tensor';
import { encodeStrings, expectArraysClose, expectArraysEqual, expectNumbersClose } from './test_util';
import { encodeString } from './util';
describeWithFlags('tensor', ALL_ENVS, () => {
    it('Tensors of arbitrary size', async () => {
        // [1, 2, 3]
        let t = tf.tensor1d([1, 2, 3]);
        expect(t.rank).toBe(1);
        expect(t.size).toBe(3);
        expectArraysClose(await t.data(), [1, 2, 3]);
        // [[1, 2, 3]]
        t = tf.tensor2d([1, 2, 3], [1, 3]);
        expect(t.rank).toBe(2);
        expect(t.size).toBe(3);
        expectArraysClose(await t.data(), [1, 2, 3]);
        // [[1, 2, 3],
        //  [4, 5, 6]]
        t = tf.tensor2d([1, 2, 3, 4, 5, 6], [2, 3]);
        expect(t.rank).toBe(2);
        expect(t.size).toBe(6);
        expectArraysClose(await t.data(), [1, 2, 3, 4, 5, 6]);
        // Shape mismatch with the values.
        expect(() => tf.tensor2d([1], [1, 2])).toThrowError();
    });
    it('Tensors of explicit size', async () => {
        const t = tf.tensor1d([5, 3, 2]);
        expect(t.rank).toBe(1);
        expect(t.shape).toEqual([3]);
        // tslint:disable-next-line:no-any
        expect(() => tf.tensor3d([1, 2], [1, 2, 3, 5])).toThrowError();
        const t4 = tf.tensor4d([1, 2, 3, 4], [1, 2, 1, 2]);
        expectArraysClose(await t4.data(), [1, 2, 3, 4]);
        // Tensor of ones.
        const x = tf.ones([3, 4, 2]);
        expect(x.rank).toBe(3);
        expect(x.size).toBe(24);
        expectArraysClose(await x.data(), [
            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
        ]);
        // Tensor of zeros.
        const z = tf.zeros([3, 4, 2]);
        expect(z.rank).toBe(3);
        expect(z.size).toBe(24);
        expectArraysClose(await z.data(), [
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        ]);
    });
    it('Tensor dataSync CPU --> GPU', async () => {
        const a = tf.tensor2d([1, 2, 3, 4, 5, 6], [3, 2]);
        expectArraysClose(await a.data(), new Float32Array([1, 2, 3, 4, 5, 6]));
    });
    it('Tensor.data() CPU --> GPU', async () => {
        const a = tf.tensor2d([1, 2, 3, 4, 5, 6], [3, 2]);
        expectArraysClose(await a.data(), new Float32Array([1, 2, 3, 4, 5, 6]));
    });
    it('Tensor.data() packed CPU --> GPU', async () => {
        const a = tf.tensor2d([1, 2, 3, 4, 5, 6], [3, 2]);
        tf.matMul(a, tf.tensor2d([1, 2], [2, 1]));
        expectArraysClose(await a.data(), new Float32Array([1, 2, 3, 4, 5, 6]));
    });
    it('Scalar basic methods', async () => {
        const a = tf.scalar(5);
        expectArraysClose(await a.data(), [5]);
        expect(a.rank).toBe(0);
        expect(a.size).toBe(1);
        expect(a.shape).toEqual([]);
    });
    it('indexToLoc Scalar', async () => {
        const a = await tf.scalar(0).buffer();
        expect(a.indexToLoc(0)).toEqual([]);
        const b = await tf.zeros([]).buffer();
        expect(b.indexToLoc(0)).toEqual([]);
    });
    it('indexToLoc Tensor1D', async () => {
        const a = await tf.zeros([3]).buffer();
        expect(a.indexToLoc(0)).toEqual([0]);
        expect(a.indexToLoc(1)).toEqual([1]);
        expect(a.indexToLoc(2)).toEqual([2]);
        const b = await tf.zeros([3]).buffer();
        expect(b.indexToLoc(0)).toEqual([0]);
        expect(b.indexToLoc(1)).toEqual([1]);
        expect(b.indexToLoc(2)).toEqual([2]);
    });
    it('indexToLoc Tensor2D', async () => {
        const a = await tf.zeros([3, 2]).buffer();
        expect(a.indexToLoc(0)).toEqual([0, 0]);
        expect(a.indexToLoc(1)).toEqual([0, 1]);
        expect(a.indexToLoc(2)).toEqual([1, 0]);
        expect(a.indexToLoc(3)).toEqual([1, 1]);
        expect(a.indexToLoc(4)).toEqual([2, 0]);
        expect(a.indexToLoc(5)).toEqual([2, 1]);
        const b = await tf.zeros([3, 2]).buffer();
        expect(b.indexToLoc(0)).toEqual([0, 0]);
        expect(b.indexToLoc(1)).toEqual([0, 1]);
        expect(b.indexToLoc(2)).toEqual([1, 0]);
        expect(b.indexToLoc(3)).toEqual([1, 1]);
        expect(b.indexToLoc(4)).toEqual([2, 0]);
        expect(b.indexToLoc(5)).toEqual([2, 1]);
    });
    it('indexToLoc Tensor3D', async () => {
        const a = await tf.zeros([3, 2, 2]).buffer();
        expect(a.indexToLoc(0)).toEqual([0, 0, 0]);
        expect(a.indexToLoc(1)).toEqual([0, 0, 1]);
        expect(a.indexToLoc(2)).toEqual([0, 1, 0]);
        expect(a.indexToLoc(3)).toEqual([0, 1, 1]);
        expect(a.indexToLoc(4)).toEqual([1, 0, 0]);
        expect(a.indexToLoc(5)).toEqual([1, 0, 1]);
        expect(a.indexToLoc(11)).toEqual([2, 1, 1]);
        const b = await tf.zeros([3, 2, 2]).buffer();
        expect(b.indexToLoc(0)).toEqual([0, 0, 0]);
        expect(b.indexToLoc(1)).toEqual([0, 0, 1]);
        expect(b.indexToLoc(2)).toEqual([0, 1, 0]);
        expect(b.indexToLoc(3)).toEqual([0, 1, 1]);
        expect(b.indexToLoc(4)).toEqual([1, 0, 0]);
        expect(b.indexToLoc(5)).toEqual([1, 0, 1]);
        expect(b.indexToLoc(11)).toEqual([2, 1, 1]);
    });
    it('indexToLoc Tensor 5D', async () => {
        const values = new Float32Array([1, 2, 3, 4]);
        const a = await tensor5d(values, [2, 1, 1, 1, 2]).buffer();
        expect(a.indexToLoc(0)).toEqual([0, 0, 0, 0, 0]);
        expect(a.indexToLoc(1)).toEqual([0, 0, 0, 0, 1]);
        expect(a.indexToLoc(2)).toEqual([1, 0, 0, 0, 0]);
        expect(a.indexToLoc(3)).toEqual([1, 0, 0, 0, 1]);
    });
    it('locToIndex Scalar', async () => {
        const a = await tf.scalar(0).buffer();
        expect(a.locToIndex([])).toEqual(0);
        const b = await tf.zeros([]).buffer();
        expect(b.locToIndex([])).toEqual(0);
    });
    it('locToIndex Tensor1D', async () => {
        const a = await tf.zeros([3]).buffer();
        expect(a.locToIndex([0])).toEqual(0);
        expect(a.locToIndex([1])).toEqual(1);
        expect(a.locToIndex([2])).toEqual(2);
        const b = await tf.zeros([3]).buffer();
        expect(b.locToIndex([0])).toEqual(0);
        expect(b.locToIndex([1])).toEqual(1);
        expect(b.locToIndex([2])).toEqual(2);
    });
    it('locToIndex Tensor2D', async () => {
        const a = await tf.zeros([3, 2]).buffer();
        expect(a.locToIndex([0, 0])).toEqual(0);
        expect(a.locToIndex([0, 1])).toEqual(1);
        expect(a.locToIndex([1, 0])).toEqual(2);
        expect(a.locToIndex([1, 1])).toEqual(3);
        expect(a.locToIndex([2, 0])).toEqual(4);
        expect(a.locToIndex([2, 1])).toEqual(5);
        const b = await tf.zeros([3, 2]).buffer();
        expect(b.locToIndex([0, 0])).toEqual(0);
        expect(b.locToIndex([0, 1])).toEqual(1);
        expect(b.locToIndex([1, 0])).toEqual(2);
        expect(b.locToIndex([1, 1])).toEqual(3);
        expect(b.locToIndex([2, 0])).toEqual(4);
        expect(b.locToIndex([2, 1])).toEqual(5);
    });
    it('locToIndex Tensor3D', async () => {
        const a = await tf.zeros([3, 2, 2]).buffer();
        expect(a.locToIndex([0, 0, 0])).toEqual(0);
        expect(a.locToIndex([0, 0, 1])).toEqual(1);
        expect(a.locToIndex([0, 1, 0])).toEqual(2);
        expect(a.locToIndex([0, 1, 1])).toEqual(3);
        expect(a.locToIndex([1, 0, 0])).toEqual(4);
        expect(a.locToIndex([1, 0, 1])).toEqual(5);
        expect(a.locToIndex([2, 1, 1])).toEqual(11);
        const b = await tf.zeros([3, 2, 2]).buffer();
        expect(b.locToIndex([0, 0, 0])).toEqual(0);
        expect(b.locToIndex([0, 0, 1])).toEqual(1);
        expect(b.locToIndex([0, 1, 0])).toEqual(2);
        expect(b.locToIndex([0, 1, 1])).toEqual(3);
        expect(b.locToIndex([1, 0, 0])).toEqual(4);
        expect(b.locToIndex([1, 0, 1])).toEqual(5);
        expect(b.locToIndex([2, 1, 1])).toEqual(11);
    });
    it('Tensor assignability (asserts compiler)', () => {
        // This test asserts compilation, not doing any run-time assertion.
        const a = null;
        const b = a;
        expect(b).toBeNull();
        const a1 = null;
        const b1 = a1;
        expect(b1).toBeNull();
        const a2 = null;
        const b2 = a2;
        expect(b2).toBeNull();
        const a3 = null;
        const b3 = a3;
        expect(b3).toBeNull();
        const a4 = null;
        const b4 = a4;
        expect(b4).toBeNull();
    });
    it('tf.tensor1d() from number[]', async () => {
        const a = tf.tensor1d([1, 2, 3]);
        expectArraysClose(await a.data(), [1, 2, 3]);
    });
    it('tf.tensor1d() throw error with null input value', () => {
        expect(() => tf.tensor1d(null))
            .toThrowError('The input to the tensor constructor ' +
            'must be a non-null value.');
    });
    it('tf.tensor1d() from string[]', async () => {
        const a = tf.tensor1d(['aa', 'bb', 'cc']);
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([3]);
        expectArraysEqual(await a.data(), ['aa', 'bb', 'cc']);
    });
    it('tf.tensor1d() from encoded strings', async () => {
        const bytes = encodeStrings(['aa', 'bb', 'cc']);
        const a = tf.tensor1d(bytes, 'string');
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([3]);
        expectArraysEqual(await a.data(), ['aa', 'bb', 'cc']);
    });
    it('tf.tensor1d() from encoded strings without dtype errors', async () => {
        // We do not want to infer 'string' when the user passes Uint8Array in order
        // to be forward compatible in the future when we add uint8 dtype.
        const bytes = encodeStrings(['aa', 'bb', 'cc']);
        expect(() => tf.tensor1d(bytes)).toThrowError();
    });
    it('tf.tensor1d() from encoded strings, shape mismatch', () => {
        const bytes = encodeStrings([['aa'], ['bb'], ['cc']]);
        expect(() => tf.tensor1d(bytes)).toThrowError();
    });
    it('tf.tensor1d() from number[][], shape mismatch', () => {
        // tslint:disable-next-line:no-any
        expect(() => tf.tensor1d([[1], [2], [3]])).toThrowError();
    });
    it('tf.tensor1d() from string[][], shape mismatch', () => {
        // tslint:disable-next-line:no-any
        expect(() => tf.tensor1d([['a'], ['b'], ['c']])).toThrowError();
    });
    it('tf.tensor2d() from number[][]', async () => {
        const a = tf.tensor2d([[1, 2, 3], [4, 5, 6]], [2, 3]);
        expectArraysClose(await a.data(), [1, 2, 3, 4, 5, 6]);
    });
    it('tf.tensor2d() from string[][]', async () => {
        const a = tf.tensor2d([['aa', 'bb'], ['cc', 'dd']]);
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([2, 2]);
        expectArraysEqual(await a.data(), ['aa', 'bb', 'cc', 'dd']);
    });
    it('tf.tensor2d() from encoded strings', async () => {
        const bytes = encodeStrings([['aa', 'bb'], ['cc', 'dd']]);
        const a = tf.tensor2d(bytes, [2, 2], 'string');
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([2, 2]);
        expectArraysEqual(await a.data(), ['aa', 'bb', 'cc', 'dd']);
    });
    it('tf.tensor2d() from encoded strings without dtype errors', async () => {
        // We do not want to infer 'string' when the user passes Uint8Array in order
        // to be forward compatible in the future when we add uint8 dtype.
        const bytes = encodeStrings([['aa', 'bb'], ['cc', 'dd']]);
        expect(() => tf.tensor2d(bytes)).toThrowError();
    });
    it('tf.tensor2d() from encoded strings, shape mismatch', () => {
        const bytes = encodeStrings([['aa', 'bb'], ['cc', 'dd']]);
        expect(() => tf.tensor2d(bytes, [3, 2], 'string')).toThrowError();
    });
    it('tf.tensor2d() requires shape to be of length 2', () => {
        // tslint:disable-next-line:no-any
        const shape = [4];
        expect(() => tf.tensor2d([1, 2, 3, 4], shape)).toThrowError();
    });
    it('tf.tensor2d() from number[][], but shape does not match', () => {
        // Actual shape is [2, 3].
        expect(() => tf.tensor2d([[1, 2, 3], [4, 5, 6]], [3, 2])).toThrowError();
    });
    it('tf.tensor2d() from string[][], but shape does not match', () => {
        // Actual shape is [2, 3].
        const vals = [['a', 'b', 'c'], ['d', 'e', 'f']];
        expect(() => tf.tensor2d(vals, [3, 2])).toThrowError();
    });
    it('tf.tensor2d() from number[], but no shape throws error', () => {
        expect(() => tf.tensor2d([1, 2, 3, 4])).toThrowError();
    });
    it('tf.tensor2d() from string[], but no shape throws error', () => {
        expect(() => tf.tensor2d(['a', 'b', 'c', 'd'])).toThrowError();
    });
    it('tf.tensor2d() throw error with null input value', () => {
        expect(() => tf.tensor2d(null))
            .toThrowError('The input to the tensor constructor ' +
            'must be a non-null value.');
    });
    it('tensor3d() from number[][][]', async () => {
        const a = tf.tensor3d([[[1], [2], [3]], [[4], [5], [6]]], [2, 3, 1]);
        expectArraysClose(await a.data(), [1, 2, 3, 4, 5, 6]);
    });
    it('tensor3d() from string[][][]', async () => {
        const vals = [[['a'], ['b'], ['c']], [['d'], ['e'], ['f']]];
        const a = tf.tensor3d(vals, [2, 3, 1]);
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([2, 3, 1]);
        expectArraysEqual(await a.data(), ['a', 'b', 'c', 'd', 'e', 'f']);
    });
    it('tf.tensor3d() from encoded strings', async () => {
        const bytes = encodeStrings([[['a'], ['b'], ['c']], [['d'], ['e'], ['f']]]);
        const a = tf.tensor3d(bytes, [2, 3, 1], 'string');
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([2, 3, 1]);
        expectArraysEqual(await a.data(), ['a', 'b', 'c', 'd', 'e', 'f']);
    });
    it('tf.tensor3d() from encoded strings without dtype errors', async () => {
        // We do not want to infer 'string' when the user passes Uint8Array in order
        // to be forward compatible in the future when we add uint8 dtype.
        const bytes = encodeStrings([[['a'], ['b'], ['c']], [['d'], ['e'], ['f']]]);
        expect(() => tf.tensor3d(bytes)).toThrowError();
    });
    it('tf.tensor3d() from encoded strings, shape mismatch', () => {
        const bytes = encodeStrings([[['a'], ['b'], ['c']], [['d'], ['e'], ['f']]]);
        // Actual shape is [2, 3, 1].
        expect(() => tf.tensor3d(bytes, [3, 2, 1], 'string'))
            .toThrowError();
    });
    it('tensor3d() from number[][][], but shape does not match', () => {
        const values = [[[1], [2], [3]], [[4], [5], [6]]];
        // Actual shape is [2, 3, 1].
        expect(() => tf.tensor3d(values, [3, 2, 1])).toThrowError();
    });
    it('tf.tensor3d() from number[], but no shape throws error', () => {
        expect(() => tf.tensor3d([1, 2, 3, 4])).toThrowError();
    });
    it('tf.tensor3d() requires shape to be of length 3', () => {
        // tslint:disable-next-line:no-any
        const shape = [4, 1];
        expect(() => tf.tensor3d([1, 2, 3, 4], shape)).toThrowError();
    });
    it('tf.tensor3d() throw error with null input value', () => {
        expect(() => tf.tensor3d(null))
            .toThrowError('The input to the tensor constructor ' +
            'must be a non-null value.');
    });
    it('tensor4d() from number[][][][]', async () => {
        const a = tf.tensor4d([[[[1]], [[2]]], [[[4]], [[5]]]], [2, 2, 1, 1]);
        expectArraysClose(await a.data(), [1, 2, 4, 5]);
    });
    it('tensor4d() from string[][][][]', async () => {
        const vals = [[[['a']], [['b']]], [[['c']], [['d']]]];
        const a = tf.tensor4d(vals, [2, 2, 1, 1]);
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([2, 2, 1, 1]);
        expectArraysEqual(await a.data(), ['a', 'b', 'c', 'd']);
    });
    it('tf.tensor4d() from encoded strings', async () => {
        const bytes = encodeStrings([[[['a']], [['b']]], [[['c']], [['d']]]]);
        const a = tf.tensor4d(bytes, [2, 2, 1, 1], 'string');
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([2, 2, 1, 1]);
        expectArraysEqual(await a.data(), ['a', 'b', 'c', 'd']);
    });
    it('tf.tensor4d() from encoded strings without dtype errors', async () => {
        // We do not want to infer 'string' when the user passes Uint8Array in order
        // to be forward compatible in the future when we add uint8 dtype.
        const bytes = encodeStrings([[[['a']], [['b']]], [[['c']], [['d']]]]);
        expect(() => tf.tensor4d(bytes)).toThrowError();
    });
    it('tf.tensor4d() from encoded strings, shape mismatch', () => {
        const bytes = encodeStrings([[[['a']], [['b']]], [[['c']], [['d']]]]);
        // Actual shape is [2, 2, 1. 1].
        expect(() => tf.tensor4d(bytes, [2, 1, 2, 1], 'string'))
            .toThrowError();
    });
    it('tensor4d() from string[][][][] infer shape', async () => {
        const vals = [[[['a']], [['b']]], [[['c']], [['d']]]];
        const a = tf.tensor4d(vals);
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([2, 2, 1, 1]);
        expectArraysEqual(await a.data(), ['a', 'b', 'c', 'd']);
    });
    it('tensor4d() from number[][][][], but shape does not match', () => {
        const f = () => {
            // Actual shape is [2, 2, 1, 1].
            tf.tensor4d([[[[1]], [[2]]], [[[4]], [[5]]]], [2, 1, 2, 1]);
        };
        expect(f).toThrowError();
    });
    it('tf.tensor4d() from number[], but no shape throws error', () => {
        expect(() => tf.tensor4d([1, 2, 3, 4])).toThrowError();
    });
    it('tf.tensor4d() requires shape to be of length 4', () => {
        // tslint:disable-next-line:no-any
        const shape = [4, 1];
        expect(() => tf.tensor4d([1, 2, 3, 4], shape)).toThrowError();
    });
    it('tf.tensor4d() throw error with null input value', () => {
        expect(() => tf.tensor4d(null))
            .toThrowError('The input to the tensor constructor ' +
            'must be a non-null value.');
    });
    it('tf.tensor5d() throw error with null input value', () => {
        expect(() => tf.tensor5d(null))
            .toThrowError('The input to the tensor constructor ' +
            'must be a non-null value.');
    });
    it('tf.tensor6d() throw error with null input value', () => {
        expect(() => tf.tensor6d(null))
            .toThrowError('The input to the tensor constructor ' +
            'must be a non-null value.');
    });
    it('default dtype', async () => {
        const a = tf.scalar(3);
        expect(a.dtype).toBe('float32');
        expectArraysClose(await a.data(), 3);
    });
    it('float32 dtype', async () => {
        const a = tf.scalar(3, 'float32');
        expect(a.dtype).toBe('float32');
        expectArraysClose(await a.data(), 3);
    });
    it('int32 dtype', async () => {
        const a = tf.scalar(3, 'int32');
        expect(a.dtype).toBe('int32');
        expectArraysEqual(await a.data(), 3);
    });
    it('int32 dtype, 3.9 => 3, like numpy', async () => {
        const a = tf.scalar(3.9, 'int32');
        expect(a.dtype).toBe('int32');
        expectArraysEqual(await a.data(), 3);
    });
    it('int32 dtype, -3.9 => -3, like numpy', async () => {
        const a = tf.scalar(-3.9, 'int32');
        expect(a.dtype).toBe('int32');
        expectArraysEqual(await a.data(), -3);
    });
    it('bool dtype, 3 => true, like numpy', async () => {
        const a = tf.scalar(3, 'bool');
        expect(a.dtype).toBe('bool');
        expectArraysEqual(await a.data(), 1);
    });
    it('bool dtype, -2 => true, like numpy', async () => {
        const a = tf.scalar(-2, 'bool');
        expect(a.dtype).toBe('bool');
        expectArraysEqual(await a.data(), 1);
    });
    it('bool dtype, 0 => false, like numpy', async () => {
        const a = tf.scalar(0, 'bool');
        expect(a.dtype).toBe('bool');
        expectArraysEqual(await a.data(), 0);
    });
    it('bool dtype from boolean', async () => {
        const a = tf.scalar(false, 'bool');
        expectArraysEqual(await a.data(), 0);
        expect(a.dtype).toBe('bool');
        const b = tf.scalar(true, 'bool');
        expectArraysEqual(await a.data(), 0);
        expect(b.dtype).toBe('bool');
    });
    it('int32 dtype from boolean', async () => {
        const a = tf.scalar(true, 'int32');
        expectArraysEqual(await a.data(), 1);
        expect(a.dtype).toBe('int32');
    });
    it('default dtype from boolean', async () => {
        const a = tf.scalar(false);
        expectArraysEqual(await a.data(), 0);
        expect(a.dtype).toBe('bool');
    });
    it('default dtype', async () => {
        const a = tf.tensor1d([1, 2, 3]);
        expect(a.dtype).toBe('float32');
        expect(a.shape).toEqual([3]);
        expectArraysClose(await a.data(), [1, 2, 3]);
    });
    it('float32 dtype', async () => {
        const a = tf.tensor1d([1, 2, 3], 'float32');
        expect(a.dtype).toBe('float32');
        expect(a.shape).toEqual([3]);
        expectArraysClose(await a.data(), [1, 2, 3]);
    });
    it('int32 dtype', async () => {
        const a = tf.tensor1d([1, 2, 3], 'int32');
        expect(a.dtype).toBe('int32');
        expect(a.shape).toEqual([3]);
        expectArraysEqual(await a.data(), [1, 2, 3]);
    });
    it('int32 dtype, non-ints get floored, like numpy', async () => {
        const a = tf.tensor1d([1.1, 2.5, 3.9], 'int32');
        expect(a.dtype).toBe('int32');
        expect(a.shape).toEqual([3]);
        expectArraysEqual(await a.data(), [1, 2, 3]);
    });
    it('int32 dtype, negative non-ints get ceiled, like numpy', async () => {
        const a = tf.tensor1d([-1.1, -2.5, -3.9], 'int32');
        expect(a.dtype).toBe('int32');
        expect(a.shape).toEqual([3]);
        expectArraysEqual(await a.data(), [-1, -2, -3]);
    });
    it('bool dtype, !=0 is truthy, 0 is falsy, like numpy', async () => {
        const a = tf.tensor1d([1, -2, 0, 3], 'bool');
        expect(a.dtype).toBe('bool');
        expect(a.shape).toEqual([4]);
        expectArraysEqual(await a.data(), [1, 1, 0, 1]);
    });
    it('default dtype from boolean[]', async () => {
        const a = tf.tensor1d([false, false, true]);
        expect(a.dtype).toBe('bool');
        expectArraysClose(await a.data(), [0, 0, 1]);
    });
    it('default dtype from UInt8Array', async () => {
        const a = tf.tensor1d(new Uint8Array([1, 5, 2]));
        expect(a.dtype).toBe('int32');
        expect(a.shape).toEqual([3]);
        expectArraysClose(await a.data(), [1, 5, 2]);
    });
    it('default dtype from Int32Array', async () => {
        const a = tf.tensor1d(new Int32Array([1, 5, 2]));
        expect(a.dtype).toBe('int32');
        expect(a.shape).toEqual([3]);
        expectArraysClose(await a.data(), [1, 5, 2]);
    });
    it('tf.tensor() from Float32Array and number[]', async () => {
        const a = tf.tensor([
            new Float32Array([1, 2]), new Float32Array([3, 4]),
            new Float32Array([5, 6]), [7, 8]
        ]);
        expect(a.dtype).toBe('float32');
        expect(a.shape).toEqual([4, 2]);
        expectArraysClose(await a.data(), [1, 2, 3, 4, 5, 6, 7, 8]);
    });
    it('tf.tensor() from Int32Array and number[]', async () => {
        const a = tf.tensor([
            new Int32Array([1, 2]), new Int32Array([3, 4]), new Int32Array([5, 6]),
            [7, 8]
        ]);
        expect(a.dtype).toBe('int32');
        expect(a.shape).toEqual([4, 2]);
        expectArraysClose(await a.data(), [1, 2, 3, 4, 5, 6, 7, 8]);
    });
    it('tf.tensor() from mixed TypedArray', async () => {
        const a = tf.tensor([
            new Float32Array([1, 2]), new Int32Array([3, 4]), new Uint8Array([5, 6]),
            [7, 8]
        ]);
        expect(a.dtype).toBe('float32');
        expect(a.shape).toEqual([4, 2]);
        expectArraysClose(await a.data(), [1, 2, 3, 4, 5, 6, 7, 8]);
    });
    it('tf.tensor() from TypedArrays which are themselves 3D', () => {
        // 2 tensors, each with shape 20x20x3, as flat Float32Arrays.
        const img1 = new Float32Array(20 * 20 * 3);
        const img2 = new Float32Array(20 * 20 * 3);
        const t = tf.tensor([img1, img2], [2, 20, 20, 3]);
        expect(t.dtype).toBe('float32');
        expect(t.shape).toEqual([2, 20, 20, 3]);
    });
    it('tf.tensor() from TypedArrays which are themselves 3D, wrong shape', () => {
        const img1 = new Float32Array(20 * 20 * 3);
        const img2 = new Float32Array(20 * 20 * 3);
        expect(() => tf.tensor([img1, img2], [3, 20, 20, 3])).toThrowError();
    });
    it('default dtype from ascii string', async () => {
        const a = tf.tensor('hello');
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([]);
        expectArraysEqual(await a.data(), ['hello']);
    });
    it('default dtype from utf-8 string', async () => {
        const a = tf.tensor('даниел');
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([]);
        expectArraysEqual(await a.data(), ['даниел']);
    });
    it('default dtype from empty string', async () => {
        const a = tf.tensor('');
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([]);
        expectArraysEqual(await a.data(), ['']);
    });
    it('default dtype from unicode escaped string', async () => {
        const a = tf.tensor('\u0434\u0430\u043d\u0438\u0435\u043b');
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([]);
        expectArraysEqual(await a.data(), ['даниел']);
    });
    it('default dtype from string[]', async () => {
        const a = tf.tensor(['a', 'b']);
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([2]);
        expectArraysEqual(await a.data(), ['a', 'b']);
    });
    it('float32 dtype from boolean[]', async () => {
        const a = tf.tensor1d([false, false, true], 'float32');
        expect(a.dtype).toBe('float32');
        expectArraysClose(await a.data(), [0, 0, 1]);
    });
    it('int32 dtype from boolean[]', async () => {
        const a = tf.tensor1d([false, false, true], 'int32');
        expect(a.dtype).toBe('int32');
        expectArraysEqual(await a.data(), [0, 0, 1]);
    });
    it('bool dtype from boolean[]', async () => {
        const a = tf.tensor1d([false, false, true], 'bool');
        expect(a.dtype).toBe('bool');
        expectArraysEqual(await a.data(), [0, 0, 1]);
    });
    it('default dtype', async () => {
        const a = tf.tensor2d([1, 2, 3, 4], [2, 2]);
        expect(a.dtype).toBe('float32');
        expect(a.shape).toEqual([2, 2]);
        expectArraysClose(await a.data(), [1, 2, 3, 4]);
    });
    it('float32 dtype', async () => {
        const a = tf.tensor2d([1, 2, 3, 4], [2, 2], 'float32');
        expect(a.dtype).toBe('float32');
        expect(a.shape).toEqual([2, 2]);
        expectArraysClose(await a.data(), [1, 2, 3, 4]);
    });
    it('int32 dtype', async () => {
        const a = tf.tensor2d([[1, 2], [3, 4]], [2, 2], 'int32');
        expect(a.dtype).toBe('int32');
        expect(a.shape).toEqual([2, 2]);
        expectArraysEqual(await a.data(), [1, 2, 3, 4]);
    });
    it('int32 dtype, non-ints get floored, like numpy', async () => {
        const a = tf.tensor2d([1.1, 2.5, 3.9, 4.0], [2, 2], 'int32');
        expect(a.dtype).toBe('int32');
        expect(a.shape).toEqual([2, 2]);
        expectArraysEqual(await a.data(), [1, 2, 3, 4]);
    });
    it('int32 dtype, negative non-ints get ceiled, like numpy', async () => {
        const a = tf.tensor2d([-1.1, -2.5, -3.9, -4.0], [2, 2], 'int32');
        expect(a.dtype).toBe('int32');
        expect(a.shape).toEqual([2, 2]);
        expectArraysEqual(await a.data(), [-1, -2, -3, -4]);
    });
    it('bool dtype, !=0 is truthy, 0 is falsy, like numpy', async () => {
        const a = tf.tensor2d([1, -2, 0, 3], [2, 2], 'bool');
        expect(a.dtype).toBe('bool');
        expect(a.shape).toEqual([2, 2]);
        expectArraysEqual(await a.data(), [1, 1, 0, 1]);
    });
    it('default dtype from boolean[]', async () => {
        const a = tf.tensor2d([[false, false], [true, false]], [2, 2]);
        expect(a.dtype).toBe('bool');
        expectArraysClose(await a.data(), [0, 0, 1, 0]);
    });
    it('float32 dtype from boolean[]', async () => {
        const a = tf.tensor2d([[false, false], [true, false]], [2, 2], 'float32');
        expect(a.dtype).toBe('float32');
        expectArraysEqual(await a.data(), [0, 0, 1, 0]);
    });
    it('int32 dtype from boolean[]', async () => {
        const a = tf.tensor2d([[false, false], [true, false]], [2, 2], 'int32');
        expect(a.dtype).toBe('int32');
        expectArraysEqual(await a.data(), [0, 0, 1, 0]);
    });
    it('bool dtype from boolean[]', async () => {
        const a = tf.tensor2d([[false, false], [true, false]], [2, 2], 'bool');
        expect(a.dtype).toBe('bool');
        expectArraysEqual(await a.data(), [0, 0, 1, 0]);
    });
    it('default dtype', async () => {
        const a = tf.tensor3d([1, 2, 3, 4], [2, 2, 1]);
        expect(a.dtype).toBe('float32');
        expect(a.shape).toEqual([2, 2, 1]);
        expectArraysClose(await a.data(), [1, 2, 3, 4]);
    });
    it('float32 dtype', async () => {
        const a = tf.tensor3d([1, 2, 3, 4], [2, 2, 1], 'float32');
        expect(a.dtype).toBe('float32');
        expect(a.shape).toEqual([2, 2, 1]);
        expectArraysClose(await a.data(), [1, 2, 3, 4]);
    });
    it('int32 dtype', async () => {
        const a = tf.tensor3d([[[1], [2]], [[3], [4]]], [2, 2, 1], 'int32');
        expect(a.dtype).toBe('int32');
        expect(a.shape).toEqual([2, 2, 1]);
        expectArraysEqual(await a.data(), [1, 2, 3, 4]);
    });
    it('int32 dtype, non-ints get floored, like numpy', async () => {
        const a = tf.tensor3d([1.1, 2.5, 3.9, 4.0], [2, 2, 1], 'int32');
        expect(a.dtype).toBe('int32');
        expect(a.shape).toEqual([2, 2, 1]);
        expectArraysEqual(await a.data(), [1, 2, 3, 4]);
    });
    it('int32 dtype, negative non-ints get ceiled, like numpy', async () => {
        const a = tf.tensor3d([-1.1, -2.5, -3.9, -4.0], [2, 2, 1], 'int32');
        expect(a.dtype).toBe('int32');
        expect(a.shape).toEqual([2, 2, 1]);
        expectArraysEqual(await a.data(), [-1, -2, -3, -4]);
    });
    it('bool dtype, !=0 is truthy, 0 is falsy, like numpy', async () => {
        const a = tf.tensor3d([1, -2, 0, 3], [2, 2, 1], 'bool');
        expect(a.dtype).toBe('bool');
        expect(a.shape).toEqual([2, 2, 1]);
        expectArraysEqual(await a.data(), [1, 1, 0, 1]);
    });
    it('default dtype from boolean[]', async () => {
        const a = tf.tensor3d([[[false], [false]], [[true], [false]]], [2, 2, 1]);
        expect(a.dtype).toBe('bool');
        expectArraysClose(await a.data(), [0, 0, 1, 0]);
    });
    it('float32 dtype from boolean[]', async () => {
        const a = tf.tensor3d([[[false], [false]], [[true], [false]]], [2, 2, 1], 'float32');
        expect(a.dtype).toBe('float32');
        expectArraysClose(await a.data(), [0, 0, 1, 0]);
    });
    it('int32 dtype from boolean[]', async () => {
        const a = tf.tensor3d([[[false], [false]], [[true], [false]]], [2, 2, 1], 'int32');
        expect(a.dtype).toBe('int32');
        expectArraysEqual(await a.data(), [0, 0, 1, 0]);
    });
    it('bool dtype from boolean[]', async () => {
        const a = tf.tensor3d([[[false], [false]], [[true], [false]]], [2, 2, 1], 'bool');
        expect(a.dtype).toBe('bool');
        expectArraysEqual(await a.data(), [0, 0, 1, 0]);
    });
    it('default dtype', async () => {
        const a = tf.tensor4d([1, 2, 3, 4], [2, 2, 1, 1]);
        expect(a.dtype).toBe('float32');
        expect(a.shape).toEqual([2, 2, 1, 1]);
        expectArraysClose(await a.data(), [1, 2, 3, 4]);
    });
    it('float32 dtype', async () => {
        const a = tf.tensor4d([1, 2, 3, 4], [2, 2, 1, 1], 'float32');
        expect(a.dtype).toBe('float32');
        expect(a.shape).toEqual([2, 2, 1, 1]);
        expectArraysClose(await a.data(), [1, 2, 3, 4]);
    });
    it('int32 dtype', async () => {
        const a = tf.tensor4d([[[[1]], [[2]]], [[[3]], [[4]]]], [2, 2, 1, 1], 'int32');
        expect(a.dtype).toBe('int32');
        expect(a.shape).toEqual([2, 2, 1, 1]);
        expectArraysEqual(await a.data(), [1, 2, 3, 4]);
    });
    it('int32 dtype, non-ints get floored, like numpy', async () => {
        const a = tf.tensor4d([1.1, 2.5, 3.9, 4.0], [2, 2, 1, 1], 'int32');
        expect(a.dtype).toBe('int32');
        expect(a.shape).toEqual([2, 2, 1, 1]);
        expectArraysEqual(await a.data(), [1, 2, 3, 4]);
    });
    it('int32 dtype, negative non-ints get ceiled, like numpy', async () => {
        const a = tf.tensor4d([-1.1, -2.5, -3.9, -4.0], [2, 2, 1, 1], 'int32');
        expect(a.dtype).toBe('int32');
        expect(a.shape).toEqual([2, 2, 1, 1]);
        expectArraysEqual(await a.data(), [-1, -2, -3, -4]);
    });
    it('bool dtype, !=0 is truthy, 0 is falsy, like numpy', async () => {
        const a = tf.tensor4d([1, -2, 0, 3], [2, 2, 1, 1], 'bool');
        expect(a.dtype).toBe('bool');
        expect(a.shape).toEqual([2, 2, 1, 1]);
        expectArraysEqual(await a.data(), [1, 1, 0, 1]);
    });
    it('default dtype from boolean[]', async () => {
        const a = tf.tensor4d([[[[false], [false]], [[true], [false]]]], [1, 2, 2, 1]);
        expect(a.dtype).toBe('bool');
        expectArraysClose(await a.data(), [0, 0, 1, 0]);
    });
    it('float32 dtype from boolean[]', async () => {
        const a = tf.tensor4d([[[[false], [false]], [[true], [false]]]], [1, 2, 2, 1], 'float32');
        expect(a.dtype).toBe('float32');
        expectArraysClose(await a.data(), [0, 0, 1, 0]);
    });
    it('int32 dtype from boolean[]', async () => {
        const a = tf.tensor4d([[[[false], [false]], [[true], [false]]]], [1, 2, 2, 1], 'int32');
        expect(a.dtype).toBe('int32');
        expectArraysEqual(await a.data(), [0, 0, 1, 0]);
    });
    it('bool dtype from boolean[]', async () => {
        const a = tf.tensor4d([[[[false], [false]], [[true], [false]]]], [1, 2, 2, 1], 'bool');
        expect(a.dtype).toBe('bool');
        expectArraysEqual(await a.data(), [0, 0, 1, 0]);
    });
    it('Scalar default dtype', async () => {
        const a = tf.scalar(4);
        const b = a.reshape([1, 1]);
        expect(b.dtype).toBe('float32');
        expect(b.shape).toEqual([1, 1]);
        expectArraysClose(await a.data(), await b.data());
    });
    it('Scalar float32 dtype', () => {
        const a = tf.scalar(4, 'float32');
        const b = a.reshape([1, 1]);
        expect(b.dtype).toBe('float32');
        expect(b.shape).toEqual([1, 1]);
    });
    it('Scalar string dtype', () => {
        const a = tf.scalar('test', 'string');
        const b = a.reshape([1, 1]);
        expect(b.dtype).toBe('string');
        expect(b.shape).toEqual([1, 1]);
    });
    it('scalar from encoded string', async () => {
        const a = tf.scalar(encodeString('hello'), 'string');
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([]);
        expectArraysEqual(await a.data(), ['hello']);
    });
    it('scalar from encoded string, but missing dtype', async () => {
        // We do not want to infer 'string' when the user passes Uint8Array in order
        // to be forward compatible in the future when we add uint8 dtype.
        expect(() => tf.scalar(encodeString('hello'))).toThrowError();
    });
    it('scalar from encoded string, but value is not uint8array', async () => {
        // tslint:disable-next-line:no-any
        expect(() => tf.scalar(new Float32Array([1, 2, 3]))).toThrowError();
    });
    it('Scalar inferred dtype from bool', async () => {
        const a = tf.scalar(true);
        expect(a.dtype).toBe('bool');
        expect(a.shape).toEqual([]);
        expectArraysClose(await a.data(), [1]);
    });
    it('Scalar inferred dtype from string', async () => {
        const a = tf.scalar('hello');
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([]);
        expectArraysEqual(await a.data(), ['hello']);
    });
    it('Scalar int32 dtype', () => {
        const a = tf.scalar(4, 'int32');
        const b = a.reshape([1, 1]);
        expect(b.dtype).toBe('int32');
        expect(b.shape).toEqual([1, 1]);
    });
    it('Scalar bool dtype', async () => {
        const a = tf.scalar(4, 'bool');
        const b = a.reshape([1, 1, 1]);
        expect(b.dtype).toBe('bool');
        expect(b.shape).toEqual([1, 1, 1]);
        expectArraysClose(await a.data(), await b.data());
    });
    it('Scalar complex64 dtype', async () => {
        const a = tf.complex(4, 5);
        const b = a.reshape([1, 1]);
        expectArraysClose(await a.data(), [4, 5]);
        expect(b.dtype).toBe('complex64');
        expect(b.shape).toEqual([1, 1]);
        expectArraysClose(await a.data(), await b.data());
    });
    it('Tensor1D default dtype', async () => {
        const a = tf.tensor1d([1, 2, 3, 4]);
        const b = a.reshape([2, 2]);
        expect(b.dtype).toBe('float32');
        expect(b.shape).toEqual([2, 2]);
        expectArraysClose(await a.data(), await b.data());
    });
    it('Tensor1D inferred dtype from bools', async () => {
        const a = tf.tensor1d([true, false, false, true]);
        expect(a.dtype).toBe('bool');
        expect(a.shape).toEqual([4]);
        expectArraysClose(await a.data(), [1, 0, 0, 1]);
    });
    it('Tensor1D inferred dtype from strings', async () => {
        const a = tf.tensor1d(['a', 'b', 'c']);
        expect(a.dtype).toBe('string');
        expect(a.shape).toEqual([3]);
        expectArraysEqual(await a.data(), ['a', 'b', 'c']);
    });
    it('Tensor1D float32 dtype', () => {
        const a = tf.tensor1d([1, 2, 3, 4], 'float32');
        const b = a.reshape([2, 2]);
        expect(b.dtype).toBe('float32');
        expect(b.shape).toEqual([2, 2]);
    });
    it('Tensor1D int32 dtype', async () => {
        const a = tf.tensor1d([1, 2, 3, 4], 'int32');
        const b = a.reshape([2, 2]);
        expect(b.dtype).toBe('int32');
        expect(b.shape).toEqual([2, 2]);
        expectArraysClose(await a.data(), await b.data());
    });
    it('Tensor1D complex64 dtype', async () => {
        const a = tf.complex([1, 3, 5, 7], [2, 4, 6, 8]);
        const b = a.reshape([2, 2]);
        expect(b.dtype).toBe('complex64');
        expect(b.shape).toEqual([2, 2]);
        expectArraysClose(await a.data(), await b.data());
    });
    it('Tensor2D default dtype', async () => {
        const a = tf.tensor2d([1, 2, 3, 4, 5, 6], [2, 3]);
        const b = a.reshape([6]);
        expect(b.dtype).toBe('float32');
        expect(b.shape).toEqual([6]);
        expectArraysClose(await a.data(), await b.data());
    });
    it('Tensor2D float32 dtype', () => {
        const a = tf.tensor2d([1, 2, 3, 4, 5, 6], [2, 3], 'float32');
        const b = a.reshape([6]);
        expect(b.dtype).toBe('float32');
        expect(b.shape).toEqual([6]);
    });
    it('Tensor2D int32 dtype', () => {
        const a = tf.tensor2d([1, 2, 3, 4, 5, 6], [2, 3], 'int32');
        const b = a.reshape([6]);
        expect(b.dtype).toBe('int32');
        expect(b.shape).toEqual([6]);
    });
    it('Tensor2D bool dtype', async () => {
        const a = tf.tensor2d([1, 2, 3, 4, 5, 6], [2, 3], 'bool');
        const b = a.reshape([6]);
        expect(b.dtype).toBe('bool');
        expect(b.shape).toEqual([6]);
        expectArraysClose(await a.data(), await b.data());
    });
    it('Tensor2D complex64 dtype', async () => {
        const a = tf.complex([[1, 3, 5], [7, 9, 11]], [[2, 4, 6], [8, 10, 12]]);
        const b = a.reshape([6]);
        expect(b.dtype).toBe('complex64');
        expect(b.shape).toEqual([6]);
        expectArraysClose(await a.data(), await b.data());
    });
    it('Tensor3D default dtype', async () => {
        const a = tf.tensor3d([1, 2, 3, 4, 5, 6], [2, 3, 1]);
        const b = a.reshape([6]);
        expect(b.dtype).toBe('float32');
        expect(b.shape).toEqual([6]);
        expectArraysClose(await a.data(), await b.data());
    });
    it('Tensor3D float32 dtype', () => {
        const a = tf.tensor3d([1, 2, 3, 4, 5, 6], [2, 3, 1], 'float32');
        const b = a.reshape([6]);
        expect(b.dtype).toBe('float32');
        expect(b.shape).toEqual([6]);
    });
    it('Tensor3D int32 dtype', () => {
        const a = tf.tensor3d([1, 2, 3, 4, 5, 6], [2, 3, 1], 'int32');
        const b = a.reshape([6]);
        expect(b.dtype).toBe('int32');
        expect(b.shape).toEqual([6]);
    });
    it('Tensor3D bool dtype', async () => {
        const a = tf.tensor3d([1, 2, 3, 4, 5, 6], [2, 3, 1], 'bool');
        const b = a.reshape([6]);
        expect(b.dtype).toBe('bool');
        expect(b.shape).toEqual([6]);
        expectArraysClose(await a.data(), await b.data());
    });
    it('Tensor3D complex64 dtype', async () => {
        const a = tf.complex([[[1], [3], [5]], [[7], [9], [11]]], [[[2], [4], [6]], [[8], [10], [12]]]);
        const b = a.reshape([6]);
        expect(b.dtype).toBe('complex64');
        expect(b.shape).toEqual([6]);
        expectArraysClose(await a.data(), await b.data());
    });
    it('Tensor4D default dtype', async () => {
        const a = tf.tensor4d([1, 2, 3, 4, 5, 6], [2, 3, 1, 1]);
        const b = a.reshape([2, 3]);
        expect(b.dtype).toBe('float32');
        expect(b.shape).toEqual([2, 3]);
        expectArraysClose(await a.data(), await b.data());
    });
    it('Tensor4D float32 dtype', () => {
        const a = tf.tensor4d([1, 2, 3, 4, 5, 6], [2, 3, 1, 1], 'float32');
        const b = a.reshape([2, 3]);
        expect(b.dtype).toBe('float32');
        expect(b.shape).toEqual([2, 3]);
    });
    it('Tensor4D int32 dtype', async () => {
        const a = tf.tensor4d([1, 2, 3, 4, 5, 6], [2, 3, 1, 1], 'int32');
        const b = a.reshape([3, 2]);
        expect(b.dtype).toBe('int32');
        expect(b.shape).toEqual([3, 2]);
        expectArraysClose(await a.data(), await b.data());
    });
    it('Tensor4D complex64 dtype', async () => {
        const a = tf.complex([[[[1]], [[3]], [[5]]], [[[7]], [[9]], [[11]]]], [[[[2]], [[4]], [[6]]], [[[8]], [[10]], [[12]]]]);
        const b = a.reshape([3, 2]);
        expect(b.dtype).toBe('complex64');
        expect(b.shape).toEqual([3, 2]);
        expectArraysClose(await a.data(), await b.data());
    });
    it('Tensor4D bool dtype', () => {
        const a = tf.tensor4d([1, 2, 3, 4, 5, 6], [2, 3, 1, 1], 'bool');
        const b = a.reshape([3, 2]);
        expect(b.dtype).toBe('bool');
        expect(b.shape).toEqual([3, 2]);
    });
    it('.data() with casting, string tensor', async () => {
        const a = tf.tensor(['a', 'b']);
        const data = await a.data();
        expect(data).toEqual(['a', 'b']);
    });
    it('reshape is functional', async () => {
        const a = tf.scalar(2.4);
        const b = a.reshape([]);
        expect(a.id).not.toBe(b.id);
        b.dispose();
        expectArraysClose(await a.data(), [2.4]);
    });
    it('reshape a string tensor', async () => {
        const a = tf.tensor(['a', 'b']);
        const b = a.reshape([2, 1, 1]);
        expect(b.dtype).toBe('string');
        expect(b.shape).toEqual([2, 1, 1]);
        expectArraysEqual(await b.data(), ['a', 'b']);
    });
    it('reshape throws when passed a non-tensor', () => {
        // tslint:disable-next-line:no-any
        expect(() => tf.reshape({}, []))
            .toThrowError(/Argument 'x' passed to 'reshape' must be a Tensor/);
    });
    it('reshape accepts a tensor-like object', async () => {
        const res = tf.reshape([[1, 2, 3], [4, 5, 6]], [3, 2]);
        expect(res.dtype).toBe('float32');
        expect(res.shape).toEqual([3, 2]);
        expectArraysClose(await res.data(), [1, 2, 3, 4, 5, 6]);
    });
    it('cast bool -> bool', () => {
        const a = tf.tensor1d([1, 0], 'bool');
        expect(a.cast('bool').dtype).toEqual('bool');
    });
    it('cast bool -> int32', () => {
        const a = tf.tensor1d([1, 0], 'bool');
        expect(a.cast('int32').dtype).toEqual('int32');
    });
    it('cast bool -> float32', () => {
        const a = tf.tensor1d([1, 0], 'bool');
        expect(a.cast('float32').dtype).toEqual('float32');
    });
    it('cast int32 -> bool', () => {
        const a = tf.tensor1d([1, 0], 'int32');
        expect(a.cast('bool').dtype).toEqual('bool');
    });
    it('cast int32 -> int32', () => {
        const a = tf.tensor1d([1, 2], 'int32');
        expect(a.cast('int32').dtype).toEqual('int32');
    });
    it('cast int32 -> float32', () => {
        const a = tf.tensor1d([1, 2], 'int32');
        expect(a.cast('float32').dtype).toEqual('float32');
    });
    it('cast float32 -> bool', () => {
        const a = tf.tensor1d([1.0, 0.0]);
        expect(a.cast('bool').dtype).toEqual('bool');
    });
    it('cast float32 -> int32', () => {
        const a = tf.tensor1d([1.0, 2.0]);
        expect(a.cast('int32').dtype).toEqual('int32');
    });
    it('cast float32 -> int32. async download', async () => {
        const a = tf.tensor1d([1, 2]);
        const aInt = a.cast('int32');
        expect(aInt.dtype).toEqual('int32');
        const asyncData = await aInt.data();
        expect(asyncData instanceof Int32Array).toEqual(true);
    });
    it('cast float32 -> int32. queued async download', async () => {
        const a = tf.tensor1d([1, 2]);
        const aInt = a.cast('int32');
        expect(aInt.dtype).toEqual('int32');
        const [first, second] = await Promise.all([aInt.data(), aInt.data()]);
        expect(first instanceof Int32Array).toEqual(true);
        expect(second instanceof Int32Array).toEqual(true);
    });
    it('cast float32 -> int32. sync download', async () => {
        const a = tf.tensor1d([1, 2]).cast('int32');
        expect(a.dtype).toEqual('int32');
        const data = await a.data();
        expect(data instanceof Int32Array).toEqual(true);
    });
    it('cast float32 -> float32', () => {
        const a = tf.tensor1d([1.0, 2.0]);
        expect(a.cast('float32').dtype).toEqual('float32');
    });
    it('cast complex64 -> float32', async () => {
        const a = tf.complex([1.0, 2.0], [3.0, 4.0]);
        const result = a.cast('float32');
        expect(result.dtype).toEqual('float32');
        expectArraysClose(await result.data(), [1.0, 2.0]);
    });
    it('cast complex64 -> int32', async () => {
        const a = tf.complex([1.0, 2.0], [3.0, 4.0]);
        const result = a.cast('int32');
        expect(result.dtype).toEqual('int32');
        expectArraysEqual(await result.data(), [1, 2]);
    });
    it('cast complex64 -> bool', async () => {
        const a = tf.complex([1.0, 0.0], [1.0, 1.0]);
        const result = a.cast('bool');
        expect(result.dtype).toEqual('bool');
        expectArraysEqual(await result.data(), [true, false]);
    });
    it('cast throws when passed a non-tensor', () => {
        expect(() => tf.cast({}, 'float32'))
            .toThrowError(/Argument 'x' passed to 'cast' must be a Tensor/);
    });
    it('cast accepts a tensor-like object', async () => {
        const a = [1.0, 2.0];
        const res = tf.cast(a, 'int32');
        expect(res.dtype).toEqual('int32');
        expectArraysClose(await res.data(), [1, 2]);
    });
    it('cast string -> !string throws error', () => {
        const a = ['a', 'b'];
        expect(() => tf.cast(a, 'int32')).toThrowError();
        expect(() => tf.cast(a, 'float32')).toThrowError();
        expect(() => tf.cast(a, 'bool')).toThrowError();
        expect(() => tf.cast(a, 'complex64')).toThrowError();
    });
    it('cast !string -> string throws error', () => {
        expect(() => tf.cast(tf.tensor(1, [], 'float32'), 'string')).toThrowError();
        expect(() => tf.cast(tf.tensor(1, [], 'int32'), 'string')).toThrowError();
        expect(() => tf.cast(tf.tensor(1, [], 'bool'), 'string')).toThrowError();
        expect(() => tf.cast(tf.tensor(1, [], 'complex64'), 'string'))
            .toThrowError();
    });
    it('scalar bool -> int32', async () => {
        const a = tf.scalar(true, 'bool').toInt();
        expect(a.dtype).toBe('int32');
        expectArraysEqual(await a.data(), 1);
    });
    it('Tensor1D float32 -> int32', async () => {
        const a = tf.tensor1d([1.1, 3.9, -2.9, 0]).toInt();
        expect(a.dtype).toBe('int32');
        expectArraysEqual(await a.data(), [1, 3, -2, 0]);
    });
    it('Tensor2D float32 -> bool', async () => {
        const a = tf.tensor2d([1.1, 3.9, -2.9, 0], [2, 2]).asType('bool');
        expect(a.dtype).toBe('bool');
        expectArraysEqual(await a.data(), [1, 1, 1, 0]);
    });
    it('Tensor2D int32 -> bool', async () => {
        const a = tf.tensor2d([1, 3, 0, -1], [2, 2], 'int32').toBool();
        expect(a.dtype).toBe('bool');
        expectArraysEqual(await a.data(), [1, 1, 0, 1]);
    });
    it('Tensor3D bool -> float32', async () => {
        const a = tf.tensor3d([true, false, false, true], [2, 2, 1], 'bool').toFloat();
        expect(a.dtype).toBe('float32');
        expectArraysClose(await a.data(), [1, 0, 0, 1]);
    });
    it('bool CPU -> GPU -> CPU', async () => {
        const a = tf.tensor1d([1, 2, 0, 0, 5], 'bool');
        expectArraysEqual(await a.data(), [1, 1, 0, 0, 1]);
    });
    it('int32 CPU -> GPU -> CPU', async () => {
        const a = tf.tensor1d([1, 2, 0, 0, 5], 'int32');
        expectArraysEqual(await a.data(), [1, 2, 0, 0, 5]);
    });
    it('asType is functional', async () => {
        const a = tf.scalar(2.4, 'float32');
        const b = a.toFloat();
        expect(a.id).not.toBe(b.id);
        b.dispose();
        expectArraysClose(await a.data(), [2.4]);
    });
    it('squeeze no axis', () => {
        const a = tf.tensor2d([4, 2, 1], [3, 1], 'bool');
        const b = a.squeeze();
        expect(b.shape).toEqual([3]);
    });
    it('squeeze with axis', () => {
        const a = tf.tensor3d([4, 2, 1], [3, 1, 1], 'bool');
        const b = a.squeeze([1]);
        expect(b.shape).toEqual([3, 1]);
    });
    it('squeeze with negative axis', () => {
        const a = tf.tensor3d([4, 2, 1], [3, 1, 1], 'bool');
        const b = a.squeeze([-1]);
        expect(b.shape).toEqual([3, 1]);
    });
    it('squeeze with multiple negative axis', () => {
        const a = tf.tensor3d([4, 2, 1], [3, 1, 1], 'bool');
        const b = a.squeeze([-1, -2]);
        expect(b.shape).toEqual([3]);
    });
    it('squeeze wrong axis', () => {
        const a = tf.tensor3d([4, 2, 1], [3, 1, 1], 'bool');
        expect(() => a.squeeze([0, 1])).toThrowError();
    });
    it('squeeze wrong negative axis', () => {
        const a = tf.tensor3d([4, 2, 1], [3, 1, 1], 'bool');
        expect(() => a.squeeze([-3, -2])).toThrowError();
    });
    it('squeeze axis out of range', () => {
        const a = tf.tensor3d([4, 2, 1], [3, 1, 1], 'bool');
        expect(() => a.squeeze([10, 11])).toThrowError();
    });
    it('squeeze negative axis out of range', () => {
        const a = tf.tensor3d([4, 2, 1], [3, 1, 1], 'bool');
        expect(() => a.squeeze([-13, -12])).toThrowError();
    });
    it('squeeze throws when passed a non-tensor', () => {
        expect(() => tf.squeeze({}))
            .toThrowError(/Argument 'x' passed to 'squeeze' must be a Tensor/);
    });
    it('squeeze accepts a tensor-like object', async () => {
        const res = tf.squeeze([[[4]], [[2]], [[1]]] /* shape is [3, 1, 1] */);
        expect(res.shape).toEqual([3]);
        expectArraysClose(await res.data(), [4, 2, 1]);
    });
    it('squeeze a zero-sized tensor', () => {
        const a = tf.tensor3d([], [0, 1, 0]);
        const res = tf.squeeze(a);
        expect(res.shape).toEqual([0, 0]);
    });
    it('squeeze can take an empty list of axis', () => {
        const a = tf.zeros([2, 1, 3, 1, 4]);
        const axes = [];
        // Empty axes list means all possible axes.
        const res = tf.squeeze(a, axes);
        expect(res.shape).toEqual([2, 3, 4]);
    });
    it('squeeze a complex64 tensor', async () => {
        const a = tf.complex([[4], [1], [5]], [[2], [3], [6]]);
        const b = a.squeeze();
        expect(b.shape).toEqual([3]);
        expectArraysClose(await b.data(), [4, 2, 1, 3, 5, 6]);
    });
    it('scalar -> 2d', () => {
        const a = tf.scalar(4, 'int32');
        const b = a.as2D(1, 1);
        expect(b.dtype).toBe('int32');
        expect(b.shape).toEqual([1, 1]);
    });
    it('1d -> 2d', () => {
        const a = tf.tensor1d([4, 2, 1], 'bool');
        const b = a.as2D(3, 1);
        expect(b.dtype).toBe('bool');
        expect(b.shape).toEqual([3, 1]);
    });
    it('2d -> 4d', () => {
        const a = tf.tensor2d([4, 2, 1, 3], [2, 2]);
        const b = a.as4D(1, 1, 2, 2);
        expect(b.dtype).toBe('float32');
        expect(b.shape).toEqual([1, 1, 2, 2]);
    });
    it('3d -> 2d', () => {
        const a = tf.tensor3d([4, 2, 1, 3], [2, 2, 1], 'float32');
        const b = a.as2D(2, 2);
        expect(b.dtype).toBe('float32');
        expect(b.shape).toEqual([2, 2]);
    });
    it('4d -> 1d', () => {
        const a = tf.tensor4d([4, 2, 1, 3], [2, 2, 1, 1], 'bool');
        const b = a.as1D();
        expect(b.dtype).toBe('bool');
        expect(b.shape).toEqual([4]);
    });
    it('throws when passed non-integer shape', () => {
        const msg = 'Tensor must have a shape comprised of positive ' +
            'integers but got shape [2,2.2].';
        expect(() => tf.tensor([1, 2, 3, 4], [2, 2.2])).toThrowError(msg);
    });
    it('throws when passed negative shape', () => {
        const msg = 'Tensor must have a shape comprised of positive ' +
            'integers but got shape [2,-2].';
        expect(() => tf.tensor([1, 2, 3, 4], [2, -2])).toThrowError(msg);
    });
    it('ones with complex type', async () => {
        // Imaginary part should be zero.
        const a = tf.ones([2, 2], 'complex64');
        expectArraysClose(await a.data(), [1, 0, 1, 0, 1, 0, 1, 0]);
    });
    it('can create a tensor where values.size != buffer.size', async () => {
        const a = new Float32Array([1, 2, 3, 4, 5]);
        const b = a.subarray(0, 2);
        const t = tf.tensor1d(b);
        expect(t.shape).toEqual([2]);
        expectArraysClose(await t.data(), [1, 2]);
    });
});
describeWithFlags('tensor debug mode', ALL_ENVS, () => {
    beforeAll(() => {
        // Silence debug warnings.
        spyOn(console, 'warn');
        tf.enableDebugMode();
    });
    it('tf.tensor() from TypedArray + number[] fails due to wrong shape', () => {
        expect(() => tf.tensor([
            new Float32Array([1, 2]),
            new Float32Array([3, 4]),
            new Float32Array([5, 6]),
            // Should be of length 4
            [7, 8, 9, 10],
        ]))
            .toThrowError(/Element arr\[3\] should have 2 elements, but has 4 elements/);
    });
});
describeWithFlags('tensor dataSync', SYNC_BACKEND_ENVS, () => {
    it('.dataSync() with casting, string tensor', () => {
        const a = tf.tensor(['a', 'b']);
        const data = a.dataSync();
        expect(data).toEqual(['a', 'b']);
    });
});
describeWithFlags('tensor arraySync', SYNC_BACKEND_ENVS, () => {
    it('.arraySync() with a non-complex tensor', () => {
        const a = tf.tensor([1, 2, 3, 4, 5, 6], [2, 3]);
        expect(a.arraySync()).toEqual([[1, 2, 3], [4, 5, 6]]);
    });
    it('.arraySync() with a complex tensor', () => {
        const a = tf.complex([[1, 2], [3, 4]], [[11, 12], [13, 14]]);
        expect(a.arraySync()).toEqual([[1, 11, 2, 12], [3, 13, 4, 14]]);
    });
    // The other cases should be covered by toNestedArray tests in util_test.ts.
});
describeWithFlags('tensor.toString', SYNC_BACKEND_ENVS, () => {
    it('scalar verbose', () => {
        const verbose = true;
        const str = tf.scalar(5).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: float32\n' +
            '  rank: 0\n' +
            '  shape: []\n' +
            '  values:\n' +
            '    5');
    });
    it('string scalar verbose', () => {
        const verbose = true;
        const str = tf.scalar('test').toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: string\n' +
            '  rank: 0\n' +
            '  shape: []\n' +
            '  values:\n' +
            '    test');
    });
    it('bool scalar verbose', () => {
        const verbose = true;
        const str = tf.scalar(true).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: bool\n' +
            '  rank: 0\n' +
            '  shape: []\n' +
            '  values:\n' +
            '    true');
    });
    it('2D 0 shaped tensor verbose', () => {
        const verbose = true;
        const str = tf.zeros([0, 1]).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: float32\n' +
            '  rank: 2\n' +
            '  shape: [0,1]\n' +
            '  values:\n' +
            '     []');
    });
    it('3D 0 shaped tensor verbose', () => {
        const verbose = true;
        const str = tf.zeros([1, 0, 1]).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: float32\n' +
            '  rank: 3\n' +
            '  shape: [1,0,1]\n' +
            '  values:\n' +
            '     [ []]');
    });
    it('1d tensor verbose', () => {
        const verbose = true;
        const str = tf.zeros([4]).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: float32\n' +
            '  rank: 1\n' +
            '  shape: [4]\n' +
            '  values:\n' +
            '    [0, 0, 0, 0]');
    });
    it('1d string tensor verbose', () => {
        const verbose = true;
        const str = tf.tensor(['a', 'bb', 'ccc']).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: string\n' +
            '  rank: 1\n' +
            '  shape: [3]\n' +
            '  values:\n' +
            '    [\'a\', \'bb\', \'ccc\']');
    });
    it('1d bool tensor verbose', () => {
        const verbose = true;
        const str = tf.tensor([true, false, true]).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: bool\n' +
            '  rank: 1\n' +
            '  shape: [3]\n' +
            '  values:\n' +
            '    [true, false, true]');
    });
    it('2d tensor verbose', () => {
        const verbose = true;
        const str = tf.zeros([3, 3]).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: float32\n' +
            '  rank: 2\n' +
            '  shape: [3,3]\n' +
            '  values:\n' +
            '    [[0, 0, 0],\n' +
            '     [0, 0, 0],\n' +
            '     [0, 0, 0]]');
    });
    it('2d string tensor verbose', () => {
        const verbose = true;
        const vals = [
            ['a', 'bb', 'ccc'],
            ['d', 'e', 'f'],
            ['g', 'h', 'i'],
        ];
        const str = tf.tensor(vals).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: string\n' +
            '  rank: 2\n' +
            '  shape: [3,3]\n' +
            '  values:\n' +
            '    [[\'a\', \'bb\', \'ccc\'],\n' +
            '     [\'d\', \'e\' , \'f\'  ],\n' +
            '     [\'g\', \'h\' , \'i\'  ]]');
    });
    it('2d bool tensor verbose', () => {
        const verbose = true;
        const str = tf.zeros([3, 3], 'bool').toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: bool\n' +
            '  rank: 2\n' +
            '  shape: [3,3]\n' +
            '  values:\n' +
            '    [[false, false, false],\n' +
            '     [false, false, false],\n' +
            '     [false, false, false]]');
    });
    it('3d tensor verbose', () => {
        const verbose = true;
        const str = tf.zeros([3, 3, 2]).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: float32\n' +
            '  rank: 3\n' +
            '  shape: [3,3,2]\n' +
            '  values:\n' +
            '    [[[0, 0],\n' +
            '      [0, 0],\n' +
            '      [0, 0]],\n\n' +
            '     [[0, 0],\n' +
            '      [0, 0],\n' +
            '      [0, 0]],\n\n' +
            '     [[0, 0],\n' +
            '      [0, 0],\n' +
            '      [0, 0]]]');
    });
    it('3d string tensor verbose', () => {
        const verbose = true;
        const vals = [
            [['a', 'bb'], ['ccc', 'dddd']],
            [['e', 'ff'], ['ggg', 'hhhh']],
            [['i', 'jj'], ['kkk', 'llll']],
        ];
        const str = tf.tensor(vals).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: string\n' +
            '  rank: 3\n' +
            '  shape: [3,2,2]\n' +
            '  values:\n' +
            '    [[[\'a\'  , \'bb\'  ],\n' +
            '      [\'ccc\', \'dddd\']],\n\n' +
            '     [[\'e\'  , \'ff\'  ],\n' +
            '      [\'ggg\', \'hhhh\']],\n\n' +
            '     [[\'i\'  , \'jj\'  ],\n' +
            '      [\'kkk\', \'llll\']]]');
    });
    it('3d bool tensor verbose', () => {
        const verbose = true;
        const str = tf.ones([3, 3, 2], 'bool').toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: bool\n' +
            '  rank: 3\n' +
            '  shape: [3,3,2]\n' +
            '  values:\n' +
            '    [[[true, true],\n' +
            '      [true, true],\n' +
            '      [true, true]],\n\n' +
            '     [[true, true],\n' +
            '      [true, true],\n' +
            '      [true, true]],\n\n' +
            '     [[true, true],\n' +
            '      [true, true],\n' +
            '      [true, true]]]');
    });
    it('1d long tensor verbose', () => {
        const verbose = true;
        const str = tf.zeros([100]).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: float32\n' +
            '  rank: 1\n' +
            '  shape: [100]\n' +
            '  values:\n' +
            '    [0, 0, 0, ..., 0, 0, 0]');
    });
    it('1d long string tensor verbose', () => {
        const verbose = true;
        const str = tf.fill([100], 'hi').toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: string\n' +
            '  rank: 1\n' +
            '  shape: [100]\n' +
            '  values:\n' +
            '    [\'hi\', \'hi\', \'hi\', ..., \'hi\', \'hi\', \'hi\']');
    });
    it('2d long tensor verbose', () => {
        const verbose = true;
        const str = tf.zeros([100, 100]).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: float32\n' +
            '  rank: 2\n' +
            '  shape: [100,100]\n' +
            '  values:\n' +
            '    [[0, 0, 0, ..., 0, 0, 0],\n' +
            '     [0, 0, 0, ..., 0, 0, 0],\n' +
            '     [0, 0, 0, ..., 0, 0, 0],\n' +
            '     ...,\n' +
            '     [0, 0, 0, ..., 0, 0, 0],\n' +
            '     [0, 0, 0, ..., 0, 0, 0],\n' +
            '     [0, 0, 0, ..., 0, 0, 0]]');
    });
    it('2d long string tensor verbose', () => {
        const verbose = true;
        const str = tf.fill([100, 100], 'a').toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: string\n' +
            '  rank: 2\n' +
            '  shape: [100,100]\n' +
            '  values:\n' +
            '    [[\'a\', \'a\', \'a\', ..., \'a\', \'a\', \'a\'],\n' +
            '     [\'a\', \'a\', \'a\', ..., \'a\', \'a\', \'a\'],\n' +
            '     [\'a\', \'a\', \'a\', ..., \'a\', \'a\', \'a\'],\n' +
            '     ...,\n' +
            '     [\'a\', \'a\', \'a\', ..., \'a\', \'a\', \'a\'],\n' +
            '     [\'a\', \'a\', \'a\', ..., \'a\', \'a\', \'a\'],\n' +
            '     [\'a\', \'a\', \'a\', ..., \'a\', \'a\', \'a\']]');
    });
    it('2d with padding to align columns verbose', () => {
        const verbose = true;
        const str = tf.tensor([
            [0.8597712, 3, 0.2740789], [0.6696132, 0.4825962, 2.75],
            [1.991, 0.0640865, 0.2983858]
        ]).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: float32\n' +
            '  rank: 2\n' +
            '  shape: [3,3]\n' +
            '  values:\n' +
            '    [[0.8597712, 3        , 0.2740789],\n' +
            '     [0.6696132, 0.4825962, 2.75     ],\n' +
            '     [1.9910001, 0.0640865, 0.2983858]]');
    });
    it('2d string tensor with padding verbose', () => {
        const verbose = true;
        const str = tf.tensor([
            ['abcdef', 'a', 'abcdef'],
            ['abcdef', 'abcdef', 'abc'],
            ['abcd', 'abcdef', 'abcdef'],
        ]).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: string\n' +
            '  rank: 2\n' +
            '  shape: [3,3]\n' +
            '  values:\n' +
            '    [[\'abcdef\', \'a\'     , \'abcdef\'],\n' +
            '     [\'abcdef\', \'abcdef\', \'abc\'   ],\n' +
            '     [\'abcd\'  , \'abcdef\', \'abcdef\']]');
    });
    it('scalar', () => {
        const str = tf.scalar(5).toString();
        expect(str).toEqual('Tensor\n' +
            '    5');
    });
    it('scalar string', () => {
        const str = tf.scalar('hello').toString();
        expect(str).toEqual('Tensor\n' +
            '    hello');
    });
    it('1d tensor', () => {
        const str = tf.zeros([4]).toString();
        expect(str).toEqual('Tensor\n' +
            '    [0, 0, 0, 0]');
    });
    it('2d tensor', () => {
        const str = tf.zeros([3, 3]).toString();
        expect(str).toEqual('Tensor\n' +
            '    [[0, 0, 0],\n' +
            '     [0, 0, 0],\n' +
            '     [0, 0, 0]]');
    });
    it('3d tensor', () => {
        const str = tf.zeros([3, 3, 2]).toString();
        expect(str).toEqual('Tensor\n' +
            '    [[[0, 0],\n' +
            '      [0, 0],\n' +
            '      [0, 0]],\n\n' +
            '     [[0, 0],\n' +
            '      [0, 0],\n' +
            '      [0, 0]],\n\n' +
            '     [[0, 0],\n' +
            '      [0, 0],\n' +
            '      [0, 0]]]');
    });
    it('1d long tensor', () => {
        const str = tf.zeros([100]).toString();
        expect(str).toEqual('Tensor\n' +
            '    [0, 0, 0, ..., 0, 0, 0]');
    });
    it('2d long tensor', () => {
        const str = tf.zeros([100, 100]).toString();
        expect(str).toEqual('Tensor\n' +
            '    [[0, 0, 0, ..., 0, 0, 0],\n' +
            '     [0, 0, 0, ..., 0, 0, 0],\n' +
            '     [0, 0, 0, ..., 0, 0, 0],\n' +
            '     ...,\n' +
            '     [0, 0, 0, ..., 0, 0, 0],\n' +
            '     [0, 0, 0, ..., 0, 0, 0],\n' +
            '     [0, 0, 0, ..., 0, 0, 0]]');
    });
    it('2d with padding to align columns', () => {
        const str = tf.tensor([
            [0.8597712, 3, 0.2740789], [0.6696132, 0.4825962, 2.75],
            [1.991, 0.0640865, 0.2983858]
        ]).toString();
        expect(str).toEqual('Tensor\n' +
            '    [[0.8597712, 3        , 0.2740789],\n' +
            '     [0.6696132, 0.4825962, 2.75     ],\n' +
            '     [1.9910001, 0.0640865, 0.2983858]]');
    });
    it('scalar complex64 verbose', () => {
        const verbose = true;
        const str = tf.complex(5, 6).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: complex64\n' +
            '  rank: 0\n' +
            '  shape: []\n' +
            '  values:\n' +
            '    5 + 6j');
    });
    it('1d complex64 tensor verbose', () => {
        const verbose = true;
        const str = tf.complex([3, 5], [4, 6]).toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: complex64\n' +
            '  rank: 1\n' +
            '  shape: [2]\n' +
            '  values:\n' +
            '    [3 + 4j, 5 + 6j]');
    });
    it('2d complex64 tensor verbose', () => {
        const verbose = true;
        const str = tf.complex(tf.linspace(0, 8, 9), tf.linspace(8, 0, 9))
            .reshape([3, 3])
            .toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: complex64\n' +
            '  rank: 2\n' +
            '  shape: [3,3]\n' +
            '  values:\n' +
            '    [[0 + 8j, 1 + 7j, 2 + 6j],\n' +
            '     [3 + 5j, 4 + 4j, 5 + 3j],\n' +
            '     [6 + 2j, 7 + 1j, 8 + 0j]]');
    });
    it('3d complex64 tensor verbose', () => {
        const verbose = true;
        const str = tf.complex(tf.linspace(0, 17, 18), tf.linspace(17, 0, 18))
            .reshape([3, 3, 2])
            .toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: complex64\n' +
            '  rank: 3\n' +
            '  shape: [3,3,2]\n' +
            '  values:\n' +
            '    [[[0 + 17j, 1 + 16j],\n' +
            '      [2 + 15j, 3 + 14j],\n' +
            '      [4 + 13j, 5 + 12j]],\n\n' +
            '     [[6 + 11j, 7 + 10j],\n' +
            '      [8 + 9j , 9 + 8j ],\n' +
            '      [10 + 7j, 11 + 6j]],\n\n' +
            '     [[12 + 5j, 13 + 4j],\n' +
            '      [14 + 3j, 15 + 2j],\n' +
            '      [16 + 1j, 17 + 0j]]]');
    });
    it('1d long complex64 tensor verbose', () => {
        const verbose = true;
        const str = tf.complex(tf.linspace(0, 99, 100), tf.linspace(99, 0, 100))
            .toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: complex64\n' +
            '  rank: 1\n' +
            '  shape: [100]\n' +
            '  values:\n' +
            '    [0 + 99j, 1 + 98j, 2 + 97j, ..., 97 + 2j, 98 + 1j, 99 + 0j]');
    });
    it('2d long complex64 tensor verbose', () => {
        const verbose = true;
        const dim = 100;
        const str = tf.complex(tf.linspace(0, dim * dim - 1, dim * dim), tf.linspace(dim * dim - 1, 0, dim * dim))
            .reshape([dim, dim])
            .toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: complex64\n' +
            '  rank: 2\n' +
            '  shape: [100,100]\n' +
            '  values:\n' +
            // tslint:disable:max-line-length
            '    [[0 + 9999j   , 1 + 9998j   , 2 + 9997j   , ..., 97 + 9902j  , 98 + 9901j  , 99 + 9900j  ],\n' +
            '     [100 + 9899j , 101 + 9898j , 102 + 9897j , ..., 197 + 9802j , 198 + 9801j , 199 + 9800j ],\n' +
            '     [200 + 9799j , 201 + 9798j , 202 + 9797j , ..., 297 + 9702j , 298 + 9701j , 299 + 9700j ],\n' +
            '     ...,\n' +
            '     [9700 + 299j , 9701 + 298j , 9702 + 297j , ..., 9797 + 202j , 9798 + 201j , 9799 + 200j ],\n' +
            '     [9800 + 199j , 9801 + 198j , 9802 + 197j , ..., 9897 + 102j , 9898 + 101j , 9899 + 100j ],\n' +
            '     [9900 + 99j  , 9901 + 98j  , 9902 + 97j  , ..., 9997 + 2j   , 9998 + 1j   , 9999 + 0j   ]]');
        // tslint:enable:max-line-length
    });
    it('2d complex64 with padding to align columns verbose', () => {
        const verbose = true;
        const str = tf.complex([
            [0.8597712, 3, 0.2740789], [0.6696132, 0.4825962, 2.75],
            [1.991, 0.0640865, 0.2983858]
        ], [[1, 1.0102332, 3], [2, 5, 2.34424], [1.23, 2, 0.123]])
            .toString(verbose);
        expect(str).toEqual('Tensor\n' +
            '  dtype: complex64\n' +
            '  rank: 2\n' +
            '  shape: [3,3]\n' +
            '  values:\n' +
            '    [[0.8597712 + 1j   , 3 + 1.0102332j, 0.2740789 + 3j    ],\n' +
            '     [0.6696132 + 2j   , 0.4825962 + 5j, 2.75 + 2.34424j   ],\n' +
            '     [1.9910001 + 1.23j, 0.0640865 + 2j, 0.2983858 + 0.123j]]');
    });
    it('scalar complex64', () => {
        const str = tf.complex(5, 4).toString();
        expect(str).toEqual('Tensor\n' +
            '    5 + 4j');
    });
    it('1d complex64 tensor', () => {
        const str = tf.complex(tf.linspace(0, 3, 4), tf.linspace(3, 0, 4)).toString();
        expect(str).toEqual('Tensor\n' +
            '    [0 + 3j, 1 + 2j, 2 + 1j, 3 + 0j]');
    });
    it('2d complex64 tensor', () => {
        const str = tf.complex(tf.linspace(0, 8, 9), tf.linspace(8, 0, 9))
            .reshape([3, 3])
            .toString();
        expect(str).toEqual('Tensor\n' +
            '    [[0 + 8j, 1 + 7j, 2 + 6j],\n' +
            '     [3 + 5j, 4 + 4j, 5 + 3j],\n' +
            '     [6 + 2j, 7 + 1j, 8 + 0j]]');
    });
    it('3d complex64 tensor', () => {
        const str = tf.complex(tf.linspace(0, 17, 18), tf.linspace(17, 0, 18))
            .reshape([3, 3, 2])
            .toString();
        expect(str).toEqual('Tensor\n' +
            '    [[[0 + 17j, 1 + 16j],\n' +
            '      [2 + 15j, 3 + 14j],\n' +
            '      [4 + 13j, 5 + 12j]],\n\n' +
            '     [[6 + 11j, 7 + 10j],\n' +
            '      [8 + 9j , 9 + 8j ],\n' +
            '      [10 + 7j, 11 + 6j]],\n\n' +
            '     [[12 + 5j, 13 + 4j],\n' +
            '      [14 + 3j, 15 + 2j],\n' +
            '      [16 + 1j, 17 + 0j]]]');
    });
    it('1d long complex64 tensor', () => {
        const str = tf.complex(tf.linspace(0, 99, 100), tf.linspace(99, 0, 100)).toString();
        expect(str).toEqual('Tensor\n' +
            '    [0 + 99j, 1 + 98j, 2 + 97j, ..., 97 + 2j, 98 + 1j, 99 + 0j]');
    });
    it('2d long complex64 tensor', () => {
        const dim = 100;
        const str = tf.complex(tf.linspace(0, dim * dim - 1, dim * dim), tf.linspace(dim * dim - 1, 0, dim * dim))
            .reshape([dim, dim])
            .toString();
        expect(str).toEqual('Tensor\n' +
            // tslint:disable:max-line-length
            '    [[0 + 9999j   , 1 + 9998j   , 2 + 9997j   , ..., 97 + 9902j  , 98 + 9901j  , 99 + 9900j  ],\n' +
            '     [100 + 9899j , 101 + 9898j , 102 + 9897j , ..., 197 + 9802j , 198 + 9801j , 199 + 9800j ],\n' +
            '     [200 + 9799j , 201 + 9798j , 202 + 9797j , ..., 297 + 9702j , 298 + 9701j , 299 + 9700j ],\n' +
            '     ...,\n' +
            '     [9700 + 299j , 9701 + 298j , 9702 + 297j , ..., 9797 + 202j , 9798 + 201j , 9799 + 200j ],\n' +
            '     [9800 + 199j , 9801 + 198j , 9802 + 197j , ..., 9897 + 102j , 9898 + 101j , 9899 + 100j ],\n' +
            '     [9900 + 99j  , 9901 + 98j  , 9902 + 97j  , ..., 9997 + 2j   , 9998 + 1j   , 9999 + 0j   ]]');
        // tslint:enable:max-line-length
    });
    it('2d complex64 with padding to align columns', () => {
        const str = tf.complex([
            [0.8597712, 3, 0.2740789], [0.6696132, 0.4825962, 2.75],
            [1.991, 0.0640865, 0.2983858]
        ], [[1, 1.0102332, 3], [2, 5, 2.34424], [1.23, 2, 0.123]])
            .toString();
        expect(str).toEqual('Tensor\n' +
            '    [[0.8597712 + 1j   , 3 + 1.0102332j, 0.2740789 + 3j    ],\n' +
            '     [0.6696132 + 2j   , 0.4825962 + 5j, 2.75 + 2.34424j   ],\n' +
            '     [1.9910001 + 1.23j, 0.0640865 + 2j, 0.2983858 + 0.123j]]');
    });
});
describeWithFlags('tensor grad', ALL_ENVS, () => {
    it('grad with second derivative', async () => {
        // f(x) = x ^ 3
        const f = (x) => x.pow(tf.scalar(3, 'int32'));
        // f'(x) = 3x ^ 2
        const g = tf.grad(f);
        // f''(x) = 6x
        const gg = tf.grad(g);
        const x = tf.tensor1d([2, 3]);
        const data = gg(x);
        expectArraysClose(await data.data(), [12, 18]);
    });
});
describeWithFlags('tensor.data', ALL_ENVS, () => {
    it('interleaving .data() and .dataSync()', async () => {
        const a = tf.tensor1d([1, 2, 3]);
        const b = tf.tensor1d([4, 5, 6]);
        const ra = a.square();
        const rb = b.square();
        expectArraysClose(await a.data(), [1, 2, 3]);
        expectArraysClose(await b.data(), [4, 5, 6]);
        expectArraysClose(await rb.data(), [16, 25, 36]);
        expectArraysClose(await ra.data(), [1, 4, 9]);
    });
    it('.data() postpones disposal of tensor', done => {
        expect(tf.memory().numTensors).toBe(0);
        tf.tidy(() => {
            const a = tf.scalar(5);
            expect(tf.memory().numTensors).toBe(1);
            a.square(); // Uploads it on GPU.
            a.data().then(vals => {
                // The tidy above should not dispose the scalar since there is
                // a pending data read.
                expectNumbersClose(vals[0], 5);
            });
        });
        // tidy ends immediately, but should not dispose the scalar.
        setTimeout(() => {
            // tidy should dispose the tensor.
            expect(tf.memory().numTensors).toBe(0);
            done();
        });
    });
    it('calling .data() twice works (2 subscribers to a single read)', done => {
        tf.tidy(() => {
            const a = tf.scalar(5);
            a.square(); // Uploads it on GPU.
            a.data().then(vals => {
                expectNumbersClose(vals[0], 5);
            });
            a.data()
                .then(vals => {
                expectNumbersClose(vals[0], 5);
            })
                .then(done);
        });
        // tidy ends immediately, but should not dispose the scalar since there is
        // a pending data read.
    });
});
describeWithFlags('x instanceof Tensor', ALL_ENVS, () => {
    it('x: Tensor', () => {
        const t = tf.scalar(1);
        expect(t instanceof Tensor).toBe(true);
    });
    it('x: other object, fails', () => {
        const t = { something: 'else' };
        expect(t instanceof Tensor).toBe(false);
    });
    it('x: undefined or null, fails', () => {
        // tslint:disable-next-line:no-any
        expect(undefined instanceof Tensor).toBe(false);
        // tslint:disable-next-line:no-any
        expect(null instanceof Tensor).toBe(false);
    });
});
describeWithFlags('tensor with 0 in shape', ALL_ENVS, () => {
    it('1d of shape [0]', async () => {
        const a = tf.tensor1d([]);
        expect(a.dtype).toBe('float32');
        expect(a.rank).toBe(1);
        expect(a.shape).toEqual([0]);
        expectArraysEqual(await a.data(), []);
    });
    it('1d string tensor of shape [0]', async () => {
        const a = tf.tensor1d([], 'string');
        expect(a.dtype).toBe('string');
        expect(a.rank).toBe(1);
        expect(a.shape).toEqual([0]);
        expectArraysEqual(await a.data(), []);
    });
    it('2d of shape [0, 5]', async () => {
        const a = tf.tensor2d([], [0, 5]);
        expect(a.dtype).toBe('float32');
        expect(a.rank).toBe(2);
        expect(a.shape).toEqual([0, 5]);
        expectArraysEqual(await a.data(), []);
    });
    it('2d string tensor of shape [0, 5]', async () => {
        const a = tf.tensor2d([], [0, 5], 'string');
        expect(a.dtype).toBe('string');
        expect(a.rank).toBe(2);
        expect(a.shape).toEqual([0, 5]);
        expectArraysEqual(await a.data(), []);
    });
    it('2d throws when values are not empty', () => {
        const values = [1, 2, 3, 4];
        expect(() => tf.tensor2d(values, [0, 5], 'float32'))
            .toThrowError('Based on the provided shape, [0,5], the ' +
            'tensor should have 0 values but has 4');
    });
    it('3d of shape [0, 3, 0]', async () => {
        const a = tf.tensor3d([], [0, 3, 0]);
        expect(a.dtype).toBe('float32');
        expect(a.rank).toBe(3);
        expect(a.shape).toEqual([0, 3, 0]);
        expectArraysEqual(await a.data(), []);
    });
    it('3d throws when values are not empty', () => {
        const values = [1, 2, 3];
        expect(() => tf.tensor3d(values, [0, 3, 0], 'float32'))
            .toThrowError('Based on the provided shape, [0,3,0], the ' +
            'tensor should have 0 values but has 3');
    });
    it('4d of shape [1, 3, 0, 5]', async () => {
        const a = tf.tensor4d([], [1, 3, 0, 5]);
        expect(a.dtype).toBe('float32');
        expect(a.rank).toBe(4);
        expect(a.shape).toEqual([1, 3, 0, 5]);
        expectArraysEqual(await a.data(), []);
    });
    it('4d throws when values are not empty', () => {
        const values = [1, 2, 3];
        expect(() => tf.tensor4d(values, [1, 3, 0, 5], 'float32'))
            .toThrowError('Based on the provided shape, [1,3,0,5], the ' +
            'tensor should have 0 values but has 3');
    });
    it('complex64 with 0 in shape', async () => {
        const areal = tf.tensor2d([], [0, 5]);
        const breal = tf.tensor2d([], [0, 5]);
        const a = tf.complex(areal, breal);
        expect(a.dtype).toBe('complex64');
        expect(a.rank).toBe(2);
        expect(a.shape).toEqual([0, 5]);
        expectArraysEqual(await a.data(), []);
    });
});
describeWithFlags('tensor.bytes()', ALL_ENVS, () => {
    /** Helper method to get the bytes from a typed array. */
    function getBytes(a) {
        return new Uint8Array(a.buffer);
    }
    it('float32 tensor', async () => {
        const a = tf.tensor([1.1, 3.2, 7], [3], 'float32');
        expect(await a.bytes()).toEqual(getBytes(new Float32Array([1.1, 3.2, 7])));
    });
    it('int32 tensor', async () => {
        const a = tf.tensor([1.1, 3.2, 7], [3], 'int32');
        expect(await a.bytes()).toEqual(getBytes(new Int32Array([1, 3, 7])));
    });
    it('bool tensor', async () => {
        const a = tf.tensor([true, true, false], [3], 'bool');
        expect(await a.bytes()).toEqual(new Uint8Array([1, 1, 0]));
    });
    it('string tensor from native strings', async () => {
        const a = tf.tensor(['hello', 'world'], [2], 'string');
        expect(await a.bytes()).toEqual([
            encodeString('hello'), encodeString('world')
        ]);
    });
    it('string tensor from encoded bytes', async () => {
        const a = tf.tensor([encodeString('hello'), encodeString('world')], [2], 'string');
        expect(await a.bytes()).toEqual([
            encodeString('hello'), encodeString('world')
        ]);
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yX3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3RlbnNvcl90ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ25DLE9BQU8sRUFBUyxNQUFNLEVBQXlDLE1BQU0sVUFBVSxDQUFDO0FBQ2hGLE9BQU8sRUFBQyxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFcEcsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUVwQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtJQUN6QyxFQUFFLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekMsWUFBWTtRQUNaLElBQUksQ0FBQyxHQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0MsY0FBYztRQUNkLENBQUMsR0FBRyxF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LENBQUMsTUFBTSxFQUFFLENBQUM7UUFDL0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscUJBQXFCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbkMsTUFBTSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN2QyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyQyxNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHFCQUFxQixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXhDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25ELE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHFCQUFxQixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU1QyxNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDcEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzNELE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMs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UUFDbkQsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFeEMsTUFBTSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkQsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscUJBQXFCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbkMsTUFBTSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RELE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTVDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0RCxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxN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QUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMseUJBQXlCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdkMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFN0IsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbEMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDeEMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDMUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFL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WSxFQUFFLENBQUM7SUFDdkUsQ0FBQyxDQUFDLENBQUM7SUFFTixFQUFFLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0MsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QixpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0MsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QixpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0MsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QixpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekQsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMzQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDNUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkQsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDMUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckQsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUIsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDcEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsZUFBZSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzdCLE1BQU0s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O0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDhCQUE4QixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzVDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDhCQUE4QixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzVDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMxQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFD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LEVBQUU7UUFDMUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FDakIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUIsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDJCQUEyQixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3pDLE1BQU0sQ0FBQyxHQUNILEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDNUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGVBQWUsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM3QixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsZUFBZSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzdCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzdELE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsYUFBYSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzNCLE1BQU0sQ0FBQyxHQUNILEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6RSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzdELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25FLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsdURBQXVELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2RSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsbURBQW1ELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDakUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDhCQUE4QixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzVDLE1BQU0sQ0FBQyxHQUNILEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM1QyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUNqQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMxQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUNqQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN6QyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUNqQixDQUFDLENBQUMsQ0FBQyxD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QUN4RSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN0QyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7UUFDaEMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLEVBQUU7UUFDOUIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNuQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDeEMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FB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O1FBQ3hDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUMvQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1FBQzdCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxF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QUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNqRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNuRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNoRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN2RCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxHQUFHLEVBQUU7UUFDN0MsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDNUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDMUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENB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QUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNwRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscUNBQXFDLEVBQUUsR0FBRyxFQUFFO1FBQzdDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNwRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7UUFDNUIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNqRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLEVBQUU7UUFDckMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNwRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxFQUFFO1FBQzVDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNwRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFD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RUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO1FBQ2xCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRTtRQUNsQixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO1FBQ2xCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO1FBQ2xCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzFELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuQixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FB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QUVILEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNoRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUNmLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQzlCLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDO1NBQzdDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCAqIGFzIHRmIGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHtBTExfRU5WUywgZGVzY3JpYmVXaXRoRmxhZ3MsIFNZTkNfQkFDS0VORF9FTlZTfSBmcm9tICcuL2phc21pbmVfdXRpbCc7XG5pbXBvcnQge3RlbnNvcjVkfSBmcm9tICcuL29wcy9vcHMnO1xuaW1wb3J0IHtTY2FsYXIsIFRlbnNvciwgVGVuc29yMUQsIFRlbnNvcjJELCBUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4vdGVuc29yJztcbmltcG9ydCB7ZW5jb2RlU3RyaW5ncywgZXhwZWN0QXJyYXlzQ2xvc2UsIGV4cGVjdEFycmF5c0VxdWFsLCBleHBlY3ROdW1iZXJzQ2xvc2V9IGZyb20gJy4vdGVzdF91dGlsJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZTFELCBUZW5zb3JMaWtlMkQsIFRlbnNvckxpa2UzRCwgVGVuc29yTGlrZTRELCBUeXBlZEFycmF5fSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7ZW5jb2RlU3RyaW5nfSBmcm9tICcuL3V0aWwnO1xuXG5kZXNjcmliZVdpdGhGbGFncygndGVuc29yJywgQUxMX0VOVlMsICgpID0+IHtcbiAgaXQoJ1RlbnNvcnMgb2YgYXJiaXRyYXJ5IHNpemUnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gWzEsIDIsIDNdXG4gICAgbGV0IHQ6IFRlbnNvciA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gICAgZXhwZWN0KHQucmFuaykudG9CZSgxKTtcbiAgICBleHBlY3QodC5zaXplKS50b0JlKDMpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IHQuZGF0YSgpLCBbMSwgMiwgM10pO1xuXG4gICAgLy8gW1sxLCAyLCAzXV1cbiAgICB0ID0gdGYudGVuc29yMmQoWzEsIDIsIDNdLCBbMSwgM10pO1xuICAgIGV4cGVjdCh0LnJhbmspLnRvQmUoMik7XG4gICAgZXhwZWN0KHQuc2l6ZSkudG9CZSgzKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCB0LmRhdGEoKSwgWzEsIDIsIDNdKTtcblxuICAgIC8vIFtbMSwgMiwgM10sXG4gICAgLy8gIFs0LCA1LCA2XV1cbiAgICB0ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDQsIDUsIDZdLCBbMiwgM10pO1xuICAgIGV4cGVjdCh0LnJhbmspLnRvQmUoMik7XG4gICAgZXhwZWN0KHQuc2l6ZSkudG9CZSg2KTtcblxuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IHQuZGF0YSgpLCBbMSwgMiwgMywgNCwgNSwgNl0pO1xuXG4gICAgLy8gU2hhcGUgbWlzbWF0Y2ggd2l0aCB0aGUgdmFsdWVzLlxuICAgIGV4cGVjdCgoKSA9PiB0Zi50ZW5zb3IyZChbMV0sIFsxLCAyXSkpLnRvVGhyb3dFcnJvcigpO1xuICB9KTtcblxuICBpdCgnVGVuc29ycyBvZiBleHBsaWNpdCBzaXplJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHQgPSB0Zi50ZW5zb3IxZChbNSwgMywgMl0pO1xuICAgIGV4cGVjdCh0LnJhbmspLnRvQmUoMSk7XG4gICAgZXhwZWN0KHQuc2hhcGUpLnRvRXF1YWwoWzNdKTtcblxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yM2QoWzEsIDJdLCBbMSwgMiwgMywgNV0gYXMgYW55KSkudG9UaHJvd0Vycm9yKCk7XG5cbiAgICBjb25zdCB0NCA9IHRmLnRlbnNvcjRkKFsxLCAyLCAzLCA0XSwgWzEsIDIsIDEsIDJdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCB0NC5kYXRhKCksIFsxLCAyLCAzLCA0XSk7XG5cbiAgICAvLyBUZW5zb3Igb2Ygb25lcy5cbiAgICBjb25zdCB4ID0gdGYub25lczxSYW5rLlIzPihbMywgNCwgMl0pO1xuICAgIGV4cGVjdCh4LnJhbmspLnRvQmUoMyk7XG4gICAgZXhwZWN0KHguc2l6ZSkudG9CZSgyNCk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgeC5kYXRhKCksIFtcbiAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFcbiAgICBdKTtcblxuICAgIC8vIFRlbnNvciBvZiB6ZXJvcy5cbiAgICBjb25zdCB6ID0gdGYuemVyb3M8UmFuay5SMz4oWzMsIDQsIDJdKTtcbiAgICBleHBlY3Qoei5yYW5rKS50b0JlKDMpO1xuICAgIGV4cGVjdCh6LnNpemUpLnRvQmUoMjQpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IHouZGF0YSgpLCBbXG4gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAgIF0pO1xuICB9KTtcblxuICBpdCgnVGVuc29yIGRhdGFTeW5jIENQVSAtLT4gR1BVJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNCwgNSwgNl0sIFszLCAyXSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYS5kYXRhKCksIG5ldyBGbG9hdDMyQXJyYXkoWzEsIDIsIDMsIDQsIDUsIDZdKSk7XG4gIH0pO1xuXG4gIGl0KCdUZW5zb3IuZGF0YSgpIENQVSAtLT4gR1BVJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNCwgNSwgNl0sIFszLCAyXSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYS5kYXRhKCksIG5ldyBGbG9hdDMyQXJyYXkoWzEsIDIsIDMsIDQsIDUsIDZdKSk7XG4gIH0pO1xuXG4gIGl0KCdUZW5zb3IuZGF0YSgpIHBhY2tlZCBDUFUgLS0+IEdQVScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDQsIDUsIDZdLCBbMywgMl0pO1xuICAgIHRmLm1hdE11bChhLCB0Zi50ZW5zb3IyZChbMSwgMl0sIFsyLCAxXSkpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBuZXcgRmxvYXQzMkFycmF5KFsxLCAyLCAzLCA0LCA1LCA2XSkpO1xuICB9KTtcblxuICBpdCgnU2NhbGFyIGJhc2ljIG1ldGhvZHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnNjYWxhcig1KTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBhLmRhdGEoKSwgWzVdKTtcbiAgICBleHBlY3QoYS5yYW5rKS50b0JlKDApO1xuICAgIGV4cGVjdChhLnNpemUpLnRvQmUoMSk7XG4gICAgZXhwZWN0KGEuc2hhcGUpLnRvRXF1YWwoW10pO1xuICB9KTtcblxuICBpdCgnaW5kZXhUb0xvYyBTY2FsYXInLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IGF3YWl0IHRmLnNjYWxhcigwKS5idWZmZXIoKTtcbiAgICBleHBlY3QoYS5pbmRleFRvTG9jKDApKS50b0VxdWFsKFtdKTtcblxuICAgIGNvbnN0IGIgPSBhd2FpdCB0Zi56ZXJvczxSYW5rLlIwPihbXSkuYnVmZmVyKCk7XG4gICAgZXhwZWN0KGIuaW5kZXhUb0xvYygwKSkudG9FcXVhbChbXSk7XG4gIH0pO1xuXG4gIGl0KCdpbmRleFRvTG9jIFRlbnNvcjFEJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSBhd2FpdCB0Zi56ZXJvcyhbM10pLmJ1ZmZlcigpO1xuICAgIGV4cGVjdChhLmluZGV4VG9Mb2MoMCkpLnRvRXF1YWwoWzBdKTtcbiAgICBleHBlY3QoYS5pbmRleFRvTG9jKDEpKS50b0VxdWFsKFsxXSk7XG4gICAgZXhwZWN0KGEuaW5kZXhUb0xvYygyKSkudG9FcXVhbChbMl0pO1xuXG4gICAgY29uc3QgYiA9IGF3YWl0IHRmLnplcm9zPFJhbmsuUjE+KFszXSkuYnVmZmVyKCk7XG4gICAgZXhwZWN0KGIuaW5kZXhUb0xvYygwKSkudG9FcXVhbChbMF0pO1xuICAgIGV4cGVjdChiLmluZGV4VG9Mb2MoMSkpLnRvRXF1YWwoWzFdKTtcbiAgICBleHBlY3QoYi5pbmRleFRvTG9jKDIpKS50b0VxdWFsKFsyXSk7XG4gIH0pO1xuXG4gIGl0KCdpbmRleFRvTG9jIFRlbnNvcjJEJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSBhd2FpdCB0Zi56ZXJvcyhbMywgMl0pLmJ1ZmZlcigpO1xuICAgIGV4cGVjdChhLmluZGV4VG9Mb2MoMCkpLnRvRXF1YWwoWzAsIDBdKTtcbiAgICBleHBlY3QoYS5pbmRleFRvTG9jKDEpKS50b0VxdWFsKFswLCAxXSk7XG4gICAgZXhwZWN0KGEuaW5kZXhUb0xvYygyKSkudG9FcXVhbChbMSwgMF0pO1xuICAgIGV4cGVjdChhLmluZGV4VG9Mb2MoMykpLnRvRXF1YWwoWzEsIDFdKTtcbiAgICBleHBlY3QoYS5pbmRleFRvTG9jKDQpKS50b0VxdWFsKFsyLCAwXSk7XG4gICAgZXhwZWN0KGEuaW5kZXhUb0xvYyg1KSkudG9FcXVhbChbMiwgMV0pO1xuXG4gICAgY29uc3QgYiA9IGF3YWl0IHRmLnplcm9zPFJhbmsuUjI+KFszLCAyXSkuYnVmZmVyKCk7XG4gICAgZXhwZWN0KGIuaW5kZXhUb0xvYygwKSkudG9FcXVhbChbMCwgMF0pO1xuICAgIGV4cGVjdChiLmluZGV4VG9Mb2MoMSkpLnRvRXF1YWwoWzAsIDFdKTtcbiAgICBleHBlY3QoYi5pbmRleFRvTG9jKDIpKS50b0VxdWFsKFsxLCAwXSk7XG4gICAgZXhwZWN0KGIuaW5kZXhUb0xvYygzKSkudG9FcXVhbChbMSwgMV0pO1xuICAgIGV4cGVjdChiLmluZGV4VG9Mb2MoNCkpLnRvRXF1YWwoWzIsIDBdKTtcbiAgICBleHBlY3QoYi5pbmRleFRvTG9jKDUpKS50b0VxdWFsKFsyLCAxXSk7XG4gIH0pO1xuXG4gIGl0KCdpbmRleFRvTG9jIFRlbnNvcjNEJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSBhd2FpdCB0Zi56ZXJvcyhbMywgMiwgMl0pLmJ1ZmZlcigpO1xuICAgIGV4cGVjdChhLmluZGV4VG9Mb2MoMCkpLnRvRXF1YWwoWzAsIDAsIDBdKTtcbiAgICBleHBlY3QoYS5pbmRleFRvTG9jKDEpKS50b0VxdWFsKFswLCAwLCAxXSk7XG4gICAgZXhwZWN0KGEuaW5kZXhUb0xvYygyKSkudG9FcXVhbChbMCwgMSwgMF0pO1xuICAgIGV4cGVjdChhLmluZGV4VG9Mb2MoMykpLnRvRXF1YWwoWzAsIDEsIDFdKTtcbiAgICBleHBlY3QoYS5pbmRleFRvTG9jKDQpKS50b0VxdWFsKFsxLCAwLCAwXSk7XG4gICAgZXhwZWN0KGEuaW5kZXhUb0xvYyg1KSkudG9FcXVhbChbMSwgMCwgMV0pO1xuICAgIGV4cGVjdChhLmluZGV4VG9Mb2MoMTEpKS50b0VxdWFsKFsyLCAxLCAxXSk7XG5cbiAgICBjb25zdCBiID0gYXdhaXQgdGYuemVyb3M8UmFuay5SMz4oWzMsIDIsIDJdKS5idWZmZXIoKTtcbiAgICBleHBlY3QoYi5pbmRleFRvTG9jKDApKS50b0VxdWFsKFswLCAwLCAwXSk7XG4gICAgZXhwZWN0KGIuaW5kZXhUb0xvYygxKSkudG9FcXVhbChbMCwgMCwgMV0pO1xuICAgIGV4cGVjdChiLmluZGV4VG9Mb2MoMikpLnRvRXF1YWwoWzAsIDEsIDBdKTtcbiAgICBleHBlY3QoYi5pbmRleFRvTG9jKDMpKS50b0VxdWFsKFswLCAxLCAxXSk7XG4gICAgZXhwZWN0KGIuaW5kZXhUb0xvYyg0KSkudG9FcXVhbChbMSwgMCwgMF0pO1xuICAgIGV4cGVjdChiLmluZGV4VG9Mb2MoNSkpLnRvRXF1YWwoWzEsIDAsIDFdKTtcbiAgICBleHBlY3QoYi5pbmRleFRvTG9jKDExKSkudG9FcXVhbChbMiwgMSwgMV0pO1xuICB9KTtcblxuICBpdCgnaW5kZXhUb0xvYyBUZW5zb3IgNUQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShbMSwgMiwgMywgNF0pO1xuICAgIGNvbnN0IGEgPSBhd2FpdCB0ZW5zb3I1ZCh2YWx1ZXMsIFsyLCAxLCAxLCAxLCAyXSkuYnVmZmVyKCk7XG4gICAgZXhwZWN0KGEuaW5kZXhUb0xvYygwKSkudG9FcXVhbChbMCwgMCwgMCwgMCwgMF0pO1xuICAgIGV4cGVjdChhLmluZGV4VG9Mb2MoMSkpLnRvRXF1YWwoWzAsIDAsIDAsIDAsIDFdKTtcbiAgICBleHBlY3QoYS5pbmRleFRvTG9jKDIpKS50b0VxdWFsKFsxLCAwLCAwLCAwLCAwXSk7XG4gICAgZXhwZWN0KGEuaW5kZXhUb0xvYygzKSkudG9FcXVhbChbMSwgMCwgMCwgMCwgMV0pO1xuICB9KTtcblxuICBpdCgnbG9jVG9JbmRleCBTY2FsYXInLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IGF3YWl0IHRmLnNjYWxhcigwKS5idWZmZXIoKTtcbiAgICBleHBlY3QoYS5sb2NUb0luZGV4KFtdKSkudG9FcXVhbCgwKTtcblxuICAgIGNvbnN0IGIgPSBhd2FpdCB0Zi56ZXJvczxSYW5rLlIwPihbXSkuYnVmZmVyKCk7XG4gICAgZXhwZWN0KGIubG9jVG9JbmRleChbXSkpLnRvRXF1YWwoMCk7XG4gIH0pO1xuXG4gIGl0KCdsb2NUb0luZGV4IFRlbnNvcjFEJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSBhd2FpdCB0Zi56ZXJvczxSYW5rLlIxPihbM10pLmJ1ZmZlcigpO1xuICAgIGV4cGVjdChhLmxvY1RvSW5kZXgoWzBdKSkudG9FcXVhbCgwKTtcbiAgICBleHBlY3QoYS5sb2NUb0luZGV4KFsxXSkpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGEubG9jVG9JbmRleChbMl0pKS50b0VxdWFsKDIpO1xuXG4gICAgY29uc3QgYiA9IGF3YWl0IHRmLnplcm9zPFJhbmsuUjE+KFszXSkuYnVmZmVyKCk7XG4gICAgZXhwZWN0KGIubG9jVG9JbmRleChbMF0pKS50b0VxdWFsKDApO1xuICAgIGV4cGVjdChiLmxvY1RvSW5kZXgoWzFdKSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoYi5sb2NUb0luZGV4KFsyXSkpLnRvRXF1YWwoMik7XG4gIH0pO1xuXG4gIGl0KCdsb2NUb0luZGV4IFRlbnNvcjJEJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSBhd2FpdCB0Zi56ZXJvczxSYW5rLlIyPihbMywgMl0pLmJ1ZmZlcigpO1xuICAgIGV4cGVjdChhLmxvY1RvSW5kZXgoWzAsIDBdKSkudG9FcXVhbCgwKTtcbiAgICBleHBlY3QoYS5sb2NUb0luZGV4KFswLCAxXSkpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGEubG9jVG9JbmRleChbMSwgMF0pKS50b0VxdWFsKDIpO1xuICAgIGV4cGVjdChhLmxvY1RvSW5kZXgoWzEsIDFdKSkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoYS5sb2NUb0luZGV4KFsyLCAwXSkpLnRvRXF1YWwoNCk7XG4gICAgZXhwZWN0KGEubG9jVG9JbmRleChbMiwgMV0pKS50b0VxdWFsKDUpO1xuXG4gICAgY29uc3QgYiA9IGF3YWl0IHRmLnplcm9zPFJhbmsuUjI+KFszLCAyXSkuYnVmZmVyKCk7XG4gICAgZXhwZWN0KGIubG9jVG9JbmRleChbMCwgMF0pKS50b0VxdWFsKDApO1xuICAgIGV4cGVjdChiLmxvY1RvSW5kZXgoWzAsIDFdKSkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoYi5sb2NUb0luZGV4KFsxLCAwXSkpLnRvRXF1YWwoMik7XG4gICAgZXhwZWN0KGIubG9jVG9JbmRleChbMSwgMV0pKS50b0VxdWFsKDMpO1xuICAgIGV4cGVjdChiLmxvY1RvSW5kZXgoWzIsIDBdKSkudG9FcXVhbCg0KTtcbiAgICBleHBlY3QoYi5sb2NUb0luZGV4KFsyLCAxXSkpLnRvRXF1YWwoNSk7XG4gIH0pO1xuXG4gIGl0KCdsb2NUb0luZGV4IFRlbnNvcjNEJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSBhd2FpdCB0Zi56ZXJvczxSYW5rLlIzPihbMywgMiwgMl0pLmJ1ZmZlcigpO1xuICAgIGV4cGVjdChhLmxvY1RvSW5kZXgoWzAsIDAsIDBdKSkudG9FcXVhbCgwKTtcbiAgICBleHBlY3QoYS5sb2NUb0luZGV4KFswLCAwLCAxXSkpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KGEubG9jVG9JbmRleChbMCwgMSwgMF0pKS50b0VxdWFsKDIpO1xuICAgIGV4cGVjdChhLmxvY1RvSW5kZXgoWzAsIDEsIDFdKSkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoYS5sb2NUb0luZGV4KFsxLCAwLCAwXSkpLnRvRXF1YWwoNCk7XG4gICAgZXhwZWN0KGEubG9jVG9JbmRleChbMSwgMCwgMV0pKS50b0VxdWFsKDUpO1xuICAgIGV4cGVjdChhLmxvY1RvSW5kZXgoWzIsIDEsIDFdKSkudG9FcXVhbCgxMSk7XG5cbiAgICBjb25zdCBiID0gYXdhaXQgdGYuemVyb3M8UmFuay5SMz4oWzMsIDIsIDJdKS5idWZmZXIoKTtcbiAgICBleHBlY3QoYi5sb2NUb0luZGV4KFswLCAwLCAwXSkpLnRvRXF1YWwoMCk7XG4gICAgZXhwZWN0KGIubG9jVG9JbmRleChbMCwgMCwgMV0pKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChiLmxvY1RvSW5kZXgoWzAsIDEsIDBdKSkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoYi5sb2NUb0luZGV4KFswLCAxLCAxXSkpLnRvRXF1YWwoMyk7XG4gICAgZXhwZWN0KGIubG9jVG9JbmRleChbMSwgMCwgMF0pKS50b0VxdWFsKDQpO1xuICAgIGV4cGVjdChiLmxvY1RvSW5kZXgoWzEsIDAsIDFdKSkudG9FcXVhbCg1KTtcbiAgICBleHBlY3QoYi5sb2NUb0luZGV4KFsyLCAxLCAxXSkpLnRvRXF1YWwoMTEpO1xuICB9KTtcblxuICBpdCgnVGVuc29yIGFzc2lnbmFiaWxpdHkgKGFzc2VydHMgY29tcGlsZXIpJywgKCkgPT4ge1xuICAgIC8vIFRoaXMgdGVzdCBhc3NlcnRzIGNvbXBpbGF0aW9uLCBub3QgZG9pbmcgYW55IHJ1bi10aW1lIGFzc2VydGlvbi5cbiAgICBjb25zdCBhOiBUZW5zb3I8UmFuay5SMD4gPSBudWxsO1xuICAgIGNvbnN0IGI6IFNjYWxhciA9IGE7XG4gICAgZXhwZWN0KGIpLnRvQmVOdWxsKCk7XG5cbiAgICBjb25zdCBhMTogVGVuc29yPFJhbmsuUjE+ID0gbnVsbDtcbiAgICBjb25zdCBiMTogVGVuc29yMUQgPSBhMTtcbiAgICBleHBlY3QoYjEpLnRvQmVOdWxsKCk7XG5cbiAgICBjb25zdCBhMjogVGVuc29yPFJhbmsuUjI+ID0gbnVsbDtcbiAgICBjb25zdCBiMjogVGVuc29yMkQgPSBhMjtcbiAgICBleHBlY3QoYjIpLnRvQmVOdWxsKCk7XG5cbiAgICBjb25zdCBhMzogVGVuc29yPFJhbmsuUjM+ID0gbnVsbDtcbiAgICBjb25zdCBiMzogVGVuc29yM0QgPSBhMztcbiAgICBleHBlY3QoYjMpLnRvQmVOdWxsKCk7XG5cbiAgICBjb25zdCBhNDogVGVuc29yPFJhbmsuUjQ+ID0gbnVsbDtcbiAgICBjb25zdCBiNDogVGVuc29yNEQgPSBhNDtcbiAgICBleHBlY3QoYjQpLnRvQmVOdWxsKCk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3IxZCgpIGZyb20gbnVtYmVyW10nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYS5kYXRhKCksIFsxLCAyLCAzXSk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3IxZCgpIHRocm93IGVycm9yIHdpdGggbnVsbCBpbnB1dCB2YWx1ZScsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yMWQobnVsbCkpXG4gICAgICAgIC50b1Rocm93RXJyb3IoXG4gICAgICAgICAgICAnVGhlIGlucHV0IHRvIHRoZSB0ZW5zb3IgY29uc3RydWN0b3IgJyArXG4gICAgICAgICAgICAnbXVzdCBiZSBhIG5vbi1udWxsIHZhbHVlLicpO1xuICB9KTtcblxuICBpdCgndGYudGVuc29yMWQoKSBmcm9tIHN0cmluZ1tdJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbJ2FhJywgJ2JiJywgJ2NjJ10pO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdzdHJpbmcnKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbM10pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbJ2FhJywgJ2JiJywgJ2NjJ10pO1xuICB9KTtcblxuICBpdCgndGYudGVuc29yMWQoKSBmcm9tIGVuY29kZWQgc3RyaW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBieXRlcyA9IGVuY29kZVN0cmluZ3MoWydhYScsICdiYicsICdjYyddKSBhcyBUZW5zb3JMaWtlMUQ7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjFkKGJ5dGVzLCAnc3RyaW5nJyk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ3N0cmluZycpO1xuICAgIGV4cGVjdChhLnNoYXBlKS50b0VxdWFsKFszXSk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIFsnYWEnLCAnYmInLCAnY2MnXSk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3IxZCgpIGZyb20gZW5jb2RlZCBzdHJpbmdzIHdpdGhvdXQgZHR5cGUgZXJyb3JzJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFdlIGRvIG5vdCB3YW50IHRvIGluZmVyICdzdHJpbmcnIHdoZW4gdGhlIHVzZXIgcGFzc2VzIFVpbnQ4QXJyYXkgaW4gb3JkZXJcbiAgICAvLyB0byBiZSBmb3J3YXJkIGNvbXBhdGlibGUgaW4gdGhlIGZ1dHVyZSB3aGVuIHdlIGFkZCB1aW50OCBkdHlwZS5cbiAgICBjb25zdCBieXRlcyA9IGVuY29kZVN0cmluZ3MoWydhYScsICdiYicsICdjYyddKSBhcyBUZW5zb3JMaWtlMUQ7XG4gICAgZXhwZWN0KCgpID0+IHRmLnRlbnNvcjFkKGJ5dGVzKSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3IxZCgpIGZyb20gZW5jb2RlZCBzdHJpbmdzLCBzaGFwZSBtaXNtYXRjaCcsICgpID0+IHtcbiAgICBjb25zdCBieXRlcyA9IGVuY29kZVN0cmluZ3MoW1snYWEnXSwgWydiYiddLCBbJ2NjJ11dKSBhcyBUZW5zb3JMaWtlMUQ7XG4gICAgZXhwZWN0KCgpID0+IHRmLnRlbnNvcjFkKGJ5dGVzKSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3IxZCgpIGZyb20gbnVtYmVyW11bXSwgc2hhcGUgbWlzbWF0Y2gnLCAoKSA9PiB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGV4cGVjdCgoKSA9PiB0Zi50ZW5zb3IxZChbWzFdLCBbMl0sIFszXV0gYXMgYW55KSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3IxZCgpIGZyb20gc3RyaW5nW11bXSwgc2hhcGUgbWlzbWF0Y2gnLCAoKSA9PiB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGV4cGVjdCgoKSA9PiB0Zi50ZW5zb3IxZChbWydhJ10sIFsnYiddLCBbJ2MnXV0gYXMgYW55KSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3IyZCgpIGZyb20gbnVtYmVyW11bXScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMmQoW1sxLCAyLCAzXSwgWzQsIDUsIDZdXSwgWzIsIDNdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBhLmRhdGEoKSwgWzEsIDIsIDMsIDQsIDUsIDZdKTtcbiAgfSk7XG5cbiAgaXQoJ3RmLnRlbnNvcjJkKCkgZnJvbSBzdHJpbmdbXVtdJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWydhYScsICdiYiddLCBbJ2NjJywgJ2RkJ11dKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnc3RyaW5nJyk7XG4gICAgZXhwZWN0KGEuc2hhcGUpLnRvRXF1YWwoWzIsIDJdKTtcbiAgICBleHBlY3RBcnJheXNFcXVhbChhd2FpdCBhLmRhdGEoKSwgWydhYScsICdiYicsICdjYycsICdkZCddKTtcbiAgfSk7XG5cbiAgaXQoJ3RmLnRlbnNvcjJkKCkgZnJvbSBlbmNvZGVkIHN0cmluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnl0ZXMgPSBlbmNvZGVTdHJpbmdzKFtbJ2FhJywgJ2JiJ10sIFsnY2MnLCAnZGQnXV0pIGFzIFRlbnNvckxpa2UyRDtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMmQoYnl0ZXMsIFsyLCAyXSwgJ3N0cmluZycpO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdzdHJpbmcnKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbMiwgMl0pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbJ2FhJywgJ2JiJywgJ2NjJywgJ2RkJ10pO1xuICB9KTtcblxuICBpdCgndGYudGVuc29yMmQoKSBmcm9tIGVuY29kZWQgc3RyaW5ncyB3aXRob3V0IGR0eXBlIGVycm9ycycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBXZSBkbyBub3Qgd2FudCB0byBpbmZlciAnc3RyaW5nJyB3aGVuIHRoZSB1c2VyIHBhc3NlcyBVaW50OEFycmF5IGluIG9yZGVyXG4gICAgLy8gdG8gYmUgZm9yd2FyZCBjb21wYXRpYmxlIGluIHRoZSBmdXR1cmUgd2hlbiB3ZSBhZGQgdWludDggZHR5cGUuXG4gICAgY29uc3QgYnl0ZXMgPSBlbmNvZGVTdHJpbmdzKFtbJ2FhJywgJ2JiJ10sIFsnY2MnLCAnZGQnXV0pIGFzIFRlbnNvckxpa2UyRDtcbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yMmQoYnl0ZXMpKS50b1Rocm93RXJyb3IoKTtcbiAgfSk7XG5cbiAgaXQoJ3RmLnRlbnNvcjJkKCkgZnJvbSBlbmNvZGVkIHN0cmluZ3MsIHNoYXBlIG1pc21hdGNoJywgKCkgPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gZW5jb2RlU3RyaW5ncyhbWydhYScsICdiYiddLCBbJ2NjJywgJ2RkJ11dKSBhcyBUZW5zb3JMaWtlMkQ7XG4gICAgZXhwZWN0KCgpID0+IHRmLnRlbnNvcjJkKGJ5dGVzLCBbMywgMl0sICdzdHJpbmcnKSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3IyZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGJlIG9mIGxlbmd0aCAyJywgKCkgPT4ge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBjb25zdCBzaGFwZTogYW55ID0gWzRdO1xuICAgIGV4cGVjdCgoKSA9PiB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIHNoYXBlKSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3IyZCgpIGZyb20gbnVtYmVyW11bXSwgYnV0IHNoYXBlIGRvZXMgbm90IG1hdGNoJywgKCkgPT4ge1xuICAgIC8vIEFjdHVhbCBzaGFwZSBpcyBbMiwgM10uXG4gICAgZXhwZWN0KCgpID0+IHRmLnRlbnNvcjJkKFtbMSwgMiwgM10sIFs0LCA1LCA2XV0sIFszLCAyXSkpLnRvVGhyb3dFcnJvcigpO1xuICB9KTtcblxuICBpdCgndGYudGVuc29yMmQoKSBmcm9tIHN0cmluZ1tdW10sIGJ1dCBzaGFwZSBkb2VzIG5vdCBtYXRjaCcsICgpID0+IHtcbiAgICAvLyBBY3R1YWwgc2hhcGUgaXMgWzIsIDNdLlxuICAgIGNvbnN0IHZhbHMgPSBbWydhJywgJ2InLCAnYyddLCBbJ2QnLCAnZScsICdmJ11dO1xuICAgIGV4cGVjdCgoKSA9PiB0Zi50ZW5zb3IyZCh2YWxzLCBbMywgMl0pKS50b1Rocm93RXJyb3IoKTtcbiAgfSk7XG5cbiAgaXQoJ3RmLnRlbnNvcjJkKCkgZnJvbSBudW1iZXJbXSwgYnV0IG5vIHNoYXBlIHRocm93cyBlcnJvcicsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdKSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3IyZCgpIGZyb20gc3RyaW5nW10sIGJ1dCBubyBzaGFwZSB0aHJvd3MgZXJyb3InLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IHRmLnRlbnNvcjJkKFsnYScsICdiJywgJ2MnLCAnZCddKSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3IyZCgpIHRocm93IGVycm9yIHdpdGggbnVsbCBpbnB1dCB2YWx1ZScsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yMmQobnVsbCkpXG4gICAgICAgIC50b1Rocm93RXJyb3IoXG4gICAgICAgICAgICAnVGhlIGlucHV0IHRvIHRoZSB0ZW5zb3IgY29uc3RydWN0b3IgJyArXG4gICAgICAgICAgICAnbXVzdCBiZSBhIG5vbi1udWxsIHZhbHVlLicpO1xuICB9KTtcblxuICBpdCgndGVuc29yM2QoKSBmcm9tIG51bWJlcltdW11bXScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yM2QoW1tbMV0sIFsyXSwgWzNdXSwgW1s0XSwgWzVdLCBbNl1dXSwgWzIsIDMsIDFdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBhLmRhdGEoKSwgWzEsIDIsIDMsIDQsIDUsIDZdKTtcbiAgfSk7XG5cbiAgaXQoJ3RlbnNvcjNkKCkgZnJvbSBzdHJpbmdbXVtdW10nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdmFscyA9IFtbWydhJ10sIFsnYiddLCBbJ2MnXV0sIFtbJ2QnXSwgWydlJ10sIFsnZiddXV07XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjNkKHZhbHMsIFsyLCAzLCAxXSk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ3N0cmluZycpO1xuICAgIGV4cGVjdChhLnNoYXBlKS50b0VxdWFsKFsyLCAzLCAxXSk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIFsnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnXSk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3IzZCgpIGZyb20gZW5jb2RlZCBzdHJpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gZW5jb2RlU3RyaW5ncyhbW1snYSddLCBbJ2InXSwgWydjJ11dLCBbWydkJ10sIFsnZSddLCBbJ2YnXV1dKTtcbiAgICBjb25zdCBhID0gdGYudGVuc29yM2QoYnl0ZXMgYXMgVGVuc29yTGlrZTNELCBbMiwgMywgMV0sICdzdHJpbmcnKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnc3RyaW5nJyk7XG4gICAgZXhwZWN0KGEuc2hhcGUpLnRvRXF1YWwoWzIsIDMsIDFdKTtcbiAgICBleHBlY3RBcnJheXNFcXVhbChhd2FpdCBhLmRhdGEoKSwgWydhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZiddKTtcbiAgfSk7XG5cbiAgaXQoJ3RmLnRlbnNvcjNkKCkgZnJvbSBlbmNvZGVkIHN0cmluZ3Mgd2l0aG91dCBkdHlwZSBlcnJvcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gaW5mZXIgJ3N0cmluZycgd2hlbiB0aGUgdXNlciBwYXNzZXMgVWludDhBcnJheSBpbiBvcmRlclxuICAgIC8vIHRvIGJlIGZvcndhcmQgY29tcGF0aWJsZSBpbiB0aGUgZnV0dXJlIHdoZW4gd2UgYWRkIHVpbnQ4IGR0eXBlLlxuICAgIGNvbnN0IGJ5dGVzID0gZW5jb2RlU3RyaW5ncyhbW1snYSddLCBbJ2InXSwgWydjJ11dLCBbWydkJ10sIFsnZSddLCBbJ2YnXV1dKTtcbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yM2QoYnl0ZXMgYXMgVGVuc29yTGlrZTNEKSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3IzZCgpIGZyb20gZW5jb2RlZCBzdHJpbmdzLCBzaGFwZSBtaXNtYXRjaCcsICgpID0+IHtcbiAgICBjb25zdCBieXRlcyA9IGVuY29kZVN0cmluZ3MoW1tbJ2EnXSwgWydiJ10sIFsnYyddXSwgW1snZCddLCBbJ2UnXSwgWydmJ11dXSk7XG4gICAgLy8gQWN0dWFsIHNoYXBlIGlzIFsyLCAzLCAxXS5cbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yM2QoYnl0ZXMgYXMgVGVuc29yTGlrZTNELCBbMywgMiwgMV0sICdzdHJpbmcnKSlcbiAgICAgICAgLnRvVGhyb3dFcnJvcigpO1xuICB9KTtcblxuICBpdCgndGVuc29yM2QoKSBmcm9tIG51bWJlcltdW11bXSwgYnV0IHNoYXBlIGRvZXMgbm90IG1hdGNoJywgKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlcyA9IFtbWzFdLCBbMl0sIFszXV0sIFtbNF0sIFs1XSwgWzZdXV07XG4gICAgLy8gQWN0dWFsIHNoYXBlIGlzIFsyLCAzLCAxXS5cbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yM2QodmFsdWVzLCBbMywgMiwgMV0pKS50b1Rocm93RXJyb3IoKTtcbiAgfSk7XG5cbiAgaXQoJ3RmLnRlbnNvcjNkKCkgZnJvbSBudW1iZXJbXSwgYnV0IG5vIHNoYXBlIHRocm93cyBlcnJvcicsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yM2QoWzEsIDIsIDMsIDRdKSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3IzZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGJlIG9mIGxlbmd0aCAzJywgKCkgPT4ge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBjb25zdCBzaGFwZTogYW55ID0gWzQsIDFdO1xuICAgIGV4cGVjdCgoKSA9PiB0Zi50ZW5zb3IzZChbMSwgMiwgMywgNF0sIHNoYXBlKSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3IzZCgpIHRocm93IGVycm9yIHdpdGggbnVsbCBpbnB1dCB2YWx1ZScsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yM2QobnVsbCkpXG4gICAgICAgIC50b1Rocm93RXJyb3IoXG4gICAgICAgICAgICAnVGhlIGlucHV0IHRvIHRoZSB0ZW5zb3IgY29uc3RydWN0b3IgJyArXG4gICAgICAgICAgICAnbXVzdCBiZSBhIG5vbi1udWxsIHZhbHVlLicpO1xuICB9KTtcblxuICBpdCgndGVuc29yNGQoKSBmcm9tIG51bWJlcltdW11bXVtdJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3I0ZChbW1tbMV1dLCBbWzJdXV0sIFtbWzRdXSwgW1s1XV1dXSwgWzIsIDIsIDEsIDFdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBhLmRhdGEoKSwgWzEsIDIsIDQsIDVdKTtcbiAgfSk7XG5cbiAgaXQoJ3RlbnNvcjRkKCkgZnJvbSBzdHJpbmdbXVtdW11bXScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB2YWxzID0gW1tbWydhJ11dLCBbWydiJ11dXSwgW1tbJ2MnXV0sIFtbJ2QnXV1dXTtcbiAgICBjb25zdCBhID0gdGYudGVuc29yNGQodmFscywgWzIsIDIsIDEsIDFdKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnc3RyaW5nJyk7XG4gICAgZXhwZWN0KGEuc2hhcGUpLnRvRXF1YWwoWzIsIDIsIDEsIDFdKTtcbiAgICBleHBlY3RBcnJheXNFcXVhbChhd2FpdCBhLmRhdGEoKSwgWydhJywgJ2InLCAnYycsICdkJ10pO1xuICB9KTtcblxuICBpdCgndGYudGVuc29yNGQoKSBmcm9tIGVuY29kZWQgc3RyaW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBieXRlcyA9IGVuY29kZVN0cmluZ3MoW1tbWydhJ11dLCBbWydiJ11dXSwgW1tbJ2MnXV0sIFtbJ2QnXV1dXSk7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjRkKGJ5dGVzIGFzIFRlbnNvckxpa2U0RCwgWzIsIDIsIDEsIDFdLCAnc3RyaW5nJyk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ3N0cmluZycpO1xuICAgIGV4cGVjdChhLnNoYXBlKS50b0VxdWFsKFsyLCAyLCAxLCAxXSk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIFsnYScsICdiJywgJ2MnLCAnZCddKTtcbiAgfSk7XG5cbiAgaXQoJ3RmLnRlbnNvcjRkKCkgZnJvbSBlbmNvZGVkIHN0cmluZ3Mgd2l0aG91dCBkdHlwZSBlcnJvcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gaW5mZXIgJ3N0cmluZycgd2hlbiB0aGUgdXNlciBwYXNzZXMgVWludDhBcnJheSBpbiBvcmRlclxuICAgIC8vIHRvIGJlIGZvcndhcmQgY29tcGF0aWJsZSBpbiB0aGUgZnV0dXJlIHdoZW4gd2UgYWRkIHVpbnQ4IGR0eXBlLlxuICAgIGNvbnN0IGJ5dGVzID0gZW5jb2RlU3RyaW5ncyhbW1tbJ2EnXV0sIFtbJ2InXV1dLCBbW1snYyddXSwgW1snZCddXV1dKTtcbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yNGQoYnl0ZXMgYXMgVGVuc29yTGlrZTREKSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3I0ZCgpIGZyb20gZW5jb2RlZCBzdHJpbmdzLCBzaGFwZSBtaXNtYXRjaCcsICgpID0+IHtcbiAgICBjb25zdCBieXRlcyA9IGVuY29kZVN0cmluZ3MoW1tbWydhJ11dLCBbWydiJ11dXSwgW1tbJ2MnXV0sIFtbJ2QnXV1dXSk7XG4gICAgLy8gQWN0dWFsIHNoYXBlIGlzIFsyLCAyLCAxLiAxXS5cbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yNGQoYnl0ZXMgYXMgVGVuc29yTGlrZTRELCBbMiwgMSwgMiwgMV0sICdzdHJpbmcnKSlcbiAgICAgICAgLnRvVGhyb3dFcnJvcigpO1xuICB9KTtcblxuICBpdCgndGVuc29yNGQoKSBmcm9tIHN0cmluZ1tdW11bXVtdIGluZmVyIHNoYXBlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHZhbHMgPSBbW1tbJ2EnXV0sIFtbJ2InXV1dLCBbW1snYyddXSwgW1snZCddXV1dO1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3I0ZCh2YWxzKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnc3RyaW5nJyk7XG4gICAgZXhwZWN0KGEuc2hhcGUpLnRvRXF1YWwoWzIsIDIsIDEsIDFdKTtcbiAgICBleHBlY3RBcnJheXNFcXVhbChhd2FpdCBhLmRhdGEoKSwgWydhJywgJ2InLCAnYycsICdkJ10pO1xuICB9KTtcblxuICBpdCgndGVuc29yNGQoKSBmcm9tIG51bWJlcltdW11bXVtdLCBidXQgc2hhcGUgZG9lcyBub3QgbWF0Y2gnLCAoKSA9PiB7XG4gICAgY29uc3QgZiA9ICgpID0+IHtcbiAgICAgIC8vIEFjdHVhbCBzaGFwZSBpcyBbMiwgMiwgMSwgMV0uXG4gICAgICB0Zi50ZW5zb3I0ZChbW1tbMV1dLCBbWzJdXV0sIFtbWzRdXSwgW1s1XV1dXSwgWzIsIDEsIDIsIDFdKTtcbiAgICB9O1xuICAgIGV4cGVjdChmKS50b1Rocm93RXJyb3IoKTtcbiAgfSk7XG5cbiAgaXQoJ3RmLnRlbnNvcjRkKCkgZnJvbSBudW1iZXJbXSwgYnV0IG5vIHNoYXBlIHRocm93cyBlcnJvcicsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yNGQoWzEsIDIsIDMsIDRdKSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3I0ZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGJlIG9mIGxlbmd0aCA0JywgKCkgPT4ge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBjb25zdCBzaGFwZTogYW55ID0gWzQsIDFdO1xuICAgIGV4cGVjdCgoKSA9PiB0Zi50ZW5zb3I0ZChbMSwgMiwgMywgNF0sIHNoYXBlKSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3I0ZCgpIHRocm93IGVycm9yIHdpdGggbnVsbCBpbnB1dCB2YWx1ZScsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yNGQobnVsbCkpXG4gICAgICAgIC50b1Rocm93RXJyb3IoXG4gICAgICAgICAgICAnVGhlIGlucHV0IHRvIHRoZSB0ZW5zb3IgY29uc3RydWN0b3IgJyArXG4gICAgICAgICAgICAnbXVzdCBiZSBhIG5vbi1udWxsIHZhbHVlLicpO1xuICB9KTtcblxuICBpdCgndGYudGVuc29yNWQoKSB0aHJvdyBlcnJvciB3aXRoIG51bGwgaW5wdXQgdmFsdWUnLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IHRmLnRlbnNvcjVkKG51bGwpKVxuICAgICAgICAudG9UaHJvd0Vycm9yKFxuICAgICAgICAgICAgJ1RoZSBpbnB1dCB0byB0aGUgdGVuc29yIGNvbnN0cnVjdG9yICcgK1xuICAgICAgICAgICAgJ211c3QgYmUgYSBub24tbnVsbCB2YWx1ZS4nKTtcbiAgfSk7XG5cbiAgaXQoJ3RmLnRlbnNvcjZkKCkgdGhyb3cgZXJyb3Igd2l0aCBudWxsIGlucHV0IHZhbHVlJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiB0Zi50ZW5zb3I2ZChudWxsKSlcbiAgICAgICAgLnRvVGhyb3dFcnJvcihcbiAgICAgICAgICAgICdUaGUgaW5wdXQgdG8gdGhlIHRlbnNvciBjb25zdHJ1Y3RvciAnICtcbiAgICAgICAgICAgICdtdXN0IGJlIGEgbm9uLW51bGwgdmFsdWUuJyk7XG4gIH0pO1xuXG4gIGl0KCdkZWZhdWx0IGR0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi5zY2FsYXIoMyk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBhLmRhdGEoKSwgMyk7XG4gIH0pO1xuXG4gIGl0KCdmbG9hdDMyIGR0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi5zY2FsYXIoMywgJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnZmxvYXQzMicpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCAzKTtcbiAgfSk7XG5cbiAgaXQoJ2ludDMyIGR0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi5zY2FsYXIoMywgJ2ludDMyJyk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2ludDMyJyk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIDMpO1xuICB9KTtcblxuICBpdCgnaW50MzIgZHR5cGUsIDMuOSA9PiAzLCBsaWtlIG51bXB5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi5zY2FsYXIoMy45LCAnaW50MzInKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3RBcnJheXNFcXVhbChhd2FpdCBhLmRhdGEoKSwgMyk7XG4gIH0pO1xuXG4gIGl0KCdpbnQzMiBkdHlwZSwgLTMuOSA9PiAtMywgbGlrZSBudW1weScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuc2NhbGFyKC0zLjksICdpbnQzMicpO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdpbnQzMicpO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCAtMyk7XG4gIH0pO1xuXG4gIGl0KCdib29sIGR0eXBlLCAzID0+IHRydWUsIGxpa2UgbnVtcHknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnNjYWxhcigzLCAnYm9vbCcpO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdib29sJyk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIDEpO1xuICB9KTtcblxuICBpdCgnYm9vbCBkdHlwZSwgLTIgPT4gdHJ1ZSwgbGlrZSBudW1weScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuc2NhbGFyKC0yLCAnYm9vbCcpO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdib29sJyk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIDEpO1xuICB9KTtcblxuICBpdCgnYm9vbCBkdHlwZSwgMCA9PiBmYWxzZSwgbGlrZSBudW1weScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuc2NhbGFyKDAsICdib29sJyk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2Jvb2wnKTtcbiAgICBleHBlY3RBcnJheXNFcXVhbChhd2FpdCBhLmRhdGEoKSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdib29sIGR0eXBlIGZyb20gYm9vbGVhbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuc2NhbGFyKGZhbHNlLCAnYm9vbCcpO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCAwKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnYm9vbCcpO1xuXG4gICAgY29uc3QgYiA9IHRmLnNjYWxhcih0cnVlLCAnYm9vbCcpO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCAwKTtcbiAgICBleHBlY3QoYi5kdHlwZSkudG9CZSgnYm9vbCcpO1xuICB9KTtcblxuICBpdCgnaW50MzIgZHR5cGUgZnJvbSBib29sZWFuJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi5zY2FsYXIodHJ1ZSwgJ2ludDMyJyk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIDEpO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdpbnQzMicpO1xuICB9KTtcblxuICBpdCgnZGVmYXVsdCBkdHlwZSBmcm9tIGJvb2xlYW4nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnNjYWxhcihmYWxzZSk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIDApO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdib29sJyk7XG4gIH0pO1xuXG4gIGl0KCdkZWZhdWx0IGR0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdmbG9hdDMyJyk7XG4gICAgZXhwZWN0KGEuc2hhcGUpLnRvRXF1YWwoWzNdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBhLmRhdGEoKSwgWzEsIDIsIDNdKTtcbiAgfSk7XG5cbiAgaXQoJ2Zsb2F0MzIgZHR5cGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSwgJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnZmxvYXQzMicpO1xuICAgIGV4cGVjdChhLnNoYXBlKS50b0VxdWFsKFszXSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYS5kYXRhKCksIFsxLCAyLCAzXSk7XG4gIH0pO1xuXG4gIGl0KCdpbnQzMiBkdHlwZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDNdLCAnaW50MzInKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbM10pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbMSwgMiwgM10pO1xuICB9KTtcblxuICBpdCgnaW50MzIgZHR5cGUsIG5vbi1pbnRzIGdldCBmbG9vcmVkLCBsaWtlIG51bXB5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMS4xLCAyLjUsIDMuOV0sICdpbnQzMicpO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdpbnQzMicpO1xuICAgIGV4cGVjdChhLnNoYXBlKS50b0VxdWFsKFszXSk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIFsxLCAyLCAzXSk7XG4gIH0pO1xuXG4gIGl0KCdpbnQzMiBkdHlwZSwgbmVnYXRpdmUgbm9uLWludHMgZ2V0IGNlaWxlZCwgbGlrZSBudW1weScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMWQoWy0xLjEsIC0yLjUsIC0zLjldLCAnaW50MzInKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbM10pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbLTEsIC0yLCAtM10pO1xuICB9KTtcblxuICBpdCgnYm9vbCBkdHlwZSwgIT0wIGlzIHRydXRoeSwgMCBpcyBmYWxzeSwgbGlrZSBudW1weScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIC0yLCAwLCAzXSwgJ2Jvb2wnKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnYm9vbCcpO1xuICAgIGV4cGVjdChhLnNoYXBlKS50b0VxdWFsKFs0XSk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIFsxLCAxLCAwLCAxXSk7XG4gIH0pO1xuXG4gIGl0KCdkZWZhdWx0IGR0eXBlIGZyb20gYm9vbGVhbltdJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIGZhbHNlLCB0cnVlXSk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2Jvb2wnKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBhLmRhdGEoKSwgWzAsIDAsIDFdKTtcbiAgfSk7XG5cbiAgaXQoJ2RlZmF1bHQgZHR5cGUgZnJvbSBVSW50OEFycmF5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChuZXcgVWludDhBcnJheShbMSwgNSwgMl0pKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbM10pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBbMSwgNSwgMl0pO1xuICB9KTtcblxuICBpdCgnZGVmYXVsdCBkdHlwZSBmcm9tIEludDMyQXJyYXknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjFkKG5ldyBJbnQzMkFycmF5KFsxLCA1LCAyXSkpO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdpbnQzMicpO1xuICAgIGV4cGVjdChhLnNoYXBlKS50b0VxdWFsKFszXSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYS5kYXRhKCksIFsxLCA1LCAyXSk7XG4gIH0pO1xuXG4gIGl0KCd0Zi50ZW5zb3IoKSBmcm9tIEZsb2F0MzJBcnJheSBhbmQgbnVtYmVyW10nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcihbXG4gICAgICBuZXcgRmxvYXQzMkFycmF5KFsxLCAyXSksIG5ldyBGbG9hdDMyQXJyYXkoWzMsIDRdKSxcbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkoWzUsIDZdKSwgWzcsIDhdXG4gICAgXSk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbNCwgMl0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBbMSwgMiwgMywgNCwgNSwgNiwgNywgOF0pO1xuICB9KTtcblxuICBpdCgndGYudGVuc29yKCkgZnJvbSBJbnQzMkFycmF5IGFuZCBudW1iZXJbXScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yKFtcbiAgICAgIG5ldyBJbnQzMkFycmF5KFsxLCAyXSksIG5ldyBJbnQzMkFycmF5KFszLCA0XSksIG5ldyBJbnQzMkFycmF5KFs1LCA2XSksXG4gICAgICBbNywgOF1cbiAgICBdKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbNCwgMl0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBbMSwgMiwgMywgNCwgNSwgNiwgNywgOF0pO1xuICB9KTtcblxuICBpdCgndGYudGVuc29yKCkgZnJvbSBtaXhlZCBUeXBlZEFycmF5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IoW1xuICAgICAgbmV3IEZsb2F0MzJBcnJheShbMSwgMl0pLCBuZXcgSW50MzJBcnJheShbMywgNF0pLCBuZXcgVWludDhBcnJheShbNSwgNl0pLFxuICAgICAgWzcsIDhdXG4gICAgXSk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbNCwgMl0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBbMSwgMiwgMywgNCwgNSwgNiwgNywgOF0pO1xuICB9KTtcblxuICBpdCgndGYudGVuc29yKCkgZnJvbSBUeXBlZEFycmF5cyB3aGljaCBhcmUgdGhlbXNlbHZlcyAzRCcsICgpID0+IHtcbiAgICAvLyAyIHRlbnNvcnMsIGVhY2ggd2l0aCBzaGFwZSAyMHgyMHgzLCBhcyBmbGF0IEZsb2F0MzJBcnJheXMuXG4gICAgY29uc3QgaW1nMSA9IG5ldyBGbG9hdDMyQXJyYXkoMjAgKiAyMCAqIDMpO1xuICAgIGNvbnN0IGltZzIgPSBuZXcgRmxvYXQzMkFycmF5KDIwICogMjAgKiAzKTtcbiAgICBjb25zdCB0ID0gdGYudGVuc29yKFtpbWcxLCBpbWcyXSwgWzIsIDIwLCAyMCwgM10pO1xuICAgIGV4cGVjdCh0LmR0eXBlKS50b0JlKCdmbG9hdDMyJyk7XG4gICAgZXhwZWN0KHQuc2hhcGUpLnRvRXF1YWwoWzIsIDIwLCAyMCwgM10pO1xuICB9KTtcblxuICBpdCgndGYudGVuc29yKCkgZnJvbSBUeXBlZEFycmF5cyB3aGljaCBhcmUgdGhlbXNlbHZlcyAzRCwgd3Jvbmcgc2hhcGUnLFxuICAgICAoKSA9PiB7XG4gICAgICAgY29uc3QgaW1nMSA9IG5ldyBGbG9hdDMyQXJyYXkoMjAgKiAyMCAqIDMpO1xuICAgICAgIGNvbnN0IGltZzIgPSBuZXcgRmxvYXQzMkFycmF5KDIwICogMjAgKiAzKTtcbiAgICAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yKFtpbWcxLCBpbWcyXSwgWzMsIDIwLCAyMCwgM10pKS50b1Rocm93RXJyb3IoKTtcbiAgICAgfSk7XG5cbiAgaXQoJ2RlZmF1bHQgZHR5cGUgZnJvbSBhc2NpaSBzdHJpbmcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcignaGVsbG8nKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnc3RyaW5nJyk7XG4gICAgZXhwZWN0KGEuc2hhcGUpLnRvRXF1YWwoW10pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbJ2hlbGxvJ10pO1xuICB9KTtcblxuICBpdCgnZGVmYXVsdCBkdHlwZSBmcm9tIHV0Zi04IHN0cmluZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yKCfQtNCw0L3QuNC10LsnKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnc3RyaW5nJyk7XG4gICAgZXhwZWN0KGEuc2hhcGUpLnRvRXF1YWwoW10pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbJ9C00LDQvdC40LXQuyddKTtcbiAgfSk7XG5cbiAgaXQoJ2RlZmF1bHQgZHR5cGUgZnJvbSBlbXB0eSBzdHJpbmcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcignJyk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ3N0cmluZycpO1xuICAgIGV4cGVjdChhLnNoYXBlKS50b0VxdWFsKFtdKTtcbiAgICBleHBlY3RBcnJheXNFcXVhbChhd2FpdCBhLmRhdGEoKSwgWycnXSk7XG4gIH0pO1xuXG4gIGl0KCdkZWZhdWx0IGR0eXBlIGZyb20gdW5pY29kZSBlc2NhcGVkIHN0cmluZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yKCdcXHUwNDM0XFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQzNVxcdTA0M2InKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnc3RyaW5nJyk7XG4gICAgZXhwZWN0KGEuc2hhcGUpLnRvRXF1YWwoW10pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbJ9C00LDQvdC40LXQuyddKTtcbiAgfSk7XG5cbiAgaXQoJ2RlZmF1bHQgZHR5cGUgZnJvbSBzdHJpbmdbXScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yKFsnYScsICdiJ10pO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdzdHJpbmcnKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbMl0pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbJ2EnLCAnYiddKTtcbiAgfSk7XG5cbiAgaXQoJ2Zsb2F0MzIgZHR5cGUgZnJvbSBib29sZWFuW10nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgZmFsc2UsIHRydWVdLCAnZmxvYXQzMicpO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdmbG9hdDMyJyk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYS5kYXRhKCksIFswLCAwLCAxXSk7XG4gIH0pO1xuXG4gIGl0KCdpbnQzMiBkdHlwZSBmcm9tIGJvb2xlYW5bXScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMWQoW2ZhbHNlLCBmYWxzZSwgdHJ1ZV0sICdpbnQzMicpO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdpbnQzMicpO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbMCwgMCwgMV0pO1xuICB9KTtcblxuICBpdCgnYm9vbCBkdHlwZSBmcm9tIGJvb2xlYW5bXScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMWQoW2ZhbHNlLCBmYWxzZSwgdHJ1ZV0sICdib29sJyk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2Jvb2wnKTtcbiAgICBleHBlY3RBcnJheXNFcXVhbChhd2FpdCBhLmRhdGEoKSwgWzAsIDAsIDFdKTtcbiAgfSk7XG5cbiAgaXQoJ2RlZmF1bHQgZHR5cGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnZmxvYXQzMicpO1xuICAgIGV4cGVjdChhLnNoYXBlKS50b0VxdWFsKFsyLCAyXSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYS5kYXRhKCksIFsxLCAyLCAzLCA0XSk7XG4gIH0pO1xuXG4gIGl0KCdmbG9hdDMyIGR0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSwgJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnZmxvYXQzMicpO1xuICAgIGV4cGVjdChhLnNoYXBlKS50b0VxdWFsKFsyLCAyXSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYS5kYXRhKCksIFsxLCAyLCAzLCA0XSk7XG4gIH0pO1xuXG4gIGl0KCdpbnQzMiBkdHlwZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMmQoW1sxLCAyXSwgWzMsIDRdXSwgWzIsIDJdLCAnaW50MzInKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbMiwgMl0pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbMSwgMiwgMywgNF0pO1xuICB9KTtcblxuICBpdCgnaW50MzIgZHR5cGUsIG5vbi1pbnRzIGdldCBmbG9vcmVkLCBsaWtlIG51bXB5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbMS4xLCAyLjUsIDMuOSwgNC4wXSwgWzIsIDJdLCAnaW50MzInKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbMiwgMl0pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbMSwgMiwgMywgNF0pO1xuICB9KTtcblxuICBpdCgnaW50MzIgZHR5cGUsIG5lZ2F0aXZlIG5vbi1pbnRzIGdldCBjZWlsZWQsIGxpa2UgbnVtcHknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjJkKFstMS4xLCAtMi41LCAtMy45LCAtNC4wXSwgWzIsIDJdLCAnaW50MzInKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbMiwgMl0pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbLTEsIC0yLCAtMywgLTRdKTtcbiAgfSk7XG5cbiAgaXQoJ2Jvb2wgZHR5cGUsICE9MCBpcyB0cnV0aHksIDAgaXMgZmFsc3ksIGxpa2UgbnVtcHknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAtMiwgMCwgM10sIFsyLCAyXSwgJ2Jvb2wnKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnYm9vbCcpO1xuICAgIGV4cGVjdChhLnNoYXBlKS50b0VxdWFsKFsyLCAyXSk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIFsxLCAxLCAwLCAxXSk7XG4gIH0pO1xuXG4gIGl0KCdkZWZhdWx0IGR0eXBlIGZyb20gYm9vbGVhbltdJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbW2ZhbHNlLCBmYWxzZV0sIFt0cnVlLCBmYWxzZV1dLCBbMiwgMl0pO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdib29sJyk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYS5kYXRhKCksIFswLCAwLCAxLCAwXSk7XG4gIH0pO1xuXG4gIGl0KCdmbG9hdDMyIGR0eXBlIGZyb20gYm9vbGVhbltdJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbW2ZhbHNlLCBmYWxzZV0sIFt0cnVlLCBmYWxzZV1dLCBbMiwgMl0sICdmbG9hdDMyJyk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3RBcnJheXNFcXVhbChhd2FpdCBhLmRhdGEoKSwgWzAsIDAsIDEsIDBdKTtcbiAgfSk7XG5cbiAgaXQoJ2ludDMyIGR0eXBlIGZyb20gYm9vbGVhbltdJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbW2ZhbHNlLCBmYWxzZV0sIFt0cnVlLCBmYWxzZV1dLCBbMiwgMl0sICdpbnQzMicpO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdpbnQzMicpO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbMCwgMCwgMSwgMF0pO1xuICB9KTtcblxuICBpdCgnYm9vbCBkdHlwZSBmcm9tIGJvb2xlYW5bXScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMmQoW1tmYWxzZSwgZmFsc2VdLCBbdHJ1ZSwgZmFsc2VdXSwgWzIsIDJdLCAnYm9vbCcpO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdib29sJyk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIFswLCAwLCAxLCAwXSk7XG4gIH0pO1xuXG4gIGl0KCdkZWZhdWx0IGR0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IzZChbMSwgMiwgMywgNF0sIFsyLCAyLCAxXSk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbMiwgMiwgMV0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBbMSwgMiwgMywgNF0pO1xuICB9KTtcblxuICBpdCgnZmxvYXQzMiBkdHlwZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yM2QoWzEsIDIsIDMsIDRdLCBbMiwgMiwgMV0sICdmbG9hdDMyJyk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbMiwgMiwgMV0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBbMSwgMiwgMywgNF0pO1xuICB9KTtcblxuICBpdCgnaW50MzIgZHR5cGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjNkKFtbWzFdLCBbMl1dLCBbWzNdLCBbNF1dXSwgWzIsIDIsIDFdLCAnaW50MzInKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbMiwgMiwgMV0pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbMSwgMiwgMywgNF0pO1xuICB9KTtcblxuICBpdCgnaW50MzIgZHR5cGUsIG5vbi1pbnRzIGdldCBmbG9vcmVkLCBsaWtlIG51bXB5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IzZChbMS4xLCAyLjUsIDMuOSwgNC4wXSwgWzIsIDIsIDFdLCAnaW50MzInKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbMiwgMiwgMV0pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbMSwgMiwgMywgNF0pO1xuICB9KTtcblxuICBpdCgnaW50MzIgZHR5cGUsIG5lZ2F0aXZlIG5vbi1pbnRzIGdldCBjZWlsZWQsIGxpa2UgbnVtcHknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjNkKFstMS4xLCAtMi41LCAtMy45LCAtNC4wXSwgWzIsIDIsIDFdLCAnaW50MzInKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbMiwgMiwgMV0pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbLTEsIC0yLCAtMywgLTRdKTtcbiAgfSk7XG5cbiAgaXQoJ2Jvb2wgZHR5cGUsICE9MCBpcyB0cnV0aHksIDAgaXMgZmFsc3ksIGxpa2UgbnVtcHknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjNkKFsxLCAtMiwgMCwgM10sIFsyLCAyLCAxXSwgJ2Jvb2wnKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnYm9vbCcpO1xuICAgIGV4cGVjdChhLnNoYXBlKS50b0VxdWFsKFsyLCAyLCAxXSk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIFsxLCAxLCAwLCAxXSk7XG4gIH0pO1xuXG4gIGl0KCdkZWZhdWx0IGR0eXBlIGZyb20gYm9vbGVhbltdJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IzZChbW1tmYWxzZV0sIFtmYWxzZV1dLCBbW3RydWVdLCBbZmFsc2VdXV0sIFsyLCAyLCAxXSk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2Jvb2wnKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBhLmRhdGEoKSwgWzAsIDAsIDEsIDBdKTtcbiAgfSk7XG5cbiAgaXQoJ2Zsb2F0MzIgZHR5cGUgZnJvbSBib29sZWFuW10nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjNkKFxuICAgICAgICBbW1tmYWxzZV0sIFtmYWxzZV1dLCBbW3RydWVdLCBbZmFsc2VdXV0sIFsyLCAyLCAxXSwgJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnZmxvYXQzMicpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBbMCwgMCwgMSwgMF0pO1xuICB9KTtcblxuICBpdCgnaW50MzIgZHR5cGUgZnJvbSBib29sZWFuW10nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjNkKFxuICAgICAgICBbW1tmYWxzZV0sIFtmYWxzZV1dLCBbW3RydWVdLCBbZmFsc2VdXV0sIFsyLCAyLCAxXSwgJ2ludDMyJyk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2ludDMyJyk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIFswLCAwLCAxLCAwXSk7XG4gIH0pO1xuXG4gIGl0KCdib29sIGR0eXBlIGZyb20gYm9vbGVhbltdJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPVxuICAgICAgICB0Zi50ZW5zb3IzZChbW1tmYWxzZV0sIFtmYWxzZV1dLCBbW3RydWVdLCBbZmFsc2VdXV0sIFsyLCAyLCAxXSwgJ2Jvb2wnKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnYm9vbCcpO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbMCwgMCwgMSwgMF0pO1xuICB9KTtcblxuICBpdCgnZGVmYXVsdCBkdHlwZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yNGQoWzEsIDIsIDMsIDRdLCBbMiwgMiwgMSwgMV0pO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdmbG9hdDMyJyk7XG4gICAgZXhwZWN0KGEuc2hhcGUpLnRvRXF1YWwoWzIsIDIsIDEsIDFdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBhLmRhdGEoKSwgWzEsIDIsIDMsIDRdKTtcbiAgfSk7XG5cbiAgaXQoJ2Zsb2F0MzIgZHR5cGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjRkKFsxLCAyLCAzLCA0XSwgWzIsIDIsIDEsIDFdLCAnZmxvYXQzMicpO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdmbG9hdDMyJyk7XG4gICAgZXhwZWN0KGEuc2hhcGUpLnRvRXF1YWwoWzIsIDIsIDEsIDFdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBhLmRhdGEoKSwgWzEsIDIsIDMsIDRdKTtcbiAgfSk7XG5cbiAgaXQoJ2ludDMyIGR0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPVxuICAgICAgICB0Zi50ZW5zb3I0ZChbW1tbMV1dLCBbWzJdXV0sIFtbWzNdXSwgW1s0XV1dXSwgWzIsIDIsIDEsIDFdLCAnaW50MzInKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbMiwgMiwgMSwgMV0pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbMSwgMiwgMywgNF0pO1xuICB9KTtcblxuICBpdCgnaW50MzIgZHR5cGUsIG5vbi1pbnRzIGdldCBmbG9vcmVkLCBsaWtlIG51bXB5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3I0ZChbMS4xLCAyLjUsIDMuOSwgNC4wXSwgWzIsIDIsIDEsIDFdLCAnaW50MzInKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbMiwgMiwgMSwgMV0pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbMSwgMiwgMywgNF0pO1xuICB9KTtcblxuICBpdCgnaW50MzIgZHR5cGUsIG5lZ2F0aXZlIG5vbi1pbnRzIGdldCBjZWlsZWQsIGxpa2UgbnVtcHknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjRkKFstMS4xLCAtMi41LCAtMy45LCAtNC4wXSwgWzIsIDIsIDEsIDFdLCAnaW50MzInKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbMiwgMiwgMSwgMV0pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbLTEsIC0yLCAtMywgLTRdKTtcbiAgfSk7XG5cbiAgaXQoJ2Jvb2wgZHR5cGUsICE9MCBpcyB0cnV0aHksIDAgaXMgZmFsc3ksIGxpa2UgbnVtcHknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjRkKFsxLCAtMiwgMCwgM10sIFsyLCAyLCAxLCAxXSwgJ2Jvb2wnKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnYm9vbCcpO1xuICAgIGV4cGVjdChhLnNoYXBlKS50b0VxdWFsKFsyLCAyLCAxLCAxXSk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIFsxLCAxLCAwLCAxXSk7XG4gIH0pO1xuXG4gIGl0KCdkZWZhdWx0IGR0eXBlIGZyb20gYm9vbGVhbltdJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPVxuICAgICAgICB0Zi50ZW5zb3I0ZChbW1tbZmFsc2VdLCBbZmFsc2VdXSwgW1t0cnVlXSwgW2ZhbHNlXV1dXSwgWzEsIDIsIDIsIDFdKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnYm9vbCcpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBbMCwgMCwgMSwgMF0pO1xuICB9KTtcblxuICBpdCgnZmxvYXQzMiBkdHlwZSBmcm9tIGJvb2xlYW5bXScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yNGQoXG4gICAgICAgIFtbW1tmYWxzZV0sIFtmYWxzZV1dLCBbW3RydWVdLCBbZmFsc2VdXV1dLCBbMSwgMiwgMiwgMV0sICdmbG9hdDMyJyk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBhLmRhdGEoKSwgWzAsIDAsIDEsIDBdKTtcbiAgfSk7XG5cbiAgaXQoJ2ludDMyIGR0eXBlIGZyb20gYm9vbGVhbltdJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3I0ZChcbiAgICAgICAgW1tbW2ZhbHNlXSwgW2ZhbHNlXV0sIFtbdHJ1ZV0sIFtmYWxzZV1dXV0sIFsxLCAyLCAyLCAxXSwgJ2ludDMyJyk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2ludDMyJyk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIFswLCAwLCAxLCAwXSk7XG4gIH0pO1xuXG4gIGl0KCdib29sIGR0eXBlIGZyb20gYm9vbGVhbltdJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3I0ZChcbiAgICAgICAgW1tbW2ZhbHNlXSwgW2ZhbHNlXV0sIFtbdHJ1ZV0sIFtmYWxzZV1dXV0sIFsxLCAyLCAyLCAxXSwgJ2Jvb2wnKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnYm9vbCcpO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbMCwgMCwgMSwgMF0pO1xuICB9KTtcblxuICBpdCgnU2NhbGFyIGRlZmF1bHQgZHR5cGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnNjYWxhcig0KTtcbiAgICBjb25zdCBiID0gYS5yZXNoYXBlKFsxLCAxXSk7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYi5zaGFwZSkudG9FcXVhbChbMSwgMV0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBhd2FpdCBiLmRhdGEoKSk7XG4gIH0pO1xuXG4gIGl0KCdTY2FsYXIgZmxvYXQzMiBkdHlwZScsICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuc2NhbGFyKDQsICdmbG9hdDMyJyk7XG4gICAgY29uc3QgYiA9IGEucmVzaGFwZShbMSwgMV0pO1xuICAgIGV4cGVjdChiLmR0eXBlKS50b0JlKCdmbG9hdDMyJyk7XG4gICAgZXhwZWN0KGIuc2hhcGUpLnRvRXF1YWwoWzEsIDFdKTtcbiAgfSk7XG5cbiAgaXQoJ1NjYWxhciBzdHJpbmcgZHR5cGUnLCAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnNjYWxhcigndGVzdCcsICdzdHJpbmcnKTtcbiAgICBjb25zdCBiID0gYS5yZXNoYXBlKFsxLCAxXSk7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ3N0cmluZycpO1xuICAgIGV4cGVjdChiLnNoYXBlKS50b0VxdWFsKFsxLCAxXSk7XG4gIH0pO1xuXG4gIGl0KCdzY2FsYXIgZnJvbSBlbmNvZGVkIHN0cmluZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuc2NhbGFyKGVuY29kZVN0cmluZygnaGVsbG8nKSwgJ3N0cmluZycpO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdzdHJpbmcnKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbXSk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIFsnaGVsbG8nXSk7XG4gIH0pO1xuXG4gIGl0KCdzY2FsYXIgZnJvbSBlbmNvZGVkIHN0cmluZywgYnV0IG1pc3NpbmcgZHR5cGUnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gaW5mZXIgJ3N0cmluZycgd2hlbiB0aGUgdXNlciBwYXNzZXMgVWludDhBcnJheSBpbiBvcmRlclxuICAgIC8vIHRvIGJlIGZvcndhcmQgY29tcGF0aWJsZSBpbiB0aGUgZnV0dXJlIHdoZW4gd2UgYWRkIHVpbnQ4IGR0eXBlLlxuICAgIGV4cGVjdCgoKSA9PiB0Zi5zY2FsYXIoZW5jb2RlU3RyaW5nKCdoZWxsbycpKSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCdzY2FsYXIgZnJvbSBlbmNvZGVkIHN0cmluZywgYnV0IHZhbHVlIGlzIG5vdCB1aW50OGFycmF5JywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBleHBlY3QoKCkgPT4gdGYuc2NhbGFyKG5ldyBGbG9hdDMyQXJyYXkoWzEsIDIsIDNdKSBhcyBhbnkpKS50b1Rocm93RXJyb3IoKTtcbiAgfSk7XG5cbiAgaXQoJ1NjYWxhciBpbmZlcnJlZCBkdHlwZSBmcm9tIGJvb2wnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnNjYWxhcih0cnVlKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnYm9vbCcpO1xuICAgIGV4cGVjdChhLnNoYXBlKS50b0VxdWFsKFtdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBhLmRhdGEoKSwgWzFdKTtcbiAgfSk7XG5cbiAgaXQoJ1NjYWxhciBpbmZlcnJlZCBkdHlwZSBmcm9tIHN0cmluZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuc2NhbGFyKCdoZWxsbycpO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdzdHJpbmcnKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbXSk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIFsnaGVsbG8nXSk7XG4gIH0pO1xuXG4gIGl0KCdTY2FsYXIgaW50MzIgZHR5cGUnLCAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnNjYWxhcig0LCAnaW50MzInKTtcbiAgICBjb25zdCBiID0gYS5yZXNoYXBlKFsxLCAxXSk7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2ludDMyJyk7XG4gICAgZXhwZWN0KGIuc2hhcGUpLnRvRXF1YWwoWzEsIDFdKTtcbiAgfSk7XG5cbiAgaXQoJ1NjYWxhciBib29sIGR0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi5zY2FsYXIoNCwgJ2Jvb2wnKTtcbiAgICBjb25zdCBiID0gYS5yZXNoYXBlKFsxLCAxLCAxXSk7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2Jvb2wnKTtcbiAgICBleHBlY3QoYi5zaGFwZSkudG9FcXVhbChbMSwgMSwgMV0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBhd2FpdCBiLmRhdGEoKSk7XG4gIH0pO1xuXG4gIGl0KCdTY2FsYXIgY29tcGxleDY0IGR0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi5jb21wbGV4KDQsIDUpO1xuICAgIGNvbnN0IGIgPSBhLnJlc2hhcGUoWzEsIDFdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBhLmRhdGEoKSwgWzQsIDVdKTtcbiAgICBleHBlY3QoYi5kdHlwZSkudG9CZSgnY29tcGxleDY0Jyk7XG4gICAgZXhwZWN0KGIuc2hhcGUpLnRvRXF1YWwoWzEsIDFdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBhLmRhdGEoKSwgYXdhaXQgYi5kYXRhKCkpO1xuICB9KTtcblxuICBpdCgnVGVuc29yMUQgZGVmYXVsdCBkdHlwZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAgICBjb25zdCBiID0gYS5yZXNoYXBlKFsyLCAyXSk7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYi5zaGFwZSkudG9FcXVhbChbMiwgMl0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBhd2FpdCBiLmRhdGEoKSk7XG4gIH0pO1xuXG4gIGl0KCdUZW5zb3IxRCBpbmZlcnJlZCBkdHlwZSBmcm9tIGJvb2xzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlXSk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2Jvb2wnKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbNF0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBbMSwgMCwgMCwgMV0pO1xuICB9KTtcblxuICBpdCgnVGVuc29yMUQgaW5mZXJyZWQgZHR5cGUgZnJvbSBzdHJpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbJ2EnLCAnYicsICdjJ10pO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdzdHJpbmcnKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbM10pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbJ2EnLCAnYicsICdjJ10pO1xuICB9KTtcblxuICBpdCgnVGVuc29yMUQgZmxvYXQzMiBkdHlwZScsICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGIgPSBhLnJlc2hhcGUoWzIsIDJdKTtcbiAgICBleHBlY3QoYi5kdHlwZSkudG9CZSgnZmxvYXQzMicpO1xuICAgIGV4cGVjdChiLnNoYXBlKS50b0VxdWFsKFsyLCAyXSk7XG4gIH0pO1xuXG4gIGl0KCdUZW5zb3IxRCBpbnQzMiBkdHlwZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdLCAnaW50MzInKTtcbiAgICBjb25zdCBiID0gYS5yZXNoYXBlKFsyLCAyXSk7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2ludDMyJyk7XG4gICAgZXhwZWN0KGIuc2hhcGUpLnRvRXF1YWwoWzIsIDJdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBhLmRhdGEoKSwgYXdhaXQgYi5kYXRhKCkpO1xuICB9KTtcblxuICBpdCgnVGVuc29yMUQgY29tcGxleDY0IGR0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi5jb21wbGV4KFsxLCAzLCA1LCA3XSwgWzIsIDQsIDYsIDhdKTtcbiAgICBjb25zdCBiID0gYS5yZXNoYXBlKFsyLCAyXSk7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2NvbXBsZXg2NCcpO1xuICAgIGV4cGVjdChiLnNoYXBlKS50b0VxdWFsKFsyLCAyXSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYS5kYXRhKCksIGF3YWl0IGIuZGF0YSgpKTtcbiAgfSk7XG5cbiAgaXQoJ1RlbnNvcjJEIGRlZmF1bHQgZHR5cGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0LCA1LCA2XSwgWzIsIDNdKTtcbiAgICBjb25zdCBiID0gYS5yZXNoYXBlKFs2XSk7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYi5zaGFwZSkudG9FcXVhbChbNl0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBhd2FpdCBiLmRhdGEoKSk7XG4gIH0pO1xuXG4gIGl0KCdUZW5zb3IyRCBmbG9hdDMyIGR0eXBlJywgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNCwgNSwgNl0sIFsyLCAzXSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBiID0gYS5yZXNoYXBlKFs2XSk7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYi5zaGFwZSkudG9FcXVhbChbNl0pO1xuICB9KTtcblxuICBpdCgnVGVuc29yMkQgaW50MzIgZHR5cGUnLCAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0LCA1LCA2XSwgWzIsIDNdLCAnaW50MzInKTtcbiAgICBjb25zdCBiID0gYS5yZXNoYXBlKFs2XSk7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2ludDMyJyk7XG4gICAgZXhwZWN0KGIuc2hhcGUpLnRvRXF1YWwoWzZdKTtcbiAgfSk7XG5cbiAgaXQoJ1RlbnNvcjJEIGJvb2wgZHR5cGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0LCA1LCA2XSwgWzIsIDNdLCAnYm9vbCcpO1xuICAgIGNvbnN0IGIgPSBhLnJlc2hhcGUoWzZdKTtcbiAgICBleHBlY3QoYi5kdHlwZSkudG9CZSgnYm9vbCcpO1xuICAgIGV4cGVjdChiLnNoYXBlKS50b0VxdWFsKFs2XSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYS5kYXRhKCksIGF3YWl0IGIuZGF0YSgpKTtcbiAgfSk7XG5cbiAgaXQoJ1RlbnNvcjJEIGNvbXBsZXg2NCBkdHlwZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuY29tcGxleChbWzEsIDMsIDVdLCBbNywgOSwgMTFdXSwgW1syLCA0LCA2XSwgWzgsIDEwLCAxMl1dKTtcbiAgICBjb25zdCBiID0gYS5yZXNoYXBlKFs2XSk7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2NvbXBsZXg2NCcpO1xuICAgIGV4cGVjdChiLnNoYXBlKS50b0VxdWFsKFs2XSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYS5kYXRhKCksIGF3YWl0IGIuZGF0YSgpKTtcbiAgfSk7XG5cbiAgaXQoJ1RlbnNvcjNEIGRlZmF1bHQgZHR5cGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjNkKFsxLCAyLCAzLCA0LCA1LCA2XSwgWzIsIDMsIDFdKTtcbiAgICBjb25zdCBiID0gYS5yZXNoYXBlKFs2XSk7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYi5zaGFwZSkudG9FcXVhbChbNl0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBhd2FpdCBiLmRhdGEoKSk7XG4gIH0pO1xuXG4gIGl0KCdUZW5zb3IzRCBmbG9hdDMyIGR0eXBlJywgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IzZChbMSwgMiwgMywgNCwgNSwgNl0sIFsyLCAzLCAxXSwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBiID0gYS5yZXNoYXBlKFs2XSk7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYi5zaGFwZSkudG9FcXVhbChbNl0pO1xuICB9KTtcblxuICBpdCgnVGVuc29yM0QgaW50MzIgZHR5cGUnLCAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjNkKFsxLCAyLCAzLCA0LCA1LCA2XSwgWzIsIDMsIDFdLCAnaW50MzInKTtcbiAgICBjb25zdCBiID0gYS5yZXNoYXBlKFs2XSk7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2ludDMyJyk7XG4gICAgZXhwZWN0KGIuc2hhcGUpLnRvRXF1YWwoWzZdKTtcbiAgfSk7XG5cbiAgaXQoJ1RlbnNvcjNEIGJvb2wgZHR5cGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjNkKFsxLCAyLCAzLCA0LCA1LCA2XSwgWzIsIDMsIDFdLCAnYm9vbCcpO1xuICAgIGNvbnN0IGIgPSBhLnJlc2hhcGUoWzZdKTtcbiAgICBleHBlY3QoYi5kdHlwZSkudG9CZSgnYm9vbCcpO1xuICAgIGV4cGVjdChiLnNoYXBlKS50b0VxdWFsKFs2XSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYS5kYXRhKCksIGF3YWl0IGIuZGF0YSgpKTtcbiAgfSk7XG5cbiAgaXQoJ1RlbnNvcjNEIGNvbXBsZXg2NCBkdHlwZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuY29tcGxleChcbiAgICAgICAgW1tbMV0sIFszXSwgWzVdXSwgW1s3XSwgWzldLCBbMTFdXV0sXG4gICAgICAgIFtbWzJdLCBbNF0sIFs2XV0sIFtbOF0sIFsxMF0sIFsxMl1dXSk7XG4gICAgY29uc3QgYiA9IGEucmVzaGFwZShbNl0pO1xuICAgIGV4cGVjdChiLmR0eXBlKS50b0JlKCdjb21wbGV4NjQnKTtcbiAgICBleHBlY3QoYi5zaGFwZSkudG9FcXVhbChbNl0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBhd2FpdCBiLmRhdGEoKSk7XG4gIH0pO1xuXG4gIGl0KCdUZW5zb3I0RCBkZWZhdWx0IGR0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3I0ZChbMSwgMiwgMywgNCwgNSwgNl0sIFsyLCAzLCAxLCAxXSk7XG4gICAgY29uc3QgYiA9IGEucmVzaGFwZShbMiwgM10pO1xuICAgIGV4cGVjdChiLmR0eXBlKS50b0JlKCdmbG9hdDMyJyk7XG4gICAgZXhwZWN0KGIuc2hhcGUpLnRvRXF1YWwoWzIsIDNdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBhLmRhdGEoKSwgYXdhaXQgYi5kYXRhKCkpO1xuICB9KTtcblxuICBpdCgnVGVuc29yNEQgZmxvYXQzMiBkdHlwZScsICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yNGQoWzEsIDIsIDMsIDQsIDUsIDZdLCBbMiwgMywgMSwgMV0sICdmbG9hdDMyJyk7XG4gICAgY29uc3QgYiA9IGEucmVzaGFwZShbMiwgM10pO1xuICAgIGV4cGVjdChiLmR0eXBlKS50b0JlKCdmbG9hdDMyJyk7XG4gICAgZXhwZWN0KGIuc2hhcGUpLnRvRXF1YWwoWzIsIDNdKTtcbiAgfSk7XG5cbiAgaXQoJ1RlbnNvcjREIGludDMyIGR0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3I0ZChbMSwgMiwgMywgNCwgNSwgNl0sIFsyLCAzLCAxLCAxXSwgJ2ludDMyJyk7XG4gICAgY29uc3QgYiA9IGEucmVzaGFwZShbMywgMl0pO1xuICAgIGV4cGVjdChiLmR0eXBlKS50b0JlKCdpbnQzMicpO1xuICAgIGV4cGVjdChiLnNoYXBlKS50b0VxdWFsKFszLCAyXSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYS5kYXRhKCksIGF3YWl0IGIuZGF0YSgpKTtcbiAgfSk7XG5cbiAgaXQoJ1RlbnNvcjREIGNvbXBsZXg2NCBkdHlwZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuY29tcGxleChcbiAgICAgICAgW1tbWzFdXSwgW1szXV0sIFtbNV1dXSwgW1tbN11dLCBbWzldXSwgW1sxMV1dXV0sXG4gICAgICAgIFtbW1syXV0sIFtbNF1dLCBbWzZdXV0sIFtbWzhdXSwgW1sxMF1dLCBbWzEyXV1dXSk7XG4gICAgY29uc3QgYiA9IGEucmVzaGFwZShbMywgMl0pO1xuICAgIGV4cGVjdChiLmR0eXBlKS50b0JlKCdjb21wbGV4NjQnKTtcbiAgICBleHBlY3QoYi5zaGFwZSkudG9FcXVhbChbMywgMl0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBhd2FpdCBiLmRhdGEoKSk7XG4gIH0pO1xuXG4gIGl0KCdUZW5zb3I0RCBib29sIGR0eXBlJywgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3I0ZChbMSwgMiwgMywgNCwgNSwgNl0sIFsyLCAzLCAxLCAxXSwgJ2Jvb2wnKTtcbiAgICBjb25zdCBiID0gYS5yZXNoYXBlKFszLCAyXSk7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2Jvb2wnKTtcbiAgICBleHBlY3QoYi5zaGFwZSkudG9FcXVhbChbMywgMl0pO1xuICB9KTtcblxuICBpdCgnLmRhdGEoKSB3aXRoIGNhc3RpbmcsIHN0cmluZyB0ZW5zb3InLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcihbJ2EnLCAnYiddKTtcbiAgICBjb25zdCBkYXRhOiBzdHJpbmdbXSA9IGF3YWl0IGEuZGF0YTwnc3RyaW5nJz4oKTtcbiAgICBleHBlY3QoZGF0YSkudG9FcXVhbChbJ2EnLCAnYiddKTtcbiAgfSk7XG5cbiAgaXQoJ3Jlc2hhcGUgaXMgZnVuY3Rpb25hbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuc2NhbGFyKDIuNCk7XG4gICAgY29uc3QgYiA9IGEucmVzaGFwZShbXSk7XG4gICAgZXhwZWN0KGEuaWQpLm5vdC50b0JlKGIuaWQpO1xuICAgIGIuZGlzcG9zZSgpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBbMi40XSk7XG4gIH0pO1xuXG4gIGl0KCdyZXNoYXBlIGEgc3RyaW5nIHRlbnNvcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yKFsnYScsICdiJ10pO1xuICAgIGNvbnN0IGIgPSBhLnJlc2hhcGUoWzIsIDEsIDFdKTtcbiAgICBleHBlY3QoYi5kdHlwZSkudG9CZSgnc3RyaW5nJyk7XG4gICAgZXhwZWN0KGIuc2hhcGUpLnRvRXF1YWwoWzIsIDEsIDFdKTtcbiAgICBleHBlY3RBcnJheXNFcXVhbChhd2FpdCBiLmRhdGEoKSwgWydhJywgJ2InXSk7XG4gIH0pO1xuXG4gIGl0KCdyZXNoYXBlIHRocm93cyB3aGVuIHBhc3NlZCBhIG5vbi10ZW5zb3InLCAoKSA9PiB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGV4cGVjdCgoKSA9PiB0Zi5yZXNoYXBlKHt9IGFzIGFueSwgW10pKVxuICAgICAgICAudG9UaHJvd0Vycm9yKC9Bcmd1bWVudCAneCcgcGFzc2VkIHRvICdyZXNoYXBlJyBtdXN0IGJlIGEgVGVuc29yLyk7XG4gIH0pO1xuXG4gIGl0KCdyZXNoYXBlIGFjY2VwdHMgYSB0ZW5zb3ItbGlrZSBvYmplY3QnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gdGYucmVzaGFwZShbWzEsIDIsIDNdLCBbNCwgNSwgNl1dLCBbMywgMl0pO1xuICAgIGV4cGVjdChyZXMuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QocmVzLnNoYXBlKS50b0VxdWFsKFszLCAyXSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgcmVzLmRhdGEoKSwgWzEsIDIsIDMsIDQsIDUsIDZdKTtcbiAgfSk7XG5cbiAgaXQoJ2Nhc3QgYm9vbCAtPiBib29sJywgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMF0sICdib29sJyk7XG4gICAgZXhwZWN0KGEuY2FzdCgnYm9vbCcpLmR0eXBlKS50b0VxdWFsKCdib29sJyk7XG4gIH0pO1xuXG4gIGl0KCdjYXN0IGJvb2wgLT4gaW50MzInLCAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAwXSwgJ2Jvb2wnKTtcbiAgICBleHBlY3QoYS5jYXN0KCdpbnQzMicpLmR0eXBlKS50b0VxdWFsKCdpbnQzMicpO1xuICB9KTtcblxuICBpdCgnY2FzdCBib29sIC0+IGZsb2F0MzInLCAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAwXSwgJ2Jvb2wnKTtcbiAgICBleHBlY3QoYS5jYXN0KCdmbG9hdDMyJykuZHR5cGUpLnRvRXF1YWwoJ2Zsb2F0MzInKTtcbiAgfSk7XG5cbiAgaXQoJ2Nhc3QgaW50MzIgLT4gYm9vbCcsICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDBdLCAnaW50MzInKTtcbiAgICBleHBlY3QoYS5jYXN0KCdib29sJykuZHR5cGUpLnRvRXF1YWwoJ2Jvb2wnKTtcbiAgfSk7XG5cbiAgaXQoJ2Nhc3QgaW50MzIgLT4gaW50MzInLCAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyXSwgJ2ludDMyJyk7XG4gICAgZXhwZWN0KGEuY2FzdCgnaW50MzInKS5kdHlwZSkudG9FcXVhbCgnaW50MzInKTtcbiAgfSk7XG5cbiAgaXQoJ2Nhc3QgaW50MzIgLT4gZmxvYXQzMicsICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdLCAnaW50MzInKTtcbiAgICBleHBlY3QoYS5jYXN0KCdmbG9hdDMyJykuZHR5cGUpLnRvRXF1YWwoJ2Zsb2F0MzInKTtcbiAgfSk7XG5cbiAgaXQoJ2Nhc3QgZmxvYXQzMiAtPiBib29sJywgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMS4wLCAwLjBdKTtcbiAgICBleHBlY3QoYS5jYXN0KCdib29sJykuZHR5cGUpLnRvRXF1YWwoJ2Jvb2wnKTtcbiAgfSk7XG5cbiAgaXQoJ2Nhc3QgZmxvYXQzMiAtPiBpbnQzMicsICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMWQoWzEuMCwgMi4wXSk7XG4gICAgZXhwZWN0KGEuY2FzdCgnaW50MzInKS5kdHlwZSkudG9FcXVhbCgnaW50MzInKTtcbiAgfSk7XG5cbiAgaXQoJ2Nhc3QgZmxvYXQzMiAtPiBpbnQzMi4gYXN5bmMgZG93bmxvYWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyXSk7XG4gICAgY29uc3QgYUludCA9IGEuY2FzdCgnaW50MzInKTtcbiAgICBleHBlY3QoYUludC5kdHlwZSkudG9FcXVhbCgnaW50MzInKTtcblxuICAgIGNvbnN0IGFzeW5jRGF0YSA9IGF3YWl0IGFJbnQuZGF0YSgpO1xuICAgIGV4cGVjdChhc3luY0RhdGEgaW5zdGFuY2VvZiBJbnQzMkFycmF5KS50b0VxdWFsKHRydWUpO1xuICB9KTtcblxuICBpdCgnY2FzdCBmbG9hdDMyIC0+IGludDMyLiBxdWV1ZWQgYXN5bmMgZG93bmxvYWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyXSk7XG4gICAgY29uc3QgYUludCA9IGEuY2FzdCgnaW50MzInKTtcbiAgICBleHBlY3QoYUludC5kdHlwZSkudG9FcXVhbCgnaW50MzInKTtcblxuICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IGF3YWl0IFByb21pc2UuYWxsKFthSW50LmRhdGEoKSwgYUludC5kYXRhKCldKTtcbiAgICBleHBlY3QoZmlyc3QgaW5zdGFuY2VvZiBJbnQzMkFycmF5KS50b0VxdWFsKHRydWUpO1xuICAgIGV4cGVjdChzZWNvbmQgaW5zdGFuY2VvZiBJbnQzMkFycmF5KS50b0VxdWFsKHRydWUpO1xuICB9KTtcblxuICBpdCgnY2FzdCBmbG9hdDMyIC0+IGludDMyLiBzeW5jIGRvd25sb2FkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMl0pLmNhc3QoJ2ludDMyJyk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvRXF1YWwoJ2ludDMyJyk7XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgYS5kYXRhKCk7XG4gICAgZXhwZWN0KGRhdGEgaW5zdGFuY2VvZiBJbnQzMkFycmF5KS50b0VxdWFsKHRydWUpO1xuICB9KTtcblxuICBpdCgnY2FzdCBmbG9hdDMyIC0+IGZsb2F0MzInLCAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLjAsIDIuMF0pO1xuICAgIGV4cGVjdChhLmNhc3QoJ2Zsb2F0MzInKS5kdHlwZSkudG9FcXVhbCgnZmxvYXQzMicpO1xuICB9KTtcblxuICBpdCgnY2FzdCBjb21wbGV4NjQgLT4gZmxvYXQzMicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuY29tcGxleChbMS4wLCAyLjBdLCBbMy4wLCA0LjBdKTtcbiAgICBjb25zdCByZXN1bHQgPSBhLmNhc3QoJ2Zsb2F0MzInKTtcblxuICAgIGV4cGVjdChyZXN1bHQuZHR5cGUpLnRvRXF1YWwoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCByZXN1bHQuZGF0YSgpLCBbMS4wLCAyLjBdKTtcbiAgfSk7XG5cbiAgaXQoJ2Nhc3QgY29tcGxleDY0IC0+IGludDMyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi5jb21wbGV4KFsxLjAsIDIuMF0sIFszLjAsIDQuMF0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGEuY2FzdCgnaW50MzInKTtcblxuICAgIGV4cGVjdChyZXN1bHQuZHR5cGUpLnRvRXF1YWwoJ2ludDMyJyk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgcmVzdWx0LmRhdGEoKSwgWzEsIDJdKTtcbiAgfSk7XG5cbiAgaXQoJ2Nhc3QgY29tcGxleDY0IC0+IGJvb2wnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLmNvbXBsZXgoWzEuMCwgMC4wXSwgWzEuMCwgMS4wXSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYS5jYXN0KCdib29sJyk7XG5cbiAgICBleHBlY3QocmVzdWx0LmR0eXBlKS50b0VxdWFsKCdib29sJyk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgcmVzdWx0LmRhdGEoKSwgW3RydWUsIGZhbHNlXSk7XG4gIH0pO1xuXG4gIGl0KCdjYXN0IHRocm93cyB3aGVuIHBhc3NlZCBhIG5vbi10ZW5zb3InLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IHRmLmNhc3Qoe30gYXMgdGYuVGVuc29yLCAnZmxvYXQzMicpKVxuICAgICAgICAudG9UaHJvd0Vycm9yKC9Bcmd1bWVudCAneCcgcGFzc2VkIHRvICdjYXN0JyBtdXN0IGJlIGEgVGVuc29yLyk7XG4gIH0pO1xuXG4gIGl0KCdjYXN0IGFjY2VwdHMgYSB0ZW5zb3ItbGlrZSBvYmplY3QnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IFsxLjAsIDIuMF07XG4gICAgY29uc3QgcmVzID0gdGYuY2FzdChhLCAnaW50MzInKTtcbiAgICBleHBlY3QocmVzLmR0eXBlKS50b0VxdWFsKCdpbnQzMicpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IHJlcy5kYXRhKCksIFsxLCAyXSk7XG4gIH0pO1xuXG4gIGl0KCdjYXN0IHN0cmluZyAtPiAhc3RyaW5nIHRocm93cyBlcnJvcicsICgpID0+IHtcbiAgICBjb25zdCBhID0gWydhJywgJ2InXTtcbiAgICBleHBlY3QoKCkgPT4gdGYuY2FzdChhLCAnaW50MzInKSkudG9UaHJvd0Vycm9yKCk7XG4gICAgZXhwZWN0KCgpID0+IHRmLmNhc3QoYSwgJ2Zsb2F0MzInKSkudG9UaHJvd0Vycm9yKCk7XG4gICAgZXhwZWN0KCgpID0+IHRmLmNhc3QoYSwgJ2Jvb2wnKSkudG9UaHJvd0Vycm9yKCk7XG4gICAgZXhwZWN0KCgpID0+IHRmLmNhc3QoYSwgJ2NvbXBsZXg2NCcpKS50b1Rocm93RXJyb3IoKTtcbiAgfSk7XG5cbiAgaXQoJ2Nhc3QgIXN0cmluZyAtPiBzdHJpbmcgdGhyb3dzIGVycm9yJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiB0Zi5jYXN0KHRmLnRlbnNvcigxLCBbXSwgJ2Zsb2F0MzInKSwgJ3N0cmluZycpKS50b1Rocm93RXJyb3IoKTtcbiAgICBleHBlY3QoKCkgPT4gdGYuY2FzdCh0Zi50ZW5zb3IoMSwgW10sICdpbnQzMicpLCAnc3RyaW5nJykpLnRvVGhyb3dFcnJvcigpO1xuICAgIGV4cGVjdCgoKSA9PiB0Zi5jYXN0KHRmLnRlbnNvcigxLCBbXSwgJ2Jvb2wnKSwgJ3N0cmluZycpKS50b1Rocm93RXJyb3IoKTtcbiAgICBleHBlY3QoKCkgPT4gdGYuY2FzdCh0Zi50ZW5zb3IoMSwgW10sICdjb21wbGV4NjQnKSwgJ3N0cmluZycpKVxuICAgICAgICAudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCdzY2FsYXIgYm9vbCAtPiBpbnQzMicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuc2NhbGFyKHRydWUsICdib29sJykudG9JbnQoKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3RBcnJheXNFcXVhbChhd2FpdCBhLmRhdGEoKSwgMSk7XG4gIH0pO1xuXG4gIGl0KCdUZW5zb3IxRCBmbG9hdDMyIC0+IGludDMyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMS4xLCAzLjksIC0yLjksIDBdKS50b0ludCgpO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdpbnQzMicpO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbMSwgMywgLTIsIDBdKTtcbiAgfSk7XG5cbiAgaXQoJ1RlbnNvcjJEIGZsb2F0MzIgLT4gYm9vbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMmQoWzEuMSwgMy45LCAtMi45LCAwXSwgWzIsIDJdKS5hc1R5cGUoJ2Jvb2wnKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnYm9vbCcpO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbMSwgMSwgMSwgMF0pO1xuICB9KTtcblxuICBpdCgnVGVuc29yMkQgaW50MzIgLT4gYm9vbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMmQoWzEsIDMsIDAsIC0xXSwgWzIsIDJdLCAnaW50MzInKS50b0Jvb2woKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnYm9vbCcpO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbMSwgMSwgMCwgMV0pO1xuICB9KTtcblxuICBpdCgnVGVuc29yM0QgYm9vbCAtPiBmbG9hdDMyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPVxuICAgICAgICB0Zi50ZW5zb3IzZChbdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlXSwgWzIsIDIsIDFdLCAnYm9vbCcpLnRvRmxvYXQoKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnZmxvYXQzMicpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBbMSwgMCwgMCwgMV0pO1xuICB9KTtcblxuICBpdCgnYm9vbCBDUFUgLT4gR1BVIC0+IENQVScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDAsIDAsIDVdLCAnYm9vbCcpO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbMSwgMSwgMCwgMCwgMV0pO1xuICB9KTtcblxuICBpdCgnaW50MzIgQ1BVIC0+IEdQVSAtPiBDUFUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAwLCAwLCA1XSwgJ2ludDMyJyk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIFsxLCAyLCAwLCAwLCA1XSk7XG4gIH0pO1xuXG4gIGl0KCdhc1R5cGUgaXMgZnVuY3Rpb25hbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuc2NhbGFyKDIuNCwgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBiID0gYS50b0Zsb2F0KCk7XG4gICAgZXhwZWN0KGEuaWQpLm5vdC50b0JlKGIuaWQpO1xuICAgIGIuZGlzcG9zZSgpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGEuZGF0YSgpLCBbMi40XSk7XG4gIH0pO1xuXG4gIGl0KCdzcXVlZXplIG5vIGF4aXMnLCAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjJkKFs0LCAyLCAxXSwgWzMsIDFdLCAnYm9vbCcpO1xuICAgIGNvbnN0IGIgPSBhLnNxdWVlemUoKTtcbiAgICBleHBlY3QoYi5zaGFwZSkudG9FcXVhbChbM10pO1xuICB9KTtcblxuICBpdCgnc3F1ZWV6ZSB3aXRoIGF4aXMnLCAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjNkKFs0LCAyLCAxXSwgWzMsIDEsIDFdLCAnYm9vbCcpO1xuICAgIGNvbnN0IGIgPSBhLnNxdWVlemUoWzFdKTtcbiAgICBleHBlY3QoYi5zaGFwZSkudG9FcXVhbChbMywgMV0pO1xuICB9KTtcblxuICBpdCgnc3F1ZWV6ZSB3aXRoIG5lZ2F0aXZlIGF4aXMnLCAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjNkKFs0LCAyLCAxXSwgWzMsIDEsIDFdLCAnYm9vbCcpO1xuICAgIGNvbnN0IGIgPSBhLnNxdWVlemUoWy0xXSk7XG4gICAgZXhwZWN0KGIuc2hhcGUpLnRvRXF1YWwoWzMsIDFdKTtcbiAgfSk7XG5cbiAgaXQoJ3NxdWVlemUgd2l0aCBtdWx0aXBsZSBuZWdhdGl2ZSBheGlzJywgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IzZChbNCwgMiwgMV0sIFszLCAxLCAxXSwgJ2Jvb2wnKTtcbiAgICBjb25zdCBiID0gYS5zcXVlZXplKFstMSwgLTJdKTtcbiAgICBleHBlY3QoYi5zaGFwZSkudG9FcXVhbChbM10pO1xuICB9KTtcblxuICBpdCgnc3F1ZWV6ZSB3cm9uZyBheGlzJywgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IzZChbNCwgMiwgMV0sIFszLCAxLCAxXSwgJ2Jvb2wnKTtcbiAgICBleHBlY3QoKCkgPT4gYS5zcXVlZXplKFswLCAxXSkpLnRvVGhyb3dFcnJvcigpO1xuICB9KTtcblxuICBpdCgnc3F1ZWV6ZSB3cm9uZyBuZWdhdGl2ZSBheGlzJywgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IzZChbNCwgMiwgMV0sIFszLCAxLCAxXSwgJ2Jvb2wnKTtcbiAgICBleHBlY3QoKCkgPT4gYS5zcXVlZXplKFstMywgLTJdKSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCdzcXVlZXplIGF4aXMgb3V0IG9mIHJhbmdlJywgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IzZChbNCwgMiwgMV0sIFszLCAxLCAxXSwgJ2Jvb2wnKTtcbiAgICBleHBlY3QoKCkgPT4gYS5zcXVlZXplKFsxMCwgMTFdKSkudG9UaHJvd0Vycm9yKCk7XG4gIH0pO1xuXG4gIGl0KCdzcXVlZXplIG5lZ2F0aXZlIGF4aXMgb3V0IG9mIHJhbmdlJywgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IzZChbNCwgMiwgMV0sIFszLCAxLCAxXSwgJ2Jvb2wnKTtcbiAgICBleHBlY3QoKCkgPT4gYS5zcXVlZXplKFstMTMsIC0xMl0pKS50b1Rocm93RXJyb3IoKTtcbiAgfSk7XG5cbiAgaXQoJ3NxdWVlemUgdGhyb3dzIHdoZW4gcGFzc2VkIGEgbm9uLXRlbnNvcicsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gdGYuc3F1ZWV6ZSh7fSBhcyB0Zi5UZW5zb3IpKVxuICAgICAgICAudG9UaHJvd0Vycm9yKC9Bcmd1bWVudCAneCcgcGFzc2VkIHRvICdzcXVlZXplJyBtdXN0IGJlIGEgVGVuc29yLyk7XG4gIH0pO1xuXG4gIGl0KCdzcXVlZXplIGFjY2VwdHMgYSB0ZW5zb3ItbGlrZSBvYmplY3QnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gdGYuc3F1ZWV6ZShbW1s0XV0sIFtbMl1dLCBbWzFdXV0gLyogc2hhcGUgaXMgWzMsIDEsIDFdICovKTtcbiAgICBleHBlY3QocmVzLnNoYXBlKS50b0VxdWFsKFszXSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgcmVzLmRhdGEoKSwgWzQsIDIsIDFdKTtcbiAgfSk7XG5cbiAgaXQoJ3NxdWVlemUgYSB6ZXJvLXNpemVkIHRlbnNvcicsICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yM2QoW10sIFswLCAxLCAwXSk7XG4gICAgY29uc3QgcmVzID0gdGYuc3F1ZWV6ZShhKTtcbiAgICBleHBlY3QocmVzLnNoYXBlKS50b0VxdWFsKFswLCAwXSk7XG4gIH0pO1xuXG4gIGl0KCdzcXVlZXplIGNhbiB0YWtlIGFuIGVtcHR5IGxpc3Qgb2YgYXhpcycsICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuemVyb3MoWzIsIDEsIDMsIDEsIDRdKTtcbiAgICBjb25zdCBheGVzOiBudW1iZXJbXSA9IFtdO1xuICAgIC8vIEVtcHR5IGF4ZXMgbGlzdCBtZWFucyBhbGwgcG9zc2libGUgYXhlcy5cbiAgICBjb25zdCByZXMgPSB0Zi5zcXVlZXplKGEsIGF4ZXMpO1xuICAgIGV4cGVjdChyZXMuc2hhcGUpLnRvRXF1YWwoWzIsIDMsIDRdKTtcbiAgfSk7XG5cbiAgaXQoJ3NxdWVlemUgYSBjb21wbGV4NjQgdGVuc29yJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi5jb21wbGV4KFtbNF0sIFsxXSwgWzVdXSwgW1syXSwgWzNdLCBbNl1dKTtcbiAgICBjb25zdCBiID0gYS5zcXVlZXplKCk7XG4gICAgZXhwZWN0KGIuc2hhcGUpLnRvRXF1YWwoWzNdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBiLmRhdGEoKSwgWzQsIDIsIDEsIDMsIDUsIDZdKTtcbiAgfSk7XG5cbiAgaXQoJ3NjYWxhciAtPiAyZCcsICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuc2NhbGFyKDQsICdpbnQzMicpO1xuICAgIGNvbnN0IGIgPSBhLmFzMkQoMSwgMSk7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2ludDMyJyk7XG4gICAgZXhwZWN0KGIuc2hhcGUpLnRvRXF1YWwoWzEsIDFdKTtcbiAgfSk7XG5cbiAgaXQoJzFkIC0+IDJkJywgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbNCwgMiwgMV0sICdib29sJyk7XG4gICAgY29uc3QgYiA9IGEuYXMyRCgzLCAxKTtcbiAgICBleHBlY3QoYi5kdHlwZSkudG9CZSgnYm9vbCcpO1xuICAgIGV4cGVjdChiLnNoYXBlKS50b0VxdWFsKFszLCAxXSk7XG4gIH0pO1xuXG4gIGl0KCcyZCAtPiA0ZCcsICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMmQoWzQsIDIsIDEsIDNdLCBbMiwgMl0pO1xuICAgIGNvbnN0IGIgPSBhLmFzNEQoMSwgMSwgMiwgMik7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYi5zaGFwZSkudG9FcXVhbChbMSwgMSwgMiwgMl0pO1xuICB9KTtcblxuICBpdCgnM2QgLT4gMmQnLCAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjNkKFs0LCAyLCAxLCAzXSwgWzIsIDIsIDFdLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGIgPSBhLmFzMkQoMiwgMik7XG4gICAgZXhwZWN0KGIuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYi5zaGFwZSkudG9FcXVhbChbMiwgMl0pO1xuICB9KTtcblxuICBpdCgnNGQgLT4gMWQnLCAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjRkKFs0LCAyLCAxLCAzXSwgWzIsIDIsIDEsIDFdLCAnYm9vbCcpO1xuICAgIGNvbnN0IGIgPSBhLmFzMUQoKTtcbiAgICBleHBlY3QoYi5kdHlwZSkudG9CZSgnYm9vbCcpO1xuICAgIGV4cGVjdChiLnNoYXBlKS50b0VxdWFsKFs0XSk7XG4gIH0pO1xuXG4gIGl0KCd0aHJvd3Mgd2hlbiBwYXNzZWQgbm9uLWludGVnZXIgc2hhcGUnLCAoKSA9PiB7XG4gICAgY29uc3QgbXNnID0gJ1RlbnNvciBtdXN0IGhhdmUgYSBzaGFwZSBjb21wcmlzZWQgb2YgcG9zaXRpdmUgJyArXG4gICAgICAgICdpbnRlZ2VycyBidXQgZ290IHNoYXBlIFsyLDIuMl0uJztcbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yKFsxLCAyLCAzLCA0XSwgWzIsIDIuMl0pKS50b1Rocm93RXJyb3IobXNnKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyB3aGVuIHBhc3NlZCBuZWdhdGl2ZSBzaGFwZScsICgpID0+IHtcbiAgICBjb25zdCBtc2cgPSAnVGVuc29yIG11c3QgaGF2ZSBhIHNoYXBlIGNvbXByaXNlZCBvZiBwb3NpdGl2ZSAnICtcbiAgICAgICAgJ2ludGVnZXJzIGJ1dCBnb3Qgc2hhcGUgWzIsLTJdLic7XG4gICAgZXhwZWN0KCgpID0+IHRmLnRlbnNvcihbMSwgMiwgMywgNF0sIFsyLCAtMl0pKS50b1Rocm93RXJyb3IobXNnKTtcbiAgfSk7XG5cbiAgaXQoJ29uZXMgd2l0aCBjb21wbGV4IHR5cGUnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gSW1hZ2luYXJ5IHBhcnQgc2hvdWxkIGJlIHplcm8uXG4gICAgY29uc3QgYSA9IHRmLm9uZXMoWzIsIDJdLCAnY29tcGxleDY0Jyk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYS5kYXRhKCksIFsxLCAwLCAxLCAwLCAxLCAwLCAxLCAwXSk7XG4gIH0pO1xuXG4gIGl0KCdjYW4gY3JlYXRlIGEgdGVuc29yIHdoZXJlIHZhbHVlcy5zaXplICE9IGJ1ZmZlci5zaXplJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSBuZXcgRmxvYXQzMkFycmF5KFsxLCAyLCAzLCA0LCA1XSk7XG4gICAgY29uc3QgYiA9IGEuc3ViYXJyYXkoMCwgMik7XG4gICAgY29uc3QgdCA9IHRmLnRlbnNvcjFkKGIpO1xuICAgIGV4cGVjdCh0LnNoYXBlKS50b0VxdWFsKFsyXSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgdC5kYXRhKCksIFsxLCAyXSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlV2l0aEZsYWdzKCd0ZW5zb3IgZGVidWcgbW9kZScsIEFMTF9FTlZTLCAoKSA9PiB7XG4gIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgLy8gU2lsZW5jZSBkZWJ1ZyB3YXJuaW5ncy5cbiAgICBzcHlPbihjb25zb2xlLCAnd2FybicpO1xuICAgIHRmLmVuYWJsZURlYnVnTW9kZSgpO1xuICB9KTtcblxuICBpdCgndGYudGVuc29yKCkgZnJvbSBUeXBlZEFycmF5ICsgbnVtYmVyW10gZmFpbHMgZHVlIHRvIHdyb25nIHNoYXBlJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiB0Zi50ZW5zb3IoW1xuICAgICAgbmV3IEZsb2F0MzJBcnJheShbMSwgMl0pLFxuICAgICAgbmV3IEZsb2F0MzJBcnJheShbMywgNF0pLFxuICAgICAgbmV3IEZsb2F0MzJBcnJheShbNSwgNl0pLFxuICAgICAgLy8gU2hvdWxkIGJlIG9mIGxlbmd0aCA0XG4gICAgICBbNywgOCwgOSwgMTBdLFxuICAgIF0pKVxuICAgICAgICAudG9UaHJvd0Vycm9yKFxuICAgICAgICAgICAgL0VsZW1lbnQgYXJyXFxbM1xcXSBzaG91bGQgaGF2ZSAyIGVsZW1lbnRzLCBidXQgaGFzIDQgZWxlbWVudHMvKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmVXaXRoRmxhZ3MoJ3RlbnNvciBkYXRhU3luYycsIFNZTkNfQkFDS0VORF9FTlZTLCAoKSA9PiB7XG4gIGl0KCcuZGF0YVN5bmMoKSB3aXRoIGNhc3RpbmcsIHN0cmluZyB0ZW5zb3InLCAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcihbJ2EnLCAnYiddKTtcbiAgICBjb25zdCBkYXRhOiBzdHJpbmdbXSA9IGEuZGF0YVN5bmM8J3N0cmluZyc+KCk7XG4gICAgZXhwZWN0KGRhdGEpLnRvRXF1YWwoWydhJywgJ2InXSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlV2l0aEZsYWdzKCd0ZW5zb3IgYXJyYXlTeW5jJywgU1lOQ19CQUNLRU5EX0VOVlMsICgpID0+IHtcbiAgaXQoJy5hcnJheVN5bmMoKSB3aXRoIGEgbm9uLWNvbXBsZXggdGVuc29yJywgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3IoWzEsIDIsIDMsIDQsIDUsIDZdLCBbMiwgM10pO1xuICAgIGV4cGVjdChhLmFycmF5U3luYygpKS50b0VxdWFsKFtbMSwgMiwgM10sIFs0LCA1LCA2XV0pO1xuICB9KTtcblxuICBpdCgnLmFycmF5U3luYygpIHdpdGggYSBjb21wbGV4IHRlbnNvcicsICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYuY29tcGxleChbWzEsIDJdLCBbMywgNF1dLCBbWzExLCAxMl0sIFsxMywgMTRdXSk7XG4gICAgZXhwZWN0KGEuYXJyYXlTeW5jKCkpLnRvRXF1YWwoW1sxLCAxMSwgMiwgMTJdLCBbMywgMTMsIDQsIDE0XV0pO1xuICB9KTtcblxuICAvLyBUaGUgb3RoZXIgY2FzZXMgc2hvdWxkIGJlIGNvdmVyZWQgYnkgdG9OZXN0ZWRBcnJheSB0ZXN0cyBpbiB1dGlsX3Rlc3QudHMuXG59KTtcblxuZGVzY3JpYmVXaXRoRmxhZ3MoJ3RlbnNvci50b1N0cmluZycsIFNZTkNfQkFDS0VORF9FTlZTLCAoKSA9PiB7XG4gIGl0KCdzY2FsYXIgdmVyYm9zZScsICgpID0+IHtcbiAgICBjb25zdCB2ZXJib3NlID0gdHJ1ZTtcbiAgICBjb25zdCBzdHIgPSB0Zi5zY2FsYXIoNSkudG9TdHJpbmcodmVyYm9zZSk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICBkdHlwZTogZmxvYXQzMlxcbicgK1xuICAgICAgICAnICByYW5rOiAwXFxuJyArXG4gICAgICAgICcgIHNoYXBlOiBbXVxcbicgK1xuICAgICAgICAnICB2YWx1ZXM6XFxuJyArXG4gICAgICAgICcgICAgNScpO1xuICB9KTtcblxuICBpdCgnc3RyaW5nIHNjYWxhciB2ZXJib3NlJywgKCkgPT4ge1xuICAgIGNvbnN0IHZlcmJvc2UgPSB0cnVlO1xuICAgIGNvbnN0IHN0ciA9IHRmLnNjYWxhcigndGVzdCcpLnRvU3RyaW5nKHZlcmJvc2UpO1xuICAgIGV4cGVjdChzdHIpLnRvRXF1YWwoXG4gICAgICAgICdUZW5zb3JcXG4nICtcbiAgICAgICAgJyAgZHR5cGU6IHN0cmluZ1xcbicgK1xuICAgICAgICAnICByYW5rOiAwXFxuJyArXG4gICAgICAgICcgIHNoYXBlOiBbXVxcbicgK1xuICAgICAgICAnICB2YWx1ZXM6XFxuJyArXG4gICAgICAgICcgICAgdGVzdCcpO1xuICB9KTtcblxuICBpdCgnYm9vbCBzY2FsYXIgdmVyYm9zZScsICgpID0+IHtcbiAgICBjb25zdCB2ZXJib3NlID0gdHJ1ZTtcbiAgICBjb25zdCBzdHIgPSB0Zi5zY2FsYXIodHJ1ZSkudG9TdHJpbmcodmVyYm9zZSk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICBkdHlwZTogYm9vbFxcbicgK1xuICAgICAgICAnICByYW5rOiAwXFxuJyArXG4gICAgICAgICcgIHNoYXBlOiBbXVxcbicgK1xuICAgICAgICAnICB2YWx1ZXM6XFxuJyArXG4gICAgICAgICcgICAgdHJ1ZScpO1xuICB9KTtcblxuICBpdCgnMkQgMCBzaGFwZWQgdGVuc29yIHZlcmJvc2UnLCAoKSA9PiB7XG4gICAgY29uc3QgdmVyYm9zZSA9IHRydWU7XG4gICAgY29uc3Qgc3RyID0gdGYuemVyb3MoWzAsIDFdKS50b1N0cmluZyh2ZXJib3NlKTtcbiAgICBleHBlY3Qoc3RyKS50b0VxdWFsKFxuICAgICAgICAnVGVuc29yXFxuJyArXG4gICAgICAgICcgIGR0eXBlOiBmbG9hdDMyXFxuJyArXG4gICAgICAgICcgIHJhbms6IDJcXG4nICtcbiAgICAgICAgJyAgc2hhcGU6IFswLDFdXFxuJyArXG4gICAgICAgICcgIHZhbHVlczpcXG4nICtcbiAgICAgICAgJyAgICAgW10nKTtcbiAgfSk7XG5cbiAgaXQoJzNEIDAgc2hhcGVkIHRlbnNvciB2ZXJib3NlJywgKCkgPT4ge1xuICAgIGNvbnN0IHZlcmJvc2UgPSB0cnVlO1xuICAgIGNvbnN0IHN0ciA9IHRmLnplcm9zKFsxLCAwLCAxXSkudG9TdHJpbmcodmVyYm9zZSk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICBkdHlwZTogZmxvYXQzMlxcbicgK1xuICAgICAgICAnICByYW5rOiAzXFxuJyArXG4gICAgICAgICcgIHNoYXBlOiBbMSwwLDFdXFxuJyArXG4gICAgICAgICcgIHZhbHVlczpcXG4nICtcbiAgICAgICAgJyAgICAgWyBbXV0nKTtcbiAgfSk7XG5cbiAgaXQoJzFkIHRlbnNvciB2ZXJib3NlJywgKCkgPT4ge1xuICAgIGNvbnN0IHZlcmJvc2UgPSB0cnVlO1xuICAgIGNvbnN0IHN0ciA9IHRmLnplcm9zKFs0XSkudG9TdHJpbmcodmVyYm9zZSk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICBkdHlwZTogZmxvYXQzMlxcbicgK1xuICAgICAgICAnICByYW5rOiAxXFxuJyArXG4gICAgICAgICcgIHNoYXBlOiBbNF1cXG4nICtcbiAgICAgICAgJyAgdmFsdWVzOlxcbicgK1xuICAgICAgICAnICAgIFswLCAwLCAwLCAwXScpO1xuICB9KTtcblxuICBpdCgnMWQgc3RyaW5nIHRlbnNvciB2ZXJib3NlJywgKCkgPT4ge1xuICAgIGNvbnN0IHZlcmJvc2UgPSB0cnVlO1xuICAgIGNvbnN0IHN0ciA9IHRmLnRlbnNvcihbJ2EnLCAnYmInLCAnY2NjJ10pLnRvU3RyaW5nKHZlcmJvc2UpO1xuICAgIGV4cGVjdChzdHIpLnRvRXF1YWwoXG4gICAgICAgICdUZW5zb3JcXG4nICtcbiAgICAgICAgJyAgZHR5cGU6IHN0cmluZ1xcbicgK1xuICAgICAgICAnICByYW5rOiAxXFxuJyArXG4gICAgICAgICcgIHNoYXBlOiBbM11cXG4nICtcbiAgICAgICAgJyAgdmFsdWVzOlxcbicgK1xuICAgICAgICAnICAgIFtcXCdhXFwnLCBcXCdiYlxcJywgXFwnY2NjXFwnXScpO1xuICB9KTtcblxuICBpdCgnMWQgYm9vbCB0ZW5zb3IgdmVyYm9zZScsICgpID0+IHtcbiAgICBjb25zdCB2ZXJib3NlID0gdHJ1ZTtcbiAgICBjb25zdCBzdHIgPSB0Zi50ZW5zb3IoW3RydWUsIGZhbHNlLCB0cnVlXSkudG9TdHJpbmcodmVyYm9zZSk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICBkdHlwZTogYm9vbFxcbicgK1xuICAgICAgICAnICByYW5rOiAxXFxuJyArXG4gICAgICAgICcgIHNoYXBlOiBbM11cXG4nICtcbiAgICAgICAgJyAgdmFsdWVzOlxcbicgK1xuICAgICAgICAnICAgIFt0cnVlLCBmYWxzZSwgdHJ1ZV0nKTtcbiAgfSk7XG5cbiAgaXQoJzJkIHRlbnNvciB2ZXJib3NlJywgKCkgPT4ge1xuICAgIGNvbnN0IHZlcmJvc2UgPSB0cnVlO1xuICAgIGNvbnN0IHN0ciA9IHRmLnplcm9zKFszLCAzXSkudG9TdHJpbmcodmVyYm9zZSk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICBkdHlwZTogZmxvYXQzMlxcbicgK1xuICAgICAgICAnICByYW5rOiAyXFxuJyArXG4gICAgICAgICcgIHNoYXBlOiBbMywzXVxcbicgK1xuICAgICAgICAnICB2YWx1ZXM6XFxuJyArXG4gICAgICAgICcgICAgW1swLCAwLCAwXSxcXG4nICtcbiAgICAgICAgJyAgICAgWzAsIDAsIDBdLFxcbicgK1xuICAgICAgICAnICAgICBbMCwgMCwgMF1dJyk7XG4gIH0pO1xuXG4gIGl0KCcyZCBzdHJpbmcgdGVuc29yIHZlcmJvc2UnLCAoKSA9PiB7XG4gICAgY29uc3QgdmVyYm9zZSA9IHRydWU7XG4gICAgY29uc3QgdmFscyA9IFtcbiAgICAgIFsnYScsICdiYicsICdjY2MnXSxcbiAgICAgIFsnZCcsICdlJywgJ2YnXSxcbiAgICAgIFsnZycsICdoJywgJ2knXSxcbiAgICBdO1xuICAgIGNvbnN0IHN0ciA9IHRmLnRlbnNvcih2YWxzKS50b1N0cmluZyh2ZXJib3NlKTtcbiAgICBleHBlY3Qoc3RyKS50b0VxdWFsKFxuICAgICAgICAnVGVuc29yXFxuJyArXG4gICAgICAgICcgIGR0eXBlOiBzdHJpbmdcXG4nICtcbiAgICAgICAgJyAgcmFuazogMlxcbicgK1xuICAgICAgICAnICBzaGFwZTogWzMsM11cXG4nICtcbiAgICAgICAgJyAgdmFsdWVzOlxcbicgK1xuICAgICAgICAnICAgIFtbXFwnYVxcJywgXFwnYmJcXCcsIFxcJ2NjY1xcJ10sXFxuJyArXG4gICAgICAgICcgICAgIFtcXCdkXFwnLCBcXCdlXFwnICwgXFwnZlxcJyAgXSxcXG4nICtcbiAgICAgICAgJyAgICAgW1xcJ2dcXCcsIFxcJ2hcXCcgLCBcXCdpXFwnICBdXScpO1xuICB9KTtcblxuICBpdCgnMmQgYm9vbCB0ZW5zb3IgdmVyYm9zZScsICgpID0+IHtcbiAgICBjb25zdCB2ZXJib3NlID0gdHJ1ZTtcbiAgICBjb25zdCBzdHIgPSB0Zi56ZXJvcyhbMywgM10sICdib29sJykudG9TdHJpbmcodmVyYm9zZSk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICBkdHlwZTogYm9vbFxcbicgK1xuICAgICAgICAnICByYW5rOiAyXFxuJyArXG4gICAgICAgICcgIHNoYXBlOiBbMywzXVxcbicgK1xuICAgICAgICAnICB2YWx1ZXM6XFxuJyArXG4gICAgICAgICcgICAgW1tmYWxzZSwgZmFsc2UsIGZhbHNlXSxcXG4nICtcbiAgICAgICAgJyAgICAgW2ZhbHNlLCBmYWxzZSwgZmFsc2VdLFxcbicgK1xuICAgICAgICAnICAgICBbZmFsc2UsIGZhbHNlLCBmYWxzZV1dJyk7XG4gIH0pO1xuXG4gIGl0KCczZCB0ZW5zb3IgdmVyYm9zZScsICgpID0+IHtcbiAgICBjb25zdCB2ZXJib3NlID0gdHJ1ZTtcbiAgICBjb25zdCBzdHIgPSB0Zi56ZXJvcyhbMywgMywgMl0pLnRvU3RyaW5nKHZlcmJvc2UpO1xuICAgIGV4cGVjdChzdHIpLnRvRXF1YWwoXG4gICAgICAgICdUZW5zb3JcXG4nICtcbiAgICAgICAgJyAgZHR5cGU6IGZsb2F0MzJcXG4nICtcbiAgICAgICAgJyAgcmFuazogM1xcbicgK1xuICAgICAgICAnICBzaGFwZTogWzMsMywyXVxcbicgK1xuICAgICAgICAnICB2YWx1ZXM6XFxuJyArXG4gICAgICAgICcgICAgW1tbMCwgMF0sXFxuJyArXG4gICAgICAgICcgICAgICBbMCwgMF0sXFxuJyArXG4gICAgICAgICcgICAgICBbMCwgMF1dLFxcblxcbicgK1xuICAgICAgICAnICAgICBbWzAsIDBdLFxcbicgK1xuICAgICAgICAnICAgICAgWzAsIDBdLFxcbicgK1xuICAgICAgICAnICAgICAgWzAsIDBdXSxcXG5cXG4nICtcbiAgICAgICAgJyAgICAgW1swLCAwXSxcXG4nICtcbiAgICAgICAgJyAgICAgIFswLCAwXSxcXG4nICtcbiAgICAgICAgJyAgICAgIFswLCAwXV1dJyk7XG4gIH0pO1xuXG4gIGl0KCczZCBzdHJpbmcgdGVuc29yIHZlcmJvc2UnLCAoKSA9PiB7XG4gICAgY29uc3QgdmVyYm9zZSA9IHRydWU7XG4gICAgY29uc3QgdmFscyA9IFtcbiAgICAgIFtbJ2EnLCAnYmInXSwgWydjY2MnLCAnZGRkZCddXSxcbiAgICAgIFtbJ2UnLCAnZmYnXSwgWydnZ2cnLCAnaGhoaCddXSxcbiAgICAgIFtbJ2knLCAnamonXSwgWydra2snLCAnbGxsbCddXSxcbiAgICBdO1xuICAgIGNvbnN0IHN0ciA9IHRmLnRlbnNvcih2YWxzKS50b1N0cmluZyh2ZXJib3NlKTtcbiAgICBleHBlY3Qoc3RyKS50b0VxdWFsKFxuICAgICAgICAnVGVuc29yXFxuJyArXG4gICAgICAgICcgIGR0eXBlOiBzdHJpbmdcXG4nICtcbiAgICAgICAgJyAgcmFuazogM1xcbicgK1xuICAgICAgICAnICBzaGFwZTogWzMsMiwyXVxcbicgK1xuICAgICAgICAnICB2YWx1ZXM6XFxuJyArXG4gICAgICAgICcgICAgW1tbXFwnYVxcJyAgLCBcXCdiYlxcJyAgXSxcXG4nICtcbiAgICAgICAgJyAgICAgIFtcXCdjY2NcXCcsIFxcJ2RkZGRcXCddXSxcXG5cXG4nICtcbiAgICAgICAgJyAgICAgW1tcXCdlXFwnICAsIFxcJ2ZmXFwnICBdLFxcbicgK1xuICAgICAgICAnICAgICAgW1xcJ2dnZ1xcJywgXFwnaGhoaFxcJ11dLFxcblxcbicgK1xuICAgICAgICAnICAgICBbW1xcJ2lcXCcgICwgXFwnampcXCcgIF0sXFxuJyArXG4gICAgICAgICcgICAgICBbXFwna2trXFwnLCBcXCdsbGxsXFwnXV1dJyk7XG4gIH0pO1xuXG4gIGl0KCczZCBib29sIHRlbnNvciB2ZXJib3NlJywgKCkgPT4ge1xuICAgIGNvbnN0IHZlcmJvc2UgPSB0cnVlO1xuICAgIGNvbnN0IHN0ciA9IHRmLm9uZXMoWzMsIDMsIDJdLCAnYm9vbCcpLnRvU3RyaW5nKHZlcmJvc2UpO1xuICAgIGV4cGVjdChzdHIpLnRvRXF1YWwoXG4gICAgICAgICdUZW5zb3JcXG4nICtcbiAgICAgICAgJyAgZHR5cGU6IGJvb2xcXG4nICtcbiAgICAgICAgJyAgcmFuazogM1xcbicgK1xuICAgICAgICAnICBzaGFwZTogWzMsMywyXVxcbicgK1xuICAgICAgICAnICB2YWx1ZXM6XFxuJyArXG4gICAgICAgICcgICAgW1tbdHJ1ZSwgdHJ1ZV0sXFxuJyArXG4gICAgICAgICcgICAgICBbdHJ1ZSwgdHJ1ZV0sXFxuJyArXG4gICAgICAgICcgICAgICBbdHJ1ZSwgdHJ1ZV1dLFxcblxcbicgK1xuICAgICAgICAnICAgICBbW3RydWUsIHRydWVdLFxcbicgK1xuICAgICAgICAnICAgICAgW3RydWUsIHRydWVdLFxcbicgK1xuICAgICAgICAnICAgICAgW3RydWUsIHRydWVdXSxcXG5cXG4nICtcbiAgICAgICAgJyAgICAgW1t0cnVlLCB0cnVlXSxcXG4nICtcbiAgICAgICAgJyAgICAgIFt0cnVlLCB0cnVlXSxcXG4nICtcbiAgICAgICAgJyAgICAgIFt0cnVlLCB0cnVlXV1dJyk7XG4gIH0pO1xuXG4gIGl0KCcxZCBsb25nIHRlbnNvciB2ZXJib3NlJywgKCkgPT4ge1xuICAgIGNvbnN0IHZlcmJvc2UgPSB0cnVlO1xuICAgIGNvbnN0IHN0ciA9IHRmLnplcm9zKFsxMDBdKS50b1N0cmluZyh2ZXJib3NlKTtcbiAgICBleHBlY3Qoc3RyKS50b0VxdWFsKFxuICAgICAgICAnVGVuc29yXFxuJyArXG4gICAgICAgICcgIGR0eXBlOiBmbG9hdDMyXFxuJyArXG4gICAgICAgICcgIHJhbms6IDFcXG4nICtcbiAgICAgICAgJyAgc2hhcGU6IFsxMDBdXFxuJyArXG4gICAgICAgICcgIHZhbHVlczpcXG4nICtcbiAgICAgICAgJyAgICBbMCwgMCwgMCwgLi4uLCAwLCAwLCAwXScpO1xuICB9KTtcblxuICBpdCgnMWQgbG9uZyBzdHJpbmcgdGVuc29yIHZlcmJvc2UnLCAoKSA9PiB7XG4gICAgY29uc3QgdmVyYm9zZSA9IHRydWU7XG4gICAgY29uc3Qgc3RyID0gdGYuZmlsbChbMTAwXSwgJ2hpJykudG9TdHJpbmcodmVyYm9zZSk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICBkdHlwZTogc3RyaW5nXFxuJyArXG4gICAgICAgICcgIHJhbms6IDFcXG4nICtcbiAgICAgICAgJyAgc2hhcGU6IFsxMDBdXFxuJyArXG4gICAgICAgICcgIHZhbHVlczpcXG4nICtcbiAgICAgICAgJyAgICBbXFwnaGlcXCcsIFxcJ2hpXFwnLCBcXCdoaVxcJywgLi4uLCBcXCdoaVxcJywgXFwnaGlcXCcsIFxcJ2hpXFwnXScpO1xuICB9KTtcblxuICBpdCgnMmQgbG9uZyB0ZW5zb3IgdmVyYm9zZScsICgpID0+IHtcbiAgICBjb25zdCB2ZXJib3NlID0gdHJ1ZTtcbiAgICBjb25zdCBzdHIgPSB0Zi56ZXJvcyhbMTAwLCAxMDBdKS50b1N0cmluZyh2ZXJib3NlKTtcbiAgICBleHBlY3Qoc3RyKS50b0VxdWFsKFxuICAgICAgICAnVGVuc29yXFxuJyArXG4gICAgICAgICcgIGR0eXBlOiBmbG9hdDMyXFxuJyArXG4gICAgICAgICcgIHJhbms6IDJcXG4nICtcbiAgICAgICAgJyAgc2hhcGU6IFsxMDAsMTAwXVxcbicgK1xuICAgICAgICAnICB2YWx1ZXM6XFxuJyArXG4gICAgICAgICcgICAgW1swLCAwLCAwLCAuLi4sIDAsIDAsIDBdLFxcbicgK1xuICAgICAgICAnICAgICBbMCwgMCwgMCwgLi4uLCAwLCAwLCAwXSxcXG4nICtcbiAgICAgICAgJyAgICAgWzAsIDAsIDAsIC4uLiwgMCwgMCwgMF0sXFxuJyArXG4gICAgICAgICcgICAgIC4uLixcXG4nICtcbiAgICAgICAgJyAgICAgWzAsIDAsIDAsIC4uLiwgMCwgMCwgMF0sXFxuJyArXG4gICAgICAgICcgICAgIFswLCAwLCAwLCAuLi4sIDAsIDAsIDBdLFxcbicgK1xuICAgICAgICAnICAgICBbMCwgMCwgMCwgLi4uLCAwLCAwLCAwXV0nKTtcbiAgfSk7XG5cbiAgaXQoJzJkIGxvbmcgc3RyaW5nIHRlbnNvciB2ZXJib3NlJywgKCkgPT4ge1xuICAgIGNvbnN0IHZlcmJvc2UgPSB0cnVlO1xuICAgIGNvbnN0IHN0ciA9IHRmLmZpbGwoWzEwMCwgMTAwXSwgJ2EnKS50b1N0cmluZyh2ZXJib3NlKTtcbiAgICBleHBlY3Qoc3RyKS50b0VxdWFsKFxuICAgICAgICAnVGVuc29yXFxuJyArXG4gICAgICAgICcgIGR0eXBlOiBzdHJpbmdcXG4nICtcbiAgICAgICAgJyAgcmFuazogMlxcbicgK1xuICAgICAgICAnICBzaGFwZTogWzEwMCwxMDBdXFxuJyArXG4gICAgICAgICcgIHZhbHVlczpcXG4nICtcbiAgICAgICAgJyAgICBbW1xcJ2FcXCcsIFxcJ2FcXCcsIFxcJ2FcXCcsIC4uLiwgXFwnYVxcJywgXFwnYVxcJywgXFwnYVxcJ10sXFxuJyArXG4gICAgICAgICcgICAgIFtcXCdhXFwnLCBcXCdhXFwnLCBcXCdhXFwnLCAuLi4sIFxcJ2FcXCcsIFxcJ2FcXCcsIFxcJ2FcXCddLFxcbicgK1xuICAgICAgICAnICAgICBbXFwnYVxcJywgXFwnYVxcJywgXFwnYVxcJywgLi4uLCBcXCdhXFwnLCBcXCdhXFwnLCBcXCdhXFwnXSxcXG4nICtcbiAgICAgICAgJyAgICAgLi4uLFxcbicgK1xuICAgICAgICAnICAgICBbXFwnYVxcJywgXFwnYVxcJywgXFwnYVxcJywgLi4uLCBcXCdhXFwnLCBcXCdhXFwnLCBcXCdhXFwnXSxcXG4nICtcbiAgICAgICAgJyAgICAgW1xcJ2FcXCcsIFxcJ2FcXCcsIFxcJ2FcXCcsIC4uLiwgXFwnYVxcJywgXFwnYVxcJywgXFwnYVxcJ10sXFxuJyArXG4gICAgICAgICcgICAgIFtcXCdhXFwnLCBcXCdhXFwnLCBcXCdhXFwnLCAuLi4sIFxcJ2FcXCcsIFxcJ2FcXCcsIFxcJ2FcXCddXScpO1xuICB9KTtcblxuICBpdCgnMmQgd2l0aCBwYWRkaW5nIHRvIGFsaWduIGNvbHVtbnMgdmVyYm9zZScsICgpID0+IHtcbiAgICBjb25zdCB2ZXJib3NlID0gdHJ1ZTtcbiAgICBjb25zdCBzdHIgPSB0Zi50ZW5zb3IoW1xuICAgICAgICAgICAgICAgICAgICBbMC44NTk3NzEyLCAzLCAwLjI3NDA3ODldLCBbMC42Njk2MTMyLCAwLjQ4MjU5NjIsIDIuNzVdLFxuICAgICAgICAgICAgICAgICAgICBbMS45OTEsIDAuMDY0MDg2NSwgMC4yOTgzODU4XVxuICAgICAgICAgICAgICAgICAgXSkudG9TdHJpbmcodmVyYm9zZSk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICBkdHlwZTogZmxvYXQzMlxcbicgK1xuICAgICAgICAnICByYW5rOiAyXFxuJyArXG4gICAgICAgICcgIHNoYXBlOiBbMywzXVxcbicgK1xuICAgICAgICAnICB2YWx1ZXM6XFxuJyArXG4gICAgICAgICcgICAgW1swLjg1OTc3MTIsIDMgICAgICAgICwgMC4yNzQwNzg5XSxcXG4nICtcbiAgICAgICAgJyAgICAgWzAuNjY5NjEzMiwgMC40ODI1OTYyLCAyLjc1ICAgICBdLFxcbicgK1xuICAgICAgICAnICAgICBbMS45OTEwMDAxLCAwLjA2NDA4NjUsIDAuMjk4Mzg1OF1dJyk7XG4gIH0pO1xuXG4gIGl0KCcyZCBzdHJpbmcgdGVuc29yIHdpdGggcGFkZGluZyB2ZXJib3NlJywgKCkgPT4ge1xuICAgIGNvbnN0IHZlcmJvc2UgPSB0cnVlO1xuICAgIGNvbnN0IHN0ciA9IHRmLnRlbnNvcihbXG4gICAgICAgICAgICAgICAgICAgIFsnYWJjZGVmJywgJ2EnLCAnYWJjZGVmJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnYWJjZGVmJywgJ2FiY2RlZicsICdhYmMnXSxcbiAgICAgICAgICAgICAgICAgICAgWydhYmNkJywgJ2FiY2RlZicsICdhYmNkZWYnXSxcbiAgICAgICAgICAgICAgICAgIF0pLnRvU3RyaW5nKHZlcmJvc2UpO1xuICAgIGV4cGVjdChzdHIpLnRvRXF1YWwoXG4gICAgICAgICdUZW5zb3JcXG4nICtcbiAgICAgICAgJyAgZHR5cGU6IHN0cmluZ1xcbicgK1xuICAgICAgICAnICByYW5rOiAyXFxuJyArXG4gICAgICAgICcgIHNoYXBlOiBbMywzXVxcbicgK1xuICAgICAgICAnICB2YWx1ZXM6XFxuJyArXG4gICAgICAgICcgICAgW1tcXCdhYmNkZWZcXCcsIFxcJ2FcXCcgICAgICwgXFwnYWJjZGVmXFwnXSxcXG4nICtcbiAgICAgICAgJyAgICAgW1xcJ2FiY2RlZlxcJywgXFwnYWJjZGVmXFwnLCBcXCdhYmNcXCcgICBdLFxcbicgK1xuICAgICAgICAnICAgICBbXFwnYWJjZFxcJyAgLCBcXCdhYmNkZWZcXCcsIFxcJ2FiY2RlZlxcJ11dJyk7XG4gIH0pO1xuXG4gIGl0KCdzY2FsYXInLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RyID0gdGYuc2NhbGFyKDUpLnRvU3RyaW5nKCk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICAgIDUnKTtcbiAgfSk7XG5cbiAgaXQoJ3NjYWxhciBzdHJpbmcnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RyID0gdGYuc2NhbGFyKCdoZWxsbycpLnRvU3RyaW5nKCk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICAgIGhlbGxvJyk7XG4gIH0pO1xuXG4gIGl0KCcxZCB0ZW5zb3InLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RyID0gdGYuemVyb3MoWzRdKS50b1N0cmluZygpO1xuICAgIGV4cGVjdChzdHIpLnRvRXF1YWwoXG4gICAgICAgICdUZW5zb3JcXG4nICtcbiAgICAgICAgJyAgICBbMCwgMCwgMCwgMF0nKTtcbiAgfSk7XG5cbiAgaXQoJzJkIHRlbnNvcicsICgpID0+IHtcbiAgICBjb25zdCBzdHIgPSB0Zi56ZXJvcyhbMywgM10pLnRvU3RyaW5nKCk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICAgIFtbMCwgMCwgMF0sXFxuJyArXG4gICAgICAgICcgICAgIFswLCAwLCAwXSxcXG4nICtcbiAgICAgICAgJyAgICAgWzAsIDAsIDBdXScpO1xuICB9KTtcblxuICBpdCgnM2QgdGVuc29yJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0ciA9IHRmLnplcm9zKFszLCAzLCAyXSkudG9TdHJpbmcoKTtcbiAgICBleHBlY3Qoc3RyKS50b0VxdWFsKFxuICAgICAgICAnVGVuc29yXFxuJyArXG4gICAgICAgICcgICAgW1tbMCwgMF0sXFxuJyArXG4gICAgICAgICcgICAgICBbMCwgMF0sXFxuJyArXG4gICAgICAgICcgICAgICBbMCwgMF1dLFxcblxcbicgK1xuICAgICAgICAnICAgICBbWzAsIDBdLFxcbicgK1xuICAgICAgICAnICAgICAgWzAsIDBdLFxcbicgK1xuICAgICAgICAnICAgICAgWzAsIDBdXSxcXG5cXG4nICtcbiAgICAgICAgJyAgICAgW1swLCAwXSxcXG4nICtcbiAgICAgICAgJyAgICAgIFswLCAwXSxcXG4nICtcbiAgICAgICAgJyAgICAgIFswLCAwXV1dJyk7XG4gIH0pO1xuXG4gIGl0KCcxZCBsb25nIHRlbnNvcicsICgpID0+IHtcbiAgICBjb25zdCBzdHIgPSB0Zi56ZXJvcyhbMTAwXSkudG9TdHJpbmcoKTtcbiAgICBleHBlY3Qoc3RyKS50b0VxdWFsKFxuICAgICAgICAnVGVuc29yXFxuJyArXG4gICAgICAgICcgICAgWzAsIDAsIDAsIC4uLiwgMCwgMCwgMF0nKTtcbiAgfSk7XG5cbiAgaXQoJzJkIGxvbmcgdGVuc29yJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0ciA9IHRmLnplcm9zKFsxMDAsIDEwMF0pLnRvU3RyaW5nKCk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICAgIFtbMCwgMCwgMCwgLi4uLCAwLCAwLCAwXSxcXG4nICtcbiAgICAgICAgJyAgICAgWzAsIDAsIDAsIC4uLiwgMCwgMCwgMF0sXFxuJyArXG4gICAgICAgICcgICAgIFswLCAwLCAwLCAuLi4sIDAsIDAsIDBdLFxcbicgK1xuICAgICAgICAnICAgICAuLi4sXFxuJyArXG4gICAgICAgICcgICAgIFswLCAwLCAwLCAuLi4sIDAsIDAsIDBdLFxcbicgK1xuICAgICAgICAnICAgICBbMCwgMCwgMCwgLi4uLCAwLCAwLCAwXSxcXG4nICtcbiAgICAgICAgJyAgICAgWzAsIDAsIDAsIC4uLiwgMCwgMCwgMF1dJyk7XG4gIH0pO1xuXG4gIGl0KCcyZCB3aXRoIHBhZGRpbmcgdG8gYWxpZ24gY29sdW1ucycsICgpID0+IHtcbiAgICBjb25zdCBzdHIgPSB0Zi50ZW5zb3IoW1xuICAgICAgICAgICAgICAgICAgICBbMC44NTk3NzEyLCAzLCAwLjI3NDA3ODldLCBbMC42Njk2MTMyLCAwLjQ4MjU5NjIsIDIuNzVdLFxuICAgICAgICAgICAgICAgICAgICBbMS45OTEsIDAuMDY0MDg2NSwgMC4yOTgzODU4XVxuICAgICAgICAgICAgICAgICAgXSkudG9TdHJpbmcoKTtcbiAgICBleHBlY3Qoc3RyKS50b0VxdWFsKFxuICAgICAgICAnVGVuc29yXFxuJyArXG4gICAgICAgICcgICAgW1swLjg1OTc3MTIsIDMgICAgICAgICwgMC4yNzQwNzg5XSxcXG4nICtcbiAgICAgICAgJyAgICAgWzAuNjY5NjEzMiwgMC40ODI1OTYyLCAyLjc1ICAgICBdLFxcbicgK1xuICAgICAgICAnICAgICBbMS45OTEwMDAxLCAwLjA2NDA4NjUsIDAuMjk4Mzg1OF1dJyk7XG4gIH0pO1xuXG4gIGl0KCdzY2FsYXIgY29tcGxleDY0IHZlcmJvc2UnLCAoKSA9PiB7XG4gICAgY29uc3QgdmVyYm9zZSA9IHRydWU7XG4gICAgY29uc3Qgc3RyID0gdGYuY29tcGxleCg1LCA2KS50b1N0cmluZyh2ZXJib3NlKTtcbiAgICBleHBlY3Qoc3RyKS50b0VxdWFsKFxuICAgICAgICAnVGVuc29yXFxuJyArXG4gICAgICAgICcgIGR0eXBlOiBjb21wbGV4NjRcXG4nICtcbiAgICAgICAgJyAgcmFuazogMFxcbicgK1xuICAgICAgICAnICBzaGFwZTogW11cXG4nICtcbiAgICAgICAgJyAgdmFsdWVzOlxcbicgK1xuICAgICAgICAnICAgIDUgKyA2aicpO1xuICB9KTtcblxuICBpdCgnMWQgY29tcGxleDY0IHRlbnNvciB2ZXJib3NlJywgKCkgPT4ge1xuICAgIGNvbnN0IHZlcmJvc2UgPSB0cnVlO1xuICAgIGNvbnN0IHN0ciA9IHRmLmNvbXBsZXgoWzMsIDVdLCBbNCwgNl0pLnRvU3RyaW5nKHZlcmJvc2UpO1xuICAgIGV4cGVjdChzdHIpLnRvRXF1YWwoXG4gICAgICAgICdUZW5zb3JcXG4nICtcbiAgICAgICAgJyAgZHR5cGU6IGNvbXBsZXg2NFxcbicgK1xuICAgICAgICAnICByYW5rOiAxXFxuJyArXG4gICAgICAgICcgIHNoYXBlOiBbMl1cXG4nICtcbiAgICAgICAgJyAgdmFsdWVzOlxcbicgK1xuICAgICAgICAnICAgIFszICsgNGosIDUgKyA2al0nKTtcbiAgfSk7XG5cbiAgaXQoJzJkIGNvbXBsZXg2NCB0ZW5zb3IgdmVyYm9zZScsICgpID0+IHtcbiAgICBjb25zdCB2ZXJib3NlID0gdHJ1ZTtcbiAgICBjb25zdCBzdHIgPSB0Zi5jb21wbGV4KHRmLmxpbnNwYWNlKDAsIDgsIDkpLCB0Zi5saW5zcGFjZSg4LCAwLCA5KSlcbiAgICAgICAgICAgICAgICAgICAgLnJlc2hhcGUoWzMsIDNdKVxuICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcodmVyYm9zZSk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICBkdHlwZTogY29tcGxleDY0XFxuJyArXG4gICAgICAgICcgIHJhbms6IDJcXG4nICtcbiAgICAgICAgJyAgc2hhcGU6IFszLDNdXFxuJyArXG4gICAgICAgICcgIHZhbHVlczpcXG4nICtcbiAgICAgICAgJyAgICBbWzAgKyA4aiwgMSArIDdqLCAyICsgNmpdLFxcbicgK1xuICAgICAgICAnICAgICBbMyArIDVqLCA0ICsgNGosIDUgKyAzal0sXFxuJyArXG4gICAgICAgICcgICAgIFs2ICsgMmosIDcgKyAxaiwgOCArIDBqXV0nKTtcbiAgfSk7XG5cbiAgaXQoJzNkIGNvbXBsZXg2NCB0ZW5zb3IgdmVyYm9zZScsICgpID0+IHtcbiAgICBjb25zdCB2ZXJib3NlID0gdHJ1ZTtcbiAgICBjb25zdCBzdHIgPSB0Zi5jb21wbGV4KHRmLmxpbnNwYWNlKDAsIDE3LCAxOCksIHRmLmxpbnNwYWNlKDE3LCAwLCAxOCkpXG4gICAgICAgICAgICAgICAgICAgIC5yZXNoYXBlKFszLCAzLCAyXSlcbiAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKHZlcmJvc2UpO1xuICAgIGV4cGVjdChzdHIpLnRvRXF1YWwoXG4gICAgICAgICdUZW5zb3JcXG4nICtcbiAgICAgICAgJyAgZHR5cGU6IGNvbXBsZXg2NFxcbicgK1xuICAgICAgICAnICByYW5rOiAzXFxuJyArXG4gICAgICAgICcgIHNoYXBlOiBbMywzLDJdXFxuJyArXG4gICAgICAgICcgIHZhbHVlczpcXG4nICtcbiAgICAgICAgJyAgICBbW1swICsgMTdqLCAxICsgMTZqXSxcXG4nICtcbiAgICAgICAgJyAgICAgIFsyICsgMTVqLCAzICsgMTRqXSxcXG4nICtcbiAgICAgICAgJyAgICAgIFs0ICsgMTNqLCA1ICsgMTJqXV0sXFxuXFxuJyArXG4gICAgICAgICcgICAgIFtbNiArIDExaiwgNyArIDEwal0sXFxuJyArXG4gICAgICAgICcgICAgICBbOCArIDlqICwgOSArIDhqIF0sXFxuJyArXG4gICAgICAgICcgICAgICBbMTAgKyA3aiwgMTEgKyA2al1dLFxcblxcbicgK1xuICAgICAgICAnICAgICBbWzEyICsgNWosIDEzICsgNGpdLFxcbicgK1xuICAgICAgICAnICAgICAgWzE0ICsgM2osIDE1ICsgMmpdLFxcbicgK1xuICAgICAgICAnICAgICAgWzE2ICsgMWosIDE3ICsgMGpdXV0nKTtcbiAgfSk7XG5cbiAgaXQoJzFkIGxvbmcgY29tcGxleDY0IHRlbnNvciB2ZXJib3NlJywgKCkgPT4ge1xuICAgIGNvbnN0IHZlcmJvc2UgPSB0cnVlO1xuICAgIGNvbnN0IHN0ciA9IHRmLmNvbXBsZXgodGYubGluc3BhY2UoMCwgOTksIDEwMCksIHRmLmxpbnNwYWNlKDk5LCAwLCAxMDApKVxuICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcodmVyYm9zZSk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICBkdHlwZTogY29tcGxleDY0XFxuJyArXG4gICAgICAgICcgIHJhbms6IDFcXG4nICtcbiAgICAgICAgJyAgc2hhcGU6IFsxMDBdXFxuJyArXG4gICAgICAgICcgIHZhbHVlczpcXG4nICtcbiAgICAgICAgJyAgICBbMCArIDk5aiwgMSArIDk4aiwgMiArIDk3aiwgLi4uLCA5NyArIDJqLCA5OCArIDFqLCA5OSArIDBqXScpO1xuICB9KTtcblxuICBpdCgnMmQgbG9uZyBjb21wbGV4NjQgdGVuc29yIHZlcmJvc2UnLCAoKSA9PiB7XG4gICAgY29uc3QgdmVyYm9zZSA9IHRydWU7XG5cbiAgICBjb25zdCBkaW0gPSAxMDA7XG4gICAgY29uc3Qgc3RyID0gdGYuY29tcGxleChcbiAgICAgICAgICAgICAgICAgICAgICB0Zi5saW5zcGFjZSgwLCBkaW0gKiBkaW0gLSAxLCBkaW0gKiBkaW0pLFxuICAgICAgICAgICAgICAgICAgICAgIHRmLmxpbnNwYWNlKGRpbSAqIGRpbSAtIDEsIDAsIGRpbSAqIGRpbSkpXG4gICAgICAgICAgICAgICAgICAgIC5yZXNoYXBlKFtkaW0sIGRpbV0pXG4gICAgICAgICAgICAgICAgICAgIC50b1N0cmluZyh2ZXJib3NlKTtcblxuICAgIGV4cGVjdChzdHIpLnRvRXF1YWwoXG4gICAgICAgICdUZW5zb3JcXG4nICtcbiAgICAgICAgJyAgZHR5cGU6IGNvbXBsZXg2NFxcbicgK1xuICAgICAgICAnICByYW5rOiAyXFxuJyArXG4gICAgICAgICcgIHNoYXBlOiBbMTAwLDEwMF1cXG4nICtcbiAgICAgICAgJyAgdmFsdWVzOlxcbicgK1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgJyAgICBbWzAgKyA5OTk5aiAgICwgMSArIDk5OThqICAgLCAyICsgOTk5N2ogICAsIC4uLiwgOTcgKyA5OTAyaiAgLCA5OCArIDk5MDFqICAsIDk5ICsgOTkwMGogIF0sXFxuJyArXG4gICAgICAgICcgICAgIFsxMDAgKyA5ODk5aiAsIDEwMSArIDk4OThqICwgMTAyICsgOTg5N2ogLCAuLi4sIDE5NyArIDk4MDJqICwgMTk4ICsgOTgwMWogLCAxOTkgKyA5ODAwaiBdLFxcbicgK1xuICAgICAgICAnICAgICBbMjAwICsgOTc5OWogLCAyMDEgKyA5Nzk4aiAsIDIwMiArIDk3OTdqICwgLi4uLCAyOTcgKyA5NzAyaiAsIDI5OCArIDk3MDFqICwgMjk5ICsgOTcwMGogXSxcXG4nICtcbiAgICAgICAgJyAgICAgLi4uLFxcbicgK1xuICAgICAgICAnICAgICBbOTcwMCArIDI5OWogLCA5NzAxICsgMjk4aiAsIDk3MDIgKyAyOTdqICwgLi4uLCA5Nzk3ICsgMjAyaiAsIDk3OTggKyAyMDFqICwgOTc5OSArIDIwMGogXSxcXG4nICtcbiAgICAgICAgJyAgICAgWzk4MDAgKyAxOTlqICwgOTgwMSArIDE5OGogLCA5ODAyICsgMTk3aiAsIC4uLiwgOTg5NyArIDEwMmogLCA5ODk4ICsgMTAxaiAsIDk4OTkgKyAxMDBqIF0sXFxuJyArXG4gICAgICAgICcgICAgIFs5OTAwICsgOTlqICAsIDk5MDEgKyA5OGogICwgOTkwMiArIDk3aiAgLCAuLi4sIDk5OTcgKyAyaiAgICwgOTk5OCArIDFqICAgLCA5OTk5ICsgMGogICBdXScpO1xuICAgIC8vIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoXG4gIH0pO1xuXG4gIGl0KCcyZCBjb21wbGV4NjQgd2l0aCBwYWRkaW5nIHRvIGFsaWduIGNvbHVtbnMgdmVyYm9zZScsICgpID0+IHtcbiAgICBjb25zdCB2ZXJib3NlID0gdHJ1ZTtcblxuICAgIGNvbnN0IHN0ciA9IHRmLmNvbXBsZXgoXG4gICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgWzAuODU5NzcxMiwgMywgMC4yNzQwNzg5XSwgWzAuNjY5NjEzMiwgMC40ODI1OTYyLCAyLjc1XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsxLjk5MSwgMC4wNjQwODY1LCAwLjI5ODM4NThdXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBbWzEsIDEuMDEwMjMzMiwgM10sIFsyLCA1LCAyLjM0NDI0XSwgWzEuMjMsIDIsIDAuMTIzXV0pXG4gICAgICAgICAgICAgICAgICAgIC50b1N0cmluZyh2ZXJib3NlKTtcbiAgICBleHBlY3Qoc3RyKS50b0VxdWFsKFxuICAgICAgICAnVGVuc29yXFxuJyArXG4gICAgICAgICcgIGR0eXBlOiBjb21wbGV4NjRcXG4nICtcbiAgICAgICAgJyAgcmFuazogMlxcbicgK1xuICAgICAgICAnICBzaGFwZTogWzMsM11cXG4nICtcbiAgICAgICAgJyAgdmFsdWVzOlxcbicgK1xuICAgICAgICAnICAgIFtbMC44NTk3NzEyICsgMWogICAsIDMgKyAxLjAxMDIzMzJqLCAwLjI3NDA3ODkgKyAzaiAgICBdLFxcbicgK1xuICAgICAgICAnICAgICBbMC42Njk2MTMyICsgMmogICAsIDAuNDgyNTk2MiArIDVqLCAyLjc1ICsgMi4zNDQyNGogICBdLFxcbicgK1xuICAgICAgICAnICAgICBbMS45OTEwMDAxICsgMS4yM2osIDAuMDY0MDg2NSArIDJqLCAwLjI5ODM4NTggKyAwLjEyM2pdXScpO1xuICB9KTtcblxuICBpdCgnc2NhbGFyIGNvbXBsZXg2NCcsICgpID0+IHtcbiAgICBjb25zdCBzdHIgPSB0Zi5jb21wbGV4KDUsIDQpLnRvU3RyaW5nKCk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICAgIDUgKyA0aicpO1xuICB9KTtcblxuICBpdCgnMWQgY29tcGxleDY0IHRlbnNvcicsICgpID0+IHtcbiAgICBjb25zdCBzdHIgPVxuICAgICAgICB0Zi5jb21wbGV4KHRmLmxpbnNwYWNlKDAsIDMsIDQpLCB0Zi5saW5zcGFjZSgzLCAwLCA0KSkudG9TdHJpbmcoKTtcbiAgICBleHBlY3Qoc3RyKS50b0VxdWFsKFxuICAgICAgICAnVGVuc29yXFxuJyArXG4gICAgICAgICcgICAgWzAgKyAzaiwgMSArIDJqLCAyICsgMWosIDMgKyAwal0nKTtcbiAgfSk7XG5cbiAgaXQoJzJkIGNvbXBsZXg2NCB0ZW5zb3InLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RyID0gdGYuY29tcGxleCh0Zi5saW5zcGFjZSgwLCA4LCA5KSwgdGYubGluc3BhY2UoOCwgMCwgOSkpXG4gICAgICAgICAgICAgICAgICAgIC5yZXNoYXBlKFszLCAzXSlcbiAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICAgIFtbMCArIDhqLCAxICsgN2osIDIgKyA2al0sXFxuJyArXG4gICAgICAgICcgICAgIFszICsgNWosIDQgKyA0aiwgNSArIDNqXSxcXG4nICtcbiAgICAgICAgJyAgICAgWzYgKyAyaiwgNyArIDFqLCA4ICsgMGpdXScpO1xuICB9KTtcblxuICBpdCgnM2QgY29tcGxleDY0IHRlbnNvcicsICgpID0+IHtcbiAgICBjb25zdCBzdHIgPSB0Zi5jb21wbGV4KHRmLmxpbnNwYWNlKDAsIDE3LCAxOCksIHRmLmxpbnNwYWNlKDE3LCAwLCAxOCkpXG4gICAgICAgICAgICAgICAgICAgIC5yZXNoYXBlKFszLCAzLCAyXSlcbiAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7XG5cbiAgICBleHBlY3Qoc3RyKS50b0VxdWFsKFxuICAgICAgICAnVGVuc29yXFxuJyArXG4gICAgICAgICcgICAgW1tbMCArIDE3aiwgMSArIDE2al0sXFxuJyArXG4gICAgICAgICcgICAgICBbMiArIDE1aiwgMyArIDE0al0sXFxuJyArXG4gICAgICAgICcgICAgICBbNCArIDEzaiwgNSArIDEyal1dLFxcblxcbicgK1xuICAgICAgICAnICAgICBbWzYgKyAxMWosIDcgKyAxMGpdLFxcbicgK1xuICAgICAgICAnICAgICAgWzggKyA5aiAsIDkgKyA4aiBdLFxcbicgK1xuICAgICAgICAnICAgICAgWzEwICsgN2osIDExICsgNmpdXSxcXG5cXG4nICtcbiAgICAgICAgJyAgICAgW1sxMiArIDVqLCAxMyArIDRqXSxcXG4nICtcbiAgICAgICAgJyAgICAgIFsxNCArIDNqLCAxNSArIDJqXSxcXG4nICtcbiAgICAgICAgJyAgICAgIFsxNiArIDFqLCAxNyArIDBqXV1dJyk7XG4gIH0pO1xuXG4gIGl0KCcxZCBsb25nIGNvbXBsZXg2NCB0ZW5zb3InLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RyID1cbiAgICAgICAgdGYuY29tcGxleCh0Zi5saW5zcGFjZSgwLCA5OSwgMTAwKSwgdGYubGluc3BhY2UoOTksIDAsIDEwMCkpLnRvU3RyaW5nKCk7XG5cbiAgICBleHBlY3Qoc3RyKS50b0VxdWFsKFxuICAgICAgICAnVGVuc29yXFxuJyArXG4gICAgICAgICcgICAgWzAgKyA5OWosIDEgKyA5OGosIDIgKyA5N2osIC4uLiwgOTcgKyAyaiwgOTggKyAxaiwgOTkgKyAwal0nKTtcbiAgfSk7XG5cbiAgaXQoJzJkIGxvbmcgY29tcGxleDY0IHRlbnNvcicsICgpID0+IHtcbiAgICBjb25zdCBkaW0gPSAxMDA7XG4gICAgY29uc3Qgc3RyID0gdGYuY29tcGxleChcbiAgICAgICAgICAgICAgICAgICAgICB0Zi5saW5zcGFjZSgwLCBkaW0gKiBkaW0gLSAxLCBkaW0gKiBkaW0pLFxuICAgICAgICAgICAgICAgICAgICAgIHRmLmxpbnNwYWNlKGRpbSAqIGRpbSAtIDEsIDAsIGRpbSAqIGRpbSkpXG4gICAgICAgICAgICAgICAgICAgIC5yZXNoYXBlKFtkaW0sIGRpbV0pXG4gICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpO1xuXG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgJyAgICBbWzAgKyA5OTk5aiAgICwgMSArIDk5OThqICAgLCAyICsgOTk5N2ogICAsIC4uLiwgOTcgKyA5OTAyaiAgLCA5OCArIDk5MDFqICAsIDk5ICsgOTkwMGogIF0sXFxuJyArXG4gICAgICAgICcgICAgIFsxMDAgKyA5ODk5aiAsIDEwMSArIDk4OThqICwgMTAyICsgOTg5N2ogLCAuLi4sIDE5NyArIDk4MDJqICwgMTk4ICsgOTgwMWogLCAxOTkgKyA5ODAwaiBdLFxcbicgK1xuICAgICAgICAnICAgICBbMjAwICsgOTc5OWogLCAyMDEgKyA5Nzk4aiAsIDIwMiArIDk3OTdqICwgLi4uLCAyOTcgKyA5NzAyaiAsIDI5OCArIDk3MDFqICwgMjk5ICsgOTcwMGogXSxcXG4nICtcbiAgICAgICAgJyAgICAgLi4uLFxcbicgK1xuICAgICAgICAnICAgICBbOTcwMCArIDI5OWogLCA5NzAxICsgMjk4aiAsIDk3MDIgKyAyOTdqICwgLi4uLCA5Nzk3ICsgMjAyaiAsIDk3OTggKyAyMDFqICwgOTc5OSArIDIwMGogXSxcXG4nICtcbiAgICAgICAgJyAgICAgWzk4MDAgKyAxOTlqICwgOTgwMSArIDE5OGogLCA5ODAyICsgMTk3aiAsIC4uLiwgOTg5NyArIDEwMmogLCA5ODk4ICsgMTAxaiAsIDk4OTkgKyAxMDBqIF0sXFxuJyArXG4gICAgICAgICcgICAgIFs5OTAwICsgOTlqICAsIDk5MDEgKyA5OGogICwgOTkwMiArIDk3aiAgLCAuLi4sIDk5OTcgKyAyaiAgICwgOTk5OCArIDFqICAgLCA5OTk5ICsgMGogICBdXScpO1xuICAgIC8vIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoXG4gIH0pO1xuXG4gIGl0KCcyZCBjb21wbGV4NjQgd2l0aCBwYWRkaW5nIHRvIGFsaWduIGNvbHVtbnMnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3RyID0gdGYuY29tcGxleChcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICBbMC44NTk3NzEyLCAzLCAwLjI3NDA3ODldLCBbMC42Njk2MTMyLCAwLjQ4MjU5NjIsIDIuNzVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgWzEuOTkxLCAwLjA2NDA4NjUsIDAuMjk4Mzg1OF1cbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIFtbMSwgMS4wMTAyMzMyLCAzXSwgWzIsIDUsIDIuMzQ0MjRdLCBbMS4yMywgMiwgMC4xMjNdXSlcbiAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7XG4gICAgZXhwZWN0KHN0cikudG9FcXVhbChcbiAgICAgICAgJ1RlbnNvclxcbicgK1xuICAgICAgICAnICAgIFtbMC44NTk3NzEyICsgMWogICAsIDMgKyAxLjAxMDIzMzJqLCAwLjI3NDA3ODkgKyAzaiAgICBdLFxcbicgK1xuICAgICAgICAnICAgICBbMC42Njk2MTMyICsgMmogICAsIDAuNDgyNTk2MiArIDVqLCAyLjc1ICsgMi4zNDQyNGogICBdLFxcbicgK1xuICAgICAgICAnICAgICBbMS45OTEwMDAxICsgMS4yM2osIDAuMDY0MDg2NSArIDJqLCAwLjI5ODM4NTggKyAwLjEyM2pdXScpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZVdpdGhGbGFncygndGVuc29yIGdyYWQnLCBBTExfRU5WUywgKCkgPT4ge1xuICBpdCgnZ3JhZCB3aXRoIHNlY29uZCBkZXJpdmF0aXZlJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIGYoeCkgPSB4IF4gM1xuICAgIGNvbnN0IGYgPSAoeDogVGVuc29yKSA9PiB4LnBvdyh0Zi5zY2FsYXIoMywgJ2ludDMyJykpO1xuICAgIC8vIGYnKHgpID0gM3ggXiAyXG4gICAgY29uc3QgZyA9IHRmLmdyYWQoZik7XG4gICAgLy8gZicnKHgpID0gNnhcbiAgICBjb25zdCBnZyA9IHRmLmdyYWQoZyk7XG4gICAgY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gICAgY29uc3QgZGF0YSA9IGdnKHgpO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGRhdGEuZGF0YSgpLCBbMTIsIDE4XSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlV2l0aEZsYWdzKCd0ZW5zb3IuZGF0YScsIEFMTF9FTlZTLCAoKSA9PiB7XG4gIGl0KCdpbnRlcmxlYXZpbmcgLmRhdGEoKSBhbmQgLmRhdGFTeW5jKCknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gICAgY29uc3QgYiA9IHRmLnRlbnNvcjFkKFs0LCA1LCA2XSk7XG5cbiAgICBjb25zdCByYSA9IGEuc3F1YXJlKCk7XG4gICAgY29uc3QgcmIgPSBiLnNxdWFyZSgpO1xuXG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYS5kYXRhKCksIFsxLCAyLCAzXSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYi5kYXRhKCksIFs0LCA1LCA2XSk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgcmIuZGF0YSgpLCBbMTYsIDI1LCAzNl0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IHJhLmRhdGEoKSwgWzEsIDQsIDldKTtcbiAgfSk7XG5cbiAgaXQoJy5kYXRhKCkgcG9zdHBvbmVzIGRpc3Bvc2FsIG9mIHRlbnNvcicsIGRvbmUgPT4ge1xuICAgIGV4cGVjdCh0Zi5tZW1vcnkoKS5udW1UZW5zb3JzKS50b0JlKDApO1xuICAgIHRmLnRpZHkoKCkgPT4ge1xuICAgICAgY29uc3QgYSA9IHRmLnNjYWxhcig1KTtcbiAgICAgIGV4cGVjdCh0Zi5tZW1vcnkoKS5udW1UZW5zb3JzKS50b0JlKDEpO1xuICAgICAgYS5zcXVhcmUoKTsgIC8vIFVwbG9hZHMgaXQgb24gR1BVLlxuICAgICAgYS5kYXRhKCkudGhlbih2YWxzID0+IHtcbiAgICAgICAgLy8gVGhlIHRpZHkgYWJvdmUgc2hvdWxkIG5vdCBkaXNwb3NlIHRoZSBzY2FsYXIgc2luY2UgdGhlcmUgaXNcbiAgICAgICAgLy8gYSBwZW5kaW5nIGRhdGEgcmVhZC5cbiAgICAgICAgZXhwZWN0TnVtYmVyc0Nsb3NlKHZhbHNbMF0sIDUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyB0aWR5IGVuZHMgaW1tZWRpYXRlbHksIGJ1dCBzaG91bGQgbm90IGRpc3Bvc2UgdGhlIHNjYWxhci5cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gdGlkeSBzaG91bGQgZGlzcG9zZSB0aGUgdGVuc29yLlxuICAgICAgZXhwZWN0KHRmLm1lbW9yeSgpLm51bVRlbnNvcnMpLnRvQmUoMCk7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdjYWxsaW5nIC5kYXRhKCkgdHdpY2Ugd29ya3MgKDIgc3Vic2NyaWJlcnMgdG8gYSBzaW5nbGUgcmVhZCknLCBkb25lID0+IHtcbiAgICB0Zi50aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IGEgPSB0Zi5zY2FsYXIoNSk7XG4gICAgICBhLnNxdWFyZSgpOyAgLy8gVXBsb2FkcyBpdCBvbiBHUFUuXG4gICAgICBhLmRhdGEoKS50aGVuKHZhbHMgPT4ge1xuICAgICAgICBleHBlY3ROdW1iZXJzQ2xvc2UodmFsc1swXSwgNSk7XG4gICAgICB9KTtcbiAgICAgIGEuZGF0YSgpXG4gICAgICAgICAgLnRoZW4odmFscyA9PiB7XG4gICAgICAgICAgICBleHBlY3ROdW1iZXJzQ2xvc2UodmFsc1swXSwgNSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihkb25lKTtcbiAgICB9KTtcbiAgICAvLyB0aWR5IGVuZHMgaW1tZWRpYXRlbHksIGJ1dCBzaG91bGQgbm90IGRpc3Bvc2UgdGhlIHNjYWxhciBzaW5jZSB0aGVyZSBpc1xuICAgIC8vIGEgcGVuZGluZyBkYXRhIHJlYWQuXG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlV2l0aEZsYWdzKCd4IGluc3RhbmNlb2YgVGVuc29yJywgQUxMX0VOVlMsICgpID0+IHtcbiAgaXQoJ3g6IFRlbnNvcicsICgpID0+IHtcbiAgICBjb25zdCB0ID0gdGYuc2NhbGFyKDEpO1xuICAgIGV4cGVjdCh0IGluc3RhbmNlb2YgVGVuc29yKS50b0JlKHRydWUpO1xuICB9KTtcblxuICBpdCgneDogb3RoZXIgb2JqZWN0LCBmYWlscycsICgpID0+IHtcbiAgICBjb25zdCB0ID0ge3NvbWV0aGluZzogJ2Vsc2UnfTtcbiAgICBleHBlY3QodCBpbnN0YW5jZW9mIFRlbnNvcikudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCd4OiB1bmRlZmluZWQgb3IgbnVsbCwgZmFpbHMnLCAoKSA9PiB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGV4cGVjdCgodW5kZWZpbmVkIGFzIGFueSkgaW5zdGFuY2VvZiBUZW5zb3IpLnRvQmUoZmFsc2UpO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBleHBlY3QoKG51bGwgYXMgYW55KSBpbnN0YW5jZW9mIFRlbnNvcikudG9CZShmYWxzZSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlV2l0aEZsYWdzKCd0ZW5zb3Igd2l0aCAwIGluIHNoYXBlJywgQUxMX0VOVlMsICgpID0+IHtcbiAgaXQoJzFkIG9mIHNoYXBlIFswXScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMWQoW10pO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdmbG9hdDMyJyk7XG4gICAgZXhwZWN0KGEucmFuaykudG9CZSgxKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbMF0pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbXSk7XG4gIH0pO1xuXG4gIGl0KCcxZCBzdHJpbmcgdGVuc29yIG9mIHNoYXBlIFswXScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMWQoW10sICdzdHJpbmcnKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnc3RyaW5nJyk7XG4gICAgZXhwZWN0KGEucmFuaykudG9CZSgxKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbMF0pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbXSk7XG4gIH0pO1xuXG4gIGl0KCcyZCBvZiBzaGFwZSBbMCwgNV0nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcjJkKFtdLCBbMCwgNV0pO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdmbG9hdDMyJyk7XG4gICAgZXhwZWN0KGEucmFuaykudG9CZSgyKTtcbiAgICBleHBlY3QoYS5zaGFwZSkudG9FcXVhbChbMCwgNV0pO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKGF3YWl0IGEuZGF0YSgpLCBbXSk7XG4gIH0pO1xuXG4gIGl0KCcyZCBzdHJpbmcgdGVuc29yIG9mIHNoYXBlIFswLCA1XScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yMmQoW10sIFswLCA1XSwgJ3N0cmluZycpO1xuICAgIGV4cGVjdChhLmR0eXBlKS50b0JlKCdzdHJpbmcnKTtcbiAgICBleHBlY3QoYS5yYW5rKS50b0JlKDIpO1xuICAgIGV4cGVjdChhLnNoYXBlKS50b0VxdWFsKFswLCA1XSk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIFtdKTtcbiAgfSk7XG5cbiAgaXQoJzJkIHRocm93cyB3aGVuIHZhbHVlcyBhcmUgbm90IGVtcHR5JywgKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlcyA9IFsxLCAyLCAzLCA0XTtcbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yMmQodmFsdWVzLCBbMCwgNV0sICdmbG9hdDMyJykpXG4gICAgICAgIC50b1Rocm93RXJyb3IoXG4gICAgICAgICAgICAnQmFzZWQgb24gdGhlIHByb3ZpZGVkIHNoYXBlLCBbMCw1XSwgdGhlICcgK1xuICAgICAgICAgICAgJ3RlbnNvciBzaG91bGQgaGF2ZSAwIHZhbHVlcyBidXQgaGFzIDQnKTtcbiAgfSk7XG5cbiAgaXQoJzNkIG9mIHNoYXBlIFswLCAzLCAwXScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yM2QoW10sIFswLCAzLCAwXSk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QoYS5yYW5rKS50b0JlKDMpO1xuICAgIGV4cGVjdChhLnNoYXBlKS50b0VxdWFsKFswLCAzLCAwXSk7XG4gICAgZXhwZWN0QXJyYXlzRXF1YWwoYXdhaXQgYS5kYXRhKCksIFtdKTtcbiAgfSk7XG5cbiAgaXQoJzNkIHRocm93cyB3aGVuIHZhbHVlcyBhcmUgbm90IGVtcHR5JywgKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlcyA9IFsxLCAyLCAzXTtcbiAgICBleHBlY3QoKCkgPT4gdGYudGVuc29yM2QodmFsdWVzLCBbMCwgMywgMF0sICdmbG9hdDMyJykpXG4gICAgICAgIC50b1Rocm93RXJyb3IoXG4gICAgICAgICAgICAnQmFzZWQgb24gdGhlIHByb3ZpZGVkIHNoYXBlLCBbMCwzLDBdLCB0aGUgJyArXG4gICAgICAgICAgICAndGVuc29yIHNob3VsZCBoYXZlIDAgdmFsdWVzIGJ1dCBoYXMgMycpO1xuICB9KTtcblxuICBpdCgnNGQgb2Ygc2hhcGUgWzEsIDMsIDAsIDVdJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0Zi50ZW5zb3I0ZChbXSwgWzEsIDMsIDAsIDVdKTtcbiAgICBleHBlY3QoYS5kdHlwZSkudG9CZSgnZmxvYXQzMicpO1xuICAgIGV4cGVjdChhLnJhbmspLnRvQmUoNCk7XG4gICAgZXhwZWN0KGEuc2hhcGUpLnRvRXF1YWwoWzEsIDMsIDAsIDVdKTtcbiAgICBleHBlY3RBcnJheXNFcXVhbChhd2FpdCBhLmRhdGEoKSwgW10pO1xuICB9KTtcblxuICBpdCgnNGQgdGhyb3dzIHdoZW4gdmFsdWVzIGFyZSBub3QgZW1wdHknLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gWzEsIDIsIDNdO1xuICAgIGV4cGVjdCgoKSA9PiB0Zi50ZW5zb3I0ZCh2YWx1ZXMsIFsxLCAzLCAwLCA1XSwgJ2Zsb2F0MzInKSlcbiAgICAgICAgLnRvVGhyb3dFcnJvcihcbiAgICAgICAgICAgICdCYXNlZCBvbiB0aGUgcHJvdmlkZWQgc2hhcGUsIFsxLDMsMCw1XSwgdGhlICcgK1xuICAgICAgICAgICAgJ3RlbnNvciBzaG91bGQgaGF2ZSAwIHZhbHVlcyBidXQgaGFzIDMnKTtcbiAgfSk7XG5cbiAgaXQoJ2NvbXBsZXg2NCB3aXRoIDAgaW4gc2hhcGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYXJlYWwgPSB0Zi50ZW5zb3IyZChbXSwgWzAsIDVdKTtcbiAgICBjb25zdCBicmVhbCA9IHRmLnRlbnNvcjJkKFtdLCBbMCwgNV0pO1xuICAgIGNvbnN0IGEgPSB0Zi5jb21wbGV4KGFyZWFsLCBicmVhbCk7XG4gICAgZXhwZWN0KGEuZHR5cGUpLnRvQmUoJ2NvbXBsZXg2NCcpO1xuICAgIGV4cGVjdChhLnJhbmspLnRvQmUoMik7XG4gICAgZXhwZWN0KGEuc2hhcGUpLnRvRXF1YWwoWzAsIDVdKTtcbiAgICBleHBlY3RBcnJheXNFcXVhbChhd2FpdCBhLmRhdGEoKSwgW10pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZVdpdGhGbGFncygndGVuc29yLmJ5dGVzKCknLCBBTExfRU5WUywgKCkgPT4ge1xuICAvKiogSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIGJ5dGVzIGZyb20gYSB0eXBlZCBhcnJheS4gKi9cbiAgZnVuY3Rpb24gZ2V0Qnl0ZXMoYTogVHlwZWRBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShhLmJ1ZmZlcik7XG4gIH1cblxuICBpdCgnZmxvYXQzMiB0ZW5zb3InLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcihbMS4xLCAzLjIsIDddLCBbM10sICdmbG9hdDMyJyk7XG4gICAgZXhwZWN0KGF3YWl0IGEuYnl0ZXMoKSkudG9FcXVhbChnZXRCeXRlcyhuZXcgRmxvYXQzMkFycmF5KFsxLjEsIDMuMiwgN10pKSk7XG4gIH0pO1xuXG4gIGl0KCdpbnQzMiB0ZW5zb3InLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcihbMS4xLCAzLjIsIDddLCBbM10sICdpbnQzMicpO1xuICAgIGV4cGVjdChhd2FpdCBhLmJ5dGVzKCkpLnRvRXF1YWwoZ2V0Qnl0ZXMobmV3IEludDMyQXJyYXkoWzEsIDMsIDddKSkpO1xuICB9KTtcblxuICBpdCgnYm9vbCB0ZW5zb3InLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcihbdHJ1ZSwgdHJ1ZSwgZmFsc2VdLCBbM10sICdib29sJyk7XG4gICAgZXhwZWN0KGF3YWl0IGEuYnl0ZXMoKSkudG9FcXVhbChuZXcgVWludDhBcnJheShbMSwgMSwgMF0pKTtcbiAgfSk7XG5cbiAgaXQoJ3N0cmluZyB0ZW5zb3IgZnJvbSBuYXRpdmUgc3RyaW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gdGYudGVuc29yKFsnaGVsbG8nLCAnd29ybGQnXSwgWzJdLCAnc3RyaW5nJyk7XG4gICAgZXhwZWN0KGF3YWl0IGEuYnl0ZXMoKSkudG9FcXVhbChbXG4gICAgICBlbmNvZGVTdHJpbmcoJ2hlbGxvJyksIGVuY29kZVN0cmluZygnd29ybGQnKVxuICAgIF0pO1xuICB9KTtcblxuICBpdCgnc3RyaW5nIHRlbnNvciBmcm9tIGVuY29kZWQgYnl0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHRmLnRlbnNvcihcbiAgICAgICAgW2VuY29kZVN0cmluZygnaGVsbG8nKSwgZW5jb2RlU3RyaW5nKCd3b3JsZCcpXSwgWzJdLCAnc3RyaW5nJyk7XG4gICAgZXhwZWN0KGF3YWl0IGEuYnl0ZXMoKSkudG9FcXVhbChbXG4gICAgICBlbmNvZGVTdHJpbmcoJ2hlbGxvJyksIGVuY29kZVN0cmluZygnd29ybGQnKVxuICAgIF0pO1xuICB9KTtcbn0pO1xuIl19